C 和 C++ 标准对假设的三元硬件架构的适应性如何

How adaptible are the C and C++ standards to a hypothetical ternary hardware architecture?

本文关键字:硬件 三元 适应性 标准 C++ 假设      更新时间:2023-10-16

用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仿真器相同的性能水平,因此可以用于教育目的)。 我认为这可以符合标准,但不再是我们的性能预期。