The Lua
Однажды (2013г) я пришел к Мячину Михаилу, который занимался в ЯРГУ HiLoad вычислениями на GPU кластере (машинная дагностика заболеваний по снимкам ультразвука и томографии), чтобы посоветоваться на тему языковой основы моей будущей платформы. Я очень его уважал, он был и старше и опытнее меня во всех ИТ вопросах, к тому же у меня был рой мыслей, который трудно разгрести самому.
И когда он сказал тогда, что, вообще-то, ему хватает для экспериментов языка LUA и не надо ничего больше просто потому, что весь код интерпретатора это 100кБайт и он при желании может весь его «поднять за вечер». Я тогда удивился и обратил больше внимания на этот простой и одновременно мощный язык. Когда я уточнил, ведь многие в его области использую C\C++ из-за скорости, а он сказал, что их скорости исполнения очень близки, я еще больше удивился.
В то время я искал «супер вариант» и выравнивал в мозгу кучу фичей других языков и не ожидал, что это может быть Lua … В общем, его совет был неожиданным.
Эта статья о практическом языке Lua, который может в наше время оказать весьма существенную помощь в ваших проектах.
Upd : статья получилась не столько про сам Lua, сколько про то, что с ним связано и что в него траслируется, про платформу Lua , так сказать.
Странности
Скажу сразу: «Lua — очень странный язык».
И есть странности, которые мне самому не нравятся, до такой степени, что я могу писать на нем только периодами, но семантика языка это ерунда по сравнению с его рантаймом. Посудите сами:
- динамический прототипный скриптовой язык, который имеет самый быстрый интерпретатор;
- интерпретатор написан на С и занимает всего 100К в бинарном виде, встраивается в любую программу, его легко модифицировать;
- встраивание позволяет иметь много экземпляров *Engine распределенным по разным вашим потокам (в отличие от V8);
- LuaJit 2.0 — другая реализация Lua, она еще быстрее. Сравнима с C по производительности (небольшое кратное отставание на всех тестах).
Скорость и компактность — это очень важное преимущество.
Еще одно важное примущество для меня в том, что если Вы напишете реализацию какого-то алгоритма на LUA, Вы потом сможете её просто встраивать везде, в любую систему, и не нужно будет переписывать — настоящий «write once use everywhere».
Подробно недостатки этого языка я описал в блоге нашего продукта .
Многие практики их отмечают, однако, я не переживаю на этот счёт, ведь существует много реализаций Lua и некоторые языки транслируются в Lua (lua target compilation).
Всякие реализации
Начнём с того, что лично Вы можете написать свою реализацию. Я говорю это потому, что все другие реализации малы по размеру и написаны чаще всего одним человеком. Я не знаю все реализации, их тысячи.
Редко упоминаются:
- Bright — A C-like Lua Derivative http://bluedino.net/luapix/Bright.pdf
- Agena — An Algol68/SQL like Lua Derivative http://agena.sourceforge.net/
- LuaJIT — A (very impressive) JIT for Lua http://luajit.org
- MetaLua — An ML-style language extension http://metalua.luaforge.net/
- Squirrel — high level imperative/OO programming language
- GSL Shell — interactive CLI with easy access to the GNU Scientific Library (GSL)
- Objective Lua — almost pure superset of Lua that welds the Objective C object orientation system and syntax on top of the classic Lua language
- Jill — Java Implementation of Lua Language
- Dao — OO programming language with soft (or optional) typing, BNF-like macro system
- MoonScript — CoffeeScript inspired language that compiles into lua
- ML module
Хотя, MoonScript достаточно известный проект.
Большая часть официальных описана на официальной страничке http://lua-users.org/wiki/LuaImplementations
транслируются в Lua
Большой интерес у меня вызывают «нормальные языки», которые используют рантайм LUA. Нормальные в кавычках, ведь все сообщество Lua не чуждо самым безумным экспериментам, ведь у них есть такой сумашедший язык…
Terra http://terralang.org/
Terra is a low-level system programming language that is embedded in and meta-programmed by the Lua programming language.
По сути, это низкоуровневый двойник Lua.
Как и C/C++ , Terra это статически типизированный , компилируемый язык с ручным управлением памятью. Но в отличие от C/C++, он изначально спроектирован как метапрограммируемый из Lua.
В Terra его создатели делают C/C++ метасистему гораздо более мощной, заменяя её реальным языком программирования — Lua.
Комбинация низкоуровнего языка программирования и мета-программирования на высокоуровневом языке допускает более разнообразное поведение, не достижимое иным способом. В отличие от C/C++, Terra код может быть Jit-compiled, может делать Lua eval в процессе исполнения, что позволяет легко использовать в софте code generation.
Скажу , что стоит посмотреть на эту технологию повнимательнее, если Вы создаёте свои языки. Мощь метапрограммирования Lua позволяет использовать и его, и особенно Terra для создания новых языков.
Luva
github https://github.com/DetectiveSmith/Luva
Тоже написал один человек, объём кода, как у курсовой работы. Почему я его выделил, спросите Вы ?
В первой же версии заявляются возможности:
- Overloaded functions.
- Different combinations of repeat/while/until for a more customized loop.
- 20+ extra operators, such as >>, +=, —, etc.
- Syntax of tables ({1, 2, 3} becomes [1, 2, 3], and {A = «test», [2] = 30, B3 = 10} becomes [A: «test», 2: 30, B3: 10]
- then/end keywords replaced with { } (If <condition> { <statement> })
- Ability to make objects have their own types.
- Type specification in function declaration.
- Assigning default values when one isn’t given.
- Switch statements.
- Preallocation of arrays.
- Native support for binary numbers.
- You don’t need to end long comments, making it quicker to block off large sections of code.
- Three-way-comparison operator (<=>). A < B = false, A == B = nil, A > B = true. (Why is it here? Just because.)
- Identical operator (===), and it’s counterpart (~==) to compare tables ([1,2,3] == [1,2,3] is false, [1,2,3] === [1,2,3] is true. Beware that the operator uses lazy index checking).
- Unless statements.
- Guard statements.
- Try, With, and Catch statements.
- OOP /w inheritance and sub classes.
- And some other stuff I’ve probably forgot to list.
Можете здесь посмотреть https://github.com/DetectiveSmith/Luva/wiki
Я бы сам не стал писать на таком языке, но это показательно: совсем небольшой объём кода делает из одного языка совершенно другой.
Clue — прикольная штука
Транслирует C в Lua. Это странно, но это работает. Скорость:
- 6.2% от gcc в режиме интерпретации LuaJit.
- 100% от GCC в режиме JIT LuaJit
Т.е., что компилируй C в gcc , что транслируй в Lua и исполняй в Luajit — потери производительности нет.
MetaLua
site : http://lua-users.org/wiki/MetaLua
Если Вы любите Lisp за макросы, а, т.к. Lisp сейчас нигде в таком виде не используется,но Вам хочется, то MetaLua — для Вас.
В Lua5.1 добавляется дополнительный синтаксис, который позволяет взаимодействовать со своими же собственными парсерами. Это позволяет менять восприятие синтаксиса дальнейшего кода.
Metalua is an alternative Lua compiler supporting compile-time metaprogramming and syntax extensions. It also contains a pure Lua library for parsing Lua source into ASTs.
Вот пример подключения расширения «match» для соспоставления с шаблоном и пример использования в коде ниже:
-{ extension "match" } function replace(var, newval, term) match term with | `Var{ v } if v==var -> return newval | `Var{ _ } -> return term | `Lambda{ v, _ } if v==var -> return term | `Lambda{ v, b } -> return Lambda{ v, replace(var, newval, b) } | `Apply{ f, x } -> return `Apply{ replace(var, newval, f), replace(var, newval, x) } end end function reduce_whnf(term) match term with | `Apply{ `Lambda { param, body }, arg } -> local x = replace (param, arg, body) return reduce_whnf(x) | _ -> return term end end
MetaLua используется, например, в проекте http://lua-users.org/wiki/LuaToCee , который транслирует Lua код в C и в проекте оптимизации Lua кода за счёт Inline встраивания функций http://lua-users.org/wiki/SourceOptimizer
tinypy
site: http://www.tinypy.org/
Реализация языка основана на Lua.
Этот проект позволяет запускать Python код на очень маленьких устройствах, типа esp.
Killa & JUAL
site : https://github.com/ex/Killa
Это попытка исправить синтаксис Lua в сторону JS. Прототипы не реализованы, но я ими в JS редко пользуюсь. В остальном — гуд.
Проект сыроват, но уже успешно используется в 2d играх.
Есть другой проект с аналогичными целями site : http://sajonoso.github.io/jual/
На самом деле, если Вам нужно, луше всего поискать не реализации языка одного поверх другого, а просто трасляторы с Lua в JS и наоборот.
MoonScript
Наверное, самый серьезный проект языка, транслируемого в LUA, он работает и популярен.
site : http://moonscript.org/
github : https://github.com/leafo/moonscript/tree/master/moonscript
Однако, мне проект не нравится, т.к. по сути это тот же Lua, у которого те же проблемы. Просто модификация синтаксиса и то спорная.
Это вопрос вкуса, кому какой синтаксис ближе, тот и выбиирает Moon или Lua. Суть от этого не меняется.
haxe.org
site : http://haxe.org/
Очень меня порадовал порт Haxe на Lua target. Это добавляет успеха проекту.
Haxe — язык, который создан упростить интеграцию и портирование. Может работать «везде». Минимум переписывания.
Для менеджмента и бизнеса язык подходит идеально.
В частности данный враппер https://github.com/bartbes/love-haxe-wrappergen позволяет писать на Haxe 2d графику для love, благодаря поддержке Lua.
l2l
site: https://github.com/meric/l2l
Это довольно странная смесь Lisp и Lua, именно смесь, потому что Вы можете смешивать эти языки.
Узкоспециализированная, короче.
SOL
ststus : in progress ; site: https://github.com/emilk/sol
Я надеюсь, что в будущем этот проек созреет, т.к. он призван решить именно недостатки Lua, сохранив его преимущества.
Это:
- типизация lua, энумы
- удаление дурацкой nil логики в таблицах
- классы
- константы
- нет дубликатов мемеберов в объектах
- явное объявление глобалов
Осталось за кадром
Большинство мелких модификаций Lua изменяют его незначительно, например, добавляют в него классы ООП.
На самом Lua можно писать в стиле ООП, но это неудобно, как и на JS тоже.
Создано много экспериментальных технологий на базе Lua или реализованных целиком на Lua, которые не вошли в обзор.
Вы сами можете посмотреть на них, изучив этот список с конца.
В заключение хочу сказать : рантайм языка мне очень нравится своей компактностью и скоростью, мне нравится идеи метапрограммирования Lua и его гибкость.
Можно решать на нём очень разнообразные задачи, если привыкнуть к небольшим недостаткам.
Мы поддержали его в cpvm acapella как главный целевой язык, и возможно поддержим его в PTS (programm transfomation system),а значит, и все языки, которые в него транслируются.
Особенно мне приятно видеть в этом списке Haxe, который сможет работать прямо в облаке. Lisp, который тоже автоматом получает шанс работы в облаке и MoonScript тоже, и подмножество языка JS.
Также, я надеюсь, мы сможем в будущем подключить «малой кровью» к CPVM поверх lua еще много других языков.