静态打字的Lua

时间:2009-05-02 01:30:24

标签: compiler-construction lua static-typing

我正在寻找一个在编译时进行类型检查的Lua前端编译器,但输出标准的Lua 5.1字节代码(只有运行时类型)。我想要的是一定量的静态,编译时语法分析和可选类型,以便比运行时更快地检测出琐碎的错误。生成的字节代码必须与使用标准LoadString()编译的现有Lua字节代码很好地配合。

要清楚 - 任何差异只会发生在字节编译时。在运行时,字节代码不知道在编译阶段发生了任何不同/异常的事情。

我的想法听起来很像ActionScript;我甚至不介意输出Lua字节代码的ActionScript编译器!

有没有人听说过这样的努力?我已经看到了一些使用MetaLua来做到这一点的引用,但说实话,我不够聪明,无法做出文档的尾巴

7 个答案:

答案 0 :(得分:14)

在2005年夏天或者附近,我使用incredibly smart undergraduate student处理了为Lua做一些编译时类型推断的问题,可能是由注释辅助的。这个问题难以置信! (我的学生写了一篇简短的技术说明,但它并不是真正用于一般发行。)

如果我想解决你提出的问题,那么它有允许重要的静态类型检查并且它与标准字节码编译的Lua代码互操作 , 我会从头设计一种新语言来满足这两个约束条件。这将是一项大量工作,但比尝试将类型系统改造为Lua要容易得多。

答案 1 :(得分:6)

请参阅this Metalua blog post

-{ 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是第一个看的工具。

P.S。请never write Lua as all-caps

答案 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