Ada语言学习(1)Basic Knowledge
文章目录
- 说在前头
- 命名
- 注释
- 数字
- 变量
- 变量类型
- signed integers
- Enumerations
- Floating Points
- 类型重用(继承)
- 类型转换
- 运算符
- 属性(Attributes)
- 练习
说在前头
- 本系列教程将会通过提问的方式来完成整个学习过程,因为当你能够提出一个好问题,你才能找到自己哪里不懂,然后去解决它,这样你就学会了。
- 所以当你想学习一门新的知识的时候,请先问问自己,哪里不会,如果你自己不知道自己哪里有问题,那么就没办法学会这个新知识。
- 本教程的所有内容均来自于 youtube 的 Ada001 学习教程,Ada002 学习教程 这好像也是全网唯一的 Ada 学习教程。
为什么学习 ada 语言呢?它与其他语言的差异是什么?
Ada是一种在特定领域中非常重要的编程语言。它的主要设计目标是支持大型,长寿命,高可靠性的系统开发。Ada在包括航天、防务、交通、医疗设备等关键性领域得到广泛应用,因为它的设计目标和特性非常适应这些领域的需求。
学习Ada编程语言有以下几个原因:
- 可靠性和安全性: Ada是为了提高可靠性和安全性而设计的。例如,Ada有很强的类型检查,这可以在编译时捕获许多错误。Ada还有各种特性来支持并发和实时编程,这在需要高度可靠的系统中很重要。
- 长寿命项目: Ada的设计使其非常适合长寿命项目。例如,Ada有很好的支持模块化和信息隐藏,这可以帮助管理大型代码库。此外,Ada语言的稳定性也有助于保证长期项目的持续性。
- 高性能: Ada提供了一些特性,可以帮助开发人员更好地控制程序的性能。例如,Ada支持低级别的编程,允许程序员直接操作硬件。
与其他编程语言相比,Ada的一些显著差异包括:
- 强类型: Ada有非常严格的类型系统,这可以帮助预防许多常见的编程错误。
- 包和子程序规格: Ada语言强调软件工程原则,例如信息隐藏、模块化和抽象。Ada使用包(package)来组织相关的类型和子程序,而子程序规格和实现的分离则提供了清晰的接口和实现分离。
- 并发和实时支持: Ada提供了对并发和实时系统的原生支持,这在许多其他语言中是缺失的或者作为库提供的。
- 异常处理: Ada提供了一种结构化的异常处理机制,可以在出现错误时提供清晰的程序控制流。
命名
- 变量命名是
case insensitive
的:Hello=hello=HellO
- 必须以字母开头
- 以数字或者字母结尾
- 不能有连续的下划线
注释
数字
- ada 允许数字中出现下划线
- 数字允许使用 2-16进制的表达方式:
- 浮点数必须使用
.
不能省略,因为 ada 强数据类型,严格区分浮点数和整数
变量
- 变量定义
变量名称
:
变量类型
;
- 变量声明+赋值
变量名称
:
变量类型
:= ...
;
- 声明多个变量
变量1, 变量2 : 变量类型 := ... ;
- 变量必须先声明后使用:
变量类型
- ada 中的任何类型都不会进行自动转换也不能混用,除非进行显式的数据类型转换
- ada 的全部类型
signed integers
Enumerations
Floating Points
需要注意的是:在 Ada 语言中,类型的精度(比如
Short_Integer
和Long_Integer
)通常取决于具体的编译器和目标平台。 Ada 规范并没有为Short_Integer
或Long_Integer
精确地规定位数。规范只要求Short_Integer
的范围至少能覆盖 − 2 1 5 -2^15 −215 到 2 15 − 1 2^{15} - 1 215−1(即至少16位),而Long_Integer
的范围至少能覆盖 − 2 31 -2^{31} −231 到 2 31 − 1 2^{31} - 1 231−1(即至少32位)。具体的位数可能会因为编译器和平台的不同而有所差异。如果你要实现一个操作,而这个操作要指定特定的数据类型,那么你可以自己定义一个数据类型来覆盖你想测试的所有数据范围,例如:
同样的,enumeration 类型的数据也如此:
同样的也可以定义浮点型的数据类型:
type Distance is digits 10;
定义了一个叫做 Distance 的浮点类型。关键字 digits 指定了这个类型的有效数字位数,也就是精度。在这个例子中,Distance 类型的精度至少为 10 位数字。type Temperature is digits 5 range -273.15 .. 1 000 000.0;
定义了一个叫做 Temperature 的浮点类型。这个类型的精度至少为 5 位数字。关键字 range 指定了这个类型的有效范围,可以接受的值在 -273.15 到 1 000 000.0 之间。如果试图将超出这个范围的值赋予 Temperature 类型的变量,Ada 的运行时系统将会抛出异常。这些类型定义使得你能够创建具有特定精度和范围限制的变量,这对于数值计算和物理测量等场景非常有用。
如果你指定的精度位数太高,那么 Ada 编译器会拒绝贬义你的程序,同时,对于浮点数的数据类型来说,尽量不要使用
range
语句来设定范围,因为代价很大。
类型重用(继承)
类型转换
- 类型的转换必须是显式的,ada 不会进行任何隐式的类型转换
- 类型转换的时候需要注意类型的定义是否符合转换的要求:
- 本图中 T1 定义的范围是 0-10, 而 T2 是 1-10
- 因此当将 V1 强转成 T2 类型的时候,范围不符合,就报错
运算符
- 在 Ada 语言中,
mod
和rem
都是用于实现**模运算(也就是求余数)**的操作符,但是他们在处理负数时的行为不同。
mod: mod
操作符在 Ada 中执行的是数学上的模运算。它的结果总是非负的。例如,-7 mod 5
会得到 3,因为 -7 可以被表达为 -2 * 5 + 3。
rem: rem
操作符执行的是“余数”运算,其结果的符号和被除数相同。例如,-7 rem 5 会得到 -2,因为 -7 可以被表达为 -1 * 5 - 2。
这两个操作符的这种行为和其他一些编程语言(如 Python)中的模运算操作符的行为是不同的。在使用它们的时候,需要特别注意负数的处理。
属性(Attributes)
在 Ada 语言中,属性(attributes)是一种特殊的结构,用于从某个实体中提取特定的信息或者执行特定的操作。实体可以是一个对象、类型、子程序等。
每个属性都由一个名字和一个前缀组成,前缀通常是类型的名称,而名字则描述了要获取的信息或要执行的操作。属性通过单引号(')来访问,格式为
Prefix'Attribute
。例如,假设你有一个数组 A,你可以使用
A'Length
来获取这个数组的长度。Ada 提供了许多内置的属性,比如:
'First
和'Last
:获取一个范围或数组的首个和最后一个元素的索引。'Length
:获取一个数组的长度。'Image
:获取一个标量对象或类型的字符串表示。
'Value
:从字符串生成一个标量对象。
- 下面是一个只能用于处理浮点数的属性集合(attributes set)
- 如果将 floating 转成 integer 要用
rounding
而不要用truncation
练习
修正版本:
V : Integer := 7;# 不需要再次声明 V 而是直接赋值 V := V + 5;
这里的错误是新定义的数据类型
N
的范围太大了, 因此编译器会拒绝编译
在这个修正后的代码中,我们首先定义了一个类型为
Natural
的常量ClassRoom
,并将其初始化为 5。然后,我们定义了一个类型为 Natural 的变量 Next_ClassRoom,并将其初始化为 ClassRoom 的值加 1,即 6。什么时候需要加
constant
这个关键字进行限定呢?在 Ada 编程语言中,
constant
关键字用于声明一个常量。一旦一个常量被初始化,它的值就不能再被改变。这个特性可以帮助避免在程序执行过程中意外地改变变量的值,增加代码的可读性和可维护性。你应该在以下情况下使用
constant
关键字:当你想定义一个在程序生命周期中保持不变的值时。例如,你可能想定义物理常数(如光速或派)、数学常数(如 π 或 e)或者应用程序特有的常数(如最大用户数量或默认超时时间)。
当你想保护一个变量不被修改,防止在后续的代码中意外地改变它的值时。
请注意,尽管
constant
关键字可以帮助提高代码的健壮性和可读性,但过度使用它可能会导致代码难以理解和维护。因此,你应该根据需要适当地使用它
- T2 继承了 T1 的类型,但是却扩展了 T1 的定义范围,这是不被允许的。T2 只能是 T1 的子集
下面是代码的执行步骤:
F
被初始化为7.6
,Div
被初始化为10
。在
begin
和end
之间的代码块中,首先将F
的值进行整型转换,Float
类型的 7.6 转为Integer
类型后变为 7。之后 7 被
Div
(即 10)整除,结果为 0,再将这个 0 转换为 Float 类型,结果仍为 0.0。最后,
Put_Line
函数打印出 F 的值,因为 F 的值现在是 0.0,所以输出将会是 “0.0”。
在 Ada 中,'Val 和 'Value 是两个预定义的属性,它们都用于从一个表示形式转换到对应的类型。不过,它们在用法上有所不同。
'Val
是用来从整数或者字符类型转换到对应的枚举类型。例如,对于枚举类型 type T is (A, B, C);,你可以使用T'Val(1)
来获取枚举类型的第二个值,也就是B
。'Value
是用来从字符串转换到对应的类型。对于枚举类型type T is (A, B, C);
,你可以使用T'Value("B")
来获取枚举类型的 B 值。需要注意的是,
'Value
只能接受字符串类型的参数,而'Val
可以接受整数或者字符类型的参数。
type T is (A, B, C);V1 : T := T'Val(1); -- V1 = B
V2 : T := T'Value("B"); -- V2 = B
- ada 大小写不做区分
- ada 字符串中的空格会被
Value
属性自动删除
- ada 的
range
只接受递增的定义,因此这里的 T 其实是空集
Ada语言学习(1)Basic Knowledge相关推荐
- 【Ada语言学习笔记】参考手册中文翻译及注记——语言概述
我们在Concurrent & Distributed Systems课的实验中需要用到Ada语言. 通俗而笼统地讲,Ada语言是一种描述特别详尽的语言(highly specific),因此 ...
- Ada 语言学习(3)复合类型数据——Array
文章目录 Array 数据类型声明 数组索引 数组范围 数组复制 数组初始化 直接赋值 通过拷贝赋值 不同索引范围但长度相等 非指定类型边界收缩 多维数组 数组遍历 数组切片 访问和动态检查 直接访问 ...
- ADA语言Hello World
为什么要写关于这么古老的语言(1980年左右)的文章呢?因为我想既然mainframe用的cobol这么恶劣的语言都写了那么多了,为何不写一点我比较喜欢的语言呢?虽然除了高安全级控制和仿真领域之外AD ...
- Python语言学习:解决python版本升级问题集合(python2系列→Python3系列)导致错误的总结集合
Python语言学习:解决python版本升级问题集合(python2系列→Python3系列)导致错误的总结集合 目录 Python版本升级的原因 Text and binary data in P ...
- c语言跳至表域跳几个字符,c语言学习最好资料.doc
c语言学习最好资料 第2章 C语言概述 要想使计算机按人的意图工作,就必须使用计算机能接受和执行的指令,用二进制的0和1编写的指令是面向机器的,称为机器指令.要让计算机连续完成一系列操作,需要把相应的 ...
- c语言谭浩强ppt课件,编程_C语言学习课件_谭浩强_PPT~1216F.ppt
编程_C语言学习课件_谭浩强_PPT~1216F.ppt ,第一章,C语言概述本章要点,C语言的特点 C程序的结构 在计算机上运行C程序的方法主要内容,1.1 语言出现的历史背景 1.2 程序的特点 ...
- 欧洲语言学习统一标准C1C2音频,昆明学法语梓润告诉你法语欧标A1A2B1B2C1C2
原标题:昆明学法语梓润告诉你法语欧标A1A2B1B2C1C2 昆明学法语梓润告诉你法语欧标A1A2 昆明学法语认准梓润 所谓的欧标,全称为"Common European Framework ...
- 【历史上的今天】12 月 10 日:世界上第一位程序员诞生;Ada 语言发布;第一人称射击游戏的开拓者
整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2021 年 12 月 10 日,在 120 年前的今天,瑞典国王和挪威诺贝尔基金会首次颁发了诺贝尔奖.根据诺贝尔 ...
- C语言 指针 规范,C语言学习知识指针习题集附规范标准答案.doc
C语言学习知识指针习题集附规范标准答案.doc /*一.选择题1. 变量的指针,其含义是指该变量的_________. a值 b地址 c名 d一个标志2若有语句int *point,a4;和point ...
最新文章
- 常用浏览器内核驱动下载地址
- 关于顺序栈的基本操作
- 10年布局,这道题都不懂就别想进阿里
- 天猫上线“商家售后服务评价”功能,消费者体验将纳入商家考核指标
- Python_ collections_defaultdict默认字典
- mongose + express 写REST API
- oracle19c xp安装 客户端_windows下安装oracle19c
- Shell调试Debug的三种方式
- AudioUnitRender -10876
- endnote参考文献排版_基于国家标准的 EndNote 输出样式模板
- 树莓派设置静态ip地址
- 详解文本格式(Text)[第二天]
- 2020年十七届华为杯数学建模比赛记录
- 如何描述缺陷(Defect)?
- 冷库用电量计算机方式,冷库一般用电量如何估算
- 学习日志day45(2021-09-09)(1、有道翻译API使用json格式数据 2、JSONP 3、Ajax提交form表单 4、Web Uploader)
- 整数转罗马数字(C++)
- CAD完美转ArcGIS的操作方法技巧
- 爬虫大作业_爬取三星Galaxy_S9论坛
- 【多元统计分析】均值向量和协方差阵的检验——spss上机实验
热门文章
- 2022 新的瞬间,重启一下
- 访谈李开复:谁主宰微软未来
- 解决报错“Ignoring ffi-1.12.2 because its extensions are not built. Try: gem pristine ffi --version 1.12”
- html制作upc 12,如何在条码打印软件中制作UPC码
- [游戏策划] 读书笔记
- 这就是神经网络 19:深度学习-人脸检测-S3FD
- 【往届期末试卷】毛概期末试卷
- 【渝粤教育】国家开放大学2018年春季 0463-21T英语语音 参考试题
- 笨办法学习python3 ex3
- 云计算 --day05