转译为 C 与 C++:CPU 指令范围
Transpiling to C vs C++ : range of CPU instructions
我正在考虑将一种语言(本土 DSL)转译为 C 与 C++ 的问题。
我已经 'native' 超过 15 年没有做过任何编程,所以我想检查一下我的假设。
我假设转换到最新的 C++ 版本 (17) 将使本机编译器能够使用范围更广的 'modern' Intel/AMD CPU 指令是否正确,结果在更高效的可执行文件中(除了 C++ 的多线程/内存模型部分,它本身似乎已经是使用 C++ 的充分理由)?
换句话说,'more recent' CPU 指令的很大一部分不是由 C 编译器生成的,仅仅是因为它对程序员意图的信息太少,因为更简单C的语法?我知道我可以使用汇编程序访问所有 CPU 指令,但这正是我不想做的。理想情况下,我希望生成的代码仍然尽可能独立于平台。
您关于编程语言与 "modern CPU instructions" 之间关系的所有假设都是不正确的。
让我们考虑一下 GNU 编译器集合。
这里语言的选择并不重要,因为语言前端最终都会生成相同的中间形式,称为 GIMPLE。然后优化过程就可以了。
可以发出的CPU条指令的范围由-mtune
选项控制。对于 x86,GCC 在优化一些非常普通的 C 代码时能够发出现代 AVX 512 指令。自动循环矢量化是一个强大的东西。尝试一下:实现 memcpy
并查看生成的程序集。
我的建议:生成干净、不聪明的 C 代码,并提高优化级别。就像您手动编写代码一样。
您还可以考虑将您的语言直接实现为 GCC 或 LLVM 的前端,而无需转译为 C 或 C++。 LLVM 就是为此目的而设计的,旨在使新语言的实施变得容易,并且仍然利用现代优化方法。
我正在考虑将一种语言(本土 DSL)转译为 C 与 C++ 的问题。
我已经 'native' 超过 15 年没有做过任何编程,所以我想检查一下我的假设。
我假设转换到最新的 C++ 版本 (17) 将使本机编译器能够使用范围更广的 'modern' Intel/AMD CPU 指令是否正确,结果在更高效的可执行文件中(除了 C++ 的多线程/内存模型部分,它本身似乎已经是使用 C++ 的充分理由)?
换句话说,'more recent' CPU 指令的很大一部分不是由 C 编译器生成的,仅仅是因为它对程序员意图的信息太少,因为更简单C的语法?我知道我可以使用汇编程序访问所有 CPU 指令,但这正是我不想做的。理想情况下,我希望生成的代码仍然尽可能独立于平台。
您关于编程语言与 "modern CPU instructions" 之间关系的所有假设都是不正确的。
让我们考虑一下 GNU 编译器集合。
这里语言的选择并不重要,因为语言前端最终都会生成相同的中间形式,称为 GIMPLE。然后优化过程就可以了。
可以发出的CPU条指令的范围由-mtune
选项控制。对于 x86,GCC 在优化一些非常普通的 C 代码时能够发出现代 AVX 512 指令。自动循环矢量化是一个强大的东西。尝试一下:实现 memcpy
并查看生成的程序集。
我的建议:生成干净、不聪明的 C 代码,并提高优化级别。就像您手动编写代码一样。
您还可以考虑将您的语言直接实现为 GCC 或 LLVM 的前端,而无需转译为 C 或 C++。 LLVM 就是为此目的而设计的,旨在使新语言的实施变得容易,并且仍然利用现代优化方法。