我正在考虑将语言(本土DSL)转换为C vs C ++的问题。
我还没有做过任何本地人的事。编程超过15年,所以我想检查一下我的假设。
我是否正确地假设转换到最新的C ++版本(17)将使本机编译器能够使用更广泛的“现代”版本。英特尔/ AMD CPU指令,导致更高效的可执行文件(超出C ++的多线程/内存模型部分,这本身就已经足以成为C ++的理由)?
换句话说,不是最近的一部分' CPU指令永远不会由C编译器生成,只是因为它有关于程序员意图的信息太少,因为C的语法更简单?我知道我可以使用汇编程序访问所有CPU指令,但这正是我不想做的事情。理想情况下,我希望生成的代码仍然尽可能与平台无关。
答案 0 :(得分:6)
关于编程语言与“现代CPU指令”之间关系的所有假设都是错误的。
让我们考虑一下GNU Compiler Collection。
这里的语言选择并不重要,因为语言的前端都会产生相同的中间形式,称为GIMPLE。然后优化过程就可以了。
可以发出的CPU指令范围由-mtune
选项控制。对于x86,GCC能够在优化一些非常简洁的C代码时发出现代AVX 512指令。自动循环矢量化是一个强大的功能。试一试:实现memcpy
并查看生成的程序集。
我的建议:生成干净,不聪明的C代码,并提高优化级别。就像你手工编写代码一样。
您也可以考虑直接将您的语言作为GCC或LLVM的前端实现,而不必转换为C或C ++。 LLVM是为此目的而设计的,旨在使新语言的实现变得简单,并且仍然利用现代优化方法。