Ada

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書
Ada
編程範型多範式
設計者
面市時間1980年
型態系統靜態強型別安全標明英語Nominal type system
作業系統跨平台
網站http://www.adaic.org/
主要實作產品
AdaCore GNAT,

Green Hills Software英語Green Hills Software Optimising Ada 95 compiler,

DDC-I英語DDC-I Score
衍生副語言
SPARKRavenscar profile
啟發語言
ALGOL 68, Pascal, C++(Ada 95), Smalltalk(Ada 95), Modula-2 (Ada 95) , Java(Ada 2005),Eiffel(Ada 2012)
影響語言
C++, Eiffel, PL/SQL, VHDL, Ruby, Java
Ada吉祥物

Ada,是一種程式設計語言。它源於美國國防部在二十世紀七十年代的計劃,旨在整合美軍系統程式設計語言,而當時美軍系統執行著上百種不同的程式設計語言,並提高除錯能力和效率,由Pascal及其他語言擴充而成,接近自然語言和數學表達式,用「Ada」命名以紀念愛達·勒芙蕾絲Ada Lovelace)。

重要特徵[編輯]

Ada語言最早針對嵌入式即時運算設計,至今依然在這些領域廣泛使用。Ada95版,是由INTERMETRICS公司的塔克·塔夫特於1992到1995年間設計的,旨在改進對於系統、數字、財務軟體編程的支援。

Ada語言的重要特徵就是其嵌入式風格,模組化編程,編譯檢查,平行處理例外處理泛型編程。Ada在1995年加入了對物件導向設計的支援,包括動態分配等。

Ada的編譯檢查主要是針對沒有分配的記憶體讀寫的保護,堆疊溢位錯誤,單個錯誤空閒,佇列讀寫錯誤以及其他可以避免的小問題。這些檢查可以在為增加效率的情況下被取消,但是在編譯的時候他們卻能帶來很高的效率。同樣它也包括對程式的嚴正的設定。因為這些原因,它被廣泛應用於一些非常重要的系統中,例如航空電子學武器及航天飛行器的作業系統中。

同樣它支援很多的編譯時間檢查,這些檢查被用來避免一些錯誤的發生。這種錯誤往往是在其他語言中執行之前難以被察覺到的,需要在原始碼中加入特殊的檢查設定才能被發現。

Ada的動態記憶體管理非常安全和高規格,它類似於JAVA語言卻不同於C語言的。這種特殊功能並不需要特殊的執行設定。儘管這種語言的語意結構允許對於不能讀寫的目標進行自動的碎片搜集,但是大多數執行時都不支援該特性。Ada卻支援有限形式基於區域的儲存管理。無效的讀寫常在執行時候被檢查出來(除非這種檢測被人為關閉)並且有時候在編譯時候就被發現。

Ada語言的定義同國際標準化組織(ISO)的標準有很大不同,因為他是一個自由內容形式的。這種做法的後果是被廣大程式設計師只能從它的標準化文件(普遍認為是Ada的參考使用手冊(ARM))尋找細節性的技術問題,但是普遍情況是一本標準教科書卻可以在其他不同語言上使用。

Ada語言由嚴格的巴斯特範式定義,不適合一般人閱讀。它是第一種同時擁有IEC/ISO/美國軍用標準認證的語言,其編譯器經過嚴格的審查,以確保同樣的代碼在任一編譯器上產生同樣的可執行效果,並且保證並列性在代碼級可以在無作業系統下同樣執行。

歷史[編輯]

在1970年代,美國國防部(DoD)所屬的嵌入式電腦系統專案中使用的程式語言數量逐日增多,其中的很多語言十分陳舊或者依賴於硬體,而且沒有一個支援安全的模組化編程,對此DoD感到十分擔心。基於這個原因,在1975年成立了高階語言工作群組(HOLWG),它的使命是就是尋找或者創造某種適合國防部需要的程式語言,以便減少現有程式語言數量。該小組最終的工作成果就是Ada語言。由此,類似專案中使用的高階程式語言的數量大大減少了,1983年的450種程式語言,到1996年只剩下37種。

工作群組開發出了語言要求文件—文件。許多現存的語言都被仔細地檢查,但是1977年這個團隊聲稱沒有任何現存語言符合他們的條件。

Ada語言的範例程式[編輯]

Hello, World!程式

with Ada.Text_IO; use Ada.Text_IO;

procedure Hello is
begin
    Put_Line("Hello, world!");
end Hello;

Ada.Text_IO.Put_Line處有一些捷徑,不需要很多的文字輸入,但是對於這裡的理解來講並沒有多大意義。細節性的問題請參考Ada Programming/Basic

判定一個字串是否為回文的函數(遞迴):

-- 判定一个字符串是否是回文
function is_palindrome(str : in String) return Boolean is
    len : Natural := str'Length;
begin
    if len <= 1 then
        return True;
    elsif Element(To_Unbounded_String(str), 1) = Element(To_Unbounded_String(str), len) then
        declare
            new_str : String(1..len-2);
        begin
            new_str := Slice(Source => To_Unbounded_String(str),
                             Low    => 2,
                             High   => len - 1);
            return is_palindrome(str => new_str);
        end;
    else
        return False;
    end if;
end is_palindrome;

定義一個函數用來判定一字串是否為回文

-- 判定一个字符串是否是回文
function is_palindrome(str : in String) return Boolean is
    len : Natural := str'Length;
begin
    for i in 1 .. len / 2 loop
        if Element(To_Unbounded_String(str), i) /= Element(To_Unbounded_String(str), len - i + 1) 
        then
            return False;
        end if;
    end loop;
    return True;
end is_palindrome;

關於亞利安5號運載火箭的失敗[編輯]

一個普遍的關於歐洲太空總署亞利安5號運載火箭失敗的說法是因為Ada語言在編譯過程的檢查失敗導致的。將大的浮點數轉換成整數是一種常見的程式錯誤來源。1996年6月4日,對於亞利安5號運載火箭的初次航行來說,這樣一個錯誤產生了災難性的後果。發射後僅僅37秒,火箭偏離它的飛行路徑,解體並爆炸了。火箭上傳有價值5億美元的通訊衛星。6億美元付之一炬。後來的調查顯示,控制慣性導航系統的電腦向控制引擎噴嘴的電腦傳送了一個無效資料。失事調查報告指出,火箭爆炸是因為:

During execution of a data conversion from 64-bit floating point to 16-bit signed integer value, the floating point number which was converted had a value greater than what could be represented by a 16-bit signed integer. This resulted in an Operand Error.

它沒有傳送飛行控制資訊,而是送出了一個診斷位元型樣,表明在將一個64位元浮點數轉換成16位元有符號整數時,產生了溢位。溢位值測量的是火箭的水平速率,這比早先的亞利安4型運載火箭所能達到的高出了5倍。在設計亞利安4型運載火箭的軟體時,他們小心地分析了數字值,並且確定水平速率絕不會超出一個16位元的數。不幸的是,他們在亞利安5號運載火箭的系統中簡單地重新使用了這一部分,而沒有檢查它所基於的假設。Ada代碼如下:

begin
    sensor_get(vertical_veloc_sensor);
    sensor_get(horizontal_veloc_sensor); 
    vertical_veloc_bias := integer(vertical_veloc_sensor);
    horizontal_veloc_bias := integer(horizontal_veloc_sensor); 
    ... 
exception
    when numeric_error => calculate_vertical_veloc();
    when others => use_irs1(); 
end;

參見[編輯]

參考書目[編輯]

國際標準[編輯]

書目[編輯]

Ada的百科[編輯]

總體資訊[編輯]

輔助工具書[編輯]

工程[編輯]

參考文獻[編輯]

  1. ^ Technical Corrigendum for Ada 2012 published by ISO. Ada Resource Association. 2016-01-29 [2016-02-23]. (原始內容存檔於2016-03-04). 
  2. ^ Consolidated Ada 2012 Language Reference Manual. Ada Conformity Assessment Authority. [2016-02-23]. (原始內容存檔於2016-03-03).  |url-status=|dead-url=只需其一 (幫助)
  3. ^ Technical Corrigendum 1 for Ada 2012. Ada Conformity Assessment Authority. [2016-02-23]. (原始內容存檔於2016-03-02).  |url-status=|dead-url=只需其一 (幫助)

外部連結[編輯]