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 要求型別名具有已知的字尾,否則與包名相同
packageFooistypeFoo_Objistagged... ...endFoo;
類似地,JGNAT 有一些約定有效地將型別名變成了關鍵字。 這些名字往往很短,很通用,這裡有Typ:
packageFooistypeTypistagged... ...endFoo;
將 Java 的基本型別對映到相應的 Ada 型別很簡單。(當值接近子型別的限制時,兩種語言之間整數型別的語義會有所不同。 JVM 整數在加到最大整數時可以從正數跳到負數,Ada 程式不應該允許這樣做。 編譯器文件將解釋 Ada 語義在 JVM 上將保留到什麼程度。)
對於引用型別——所有內容都在堆中分配——還有另一種約定。
packageFooistypeFoo_Objistaggednullrecord;typeFoo_PtrisaccessallFoo_Obj'Class;procedureOp(x:accessFoo_Obj);endFoo;
(JGNAT 原始碼使用Ref而不是Foo_Ptr)。 類範圍指標可以像 Java 引用一樣使用。 請注意,原始操作可能具有access 引數。 這是在與 Java 互動時的一個自然選擇。
當 Ada 程式設計師希望在他們的程式中使用 Java 物件時,他們會看到 Java 類作為普通的包,並且物件遵循上面概述的約定。 編譯器提供工具用於從 Java .class 檔案建立 Ada 包。 給定 Java 類 Foo,Ada 包將如下所示。
public class Foo
{
public void op() {};
}
withjava.lang;usejava.lang;packageFoois-- pragma Preelaborate; -- uncomment where possibletypeFoo_ObjisnewObjectwithnullrecord;typeFoo_PtrisaccessallFoo_Obj'Class;functionnew_Foo(this : Foo_Ptr :=null)returnFoo_Ptr;procedureop(this :accessFoo_Obj);pragmaImport (Java, op);pragmaImport (Java_Constructor, new_Foo);endFoo;
- new_Foo
- 這是一個建構函式,對應於 Java 型別的預設建構函式。(通常你不會關心預設建構函式。)建構函式有一個特殊的約定識別符號,Java_Constructor.
pragmaImport- 由於建構函式和op方法都在 Java 類中定義,它們將像匯入 C 或 Fortran 函式一樣匯入,使用約定識別符號Java_Constructor, 和Java, 分別。
待續。
- S. Tucker Taft (1996). 用 Ada 95 程式設計網際網路
- Cyrille Comar、Gary Dismukes 和 Franco Gasperoni (1997)。 將 GNAT 針對 Java 虛擬機器
