670 likes | 1.03k Views
Ada 编程语言. 埃达 · 洛夫莱斯( Ada Lovelace ). 原名:埃达 · 拜伦 Ada Byron 乔 治 · 戈登 · 拜伦的女儿 1815-1852 ( 36 ) 被认为是第一位计算机程序员. 阿丽亚娜 501 航班. 阿丽亚娜 5 号 运载火箭 501 航班. 阿丽亚娜 5 号 ( Ariane 5 ) 1996 年 6 月 4 日 火箭升空约 40 秒后爆炸 3 亿多美金,无人员伤亡 (视频来源: kYUrqdUyEpI ). 事故报告. H0 + 39 仰角 超过 20 度 过高的空气动力载荷 推进器从主体分离
E N D
埃达·洛夫莱斯(Ada Lovelace) • 原名:埃达·拜伦 • Ada Byron • 乔治·戈登·拜伦的女儿 • 1815-1852 (36) • 被认为是第一位计算机程序员
阿丽亚娜5号运载火箭501航班 • 阿丽亚娜5号(Ariane 5) • 1996年6月4日 • 火箭升空约40秒后爆炸 • 3亿多美金,无人员伤亡 (视频来源:kYUrqdUyEpI)
事故报告 • H0 + 39 • 仰角超过20度 • 过高的空气动力载荷 • 推进器从主体分离 • 启动程序触发自毁程序 • 原因:惯性基准系统(IRS)软件出错 • 主系统(IRS 2) 和备用系统(IRS 1)错误相同 • 一个64位浮点数转换为16位整数时出现了溢出 • 在阿丽亚娜4号运载火箭上,这个溢出不会发生
declarevertical_veloc_sensor:float;horizontal_veloc_sensor:float;vertical_veloc_bias:integer;horizontal_veloc_bias:integer;...begindeclarepragma suppress(numeric_error,horizontal_veloc_bias);beginsensor_get(vertical_veloc_sensor);sensor_get(horizontal_veloc_sensor);vertical_veloc_bias:=integer(vertical_veloc_sensor);horizontal_veloc_bias:=integer(horizontal_veloc_sensor);...exceptionwhennumeric_error=>calculate_vertical_veloc();whenothers=> use_irs1();end;end irs2;
起源——问题 • 1968-1973 • 美国国防部认为计算机系统开支过高 • 主要问题: • 450种通用的语言和“方言” • 为特定机器编写的汇编语言 • 开发维护困难,代码质量低 • 解决措施: • 硬件系列化标准化(兼容性) • 软件(操作系统/编程语言)标准化
起源——特点 • 系统的特征 • 大规模和长期生存 • 高可靠和持续变化 • 物理条件约束 • 嵌入式系统和三军统一语言研发任务 • 并发处理 • 实时控制 • 异常处理 • 特定I/O控制 • 成立高级语言工作组(HOLWG)
起源——规格 • 草人要求(Strawman Requirement,1975.4) • 木人要求(Woodenman Requirement,1975.8) • 锡人要求(Tinman Requirement,1976.1) • 铁人要求(Ironman Requirement,1977.1) • 钢人要求(Steelman Requirement,1978.6) • 通用性、可靠性、可维护性、有效性简明性、可实现性、机器无关性、定义完备性 • 支持现代软件方法学 • 具有实时控制、并发机制和异常处理能力
起源——现有语言 • 在锡人要求的阶段,代表对现存的23种高级语言进行正式审查。结论: • 现存的高级语言都不适合作为国防部嵌入式系统的通用高级语言 • 新的语言不应该另起炉灶,可以在现有的语言基础上开发 • 专家认为可以参考Pascal、Algol和PL/1
起源——提出 • 根据钢人要求招投标 • 用颜色标记承招单位的设计方案 • 第一阶段:蓝、黄、红、绿 • 第二阶段:绿、红 • 结果:绿(Ada) • 1978年,Ada语言初稿首次被提出 • Ada程序设计支撑环境(APSE) • 石人要求(Stoneman Requirement) • Ada联合办公室(AJPO,1978)
起源——完善 • 针对不同应用编写了大量Ada程序 • 结论:Ada是个很好的程序设计语言,但需要修正 • 许多当时著名的计算机科学家参加评审 • 英国计算机科学家Hoare • 1981年在美国领图灵奖 • 获奖时发表的演讲《皇帝的旧装》 • 把Ada初稿批地一塌糊涂 • 后来他的不少很好的建议切实得到了采纳
起源——Ada83 • 1980年,成为美国军用标准; • 1983年,成为一个美国国家标准; • 人们一般将这个标准称为Ada83 • 当时最快成为国家标准的程序设计语言 • 有效降低了费用,减少了人力财力的浪费
应用 • 1985年,巴黎国际Ada大会:Ada in use • Ada进入使用阶段 • 1986年3月,通过AJPO确认的编译系统有28个 • 1987年,美国国防部要求所有软件项目都使用Ada语言 • 当然,经常有软件被特殊授权使用别的语言 • 这项政策直到1997年被取消 • 1996年,前面提到的450种语言只剩下37种 • 许多欧洲国家也采用Ada作为军用语言 • 英国国防部1987年规定新系统必须使用Ada • 中国军方自1992年开始使用Ada(GJB 1383)
发展 • 1988年,美国国防部、美国国家标准协会 • 对Ada进行一次大的修改,Ada 9X • 需求制定 • 修改Ada标准 • 由Ada 83到Ada 9X过渡 • 1995年,Ada95 • 面向对象 • 用于并发的保护对象 • 扩展语言设施
1997后 • 1997年,美国国防部取消了使用Ada语言的限制 • 因为当时一些新发展出来的高级语言使得Ada已经没有特别的优势了 • 管理工作交由WG9(属于ISO组织) • Ada 2005 • Ada 2012
现状 • 到现在,被用于众多需要高安全性的软件开发 • 有军方用途更有商业用途 • 波音777飞机飞行控制系统 • 加拿大自动化空中交通系统 • 法国TGV高速铁路信号系统
语言特点 • 受到ALGOL 68和Pascal的影响 • 大小写不敏感 • 静态类型、强类型、类型安全、显式类型声明 • 主要针对嵌入式和实时系统
Hello World 程序 withAda.Text_IO; useAda.Text_IO; procedure Hello is begin Put_Line("Hello world!"); end Hello;
GNAT • GNU Compiler Collection中包括Ada编译器 • >gnatmakehello.adbgcc -c hello.adbgnatbind -x hello.alignatlinkhello.ali
标识符 • 字母开头 • 字母数字或下划线组成 • 结尾不能是下划线 • 不能出现连续两个下划线
整数字面量 42 1_000_000 3e8 2#1100# 12 16#BEEF# 48879 3#21# 7 • 可以在数字中间使用下划线增加可读性 • 不能有两个连续的下划线 • 正指数的形式可以用于整数 • 2~16进制均可
实数字面量 42.0 1.000_000 3.0e8 2#1100.101# 1.26250E+1 7#0.1# 1.42857E-01 • 下划线规则与整数相同 • 必须包括小数点 • 小数点不能作开头或结尾 • 2~16进制均可 • 整数和实数不能自动转换
字符字符串字面量 'A' '*' '''' "" "Hello world!" """"
类型 • Integer (16位有符号整数) • Modular(16位无符号整数,Ada95) • Float, digits(浮点数) • delta ... digits(定点数) • Boolean(布尔,枚举类型) • Character(字符,枚举类型)
类型继承关系 • Ada types • Elementary types • Composite types • Access • Scalar • Array • Discrete • Real • Record • Enumeration • Integer • Float • Fixed • Protected • Singed • Decimal • Task • Modular • Ordinary
类型(续) • 枚举 • 创建类型和子类型 • 类似Pascal的子界,不同于面向对象的子类 • 数组 • 记录
类型属性 • S'First下界 • S'Last上界 • S'Range上下界 • S'Base基类型 • S'Min函数,较小值 • S'Max函数,较大值 • S'Succ函数,后继 • S'Pred函数,前驱 • S'Image函数,S到字符串 • S'Wide_Image函数,宽字符串 • S'Width函数,字符串最大宽度 • S'Wide_Width函数,宽字符串最大宽度 • S'Value函数,字符串到S • S'Wide_Value函数,宽字符串到S
枚举 type Color is (Red, Green, Blue); • S'Pos函数,枚举值到整数 • S'Val函数,整数到枚举值
创建类型与子类型 type Age isrange1..100;type Age isnewIntegerrange1..100;subtype Age isIntegerrange1..100; • 前两种Age可以做Integer的算术操作,但是不能直接转换为Integer • 第三种Age可以自动转换为Integer • 赋值时越界值会直接抛出异常
浮点数 type Real isdigits8;type Mass is digits 7range0.0.. 1.0E35;subtype Probability is Real range0.0.. 1.0; • S'Digits精度
定点数 type Volt isdelta0.125range0.0.. 255.0;type Fraction isdeltaSystem.Fine_Deltarange-1.0.. 1.0;type Money isdelta0.01digits15;subtype Salary is Money digits10; • S'Small存储时最小分度,S'Delta表达的最小分度 • S'Fore、S'Aft小数点前后最少字符数量 • S'Digits、S'Scale精度、标度(仅限十进制) • S'Round舍入函数(仅限十进制)
数组 typeArrXisarray(False..True)ofFloat;type Board isarray(1..8,1..8)ofInteger;type Color is(Red, Green, Blue);type Pixel isarray(Red .. Blue)ofInteger;len:Integer :=8;typeArrYisarray(1..len) of Integer;
数组(续) a : array (-1 .. 1) ofInteger := (3, 42, 128);p : Pixel := ( Red => 20, Green => 40, Blue => 80);a(0) := 3;p(Red); • 每次读写会运行时检查是否越界
记录 typeMyRecordisrecord var1 : 1 .. 100; var2 : String(1 .. 20);case var1 is-- 变体记录(可选)when1 .. 50=> var3 : Integer;when51 .. 100=> var4 : Float;endcase;endrecord;rec : MyRecord; • 运行时会检查是否读写了不存在的变体记录
字符串 procedurestring_testispackage CL renamesAda.Command_Line;package S renamesAda.Strings;package SF renamesAda.Strings.Fixed; x :String:=CL.Argument(1);begin x := CL.Argument(2);SF.Move( Source =>CL.Argument(2), Target => x, Drop =>S.Right, Justify =>S.Left, Pad =>S.Space);endstring_test;
访问 • 访问(Access)类似于一般意义上的指针 • 不过更像是Pascal的指针而不是C的指针 typeInt_PisaccessInteger;typeInt_GisaccessallInteger;x : Int_Pointer;x = newInteger; • 访问类型默认值为null • 使用访问类型会自动检查是否为null • 不能对访问类型做算术运算 • 规范中没有明确说明是否有垃圾回收机制
访问(续) typeList_Node;typeList_Node_AcsisaccessList_Node;typeList_Nodeis recordData : Integer;Next : List_Node_Acs;endrecord; procedureFree is -- 手动释放newAda.Unchecked_Deallocation (List_Node, List_Node_Acs);
子过程访问 typeFloat_Functionisaccessfunction(F: Float) return Float; type Action isaccessprocedure;
直接内存访问 • System.Address(内存地址) • System.Storage_Elements.Storage_Offset(内存地址的差) • System.Storage_Elements.Storage_Count(一段内存的长度) • System.Storage_Elements.Storage_Element(最小内存单元,一般等价于一字节) • System.Storage_Elements.Storage_Array(一列存储单元)
空语句 null • 相当于Python的“pass” 或者C的“;”
结构括号 • case ... endcase • if ... endif • loop ... endloop • record ... endrecord • select ... endselect
条件语句 if c1 then s1;elsif c2 then s2;elsif c3 then s3;else s4;endif; case x iswhen v1 => s1;when v2 => s2;when v3 | v4 => s3;whenothers=> s4;endcase;
循环语句while [loop_label:][whilecondition1]loopstatementsexit[loop_label]whencondition2;statementsendloop;
循环语句for [loop_label:]forloop_varin[reverse]1..10loopstatementsexit[loop_label]whencondition2;statementsendloop; • for循环体中不能改变循环变量的值
跳转语句 <<goto_label>>gotogoto_label;