1 / 67

Ada 编程语言

Ada 编程语言. 埃达 · 洛夫莱斯( Ada Lovelace ). 原名:埃达 · 拜伦 Ada Byron 乔 治 · 戈登 · 拜伦的女儿 1815-1852 ( 36 ) 被认为是第一位计算机程序员. 阿丽亚娜 501 航班. 阿丽亚娜 5 号 运载火箭 501 航班. 阿丽亚娜 5 号 ( Ariane 5 ) 1996 年 6 月 4 日 火箭升空约 40 秒后爆炸 3 亿多美金,无人员伤亡 (视频来源: kYUrqdUyEpI ). 事故报告. H0 + 39 仰角 超过 20 度 过高的空气动力载荷 推进器从主体分离

aileen
Télécharger la présentation

Ada 编程语言

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Ada编程语言

  2. 埃达·洛夫莱斯(Ada Lovelace) • 原名:埃达·拜伦 • Ada Byron • 乔治·戈登·拜伦的女儿 • 1815-1852 (36) • 被认为是第一位计算机程序员

  3. 阿丽亚娜501航班

  4. 阿丽亚娜5号运载火箭501航班 • 阿丽亚娜5号(Ariane 5) • 1996年6月4日 • 火箭升空约40秒后爆炸 • 3亿多美金,无人员伤亡 (视频来源:kYUrqdUyEpI)

  5. 事故报告 • H0 + 39 • 仰角超过20度 • 过高的空气动力载荷 • 推进器从主体分离 • 启动程序触发自毁程序 • 原因:惯性基准系统(IRS)软件出错 • 主系统(IRS 2) 和备用系统(IRS 1)错误相同 • 一个64位浮点数转换为16位整数时出现了溢出 • 在阿丽亚娜4号运载火箭上,这个溢出不会发生

  6. 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;

  7. 起源与发展

  8. 起源——问题 • 1968-1973 • 美国国防部认为计算机系统开支过高 • 主要问题: • 450种通用的语言和“方言” • 为特定机器编写的汇编语言 • 开发维护困难,代码质量低 • 解决措施: • 硬件系列化标准化(兼容性) • 软件(操作系统/编程语言)标准化

  9. 起源——特点 • 系统的特征 • 大规模和长期生存 • 高可靠和持续变化 • 物理条件约束 • 嵌入式系统和三军统一语言研发任务 • 并发处理 • 实时控制 • 异常处理 • 特定I/O控制 • 成立高级语言工作组(HOLWG)

  10. 起源——规格 • 草人要求(Strawman Requirement,1975.4) • 木人要求(Woodenman Requirement,1975.8) • 锡人要求(Tinman Requirement,1976.1) • 铁人要求(Ironman Requirement,1977.1) • 钢人要求(Steelman Requirement,1978.6) • 通用性、可靠性、可维护性、有效性简明性、可实现性、机器无关性、定义完备性 • 支持现代软件方法学 • 具有实时控制、并发机制和异常处理能力

  11. 起源——现有语言 • 在锡人要求的阶段,代表对现存的23种高级语言进行正式审查。结论: • 现存的高级语言都不适合作为国防部嵌入式系统的通用高级语言 • 新的语言不应该另起炉灶,可以在现有的语言基础上开发 • 专家认为可以参考Pascal、Algol和PL/1

  12. 起源——提出 • 根据钢人要求招投标 • 用颜色标记承招单位的设计方案 • 第一阶段:蓝、黄、红、绿 • 第二阶段:绿、红 • 结果:绿(Ada) • 1978年,Ada语言初稿首次被提出 • Ada程序设计支撑环境(APSE) • 石人要求(Stoneman Requirement) • Ada联合办公室(AJPO,1978)

  13. 起源——完善 • 针对不同应用编写了大量Ada程序 • 结论:Ada是个很好的程序设计语言,但需要修正 • 许多当时著名的计算机科学家参加评审 • 英国计算机科学家Hoare • 1981年在美国领图灵奖 • 获奖时发表的演讲《皇帝的旧装》 • 把Ada初稿批地一塌糊涂 • 后来他的不少很好的建议切实得到了采纳

  14. 起源——Ada83 • 1980年,成为美国军用标准; • 1983年,成为一个美国国家标准; • 人们一般将这个标准称为Ada83 • 当时最快成为国家标准的程序设计语言 • 有效降低了费用,减少了人力财力的浪费

  15. 应用 • 1985年,巴黎国际Ada大会:Ada in use • Ada进入使用阶段 • 1986年3月,通过AJPO确认的编译系统有28个 • 1987年,美国国防部要求所有软件项目都使用Ada语言 • 当然,经常有软件被特殊授权使用别的语言 • 这项政策直到1997年被取消 • 1996年,前面提到的450种语言只剩下37种 • 许多欧洲国家也采用Ada作为军用语言 • 英国国防部1987年规定新系统必须使用Ada • 中国军方自1992年开始使用Ada(GJB 1383)

  16. 发展 • 1988年,美国国防部、美国国家标准协会 • 对Ada进行一次大的修改,Ada 9X • 需求制定 • 修改Ada标准 • 由Ada 83到Ada 9X过渡 • 1995年,Ada95 • 面向对象 • 用于并发的保护对象 • 扩展语言设施

  17. 1997后 • 1997年,美国国防部取消了使用Ada语言的限制 • 因为当时一些新发展出来的高级语言使得Ada已经没有特别的优势了 • 管理工作交由WG9(属于ISO组织) • Ada 2005 • Ada 2012

  18. 现状 • 到现在,被用于众多需要高安全性的软件开发 • 有军方用途更有商业用途 • 波音777飞机飞行控制系统 • 加拿大自动化空中交通系统 • 法国TGV高速铁路信号系统

  19. 语言概述

  20. 语言特点 • 受到ALGOL 68和Pascal的影响 • 大小写不敏感 • 静态类型、强类型、类型安全、显式类型声明 • 主要针对嵌入式和实时系统

  21. Hello World 程序 withAda.Text_IO; useAda.Text_IO; procedure Hello is begin Put_Line("Hello world!"); end Hello;

  22. GNAT • GNU Compiler Collection中包括Ada编译器 • >gnatmakehello.adbgcc -c hello.adbgnatbind -x hello.alignatlinkhello.ali

  23. 基本语法

  24. 标识符 • 字母开头 • 字母数字或下划线组成 • 结尾不能是下划线 • 不能出现连续两个下划线

  25. 整数字面量 42 1_000_000 3e8 2#1100# 12 16#BEEF# 48879 3#21# 7 • 可以在数字中间使用下划线增加可读性 • 不能有两个连续的下划线 • 正指数的形式可以用于整数 • 2~16进制均可

  26. 实数字面量 42.0 1.000_000 3.0e8 2#1100.101# 1.26250E+1 7#0.1# 1.42857E-01 • 下划线规则与整数相同 • 必须包括小数点 • 小数点不能作开头或结尾 • 2~16进制均可 • 整数和实数不能自动转换

  27. 字符字符串字面量 'A' '*' '''' "" "Hello world!" """"

  28. 类型 • Integer (16位有符号整数) • Modular(16位无符号整数,Ada95) • Float, digits(浮点数) • delta ... digits(定点数) • Boolean(布尔,枚举类型) • Character(字符,枚举类型)

  29. 类型继承关系 • Ada types • Elementary types • Composite types • Access • Scalar • Array • Discrete • Real • Record • Enumeration • Integer • Float • Fixed • Protected • Singed • Decimal • Task • Modular • Ordinary

  30. 类型(续) • 枚举 • 创建类型和子类型 • 类似Pascal的子界,不同于面向对象的子类 • 数组 • 记录

  31. 类型属性 • 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

  32. 枚举 type Color is (Red, Green, Blue); • S'Pos函数,枚举值到整数 • S'Val函数,整数到枚举值

  33. 创建类型与子类型 type Age isrange1..100;type Age isnewIntegerrange1..100;subtype Age isIntegerrange1..100; • 前两种Age可以做Integer的算术操作,但是不能直接转换为Integer • 第三种Age可以自动转换为Integer • 赋值时越界值会直接抛出异常

  34. 浮点数 type Real isdigits8;type Mass is digits 7range0.0.. 1.0E35;subtype Probability is Real range0.0.. 1.0; • S'Digits精度

  35. 定点数 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舍入函数(仅限十进制)

  36. 数组 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;

  37. 数组(续) a : array (-1 .. 1) ofInteger := (3, 42, 128);p : Pixel := ( Red => 20, Green => 40, Blue => 80);a(0) := 3;p(Red); • 每次读写会运行时检查是否越界

  38. 记录 typeMyRecordisrecord var1 : 1 .. 100; var2 : String(1 .. 20);case var1 is-- 变体记录(可选)when1 .. 50=> var3 : Integer;when51 .. 100=> var4 : Float;endcase;endrecord;rec : MyRecord; • 运行时会检查是否读写了不存在的变体记录

  39. 字符串 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;

  40. 访问 • 访问(Access)类似于一般意义上的指针 • 不过更像是Pascal的指针而不是C的指针 typeInt_PisaccessInteger;typeInt_GisaccessallInteger;x : Int_Pointer;x = newInteger; • 访问类型默认值为null • 使用访问类型会自动检查是否为null • 不能对访问类型做算术运算 • 规范中没有明确说明是否有垃圾回收机制

  41. 访问(续) 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);

  42. 子过程访问 typeFloat_Functionisaccessfunction(F: Float) return Float; type Action isaccessprocedure;

  43. 直接内存访问 • System.Address(内存地址) • System.Storage_Elements.Storage_Offset(内存地址的差) • System.Storage_Elements.Storage_Count(一段内存的长度) • System.Storage_Elements.Storage_Element(最小内存单元,一般等价于一字节) • System.Storage_Elements.Storage_Array(一列存储单元)

  44. 空语句 null • 相当于Python的“pass” 或者C的“;”

  45. 结构括号 • case ... endcase • if ... endif • loop ... endloop • record ... endrecord • select ... endselect

  46. 条件语句 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;

  47. 循环语句while [loop_label:][whilecondition1]loopstatementsexit[loop_label]whencondition2;statementsendloop;

  48. 循环语句for [loop_label:]forloop_varin[reverse]1..10loopstatementsexit[loop_label]whencondition2;statementsendloop; • for循环体中不能改变循环变量的值

  49. 跳转语句 <<goto_label>>gotogoto_label;

More Related