0

我正在考虑将语言(本土 DSL)转换为 C 与 C++ 的问题。

我已经有 15 年没有做过任何“原生”编程了,所以我想检查一下我的假设。

我是否正确假设转换为最新的 C++ 版本 (17) 将使本机编译器能够使用更广泛的“现代”英特尔/AMD CPU 指令,从而产生更高效的可执行文件(除了多线程/内存-model 是 C++ 的一部分,它本身似乎是选择 C++ 的充分理由)?

换句话说,C 编译器从未生成过大部分“更新的”CPU 指令,仅仅是因为 C 的语法更简单,它关于程序员意图的信息太少了吗?我知道我可以使用汇编程序访问所有 CPU 指令,但这正是我不想做的。理想情况下,我希望生成的代码仍然尽可能独立于平台。

4

1 回答 1

6

您对编程语言和“现代 CPU 指令”之间关系的所有假设都是不正确的。

让我们考虑一下 GNU 编译器集合。

这里语言的选择并不重要,因为语言前端最终都会生成相同的中间形式,称为 GIMPLE。然后优化过程会处理这个问题。

可以发出的 CPU 指令的范围由-mtune选项控制。对于 x86,GCC 在优化一些看起来很简单的 C 代码时能够发出现代 AVX 512 指令。自动循环矢量化是一个强大的东西。试试看:实现memcpy并查看生成的程序集。

我的建议:生成干净、不聪明的 C 代码,并提高优化级别。就像手动编写代码一样。

您也可以考虑将您的语言直接实现为 GCC 或 LLVM 的前端,而无需转译为 C 或 C++。LLVM 就是为此目的而设计的,旨在使新语言的实现变得容易,并且仍然利用现代优化方法。

于 2016-12-30T11:44:24.633 回答