- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经将一些 C 函数编译成 LLVM 字节码。现在我想让 Lua 脚本引擎可以访问这些函数,然后将 Lua 脚本编译成 native 机器代码。
我找到了 llvm-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");
}
然后我将它们暴露给 Lua 脚本引擎并运行这样的 lua 脚本:
func1()
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("hello from func1");
for(int i = 1; i < 5; ++i)
printf("hello from func2");
有没有可能实现它?
干杯,
曼纽尔
最佳答案
对于任何类型的复杂程序转换(例如您要在此处实现的转换),最好尽可能多地删除增加复杂性的中间步骤。首先证明它适用于最简单的情况,然后逐步增加复杂性。对于您的特定问题,这转化为:尝试在同一文件中的所有代码的纯 C 代码上进行所需的优化,然后在不同文件中的纯 C 代码上进行,等等。如果您不能全部实现在更简单的情况下,那么你就不太可能通过所有额外的复杂性让它为最初的目标工作(并且通过逐步进行,你也会更好地了解你遇到的任何问题的可能原因) .
如果您遵循上述建议,我非常有信心(尽管我还没有尝试过)您想要的优化不会由 LLVM 优化器完成,即使是在最简单的情况下将所有内容都放在一个 C 文件中并以完全优化的方式运行。原因是您希望优化器更改代码的语义,因为不能保证两个连续的 for
循环与单个 for 具有相同的副作用(可观察到的变化)
循环,两个主体按顺序执行(您提供的代码就是一个很好的例子)。为了使优化安全,编译器必须能够保证(证明)关于从循环体执行的所有代码的副作用的各种属性。尽管并非不可能,但在一般情况下使用具有不受控制的副作用的语言(例如 C)很难做到,并且在大多数情况下,如果您跨越任何库边界(您可能会在这里这样做),那是不可行的,因为您实际上没有一个统一的优化步骤(至少在理论上)可以考虑所有必要的代码。如果你真的想更深入地研究 LLVM 及其优化器框架,我建议你先阅读这篇 excellent article outlining the motivations and design of LLVM ,然后找出优化器必须在一个步骤中查看哪些代码才能使其成为可能。
我建议考虑一下您尝试让 Lua 编译为 LLVM 位码并与来自 C 的 LLVM 位码一起优化的动机是什么。我确信有正当理由,但除非您绝对相信这是实现目标的唯一方法,那么我会亲自尝试不同的方法。
假设您的主要动机是表现。作为Andrew Y已经提到过,我建议好好看看 luajit .它使纯(写得体)Lua to perform close to C和 many times better than standard Lua ,它还包括一个 Foreign Function Interface (FFI)这可能对您的问题有帮助。来自 FFI 页面:
The FFI library allows calling external C functions and using C data structures from pure Lua code.
The FFI library largely obviates the need to write tedious manual Lua/C bindings in C. No need to learn a separate binding language — it parses plain C declarations! These can be cut-n-pasted from C header files or reference manuals. It's up to the task of binding large libraries without the need for dealing with fragile binding generators.
The FFI library is tightly integrated into LuaJIT (it's not available as a separate module). The code generated by the JIT-compiler for accesses to C data structures from Lua code is on par with the code a C compiler would generate. Calls to C functions can be inlined in JIT-compiled code, unlike calls to functions bound via the classic Lua/C API.
关于optimization - 使用 LLVM JIT 编译 lua 包装的 C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6161300/
如何从 a.lua 传递值至 b.lua ? 让我们说在我的 a.lua我有这个变量代码。 local value = "Hello WOrld!" director:changeScene ("b"
我有一个使用命令行解释器运行的 lua 脚本,该脚本需要从文件加载表。 该表存储如下: create_object_action = { reflexive = true, which
我通过静态链接的方式在我的项目中嵌入了 Win32 上的 Lua(不,我不能切换到 DLL)。我想捆绑更多使用 native 代码的 Lua 扩展 - 而不仅仅是纯 .lua 文件。具体来说,我想捆绑
我需要一些帮助来解析 lua 文件的命令行。我正在执行一个 lua 文件,该 lua 文件有一个命令“dofile(2nd.lua-file)”,但是,我想通过第一个 lua 文件将一些参数传递给第二
这是我的代码示例: listOfPeople = {} listOfPeople["test"] = "hello" listOfPeople = nil “hello”字符串是否丢失并形成内存泄漏?
在一些源代码中,我看到了“Underscore.lua”模块的用法。 _ = require 'underscore' 描述如下: Underscore.lua is a Lua library th
在一些源代码中,我看到了“Underscore.lua”模块的用法。 _ = require 'underscore' 描述如下: Underscore.lua is a Lua library th
我一直在编程 io.write("How many languages do you speak?\n") answer = io.read() if (answer == 1) then io.wr
这个问题在这里已经有了答案: Getting multiple values from a function without creating a variables in LUA (2 个答案)
在阅读 Lua manual 时我遇到了这部分: 函数调用和赋值都可以以左括号开头。这种可能性导致了 Lua 语法中的歧义。考虑以下片段: a = b + c (print or io.write)(
假设我有以下循环: for name in poll() do if name == "quit" then return 0 end end "quit" 字符串是否
Pandoc 通过其 --lua-filter 参数原生支持 lua 过滤器。 但是,我想知道它使用的是什么版本的 lua,以及是否可以将 lua 模块(我相信它依赖于 C 代码)导入其中。 这是我调
这种语言是面向对象的语言吗? 它经常用作OO语言吗? 最佳答案 Lua 完全有能力 prototype-based类似于 JavaScript 的面向对象编程。 Prototype-based pro
我想从 C++ 传递一个 Lua 脚本(Lua 解释器可以处理的代码)并取回结果。 我在网上查看,但找不到任何可以帮助我的示例。我可以从 C++ 调用 Lua 函数,但这需要您使用 Lua 函数创建一
我正在阅读“在 Lua 中编程”,但我不明白这段代码中 Lua 中函数的行为: function newCounter () local i = 0 return function () --
我最近一直在查找 Lua 中的链表,并有一个简单的问题,到目前为止我还没有找到答案 local head = nil head = {next = head, value = "d"} head =
我知道有tonumber()函数,但是问题是我需要转换较大的数字,例如1000100110100011111010101001001001001100100101。我可以自己写,但是有没有办法将其集成
是否可以在 Lua 中对多个值执行算术运算。 我在 Windows 5.1.4 上使用 Lua。 目前我必须将多个值放入一个表中,然后解压缩它们,我希望能够跳过这一步。 是否可以。 这是我目前拥有的:
有什么区别吗 local splitPathFileExtension = function (res) end 和 function splitPathFileExtension(res) end
在下面的代码中,谁能解释一下 b,a = a,b 内部是如何工作的? -- Variable definition: local a, b -- Initialization a = 10 b = 3
我是一名优秀的程序员,十分优秀!