Мне нужно найти хороший конвертер Lua в JavaScript; lua2js на luaforge.org устарел (3 года или около того и похоже, что он не работает на Lua 5.1), и я еще ничего не нашел в Google.
Есть ли у кого-нибудь опыт работы с другими конвертерами? Он должен работать на Lua 5.1 и предпочтительно на основе .NET, но .NET не является обязательным требованием. Интерпретатор javascript lua также будет работать.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это повторяющийся вопрос в списке Lua, я думаю, из-за внешнего сходства двух языков.
К сожалению, есть много важных отличий, которые не так очевидны. Чтобы это работало, нужен либо полноценный компилятор, нацеленный на JS, а не на байт-код Lua, либо переписывание виртуальной машины Lua на JavaScript.
Я не знаю исходных целей Lua2js; но если бы это был просто ограниченный «переводчик», то написание кода Lua, предназначенного для перевода, отрицало бы большинство (все?) приятных вещей в Lua. Например, я не думаю, что вы могли бы использовать функцию в качестве ключа таблицы, поскольку в JavaScript ключи - это только строки (и числа? Я не уверен).
Выбор .NET более разумен, его можно было бы сделать, изменив существующий компилятор для выдачи байт-кода CLR вместо стандартного байт-кода Lua. Даже если среда CLR разработана и оптимизирована для других языков, она определенно достаточно универсальна, чтобы работать очень хорошо. Основным препятствием будет доступность библиотек.
Другой вариант, который я только что нашел, - это Эта бумага Роберто Ирусалмши и Фабио Маскаренхас, где они исследуют перевод байт-кода LuaVM в байт-код CLR.
Как обычно в академических статьях, нет указания на дату, когда это было написано, поэтому я понятия не имею, является ли оно новым и революционным или старым и забытым.
Интервью на computerworld.com.au/index.php/id;1028768484 говорит о том, что Lua.NET - это недавний и продолжающийся проект.
Приветствую, в javascript можно использовать функцию как ключ таблицы. Ваше мнение кажется необоснованным.
Я только что пробовал использовать Firefox 3.6.6 и Rhino 1.7r2. любое нестроковое значение (функции, объекты, логические значения, четные числа), которое я использую в качестве ключа, принимается и, казалось, работало, пока я не сделал for (k in t) {console.info(k,typeof(k));}, это все строки. В большинстве случаев это не имеет значения, если оно согласовано; но в Lua все по-другому (в качестве ключа можно использовать любое значение, кроме nil), и от этого зависит много кода. если вам нужен «переводчик» Lua-> JS, вы должны учитывать эти вещи, иначе это будет просто JS с синтаксисом Lua.
Чтобы быть более точным, в Javascript значения преобразуются в их строковые представления перед использованием в качестве ключей. Это может вызвать проблемы, поскольку очень легко привести к конфликту вещей: например, и число 1, и строка «1» имеют одинаковое строковое представление и, по умолчанию, все объекты сериализуются в одну и ту же строку «[object Object]». Еще одно различие между таблицами JS и таблицами Lua заключается в том, что, хотя оба дают undefined / nil при чтении неиспользуемых ключей, в Javascript установка ключа на undefined не удалит его из объекта (он все равно будет итеративным, а hasOwnProperty вернет true).
@davr Если вы используете Lua для других частей своего стека - например, для написания сценариев Nginx или Redis - идея использовать его для внешнего интерфейса довольно привлекательна.
Ссылка lua.inf.puc-rio.br/luanet/lua2il_jucs.pdf - 404 по состоянию на 2016 год.
Перевод на javascript интересен тем, что позволяет заменять javascript на стороне браузера. Мы могли бы также позаботиться о безопасности типов в браузере. Ориентация на javascript как платформу нацелена на одну из самых распространенных платформ - браузеры планеты. GWT делает java2js, но я не уверен, хочу ли я ввести GWT только для нескольких страниц в приложении. Я должен об этом подумать. Для вашей функции в качестве ключа в таблице должна быть какая-то магия. Возможно, просто назначьте уникальное имя каждой функции при компиляции и используйте его для своего ключа. Вы также можете добавить префикс ко всем вашим ключам для проверки типов, и это хорошее начало.
Один из способов сделать это - использовать LuaSub и генерировать JavaScript вместо вывода Lua. Это можно сделать, приложив разумные усилия (в настоящее время LuaSub этого не делает).
Места, в которых JS нельзя подогнать под требования Lua, могут быть обнаружены во время компиляции и вызвать ошибку.
Я собираюсь делать много JS + SVG в будущем, и если сторона JS окажется головной болью, это, возможно, стоит попробовать. Если кто-то еще хочет попробовать, сделайте это. Исходный код LuaSub для вас.
Первоначально LuaSub создавался как расширитель синтаксиса для Lua 5.1, чтобы представить концепции простоты использования (например, приращение, проверка типа) без нарушения совместимости со стандартным Lua или необходимости исправления его. В этом он похож на MetaLua (который, кажется, стал более обычным).
Emscripten содержит интерпретатор Lua, преобразованный в JavaScript. Вы можете попробуйте в своем браузере. Однако размер составляет 1,5 МБ.
Я написал частично полный статический компилятор Lua to ECMAscript.
https://github.com/mherkender/lua2js-experiment
Это может не соответствовать вашим потребностям, поскольку в проекте отсутствуют многие ключевые функции, и я не тороплюсь с его завершением, потому что это тупиковый путь. Подробнее читайте в README.
Несмотря на некоторые опасения, которые я видел в Интернете, есть только несколько специфичных для Lua функций (например, функции * fenv или большая часть библиотеки отладки), которые Javascript не может поддерживать. Другие, например файловая библиотека, ограничены функциями, к которым имеет доступ виртуальная машина.
Я также лично пробовал вариант Lua + Emscripten, и, хотя он впечатляет, он также очень медленный.
ljs имеет рабочую демонстрацию lua vm в javascript. Исходный код можно даже скомпилировать в браузере с помощью интерпретатора lua, написанного на lua.
Появляется новый претендент: Lua.js https://github.com/mherkender/lua.js
Для некоторых замечательных демонстраций, подтверждающих его зрелость, см. https://github.com/ghoulsblade/love-webplayer
Lua.js работает путем преобразования кода Lua непосредственно в ECMAscript (включая JavaScript, ActionScript), что дает ему важное преимущество в скорости по сравнению с решениями, которые пытаются реализовать виртуальную машину Lua на JavaScript.
@Akavel попытался отредактировать этот ответ, чтобы добавить некоторую информацию. Правка не прошла процесс утверждения, но, тем не менее, я думаю, что она полезна. Я цитирую: «Некоторые потрясающие демонстрации, подтверждающие его зрелость, см .: github.com/ghoulsblade/love-webplayer Lua.js работает путем преобразования кода Lua непосредственно в ECMAscript (включая JavaScript, ActionScript), что дает ему важное преимущество в скорости по сравнению с решениями, которые пытаются реализовать виртуальную машину Lua в JavaScript ".
я подумал, что вы, вероятно, забыли об этом, поэтому я надеюсь, что вы вернетесь и обновите это
@Breton Я просто получаю синий фон для всех демок? ghoulsblade.schattenkind.net/love-webplayer
Я использовал эту реализацию https://github.com/mherkender/lua.js, о которой упоминалось в предыдущем ответе. Он выполняет либо автономный анализ, либо анализ во время загрузки, и я нашел его очень простым в использовании.
Мои сценарии Lua вызывались через C-функции, и преобразовать этот код C в Javascript и подключить его к lua.js было довольно просто.
посетите http://luajs.org, чтобы увидеть мои работы.
В меню сайта есть демонстрации и тесты.
Это всего лишь 35,5 КБ до сжатия и 12,2 КБ после сжатия. Он может напрямую обращаться к объектам / массивам Javascript. Он обновляется почти каждый день.
Это быстрее, чем lua.vm.js. (Не так быстро из-за метатабильной реализации), и я продолжаю ее оптимизировать.
Ссылка на luajs.org больше не работает.
Невозможно получить доступ к сайту без разрешения уведомлений. Мне кажется подозрительным.
Интересно, какова настоящая цель людей? Они знают Lua и хотят писать JavaScript, не изучая JavaScript? У них есть большое приложение, написанное на Lua, и вы хотите перенести его в веб-приложение с минимальной работой? Мне все это не кажется очень вероятным