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_IntegerLong_Integer)通常取决于具体的编译器和目标平台。 Ada 规范并没有为 Short_IntegerLong_Integer 精确地规定位数。规范只要求 Short_Integer 的范围至少能覆盖 − 2 1 5 -2^15 215 2 15 − 1 2^{15} - 1 2151(即至少16位),而 Long_Integer 的范围至少能覆盖 − 2 31 -2^{31} 231 2 31 − 1 2^{31} - 1 2311(即至少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 语言中,modrem 都是用于实现**模运算(也就是求余数)**的操作符,但是他们在处理负数时的行为不同。

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.6Div 被初始化为 10

    • beginend 之间的代码块中,首先将 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 其实是空集

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/20522.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

86盒IP对讲一键报警器

86盒IP对讲一键报警器 86盒IP对讲一键报警器:革命性保障生命安全的利器! 随着科技的飞速发展,我们的生活变得越来越方便和智能化。而86盒IP对讲一键报警器更是在这种背景下应运而生。这款产品不仅无缝对接各种手机APP,也可以在智…

RabbitMQ --- 惰性队列、MQ集群

一、惰性队列 1.1、消息堆积问题 当生产者发送消息的速度超过了消费者处理消息的速度,就会导致队列中的消息堆积,直到队列存储消息达到上限。之后发送的消息就会成为死信,可能会被丢弃,这就是消息堆积问题。 解决消息堆积有三种…

互联网大厂测开面试记,二面被按地上血虐,所幸Offer已到手

在互联网做了几年之后,去大厂“镀镀金”是大部分人的首选。大厂不仅待遇高、福利好,更重要的是,它是对你专业能力的背书,大厂工作背景多少会给你的简历增加几分竞争力。 如何备战面试的? 第一步:准备简历 …

vue3回到上一个路由页面

学习链接 Vue Router获取当前页面由哪个路由跳转 在Vue3的setup中如何使用this beforeRouteEnter 在这个路由方法中不能访问到组件实例this,但是可以使用next里面的vm访问到组件实例,并通过vm.$data获取组件实例上的data数据getCurrentInstance 是vue3提…

51单片机也可以移植RTOS

说起RTOS移植,我们首先会想到32位单片机。 那么51单片机可以移植RTOS吗? 我的答案是,只要资源够用(ROM空间、RAM空间),可以移植。 前提是你对RTOS的实现原理非常清楚,并且可以自己完成移植工作…

数据可视化大屏的页面布局以及自适应

在做数据可视化大屏之前,我们需要考虑到页面的布局问题以及页面缩放自适应问题,下面分别就这两个方面讲解。 页面布局 类似这种页面区块的明显划分,常用的布局方式有两种: 1、flex布局 2、grid布局 grid布局 grid布局可以按区块…

深度学习用于医学预后-第二课第四周5-10节-为个体患者制定风险评估模型

文章目录 相对风险按风险对患者进行排序个体与基线风险吸烟者与不吸烟者年龄对风险的影响 在本课中,您将学习 Cox 比例风险模型(Cox Proportional Hazards Model)。您将了解 Cox 模型如何考虑患者变量来比较不同患者的风险,使用他们的患者概况。 但到目前…

mysql增量备份

目录 一、修改配置文件,开启增量备份功能 (1)查看是否已经开启了 (2)修改配置文件开启 (3)增量记录文件 二、还原增量备份 (1)修改了数据 (2&#xff…

nginx keepalive 高可用原理和实操

文章目录 前言一、nginxkeepalive搭建高可用服务方案?二、方案解析1.keepalive是什么2.nginx是什么 三、keepalive与nginx环境安装四、高可用配置实例总结 前言 一、nginxkeepalive搭建高可用服务方案? 使用nginx-keepalived双机热备机制,vi…

【云计算•云原生】4.云原生之什么是Kubernetes

文章目录 Kubernetes概念Kubernetes核心概念集群podConfigMap Kubernetes架构master节点的组件worker节点组件 Kubernetes网络架构内部网络外部网络 k8s各端口含义 Kubernetes概念 K8S就是Kubernetes,Kubernetes首字母为K,末尾为s,中间一共有…

BEV(0)---Transformer

1 Transformer Transformer是一个Sequence to Sequence model,特别之处在于它大量用到了self-attention,替代了RNN,既考虑了Sequence的全局信息也解决了并行计算的问题。 1.1 self-attention: ①. 输入x1 ~ x4为一个sequence&…

MySQL基础(三十一)数据库其它调优策略

1 数据库调优的措施 1.1 调优的目标 尽可能 节省系统资源 ,以便系统可以提供更大负荷的服务。(吞吐量更大)合理的结构设计和参数调整,以提高用户操作 响应的速度 。(响应速度更快)减少系统的瓶颈&#xf…

服务网关Gateway

前言 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 破坏了服务无状态…

DJ6-4 文件存储空间的管理

目录 6.4.1 空闲表 1、存储空间的分配与回收 2、空闲表法的优缺点 6.4.2 空闲链表 1、空闲盘块链 2、空闲盘区链 6.4.3 位示图 1、位示图的表示 2、存储空间的分配 3、存储空间的回收 4、位示图法的优缺点 6.4.4 成组链接 1、空闲盘块的组织 plus 个人理解图…

上海亚商投顾:沪指震荡调整跌0.21% 两市成交金额不足8000亿

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪 三大指数今日震荡调整,上证50午后一度跌超1%,以保险为首的权重板块走低。军工股逆市大涨&a…

Python基本数据类型之一——set(集合)

Python基本数据类型之一——set(集合) 一、python集合定义 集合(set)是一个无序不重复元素的序列。基本功能是进行成员关系测试和删除重复元素。 二、创建方式 在Python中,创建集合有两种方式: 一种是用一对大括号将多个用逗号分隔的数据括起来。 另一种…

【周末闲谈】超越ChatGPT?科大讯飞星火认知大模型

个人主页:【😊个人主页】 系列专栏:【❤️周末闲谈】 ✨第一周 二进制VS三进制 ✨第二周 文心一言,模仿还是超越? ✨第二周 畅想AR 文章目录 前言星火名字的由来科大讯飞星火落地应用演示赶超ChatGPT的底气在哪里?“硬…

如何使用sbvadmin进行私有化部署的代码开发

前言 本文主要讲述如何使用sbvadmin进行私有化部署的代码开发,这里我们用的私有化仓库是gitee,当然你也可以用自己搭建的gitlab来做,原理差不多。 一、新建仓库 1.后端api 导入后端仓库:https://github.com/billyshen26/sbvadmi…

搭建Redis主从集群+哨兵+代理predixy

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Redis是什么?二、搭建Redis集群步骤1.环境和版本2.Redis 安装部署3.主从同步配置4.哨兵模式配置5.代理predixy配置 总结 前言 提示&#xff1a…

SpringSecurity框架学习与使用

SpringSecurity框架学习与使用 SpringSecurity学习SpringSecurity入门SpringSecurity深入认证授权自定义授权失败页面权限注解SecuredPreAuthorizePostAuthorizePostFilterPreFilter 参考 SpringSecurity学习 SpringSecurity入门 引入相关的依赖,SpringBoot的版本…