在Ada中,声明特定子类似乎是一般做法,但为什么呢?

the*_*yer 5 ada

这个问题中,我问如何定义一个范围的无限上限(事实证明答案是相当明显的,但不是对Ada的新人).在答案中,建议为此创建一个特定子类型.

问题中提到的类型的特定子类型如下所示:

Type Speed is Float range 0 .. Float'Last
Run Code Online (Sandbox Code Playgroud)

另外,我注意到这个Ada项目中的很大一部分代码都有特定的类型 - 比如Feet_Float等等Meters_Float.为什么这是首选的做法,而不是只float在类/包中的基本成员变量上放置范围约束?

Bri*_*ond 8

Ada不喜欢亚型 - Ada程序员这样做.

新的类型和子类型(它们是不同的,都有它们的用途)有助于在如此少的成本或时间损失下捕获如此多的错误,这是一个谜,为什么好的类型系统到目前为止已经过时了.

例如,要认识到任何数组的索引都属于一个子类型(可能是匿名的,但是可以访问myArray'range,for i in myArray'range loop ... end loop;或者subtype myIndextype is myArray'range; theIndex : myIndextype;你会看到每个缓冲区溢出漏洞 - 或者攻击 - 只是一个类型错误 - 或者可能是,在阿达.

当你通过编译器得到一个错误时,第一次你的可执行文件以一个Exception : Constraint_Error怪异的指针接近错误而崩溃时,你将开始了解范围约束类型的值.

为了扩展这一点,我将提到更多的问答.

首先请注意,您可能正在使用的编译器Gnat可能不是严格遵守Ada,除非您在命令行(或项目文件)中添加了几个可选标志,如第一个示例中所述.最近的版本默认启用了其中一些版本.

这是一个被声明,使用和走出可见范围子类型的例子(在一个declare块中,子类型的范围在运行时是未知的.与许多动态类型语言不同,这既快又安全,因为相关存储如果您对实现细节感兴趣,通常会在堆栈中.

以及如何不使用声明块的示例.

这是一个极端的例子,不仅声明子类型,而且告诉编译器如何将它们打包到存储器中.嵌入式编程中常见的,无论是空间紧张(我在具有1kbyte内存的处理器中都有完整的数字手表!)或者用于访问硬件寄存器中的特定位.(请注意,如果更新为使用Ada-2012,此示例将更清晰aspects.)

此问答简要介绍了来自Java的新类型和子类型之间区别.(我有点失望的是,Java专家在关闭之前没有回答任何问题,描述了他们如何处理相同的问题)


Jim*_*ers 5

声明特定类型有以下好处:

  • 特定类型可防止抽象的不当混合。例如,将以米为单位的月球和地球之间的距离除以以欧元表示的比利时国民生产总值。
  • 类型的名称更清楚地记录了类型的预期用途
  • 范围类型的使用清楚地记录了类型实例的有效值。


Jef*_*ter 5

Ada中的范例是在解决方案中对问题建模。这一方面的一个方面是使用适当的标量类型和子类型定义对问题空间中值的范围,准确性和精度进行建模。

为什么要这样做?麦考密克在分析为什么具有C经验但没有Ada经验的学生能够在Ada上完成其实时软件课程的项目却在C中却无法完成时发现,Ada最重要的功能是

标量对象的建模。

  • 强大的打字能力。
  • 范围约束。
  • 枚举类型。

麦考密克的论文

麦考密克的网站