Статически типизированный Lua

Я ищу компилятор Lua front-end, который проверяется во время компиляции, но выводит стандартный байт-код Lua 5.1 (который имеет только типы времени выполнения). Мне нужно приличное количество статического синтаксического анализа во время компиляции и необязательного набора текста, чтобы обнаружить тривиальные ошибки раньше, чем во время выполнения. Полученный байт-код должен был бы хорошо играть с существующим байт-кодом Lua, который был скомпилирован со стандартной LoadString().

чтобы быть ясным -- любая разница будет происходить только в байт-компиляции. Во время выполнения байтовый код понятия не имел бы, что на этапе компиляции с ним произошло что-то другое/необычное.

то, что я имею в виду, звучит очень похоже на ActionScript; я бы даже не возражал против компилятора ActionScript, который выводит байтовый код Lua!

кто-нибудь слышал о таком стремлении? Я видел некоторые ссылки на использование MetaLua для этого, но, честно говоря, я недостаточно умен, чтобы сделать головы хвостов их документации

6 ответов


летом 2005 года или около того я работал с невероятно умный студент о проблеме выполнения некоторого вывода типа времени компиляции для Lua, возможно, с помощью аннотаций. Эта задача оказывается невероятно сложной! (Мой студент написал короткую техническую записку, но она не предназначена для общего распространения.)

Если бы я хотел решить проблему, которую вы поставили, с двумя ограничениями, которые он разрешить значительные статические введите проверка и вот это взаимодействие со стандартным байт-кодом, скомпилированным Lua-кодом, Я бы создать новый язык с нуля для удовлетворения этих двух ограничений. Это был бы значительный объем работы, но значительно проще, чем пытаться модернизировать систему типа Lua.


см. это сообщение в блоге 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-первый инструмент для просмотра.

P. S. Пожалуйста никогда не пишите Lua как all-caps!


нет такой вещи. Возможно, для этого можно расширить MetaLua, но никто этого не сделал, и AFAIK, нет никаких планов. Lua предназначен для динамического языка, если вы хотите статически типизированный язык, используйте его.

то, что вы по существу ищете, - это что-то вроде Java или C#. В этом случае вы можете использовать проект типаLua.NET интегрировать существующий код Lua с C#. Существует также Калуа для Java.


этому вопросу шесть лет... но вот новый ответ: http://terralang.org/

Как и C, Terra-это простой, статически типизированный, скомпилированный язык с ручное управление памятью. Но в отличие от C, он разработан из начало взаимодействия с Lua. Функции Terra являются первоклассными Значения Lua, созданные с помощью ключевого слова terra. Когда это необходимо JIT-компиляции в машинный код.


есть новая статья "типизированная Lua: необязательная система типов для Lua" от PUC-Rio, только что опубликованная в Dyla'14. http://dl.acm.org/citation.cfm?id=2617553

речь идет о "начальном дизайне типизированного Lua, необязательно типизированного расширения языка сценариев Lua". Это все еще продолжается, и система типов по-прежнему относительно проста. Нет тип вывода/тип проверки инструмента не предусмотрено.

относительно metalua основанной печатая системы, приливной замок: опционный статическая проверка типа и вывод для Lua от Fabien. http://lua-users.org/lists/lua-l/2013-02/msg00403.html.


появилась Рави https://github.com/dibyendumajumdar/ravi

язык программирования Ravi является производной от Lua 5.3 с ограниченным дополнительным статическим типом и компиляторами JIT на основе LLVM и libgccjit

Мне очень нравится программировать на Терре (см. выше)