19

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

需要明确的是——任何差异只会发生在字节编译时。在运行时,字节码不会知道在编译阶段发生了任何不同/不寻常的事情。

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

有没有人听说过这样的努力?我已经看到一些关于使用 MetaLua 来执行此操作的参考资料,但老实说,我还不够聪明,无法对他们的文档做出正面评价

4

7 回答 7

16

大约在 2005 年夏天左右,我与一位非常聪明的本科生一起研究了为 Lua 进行一些编译时类型推断的问题,这可能由注释辅助。事实证明,这个问题非常困难!(我的学生写了一篇简短的技术说明,但它并不是真正用于一般流通的。)

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

于 2009-05-02T02:37:41.490 回答
7

请参阅此 Metalua 博客文章

-{ 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 邮件列表中提出您的问题。如果你想扩展 Lua 语法,Metalua 是第一个要看的工具。

PS 请永远不要把 Lua 写成全大写

于 2009-05-02T06:18:41.130 回答
6

这个问题已有六年历史了......但这是一个新的答案:http ://terralang.org/

与 C 一样,Terra 是一种简单的、静态类型的、带有手动内存管理的编译语言。但与 C 不同的是,它从一开始就被设计为与 Lua 互操作。Terra 函数是使用 terra 关键字创建的一流 Lua 值。需要时,它们会被 JIT 编译为机器代码。

于 2015-10-26T17:42:55.930 回答
5

哪有这回事。可以扩展 MetaLua 来做到这一点,但没有人这样做,而且 AFAIK,没有计划这样做。Lua 是一种动态语言,如果您想要一种静态类型的语言,请使用它。

您实际上要寻找的是 Java 或 C# 之类的东西。在这种情况下,您可以使用Lua.NET 之类的项目将现有的 Lua 代码与 C# 集成。还有用于 Java的Kahlua 。

于 2009-05-02T01:36:04.867 回答
4

PUC-Rio 刚刚在 Dyla'14 上发表了一篇新论文“Typed Lua: An Optional Type System for Lua”。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

于 2014-07-03T23:57:15.863 回答
3

还有拉维 https://github.com/dibyendumajumdar/ravi

Ravi 编程语言是 Lua 5.3 的衍生版本,具有有限的可选静态类型和基于 LLVM 和 libgccjit 的 JIT 编译器

我真的很喜欢在 Terra 中编程(见上文)

于 2016-12-03T20:58:11.290 回答
1

我推荐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

于 2020-09-09T02:19:27.720 回答