您可以动态编译 C 代码并将其链接/加载到 C 程序中吗?

Lan*_*ard 4 c jit

我读过C 中的 eval,如果您编写 C 字符串解析器/评估器,则可以将其映射到主 C 程序中的特定函数。但据我所知,它实际上并没有将它放入可执行内存中,就像JIT 编译器似乎所做的那样。我不完全理解 JIT 编译器(我从来没有做过),但我明白了要点。

所以我想知道的是,您是否可以在 C 中创建某种 JIT 编译器,而无需做太多解析 C 字符串和转换为 AST 之类的工作。基本上,您能否像在 JavaScript 中那样动态创建一个函数(在 C 中),以便该函数与任何其他 C 函数完全相同(即,它在程序的可执行部分中直接编译为可执行的机器代码)事物)。

如果不可能这样做,第二种方法是动态加载 C 导入/文件/模块。因此,您衍生出一个进程,该进程告诉 clang 编译器编译一些库函数,完成后,在不停止当前程序的情况下,它将新程序库链接/附加到自身,因此可以以这种方式执行代码.

如果这是不可能的,也许一个选择是简单地在后台重新编译程序,然后将当前程序与从头启动的新程序交换。但这将是非常原始的。

试图弄清楚您是否在 C 中有一些用于您自己的自定义函数数据类型的结构,然后如何以最优化的方式在 C 中执行该函数。

dbu*_*ush 6

在 POSIX 系统(Linix、Mac、UNIX)上,您拥有可以使用的dlopendlsym函数。这些函数可用于在运行时加载共享库并从中执行函数。

就创建库而言,最简单的做法是将相关的源代码写入文件,在单独的进程中运行 gcc 进行编译,然后使用dlopen/dlsym运行其包含的函数。

例如:

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

const char *libsrc =
"#include <stdio.h>\n"
"\n"
"void f1()\n"
"{\n"
"  printf(\"in f1\\n\");\n"
"}\n"
"\n"
"int add(int a, int b)\n"
"{\n"
"  return a+b;\n"
"}\n";

int main()
{
    FILE *libfile = fopen("mylib.c", "w");
    fputs(libsrc, libfile);
    fclose(libfile);
    system("gcc -fPIC -shared -g -Wall -Wextra -o libmylib.so mylib.c");

    void *lib = dlopen("libmylib.so", RTLD_NOW);
    if (!lib) {
        printf("dlopen failed: %s\n", dlerror());
        return 1;
    }

    void (*f)() = dlsym(lib, "f1");
    if (f) {
        f();
    } else {
        printf("dlsym for f1 failed: %s\n", dlerror());
    }

    int (*a)(int, int) = dlsym(lib, "add");
    if (a) {
        int x = a(2,3);
        printf("x=%d\n", x);
    } else {
        printf("dlsym for add failed: %s\n", dlerror());
    }

    dlclose(lib);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)