【问题标题】:Can I run GCC as a daemon (or use it as a library)?我可以将 GCC 作为守护进程运行(或将其用作库)吗?
【发布时间】:2013-12-31 17:02:36
【问题描述】:

我想将 GCC 用作 JIT 编译器,我只是不时地编译简短的 sn-ps 代码。虽然我当然可以为要编译的每个函数派生一个 GCC 进程,但我发现 GCC 的启动开销太大(在我的计算机上似乎大约 50 毫秒,这需要 50 秒编译 1000职能)。因此,我想知道是否可以将 GCC 作为守护程序运行或将其用作库或类似的东西,这样我就可以提交一个函数进行编译而无需启动开销。

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

不,我不认为我可以将函数一起批处理以进行编译;一半是我只想在它们第一次真正被调用时才编译它们。

我注意到libgccjit,但据我所知,这似乎非常实验性。

【问题讨论】:

  • 你确定 C 是一门很好的语言吗?像lua 这样的语言更适合这种操作,至少这是我想到的。
  • 我很确定。 :) 更准确地说,我想在一个用 C 语言编写的系统中使用它。
  • 不是迂腐,而是 Lua 在 C 运行的地方运行,考虑到所需的系统规范和 C 编译器的必要性,您有两种选择。 lua 解释器是 ANSI C 代码,并且有使用 lua 的低端 ARM 芯片组,它们运行非常流畅。
  • 当然,但它必须与 C 进行实际的 ABI 互操作。我希望能够从正常的静态编译代码中调用生成的函数,而它们又需要能够静态调用编译函数。
  • prespawn N gcc 的进程在输入(命名管道)时被阻塞。将您的函数写入 gcc 进程(异步启动新进程)。重复。

标签: c linux gcc jit


【解决方案1】:

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

  1. C 编译器处理完整的翻译单元,一旦完成读取源代码,编译并退出。在读取每个文件后,您必须重新调整代码(编译器驱动程序)以保持不变。由于它运行多个子流程,因此我不确定您是否会节省这么多时间。

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

第一个反对意见涉及直接问题;第二个解决了 cmets 中提出的问题。

【讨论】:

  • 无论如何我都打算做这两件事,所以我认为这不是问题。但是,特别是,我不明白这是一个答案。 :)
  • 答案是“不,您不能将标准的 GCC 编译器驱动程序作为守护进程运行”,并说明您为什么不能这样做。
【解决方案2】:

我迟到了,但其他人可能会觉得这很有用。

存在一个用于 c++ 的 REPL(读取-评估-打印循环),名为 Cling,它基于 Clang 编译器。它所做的很大一部分是用于 c 和 c++ 的 JIT。因此,您可以使用 Cling 来完成您想要完成的工作。

更好的消息是 Cling 正在经历 attempt to upstream 很多 Cling 基础架构转换为 Clang 和 LLVM。

@acorn 指出你已经排除了 LLVM 和 co。因为缺少 c API,但 Clang 本身确实有一个,这是他们保证稳定性的唯一一个:https://clang.llvm.org/doxygen/group__CINDEX.html

【讨论】:

  • OP 表示,由于缺少 C API,他们放弃了 LLVM。
  • 谢谢,我错过了,但 AFAIK Clang 确实有 C API。事实上,只有 C API 是稳定的。
  • 是的,它确实有一个暴露为 C 的 API 子集(以及用于多种语言工具的其他部分)。但是如果 OP 想要访问所有内容,AFAIK 最好的仍然是使用 C++。
  • 我肯定没有尝试过,这不是我的专长,但据我所知,似乎可以结合 libclang 和 llvm 的 C api 创建一个 C -JIT 编译器:pauladamsmith.com/blog/2015/01/…
猜你喜欢
  • 2012-12-03
  • 2011-08-25
  • 1970-01-01
  • 2023-03-02
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多