没有合适的资源?快使用搜索试试~ 我知道了~
军用Ada编程语言介绍
5星 · 超过95%的资源 需积分: 50 49 下载量 44 浏览量
2011-04-10
16:46:29
上传
评论 1
收藏 469KB DOC 举报
温馨提示
试读
64页
Ada是一种表现能力很强的通用程序设计语言,它是美国国防部为克服软件开发危机,耗费巨资,历时近20年研制成功的。它被誉为第四代计算机语言的成功代表。与其他流行的程序设计语言不同,它不仅体现了许多现代软件的开发原理,而且将这些原理付诸实现。因此,Ada语言的使用可大大改善软件系统 的 清晰性, 可靠性, 有效性, 可维护性。 Ada的出现,标志着软件工程成功地进入了国家和国际的规模。在一定意义上说,Ada还刺破了“冯.偌依曼思维模式” (Von Newman Mind-set) 的桎梏,连同Ada的 支持环境(APSE)一起,形成了新一派的所谓 Ada文化。它是迄今为止 最复杂,最完备的软件工具。 Ada语言是 美国国防部指定的 唯一的一种可用于 军用系统开发的语言,我国军方也将Ada做为军内开发标准(GJB 1383《程序设计语言Ada》)。
资源推荐
资源详情
资源评论
军用 Ada 语言
第 1 章 Ada 简介
1.1 概述(Overview)
Ada 语言最初设计是为了构建长周期的、高度可靠的软件系统。它提供了一系列功能来定义相关
的数据类型(type)、对象(object)和操作(operation)的程序包(package)。程序包可以被参数化,数据类
型可以被扩展以支持 可 重 用库的构 建 。 操作既可 以 使 用方便的 顺 序 控制结构 , 通 过子程序
(subprogram)来实现,也可以通过包含并发线程同步控制的入口(entry)来实现。Ada 也支持单独编译
(separate compilation),在物理层上支持模块性。
Ada 包含了很复杂的功能以支持实时(real-time),并发程序设计(concurrent programming)。错误可以
作为异常(exception)来标示,并可以被明确地处理。Ada 也覆盖了系统编程(system programming);这
需要对数据表示和系统特性访问的精确控制。最后,提供了预定义的标准程序包,包括输入输出、
字符串处理、数值计算的基本函数和随机数生成。
——译自《Ada Reference Manual》Section1:General
在本章里,我们将会初步介绍一下 Ada,以给读者留下大致的印象。
1.2 Ada 的历史(The History of Ada)
为了更好的理解 Ada,它的历史有必要简要地了解一下。
1974 年时,美国国防部(DoD)意识到开发和维护嵌入式系统(固化在硬件中的系统,如导弹弹导系
统)耗费了过多的时间,精力和资金。
当时,在使用的计算机语言有 450 多种,这增加了开发新系统以及培训程序员使熟悉现有系统的
时间和成本。维护工作也由于没有标准化的工具(编辑器,编译器等)而受阻。所有这些因素使
DoD 意识到它需要一门强大的语言,能被所有嵌入式电脑供应商使用。
开发工作始于 1975 年,当时 DoD 列举了一系列的语言需求;但没有一门现有语言指定了这些特
性,因此在 1977 年,DoD 起草了一份建议,开发一门新的语言。不像 COBOL 这些语言由专门的委
员会制定,新语言是一场竞争的主题,在产业界和学术界的评估中产生。
在众多竞争者当中,有 4 家被选中以完成进一步的工作。最终只剩下 Cii-Honeywell Bull 公司。这
门语言被命名为 Ada。设计小组由 Jean Ichbiah 领导,对语言全权负责。
在 1983,Ada 成为了一个 ANSI 标准 ANSI/MIL-STD-1815A。此年成为一个 ISO 标准。在参考手
册中定义的语言通常称为 LRM 或 ARM(Ada Reference Manual)。在 Ada 的相关书籍和编译器的报错
信息中经常出现手册内容的引用。对于任何 Ada 站点,参考手册都是推荐的;虽然很难阅读,但它
是所有 Ada 问题的最权威解释(一个小组正在澄清语言定义中已发现的语义不清的内容)。
Ada 也经过了一次修正,即 1995 的新的 ISO 标准。新标准修正了 Ada83 的很多缺陷,并进一步
扩展了它的功能(在修正工作中,有个临时的标准,即 Ada9x,不少 Ada 文章是在 这段时间写的,
因此有些内容在细节上可能与 Ada95 有所区别,但主要原理差不多)。
为了防止 Ada 编译器的不兼容版本的扩散,Ada Joint Program Office (控制 Ada 语言的执行部门,
于 1998 年 10 月 1 日关闭,见 Ada Joint Program Office closed) 采取了不寻常的做法 - 他们注册 Ada
商标。除非通过他们的兼容性测试,编译器厂商不允许出售 'Ada' 编译器。这在不久以后放松了,保
护协议变成了 `Validated Ada'。因而产生的 Ada 确认证书被限制在一定的时间内并有一个期满时间。
当时间过期后,该编译器不能再被标记为`Validated Ada' 编译器。通过这种方式,AJPO 确保当前市
场上的编译器与当前标准相一致。
目标是使所有的 Ada 程序能在所有系统上被编译-在这点上,AJPO 比其它语言小组做得好。
上述内容基本上是从 Quick Ada 翻译过来的(以前翻译该教材“半途而废”的残留品,直接引用一下了),
Ada 语言的详细历史细节见 The History of Ada
1.3 与 C 和 C++ 的比较(Contrast:Ada and C,C++)
由于 Ada 出生年月迟了一点,而且目前的操作系统基本上由 C,C++ 写成,导致 Ada 在“平民层”
1
的推广比较糟糕,至今还不是很流行,Why Ada isn't Popular 一文对此有比较详细的解释。而 Ada 爱
好者们为了显示 Ada 的优越性(这种心情相当能理解),将 Ada 与 C,C++ 做了一系列比较,其结
果 反 正 综 和 指数 都 是 Ada 高 , 这方 面文 章 有 不 少, 如 Comparing Development Costs of C and
Ada,Contrasts: Ada 95 & 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 网络资源(Internet Resources)
Ada 虽然在国内不流行,但在国外还是有不少网站,下面是只列举一小部份,至于更多的资源,
读者可至 VenusIC 查找:
Home of the Brave Ada Programmers (HBAP),即 Ada Home,由 Magnus Kempe 维护,里面包含了不
少 Ada 相关的文档、软件
Public Ada Library (PAL) 。 PAL 是 Ada 软 件 、 文 档 的 图 书 馆 。 主 站 点 在 wuarchive.wustl.edu
(WUARCHIVE), 以及法国的一个映像站点 mirror site,PAL 目前由 Richard Conn 维护。
AdaIC,由 AJPO 发起的一个站点,也包含了不少相关信息 。
SIGAda ,是 ACM 的一个 Special Interest Group。
AdaPower,很不错的一个站点,有相关教材、文档、Faq、Linux 等链接。
Ada Core Technology,Gnat,Glade 等软件的老家。
新闻组 comp.lang.ada ,不用多介绍了
1.5 第一个程序(The First Program)
为了了解 Ada 程序的大致结构,举一个例子是难免的。大部份书籍一般都是用"hello world"程序来
开始,我们下面就见识一个在终端屏幕上输出 "Hello World!"的简例。
000 -- filename:hello.adb;
001 with Ada.Text_IO;
002 procedure Hello is
003 begin
004 Ada.Text_IO.Put ("Hello World!");
005 Ada.Text_IO.New_Line;
006 end Hello;
先介绍一下在本教材中代码的一些问题:每行代码前的 000,001 等数字表示该代码是第几行,
只为了讲解方便,在实际源代码中是不存在的;with,procedure 等保留字(reserved word)都用粗体表
示,以示区别;有些字是用斜体表示,表示该字是用其它有效字符替换。
现在让我们分析上述的简单程序:
[000]标示该程序文件名为 hello.adb,在程序中并不需要;-- 是注释符,表示从其所在位置至行尾都
2
是注释,对程序没有什么影响,与 C 的 /* */类似。
[001] Ada.Text_IO 是预定义的一个程序包(package);with package_name 和 C 的 include 功能差不多。
[002]-[006]是程序的主体部份。与 C 下的 main 函数类似,Ada 也需要一个主过程(main procedure),
在这个例子中是过程 Hello。过程的用法和上例一样,都是
procedure procedure_name is statements1;begin statements2;end procedure_name; statement1 可以
是变量、常量、函数、过程等的声明;statements2 是过程 procedure_name 要执行的语句,对象的声
明不能在这部份;end 后的 procedure_name 不是必需的,但为了程序的可读性,应加上。
[003],[004] 分别输出"Hello World!" 和新行符。Put 和 New_Line 都是 Ada.Text_IO 里的过程。
但上 7 例调用过程 Put 和 New_Line 的方法比较罗嗦,因此我们也可以使用 use 语句:
000 -- filename:hello.adb;
001 with Ada.Text_IO; use Ada.Text_IO;
002 procedure Hello is
003 begin
004 Put ("Hello World!");
005 New_Line;
006 end Hello;
这样 Ada 编译器就能在程序包 Ada.Text_IO 中自动搜寻 Put,New_Line,而无需用户指定它们所
在的准确位置。
我们在将上例略微改动以下,以使读者了解一下声明部份:
000 -- filename:hello.adb001 with Ada.Text_IO; use Ada.Text_IO; 002 procedure Hello is003 Str:String :=
"Hello World!";004 begin005 Put(Str);006 New_Line;007 end Hello; 在 is 和 begin 之间,声明了一
个字符串变量 Str,它的初始值为"Hello World"。String 是预定义的字符串类型。上述的声明方式和
Pascal 差不多。
现在我们对 Ada 程序长的什么样已有了基本的认识,下面需要了解几个术语。一个 Ada 程序是由
一个或多个程序单元组成(program unit)。一个程序单元可以为:
子程序(subprogram),定义一些可执行运算。过程(procedure)和函数(function)都是子程序。
程序包(package),定义一些实体(entity)。程序包是 Ada 中的主要分组机制,类似于 C 的函数
库,Modula 的"module"。
任务单元(task unit),与线程类似,定义一些计算,然后并发执行。
保护单元(protected unit),在并发计算中协调数据共享,这在 Ada 83 中不存在。
类属单元(generic unit),帮助构建可重用组建,和 C++ 的模板类似。
后 3 类属于高级话题,在后面的章节中我们会依次介绍。程序单元又可为两部份:
声明部份(declaration)。定义对其它程序的接口,有些可用资源可以被用户使用,与 C 下的'.h'文件相
似。
主体部份(body)。是声明部份的具体实现,等价与 C 的'.c'文件。
其中程序包(package)和子程序(subprogram)是用的最广泛的 2 个程序单元。大部份 Ada 程序基
于一堆程序包,在以一个主过程(main proceudre) 来开始 Ada 程序 。
第 2 章 基本数据类型和表达式(Basic Types and Expressions)
2.1 概述(Overview)
数据类型是一门计算机语言最基本的特性,表示一个对象的类型,是数字、字符或其它类型。由
于 Ada 在数据类型上提供的强大处理能力,我们又不能很简单地认为数据类型仅是定义一个对象的
类型。在 Ada 里,数据类型可以自己创建,它的相关运算符也可以自己定义,同时又有数据类型属
性这项特性,具有相当大的灵活性。学过其它的语言,特别是有 C 和 Pascal 背景的朋友初次接触时
可能会感到有点新鲜。
创建新类型,是用户自己定义数据类型,包括该类型的名称、取值范围及相关操作;其中又包括
了派生类型和创建子类型,即以现有数据类型为母类型创建新类型,继承母类型的一部份属性。
数据类型属性,如同我们玩 RPG 游戏时的人物属性:体力值、魔法值一样,是说明该类型固有的
3
属性,包括最小取值范围、最大取值范围等等。
本章将会先介绍词法元素以及创建数据类型的基础性知识,然后是整型(integer)、实型(real)、字符
型(character)、布尔型(boolean)、枚举类型 (enumuration)这几种标量类型,最后则是相关的数据类
型属性、类型限制和类型转换、表达式和运算符。
2.2 词法元素(Lexical Element)
Ada 里的词法元素与其它语言的定义还是有不小差别,下面按照 RM95 关于词法元素的分类来逐
项介绍,包括标识符、保留字、字符、数值文字等及它们的一些规则。
2.2.1 基本字符集(Character Set)
Ada 95 规定的标准字符集是 Latin-1,支持 8 位(基于 ISO-8869)和 16 位(基于 ISO-10646)字符,在非
标准模式下也可用本地字符集,具体情况取决于当前的系统。(一般来说,涉及字符时默认是指
Latin-1,程序几乎都是用 Latin-1 字符集写的)
字符在 RM 95 中是分成了三类:图形字符(graphic character)、格式控制符(format effector)、其它控
制符(other control function),它们所表示的范围为:
图形字符包括字母(letter)、数字(digit)、空格符(space)、特殊字符(special character)(例如" # & ' ( ) *
+ , - . / : ; < = > _ | { } [ ]);
格式控制符包括水平制表符(HT)、垂直制表符(VT)、回车(CR)、换行(LF)、换页(FF);
其它控制符则是除了格式控制符以外的控制符。
更详细的内容参见 RM 95、ISO 8869,ISO 10646。
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. 不能将保留字作为标识符。在 Ada 83 中,标识符包括了保留字,但在 Ada 95 中保留字从标识符
中分离了出来。
5. .如上节所提及的,标识符是不分大小写的,但为了可读性,请注意你对标识符的命名。
2.2.3 保留字(Reserved Word)
保留字在程序语法中有特殊的含义,不属于标识符范围,这与 C 和 Pascal 等语言的定义有所不同。
Ada 95 中的保留字如下:
abort abs abstract accept access aliased all and array at begin body
case constant declare delay delta digits do else elsif end entry exception exit
for function generic goto if in is limited loop mod new not null of or others out
package pragma private procedure protected raise range record rem renames requeue
return reverse select separate subtype tagged task terminate then type
until use when while with xor
在以后的内容中,我们会逐个解释它们的含义及作用。Ada95 的保留字比原先添加了 6 个:
abstract, aliased, protected, requeue, tagged 和 until,虽然这可能会牵连到兼容性问题,但通常也无须
4
计较这点。
2.2.4 分隔符(Separator and Delimiter)
Ada 程序中,各元素之间需要空格符、格式控制符或 EOF 隔开。RM 95 里将它们作为 separator,而
delimiter 则是指下列特殊字符(中文有点说不清楚):& ' ( ) * + , -. / : " < = > | 或是复合型的: => .. ** :
= /= >= <= << >> <>。当分隔符作为注释、字符串、字符、数值的一部分时,就不再是分隔符了。
2.2.5 数值文字(Numeric Literal)
数值文字就是指数字。Ada 和 Pascal 相同,将数字分为实数型(real literal)和整数型(integer literal)
两大 类。实 数型是 有 小数点 的数字 ,整数 型 则无小 数点。 如 1.2787,0.871,7.0 是 实数型 ,而 -
882,5441,1 是整数型。Ada 在数字表示上有一个很好的特性就是可以明确指定使用何种基数(2 进制
到 16 进制)表示,下面是数字的表示:
十进制数(Decimal Literal)
不管是实型还是整型数,都可以在其间加上下划线,使长数字更加易读。如 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 大小写皆可以。
基型数字(Based Literal)
在大部分语言中,都使用 10 进制数字表示;Ada 里整数可以不用 10 进制的表示方法书写,而是
直接使用 2 至 16 进制的表示法,格式为:Base # Number #,Base 表示所采用的进制,Number 为该进制
下所表示的数字。
2#1001_1001#,表示 2 进制数 1001 1001,中间的下划线可取消,其 10 进值为 153;
10#153#,表示 10 进制数 153,等价与 153;
16#90#,表示 16 进制数 90,其 10 进值为 144;
2.2.6 字符文字(Character Literal)
字符文字的表示是单个图形字符在单引号 ‘ ’中,如' a'表示小写字母 a, 'K'表示大写字母 K,' ' '表示一
个单引号,' '表示一个空格。
2.2.7 字符串文字(String Literal)
字符串是双引号(" ")之间的有序图形字符。如" What I said."就是一个字符串。表示空字符串时直
接用" "。如果字符串中有双引号,一个双引号要用两个"来表示。如" He said,"" I am hungry."" ",而"
He said," "I am hungry. "或" He said," I am hungry." "是不合法的。至于其它字符,如$ %之类可以直接
出现在两个双引号间。与 C 语言不同,Ada 里没有与之相同的转义字符,并且 EOL 不会算到字符串
中。
2.2.8 注释(Comment)
注释由两个连字号(hyphen)(--)开始,直到行尾。可以出现在程序的任一个地方,不影响程序本身。
例如:
-- the comment;
end;-- processing of Line is complete.
2.2.9 Pragmas
Pragma 是编译指示(compile directive),给编译器指令如优化程序,列表控制等。它的作用往往不只
影响一个编译单元,而是整个程序。
Pragma 是 些预先 定 义的 指 令,如 pragma Page,pragma List(OFF) , 编 译器也 可扩展 RM 95 中
pragma。我们先接触 List,Page,Optimize 这 3 个 pragma。更多内容我们会在以后接触。
pragma List(identifier);
pragma Page;
pragma Optimize(identifier);
pragma List 将 identifier On 或 Off 作为它的参数。它指定编译列表(listing of compilation) 是继续还
是停止,直到在同一个编译单元内,一个 pragma List 使用了相反的参数。
5
剩余63页未读,继续阅读
资源评论
- 爆花妹2013-09-27还不错 适合初学者
- relaxs1232012-02-17不错,扫盲的文章,适合入门
- L23240334792014-03-21好东西,可是为什么我还是更喜欢c。。。
infinity71
- 粉丝: 2
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功