跳轉到內容

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, 分別。

建構函式

[編輯 | 編輯原始碼]

待續。

進一步閱讀

[編輯 | 編輯原始碼]
華夏公益教科書