军用 Ada 语言.docx

上传人:b****6 文档编号:7308607 上传时间:2023-01-22 格式:DOCX 页数:118 大小:113KB
下载 相关 举报
军用 Ada 语言.docx_第1页
第1页 / 共118页
军用 Ada 语言.docx_第2页
第2页 / 共118页
军用 Ada 语言.docx_第3页
第3页 / 共118页
军用 Ada 语言.docx_第4页
第4页 / 共118页
军用 Ada 语言.docx_第5页
第5页 / 共118页
点击查看更多>>
下载资源
资源描述

军用 Ada 语言.docx

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

军用 Ada 语言.docx

军用Ada语言

军用Ada语言

第1章Ada简介

1.1概述(Overview)

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

它提供了一系列功能来定义相关的数据类型(type)、对象(object)和操作(operation)的程序包(package)。

程序包可以被参数化,数据类型可以被扩展以支持可重用库的构建。

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

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

Ada包含了很复杂的功能以支持实时(real-time),并发程序设计(concurrentprogramming)。

错误可以作为异常(exception)来标示,并可以被明确地处理。

Ada也覆盖了系统编程(systemprogramming);这需要对数据表示和系统特性访问的精确控制。

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

——译自《AdaReferenceManual》Section1:

General

在本章里,我们将会初步介绍一下Ada,以给读者留下大致的印象。

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的优点。

更高的安全性、可靠性。

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

更高的移植性。

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

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

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

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

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

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

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

……

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

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

1.4网络资源(InternetResources)

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

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

PublicAdaLibrary(PAL)。

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

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

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

SIGAda,是ACM的一个SpecialInterestGroup。

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

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

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

1.5第一个程序(TheFirstProgram)

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

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

"的简例。

000--filename:

hello.adb;001withAda.Text_IO;

002procedureHellois003begin

004Ada.Text_IO.Put("HelloWorld!

");

005Ada.Text_IO.New_Line;006endHello;

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

每行代码前的000,001等数字表示该代码是第几行,只为了讲解方便,在实际源代码中是不存在的;with,procedure等保留字(reservedword)都用粗体表示,以示区别;有些字是用斜体表示,表示该字是用其它有效字符替换。

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

[000]标示该程序文件名为hello.adb,在程序中并不需要;--是注释符,表示从其所在位置至行尾都是注释,对程序没有什么影响,与C的/**/类似。

[001]Ada.Text_IO是预定义的一个程序包(package);withpackage_name和C的include功能差不多。

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

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

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

procedureprocedure_nameisstatements1;beginstatements2;endprocedure_name;statement1可以是变量、常量、函数、过程等的声明;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_IO;useAda.Text_IO;

002procedureHellois

003begin

004Put("HelloWorld!

");

005New_Line;

006endHello;

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

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

000--filename:

hello.adb001withAda.Text_IO;useAda.Text_IO;002procedureHellois003Str:

String:

="HelloWorld!

";004begin005Put(Str);006New_Line;007endHello;在is和begin之间,声明了一个字符串变量Str,它的初始值为"HelloWorld"。

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

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

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

一个Ada程序是由一个或多个程序单元组成(programunit)。

一个程序单元可以为:

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

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

程序包(package),定义一些实体(entity)。

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

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

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

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

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

程序单元又可为两部份:

声明部份(declaration)。

定义对其它程序的接口,有些可用资源可以被用户使用,与C下的'.h'文件相似。

主体部份(body)。

是声明部份的具体实现,等价与C的'.c'文件。

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

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

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

2.1概述(Overview)

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

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

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

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

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

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

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

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

2.2词法元素(LexicalElement)

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

2.2.1基本字符集(CharacterSet)

Ada95规定的标准字符集是Latin-1,支持8位(基于ISO-8869)和16位(基于ISO-10646)字符,在非标准模式下也可用本地字符集,具体情况取决于当前的系统。

(一般来说,涉及字符时默认是指Latin-1,程序几乎都是用Latin-1字符集写的)

字符在RM95中是分成了三类:

图形字符(graphiccharacter)、格式控制符(formateffector)、其它控制符(othercontrolfunction),它们所表示的范围为:

图形字符包括字母(letter)、数字(digit)、空格符(space)、特殊字符(specialcharacter)(例如"#&'()*+,-./:

;<=>_|{}[]);

格式控制符包括水平制表符(HT)、垂直制表符(VT)、回车(CR)、换行(LF)、换页(FF);

其它控制符则是除了格式控制符以外的控制符。

更详细的内容参见RM95、ISO8869,ISO10646。

Ada是大小写忽略的(除了字符和字符串中的实际内容,如字符'z'和'Z'不相同,但标识符z和Z相同),但为了可读性,一般来说变量名或函数名首字母都会大写,其余小写,缩近格式也需要引起注意。

根据实际情况尽量保证可读性。

为了兼容性,Ada95要求编译器最少支持一行字符串和一个词法元素的长度为200个字符(不包括行尾符)。

Ada在字符集上并没有很严格要求编译器一定要怎样,但应该支持标准字符集。

2.2.2标识符(Identifier)

Ada中不管是变量、函数还是其它对象都需要一个名称,这就叫做标识符。

如X、Count、me就是简单的标识符。

Ada中的标识符有以下一些注意点:

1.标识符一定要是字母开头,接下去可以是数字和下划线,结尾不能为下划线。

如Fig_、_Lik、1me是不合法的。

2.两个连续的下划线不能在一起,因为有些打印机可能会将两个下划线当作一个处理。

3.虽然单个字符可作为标识符,但一般情况下不应该滥用这项特性(我不知道这除了少敲几个字外,还有什么意义,想想数字0和字母O、数字1和字母l吧,绝对害死人的做法)。

4.不能将保留字作为标识符。

在Ada83中,标识符包括了保留字,但在Ada95中保留字从标识符中分离了出来。

5..如上节所提及的,标识符是不分大小写的,但为了可读性,请注意你对标识符的命名。

2.2.3保留字(ReservedWord)

保留字在程序语法中有特殊的含义,不属于标识符范围,这与C和Pascal等语言的定义有所不同。

Ada95中的保留字如下:

abortabsabstractacceptaccessaliasedallandarrayatbeginbody

caseconstantdeclaredelaydeltadigitsdoelseelsifendentryexceptionexit

forfunctiongenericgotoifinislimitedloopmodnewnotnulloforothersout

packagepragmaprivateprocedureprotectedraiserangerecordremrenamesrequeue

returnreverseselectseparatesubtypetaggedtaskterminatethentype

untilusewhenwhilewithxor

在以后的内容中,我们会逐个解释它们的含义及作用。

Ada95的保留字比原先添加了6个:

abstract,aliased,protected,requeue,tagged和until,虽然这可能会牵连到兼容性问题,但通常也无须计较这点。

2.2.4分隔符(SeparatorandDelimiter)

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

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

&'()*+,-./:

"<=>|或是复合型的:

=>..**:

=/=>=<=<<>><>。

当分隔符作为注释、字符串、字符、数值的一部分时,就不再是分隔符了。

2.2.5数值文字(NumericLiteral)

数值文字就是指数字。

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

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

如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中pragma。

我们先接触List,Page,Optimize这3个pragma。

更多内容我们会在以后接触。

pragmaList(identifier);

pragmaPage;

pragmaOptimize(identifier);

pragmaList将identifierOn或Off作为它的参数。

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

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

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

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

  下面是简单的例子:

pragma

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

当前位置:首页 > 小学教育 > 语文

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

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