Compiler construction 机器字原语的非倍数是个好主意吗?

Compiler construction 机器字原语的非倍数是个好主意吗?,compiler-construction,embedded,Compiler Construction,Embedded,假设您有一种类似于常见脚本语言的动态语言,并希望为其编写编译器。为诸如类型标签之类的东西保留一些机器字是个好主意吗?特别是对于微控制器和类似设备,这是一个好主意吗 我可以想到一些优点,比如减少了类型信息的存储,更容易的内存管理,甚至可能是gc,以及更容易的调试。但是,这些能证明普通算术运算或其他需要完整单词的运算的开销是合理的吗?请注意,字节码VM在这方面的性能会差得多,因为有更多的性能开销。所以不要建议它 这不像有些人会为微控制器类硬件编写数字密集型代码,但仍然…必须确保您的类型位不会传递到任

假设您有一种类似于常见脚本语言的动态语言,并希望为其编写编译器。为诸如类型标签之类的东西保留一些机器字是个好主意吗?特别是对于微控制器和类似设备,这是一个好主意吗

我可以想到一些优点,比如减少了类型信息的存储,更容易的内存管理,甚至可能是gc,以及更容易的调试。但是,这些能证明普通算术运算或其他需要完整单词的运算的开销是合理的吗?请注意,字节码VM在这方面的性能会差得多,因为有更多的性能开销。所以不要建议它


这不像有些人会为微控制器类硬件编写数字密集型代码,但仍然…

必须确保您的类型位不会传递到任何计算的额外复杂性可能远远超过任何存储节省。您可以始终在包含任何所需元数据/标志的任何基本字段旁边分配一个类型字段。然后您知道,任何值的存储大小始终为n+1个字,假设您可以使用一个字来存储所需的类型和状态信息。

必须确保类型位不会传递到任何计算,这增加的复杂性可能远远超过任何存储节省。您可以始终在包含任何所需元数据/标志的任何基本字段旁边分配一个类型字段。然后您知道,任何值的存储大小始终为n+1个字,假设您可以使用一个字来存储所需的类型和状态信息。

不,对于通用编译器来说,这绝对不是一个好主意。算术运算中处理类型标记位的开销将非常大

就其本质而言,动态类型语言需要额外的空间来存储每个值的类型信息。如果您必须存储大量同质类型的数据,正确的方法通常是使用C语言设计的本机代码模块


例如,当您想要存储一个由5个整数组成的数组时,Python列表就可以了,它可以存储任意复杂的混合类型。但是如果你想存储一个500万个整数的数组,你应该使用数组模块将它们存储为一个齐次C数组,或者使用NumPy,它做了一些类似的事情,但经过了优化,可以对它们进行大量的数学运算。

不,对于通用编译器来说,这绝对不是一个好主意。算术运算中处理类型标记位的开销将非常大

就其本质而言,动态类型语言需要额外的空间来存储每个值的类型信息。如果您必须存储大量同质类型的数据,正确的方法通常是使用C语言设计的本机代码模块


例如,当您想要存储一个由5个整数组成的数组时,Python列表就可以了,它可以存储任意复杂的混合类型。但是如果你想存储一个500万个整数的数组,你应该使用数组模块将它们存储为一个同质的C数组,或者使用NumPy,它做了一些类似的事情,但经过优化,可以对它们进行大量的数学运算。

这可能取决于你的微控制器有多微

例如,我想在没有尝试过的情况下,手臂核心上的桶形移位器和/或装载/存储时可以使用的免费面具将使处理这些旗帜的成本相当合理。很明显,这是全班最热门的话题,但是ARM现在确实无处不在


LISP使用类型标志,表示fixnum小于一个单词。因此,如果您能找到适合您所关心的处理器的LISP实现,您可以查看它们如何最大限度地降低成本,以及它们的最大努力是否能满足您的要求。

这可能取决于微控制器的微型程度

例如,我想在没有尝试过的情况下,手臂核心上的桶形移位器和/或装载/存储时可以使用的免费面具将使处理这些旗帜的成本相当合理。很明显,这是全班最热门的话题,但是ARM现在确实无处不在

LISP使用类型标志,表示fixnum小于一个单词。因此,如果您能找到适合您所关心的处理器的LISP实现,您可以查看它们如何最大限度地降低成本,以及它们的最大努力是否能满足您的要求。

芯片在硬件中直接标记了算术功能,这是专为此类应用程序设计的。我还看到了对具有此功能的其他体系结构的引用。另一个问题是,它们在实践中的使用范围有多广——大多数动态语言(如Python)都是为可移植性而构建的,因此在您的体系结构中没有依赖它的选项

我想以前的smalltalks是用小整数来实现的 ers-高达某个值的是一个int,超过阈值的是一个对象指针。

芯片直接在硬件中标记了算术设施-专为此类应用而设计。我还看到了对具有此功能的其他体系结构的引用。另一个问题是,它们在实践中的使用范围有多广——大多数动态语言(如Python)都是为可移植性而构建的,因此在您的体系结构中没有依赖它的选项


我认为较旧的smalltalks使用小整数来实现这一点,最大值为int,超过阈值的是对象指针。

一方面,如果您希望编译的代码直接测试每个操作的标志,那么它会很慢,原因与解释的字节码很慢相同。也许没有字节码那么慢,但阿姆达尔定律会对你不利

另一方面,完全动态语言的简单编译器无论如何都需要进行某种形式的类型检查。动态调度的普遍使用将对现代处理器造成严重的性能损失,尽管对微控制器来说可能没有那么严重


如果您的编译器能够优化掉上述大部分运行时类型检查,那么您就可以恢复性能。然而,实现这一点可能既不直接也不简单。我的猜测是,在这种情况下,您可能希望避免位标志,因为所需的屏蔽只是不必要的工作。

一方面,如果您希望编译的代码直接测试每个操作的标志,那么它会很慢,原因与解释的字节码很慢相同。也许没有字节码那么慢,但阿姆达尔定律会对你不利

另一方面,完全动态语言的简单编译器无论如何都需要进行某种形式的类型检查。动态调度的普遍使用将对现代处理器造成严重的性能损失,尽管对微控制器来说可能没有那么严重

如果您的编译器能够优化掉上述大部分运行时类型检查,那么您就可以恢复性能。然而,实现这一点可能既不直接也不简单。我的猜测是,在这种情况下,您可能希望避免位标志,因为所需的屏蔽只是不必要的工作