Ada 永远不要使用预定义的实类型?

Ada 永远不要使用预定义的实类型?,ada,safety-critical,Ada,Safety Critical,我开始通过阅读来学习Ada语言。 第3.8章中说: Ada程序员从不使用预定义的实数类型 安全关键、生产质量软件 我想知道这到底意味着什么,我应该怎么做而不是使用预定义的实类型。这是否意味着我不能使用整数?这意味着您应该“始终”[*]定义与您的问题匹配的类型 [*]如果您的问题包括处理字符串,建议您使用标准的字符串类型(以及正数索引)。还有其他类似的例外情况,但除非您能解释为什么要使用预定义类型,否则不要这样做。这意味着您应该“始终”[*]定义与您的问题匹配的类型 [*]如果您的问题包括处理字符

我开始通过阅读来学习Ada语言。 第3.8章中说:

Ada程序员从不使用预定义的实数类型 安全关键、生产质量软件

我想知道这到底意味着什么,我应该怎么做而不是使用预定义的实类型。这是否意味着我不能使用整数?

这意味着您应该“始终”[*]定义与您的问题匹配的类型

[*]如果您的问题包括处理字符串,建议您使用标准的
字符串
类型(以及
正数
索引)。还有其他类似的例外情况,但除非您能解释为什么要使用预定义类型,否则不要这样做。

这意味着您应该“始终”[*]定义与您的问题匹配的类型

[*]如果您的问题包括处理字符串,建议您使用标准的
字符串
类型(以及
正数
索引)。还有其他类似的例外情况,但除非您能解释为什么要使用预定义类型,否则请不要这样做。

在我看来,“从不”太过强烈了

“从不使用安全关键软件”完全是另一回事,而意见(尤其是我的意见)并不重要

对于非关键代码(我的大多数编程都是非关键的,我使用Ada只是因为调试C花费了我太长的时间),预定义的类型是可以的,但是定义自己的类型真的不需要任何时间

为了学习Ada,请使用(玩)定义自己的实数和整数类型,看看它是如何工作的。特别是对于整数类型,要习惯数组索引的特殊类型,以消除缓冲区溢出和边界错误

但是,在学习语言的其他方面时,您可以将预定义类型用于多种目的,以节省精力并专注于您想要学习的内容

但是,如果你的Ada计划可能导致某人致残或死亡,或损失大笔金钱,那么请忽略上述内容,听从“Ada”的建议。

在我看来,“永远”是太强烈了

“从不使用安全关键软件”完全是另一回事,而意见(尤其是我的意见)并不重要

对于非关键代码(我的大多数编程都是非关键的,我使用Ada只是因为调试C花费了我太长的时间),预定义的类型是可以的,但是定义自己的类型真的不需要任何时间

为了学习Ada,请使用(玩)定义自己的实数和整数类型,看看它是如何工作的。特别是对于整数类型,要习惯数组索引的特殊类型,以消除缓冲区溢出和边界错误

但是,在学习语言的其他方面时,您可以将预定义类型用于多种目的,以节省精力并专注于您想要学习的内容


然而,如果你的Ada程序可能会伤残或杀害某人,或损失大笔金钱,那么请忽略上述内容,听从“Ada蒸馏”的建议。

我不确定作者的想法,我希望他能解释清楚。我个人讨厌没有任何解释的规则,希望读者简单地接受它为“公认的智慧”。(对作者没有任何异议——我知道他是个好人。)

也就是说,以下是我的想法:

Ada的第一个版本Ada 83表示,有预定义的
Integer
Float
类型,实现可能提供其他类型,如
Long\u Integer
Long\u Float
。不过,该语言并没有对实现的定义设置任何界限。理论上,一个实现可以提供一个2位宽的
整数
类型,只保存从-2到+1的值。(这对编译器销售不利,但会符合语言定义。)因为无法保证预定义类型足够大或(对于浮点)足够精确以满足程序的需要,鼓励程序员始终定义自己的整数和浮点类型,以指定所需的范围和精度

Ada 95增加了一些限制:
Integer
必须保持至少在-32768..32767范围内的值,
Float
必须支持精度为6位的十进制数字,如果实现支持精确的浮点数字。因此,避免使用预定义类型的一些动机已经消失了。如果您的计算不需要超过6位的精度,那么
Float
应该可以。如果
Float
的精度低于6位数字,那么该实现根本无法支持6位数字,而且您也无法通过定义自己的Float来做得更好。因此,如果您知道永远不需要迁移到其他编译器,您可能就可以了

不过,您可能会遇到整数类型不会出现的可移植性问题。如果
整数
变量永远不会保存范围-32768..32767以外的值,那么从一台具有16位
整数
类型的计算机移动到另一台具有24位
整数
或32位
整数
或其他类型的计算机时,您不应该遇到任何问题——计算应该是相同的。但我不能对浮点数说同样的话。浮点舍入意味着,如果将程序移动到
Float
为64位IEEE浮点的机器上,则在
Float
为32位IEEE浮点的情况下,该程序的行为可能会有所不同,反之亦然。如果您有一个程序,并且您的32位浮点突然全部更改为64位浮点,则需要非常彻底地重新测试它。有些东西很有可能会坏掉

但是,如果您定义自己的浮点类型,您应该可以,至少如果您将实现限制在使用IEEE浮点的实现上。(这是当今的大多数机器,尽管可能还有一些VAX使用自己的浮点格式。如果有,我不会感到惊讶