gpt4 book ai didi

ada - 在Ada中,声明特定的子类型似乎是通用的做法,但是为什么呢?

转载 作者:行者123 更新时间:2023-12-02 11:26:17 25 4
gpt4 key购买 nike

this question中,我询问了如何为范围定义一个无限的上限(结果是答案很明显,但对于Ada的新手来说不是)。在答案中,建议为此创建一个特定的子类型。

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

Type Speed is Float range 0 .. Float'Last

此外,我注意到该Ada项目中的很大一部分代码具有特定的类型-像 Feet_FloatMeters_Float等。与仅将范围约束放在类/包中的基本 float成员变量上相反,为什么这是首选做法?

最佳答案

Ada不喜欢子类型-Ada程序员喜欢。

新类型和子类型(它们是不同的,并且都有其用途)可以以很少的成本或时间的代价帮助捕获大量错误,这就是为什么好的类型系统过时了的原因。

例如,认识到任何数组的索引都属于一个子类型(可能是匿名的,但可以像myArray'rangefor i in myArray'range loop ... end loop;中那样作为subtype myIndextype is myArray'range; theIndex : myIndextype;访问,并且您会看到,曾经写过的每个缓冲区溢出漏洞-或攻击-都只是类型错误-或本来可以在艾达。

当您遇到编译器的错误时,您的可执行文件第一次出现Exception : Constraint_Error异常接近错误的情况时,您就会开始了解范围受约束的类型的值。

为了进一步说明这一点,我将介绍另外两个问答。

首先请注意,除非您像第一个示例中所述在命令行(或项目文件)上添加了几个可选标志,否则您可能正在使用的编译器Gnat可能并不严格符合Ada。默认情况下,最新版本已将其中一些打开。

这是subtype being declared, used and going out of visible scope,的示例(在declare块中,子类型的范围直到运行时才是未知的。与许多动态类型的语言不同,这既快速又安全,因为相关的存储通常在堆栈上,如果您对实现细节感兴趣。

还有一个how not to use a declare block.的例子

这是not only declaring subtypes but telling the compiler how to pack them in storage的极端示例。在嵌入式编程中很常见,要么空间狭窄(我在具有1kbyte内存的处理器中拥有完整的数字 watch !),要么用于访问硬件寄存器中的特定位。 (请注意,如果将本示例更新为使用Ada-2012 aspects,它将更加简洁。)

这个问答将简要介绍difference between new types and subtypes,该语言来自Java。 (令我有些失望的是,没有Java专家在关闭答案之前就解决了所有问题,并描述了他们将如何处理相同的问题)

关于ada - 在Ada中,声明特定的子类型似乎是通用的做法,但是为什么呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47445579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com