ADA語言基礎(chǔ)教程_第1頁
ADA語言基礎(chǔ)教程_第2頁
ADA語言基礎(chǔ)教程_第3頁
ADA語言基礎(chǔ)教程_第4頁
ADA語言基礎(chǔ)教程_第5頁
已閱讀5頁,還剩130頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

ADA語言基礎(chǔ)教程(美國軍方的專用計算機

語言?。?/p>

發(fā)表于:個人日記,科技資訊,編程開發(fā)?作者:謀萬世全局者

標簽:ADA,軍方,基礎(chǔ)教程,美國,計算機語言,語言

PS:前天晚上應朋友之邀,過去喝茶聊天。其中有一位美籍臺灣人。原來他還是

IT界的老前輩,家住硅谷。2。多年前就在一家跨國大公司從事數(shù)據(jù)庫管理,我們

聊了很多。他說他以前做工程師時用的是Ada語言,我以前真沒怎么聽說過還有

這種語言,回來查了一下,Ada語言原來是美國軍方的專用計算機語言!據(jù)說中

國軍方目前也在使用!Ada是一種表現(xiàn)能力很強的通用程序設(shè)計語言,它是美國

國防部為克服軟件開發(fā)危機,耗費巨資,歷時近20年研制成功的。它被譽為第四

代計算機語言的成功代表。目前應用廣泛度排16名。

a

Ada語言的中文資料極度缺乏,當當網(wǎng)里居然一本都沒有。找到了一本80年底

翻譯的ada語言基礎(chǔ)。下面這篇ADA語言文檔還不錯,有興趣的同學可以了解

一下,看了一下語法,跟C語言很像,應該屬于C的高級改進版。

第1章Ada簡介

1.1概述(Overview)

Ada語言最初設(shè)計是為了構(gòu)建長周期的、高度可靠的軟件系統(tǒng)。它提供了一系列功

能來定義相關(guān)的數(shù)據(jù)類型(type)、對象(object)和操作(operation)的程序包

(package)o程序包可以被參數(shù)化,數(shù)據(jù)類型可以被擴展以支持可重用庫的構(gòu)建。

操作既可以使用方便的順序控制結(jié)構(gòu),通過子程序(subprogram)來實現(xiàn),也可以

通過包含并發(fā)線程同步控制的入口(entry)來實現(xiàn)。Ada也支持單獨編譯(separate

compilation),在物理層上支持模塊性。

Ada包含了很復雜的功能以支持實時(real-time),并發(fā)程序設(shè)計(concurrent

programming)o錯誤可以作為異常(exception)來標示,并可以被明確地處理。

Ada也覆蓋了系統(tǒng)編程(systemprogramming);這需要對數(shù)據(jù)表示和系統(tǒng)特性訪

問的精確控制。最后,提供了預定義的標準程序包,包括輸入輸出、字符串處理、

數(shù)值計算的基本函數(shù)和隨機數(shù)生成。

譯自《AdaReferenceManual》Sectioni:General

在本章里,我們將會初步介紹一下Ada,以給讀者留下大致的印象。

1.2Ada的歷史(TheHistoryofAda)

為了更好的理解Ada,它的歷史有必要簡要地了解一下。

1974年時:美國國防部(DoD)意識到開發(fā)和維護嵌入式系統(tǒng)(固化在硬件中的系

統(tǒng),如導彈彈導系統(tǒng))耗費了過多的時間,精力和資金。

當時.,在使用的計算機語言有45。多種,這增加了開發(fā)新系統(tǒng)以及培訓程序員使

熟悉現(xiàn)有系統(tǒng)的時間和成本。維護工作也由于沒有標準化的工具(編輯器,編譯器

等)而受阻。所有這些因素使DoD意識到它需要-們強大的語言,能被所有嵌入

式電腦供應商使用。

開發(fā)工作始于1975年,當時DoD列舉了一系列的語言需求;但沒有一門現(xiàn)有語言

指定了這些特性,因此在1977年,DoD起草了一份建議,開發(fā)一門新的語言。不

像COBOL這些語言由專門的委員會制定,新語言是一場競爭的主題,在產(chǎn)業(yè)界和

學術(shù)界的評估中產(chǎn)生。

在眾多競爭者當中,有4家被選中以完成進一步的工作。最終只剩下Cii-

HoneywellBull公司。這門語言被命名為Ada。設(shè)計小組由JeanIchbiah領(lǐng)導,

對語言全權(quán)負責。

在1983,Ada成為了一個ANSI標準ANSI/MIL-STD-1815A。此年成為一個ISO

標準。在參考手冊中定義的語言通常稱為LRM或ARM(AdaReferenceManual)?

在Ada的相關(guān)書籍和編譯器的報錯信息中經(jīng)常出現(xiàn)手冊內(nèi)容的引用。對于任何

Ada站點,參考手冊都是推薦的;雖然很難閱讀,但它是所有Ada問題的最權(quán)威

解釋(一個小組正在澄清語言定義中已發(fā)現(xiàn)的語義不清的內(nèi)容)。

Ada也經(jīng)過了一次修正,即1995的新的ISO標準。新標準修正了Ada83的很多

缺陷,并進一步擴展了它的功能(在修正工作中,有個臨時的標準,即Adagx,不

少Ada文章是在這段時間寫的,因此有些內(nèi)容在細節(jié)上可能與Ada95有所區(qū)別,

但主要原理差不多)。

為了防止Ada編譯器的不兼容版本的擴散,AdaJointProgramOffice(控制Ada

語言的執(zhí)行部門,于1998年10月1日關(guān)閉,見AdaJointProgramOffice

closed)采取了不尋常的做法-他們注冊Ada商標。除非通過他們的兼容性測

試,編譯器廠商不允許出售‘Ada'編譯器。這在不久以后放松了,保護協(xié)議變成了

'ValidatedAda'。因而產(chǎn)生的Ada確認證書被限制在一定的時間內(nèi)并有一個期滿

時間。當時間過期后,該編譯器不能再被標記為'ValidatedAda'編譯器。通過這

種方式,AJPO確保當前市場上的編譯器與當前標準相一致。

目標是使所有的Ada程序能在所有系統(tǒng)上被編譯-在這點上,AJPO比其它語言小

組做得好。

上述內(nèi)容基本上是從QuickAda翻譯過來的(以前翻譯該教材“半途而廢”的殘留

品,直接引用一下了),Ada語言的詳細歷史細節(jié)見TheHistoryofAda

1.3與C和C++的比較(Contrast:AdaandC,C++)

由于Ada出生年月遲了一點,而且目前的操作系統(tǒng)基本上由C,C++寫成,導致

Ada在"平民層”的推廣比較糟糕,至今還不是很流行,WhyAdaisn'tPopular-

對此有比較詳細的解釋。而Ada愛好者們?yōu)榱孙@示Ada的優(yōu)越性(這種心情相當

能理解),將Ada與C,C++做了一系列比較,其結(jié)果反正綜和指數(shù)都是Ada

高,這方面文章有不少,ComparingDevelopmentCostsofCandAda,

Contrasts:Ada95&C++。在這里,我們只初略地了解一下Ada的優(yōu)勢即可,在

讀者朋友接下去的學習中,應該是能從心里感受到Ada的優(yōu)點。

1.更高的安全性、可靠性。Ada中對于訪問內(nèi)存、數(shù)值計算等很多方面有一

些嚴格的規(guī)定,而沒有C和C++那么自由;程序的錯誤絕大部份能在編譯和

運行時檢測到,以至于可以不需要編譯器,另外,語言也包含異常特性,能方

便地處理錯誤。

2.更高的移植性。在Unix和Windows下有C編程經(jīng)驗的朋友應該對于兼容

性深有體會,很多代碼純粹是為了適應不同的系統(tǒng)增添的,對于實際工作沒多

大用處。但Ada的初始語言環(huán)境中就有了異常(約等于Unix下的Signal)、

任務(wù)(線程)、分布式計算、隨機數(shù)產(chǎn)生、寬字符集很多特性的支持,而在現(xiàn)

在的具體操作系統(tǒng)中,這些特性往往隨系統(tǒng)而異。即使Ada95里缺少一些功

能,也可以通過額外標準和函數(shù)庫來彌補:GDI庫,可以用GtkAda,

在Windows和X下通用;Ada也有一個Posix接口的標準,可以使用函數(shù)

庫Florist來調(diào)用Posix的函數(shù)用戶層是大大省力一只要自己的操作系統(tǒng)上

有所需的編譯器和函數(shù)庫即可。

3.語法明確,基本上沒有令人混淆的地方。Ada程序的源代碼遠遠

比C或C++的代碼易懂。看程序的人是減輕了不少腦負擔。

4

5

總之,C和C++能做的Ada肯定能做,但Ada要省時方便的多。讀者在學習Ada

之后,無需多說也就明白了,筆者在初學Ada時就有耳目一新的感覺,唯一的遺

憾是Ada不流行。

1.4網(wǎng)絡(luò)資源(InternetResources)

Ada雖然在國內(nèi)不流行,但在國外還是有不少網(wǎng)站,下面是只列舉一小部份,至于

更多的資源,讀者可至VenusIC查找:

1.HomeoftheBraveAdaProgrammers(HBAP),B|JAdaHome,

由MagnusKempe維護,里面包含了不少Ada相關(guān)的文檔、軟件

2.PublicAdaLibraiy(PAL)?PAL是Ada軟件、文檔的圖書館。主站點在

(WUARCHIVE),以及法國的一個映像站點mirrorsite,

PAL目前由RichardConn維護。

3.AdalC,由AJPO發(fā)起的一個站點,也包含了不少相關(guān)信息。

41SIGAda,是ACM的一個SpecialInterestGroup<>

5.AdaPower,很不錯的一個站點,有相關(guān)教材、文檔、Faq、Linux等鏈

接。

6.AdaCoreTechnology,Gnat,Glade等軟件的老家。

7.新聞組comp.lang.ada,不用多介紹了

1.5第一個程序(TheFirstProgram)

為了了解Ada程序的大致結(jié)構(gòu),舉一個例子是難免的。大部份書籍一般都是

用"helloworld”程序來開始,我們下面就見識一個在終端屏幕上輸出“Hello

World!”的簡例。

000—filename:hello,adb;

001withAda.Text_I0;

002procedureHellois

003begin

004Ada.Text_I0.Put("HelloWorld!”);

005Ada.Text_I0.NewLine;

006endHello;

先介紹一下在本教材中代碼的一些問題:每行代碼前的000,001等數(shù)字表示該代

碼是第幾行,只為了講解方便,在實際源代碼中是不存在的;with,procedure等

保留字(reservedword)都用粗體表示,以示區(qū)別;有些字是用斜體表示,表示該字

是用其它有效字符替換。

現(xiàn)在讓我們分析上述的簡單程序:

[ooo]標示該程序文件名為hello.adb,在程序中并不需要;-是注釋符,表示從其

所在位置至行尾都是注釋,對程序沒有什么影響,與C的/**/類似。

[ooi]Ada.Text」O是預定義的一個程序包(package);withpackage_name和

C的include功能差不多。

[oo2]-[oo6]是程序的主體部份。與C下的main函數(shù)類似,Ada也需要一個主過

程(mainprocedure),在這個例子中是過程Hello。過程的用法和上例一樣,都是

procedureprocedure_nameis

statementsl;

begin

statements2;

endprocedure_name;

statemen11可以是變量、常量、函數(shù)、過程等的聲明;statements2是過程

procedure_name要執(zhí)行的語句,對象的聲明不能在這部份;end后

的procedure_name不是必需的,但為了程序的可讀性,應加上。

[003],[004]分別輸出"HelloWorld!"和新行符。Put和New_Line都是

Ada.Text」。里的過程。

但上7例調(diào)用過程Put和New.Line的方法比較羅嗦,因此我們也可以使用use

語句:

ooo—filename:hello.adb;

001withAda.Text_IO;useAda.Text_IO;

002procedureHellois

003begin

004Put("HelloWorld!J,);

005New_Line;

006endHello;

這樣Ada編譯器就能在程序包Ada.Text_IO中自動搜尋Put,New_Line,而無需

用戶指定它們所在的準確位置。

我們在將上例略微改動以下,以使讀者了解一下聲明部份:

000--filename:hello,adb

001withAda.Text_IO;useAda.Text_IO;

002procedureHellois

003Str:String:="HelloWorld!”;

004begin

005Put(Str);

006New_Line;

007endHello;

在is和begin之間,聲明了一個字符串變量Str,它的初始值為“HelloWorld”。

String是預定義的字符串類型。上述的聲明方式和Pascal差不多。現(xiàn)在我們對

Ada程序長的什么樣已有了基本的認識,下面需要了解兒個術(shù)語。一個Ada程序

是由一個或多個程序單元組成(programunit)。一個程序單元可以為:

1.子程序(subprogram),定義一些可執(zhí)行運算。過程(procedure)和函數(shù)

(function)都是子程序。

2.程序包(package),定義一些實體(entity)o程序包是Ada中的主要分組

機制,類似于C的函數(shù)庫,Modula的"module”。

3.任務(wù)單元(taskunit),與線程類似,定義一些計算,然后并發(fā)執(zhí)行。

4-保護單元(protectedunit),在并發(fā)計算中協(xié)調(diào)數(shù)據(jù)共享,這在Ada83中

不存在。

5.類屬單元(genericunit),幫助構(gòu)建可重用組建,和C++的模板類似。

后3類屬于高級話題,在后面的章節(jié)中我們會依次介紹。程序單元又可為兩部份:

1.聲明部份(declaration)。定義對其它程序的接口,有些可用資源可以被用戶

使用,與C下的'h文件相似。

2.主體部份(body)。是聲明部份的具體實現(xiàn),等價與C的'.c'文件。

其中程序包(package)和子程序(subprogram)是用的最廣泛的2個程序單元。大

部份Ada程序基于一堆程序包,在以一個主過程(mainproceudre)來開始Ada程

序。第2章基本數(shù)據(jù)類型和表達式(BasicTypesandExpressions)2.1概述

(Overview)數(shù)據(jù)類型是一門計算機語言最基本的特性,表示一個對象的類型,是

數(shù)字、字符或其它類型。由于Ada在數(shù)據(jù)類型上提供的強大處理能力,我們又不

能很簡單地認為數(shù)據(jù)類型僅是定義一個對象的類型。在Ada里,數(shù)據(jù)類型可以自

己創(chuàng)建,它的相關(guān)運算符也可以自己定義,同時又有數(shù)據(jù)類型屬性這項特性,具有

相當大的靈活性。學過其它的語言,特別是有C和Pascal背景的朋友初次接觸時

可能會感到有點新鮮。創(chuàng)建新類型,是用戶自己定義數(shù)據(jù)類型,包括該類型的名

稱、取值范圍及相關(guān)操作;其中又包括了派生類型和創(chuàng)建子類型,即以現(xiàn)有數(shù)據(jù)類

型為母類型創(chuàng)建新類型,繼承母類型的一部份屬性。數(shù)據(jù)類型屬性,如同我們玩

RPG游戲時的人物屬性:體力值、魔法值一樣,是說明該類型固有的屬性,包括

最小取值范圍、最大取值范圍等等。本章將會先介紹詞法元素以及創(chuàng)建數(shù)據(jù)類型

的基礎(chǔ)性知識,然后是整型(integer)、實型(real)、字符型(character)、布爾型

(boolean)、枚舉類型(enumuration)這幾種標量類型,最后則是相關(guān)的數(shù)據(jù)類型

屬性、類型限制和類型轉(zhuǎn)換、表達式和運算符。2.2詞法元素(LexicalElement)

Ada里的詞法元素與其它語言的定義還是有不小差別,下面按照RM95關(guān)于詞法

元素的分類來逐項介紹,包括標識符、保留字、字符:、數(shù)值文字等及它們的一些規(guī)

則。2.2.1基本字符集(CharacterSet)Ada95規(guī)定的標準字符集是Latin-1,支持

8位(基于ISO-8869)和16位(基于ISO-10646)字符,在非標準模式下也可用本地

字符集,具體情況取決于當前的系統(tǒng)。(一般來說,涉及字符時默認是指Latin-1,

程序幾乎都是用Latin-1字符集寫的)字符在RM95中是分成了三類:圖形字符

(graphiccharacter)、格式控制符(formateffector)、其它控制符(othercontrol

function),它們所表示的范圍為:圖形字符包括字母(letter)、數(shù)字(digit)、空格符

(space)>特殊字符(specialcharacter)(例如"

格式控制符包括水平制表符(HT)、垂直制表符(VT)、回車(CR)、換行(LF)、換頁

(FF);其它控制符則是除了格式控制符以外的控制符。更詳細的內(nèi)容參見RM95、

ISO8869,ISO106460Ada是大小寫忽略的(除了字符和字符串中的實際內(nèi)容,

如字符'z'和'Z'不相同,但標識符z和Z相同),但為了可讀性,一般來說變量名或

函數(shù)名首字母都會大寫,其余小寫,縮近格式也需要引起注意。根據(jù)實際情況盡量

保證可讀性。為了兼容性,Ada95要求編譯器最少支持一行字符串和一個詞法元

素的長度為200個字符:(不包括行尾符)。Ada在字符集上并沒有很嚴格要求編

譯器一定要怎樣,但應該支持標準字符集。2.2.2標識符(Identifier)Ada中不

管是變量、函數(shù)還是其它對象都需要一個名稱,這就叫做標識符:。如X、Count.

me就是簡單的標識符。Ada中的標識符有以下一些注意點:1.標識符一定要是字

母開頭,接下去可以是數(shù)字和下劃線,結(jié)尾不能為下劃線。如Fig_、_Lik,ime

是不合法的。2.兩個連續(xù)的下劃線不能在一起,因為有些打印機可能會將兩個下

劃線當作一個處理。3.雖然單個字符可作為標識符,但一般情況下不應該濫用這

項特性(我不知道這除了少敲幾個字外,還有什么意義,想想數(shù)字o和字母0、數(shù)

字1和字母1吧,絕對害死人的做法)。4.不能將保留字作為標識符。在Ada

83中,標識符包括了保留字,但在Ada95中保留字從標識符中分離了出來。5--

如上節(jié)所提及的,標識符是不分大小寫的,但為了可讀性,請注意你對標識符的命

名。2.2.3保留字(ReservedWord)保留字在程序語法中有特殊的含義,不屬

于標識符范圍,這與C和Pascal等語言的定義有所不同。Ada95中的保留字如

F:abortabsabstractacceptaccessaliasedallandarrayatbegin

bodycaseconstantdeclaredelaydeltadigitsdoelseelsifendentry

exceptionexitforfunctiongenericgotoifinislimitedloopmodnew

notnulloforothersoutpackagepragmaprivateprocedureprotected

raiserangerecordremrenamesrequeuereturnreverseselect

separatesubtypetaggedtaskterminatethentypeuntilusewhenwhile

withxor在以后的內(nèi)容中,我們會逐個解釋它們的含義及作用。Ada95的保留字

比原先添力II了6個:abstract,aliased,protected,requeue,tagged

和until,雖然這可能會牽連到兼容性問題,但通常也無須計較這點。2.2.4分隔

符(SeparatorandDelimiter)Ada程序中,各元素之間需要空格符、格式控制

符或EOF隔開。RM95里將它們作為separator,而delimiter則是指下列特殊字符

(中文有點說不清楚):|或是復合型的:=〉..**:=/=>=

<=??<>o當分隔符作為注釋、字符串、字符、數(shù)值的一部分時,就不再是分

隔符了。2.2.5數(shù)值文字(NumericLiteral)數(shù)值文字就是指數(shù)字。Ada和

Pascal相同,將數(shù)字分為實數(shù)型(realliteral)和整數(shù)型(integerliteral)兩大類。實數(shù)

型是有小數(shù)點的數(shù)字,整數(shù)型則無小數(shù)點。如1.2787,0.871,7。是實數(shù)型,而-

882,5441,1是整數(shù)型。Ada在數(shù)字表示上有一個很好的特性就是可以明確指定使用

何種基數(shù)(2進制到16進制)表示,下面是數(shù)字的表示:十進制數(shù)(Decimal

Literal)不管是實型還是整型數(shù),都可以在其間加上下劃線,使長數(shù)字更加易

讀。如56886515645125615,可寫為56_886_515_645_125_615或

5_6886_5156_4512_5615,下劃線并不改變數(shù)字的值。但兩個下劃線不能是連續(xù)

的,卜劃線也不可以在數(shù)字首部和尾部,如676_66和67.E4都是非法的。字母

E作為數(shù)字的指數(shù),同時適用于實型和整型。如123_98E4、5Q87E-5、48E7都

是合法的,但負指數(shù)不能用于整型,指數(shù)也一定要是整數(shù)。E大小寫皆可以?;?/p>

型數(shù)字(BasedLiteral)在大部分語言中,都使用10進制數(shù)字表示;Ada里整數(shù)

可以不用10進制的表示方法書寫,而是直接使用2至16進制的表示法,格式

為:Base#Number#,Base表示所采用的進制,Number為該進制下所表示的

數(shù)字。2#1001_1001#,表示2進制數(shù)10011001,中間的下劃線可取消,其10進值

為153;10#153#,表示10進制數(shù)153,等價與153;16#9。#,表示16進制數(shù)9。,

其10進值為144;2.2.6字符文字(CharacterLiteral)字符文字的表示是單個

圖形字符在單引號'‘中,如'a'表示小寫字母a,'K'表示大寫字母K;1'表示一個單引

號,''表示一個空格。2.2.7字符串文字(StringLiteral)字符串是雙引號(”")之

間的有序圖形字符。如"WhatIsaid."就是一個字符串。表示空字符串時直接用”

“。如果字符串中有雙引號,一個雙引號要用兩個”來表示。如"Hesaid,”"1am

hungry.,,n而"Hesaid,""Iamhungry."或"Hesaid/'Iamhungry.""是不合法

的。至于其它字符,如$%之類可以直接出現(xiàn)在兩個雙引號間。與C語言不同,

Ada里沒有與之相同的轉(zhuǎn)義字符,并且E0L不會算到字符串中。2.2.8注釋

(Comment)注釋由兩個連字號(hyphen)(-)開始,直到行尾。可以出現(xiàn)在程序的

任一個地方,不影響程序本身。例如:—thecomment;end;-processingofLine

iscomplete.2.2.9PragmasPragma是編譯指示(compiledirective),給編譯器指

令如優(yōu)化程序,列表控制等。它的作用往往不只影響一個編譯單元,而是整個程

序。Pragma是些預先定義的指令,如pragmaPage,pragmaList(OFF),編譯器也

可擴展RM95中pragma。我們先接觸List,Page,Optimize這3個pragma。更

多內(nèi)容我們會在以后接觸。pragmaList(identifier);pragmaPage;pragma

Optimize(identifier);pragmaList將identifierOn或Off作為它的參數(shù)。它指定

編譯列表(listingofcompilation)是繼續(xù)還是停止,直到在同一個編譯單元內(nèi),一

個pragmaList使用了相反的參數(shù)。pragmaPage指定在pragma后的程序正文

在新頁開始(如果編譯器正在列表)pragmaOptimize有Time,SpaceOff3

個參數(shù),它的影響區(qū)域直到pragama所在編譯單元的底部。Time和Space指

示優(yōu)化時間還是優(yōu)化空間,0任則關(guān)閉優(yōu)化。下面是簡單的例子:pragma

List(Off);關(guān)閉列表生成pragmaOptimize(Off);關(guān)閉可選的優(yōu)化

不過,上述3個pragma是影響編譯過程用的,基本上用戶也用不著,以后涉

及的inline,Pure等pragma使用頻率倒挺高2.3創(chuàng)建數(shù)據(jù)類型和子類型

(CreatingTypesandSubtypes)使用變量時,除了以某標識符作為變量的名稱

外,還要指定該變量的數(shù)據(jù)類型。一個數(shù)據(jù)類型定義了變量可接受的值以及所能執(zhí)

行的操作。比如說,一個數(shù)據(jù)類型為Age的變量Bill,Age的取值范圍為1..100,并

只有+-這兩種操作,在這里,對象(object)為名為Bill的變量,它的取值在1..100

之間(包括1,100),值的變化只能通過+-這些基本運算符(primitiveoperation)

來實現(xiàn),而無法通過*/等其它運算符。Ada中的數(shù)據(jù)類型,包括預定義類型,都是

按照一定的格式在程序包中創(chuàng)建的。下面就介紹創(chuàng)建數(shù)據(jù)類型的一些基本內(nèi)容,更

多相關(guān)內(nèi)容會在以后見到。2.3.1創(chuàng)建新的數(shù)據(jù)類型創(chuàng)建一個新類型,需要使用

保留字type,is,range。格式如下:typetype_nameisrange

range_specifcation;type_name為新類型的名稱,是一個合法標識符:

range_specifcation表示該類型的取值范圍,表示方式為First..Last,如1..100,

-9..10o例如創(chuàng)建上面提及的一■個新類型Age:typeAgeisrange1..100;這樣

就有了一個數(shù)據(jù)類型Age,取值范圍1..100。有一點要注意:

range_specfication中First要大于Last。如typemonthsisrange12..o,實

際上months是一個空集(null),而不是所期望的0..12。不同數(shù)據(jù)類型之間是不能

進行混合運算的,即使取值范圍和運算符一樣,看以下的程序例子:ooo—

filename:putwage.adbooiwithAda.Text_IO;useAda.Text_IO;002with

Ada.Integer_Text_IO;useAda.Integer_Text_IO;003procedureputwageis

004typeAgeisrange1..100;005typeWageisrange1..100;

006Bill_Age:Age:=56;007Bill_Wage:Wage:=56;008begin009Put

("Totalwageis");010Put(Bill_Wage*Bill_Age);oilNew_Line;012end

putwage;[001H002]:使用軟件包Ada.Text_IO,Ada.Integer_Text_IO;兩個軟件

包分別處理字符類輸出和整數(shù)輸出。[003][oo8][012]定義一個過程putwageo

[OO4]-[OO5]:定義新的數(shù)據(jù)類型Age,Wage,它們?nèi)≈捣秶紴?..100?[006]-

[007]:聲明兩個變量BiH_Age,Bin_Wage,類型分別為Age和Wage,并賦予相同初

始值56。[009H01U:依次輸出字符串"Totalwageis",整數(shù)Bill_Wage和Bill_Age

的乘積,和??個新行符(EOL)。以上程序看上去毫無問題,但根本無法編譯通過。

首先,沒有定義類型Age和wage的*操作,因此Bill_Age和Bill_Wage無法相

乘;第二,兩者數(shù)據(jù)類型不同,即使定義了*操作,還是無法相乘。當然也可使用

后面提到的類型轉(zhuǎn)換,如果將[oio]改為Put(Integer(Bill_wage)*

Integer(Bill_Age)),將會輸出所要的3136;但如果改成Put(Integer(Bill_wage*

56)),看上去也行的通,但實際結(jié)果卻不是3136。不同數(shù)據(jù)之間不能進行運算,

要牢牢記住。(Integer是預先定義的?個整型,Integer(Bill_Wage)是將

BilLWage強制轉(zhuǎn)換為整型)。2.3.2派生類型大家可能會發(fā)現(xiàn),如果像上面一

樣創(chuàng)建一個截然不同的新類型,還需要定義它的運算符:,使用很不方便。因此,往

往是派生現(xiàn)有的類型,其格式為:typetype_nameisnewold_type{range

range_specification);type_name為新類型的名稱,是一個合法標識符;

rangerange_specification表示該類型的取值范圍,是可選的,沒有的話表示

新類型type_name的取值范圍和old_type一樣。如將上例改為:000—

filename:putwage.adb001withAda.Text_IO;useAda.Text_IO;002with

Ada.Integer_Text_IO;useAda.Integer_Text_IO;003procedureputwageis

004typeAgeisnewIntegerrange1..100;005typewageisnewInteger;

006Bill_Age:Age:=56;007Bill_Wage:Wage:=56;008begin009Put

("Totalwageis");010Put(Bill_Wage*Bill_Age);oilNew_Line;012end

putwage;上例還是不能編譯通過,因為派生類型只繼承母類型的屬性,如運算

符,不同的派生類型即使母類型相同也還是屬于不相同的類型。但將[10]改為Put

(Integer(Bill_wage*56))則能輸出正確的結(jié)果。但是派生類型使用還是麻煩了一

點,不同類型之間即使都是數(shù)字類型也無法混合使用,只是自己不用創(chuàng)建運算符省

力了點。2.3.3創(chuàng)建子類型創(chuàng)建新類型和派生類型的麻煩從上文就可以感受的

到,特別是在科學計算這些有很多種小類型的軟件當中,上述兩種方法實在過于繁

雜。這時子類型(subtype)就相當有用,子類型的定義格式為:subtype

type_nameisold_type{rangerange_specification};type_name為新類

型的名稱,是一個合法標識符;rangerange_specification表示該類型的取值

范圍,是可選的,沒有的話表示新類型type_name的取值范圍和old_type—■

樣。再將先前的例子改一下:000—putwage.adb001withAda.Text_IO;use

Ada.Text_IO;002withAda.Integer_Text_IO;useAda.Integer_Text_IO;

003procedureputwageis004subtypeAgeisIntegerrange1..100;

005subtypeWageisInteger;006Bill_Age:Age:=56;007Bill_Wage:

Wage:=56;008begin009Put("Totalwageis");010Put(Bill_Wage*

Bill_Age);oilNew_Line;012endputwage;編譯通過,輸出值為3136。子類型

不僅繼承母類型的屬性,而且和母類型、其它同母類型的子類型可混合使用。在

前面的例子中的,我們都提到了取值范圍,這也是Ada的一項“特色”:Ada不同于

C和Pascal-賦給一個變量超過其取值范圍的值或進行不合法運算,會輸出錯誤的

值而不報錯,與此相反,Ada程序在編譯時會提示錯誤,或在運行Ada程序時產(chǎn)

生Constraint_Error異常(異常和C中的信號Signal差不多,詳見第9章異常

(Exception)),掛起程序,來減少程序的調(diào)試時間。2.4標量類型(Scalar

Type)大部份語言,基本的數(shù)據(jù)類型如果按照該類型所表示的數(shù)據(jù)類型來分,.

般來說可分為整型(integer),實型(real),布爾型(boolean),字符型(character)這

四類,并以它們?yōu)榛A(chǔ)構(gòu)成了數(shù)組,記錄等其它更復雜的數(shù)據(jù)類型。在程序包

Standard中預定義了一些簡單數(shù)據(jù)類型,例如Integer,Long_Integer?Float,

Long_Float,Boolean,Character,Wide_Character,以及這些數(shù)據(jù)類型的運算

符。下面我們除了學習上述的4種標量類型(ScalarType)外,還要學習一下枚

舉類型(Enumration)。由于Ada中布爾型和字符型都是由枚舉類型實現(xiàn)的,因此

也可將這兩種類型認為是枚舉類型。2.4.1整型(Integer)Integer整型一個整型

數(shù)據(jù)能存放--個整數(shù)。預定義的整型有Integer,Short_Integer,

Short_Short_Integer,Long_Integer,Long_Long」nteger還有Integer的j類

型Positive,NaturaloRM95沒有規(guī)定Integer及其它整型的具體取值范圍及其位

數(shù),由編譯器決定。只規(guī)定了沒多大意思的最小取值范圍,如要求一個Integer至

少要為16位數(shù),最小取值范圍為-32767“32767(-2**15+1.-2**15-1)?因此還有

Integer_8,Integer_i6,Integer_32,Integer_64這些指定了位數(shù)的整型,以方便用

戶。在RM95里,也就是編譯器實現(xiàn)里,以上類型聲明格式為:typeIntegeris

rangeimplementation_defined(Long_Integer它們也一樣)subtype

PositiveisIntegerrangei.Jnteger'Last;subtypeNaturalisIntegerrange

O.Jnteger'Last;(Integer'Last表示Integer的最后一個值,即上限,見2.5數(shù)據(jù)類

型屬性)程序System里定義了整數(shù)的取值范圍:Min」nt:constant:=

Long_Long_Integer'First;Max_Int:constant:=Long_Long」nteger'Last;

Modular整型還有…類整型是Modular,異于上面的整型。如果將Integer整型與

C中的signedint相類比,它們的取值范圍可包括負數(shù);那么Modular類型就是

unsignedint,不能包含負數(shù)。其聲明格式為:typetyep_nameismod

range_specification;其中的range_specification應為一個正

數(shù);type_name的取值范圍為(O..range_specification-1)?如下面類型

Byte:typeByteismod256;這里Byte的取值范圍為o..255。Modular類型在

程序包System也有常量限制,range_specification如是2的幕則不能大于

Max_Binary_Modulus,如不是嘉的形式則不能大于

Max_Nonbinary_ModuluSo這兩個常量的聲明一般如下:

Max_Binary_Modulus:constant:=2**Long_Long_Integer'Size;

Max_Nonbinary_Modulus:constant:=Integer'Last;細心的讀者可能會發(fā)現(xiàn)上

面兩個常量的值實際上是不一樣的,也就是說Modular類型實際上有兩個不同的

限制。RM95關(guān)于這點的解釋是,2進制兼容機上,Max_Nonbinary_Modulus的

值大于Max_int很難實現(xiàn)。2.4.2實型(Real)相對于整型表示整數(shù),實型則表示

浮點數(shù)。實型分為兩大類:浮點類型(floatingpoint)和定點類型(fixedpoint)0它

們之間的區(qū)別在于浮點類型有一個相對誤差;定點類型則有一個界定誤差,該誤差

的絕對值稱為delta。下面就分類介紹這兩類數(shù)據(jù)類型。浮點類型(Floating

Type)浮點類型預定義的有Float,Short_Float,Short_Short_Float,

Long_Float,Long_Long_Float等,它們的聲明格式入下:typetype_nameis

digitsnumber[rangerange_specification];digitsnumber表示這個浮點

類型精度,即取number位有效數(shù)字,因此number要大于0;range

range_specification是可選的,表示該類型的取值范圍。下面是幾個例子:

typeRealisdigits8;typeMassisdigits7range0.0..1.0E35;subtype

ProbabilityisRealrange0.0..1.0;Real表示精度為8位的符點數(shù)類型,它的取

值范圍由于沒給定,實際上由編譯器來決定;RM95里關(guān)于這種情況是給出了安

全范圍(saferange),取值范圍是-IO.O**(4*D)..+IO.O**(4*D),D表示精度,此例中

為8,所以Real的安全取值范圍一?般來說應為-10.0E32..+10.0E32。Mass是表示

精度為7位的符點型,取值范圍為00-1.0E35;Probability是Real的『類型,精

度也是8位,取值范圍0.0..1.0;程序包System定義了精度的兩個上限:

Max_Base_Digits和Max_Digits,一般來說應為Max_Base_Digits:constant:=

Long_Long_Floafdigits;(BPLong_Long_Float的精度)

Max_Digits:conslant:=Long_Long_Float,digits;當range_specification指

定時,所定義類型的精度不能大于Max_Base_Digits;當range_specification

沒有指定時,所定義類型的精度不能大于Max_Digits。定點類型定點類型主要是

多了一個delta,它表示該浮點類型的絕對誤差。比方說美元精確到0.01元(美

分),則表示美元的數(shù)據(jù)類型Dollar的delta為0.01,不像浮點型是近似到

O.Olo定點型的聲明格式有兩種:普通定點型:typetype_nameisdelta

delta_number_rangerange_specification;十進制定點型:type

type_nameisdeltadelta_numberdigitsdigit_number

[rangerange_specification];除deltadelta_number外,各部份意義與浮

點型相同。定點型中有一個small的概念。定點數(shù)由一個數(shù)字的整數(shù)倍組成,這個

數(shù)字就稱為該定點數(shù)類型的small。如果是普通定點型,則small的值可以被用戶

指定(見下節(jié)數(shù)據(jù)類型屬性),但不能大于該類型的delat;如果沒有指定,small

值由具體實現(xiàn)決定,但不能大于delta。如果是十進制定點型,則small值為

delta,delta應為10的幕,如果指定了該定點型的取值范圍,則范圍應在-

(io**digits-i)*delta..+(io**digits-i)*delta之間。看一下下例:typeVoltis

delta0.125range0.0..255.0;typeFractionisdeltaSystem.Fine_Deltarange

-1.0..1.0;typeMoneyisdelta0.01digits15;subtypeSalaryisMoneydigits

10;2.4.3布爾型(Boolean)邏輯運算通常需要表示“是”和“非”這兩個值,這時就

需要使用布爾型。Ada中的布爾型與Pascal中的類似,是True和False兩個值。

布爾型屬于枚舉數(shù)據(jù)類型,它在程序包Standard中定義如下:typeBooleanis

(True,False);習慣于C語言的朋友在這里需要注意一下,Boolean的兩個值

True,False和整型沒有什么關(guān)系,而不是C語言中往往將True定義為值1,False

為2。2.4.4字符型(Character)Ada83最初只支持7位字符.這條限制在Ada95

制訂前已經(jīng)放松了,但一些老編譯器如MeridianAda還是強制執(zhí)行.這導致在一臺

PC上顯示圖形字符時出現(xiàn)問題;因此,在一般情況下,是使用整型來顯示Ascii127

以后的字符,并使用編譯器廠商提供的特殊函數(shù)。在Ada95里,基本字符集已由原

來的ISO646標準的7位字符變?yōu)镮SO8859標準的8位字符,基于Latin-1并且

提供了256個字符位置。Ada95同樣也支持寬字符ISO10646,有2**16個的字

符位置。因此現(xiàn)代編譯器能很好地處理8位字符和16位字符。7位字符在已經(jīng)廢

棄的程序包Standard.Ascii內(nèi)定義。在程序包Standard內(nèi)預定義的字符型

Character和Wide_Character分別表示Latin-1字符集和寬字符集,類型

Wide_Character已經(jīng)包含了類型Character并以它作為前256個字符。程序包

Ada.Characters.Latin_i和Ada.Characters.Wide_Latin_i提供了Latin-1字符集

的可用名稱,Ada.Characters.Han祖ing則提供一些基本的字符處理函數(shù)。具體內(nèi)

容見第14章字符和字符串處理。從下例可以了解一下字符型:000-filename:

puta.adb001withAda.Text_IO;useAda.Text_IO;002procedureputais

003subtypeSmall_Characteris{'a''d'};004Level:

Small_Character:="a);005begin006Put(l<YoulevelisM);007Put(Level);

008New_Line;009endputa;[003]創(chuàng)建了一""b字符類型Small_Character,包

含a,b,c,d四個字母;如C語言一樣,使用字符時需加[004]聲明變量Level,類

型為SmalLCharacter,值為字母a。上面這個例子主要還是說明一下字符類是怎

樣定義的,但Character和Wide_Chracter實際實現(xiàn)卻不是這么簡單。2.4.5枚

舉類型(Enumeration)有時候我們需要一個變量能表示一組特定值中的一個。如

today這個變量,我們希望它的值是Monday,Tuesday,Wednesday,Thursday,

Friday,Saturday,Sunday其中的一個,這時枚舉類型就相當有用,上述情況中就

可以創(chuàng)建新類型Day,如下:typeDayis(Monday,Tuesday,Wednesday,

Thursday,Friday,Saturday,Sunday);然后聲明變量today的數(shù)據(jù)類型為Day:

today:Day;這樣today就能接受Monday,Tuesday,Wednesday,Thursday,

Friday,Saturday,Sunday這幾個值中的任意一個。前面提及的類型

Character,Wide_Character,Boolean都是枚舉類型,也按照下面給出的格式聲明:

typetype_nameis(elememt_list);element_list需列舉出該類型所有的可

能值。Ada能自動檢測上下文,因此大部份情況下能分辨不同枚舉數(shù)據(jù)類型下的

枚舉元素,如再聲明一個類型Weekend:typeWeekendis(Saturday,Sunday);

或subtypeWeekendisrangeSaturday..Sunday;賦給上例中的變量Today值

為Sunday時,不會產(chǎn)生歧義;但在有些情況下,Ada無法分辨枚舉元素時則會產(chǎn)

生問題,這時就要使用類型限制,詳見2.6類型限制和類型轉(zhuǎn)換Ada中的基本數(shù)

據(jù)類型就講到這里,實際上本節(jié)是基于上一節(jié)內(nèi)容的擴展,說穿了還是創(chuàng)建數(shù)據(jù)類

型。Ada在數(shù)據(jù)類型處理上提供的強大功能在接下的章節(jié)里我們將會接觸的更多,

在這方面Ada的確比其它大部份語言做的好多了,熟悉C.Pascal的朋友大概會感

到相當有意思。2.5數(shù)據(jù)類型屬性(Attributes)數(shù)據(jù)類型屬性,表示某個數(shù)據(jù)類

型的具體特征一取值范圍,最小值,最大值,某數(shù)在該類型中的位置……應該說是

相當有用的--起碼不像C語言,還要翻翻系統(tǒng)手冊才能知道某個數(shù)據(jù)類型的具體

定義。這些屬性的用法和調(diào)用函數(shù)一樣,也可以認為它們就是預定義的函數(shù)一雖

然不怎么準確,關(guān)于函數(shù),詳見第6章子程序;有些返回值為通用類型

(universaltype)和字符串型。數(shù)據(jù)類型的屬性既可以使用預先定義的操作,也

可以自己定義數(shù)據(jù)類型的屬性,如S'First是返回S類型的下限,如果用戶不滿

意默認的屬性,也可自己指定S'First(雖然沒必要),如:forS'Firstuse

My_Version_First;My_Version_First是用戶自己的函數(shù),以后當使用S'First

時,實際上調(diào)用My_Version_First;有些數(shù)據(jù)屬性也可以直接用數(shù)字標示,如:

forS'Firstuse0;這樣,S,First的值就成了0。在很多地方,如內(nèi)存管理中,這

種用法還是比較普遍的。下面簡單地列出標量類型的屬性,S表示某個標量類型:

2.5.1通用標量類型屬性S'First返回S類型的下限,返回值為S型。S'Last返回

S類型的上限,返回值為S型。S'Range返回S類型的取值范圍,即S'First..

S'Last。S'Base表示S類型的一個子類型,但沒有范圍限制(單純從取值范圍角

度講,“兒子”反而比“父母”大),稱之為基類型(basetype)oS'Min函數(shù)定義

為:function(Left,Right:S'Base)returnS'Base。比較Left和Right的大小,

返回較小值。如:Integer'Min(1,2)=1。S'Max函數(shù)定義為:function

(Left,Right:S*Base)returnS'Base?比較Left和Right的大小,返回較大值。

如:Integer'Max(1,2)=2。S'Succ函數(shù)定義為:functionS'Succ

(Arg:S5Base)returnS'Baseo返回Arg的后趨。S'Pred函數(shù)定義為:function

S'Pred(Arg:S'Base)returnS'Base。返回Arg的前趨。S'Wide_Image函數(shù)定

義為:functionS'WideJmage(Arg:S'Base)returnWide_String?返回Arg

的“像”,即可顯示的字符串,這里返回寬字符串型Wide_String。如:

Float'Wide_Image(9.00)="9?00”。詳見第三章數(shù)組。S'lmage與

S'Wide」mage一樣,但返回字符串型String。SWide_Width表示

S'Wide_Image返回的字符串的最大長度,返回值為universal_integer。

SWidth表示Slmage返回的字符串的最大長度,返回值

為universal.integer。S'Wide_Vahie函數(shù)定義為:functionSJWide_Value

(Arg:Wide_String)returnS'Base。是S'Wide_Image的逆過程,返回與

“像”Arg相對應的S類型的值。如:Float5Wide_Value(“9.00〃)=9。。。

SValue與SVahie一樣,但參數(shù)Arg是String類型。252通用離散類型屬性

離散類型包括整型和枚舉型,除了上述的屬性外,還有:S'Pos函數(shù)定義

functionS'Pos(Arg:S'Base)returnuniversal_integero返回Arg在S

類型中的位置。S'Val函數(shù)定義為:functionS'Pos(Arg:S'Base)return

S'Base。返回在S類型中位置為Arg的值。例如:typeColoris(red,white,

blue);ColorTos(White)=2Color'Val⑴二red2.5.3浮點類型屬性S'Digits返

回S類型的精度,為universal_integer類型。2.5.4定點類型屬性

S'Small返回S類型的small值,返回值為實型。S'Delta返回S類型的

delata,返回值為實型。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論