跳转到内容

Ada 编程/平台/VM/Java

来自 Wikibooks,开放世界中的开放书籍

Ada. Time-tested, safe and secure.
Ada. 经得起时间考验,安全可靠。

Ada 和 JVM

[编辑 | 编辑源代码]

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 Foo is

   type Foo_Obj is tagged ...

   ...

end Foo;


类似地,JGNAT 有一些约定有效地将类型名变成了关键字。 这些名字往往很短,很通用,这里有Typ:

package Foo is

   type Typ is tagged ...

   ...

end Foo;

Java 使用引用,Ada 也一样

[编辑 | 编辑源代码]

将 Java 的基本类型映射到相应的 Ada 类型很简单。(当值接近子类型的限制时,两种语言之间整数类型的语义会有所不同。 JVM 整数在加到最大整数时可以从正数跳到负数,Ada 程序不应该允许这样做。 编译器文档将解释 Ada 语义在 JVM 上将保留到什么程度。)

对于引用类型——所有内容都在堆中分配——还有另一种约定。

  package Foo is
  
     type Foo_Obj is tagged null record;
     type Foo_Ptr is 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 Foo is
  
      --  pragma Preelaborate; -- uncomment where possible
      type Foo_Obj is new Object with null record;
      type Foo_Ptr is 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, 分别。

构造函数

[编辑 | 编辑源代码]

待续。

进一步阅读

[编辑 | 编辑源代码]
华夏公益教科书