论Smalltalk与Java的集成外文翻译资料

 2022-12-17 14:50:30

英语原文共 17 页,剩余内容已隐藏,支付完成后下载完整资料


Science of Computer Programming 96 (2014) 17–33

Contents lists available at ScienceDirect

Science of Computer Programming

www.elsevier.com/locate/scico

论Smalltalk与Java的集成

Marcel Hlopko , Jan Kurscaron;, Jan Vranyacute;, Claus Gittinger

Faculty of Information Technology, Czech Technical University in Prague, Thaacute;kurova 9, 160 00 Praha 6, Czech Republic b Software Composition Group, Institut fuuml;r Informatik, Universitauml;t Bern, Neubruuml;ckstrasse 10, CH 3012 Bern, Switzerland c eXept Software AG, Talstraszlig;e 3, 74321 Bietigheim-Bissingen, Germany

亮点

  • 我们识别并解决Java和Smalltalk集成带来的问题。
  • STX:LIBJAVA是构建在Smalltalk/X中的JVM实现。
  • 显示了STX的互操作性特性:LIBJAVA(例如动态代理方法)。
  • 我们在各种Java项目上验证了我们的实现,例如Groovy或Tomcat。
  • 提供了Oracle JVM和STX的性能比较:LIBJAVA。

文章信息

文章历史:

收到日期:2012年11月12日

2013年10月21日收到修订版

接受日期:2013年10月24日

在线发布日期:2013年11月11日

关键词:

语言的互操作性

Smalltalk

Java

摘要

经过几十年的编程语言和编程环境的开发,Smalltalk仍然是少数几个提供高级特性并被业界使用的环境之一。然而,随着Java的流行,从Smalltalk调用Java代码的能力变得非常重要。集成Java和Smalltalk语言的传统方法是通过单独的Java和Smalltalk虚拟机之间的底层通信。据我们所知,没有其他项目试图在Smalltalk环境中直接执行和集成Java语言。直接集成允许在单个环境中非常紧密地集成语言及其对象。然而,集成和语言互操作性带来了与方法命名约定、方法重载、异常处理和线程锁定机制相关的挑战性问题。

在本文中,我们描述了克服这些挑战并将Java集成到Smalltalk环境中的方法。我们将重点放在使用标准Smalltalk习惯用法从Smalltalk调用Java代码的可能性上,同时保留两种语言的语义。我们将stx:libjava—Smalltalk/X中Java虚拟机的实现—作为我们方法的验证。

爱思唯尔版权所有

1. 介绍

Java编程语言已经成为当今使用最广泛的编程语言之一。1 大量代码是用Java编写的,从小型库到大型应用服务器和业务应用程序。尽管如此,Smalltalk仍然提供了许多Java中缺乏的独特特性(如高级反射支持或表达性的异常机制),这使得Smalltalk适合于许多类型的项目。从Smalltalk调用Java是一个诱人的想法,反之亦然,因为它支持在Smalltalk项目中使用许多Java库。

  • 相应的作者。

电子邮件地址:marcel.hlopko@fit.cvut。cz (M. Hlopko), kurs@iam.unibe。jan.vrany@fit.cvut ch (j . Kurscaron;)。cz (J. Vrany), cg@exept.de (C. Gittinger)。

  • 根据http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html。

版权所有:爱思唯尔

http://dx.doi.org/10.1016/j.scico.2013.10.01118 M. Hlopko等/计算机编程科学96 (2014)17-33

如图所示:(a)使用相同中间程序表示的两种语文;(b)两种语文各使用其本身的虚拟机;(c)支持两种不同语言的Smalltalk/X VM及其原生的中间程序表示。

两种语言的集成并不是一个新概念,在过去已经被探索过好几次了。通常使用了两种不同的方法。一种可能的方法是将一种语言编译成另一种虚拟机的即时程序表示形式(图1(a))。这种方法的例子有JRuby,Scala或IronPython。另一个例子是Redline Smalltalk,它在Java虚拟机中执行Smalltalk。虽然这种方法很流行,但缺点是其他VM不直接支持的特性必须在对象级别上模拟,这将影响模拟语言的性能。另一种方法是并排运行两台虚拟机,并通过某种通信通道进行通信(图1(b))。这种方法的例子是JavaConnec和JNIPo使用外国函数接口,和桥梁等VisualAge Java或Expecco Java接口库与Java虚拟机通信在一个in-terprocess通信通道。代理对象用于拦截和转发对其他环境的函数调用。

另一种更通用的方法是在同一虚拟机中执行两种语言,并对两种语言使用公共对象表示(图1(c))。本文介绍的stx:libjava就是这种方法的一个例子:它在Smalltalk虚拟机中执行Java。

无缝、易用的集成两种编程语言由不同部分组成。首先,它必须允许一个language调用另一个language中的函数,可能传递参数对象并获得返回值(运行时级集成)。

其次,它应该支持程序员友好的参数,并返回在两种语言之间传递的值。

  1. 它应该理想地保留对象标识。当根据对象的标识存储或管理对象时,使用副本或代理对象可能会带来各种问题。这还会影响调用其他语言中的函数时对此类对象的任何副作用。

最后,它应该在语法级别无缝地集成这两种语言,这意味着(理想情况下)调用另一种语言(语言级别集成)不需要额外的粘合剂或编组代码。

以Java和Smalltalk为例,由于它们的设计和语义不同,语言级别的集成带来了许多挑战。具体包括:

  • Smalltalk使用关键字消息选择器,而Java使用传统的c类选择器(虚拟函数名)。
  • Java支持基于静态类型的方法重载,而Smalltalk中没有静态类型信息。
  • 异常机制不同。在Smalltalk中,异常处理程序在堆栈展开之前执行,与Java相反,Java在堆栈展开之后调用异常处理程序。这一事实对虚拟机中堆栈处理的实现有重要影响。
  • 锁机制是不同的。在Smalltalk中,锁是显式的,由标准库提供。在Java中,锁定是语言的一部分,由运行时系统处理,因此是隐式的。

在本文中,我们提出了stx:libjava,5 内建在Smalltalk/X环境中的Java虚拟机(JVM)实现。stx:libjava允许程序从Smalltalk中调用Java代码,几乎与普通的Smalltalk代码一样自然。我们将演示stx:libjava如何将Java集成到Smalltalk中,并描述它如何处理语义差异。

本文的贡献在于(i)一种完整的Java和Smalltalk集成的新方法,(ii)这种集成带来的问题的识别,以及(iii)这些问题的

决方案,以它们在stx:libjava中的实际验证。本文组织如下:第2节详细讨论了集成问题。第3节概述stx:libjava及其实现。第4、5、6、7和8节描述了解决这些问题的技术。第9节提供了真实的例子来验证我们的解决方案。第10节介绍了绩效基准。第11节讨论相关工作。最后,第12节总结了本文。

2 http://jruby.org/。

3 http://www.scala-lang.org。

4 http://ironpython.net/。

5 https://swing.fit.cvut.cz/projects/stx-libjava。

2.问题描述

表面上看,Smalltalk和Java非常相似。它们都是高级的、面向对象的、基于类的语言,具有单继承和自动内存管理。在两种语言中,消息发送都是对象间通信的基本方式。在本节中,我们列举了这些语言的不同之处,以及在将这些语言集成到一个公共系统中时会遇到的问题。

  1. 类访问

在Smalltalk中,类是通过名称来标识的。在任何时候只有一个类具有给定的名称(尽管它可能随时间而变化),并且必须在执行代码时显示并解析它。否则,系统将触发运行时错误。虽然一些Smalltalk方言提供名称空间和/或惰性类加载工具,但是将类加载到系统中的过程并不标准化。

另一方面,Java提供了一种定义良好的、类型安全的、可扩展的机制,称为类加载器,用于将类延迟加载到正在运行的系统中。而且,在Java中,一个类不仅通过它的名称来标识,还通过它定义的类加载器来标识。换句话说,只要由不同的类加载器加载了两个可能具有相同名称的不同类,就可以在运行的系统中共存。使用哪个类加载器在代码中的特定位置加载特定的类取决于复杂的规则和运行时上下文。

  1. 现场访问

在Java中,可以直接使用点符号访问公共字段,而在Smalltalk中,只能使用访问器方法访问In -stance变量的值。尽管在现代Java中,声明实例字段public并直接访问它们被认为是一种“糟糕的风格”,但是Java库中经常使用公共静态字段来公开常量值。

  1. 选择器不匹配

在字节码级别,方法由两种语言的选择器标识。但是,选择器的语法格式不同。Smalltalk在字节码和源代码中使用相同的选择器。Java语言将类型信息编码到字节码级别的选择器中。

例如,在Smalltalk中考虑以下代码:

println: 10

让我们假设out是Java类Java .io. printstream的一个实例。Smalltalk编译一个使用选择器println:发送的消息。但是,Java编译器将使用的Java选择器是println(I)V。添加的后缀(I)V表示该方法接受Java类型int的一个参数,而V表示该方法不返回值(声明为返回void)。

  1. 方法重载

Java有一个重载的概念:在一个类中,多个具有相同名称但具有不同数量或类型参数的方法可能共存。例如,前一个示例中的PrintStream实例有多个名为println的方法,一个采用int类型的参数,另一个采用String类型的参数,依此类推。在虚拟机级别,每个重载方法都有一个不同的选择器(println(I)V,分别是println(Ljava/lang/String;)V)。

所调用的方法取决于调用站点上参数的静态类型。在编译时,Java编译器找到最佳匹配,并使用特定的选择器生成一个send。例如,源代码:

out.println(“字符串”);

out.println (1);

使用方法选择器(INVOKEVIRT in-struction的参数)中编码的类型信息生成以下字节码:

ALOADhellip;hellip;

LDC

INVOKEVIRT println (Ljava / lang / String;) V

BIPUSH 1

INVOKEVIRT println (I) V

Smalltalk是

剩余内容已隐藏,支付完成后下载完整资料


资料编号:[20443],资料为PDF文档或Word文档,PDF文档可免费转换为Word

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。