【问题标题】:Statically typed Lua静态类型的 Lua
【发布时间】:2010-10-23 06:30:30
【问题描述】:

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

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

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

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

【问题讨论】:

  • 顺便说一下,你说的是强类型,但我认为你的意思是静态类型。它们是有区别的。例如,Python 是强类型的,但是是动态类型的。 C 是弱类型的,但是是静态类型的。

标签: compiler-construction lua static-typing


【解决方案1】:

在 2005 年夏天左右,我与 incredibly smart undergraduate student 合作解决了为 Lua 进行一些编译时类型推断的问题,可能通过注释来辅助。事实证明,这个问题非常困难! (我的学生写了一篇简短的技术说明,但它并不是真正用于普遍传播的。)

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

【讨论】:

  • 我听到你在说什么;我对此进行了很多思考,虽然它似乎很简单地涵盖了最基本的情况(即捕获 local x:int = "hello" 作为错误),但当您开始担心表格或从函数返回类型化元组。但是 Adob​​e 的那些人用 Javascript 解决了这个问题!
  • 表格和它们的无限使用方式绝对是问题所在。如果你愿意有很多注释,事情可能会变得更简单。
  • 诺曼,知识应该被分享。我很想知道你的研究结论是什么!
  • @Armentage:请注意,另一个困难是您需要将此类型系统公开给用户数据之类的东西,从而允许创建可以检查的新类型。记住:Lua 的主要目的是嵌入,所以如果你有类型安全,它需要与语言的用户扩展很好地结合。
【解决方案2】:

请参阅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 是第一个要看的工具。

附:请never write Lua as all-caps

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 我不是在寻找 LUA.NET。 LUA.NET 意味着某种 .NET 运行时。 .NET 运行时与 LUA ByteCode VM 完全不同。我正在寻找的只会在字节编译时应用强类型,然后幸福地运行生成的代码,而不知道在编译时发生了任何异常情况。
      • 不幸的是,我已经在使用一个庞大的(并且不断增长的)LUA 代码库。由于 LUA 的性质,更改任何现有的库代码几乎是不可能的。 可选强类型前端可以解决这个问题,而不必改变语言的基本感觉。
      • @Armentage,Lua 不是首字母缩写词,它是专有名词。它写成“Lua”,而不是“LUA”。官方报道见lua.org/about.html#name
      • @Armentage:如果你想在秋天学习这个,我可能会找到一个感兴趣的学生。
      • 我们公司有个实习生在夏天做了这样的事情。结果很有趣......他的导师实际上让他在 Haskell 中构建了他的类型安全的 lua 预处理器......
      【解决方案5】:

      有一篇来自 PUC-Rio 的新论文“Typed Lua: An Optional Type System for Lua”刚刚在 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.

      【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

        【解决方案7】:

        我推荐EmmyLua

        这是一个支持打字文档的 Intellij/VSCode 插件。我发现整体记录方法非常友好。也感谢它的 IDE 支持,EmmyLua 也支持提示。

        这是 EmmyLua 文档的小 sn-p:

        --- @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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-26
          • 2010-12-02
          • 2012-07-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多