丹grytsku |dreamstime.com.
程序员促销

那么,什么是ADA?

2021年5月27日
当将Ada与C进行比较时,它们在速度和内存效率方面是相似的。是什么让他们与众不同?

本文是其中的一部分嵌入式软件系列:ADA为嵌入式C开发人员

作为标题说明:什么是ADA?

要回答这个问题,让我们将ADA介绍,因为它比较嵌入式应用程序。C开发人员习惯于某种编码语义和规划风格。特别是在嵌入式域中,开发人员用于在硬件附近的一个非常低的级别工作,直接操纵内存和寄存器。

普通操作包括对指针的数学操作、复杂的位移位和按位逻辑操作。C是为这类操作精心设计的,因为它是一种低级语言,旨在取代汇编语言,实现更快、更高效的编程。由于这种最小的抽象,程序员必须对表示他们试图使用编程语言解决的问题的数据进行建模。

在这里,我们在c中有一段代码(图。1)在Ada.(图2)从命令行获取一些数字并将它们存储在数组中。然后,我们将所有值淘汰数组中并打印结果。棘手的部分是我们正在使用模型以度的角度的值。我们知道角度是模块化的类型,这意味着大于360°的角度也可以表示为角度MOD 360.因此,如果我们的角度为400°,则这相当于40°。

图1:这段C代码从命令行获取一些数字,并将它们存储在一个数组中。

// main.c #include  #include  #define degle_max(360)Typedef以学位为单位;#define mod_degrees(x)(x%deples_max)度add_angles(度*列表,int长度){degres sum = 0;for(int i = 0; i 
                        

图2:这段Ada代码还从命令行中获取一些数字,并将它们存储在一个数组中。

——sum_angles。亚行Ada.Command_Line;使用Ada.Command_Line;Ada.Text_IO;使用Ada.Text_IO;程序Sum_Angles是DEGREES_MAX:常量:= 360;type Degrees is mod DEGREES_MAX;type Degrees_List是Degrees的数组(自然范围<>);函数Add_Angles(List: Degrees_List)返回的角度和:度:= 0;Sum:= Sum + List(I); end loop; return Sum; end Add_Angles; List : Degrees_List (1 .. ArgumentCount); begin for I in List’Range loop List(I) := Degrees(Integer'Value(Argument(I))); end loop: Put_Line("Sum:” & Add_Angles(List)'Img); end Sum_Angles;

用于C.的建模

要在C中模拟此行为,我们必须创建执行模数操作的mod_degrees宏。当我们从命令行读取值时,我们将它们转换为整数并在将它们存储到数组之前执行模数。然后调用add_angles,返回数组中值的总和。你能发现C代码的问题吗?

尝试使用输入序列340 2 50 70运行ADA和C示例。C程序输出是什么?ADA计划输出是什么?他们为什么不同?

C代码的问题是我们忘记调用add_angles的for循环中的mod_degrees。这意味着add_angles可以返回大于degle_max的值。

ADA版本

现在让我们看看等效的Ada代码,看看Ada是如何处理这种情况的。我们在Ada代码中做的第一件事是创建类型Degrees,这是一个模块化类型。这意味着编译器将处理求模操作的执行。如果我们在Add_Angles函数中使用同样的for循环,我们可以看到,我们没有做任何特殊的事情来确保我们的结果值在我们需要的360°范围内。

从这个例子中得到的启示是,Ada试图从开发人员那里抽象出一些概念。因此,开发人员可以使用为真实世界建模的数据模型来解决手头的问题,而不是使用硬件规定的数据类型。这样做的主要好处是编译器承担了开发人员生成正确代码的一些责任。

在此示例中,我们忘记在C代码中查看。编译器在ADA代码中插入了我们的支票,因为我们告诉编译器我们试图通过定义强类型来实现的。

功率或准确度或两者?

理想情况下,我们希望C编程语言能够赋予我们所有的能力来操纵我们正在工作的硬件,同时使我们能够以一种安全的方式更准确地建模数据。因此,我们进退两难:什么可以给我们像C语言那样强大的操作能力,但也可以为我们提供最小化开发人员错误的功能?因为这门课是关于Ada的,所以我们很有可能会介绍Ada语言作为这个问题的答案。

与C不同,ADA语言被设计为概念的更高级别语言,对编译器提供更多责任来生成正确的代码。如上所述,利用C,开发人员在存储器指针上不断地移动,屏蔽和访问位。在ADA中,所有这些操作都是可能的。但是,在大多数情况下,使用更高级构造的更好的方法来执行这些操作,这些操作不太容易出错,如OFF-ONE或无意的缓冲区溢出。

如果我们将使用C编写的同一个应用程序与使用高级构造的Ada编写的应用程序进行比较,就速度和内存效率而言,我们将看到类似的性能。如果我们比较两个编译器生成的目标代码,它们甚至可能看起来完全相同!

从中阅读更多嵌入式软件系列:ADA为嵌入式C开发人员

来自我们的合作伙伴

权力完整性特征信心

价格适合任何预算,WaveSurfer 4000HD有更多的能力,比你想象的分析电力轨道,功率排序,和电源管理…

USB Type-C™和USB PD控制器,具有集成电源开关

TPS65987D USB Type-C®和USB PD控制器,具有集成源和宿电源路径支持USB3和备用模式数据表(Rev. C)

协处理器架构:用于快速原型设计的嵌入式系统架构

2021年7月6日
编者注:尽管它以数字处理性能和吞吐量而闻名,但协处理器体系结构提供了嵌入式系统…

USB Type-C®和USB电力交付

我们广泛提供USB Type-C®设备和用于USB PD功能的PD控制器,提供了设计和拆除所需的灵活性和集成。

了解DIN外壳的好处

由...赞助。DIN外壳广泛用于欧洲,在全球各种OEM系统中使用。这些外壳可以......

声音你的意见!

本网站要求您注册或登录以发表评论。
尚未添加任何评论。想要开始对话?

来自我们的合作伙伴

权力完整性特征信心

价格适合任何预算,WaveSurfer 4000HD有更多的能力,比你想象的分析电力轨道,功率排序,和电源管理…

USB Type-C™和USB PD控制器,具有集成电源开关

TPS65987D USB Type-C®和USB PD控制器,具有集成源和宿电源路径支持USB3和备用模式数据表(Rev. C)

协处理器架构:用于快速原型设计的嵌入式系统架构

编者注:尽管它以数字处理性能和吞吐量而闻名,但协处理器体系结构提供了嵌入式系统…

USB Type-C®和USB电力交付

我们广泛提供USB Type-C®设备和用于USB PD功能的PD控制器,提供了设计和拆除所需的灵活性和集成。
机器人

来自构造的基本ROS 2课件

1月3日,2022年
这一系列视频提供了机器人操作系统2的概述。
机器人

机器人醒来了

2021年12月29日
这种铰接式机器人由工程艺术公司(Engineered Arts)发明,能够模仿人类的情感。
Baidu