2009-05-02 2 views
16

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

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

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

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

+6

Кстати, вы говорите, сильная печать, но я думаю, вы имеете в виду статическую типизацию. Есть разница. Например, Python строго типизирован, но динамически типизирован. C слабо типизирован, но статически типизирован. – Zifre

ответ

14

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

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

+0

Я слышал, что вы говорите; Я много размышлял над этим, и, хотя кажется, что очень просто охватить самые основные случаи (например, ловить локальный х: int = «привет» как ошибку), все становится очень трудным, когда вы начинаете беспокоиться о таблицах или возвращая типизированные кортежи из функций. Но эти ребята из Adobe разобрались с Javascript! – Armentage

+0

Стол и бесконечное количество способов, которыми они используются, определенно являются проблемой. Если вы хотите иметь много аннотаций, вещи, вероятно, упрощаются. –

+2

Норман, знания должны делиться. Мне бы очень хотелось узнать, какие выводы вы сделали в своем исследовании! – alphazero

4

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

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

+0

Я не ищу LUA.NET. LUA.NET подразумевает какую-то среду выполнения .NET. Среда выполнения .NET не похожа на VMA ByteCode LUA. То, что я ищу, будет применять только сильную типизацию во время компиляции байта, а затем запустить полученный код, блаженно не осознавая, что с ним во время компиляции произошло что-то необычное. – Armentage

+0

К сожалению, я уже работаю с большой (и растущей) базой кода LUA. Из-за природы LUA изменение любого существующего библиотечного кода практически невозможно. * Необязательный * сильный вводный интерфейс решит эту проблему, не обязательно меняя основное чувство языка. – Armentage

+5

@Armentage, Lua не является аббревиатурой, это собственное имя. Написано «Lua», а не «LUA». См. Http://www.lua.org/about.html#name для официальной истории. – RBerteig

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!

3

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

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

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

+0

Слайды для бумаги Dyla14 доступны: http://www.lua.org/wshop14/Murbach.pdf –

4

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

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

+1

Это действительно выглядит довольно круто. – Tomis

2

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

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

Я действительно наслаждаюсь программирую в Terra (см.выше)