我想知道是否有人有llvm/tools的经验 - lli解释器/ JIT编译器(参见http://llvm.org/docs/GettingStarted.html#tools).我对您可以提供的任何信息感兴趣(速度,复杂性,实现等).
谢谢.
更新:
好吧,假设lli充当解释器,如何将bitcode执行与LuaJIT VM执行进行比较?当lli充当jit-compiler(同样的比较)时呢?
注意:我只询问是否有人有经验/愿意花些时间分享.
在我的应用程序中,我从C后端公开了所有Lua库.现在,我需要加载一个Lua模块.对此的方法似乎是:
lua_getglobal(L, "require");
lua_pushstring(L, libname);
lua_pcall(L, 1, 0, 0);
Run Code Online (Sandbox Code Playgroud)
将搜索package.path以查找<libname>.lua并加载它.
是否可以将Lua模块内置到C应用程序中(以便模块成为C应用程序的一部分)?所以我不必单独打包Lua模块.不知何故,我无法找到任何参考或示例!:(
ps我正在使用LuaJIT-2.0.2,有问题的库是SciLua/Time(使用ffi)
我一直在阅读JIT和LuaJIT的跟踪编译器,最后我提出了一些问题.
根据我的理解,LuaJIT的JIT不会像Java的HotSpot那样编译热门方法,它会编译源自循环的热路径.这是否意味着如果某些东西不是来自循环(比方说,我从C-api调用Lua函数)那么代码永远不会被jitted?当你遇到另一个循环时会发生什么?第二个循环的路径是JIT,然后是来自该循环的新路径,或者第二个循环是否是同一路径的一部分?
口译员如何选择最佳的热门路径?假设我有一个整数的哈希表 - >字符串.现在假设我调用table [x],其中x为3和5,它们已成为热路径和jitted,解释器如何决定哪个jitted代码调用table [x],其中x为4?
另一件令我绞尽脑汁的事情.由于路径是编译的,而不是函数,跟踪编译器是否需要更多的内存?既然你不能真正重用其他路径的编译代码我的意思,因为在一般情况下路径可能比单个函数大...
lua -e"print(package.path)"
./?.lua;/usr/share/lua/5.1/?.lua;/usr/share/lua/5.1/?/init.lua;/usr/lib/lua/5.1/?.lua;/usr/ LIB/LUA/5.1 /?/ init.lua
luajit -e"print(package.path)"
./?.lua;/usr/local/share/luajit-2.0.0-beta8/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1 /?/init.lua
我试过附加lua的package.path,尽管没有骰子.LuaJIT似乎无法找到任何岩石,这很奇怪.我该怎么办?
我想知道有没有办法将结构指针传递给lua脚本,并从lua到达它的成员而不复制(用于读写目的).
那么,例如是否可以直接通过其指针覆盖ac结构的成员?
(我正在使用luajit)
假设有以下C代码:
struct Foo { int dummy; }
int tryToAllocateFoo(Foo ** dest);
Run Code Online (Sandbox Code Playgroud)
...如何在LuaJIT中进行以下操作?
Foo * pFoo = NULL;
tryToAllocateFoo(&pFoo);
Run Code Online (Sandbox Code Playgroud) 我有一个关于 NGINX 速率限制的问题。
是否可以根据 JWT 令牌的解码值进行速率限制?我在文档中找不到任何这样的信息。
或者,即使有一种通过创建纯自定义变量(使用 LuaJIT)来限制速率的方法,该变量将从我解码的 JWT 中分配一个值 - 也可以完成这项工作。问题是limit_req模块似乎在请求到达 luaJIT 阶段之前执行,所以已经太晚了!
一个解决方案将不胜感激。
我正在绘制一个小的 C++ 程序,它将把数组传递给 Lua 并在那里修改它们,我打算在程序中读取一个 lua 脚本,这样我就可以修改它而无需重新编译程序
我的第一个障碍是确保 Lua 能够修改已经分配的数组,而不是在 Lua 空间中再次分配它们。数据将是浮动的,并且大小会非常大,但我现在从很小的地方开始。
为了简化这个接口,我尝试了 LuaBridge 2.6,但它没有提供预期的结果。下面是一个完全“工作”的程序。
#include <iostream>
#include <cstdint>
#include <cstring>
#include <vector>
#include <lua5.3/lua.hpp>
#include <LuaBridge/LuaBridge.h>
int main(void)
{
const uint32_t LENGTH = 512 * 256;
std::vector <float> input(LENGTH),
output(LENGTH);
memset(output.data(), 0, LENGTH * sizeof(float)); // Zero the output
for(uint32_t i = 0; i < LENGTH; i++) // Populate input
input[i] = (float)i + 0.5f;
lua_State *luastate = luaL_newstate();
luabridge::push(luastate, input.data()); // Supposedly passing a pointer to the first …Run Code Online (Sandbox Code Playgroud)