C 和 C++ 标准对假设的三元硬件架构的适应性如何
How adaptible are the C and C++ standards to a hypothetical ternary hardware architecture?
用C或C++编写三元计算机有多容易?
显然,标准的逻辑运算符(如&
、|
和^
)只有在使用二进制逻辑时才有意义。
对于整数值,C 标准是指值范围,而 C++ 标准提到位长度(例如,long 必须至少为 32 位长)。这将如何应用于使用三元位(即三元位)的计算机?
一般来说,使用稍微修改的 C/C++ 版本在三元架构上进行编程是否可行,或者您应该从头开始设计一种新的编程语言?
需要考虑的重要点是向后兼容性(假设二进制的程序是否可以轻松地为三元架构编译,或者是否需要模拟二进制数据存储?)以及C/C++标准设计中隐含的假设。
C++标准的措辞假定为二进制架构:
[简介记忆]/1:
C++内存模型中的基本存储单元是字节。一个 字节至少足够大,可以包含基本的任何成员 执行字符集和 Unicode UTF-8 编码形式,由连续序列组成 位,其数量由实现定义。
[基础/基本]/4:
无符号整数应遵循算术模定律 2 [提出 ] n 的幂,其中 n 是值中的位数 表示该特定大小的整数。
此外,位域和填充位是常用的概念。
左移、右移等运算符也指位,而按位和、按位或和按位异或根据定义是在位级别操作的操作,假设每个位为真或假。
如果该标准适应三元架构会怎样?
我们可以想象,该标准可以使用另一个术语来指定架构中最小的信息,其方式与对字节所做的方式类似(字节,尽管大多数情况下标准中没有定义8位,因此该标准可以很好地与具有10位字节的机器一起使用)。
然而,后果将是可怕的:
-
例如,在许多算法中假设左移乘以 2 的幂,突然间,它会乘以 3 的幂。 右移也一样。 因此,许多现有代码将不再工作。
-
按位运算不是为 trit 定义的:它们只为二进制位定义。 因此,标准必须以某种方式重新定义它们(例如,通过用某种 2 数学的力量模拟原始行为)。 同样,如果与移位结合使用,某些现有代码可能会被破坏。
补充说明
自从诺伯特·维纳(Norbert Wiener)于1948年出版了有远见的著作">控制论"(!!),毫无疑问,二进制系统的替代品是无用的。 在"计算机和神经系统"一章中,他很好地解释了为什么数值机器比模拟机器更准确和更高性能,并且在数值机器中,二进制算术的性能优于其他机器,因为它更简单、更快,而且更容易和更便宜实现。 目前,没有人能证明相反的情况,所以很快就会看到三元计算机架构。
评论
Peter在评论中指出,实现只需要提供C++标准中定义的抽象机器的指定行为。 根据[intro.abstract]/5,这是正确的。 但我的观点是,从三元机器的角度来看,这只是一个理论真理。
二进制模型在标准的许多地方都是一个如此强烈的假设,并且与寻址方案交织在一起,我将假装不可能在三元机器上以高效和一致的方式进行模拟。
只是为了说明字节定义的问题:它需要 6 个 trit 才能满足一个字节的要求。 但是,6 个 trits 对应于 9,5 位。 为了使字节对应于标准要求的连续位数,您需要将其设置为s trits,以便pow(3,s)== pow(2,n)。这个方程没有解。 或者,你可以说一个字节是存储成6个三重的9位,你只是忽略了一些三元值。但是,由于字节用于存储指针,因此您也会忽略某些内存范围。因此,您需要一个映射函数来转换以字节为单位存储的值和计算机地址。 但是硬件对齐约束呢?这些可能与可以根据二进制模型表示的对齐方式等不对应...... 最后,您需要一个通过软件完全模拟二进制架构的慢速虚拟机(当然具有与x86架构上的许多MIPS仿真器相同的性能水平,因此可以用于教育目的)。 我认为这可以符合标准,但不再是我们的性能预期。
- 如果编译的源代码是特定于它编译的硬件的,我们如何分发它
- 如何编写一个使用n倍三元条件语句的C++布尔函数
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- FFmpeg——使用硬件加速进行视频解码
- 三元运算符和 if constexpr
- 有关图像处理应用程序的硬件和软件安全性的建议
- 在 c++ 中三元运算符中不允许继续(关键字)吗?
- HAL 中的硬件特定库
- 我们能否在stm32f中使用硬件定时器控制两个独立的进程
- 三元运算符在返回语句中给出意外的结果
- Boost Spirit x3 条件(三元)运算符解析器
- 为什么用三元初始化类会导致双重释放?
- 如何有效地找到数组中三元组和的最小差异?
- 递归中三元运算符的奇怪行为
- 硬件抽象层 (HAL) 中实现的动态切换
- 如何在三元条件运算符中添加换行符和连接? :在 C++ 中
- 错误:三元运算符无法在对象中正常工作"cout"
- 需要实例化不同类/对象并在启动时确定的硬件插槽的设计模式
- 是否允许三元运算符在C++中计算两个操作数?
- C 和 C++ 标准对假设的三元硬件架构的适应性如何