Optimization 使用LLVM JIT编译lua包装的C函数?

Optimization 使用LLVM JIT编译lua包装的C函数?,optimization,lua,jit,llvm,Optimization,Lua,Jit,Llvm,我已经将一些C函数编译成LLVM字节码。 现在我想让Lua脚本引擎可以访问这些函数,然后将Lua脚本编译成本机代码 我找到了使用llvm编译lua脚本的项目。 我现在想知道是否可以对从lua脚本调用的C函数执行jit编译和优化 例如,我有两个C函数: void func1() { for(int i = 1; i < 5; ++i) printf("hello from func1"); } void func2() { for(int i = 1; i < 5; +

我已经将一些C函数编译成LLVM字节码。 现在我想让Lua脚本引擎可以访问这些函数,然后将Lua脚本编译成本机代码

我找到了使用llvm编译lua脚本的项目。 我现在想知道是否可以对从lua脚本调用的C函数执行jit编译和优化

例如,我有两个C函数:

void func1() {
  for(int i = 1; i < 5; ++i)
    printf("hello from func1");
}
void func2() {
  for(int i = 1; i < 5; ++i)
    printf("hello from func2");
}
然后我希望llvm lua编译器对其进行优化,并将其编译成与

for(int i = 1; i < 5; ++i) {
  printf("hello from func1");
  printf("hello from func2");
}
for(int i=1;i<5;++i){
printf(“来自func1的你好”);
printf(“来自func2的你好”);
}
进入

for(int i = 1; i < 5; ++i)
  printf("hello from func1");
for(int i = 1; i < 5; ++i)
  printf("hello from func2");
for(int i=1;i<5;++i)
printf(“来自func1的你好”);
对于(int i=1;i<5;++i)
printf(“来自func2的你好”);
有没有可能实施这一点

干杯


Manuel

对于任何类型的复杂程序转换,如您试图在此处实现的转换,最好删除尽可能多的增加复杂性的中间步骤。首先证明它适用于最简单的情况,然后逐步增加复杂性。对于您的特定问题,这可以转化为:尝试在纯C代码上实现所需的优化,所有代码都在同一个文件中,然后在不同文件中的纯C代码上实现优化,等等。。如果你不能在所有简单的情况下都做到这一点,那么你就不太可能以所有额外的复杂性实现最初的目标(通过一步一步地做,你也会更好地了解你遇到的任何问题的可能原因)

如果您遵循上面的建议,我很有信心(尽管我没有尝试过)您所期望的优化不会由LLVM优化器完成,即使是在最简单的情况下,将所有内容都放在一个C文件中并以完全优化的方式运行。原因是您希望优化器更改代码的语义,因为不能保证两个连续的
for
循环与一个单独的
for
循环具有相同的副作用(可观察到的更改),两个循环体按顺序执行(您提供的代码就是一个很好的例子)。为了使优化安全,编译器必须能够保证(证明)从循环体执行的所有代码的副作用的各种属性。虽然并非不可能,但在一般情况下,使用具有不可控副作用的语言(如C语言)是非常困难的,而且在大多数情况下,如果您跨越任何库边界(正如您在这里可能会做的那样),这是不可行的,因为您实际上没有一个统一的优化步骤(至少在理论上)可以考虑所有必要的代码。如果您真的想深入研究LLVM及其优化器框架,我建议您从阅读本文开始,然后找出优化器必须在一个步骤中查看哪些代码才能使之成为可能

我建议您考虑一下,让Lua编译成LLVM位代码并与C中的LLVM位代码一起优化的动机是什么。我相信这是有正当理由的,但除非您绝对相信这是实现目标的唯一方法,否则我个人会尝试另一种方法

假设你的主要动机是表现。如前所述,我建议好好看看。它支持纯(编写得体)和,还包括一个可能对您的问题有帮助的。从FFI页面:

FFI库允许从纯Lua代码调用外部C函数使用C数据结构

FFI库在很大程度上避免了用C编写繁琐的手动Lua/C绑定的需要。无需学习单独的绑定语言-它解析纯C声明!这些可以从C头文件或参考手册中剪切粘贴。这取决于绑定大型库的任务,而不需要处理脆弱的绑定生成器

FFI库与LuaJIT紧密集成(不作为单独的模块提供)。由JIT编译器生成的用于从Lua代码访问C数据结构的代码与C编译器生成的代码一致。对C函数的调用可以在JIT编译代码中内联,这与对通过经典Lua/CAPI绑定的函数的调用不同


是的,听起来是有可能的,至少在抽象上是这样。。。你有什么特别的问题吗?没有编译器会执行这种优化,因为它会执行可观察到的差异(输出的顺序会不同)。你看过luajit吗?最新的版本在速度方面非常有希望——也许你可以完全摆脱C。
for(int i = 1; i < 5; ++i)
  printf("hello from func1");
for(int i = 1; i < 5; ++i)
  printf("hello from func2");