Ravi是Lua的一种方言,具有有限的可选静态类型,以Mir和LLVM驱动的JIT编译器为特色。Ravi这个名字来自梵语中的Sun。有趣的是,Lua的前身是Sol,它支持静态类型;Sol在葡萄牙语中的意思是Sun。
Lua作为一种小型的嵌入式动态语言是完美的,那么为什么要派生呢?Ravi使用静态类型扩展Lua,以便在启用JIT编译时提高性能。但是,静态类型是可选的,因此Lua程序也是有效的RAVI程序。
还有其他向Lua添加静态类型的尝试-例如,类型化Lua,但这些努力主要是在不修改VM的情况下在语言中添加静态类型检查。类型化Lua工作非常类似于JavaScript世界中的TypeScript所采用的方法。静态类型化主要是为了帮助编程-代码最终被转换为标准Lua,并在未经修改的Lua VM中执行。
我的动机略有不同--我希望在已知类型的情况下增强VM以支持更高效的操作。JIT编译技术可以利用类型信息来提高性能。同时,我希望保持该语言的安全,因此可供非专业程序员使用。
当然,还有非常棒的LuaJIT实现。与LuaJIT相比,Ravi的目标不同。Ravi优先考虑维护和支持的简易性、语言安全和与Lua5.3的兼容性,而不是最高性能。有关更详细的比较,请参阅下面的文档链接。
Lua简介试图为来自其他语言的人提供Lua的快速概述。
Lua5.3字节码参考是我试图更新Lua5.1字节码参考的尝试。
<;Close>;变量-Ravi有';DEFER&39;语句,我认为这是更好的选择,因此没有计划支持<;Close>;变量。
解释器性能改进-这些对Lua解释器有利,但对JIT后端没有好处,因此后向移植没有多大意义。
字符串到数字强制现在是字符串库元方法的一部分-回传到RAVI。
删除5.1和5.2的兼容层-未实施,因为Ravi根据Lua 5.3继续提供这些层。
Ravi应该能够在解释模式下运行所有Lua 5.3程序,但应注意以下事项:
RAVI支持可选类型和增强类型,如数组(如上所述)。使用这些功能的程序不能由标准Lua运行。但是,Ravi中的所有类型都可以传递给Lua函数;Lua代码中对Ravi数组的操作将受到上面关于数组的一节中所述的限制。
如果将从Lua到RAVI的值赋给类型化变量,则这些值将经过类型检查。
在对类型进行注释时,向上值不能破坏局部变量的静态类型(问题#26)。
某些LUA限制由于字节码结构的改变而降低。这些内容如下所述。
RAVI使用扩展字节码,这意味着它与Lua5.x字节码不兼容。
Ravi合并了Lua5.4的新一代GC,因此GC接口发生了变化。
RAVI将只执行来自主Lua线程的JITed代码;任何辅助线程(协程)都在解释器模式下执行。
在JITed代码中,尾部调用是作为常规调用实现的,因此与支持无限尾部递归的解释器VM不同,JIT编译后的代码仅支持深度约为110的尾部递归(问题#17)