Ada語言

Ada是一種表現能力很強的通用程式設計語言,它是美國國防部為克服軟體開發危機,耗費巨資,歷時近20年研製成功的。它被譽為第四代計算機語言的成功代表。與其他流行的程式設計語言不同,它不僅體現了許多現代軟體的開發原理,而且將這些原理付諸實現。因此,Ada語言的使用可大大改善軟體系統的 清晰性, 可靠性, 有效性, 可維護性。

簡介

Ada的出現,標誌著軟體工程成功地進入了國家和國際的規模。在一定意義上說,Ada還刺破了“馮.諾依曼思維模式” (Von Newman Mind-set) 的桎梏,連同Ada的 支持環境(APSE)一起,形成了新一派的所謂 Ada文化。它是迄今為止 最複雜,最完備的軟體工具。 Ada語言是 美國國防部指定的 唯一的一種可用於 軍用系統開發的語言,我國軍方也將Ada做為軍內開發標準(GJB 1383《程式設計語言Ada》)。

--------------------------------------------------------------------------------

來源

美國國防部之所以把這種語言取名為Ada,是為了紀念奧古斯特. 艾達.洛夫萊斯伯爵夫人 (Augusta Ada Lovlace 1815-1852),她是英格蘭詩人拜倫(Byron)勳爵的女兒,曾對現代計算機技術之父查爾斯.巴貝奇(Charles Babage)的筆記,手稿進行了整理和修正。從某種意義上說,她是世界上第一位電腦程式員。

--------------------------------------------------------------------------------

用途

在明白這個問題之前,需要了解 Ada 的一系列特性。Ada 最初設計就是一門大型語言,因此在很多編程的重要問題上都有所考慮,以下文字摘自《 Ada Reference Manual》:

Ada最初設計時關注於 3 個最重要的問題:程式的穩定性和可維護性,程式設計和人的行為接近,並且高效。這份語言的修訂版是為了提供更大的靈活性和擴展性,存儲管理的額外控制和同步,以及標準化的程式包以支持重要的應用程式領域,同時保留原來的重點:穩定性,可維護性,和高效。對於程式設計語言促進可靠性和簡化維護難度的需求已被確立。因此程式可讀性的重要性高於輕鬆地寫代碼。例如,語言規則要求程式變數應當明確聲明並指定它們的類型。由於變數的數據類型是不變的,編譯器可以確保對於變數的操作適用於該類型的對象。另外,有錯誤傾向的符號已經避免,並且語言語法避免了編碼形式的使用,使更傾向於英語的結構。最後,Ada 語言提供了程式單元單獨編譯的功能,使程式開發和維護簡便,同樣也提供了在一個單元內多個單元之間的檢測。考慮人類程式設計師的問題也在設計時被強調。總而言之,在繼續避免過多複雜句型的缺陷的同時,嘗試以一致系統的方式保持相對較少的底層概念。

------------------------------------------------------------------------------

特性

Ada語言最早是針對嵌入式和實時系統設計的,並且在今天依然在這方面使用廣泛。Ada95版,是由INTERMETR ICS公司的塔克。塔夫特於92到95年間設計的,當時主要是希望改進對於系統,數字,財務軟體編程的支持。

Ada語言的重要特徵就是其嵌入式風格,模組化設計,編譯檢查,平行處理,異常處理及泛型編程。Ada在95年加入了對面向對象設計的支持,包括動態分配等。

Ada的編譯檢查主要是針對沒有分配的記憶體讀寫的保護,堆疊溢出錯誤,單個錯誤空閒,佇列讀寫錯誤以及其他可以避免的小問題。這些檢查可以在為增加效率的情況下被取消,但是在編譯的時候他們卻能帶來很高的效率。同樣它也包括對程式的嚴正的設定。因為這些原因,它被廣泛套用於一些非常重要的系統中,例如航空電子學,武器及航天飛行器的作業系統中。同樣它支持很多的編譯時間檢查,這些檢查被用來避免一些錯誤的發生。這種錯誤往往是在其他語言中在運行以前都不能被察覺到的,需要在源碼中加入特殊的檢查設定才能被發現。

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

Ada語言的定義同國際標準化組織(ISO)的標準有很大不同,因為他是一個自由內容形式的。這種做法的後果是被廣大程式設計師只能從它的標準化文檔(普遍認為是Ada的參考使用手冊(ARM))尋找細節性的技術問題,但是普遍情況是一本標準教科書卻可以在其他不同語言上使用。 Ada語言由嚴格的巴斯特範式定義,但是不適合一般人閱讀.它是第一種同時擁有IEC/ISO/美國軍用標準認證的語言. 其編譯器經過嚴格的審查,以確保同樣的代碼在任一編譯器上產生同樣的可執行效果.並且保證並行性在代碼級可以在無作業系統下同樣運行.

Ada語言最初設計是為了構建長周期的、高度可靠的軟體系統。它提供了一系列功能來定義相關的數據類型(type) 、對象(object)和操作(operation)的程式包(package)。程式包可以被參數化,數據類型可以被擴展以支持可重用庫的構建。操作既可以使用方便的順序控制結構,通過子程式(subprogram)來實現,也可以通過包含並發執行緒同步控制的入口(entry)來實現。

Ada也支持單獨編譯(separate compilation),在物理層上支持模組性。 Ada包含了很複雜的功能以支持實時(real-time),並發程式設計(concurrent programming)。錯誤可以作為異常(exception)來標示,並可以被明確地處理。

Ada也覆蓋了系統編程(system programming);這需要對數據表示和系統特性訪問的精確控制。最後,提供了預定義的標準程式包,包括輸入輸出、字元串處理、數值計算的基本函式和隨機數生成來。

特點

易讀性

專業人員往往要讀很多程式,因此要避免像 APL 那種以過於簡單的符號編程的語言,雖然它們的編程速度快,但基本上是不可讀的。因此目前有種說法是:讀一個程式比寫類似的程式還要費時,這也是有一定道理的;特別是 C/C++ 的風格比較鬆散,很多語法都在濫用,使程式可讀性相當低,由於 Ada 的語法接近人的語言,即使是初學者,也不會感到很難讀懂。

強類型---保證了每個對象有明確定義的值域,並防止了不同概念的邏輯混淆。許多錯誤可以被編譯器發現,而對於其它語言來說,則可能導致一個不正確的程式。

異常處理

實際中,一個程式不可能保證它的正確性;因此,通過異常機制及分塊結構,將錯誤發生的影響控制在某一特定領域。

抽象數據類型

將數據描述的細節同基於該類型數據的操作相分離,以提高可移植性和可靠性。

多任務---使程式變成一系類的並發活動,而不是單一的順序活動;這在很多領域,特別是對於伺服器程式來說有重要意義,這比調用作業系統提供的功能更有易可移植性和可靠性。

類屬單元

很多情況下,程式的某邏輯部份與運行時值的類型無關。因此,需要提供一種機制,從一個樣板中產生多個相應的程式段,以提高代碼的可重用性。

大型編譯---封裝機制,單獨編譯及程式包的分層機制等對於編寫大規模的程式來說是必不可少的。

Ada語言的"Hello,world!" 示例程式

一個Ada語言編寫的"你好世界"Hello world program程式:

withAda.Text_IO;

procedureHello isbegin

Ada.Text_IO.Put_Line("Hello, world!");

end Hello;

在Ada.Text_IO.Put_Line處有一些快捷圖示,不需要很多的文字輸入,但是對於這裡的理解來講並沒有多大意義。

細節性的問題請參考Ada Programming/Basic。

失敗原因

一個普遍的關於歐洲航天局阿利亞納五號火箭失敗的說法是因為 Ada 語言在編譯過程的檢查失敗導致的。 將大的浮點數轉換成整數是一種常見的程式錯誤來源。1996年6月4日,對於Ariane 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位有符號整數時,產生了溢出。 溢出值測量的是火箭的水平速率,這比早先的Ariane 4火箭所能達到的高出了5倍。在設計阿利亞納4火箭的軟體時,他們小心地分析了數字值,並且確定水平速率絕不會超出一個16位的數。不幸的是,他們在阿利亞納5火箭的系統中簡單地重新使用了這一部分,而沒有檢查它所基於的假設。Ada代碼如下:

宏語言

Ada語言自身並不支持宏。但是強大的GCC卻同樣的可以為Ada語言提供宏支持。我們可以使用GCC預處理程式CPP來先進行對包含宏的源檔案進行處理,輸出到檔案,然後將該輸出檔案讀取並除去以#開頭的行即獲得了標準的Ada代碼。

CPP命令:

CPP SOURCE_FILE RECORD_FILE

著需要自己寫一個處理程式來去除CPP輸出檔案中的#開頭的行。

--檔案讀取函式:

type LPSTR is access all string;

-- Load a file by file-name into memory,return pointer

function Load(fn:in string) return LPSTR is

use ada.streams;

use ada.streams.stream_io;

type LPSEA is access all STREAM_ELEMENT_ARRAY;

PRAGMA WARNINGS(OFF);

function UC is new ada.unchecked_conversion(LPSEA,LPSTR);

PRAGMA WARNINGS(ON);

FILE:FILE_TYPE;

SIZE:COUNT;

DATA:LPSEA:=NULL;

begin

open(FILE,IN_FILE,fn);

SIZE:=STREAM_IO.SIZE(FILE);

DATA:=NEW STREAM_ELEMENT_ARRAY(1..STREAM_ELEMENT_OFFSET(SIZE));

READ(FILE,DATA.ALL,STREAM_ELEMENT_OFFSET(SIZE));

CLOSE(FILE);

RETURN UC(DATA);

exception when NAME_ERROR=>

GNAT.IO.PUT_LINE("Error : Can not find the file: "&fn);

return null;

end Load;

_____________________________________________________________

--去除#行函式:函式將指定檔案名稱檔案讀出,除去#行並輸出到指定檔案名稱。

-- with ada.streams.stream_io; use ada.streams.stream_io;

-- with ada.unchecked_deallocation;

procedure clear(input_file:in string;output_file:in string) is

src:lpstr:=load(input_file);

procedure Free is new ada.unchecked_deallocation(string,LPSTR);

file:ada.streams.stream_io.file_type;

stream:ada.streams.stream_io.stream_access;

i:integer:=0;

begin

if src/=null then

loop

i:=i+1;

if src(i)="#" then

loop

src(i):=" ";

i:=i+1;

exit when i>src'last or src(i)=ASCII.LF;

end loop;

end if;

exit when i>=src'last;

end loop;

create(file,out_file,output_file);

stream:=ada.streams.stream_io.stream(file);

string'write(stream,SRC.all);

close(file);

Free(SRC);

end if;

end clear;

___________________________________________________________

在經過除去#行獲得最終處理過的檔案後即可交由GNAT編譯了。

相關詞條

相關搜尋

熱門詞條

聯絡我們