现在的位置: 首页 > 综合 > 正文

LuaJIT的功能

2012年10月15日 ⁄ 综合 ⁄ 共 1718字 ⁄ 字号 评论关闭

LuaJIT的功能



原文地址

Linker 翻译此文只为了提供更多信息.

LuaJIT试图保留Lua的精髓--轻量级,高效和可扩展.
功能
所有的函数缺省会被JIT(即时编译器)编译到本地机器码:
* 没有被使用的函数不会被编译.
* 可以选择性打开和关闭即时编译函数,子函数甚至整个模块.
* 需要解析的函数(译注:即没有被编译的函数)和编译过的函数可以自由的混合使用.
预编译(Ahead-of-time AOT)也是被支持的:
* 一些API函数和命令行选项允许用户全盘控制编译过程
这个即时编译器是可扩展的:
* 优化器是一个外部模块可以附着在编译器流水线上.
* 一些模块提供了关于编译过程的跟踪和调试信息.
* 所以这些功能可以通过命令行参数来激活.
性能
被编译的机器码是非常高效的:
* 先请看一下性能对比测试
* 在任何可以采用的地方采取了侵入性优化措施(特殊化,内联).内联的约定(contracts)在运行时捕获错误的优化预测(未发现的多态).
* 自适应去优化被用来重新编译那些破坏了约定的字节码指令.这避免了生成普通的低效率的通用代码(更快速编译,减少指令缓存(I-cache)争抢).
* 特殊CPU功能(比如条件转移或SSE2)会自动被检测和使用.
这个JIT编译器是非常的快的:
* 整个JIT编译器只在Lua核心上增加了32K代码(如果采用 -Os 大小优化参数来编译).
* 优化器被分成几个可选的模块,可以在运行时根据需要来加载.
* LuaJIT添加了大约6000行C代码和2000行汇编代码于Lua 5.1 核心(17,000行C代码)
* 依赖的构建工具 (DynASM) 有大约2,500行Lua代码.
兼容性
LuaJIT被设计成全兼容Lua 5.1.她接受同样的源代码和/或预编译字节码.她支持所有标准语言语义.特别是:
* 支持所有标准类型,操作符和元方法.
* 隐式类型强制转换(number/string).
* 完全 IEEE-754 语义浮点算法(NaN, +-Inf, +-0, ...).
* 完全支持词法闭包.正确的尾调用不会消耗栈帧(译注:栈空间).
* 异常是精确的.回溯追踪工作的很好.
* 通过CoCo提供协程支持.(译注:一点兼容性问题 )
* 没有改变Lua 5.1的增量垃圾收集器.
* 没有改变标准Lua/C API.
* 动态加载的C模块保持和Lua 5.1一样链接兼容性(同样的ABI 抽象二进制接口).(译注:基本不用重新编译老的Lua模块,但是仍然偶遇兼容性问题).
* LuaJIT可以像Lua那样嵌入到一个应用程序里.
一些次要的不同点和调试有关:
* 调试钩子只在调试代码生成使能时调用
* 在JIT编译过的代码中不支持尾调用计数.HOOKTAILRET 也不会被调用.注意: 除非你写Lua调试器,否则这些对你没有影响.
限制
* 目前只支持x86(i386+)CPU.
* 只支持缺省的 lua_Number 类型(double).
* 终止信号(Ctrl-C)被忽略.除非你使能调试钩子(用 -j 调试).
但是这会减慢运行速度.我正在找更好的解决办法.与此同时,你可以按两次Ctrl-C来终止一个正在运行的JIT编译过函数(类似C函数).
* GDB,Valgrind 和其它调试工具不能够报告JIT编译后代码的符号和栈.这很难解决.参考 调试LuaJIT .
警告
* LuaJIT分配可执行内存来保存生成的代码.如果你的操作系统支持的话,Windows的HeapCreate()或者POSIX的mmap().
备用方法是标准Lua分配器(例如: malloc()).但是这通常意味着分配出的内存是没有被标志成可执行的.
在支持并打开Nx(不可执行位)扩展的CPU上的时候,运行编译后的代码或导致操作系统捕获一个异常.
* DynASM需要重生成 ljit_x86.h文件,只当你想修改 *.dash/*.dasc文件的时候.LuaJIT支持预处理.h文件.
* LuaJIT默认 LUA_COMPAT_VARARG 宏是关闭的.因此隐式的 arg参数不再创建.你可以参考 luaconf.h 里面相关注释.
你可以打开这个选项,不过推荐还是不要这样做.而是使用Lua 5.1新版本的变参语法.

TODOS
* LuaJIT 2.x正在开发中.更多信息请参考 LuaJIT 路线图 2008 .



















抱歉!评论已关闭.