【发布时间】:2022-01-11 01:34:36
【问题描述】:
对于任何编译器人员来说,这只是一个非常幼稚的问题。在编译时 JIT 编译 C++ 模板是否是加快编译时间的可行策略?这可能已经在 LLVM 等大型编译器中完成了吗?如果没有,有什么(可能是显而易见的)缺点导致这种方法不可行?
为了澄清,我的意思是,人们将 C++ 模板语言不是作为生成 C++ AST 的解释系统,而是作为一种传递给例如 JIT 可编译语言的语言。 LLVMJit 或类似系统发出二进制 blob,然后根据模板参数生成模板应用程序结果的 AST。
理论上这会加快一些编译时间吗? AFAIK JIT/解释加速很大程度上取决于调用代码的频率,但我可以想象一些模板被多次应用。
感谢您的回答!
【问题讨论】:
-
你能解释一下你期望
#define foo bar被编译成什么,如果bar此时甚至没有定义,但是几千行之后,在代码中,经过一个完全不同的头文件获取#included?它既可以声明为函数、模板,也可以声明为完全不同的宏? -
我想我并没有真正理解你的意思。然而,在我看来,C++(模板)编译的整个想法是做大量的编译时间检查,这样运行时代码就不必这样做了。所以这是我最不想看到的 JIT 版本。此外,其理念是生成具有可预测运行时行为的代码(与垃圾收集语言不同),而 JIT 也会破坏这一点
-
您正在描述 Java 泛型的行为。 C++ 模板don't work this way
-
模板是(实例化和)在编译时编译的,并且“模板语言”不是生成 AST 的解释系统。此外,模板不是宏。
-
@SamVarshavchik 我试图专门讨论模板,而不是宏。很抱歉造成混乱。
标签: c++ templates gcc llvm jit