Close

18.11.2016

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).

Всякие реализации

Начнём с того, что лично Вы можете написать свою реализацию. Я говорю это потому, что все другие реализации малы по размеру и написаны чаще всего одним человеком.  Я не знаю все реализации, их тысячи.

Редко упоминаются:

Хотя, 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  — прикольная штука

site http://cowlark.com/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 еще много других языков.

 

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *