複製鏈接
請複製以下鏈接發送給好友

Ada語言

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

Ada語言簡介

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

Ada語言來源

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

Ada語言用途

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

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);這需要對數據表示和系統特性訪問的精確控制。最後,提供了預定義的標準程序包,包括輸入輸出、字符串處理、數值計算的基本函數和隨機數生成來。

Ada語言特點介紹

Ada語言易讀性

專業人員往往要讀很多程序,因此要避免像 APL 那種以過於簡單的符號編程的語言,雖然它們的編程速度快,但基本上是不可讀的。因此目前有種説法是:讀一個程序比寫類似的程序還要費時,這也是有一定道理的;特別是 C/C++ 的風格比較鬆散,很多語法都在濫用,使程序可讀性相當低,由於 Ada 的語法接近人的語言,即使是初學者,也不會感到很難讀懂。
強類型---保證了每個對象有明確定義的值域,並防止了不同概念的邏輯混淆。許多錯誤可以被編譯器發現,而對於其它語言來説,則可能導致一個不正確的程序。

Ada語言異常處理

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

Ada語言抽象數據類型

將數據描述的細節同基於該類型數據的操作相分離,以提高可移植性和可靠性。
多任務---使程序變成一系類的併發活動,而不是單一的順序活動;這在很多領域,特別是對於服務器程序來説有重要意義,這比調用操作系統提供的功能更有易可移植性和可靠性。

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語言失敗原因

一個普遍的關於歐洲航天局阿利亞納五號火箭失敗的説法是因為 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代碼如下:
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語言宏語言

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編譯了。