我正在寻找一个在编译时进行类型检查的Lua前端编译器,但输出标准的Lua 5.1字节代码(只有运行时类型)。我想要的是一定量的静态,编译时语法分析和可选类型,以便比运行时更快地检测出琐碎的错误。生成的字节代码必须与使用标准LoadString()编译的现有Lua字节代码很好地配合。
要清楚 - 任何差异只会发生在字节编译时。在运行时,字节代码不知道在编译阶段发生了任何不同/异常的事情。
我的想法听起来很像ActionScript;我甚至不介意输出Lua字节代码的ActionScript编译器!
有没有人听说过这样的努力?我已经看到了一些使用MetaLua来做到这一点的引用,但说实话,我不够聪明,无法做出文档的尾巴
答案 0 :(得分:14)
在2005年夏天或者附近,我使用incredibly smart undergraduate student处理了为Lua做一些编译时类型推断的问题,可能是由注释辅助的。这个问题难以置信! (我的学生写了一篇简短的技术说明,但它并不是真正用于一般发行。)
如果我想解决你提出的问题,那么它有允许重要的静态类型检查并且它与标准字节码编译的Lua代码互操作 , 我会从头设计一种新语言来满足这两个约束条件。这将是一项大量工作,但比尝试将类型系统改造为Lua要容易得多。
答案 1 :(得分:6)
-{ extension "types" }
function sum (x :: list(number)) :: number
local acc :: number = 0
for i=1, #x do acc=acc+x[i] end
return acc
end
这看起来像是一个运行时解决方案。
无论如何,请随时在Metalua mailing list中提出您的问题。如果你想扩展Lua语法,Metalua是第一个看的工具。
答案 2 :(得分:5)
这个问题已有六年了......但这里有一个新答案:http://terralang.org/
与C一样,Terra是一种简单的,静态类型的编译语言 手动内存管理。但与C不同的是,它的设计来自于 开始与Lua互操作。 Terra功能是一流的 使用terra关键字创建的Lua值。如果需要他们是 JIT编译为机器代码。
答案 3 :(得分:4)
没有这样的事情。有可能扩展MetaLua来做到这一点,但没有人做过,而AFAIK,没有计划这样做。 Lua是一种动态语言,如果你想要一种静态类型的语言,请使用它。
您基本上寻找的是Java或C#。在这种情况下,您可以使用像Lua.NET这样的项目将现有的Lua代码与C#集成。 Java也有Kahlua。
答案 4 :(得分:3)
有一篇新论文" Type Lua:Lua的可选类型系统"来自PUC-Rio刚刚在Dyla 14上发表。 http://dl.acm.org/citation.cfm?id=2617553
它是" Typed Lua的初始设计,是Lua脚本语言的可选类型扩展"。它仍在进行中,类型系统仍然相对简单。没有提供类型推断/类型检查工具。
关于基于metalua的打字系统,Tidal Lock:可选的静态类型检查和来自Fabien的Lua推理。 http://lua-users.org/lists/lua-l/2013-02/msg00403.html
答案 5 :(得分:2)
还有拉维 https://github.com/dibyendumajumdar/ravi
Ravi编程语言是Lua 5.3的衍生产品,具有有限的可选静态类型和基于LLVM和libgccjit的JIT编译器
我非常喜欢Terra的编程(见上文)
答案 6 :(得分:0)
我推荐EmmyLua。
这是一个Intellij / VSCode插件,支持键入文档。我发现总体记录方法非常友好。同样,由于其IDE支持,EmmyLua还支持提示。
以下是EmmyLua文档的一些摘要:
--- @alias recipe_prototype any
--- @alias recipe_name string
--- @alias ingredient_name string
--- @class Coordinate
--- @field x number
--- @field y number
--- @class Entity
--- @field entity_number number unique identifier of entity
--- @field name string entity name
--- @field position Coordinate
--- @field direction any defines.direction.east/south/west/north
--- @class BlueprintSection
--- @field entities Entity[]
--- @field inlets number[] index of inlets in entities list
--- @field outlets number[] index of outlets in entities list
--- @type BlueprintSection
BlueprintSection = {}
--- @return BlueprintSection
function BlueprintSection.new()
--- ...
end
--- @param other BlueprintSection
--- @param xoff number optional, x-offset of the other section, default to width of self
--- @param yoff number optional, y-offset of the other section, default to 0
--- @return BlueprintSection new self
function BlueprintSection:concat(other, xoff, yoff)
-- ...
end
有关更多文档参考,请选中https://emmylua.github.io