Ada是一种表现能力很强的通用程式设计语言,它是美国国防部为克服软体开发危机,耗费巨资,历时近20年研製成功的。它被誉为第四代计算机语言的成功代表。与其他流行的程式设计语言不同,它不仅体现了许多现代软体的开发原理,而且将这些原理付诸实现。因此,Ada语言的使用可大大改善软体系统的 清晰性, 可靠性, 有效性, 可维护性。
基本介绍
- 中文名:Ada语言
- 特点:可靠性, 有效性, 可维护性
- 属于:通用程式设计语言
- 属于:《程式设计语言Ada》
简介
Ada的出现,标誌着软体工程成功地进入了国家和国际的规模。在一定意义上说,Ada还刺破了“冯.诺依曼思维模式” (Von Newman Mind-set) 的桎梏,连同Ada的 支持环境(APSE)一起,形成了新一派的所谓 Ada文化。它是迄今为止 最複杂,最完备的软体工具。 Ada语言是 美国国防部指定的 唯一的一种可用于 军用系统开发的语言,我国军方也将Ada做为军内开发标準(GJB 1383《程式设计语言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语言的。这种特殊功能并不需要特殊的运行设定。儘管这种语言的语意结构允许对于不能读写的目标进行自动的碎片蒐集,但是大多数运行都不支持它。A da却支持有限形式基于区域的存储管理。无效的读写常在运行时候被检查出来(除非这种检测被人为关闭)并且有时候在编译时候就被发现。
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!" 示例程式
一个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月4日,对于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编译了。