Ada語言

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 Reference Manual》:

Ada最初設計時關注于3個最重要的問題:程序的穩定性和可維護性,程序設計和人的行為接近,并且高效。這份語言的修訂版是為了提供更大的靈活性和擴展性,存儲管理的額外控制和同步,以及标準化的程序包以支持重要的應用程序領域,同時保留原來的重點:穩定性,可維護性,和高效。對于程序設計語言促進可靠性和簡化維護難度的需求已被确立。

因此程序可讀性的重要性高于輕松地寫代碼。例如,語言規則要求程序變量應當明确聲明并指定它們的類型。由于變量的數據類型是不變的,編譯器可以确保對于變量的操作适用于該類型的對象。另外,有錯誤傾向的符号已經避免,并且語言語法避免了編碼形式的使用,使更傾向于英語的結構。

最後,Ada語言提供了程序單元單獨編譯的功能,使程序開發和維護簡便,同樣也提供了在一個單元内多個單元之間的檢測。考慮人類程序員的問題也在設計時被強調。總而言之,在繼續避免過多複雜句型的缺陷的同時,嘗試以一緻系統的方式保持相對較少的底層概念。

特性

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

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

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

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

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

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 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月3日,對于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代碼如下:

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

宏語言

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

相關詞條

相關搜索

其它詞條