Ada -- 啥是模块化类型

Posted

技术标签:

【中文标题】Ada -- 啥是模块化类型【英文标题】:Ada -- What Is A Modular TypeAda -- 什么是模块化类型 【发布时间】:2014-06-14 06:13:47 【问题描述】:

我正在努力学习 Ada,但资源很难。我一直在阅读这个主题,但所有的解释对我来说都很难理解。经常看到这样的代码

type Stream_Element is mod 2 ** Standard'Storage_Unit;

这是做什么的?我找到了解释here:

Ada 还允许您定义模块化类型。这些类型是无符号的并且具有“环绕” 语义。超出普通类型的末尾会导致异常,但递增 超出模块化类型的末尾会回绕为零。此外,运算符 not 和, or, 和 xor 可用于模块化类型进行按位操作。图 11 演示。

这个解释有道理,但我不明白代码。 mod 2 ** X 有什么意义? mod 是干什么用的? ** 是做什么的?

【问题讨论】:

【参考方案1】:

** 是幂运算符。也就是说,A**B 表示 AB

mod,在这种情况下,只是您用来告诉它您正在定义模块化类型的语法。在这种情况下,这意味着这是一个整数类型,其值范围从 0 到 2Standard'Storage_Unit - 1。Standard'Storage_Unit 不是由语言定义的,而是由 Ada 编译器定义的您正在使用(该语言允许编译器定义自己的属性);我相信它等于System.Storage_Unit。这是一个常数,它定义了可寻址存储单元中的位数。对于绝大多数处理器,该常数为 8(因为每个地址寻址一个 8 位字节),但也有例外。

所以它的作用是定义一个整数类型,其值范围从 0 到 255(在大多数处理器上),即适合一个字节的整数。由于它是“模块化的”,这也意味着对类型的算术运算会环绕(即,如果添加 130 + 130,您将得到 4,并且不会引发 Constraint_Error)。模块化类型还为它们定义了位运算符andorxor

【讨论】:

补充一点,模块化类型声明的“2 ** X”符号是约定的,不是必需的。本质上,“X”是模块化类型将占用的位数。可以将其拼写为type Mod_Type is mod 256; @MarcC 正确,2**X 只是一个表达式,任何表达式都是允许的,只要它是一个可以在编译时计算的表达式。表达式也不必是 2 的幂;我可以设想有人将类型定义为mod 60 来表示时钟的分针。 (按位的and/or/xor 操作仍然被定义,尽管它们可能不是很有用。)

以上是关于Ada -- 啥是模块化类型的主要内容,如果未能解决你的问题,请参考以下文章

python中啥是模块

Nodejs 异步编程 - 为啥需要“异步”模块?啥是“回调地狱”/“末日金字塔”?

OSGi.NET的啥是OSGi.NET

Python:啥是标头?

web功能模块测试用例(模板)

团队-象棋游戏3-模块开发过程