标题：Ada语言
简介
Ada是一种表现能力很强的通用程序设计语言，它是美国国防部为克服软件开发危机，耗费巨资，历时近20年研制成功的。它被誉为第四代计算机语言的成功代表。与其他流行的程序设计语言不同，它不仅体现了许多现代软件的开发原理，而且将这些原理付诸实现。因此，Ada语言的使用可大大改善软件系统  的 清晰性， 可靠性， 有效性， 可维护性。
Ada的出现，标志着软件工程成功地进入了国家和国际的规模。在一定意义上说，Ada还刺破了“冯.偌依曼思维模式” (Von Newman Mind-set) 的桎梏，连同Ada的 支持环境(APSE)一起，形成了新一派的所谓 Ada文化。它是迄今为止 最复杂，最完备的软件工具。 Ada语言是 美国国防部指定的 唯一的一种可用于 军用系统开发的语言，我国军方也将Ada做为军内开发标准（GJB 1383《程序设计语言Ada》）。
---------------------------------------------------------------------------------- 为什么称作 Ada --美国国防部之所以把这种语言取名为Ada，是为了纪念奥左斯特. 艾达.洛夫莱斯伯爵夫人 (Augusta Ada Lovlace 1815-1852),她是英格兰诗人拜伦(Byron)勋爵的女儿,曾对现代计算机技术之父查尔斯.巴贝奇(Charles Babage)的笔记，手稿进行了整理和修正。从某种意义上说，她是世界上第一位计算机程序员。
---------------------------------------------------------------------------------- 为什么使用 Ada? --在明白这个问题之前，需要了解 Ada 的一系列特性。Ada 最初设计就是一门大型语言，因此在很多编程的重要问题上都有所考虑，以下文字摘自《 Ada Reference Manual》：
Ada最初设计时关注于 3 个最重要的问题：程序的稳定性和可维护性，程序设计和人的行为接近，并且高效。这份语言的修订版是为了提供更大的灵活性和扩展性，存储管理的额外控制和同步，以及标准化的程序包以支持重要的应用程序领域，同时保留原来的重点：稳定性，可维护性，和高效。对于程序设计语言促进可靠性和简化维护难度的需求已被确立。因此程序可读性的重要性高于轻松地写代码。例如，语言规则要求程序变量应当明确声明并指定它们的类型。由于变量的数据类型是不变的，编译器可以确保对于变量的操作适用于该类型的对象。另外，有错误倾向的符号已经避免，并且语言语法避免了编码形式的使用，使更倾向于英语的结构。最后，Ada 语言提供了程序单元单独编译的功能，使程序开发和维护简便，同样也提供了在一个单元内多个单元之间的检测。考虑人类程序员的问题也在设计时被强调。总而言之，在继续避免过多复杂句型的缺陷的同时，尝试以一致系统的方式保持相对较少的底层概念。
------------------------------------------------------------------------------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语言的"HHello,world!" 示例程序
一个Ada语言编写的"你好世界"Hello world program程序：
with Ada.Text_IO; 
procedure Hello 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();whenothers => use_irs1(); end;
Ada语言宏的使用
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编译了。