C 和 C++ 标准对假设的三元硬件架构的适应性如何?
How adaptible are the C and C++ standards to a hypothetical ternary hardware architecture?
用 C 或 C++ 编写三元计算机有多容易?
显然,标准逻辑运算符(如 &
、|
和 ^
)仅在使用二进制逻辑时才有意义。
对于整数值,C 标准指的是值范围,而 C++ 标准指的是位长度(例如 long 必须至少为 32 位长)。这如何适用于使用 trits(即三进制位)的计算机?
一般来说,使用略微修改的 C/C++ 版本在三元体系结构上编程是否实用,或者您是否应该从头开始设计一种新的编程语言?
需要考虑的重点是向后兼容性(二进制假设程序是否可以很容易地为三元体系结构编译,或者是否需要模拟二进制数据存储?)和[=23 设计中隐含的假设=]++标准。
C++ 标准的措辞假定二进制架构:
[intro.memory]/1:
The fundamental storage unit in the C++ memory model is the byte. A
byte is at least large enough to contain any member of the basic
execution character set and the eight-bit code units of the
Unicode UTF-8 encoding form and is composed of a contiguous sequence
of bits, the number of which is implementation-defined.
[basic/fundamental]/4:
Unsigned integers shall obey the laws of arithmetic modulo 2 [raised
to the power of] n where n is the number of bits in the value
representation of that particular size of integer.
此外,位字段和填充位是经常使用的概念。
左移、右移等运算符也指的是位,按位与、按位或和按位异或根据定义是在位级别运行的运算,假设每个位为真或假.
如果标准适用于三元架构会怎么样?
我们可以想象该标准可以使用另一个术语来指定体系结构中最小的信息片段,其方式与 byte(字节尽管标准中通常没有定义 8 位,因此该标准可以很好地与具有 10 位字节的机器一起使用。
然而后果很严重:
例如,左移在许多算法中假设为乘以 2 的幂,突然间,它将乘以 3 的幂。右移也是如此。因此,许多现有代码将不再起作用。
位运算没有为 trits 定义:它们只为二进制位定义。因此,标准必须以某种方式重新定义它们(例如,通过使用某种 2 的数学幂来模拟原始行为)。同样,一些现有代码有可能被破坏,特别是如果与班次结合使用。
补充说明
自从 Norbert Wiener 的有远见的书“控制论”于 1948 年出版 (!!!) 以来,毫无疑问,二进制系统的替代品是 nout。在“计算机器和神经系统”一章中,他很好地解释了为什么数值机器比模拟机器更准确和性能更高,并且在数值机器中,二进制算法优于其他机器因为它更简单、更快,而且 easier and cheaper to implement。暂时还没有人实现相反的证明,所以短期内看不到三元计算机体系结构。
评论
Peter 在评论中指出,实现只需提供 C++ 标准中定义的抽象机的指定行为。根据 [intro.abstract]/5,这是正确的。但我的观点是,这只是三元机的理论真理。
二进制模型在标准的许多地方都是如此强大的假设,并且与寻址方案交织在一起,我会假装不可能以有效和一致的方式模拟三元机.
只是为了说明字节定义的问题:它需要 6 个 trits 才能满足一个字节的要求。然而,6 个 trits 对应于 9,5 位。为了使一个字节对应于标准要求的连续位数,您需要它是 s trits,以便 pow(3,s) == pow(2,n)。这个方程没有解。或者你可以说一个字节是 9 位存储到 6 个 trits 并且你只是忽略一些三元值。但是由于字节用于存储指针,您还会忽略一些内存范围。所以你需要一个映射函数来在字节和机器地址中存储的值之间进行转换。但是硬件对齐约束又如何呢?这些可能不对应于可以根据二进制模型等表达的对齐方式......最后你需要有一个慢速虚拟机,它可以通过软件完全模拟二进制架构(肯定具有与x86 架构上的许多 MIPS 仿真器,因此可以用于教育目的)。我认为这可能符合标准,但不再是我们的性能预期。
用 C 或 C++ 编写三元计算机有多容易?
显然,标准逻辑运算符(如 &
、|
和 ^
)仅在使用二进制逻辑时才有意义。
对于整数值,C 标准指的是值范围,而 C++ 标准指的是位长度(例如 long 必须至少为 32 位长)。这如何适用于使用 trits(即三进制位)的计算机?
一般来说,使用略微修改的 C/C++ 版本在三元体系结构上编程是否实用,或者您是否应该从头开始设计一种新的编程语言?
需要考虑的重点是向后兼容性(二进制假设程序是否可以很容易地为三元体系结构编译,或者是否需要模拟二进制数据存储?)和[=23 设计中隐含的假设=]++标准。
C++ 标准的措辞假定二进制架构:
[intro.memory]/1:
The fundamental storage unit in the C++ memory model is the byte. A byte is at least large enough to contain any member of the basic execution character set and the eight-bit code units of the Unicode UTF-8 encoding form and is composed of a contiguous sequence of bits, the number of which is implementation-defined.
[basic/fundamental]/4:
Unsigned integers shall obey the laws of arithmetic modulo 2 [raised to the power of] n where n is the number of bits in the value representation of that particular size of integer.
此外,位字段和填充位是经常使用的概念。
左移、右移等运算符也指的是位,按位与、按位或和按位异或根据定义是在位级别运行的运算,假设每个位为真或假.
如果标准适用于三元架构会怎么样?
我们可以想象该标准可以使用另一个术语来指定体系结构中最小的信息片段,其方式与 byte(字节尽管标准中通常没有定义 8 位,因此该标准可以很好地与具有 10 位字节的机器一起使用。
然而后果很严重:
-
例如,
左移在许多算法中假设为乘以 2 的幂,突然间,它将乘以 3 的幂。右移也是如此。因此,许多现有代码将不再起作用。
位运算没有为 trits 定义:它们只为二进制位定义。因此,标准必须以某种方式重新定义它们(例如,通过使用某种 2 的数学幂来模拟原始行为)。同样,一些现有代码有可能被破坏,特别是如果与班次结合使用。
补充说明
自从 Norbert Wiener 的有远见的书“控制论”于 1948 年出版 (!!!) 以来,毫无疑问,二进制系统的替代品是 nout。在“计算机器和神经系统”一章中,他很好地解释了为什么数值机器比模拟机器更准确和性能更高,并且在数值机器中,二进制算法优于其他机器因为它更简单、更快,而且 easier and cheaper to implement。暂时还没有人实现相反的证明,所以短期内看不到三元计算机体系结构。
评论
Peter 在评论中指出,实现只需提供 C++ 标准中定义的抽象机的指定行为。根据 [intro.abstract]/5,这是正确的。但我的观点是,这只是三元机的理论真理。
二进制模型在标准的许多地方都是如此强大的假设,并且与寻址方案交织在一起,我会假装不可能以有效和一致的方式模拟三元机.
只是为了说明字节定义的问题:它需要 6 个 trits 才能满足一个字节的要求。然而,6 个 trits 对应于 9,5 位。为了使一个字节对应于标准要求的连续位数,您需要它是 s trits,以便 pow(3,s) == pow(2,n)。这个方程没有解。或者你可以说一个字节是 9 位存储到 6 个 trits 并且你只是忽略一些三元值。但是由于字节用于存储指针,您还会忽略一些内存范围。所以你需要一个映射函数来在字节和机器地址中存储的值之间进行转换。但是硬件对齐约束又如何呢?这些可能不对应于可以根据二进制模型等表达的对齐方式......最后你需要有一个慢速虚拟机,它可以通过软件完全模拟二进制架构(肯定具有与x86 架构上的许多 MIPS 仿真器,因此可以用于教育目的)。我认为这可能符合标准,但不再是我们的性能预期。