【问题标题】:JIT compilation of C++ templates at compile time在编译时对 C++ 模板进行 JIT 编译
【发布时间】: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


【解决方案1】:

对于任何编译器人员来说,这只是一个非常幼稚的问题。在编译时 JIT 编译 C++ 模板是否是加快编译时间的可行策略?

当然可以,但是实施这个想法需要你几年的全职工作。考虑撰写关于该主题的博士论文(问题是要找到一个好的博士导师)。

实际上,每个现代 C++ 编译器(例如 GCCClang/LLVM)都是从更简单的 C(或旧 C++)编译器演变而来的。

另一个(可能相关的)研究课题是制作一个同时具备 JIT 编译技术和多线程技术的 C++ 编译器。

GCCClang/LLVM 都是(2021 年底)单线程编译器。您可以考虑在其中添加几个pthreads

问题是要找到一位合格的优秀博士生导师。我没有足够的资格担任那个角色。

相关的书当然是:Artificial Beings, the conscience of a conscious machine上的 Pitrat 的书(黄色封面)

在 Linux 上,有一种可能性是在编译一组已知的 C++ 模板时生成 GCC plugins,并在编译时进行 dlopen-ed。我的旧Bismon 可能是一个起点。或者RefPerSys 项目....

【讨论】:

    猜你喜欢
    • 2017-02-04
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多