【发布时间】:2021-12-15 21:01:48
【问题描述】:
在 Lisp 中,您可以通过在宏的编译期间评估条件来优化代码。如,您有一个宏 (compute-for-N 1) 评估为 code-1 和 (compute-for-N 2) 评估为 code-2。
如果你用 C++ 编写类似的东西,一个非常幼稚的编译器会在执行期间评估条件,从而减慢程序速度。
我的问题是,所有可能的 Lisp 评估时间优化也可以由理想的编译器完成吗?作为后续,如果一个理想的编译器实际上可以实现与任何手动编写的编译时优化相似或更好的结果,那么尝试编写手动代码优化是否是不好的代码实践?
PS:使用像 Lisp 这样的语言显然有更多的优势,所以这个问题并不是在质疑 Lisp 的潜在效用。
【问题讨论】:
-
C++ 有
constexpr,明确要求编译器在编译期间进行计算。但是,只要在编译时所有数据都是已知的,任何优化编译器都会进行这些计算。constexpr引入了在编译时评估整个函数的概念。模板甚至允许递归编译时计算。我不知道这是否涵盖了 Lisp 所做的一切,但我猜是的。 -
as-if rule 基本上(并且松散地 - 评论中没有太多空间)说 “理想的编译器可以优化 [X] 吗?” 的答案是 “是”。这应该作为副本关闭吗? (我认为推测假设的理想编译器应该如何影响premature-optimization 没有多大价值。)如果没有,您能否将问题的焦点从“是否可能”转移开?
-
例如,您可以编译 C++,首先将其翻译成 Lisp,然后再编译。
-
@CrisLuengo 你提到的那些 C++ 指令是手动编写的——它们在某种意义上类似于在 Lisp 中编写宏。问题是关于在没有我们作为开发人员干预的情况下可以自动优化的限制。
-
"...如果一个理想的编译器实际上可以实现与任何手动编写的编译时优化相似或更好的结果,那么尝试编写手动代码优化是否是不好的代码实践?" -- 我不确定什么是“理想的编译器”,但在发现问题之前,您通常应该避免编写“手动代码优化”,如果这很重要,您应该比较各种解决方案,包括优化标志,按时间和分析。在这种情况下,实际编译器比理想编译器更相关。
标签: c++ optimization lisp compiler-optimization software-quality