《Ada程序设计语言》word版.docx

上传人:b****7 文档编号:9061205 上传时间:2023-02-03 格式:DOCX 页数:185 大小:183.17KB
下载 相关 举报
《Ada程序设计语言》word版.docx_第1页
第1页 / 共185页
《Ada程序设计语言》word版.docx_第2页
第2页 / 共185页
《Ada程序设计语言》word版.docx_第3页
第3页 / 共185页
《Ada程序设计语言》word版.docx_第4页
第4页 / 共185页
《Ada程序设计语言》word版.docx_第5页
第5页 / 共185页
点击查看更多>>
下载资源
资源描述

《Ada程序设计语言》word版.docx

《《Ada程序设计语言》word版.docx》由会员分享,可在线阅读,更多相关《《Ada程序设计语言》word版.docx(185页珍藏版)》请在冰豆网上搜索。

《Ada程序设计语言》word版.docx

《Ada程序设计语言》word版

Ada程序igtH吾言(TheAdaProgrammingLanguage)

版权(Copyright)

《Ada程序设讣语言》的版权隶属于网站VenusIC,允许任何用户翻阅、传播、批评等等,只要读者想的岀的行为,都可以作用于本教材。

唯一一条禁令则是:

不允许恶劣地直接抄录本教材,并冠以他人名字为作者(这种人肯泄不得好死)。

版权宣言结束。

前言(Preface)

经过几个星期的努力,《Ada语言程序设汁》终于有了基本框架,为了及早听取读者的意见和促进Ada的推广,在未最终完稿前,笔者将它搬上了VenusIC网站。

在此,我想提一下写作动机。

大约是在去年,我才始接触Ada语言,当时可以说“一见钟情”,心情激动的很,当场被Ada所吸引。

按照惯例,是需要在网络上找点Ada的资料,但不幸的是,国内好像对此很冷淡,没有什么网站,当时只找到一个在上的'wangcity个人主页,但没有多少资料,而且现在都已经关闭了。

当时就有想法,自己也办一个Ada网站,促进Ada在国内的推广,可惜自己功力太浅(现在也不怎么样),而且当时感觉自己过于才疏学注,将大力花在了英语、社会科学上,于是《经济学》、《曾国藩家书》、

《剑桥中国史》等书的地位就相当高,而自己又是倒篷透顶的重点中学学生,时间上也很不够。

直至今年初,越来越感觉国内学术风气之糟糕,一味跟着当前市场需求泄,不管长远利益:

在淸华图书馆检索时,发现Ada的书都是以前的古董了,至此才决左硬着头皮写一份中文教材。

由于自己也没有什么经验可言,一路上是摸着路边的石头过河,也屡次想放弃,幸运的是,大致的框架是在今天完成了。

接下来的工作,大概就是扩充已知的未添加的内容,同时听取读者反馈,对原有内容做做修改。

由于自己才不过是高二学生而已,水平、经验方而都很不足,因此希望读到本教材的朋友能多提意见,多抓错误(可不是什么客套话,的确很需要别人的意见),在此就先谢过了。

同时也希望能有志于推广Ada在中国的使用的朋友能与我一起交个朋友,否则一个人孤单单的实在乏味。

*本教材适宜对C、C++或其它语言以及操作系统有所了解的读者。

*在内容分布上,第1章-第13章主要集中在语法部份,第14章以后的内容主要集中在预定义程序包上,基于AdaReferenceManual,读者可自行跳过一些章节,无须按部就班或直接参看RM。

王振铭

2001年5月12日

第1章Ada简介

•1.1概述(Overview)

•1.2Ada的历史(TheHistoryofAda)

•1.3与C和C++的比较(Contrast:

AdaandC,C++)

•1.4网络资源(InternetResources)

•1.5第一个程序仃heFirstProgram)

第1章Ada简介

1.1概述(Overview)

Ada语言最初设计是为了构建长周期的、髙度可靠的软件系统。

它提供了一系列功能来泄义相关的数据类型(type)、对象(object)和操作(operation)的程序包(package)»程序包可以被参数化,数拯类型可以被扩展以支持可重用库的构建。

操作既可以使用方便的顺序控制结构,通过子程序(subprogram)来实现,也可以通过包含并发线程同步控制的入口(entry)来实现。

Ada也支持单独编译(separatecompilation),在物理层上支持模块性。

Ada包含了很复杂的功能以支持实时(real-time),并发程序设计(concurrentprogramming)0错误可以作为异常(exception)来标示,并可以被明确地处理。

Ada也覆盖了系统编程(systemprogramming):

这需要对数据表示和系统特性访问的精确控制。

最后,提供了预定义的标准程序包,包括输入输出、字符串处理、数值汁算的基本函数和随机数生成。

译自《AdaReferenceManua1》Sectionl:

General

1.2Ada的历史(TheHistoryofAda)

为了更好的理解Ada,它的历史有必要简要地了解一下。

1974年时,美国国防部(DoD)意识到开发和维护嵌入式系统(固化在硬件中的系统,如导弹弹导系统)耗费了过多的时间,精力和资金。

当时,在使用的计算机语言有450多种,这增加了开发新系统以及培训程序员使熟悉现有系统的时间和成本。

维护工作也由于没有标准化的工具(编借器,编译器等)而受阻。

所有这些因素使DoD意识到它需要一门强大的语言,能被所有嵌入式电脑供应商使用。

开发工作始于1975年,当时DoD列举了一系列的语言需求:

但没有一门现有语言指定了这些特性,因此在1977年,DoD起草了一份建议,开发一门新的语言。

不像COBOL这些语言由专门的委员会制左,新语言是一场竞争的主题,在产业界和学术界的评估中产生。

在众多竞争者当中,有4家被选中以完成进一步的工作。

最终只剩下Cii-HoneywellBull公司。

这门语言被命名为Ada。

设计小组由JeanIchbiah领导,对语言全权负责。

在1983,Ada成为了一个ANSI标准ANSI/MIL-STD-1815A。

此年成为一个ISO标准。

在参考手册中左义的语言通常称为LRM或ARM(AdaReferenceManual)«在Ada的相关书籍和编译器的报错信息中经常出现手册内容的引用。

对于任何Ada站点,参考手册都是推荐的:

虽然很难阅读,但它是所有Ada问题的最权威解释(一个小组正在澄淸语言立义中已发现的语义不淸的内容)。

Ada也经过了一次修正,即1995的新的ISO标准。

新标准修正了Ada83的很多缺陷,并进一步扩展了它的功能(在修正工作中,有个临时的标准,即Ada9x,不少Ada文章是在这段时间写的,因此有些内容在细节上可能与Ada95有所区別,但主要原理差不多)。

为了防止Ada编译器的不兼容版本的扩散,AdaJointProgramOffice(控制Ada语言的执彳亍部门,于1998年10月1日关闭,见AdaJointProgramOfficeclosed)采取了不寻常的做法-他们注册Ada商标。

除非通过他们的兼容性测试,编译器厂商不允许出售'Ada'编译器。

这在不久以后放松了,保护协议变成了'ValidatedAda'。

因而产生的Ada确认证书被限制在一定的时间内并有一个期满时间。

当时间过期后,该编译器不能再被标记为'ValidatedAda编译器。

通过这种方式,AJPO确保当前市场上的编译器与当前标准相一致。

目标是使所有的Ada程序能在所有系统上被编译-在这点上,AJPO比英它语言小组做得好。

上述内容基本上是从QuickAda翻译过来的(以前翻译该教材“半途而废”的残留品,直接引用一下了),Ada语言的详细历史细节见TheHistoryofAda。

1.3与C和C++的比较(Contrast:

AdaandC,C++)

由于Ada出生年月迟了一点,而且目前的操作系统基本上由C,C++写成,导致Ada在“平民层”的推广比较糟糕,至今还不是很流行,WhyAdaisn'tPopular—文对此有比较详细的解释。

而Ada爱好者们为了显示Ada的优越性(这种心情相当能理解),将Ada与C,C++做了一系列比较,英结果反正综和指数都是Ada高,这方而文章有不少,如ComparingDevelopmentCostsofCandAda>Contrasts:

Ada95&C++。

在这里,我们只初略地了解一下Ada的优势即可,在读者朋友接下去的学习中,应该是能从心里感受到Ada的优点。

1.更髙的安全性、可靠性oAda中对于访问内存、数值讣算等很多方而有一些严格的规立.而没有C和C++那么自由;程序的错误绝大部份能在编译和运行时检测到,以至于可以不需要编译器,另外,语言也包含异常特性,能方便地处理错误。

2.更髙的移植性。

在Unix和Windows下有C编程经验的朋友应该对于兼容性深有体会,很多代码纯粹是为了适应不同的系统增添的,对于实际工作没多大用处。

但Ada的初始语言环境中就有了异常(约等于Unix下的Signal).任务(线程)、分布式计算、随机数产生、宽字符集很多特性的支持,而在现在的具体操作系统中,这些特性往往随系统而异。

即使Ada95里缺少一些功能,也可以通过额外标准和函数库来弥补:

GDI库,可以用GtkAda,在Windows和X卜•通用:

Ada也有一个Posix接口的标准,可以使用函数库Florist来调用Posix的函数……用戸层是大大省力-一只要自己的操作系统上有所需的编译器和函数库即可。

3.语法明确,基本上没有令人混淆的地方。

Ada程序的源代码远远比C或C++的代码易懂。

看程序的人是减轻了不少脑负担。

4.……

5.……

总乙C和C++能做的Ada肯左能做,但Ada要省时方便的多。

读者在学习Ada之后,无需多说也就明白了,笔者在初学Ada时就有耳目一新的感觉,唯一的遗憾是Ada不流行。

1.4网络资源(InternetResources)

Ada虽然在国内不流行,但在国外还是有不少网站,下面是只列举一小部份,至于更多的资源,读者可至VenusIC查找:

1.HomeoftheBraveAdaProgrammers(HBAP),即AdaHome,由MagnusKempe维护,里面包含了不少Ada相关的文档、软件

2.PublicAdaLibrary(PAL)。

PAL是Ada软件、文档的图书馆。

主站点在wu8rchive.wustl.edu(WUARCHIVE),以及法国的一个映像站点mirrorsite,PAL目前由RichardConn维护。

3.AdalC,由AJPO发起的一个站点,也包含了不少相关信息。

4.SIGAda,是ACM的一个SpecialInterestGroup«

5.AdaPower,很不错的一个站点,有相关教材、文档、Faq、Linux等链接。

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

7.新闻组comp.lang,ada,不用多介绍了。

1.5第一个程序(TheFirstProgram)

为了了解Ada程序的大致结构,举一个例子是难免的。

大部份书籍一般都是用"helloworld"程序来开始,我们下而就见识一个在终端屏幕上输出"Hell。

World!

"的简例。

000--filename:

hello.adb:

001withAda.Text_I0;

002procedureHellois

003begin

004Ada.Text.IO.PutCHelloWorld!

");

005Ada.Text_I0.New_Line;

006endHello;

先介绍一下在本教材中代码的一些问题:

每行代码前的000,001等数字表示该代码是第几行,只为了讲解方便,在实际源代码中是不存在的;With,procedure等保留字(reservedword)都用粗体表示,以示区别:

有些字是用斜体表示,表示该字是用其它有效字符替换。

现在让我们分析上述的简单程序:

[000]标示该程序文件名为hello,adb,在程序中并不需要:

一是注释符,表示从其所在位置至行尾都是注释,对程序没有什么影响,与C的/**/类似。

[0011Ada.Text_I0是预定义的一个程序包(package):

withpackage_name和C的include功能差不多。

[002]-[006]是程序的主体部份。

与C下的main函数类似,Ada也需要一个主过程(mainprocedure),在这个例子中是过程Hello。

过程的用法和上例一样,都是

procedureprocedure_nameis

statementsl;

begin

statements2;

endprocedure_name;

statementl可以是变量、常量、函数、过程等的声明:

statements2是过程procedure_name要执行的语句,对象的声明不能在这部份;end后的procedure.name不是必需的,但为了程序的可读性,应加上。

[003],[004]分别输岀"HelloWorld!

"和新行符。

Put和New.Line都是Ada.Text.IO里的过程。

但上7例调用过程Put和New.Line的方法比较罗嗦,因此我们也可以使用use语句:

000一一filename:

hello.adb:

001withAda.Text_I0;useAda.Text_I0;

002procedureHellois

003begin

004PutCHelloWorld!

");

005New_Line;

006endHello;

这样Ada编译器就能在程序包Ada.Text_I0中自动搜寻Put,New_Line,而无需用户指左它们所在的准确位置。

我们在将上例略微改动以下,以使读者了解一下声明部份:

000--filename:

hello.adb

001withAda・Text_I0;useAda・Text_I0;

002procedureHellois

003Str:

String:

二"HelloWorld!

";

004begin

005Put(Str);

006New.Line;

007endHello;

在is和begin之间,声明了一个字符串变量Str,它的初始值为"HelloWorld"。

String是预定义的字符串类型。

上述的声明方式和Pascal差不多。

现在我们对Ada程序长的什么样已有了基本的认识,下而需要了解几个术语。

一个Ada程序是由一个或多个程序单元组成(programunit)»一个程序单元可以为:

1.子程序(subprogram),义一些可执行运算。

过程(procedure)和函数(function)都是子程序。

2.程序包(package),泄义一些实体(entity)。

程序包是Ada中的主要分组机制,类似于C的函数库,Modula的"module"。

3.任务单元(taskunit),与线程类似,定义一些计算,然后并发执行。

4.保护单元(protectedunit),在并发计算中协调数据共享,这在Ada83中不存在。

5.类属单元(genericunit),帮助构建可重用组建,和C++的模板类似。

后3类属于高级话题,在后而的章节中我们会依次介绍。

程序单元又可为两部份:

1.声明部份(declaration)o左义对其它程序的接口,有些可用资源可以被用户使用,与C下的'.h'文件相似。

2.主体部份(body)o是声明部份的具体实现,等价与C的'.c'文件。

其中程序包(package)和子程序(subprogram)是用的最广泛的2个程序单元。

大部份Ada程序基于一堆程序包,在以一个主过程(mainproceudre)来开始Ada程序。

第二章基本元素与特性

•2.1概述(Overview)

•2.2词法元素(LexicalElement)

•2.3创建数据类型和子类型(CreateTypesandSubtypes)

•2.4标量类型(ScaleTypes)

•2.5数据类型属性(Attributes)

•2.6类型限制和类型转换(TypeQualificationandTypeConversion)

•2.7表达式和运算符(ExpressionsandOperators)

第2章基本数据类型和表达式(BasicTypesandExpressions)

2.1槪述(Overview)

数据类型是一门计算机语言最基本的特性,表示一个对象的类型,是数字、字符或其它类型。

由于Ada在数据类型上提供的强大处理能力,我们又不能很简单地认为数据类型仅是定义一个对象的类型。

在Ada里,数据类型可以自己创建,它的相关运算符也可以自己立义,同时又有数据类型属性这项特性,具有相当大的灵活性。

学过其它的语言,特别是有C和Pascal背景的朋友初次接触时可能会感到有点新鲜。

创建新类型,是用户自己左义数据类型,包括该类型的需称、取值范用及相关操作;其中又包括了派生类型和创建子类型,即以现有数据类型为母类型创建新类型,继承母类型的一部份属性。

数据类型属性,如同我们玩RPG游戏时的人物属性:

体力值、魔法值一样,是说明该类型固有的属性,包括最小取值范围、最大取值范围等等。

本章将会先介绍词法元素以及创建数据类型的基础性知识,然后是整型(integer).实型(real)、字符型(character)>布尔型(boolean)、枚举类型(enumuration)这几种标量类型,最后则是相关的数据类型属性、类型限制和类型转换、表达式和运算符。

2.2词法元素(LexicalElement)

Ada里的词法元素与其它语言的左义还是有不小差别,下而按照RM95关于词法元素的分类来逐项介绍,包括标识符、保留字.字符、数值文字等及它们的一些规则。

2.2.4分隔符(SeparatorandDelimiter)

Ada程序中,各元素之间需要空格符、格式控制符或EOF隔开。

RM95里将它们作为separator,而delimiter则是指下列特殊字符(中文有点说不淸楚):

&'()*+,-./:

"<二〉或是复合型的:

二>••**:

=/=>=<=«»<>0当分隔符作为注释、字符串、字符、数值的一部分时,就不再是分隔符了。

2.2.5数值文字(NumericLiteral)

数值文字就是指数字。

Ada和Pascal相同,将数字分为实数型(reallitera1)和整数型(integerlitera1)两大类。

实数型是有小数点的数字,整数型则无小数点。

1.2787,0.871,7.0是实数型,而-882,5441,1是整数型。

Ada在数字表示上有一个很好的特性就是可以明确指泄使用何种基数(2进制到16进制)表示,下而是数字的表示:

十进制数(DecimalLiteral)

不管是实型还是整型数,都可以在英间加上下划线,使长数字更加易读。

如56886515645125615,可写为56_886_515_645_125_615或5_6886_5156_4512_5615,下划线并不改变数字的值。

但两个下划线不能是连续的,下划线也不可以在数字首部和尾部,如676_66和67_E4都是非法的。

字母E作为数字的指数,同时适用于实型和整型。

如123_98E4、5.087E-5.4.8E7都是

合法的,但负指数不能用于整型,指数也一定要是整数。

E大小写皆可以。

基型数字(BasedLiteral)

在大部分语言中,都使用10进制数字表示;Ada里整数可以不用10进制的表示方法书写,而是直接使用2至16进制的表示法,格式为:

Base#Number#,Base表示所采用的进制,Number为该进制下所表示的数字。

2#1001_1001#,表示2进制数10011001,中间的下划线可取消,其10进值为153;

10#153#>表示10进制数153,等价与153:

16#90#,表示16进制数90,其10进值为144:

2.2.6字符文字(CharacterLiteral)

字符文字的表示是单个图形字符在单引号''中,如’a'表示小写字母a,'K'表示大写字母K,'''表示一个单引号,’’表示一个空格。

2.2.7字符串文字(StringLiteral)

字符串是双引号("")之间的有序图形字符。

如"WhatIsaid."就是一个字符串。

表示空字符串时直接用如果字符串中有双引号,一个双引号要用两个"来表示。

如"Hesaid,""Iamhungry."””,而"Hesaid,""Iamhungry."或"Hesaid,"Iamhungry.""是不合法的。

至于其它字符,如$%之类可以直接出现在两个双引号间。

与C语言不同,Ada里没有与之相同的转义字符,并且EOL不会算到字符串中。

2.2.8注释(Comment)

注释由两个连字号(hyphen)(-)开始,直到行尾。

可以岀现在程序的任一个地方,不影响程序本身。

例如:

—thecomment;

end;-一processingofLineiscomplete.

2.2.9Pragmas

Pragma是编译指示(compiledirective),给编译器指令如优化程序,列表控制等。

它的作用往往不只影响一个编译单元,而是整个程序。

Pragma是些预先定义的指令,如pragmaPage,pragmaList(OFF),编译器也可扩展RM95中pragmac我们先接触List,Page,Optimize这3个pragmao更多内容我们会在以后接触。

pragmaList(identifier);

pragmaPage;

pragmaOptimize(identifier);

pragmaList将identifierOn或Off作为它的参数°它指定编译列表(listingofcompilation)是继续还是停止,直到在同一个编译单元内,一个pragmaList使用了相反的参数。

pragmaPage指泄在pragma后的程序正文在新页开始(如果编译器正在列表)

pragmaOptimize有Time,Space或Off3个参数,它的影响区域直到pragama所在编译单元的底部。

Time和Space指示优化时间还是优化空间,Off则关闭优化。

下而是简单的例子:

pragmaList(Off):

关闭列表生成

pragmaOptimize(Off):

关闭可选的优化

不过,上述3个pragma是影响编译过程用的,基本上用户也用不着,以后涉及的inline.Pure等pragma使用频率倒挺髙。

2.3创建数据类型和子类型(CreatingTypesandSubtypes)

使用变量时,除了以某标识符作为变量的爼称外,还要指左该变量的数据类型。

一个数据类型泄义了变量可接受的值以及所能执行的操作。

比如说,一个数据类型为Age的变疑B订1,Age的取值范围为1..100,并只有+-这两种操作,在这里,对象(object)为名为B订1的变量,它的取值在1..100之间(包括1,100),值的变化只能通过+-这些基本运算符(primitiveoperation)来实现,而无法通过*/等其它运算符。

Ada中的数据类型,包括预龙义类型,都是按照一立的格式在程序包中创建的。

下而就介绍创建数据类型的一些基本内容,更多相关内容会在以后见到。

2.3.1创建新的数据类型

创建一个新类型,需要使用保留字type,is,range。

格式如下:

typet

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1