我想将 GCC 用作 JIT 编译器,我只是偶尔编译一小段代码。虽然我当然可以为我想编译的每个函数 fork 一个 GCC 进程,但我发现 GCC 的启动开销对此来说太大了(在我的计算机上它似乎是大约 50 毫秒,这将花费 50 秒来编译 1000职能)。因此,我想知道是否可以将 GCC 作为守护进程运行或将其用作库或类似的东西,这样我就可以提交一个函数进行编译而无需启动开销。
如果您想知道,我不考虑使用实际 JIT 库的原因是因为我还没有找到一个支持我想要的所有功能的库,其中至少包括对 ABI 的良好了解,以便它可以处理结构参数(GNU Lightning 中缺少)、带闭包的嵌套函数(libjit 中缺少)和仅 C 接口(interface)(LLVM 中缺少;我也认为 LLVM 缺少嵌套函数)。
不,我不认为我可以将函数批处理在一起进行编译;一半的要点是我只想在第一次实际调用它们时编译它们。
我注意到了 libgccjit ,但据我所知,它似乎非常具有实验性。
最佳答案
我的回答是“否(您不能将 GCC 作为守护进程运行,或将其用作库)”,假设您正在尝试使用标准 GCC 编译器代码。我至少看到两个问题:
C 编译器处理完整的翻译单元,一旦它读完源代码,编译它并退出。您必须重新调整代码(编译器驱动程序)才能在读取每个文件后留下来。由于它运行多个子流程,无论如何我不确定您是否会用它节省那么多时间。
您将无法调用您创建的函数,就像它们是普通的静态编译和链接函数一样。至少您必须加载它们(使用
dlopen()
及其同类,或者自己编写代码来进行映射),然后通过函数指针调用它们。
第一个异议涉及直接问题;第二个解决评论中提出的问题。
关于我可以将 GCC 作为守护进程运行(或将其用作库)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20557833/