Ada 编程/平台/VM/Java
Ada→J-Code 编译器将 Ada 程序直接翻译成 Java 字节码,供虚拟机使用。 Ada 程序员和 Java 程序员都可以无缝地使用彼此的类,包括继承。 Ada 添加了诸如强大的基本类型系统和完整的泛型之类的理想语言特性,Java VM 添加了垃圾回收和丰富的库集。
“几乎每个 Ada 95 特性都可以在 J-code 中找到非常直接的映射,并且 J-code 的几乎所有功能都可以在某种 Ada 95 结构中轻松地表示。”—Taft,1996
至少有两个编译器支持这一点:AppletMagic 和 JGNAT。 以下示例假设 AppletMagic。 为使它们与 JGNAT 兼容而需要进行的更改应该很小。 有些将在适当的时候解释。
针对 JVM 的 Ada 程序(例如 Programming:J2ME)似乎出奇地平滑。 与创建(有时使用)对某些库的绑定不同,使用 Ada→J-code 编译器将使绑定问题消失。
AppletMagic 和 JGNAT 使用命名约定来决定如何跨 Java 类文件分发编译后的代码。 当(标记的)类型与其周围的包一起应该映射到一个 Java 类文件时,AppletMagic 要求类型名具有已知的后缀,否则与包名相同
package
Foois
type
Foo_Objis
tagged
... ...end
Foo;
类似地,JGNAT 有一些约定有效地将类型名变成了关键字。 这些名字往往很短,很通用,这里有Typ:
package
Foois
type
Typis
tagged
... ...end
Foo;
将 Java 的基本类型映射到相应的 Ada 类型很简单。(当值接近子类型的限制时,两种语言之间整数类型的语义会有所不同。 JVM 整数在加到最大整数时可以从正数跳到负数,Ada 程序不应该允许这样做。 编译器文档将解释 Ada 语义在 JVM 上将保留到什么程度。)
对于引用类型——所有内容都在堆中分配——还有另一种约定。
package
Foois
type
Foo_Objis
tagged
null
record
;type
Foo_Ptris
access
all
Foo_Obj'Class;procedure
Op(x:access
Foo_Obj);end
Foo;
(JGNAT 源代码使用Ref而不是Foo_Ptr)。 类范围指针可以像 Java 引用一样使用。 请注意,原始操作可能具有access
参数。 这是在与 Java 交互时的一个自然选择。
当 Ada 程序员希望在他们的程序中使用 Java 对象时,他们会看到 Java 类作为普通的包,并且对象遵循上面概述的约定。 编译器提供工具用于从 Java .class 文件创建 Ada 包。 给定 Java 类 Foo,Ada 包将如下所示。
public class Foo
{
public void op() {};
}
with
java.lang;use
java.lang;package
Foois
-- pragma Preelaborate; -- uncomment where possibletype
Foo_Objis
new
Objectwith
null
record
;type
Foo_Ptris
access
all
Foo_Obj'Class;function
new_Foo(this : Foo_Ptr :=null
)return
Foo_Ptr;procedure
op(this :access
Foo_Obj);pragma
Import (Java, op);pragma
Import (Java_Constructor, new_Foo);end
Foo;
- new_Foo
- 这是一个构造函数,对应于 Java 类型的默认构造函数。(通常你不会关心默认构造函数。)构造函数有一个特殊的约定标识符,Java_Constructor.
pragma
Import- 由于构造函数和op方法都在 Java 类中定义,它们将像导入 C 或 Fortran 函数一样导入,使用约定标识符Java_Constructor, 和Java, 分别。
待续。
- S. Tucker Taft (1996). 用 Ada 95 编程互联网
- Cyrille Comar、Gary Dismukes 和 Franco Gasperoni (1997)。 将 GNAT 针对 Java 虚拟机