Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Пожалуйста, смотрите это сообщение в блоге 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 как все-шапки!

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

Существует также Рави https://github.com/dibyendumajumdar/ravi

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

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