Lua

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
Lua
Lua-logo-nolabel.svg
Класс языка:

мультипарадигмальный:
скриптовый,
императивный,
функциональный,
объектно-ориентированный (прототипный)

Тип исполнения:

интерпретируемый, JIT

Появился в:

1993

Автор(ы):

Роберту Иерузалимски,
Валдемар Селиш,
Луиш Энрике ди Фигейреду

Выпуск:

5.2.3 (7 декабря 2013)

Система типов:

динамическая, строгая, «утиная»

Основные реализации:

Lua, LuaJIT, LLVM-Lua, LuaCLR, Nua, Lua Alchemy и др.[1]

Диалекты:

MetaLua

Испытал влияние:

Scheme, Снобол, Модула, Клу, C++

Повлиял на:

Io, GameMonkey, Squirrel, Dao, MiniD

Лицензия

лицензия MIT

Сайт:

lua.org

ОС:

кроссплатформенное программное обеспечение

Lua ([лу́а], порт. «луна») — интерпретируемый язык программирования, разработанный подразделением Tecgraf Католического университета Рио-де-Жанейро (Computer Graphics Technology Group of Pontifical Catholic University of Rio de Janeiro in Brazil). Разработанный интерпретатор является свободно распространяемым, с открытыми исходными текстами на языке Си.

По возможностям, идеологии и реализации язык ближе всего к JavaScript, однако Lua отличается более мощными и гораздо более гибкими конструкциями. Хотя Lua не содержит понятия класса и объекта в явном виде, механизмы объектно-ориентированного программирования, включая множественное наследование, легко реализуются с использованием метатаблиц, которые также отвечают за перегрузку операций и т. п. Реализуемая модель объектно-ориентированного программирования — прототипная (как и в JavaScript).

Язык широко используется для создания тиражируемого программного обеспечения — в частности, на нём написан графический интерфейс пакета Adobe Lightroom. Также получил известность как язык программирования уровней и расширений во многих играх (например, World of Warcraft) из-за удобства встраивания, скорости исполнения кода и лёгкости обучения[2].

История[править | править вики-текст]

Lua разработан подразделением Tecgraf (группа технологий компьютерной графики) Католического университета Рио-де-Жанейро в Бразилии, история языка ведёт отсчёт с 1993 года. Авторы языка — Роберту Иерузалимски, Луиш Энрике ди Фигейреду (Luiz Henrique de Figueiredo) и Валдемар Селиш (Waldemar Celes). Lua распространяется свободно, с открытыми исходными текстами на языке Си.

Историческими родителями LUA были языки описания конфигураций и данных (англ. data-decription/configuration) SOL (Simple Object Language) и DEL (data-entry language). Они были независимо разработаны в Tecgraf в 1992—1993 годах, чтобы добавить гибкости в два различных проекта (оба были интерактивными графическими программами для конструкторских приложений в компании Petrobras). Отсутствовало какое-либо управление потоками структур в SOL и DEL и Petrobras чувствовал растущую необходимость в добавлении программной мощности для них.

Как писал автор языка в The Evolution of Lua:

В 1993 единственным реальным претендентом был Tcl, который был спроектирован для встраивания в приложения. Однако у Tcl был непривычный синтаксис и не было хорошей информационной поддержки, к тому же запускался он только на платформах Unix. Мы не рассматривали LISP или Schema из-за их недружелюбного синтаксиса. Python был только в развивающейся стадии. В атмосфере "сделай сам", которая тогда царила в Tecgraf, это было вполне естественно, что мы решили разработать наш собственный скриптовый язык. Из-за того, что большинство пользователей не были профессиональными программистами, языку следовало избегать замысловатого синтаксиса и семантики. Представление нового языка должно быть очень портативно, так как клиенты Tecgraf имели очень разнообразные платформы. Наконец, поскольку мы ожидали, что другие продукты Tecgraf также должны вставлять скриптовый язык, новый язык должен следовать примеру SOL и предоставляться в виде библиотеки с C API.

LUA 1.0 был разработан таким образом, что конструктор объектов, не сильно отличающийся от текущего легкого и гибкого стиля, включал описание данных синтаксиса SOL (отсюда и название LUA — по португальски SOL — солнце, а lua — луна). Синтаксис Lua для управляющих структур в основном заимствован из Modula (if, while, repeat/until), но на него также повлиял и CLU (множественное присвоение, множественное возвращаемое значение функции, более простая альтернатива для ссылочных параметров или явных указателей), C++ («отличная идея, чтобы позволить локальной переменной быть объявленной только там, где нам это нужно») SNOBOL и AWK (ассоциативные массивы). В статье, опубликованной в журнале доктора Добба, создатели Lua также утверждают, что единый, вездесущий механизм языков структуры данных LISP и Scheme, использующих в качестве базовой структуры данных связный список, оказал большое влияние на их решения о выборе таблицы в качестве основной структуры данных Lua.

Версии Lua до версии 5.0 были выпущены под лицензией, подобной лицензии BSD. Начиная с версии 5.0 и далее, Lua была лицензирована под лицензией MIT. Обе лицензии свободного программного обеспечения практически идентичны.

Некоторые возможности[править | править вики-текст]

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

Так, в Lua отсутствует явная поддержка наследования, однако оно легко реализуется с помощью метатаблиц.

В общем, Lua стремится обеспечить гибкие мета-функции, которые могут быть расширены по мере необходимости, а не поставлять набор функций, специфичных для одной парадигмы программирования. Как результат основной язык легкий и легко адаптируемый к большинству приложений.

Lua — это динамически типизированный язык, предназначенный для использования в качестве расширения или в качестве скриптового языка, и достаточно компактен, чтобы поместиться на различных принимающих платформах. Он поддерживает небольшое количество структур данных, такие как логические значения, числа (по умолчанию — двойной точности с плавающей точкой), а также строки. Типичные структуры данных, такие как массивы, наборы, списки и записи, могут быть представлены с использованием родной структуры данных Lua — таблицы, которая по существу является гетерогенным ассоциативным массивом.

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

Параллельное присваивание[править | править вики-текст]

Подобно таким скриптовым языкам, как Perl, Python, Ruby и Icon, допускает параллельное присваивание. В простейшем случае это позволяет писать выражения вида:

x, y = y, x

Типы[править | править вики-текст]

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

В Lua восемь основных типов:

  1. nil (неопределенный)
  2. boolean (логический)
  3. number (числовой)
  4. string (строковый)
  5. function (функция)
  6. userdata (пользовательские данные)
  7. thread (поток)
  8. table (таблица)

nil — это тип значения nil [пустое значение], главное свойство которого — отличаться от всех остальных значений и обозначать отсутствие пригодного значения. К типу boolean относятся значения false (ложь) и true (истина). Значения nil и false считаются ложными, любое другое значение считается истинным. К типу number относятся обычно вещественные числа (double), но внутреннее представление чисел можно изменить при сборке интерпретатора. Тип string обозначает массивы символов. Строки Lua могут содержать любые 8-битные символы, включая ноль ('\0'). Строки неизменяемы.

Таблицы[править | править вики-текст]

Таблицы являются самым важным типом данных в Lua и являются фундаментом для пользовательских типов данных, таких как структуры, массивы, списки, множества. Таблица в Lua представляет собой набор пар — (Ключ, Значение). Ключом может выступать значение любого типа, кроме nil.

Замыкания[править | править вики-текст]

Lua поддерживает концепцию замыканий, например:

function makeaddfunc(x)
  -- Возвращает новую анонимную функцию, которая добавляет x к аргументу
  return function(y)
    -- Когда мы ссылаемся на переменную x, которая вне текущей области,
    -- и время жизни которой меньше, чем этой анонимной функции, 
    -- Lua создаёт замыкание.
    return x + y
  end
end
plustwo = makeaddfunc(2)
print(plustwo(5)) -- Выводит 7

Каждый раз, когда вызывается makeaddfunc, создаётся новое замыкание для переменной x, так что каждая возвращаемая анонимная функция будет ссылаться на свой параметр x. Как и у любого другого объекта Lua, временем жизни замыкания управляет сборщик мусора.

Примеры кода[править | править вики-текст]

Классическая программа «Hello, world!» на Lua выглядит вот так:

print("Hello World!")

Для комментариев используется следующий синтаксис, близкий к языкам Ada, SQL и VHDL:

-- Комментарии в Lua начинаются с двойного дефиса и продолжаются до конца строки.
--[[Многострочные текстовые литералы и комментарии
 берут в двойные квадратные скобки.]]

Факториал — пример рекурсивной функции:

function factorial(n)
  if n == 0 then
    return 1
  else
    return n * factorial(n - 1)
  end
end

Цикл со счётчиком:

for i = 1,5 do
     -- Statements
end

Работа с функциями как с объектами первого класса демонстрируется в следующем примере, в котором модифицируется поведение функции print:

do
  local oldprint = print   -- Сохраняем текущую функцию print как oldprint
  function print(s)        -- Переопределяем функцию print
    if s == "foo" then
      oldprint("bar")
    else
      oldprint(s)
    end
  end
end

Любой будущий вызов print теперь будет перенаправлен к будущей функции, и благодаря поддержке в Lua лексического контекста, старая функция print будет доступна только посредством новой, модифицированной функции print. Lua также поддерживает замыкания, как описано выше, в соответствующем разделе.

Ключевой особенностью Lua является расширяемая семантика, механизм метатаблиц даёт большие возможности по настройке уникального поведения для таблиц Lua. В следующем примере демонстрируется «бесконечная» таблица. Для любого n, fibs[n] даст nчисло Фибоначчи с использованием мемоизации.

fibs = { 1, 1 } -- Первоначальные значения для fibs[1] и fibs[2].
setmetatable(fibs, { 
  __index = function(name, n)            -- Вызов функции, если fibs[n] не существует.
    name[n] = name[n - 1] + name[n - 2]  -- Расчёт и мемоизация fibs[n].
    return name[n]                       
  end
})

Реализация[править | править вики-текст]

Как и многие интерпретируемые языки программирования, реализация Lua имеет отдельно компилятор с исходного языка в исполняемый байт-код и виртуальную машину для исполнения сгенерированного байт-кода. Причём байт-код — это не команды стековой машины, а команды некоего виртуального процессора с несколькими регистрами, что повышает эффективность исполнения. В стандартной виртуальной машине Lua используется распределение памяти со сборкой мусора (аналогично Java или .NET).

Lua использует единый строковый пул, что позволяет снизить расходы памяти на хранение строк.

Для задач, критичных по времени, имеется JIT-компилятор Lua — LuaJIT[3]. Также разработан компилятор llvm-lua[4], генерирующий код для виртуальной машины LLVM, предоставляющей возможность последующей компиляции в очень эффективный машинный код для процессоров различной архитектуры.

Использование[править | править вики-текст]

В настоящее время используется в различных проектах, где требуется встроить достаточно быстрый и нетрудный в освоении скриптовый язык программирования — например, в разработке игр, где Lua часто используется между игровым «движком» и данными для написания сценариев поведения/взаимодействия объектов.

Игры[править | править вики-текст]

Первыми в разработку компьютерных игр язык Lua внедрила компания LucasArts, начиная с игры Grim Fandango[5]. Авторы языка в своём докладе на конференции HOPL (англ.)русск. вспоминают, что в январе 1997 они получили сообщение от Брета Могилефски, главного разработчика Grim Fandango, где он писал, что, прочитав о языке в статье 1996 года в Dr. Dobb’s Journal, он планирует заменить используемый ими самодельный скриптовый язык SCUMM на Lua[6]. В результате им был создан игровой движок GrimE, используемый также более поздним квестом от LucasArts — Escape from Monkey Island.

В 2003 году в результате опроса на сайте GameDev.net Lua был признан самым популярным скриптовым языком для разработки игр[7].

Примером игры, программируемой с помощью Lua, является World of Warcraft.[8][9] На языке Lua описываются уровни игры-головоломки Enigma[10].

IDE[править | править вики-текст]

Примечания[править | править вики-текст]

  1. Lua Implementations (англ.). Lua-users wiki. Проверено 18 мая 2009. Архивировано из первоисточника 24 августа 2011.
  2. Why is Lua considered a game language?. Stack Overflow. Проверено 23 апреля 2010.
  3. The LuaJIT Project
  4. llvm-lua. JIT/Static compiler for Lua using LLVM on the backend.
  5. Bret Mogilefsky. Lua in Grim Fandango. Проверено 9 декабря 2011. Архивировано из первоисточника 4 февраля 2012.
  6. HOPL, 2007, с. 11
  7. Which language do you use for scripting in your game engine?. GameDev.net — Poll Results
  8. Paul Emmerich Beginning Lua with World of Warcraft Add-ons. — Apress, July 2009. — ISBN 1430223715.
  9. James Whitehead II, Bryan McLemore, and Matthew Orlando World of Warcraft Programming. — Wiley, May 2008. — ISBN 0470229810.
  10. Tom Gutschmidt Ch. 8. The Lua Game Community → Game Engines // Game Programming with Python, Lua, and Ruby. — Premier Press, 2003. — 472 p. — ISBN 1-59200-079-7.
  11. ZeroBrane Studio - Lua IDE/editor/debugger for Windows, Mac OSX, and Linux
  12. Lua Development Tools

Ссылки[править | править вики-текст]

История языка
Lua-проекты
  • Kepler Project team — Платформа веб-разработки под Lua (англ.)
  • LuaGL — интерфейс к OpenGL для Lua 5.1
  • LuaFAR — движок Lua-плагинов и скриптов для файлового менеджера

Lua на русском[править | править вики-текст]

Переводы руководств
Статьи и обзоры