我可以将 GCC 作为守护进程运行(或将其用作库)吗?

标签 c linux gcc jit

我想将 GCC 用作 JIT 编译器,我只是偶尔编译一小段代码。虽然我当然可以为我想编译的每个函数 fork 一个 GCC 进程,但我发现 GCC 的启动开销对此来说太大了(在我的计算机上它似乎是大约 50 毫秒,这将花费 50 秒来编译 1000职能)。因此,我想知道是否可以将 GCC 作为守护进程运行或将其用作库或类似的东西,这样我就可以提交一个函数进行编译而无需启动开销。

如果您想知道,我不考虑使用实际 JIT 库的原因是因为我还没有找到一个支持我想要的所有功能的库,其中至少包括对 ABI 的良好了解,以便它可以处理结构参数(GNU Lightning 中缺少)、带闭包的嵌套函数(libjit 中缺少)和仅 C 接口(interface)(LLVM 中缺少;我也认为 LLVM 缺少嵌套函数)。

不,我不认为我可以将函数批处理在一起进行编译;一半的要点是我只想在第一次实际调用它们时编译它们。

我注意到了 libgccjit ,但据我所知,它似乎非常具有实验性。

最佳答案

我的回答是“否(您不能将 GCC 作为守护进程运行,或将其用作库)”,假设您正在尝试使用标准 GCC 编译器代码。我至少看到两个问题:

  1. C 编译器处理完整的翻译单元,一旦它读完源代码,编译它并退出。您必须重新调整代码(编译器驱动程序)才能在读取每个文件后留下来。由于它运行多个子流程,无论如何我不确定您是否会用它节省那么多时间。

  2. 您将无法调用您创建的函数,就像它们是普通的静态编译和链接函数一样。至少您必须加载它们(使用 dlopen() 及其同类,或者自己编写代码来进行映射),然后通过函数指针调用它们。

第一个异议涉及直接问题;第二个解决评论中提出的问题。

关于我可以将 GCC 作为守护进程运行(或将其用作库)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20557833/

相关文章:

c - 尽管初始化和正确的界限仍然出现 SIGSEGV 运行时错误?

c - 为什么在重定向到同一文件时会覆盖部分输出,但在重定向到终端时却不会?

linux - 如何在bash中逐列组合两个变量

c++ - 可变参数模板继承中的类型不匹配

c - 如何推送(使用 libgit2)

c - return !!myVar 是什么意思?

linux - 启动 Jenkins 服务器的最佳方式是什么

linux - 使用 grep 获取仅包含 12 个字母的字母行

c - *** 检测到 glibc *** free() : invalid next size (normal): 0x0a03c978 ***

c++ - libev-4.15 无法在 OSX 10.8 上编译