- Lua
-
Lua Класс языка: мультипарадигмальный:
скриптовый,
императивный,
функциональный,
объектно-ориентированный (прототипный)Тип исполнения: Появился в: 1993
Автор(ы): Руберту Иерузалимски,
Вальдемар Селес,
Луис Энрике ди ФигейредуРелиз: 5.2.1 (14 июня 2012)
Типизация данных: динамическая, слабая («утиная»)
Основные реализации: Диалекты: Испытал влияние: Повлиял на: Io, GameMonkey, Squirrel, Dao, MiniD
Лицензия Сайт: Lua ([лу́а], порт. «луна») — интерпретируемый язык программирования, разработанный подразделением Tecgraf Католического университета Рио-де-Жанейро (Computer Graphics Technology Group of Pontifical Catholic University of Rio de Janeiro in Brazil). Является свободно распространяемым, с открытыми исходными текстами на языке Си.
По возможностям, идеологии и реализации язык ближе всего к JavaScript, однако Lua отличается более мощными и гораздо более гибкими конструкциями. Хотя Lua не содержит понятия класса и объекта в явном виде, механизмы объектно-ориентированного программирования с поддержкой прототипов (включая множественное наследование) легко реализуются с использованием метатаблиц, которые также делают возможной перегрузку операций и т. п. Реализуемая модель объектно-ориентированного программирования (как и в JavaScript) — прототипная.
Lua в переводе с португальского значит «луна».
В настоящее время (ноябрь 2012) проводится работа по внедрению поддержки Lua в движок Mediawiki[2][3].
Содержание
История
Lua разработан подразделением Tecgraf Католического университета Рио-де-Жанейро в Бразилии (Computer Graphics Technology Group, Pontifícia Universidade Católica do Rio de Janeiro), история языка ведёт отсчёт с 1993 года. Авторами языка стали Роберто Иерусалимски, Luiz Henrique de Figueiredo и Waldemar Celes. Lua распространяется свободно, с открытыми исходными текстами на языке Си.
Некоторые возможности
Lua обычно называют мультипарадигменным языком. Он обеспечивает небольшой набор базовых механизмов, которые могут быть расширены для решения различных задач, а не набор сложных жёстких спецификаций, обеспечивающих программирование в единой парадигме.
Так, в Lua отсутствует явная поддержка наследования, однако оно легко реализуется с помощью метатаблиц.
Параллельное присваивание
Подобно таким скриптовым языкам, как Perl, Python, Ruby и Icon, допускает параллельное присваивание. В простейшем случае это позволяет писать выражения вида
x, y = y, x
Типы
Lua представляет собой язык с динамическим определением типов данных. Переменная языка может содержать значения любого типа. Все значения в Lua могут храниться в переменных, использоваться в качестве аргументов при вызове функций и возвращаться в виде результата их выполнения.
В Lua восемь основных типов:
- nil (неопределенный)
- boolean (логический)
- number (числовой)
- string (строковый)
- function (функция)
- userdata (пользовательские данные)
- thread (поток)
- 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. В следующем примере демонстрируется «бесконечная» таблица. Для любого ,
fibs[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[4]. Также разработан компилятор llvm-lua[5], генерирующий код для виртуальной машины LLVM, предоставляющей возможность последующей компиляции в очень эффективный машинный код для процессоров различной архитектуры.
Использование
В настоящее время используется в различных проектах, где требуется встроить достаточно быстрый и нетрудный в освоении скриптовый язык программирования — например, в разработке игр, где Lua часто используется между игровым «движком» и данными для написания сценариев поведения/взаимодействия объектов.
Игры
См. также категорию: Игры, использующие язык LuaПервыми в разработку компьютерных игр язык Lua внедрила компания LucasArts, начиная с игры Grim Fandango[6]. Авторы языка в своём докладе на конференции HOPL (англ.)русск. вспоминают, что в январе 1997 они получили сообщение от Брета Могилефски, главного разработчика Grim Fandango, где он писал, что, прочитав о языке в статье 1996 года в Dr. Dobb’s Journal, он планирует заменить используемый ими самодельный скриптовый язык SCUMM на Lua[7]. В результате им был создан игровой движок GrimE, используемый также более поздним квестом от LucasArts — Escape from Monkey Island.
В 2003 году в результате опроса на сайте GameDev.net Lua был признан самым популярным скриптовым языком для разработки игр[8].
Примером игры, программируемой с помощью Lua, является World of Warcraft.[9][10] На языке Lua описываются уровни игры-головоломки Enigma[11].
В играх S.T.A.L.K.E.R используется Lua (скрипт смены группировки):
function select_actor_community(actor, npc) db.actor:set_character_community("dolg", 0, 0) -- сменит группировку игрока на "долг" end
В модификации Garry's Mod. Lua является основным инструментом. Используется для реализации игровых режимов и дополнений.
Программное обеспечение
Список примеров в этой статье не основывается на авторитетных источниках непосредственно о предмете статьи. Добавьте ссылки на источники, предметом рассмотрения которых является тема настоящей статьи в целом, и содержащие данные элементы списка как примеры. В противном случае раздел может быть удалён.- Пользовательский интерфейс Adobe Photoshop Lightroom написан с использованием Lua
- Плагин Amnesia позволяет автоматизировать обработку событий в R&Q с помощью Lua
- Конфигурационные файлы Awesome (динамический оконный менеджер для X Window System) используют язык программирования Lua
- Библиотека виджетов BUIW для BREW использует Lua для описания файлов тем
- В Celestia, свободной трёхмерной астрономической программе, Lua используется для написания расширений и плагинов
- Программа для системного мониторинга Conky использует Lua как язык скриптов для расширения возможностей
- В файлообменной сети Direct Connect Lua широко используется как язык скриптов в программном обеспечении сети
- Dr.Web Enterprise Suite
- HandyCache использует Lua как язык для написания расширений
- Фреймовый оконный менеджер Ion использует Lua для настройки и добавления новых функций (возможностей)
- IP-PBX Asterisk имеет возможность использовать Lua как язык управления вызовов (диалплан)
- MySQL proxy использует Lua как встроенный язык для реализации возможностей своей функциональности
- Платформа OpenAT позволяет разрабатывать пользовательские приложения на Lua
- В OpenWRT на Lua написан веб интерфейс управления
- Текстовый редактор SciTE использует Lua как язык скриптов для расширения возможностей
- uiOne использует Lua как язык скриптов при создании пользовательских интерфейсов на языке TrigML
- Медиаплеер VLC использует Lua как язык скриптов
- Сниффер Wireshark использует Lua как язык для создания анализаторов сетевых протоколов.
- Автоматизированная мобильная система Агент+ использует Lua как язык скриптов для расширения возможностей
- Клавиатуры Logitech серии G (клавиатуры для геймеров) поддерживают написание скриптов на Lua.
- Начиная с версии 7.3 текстовый редактор Vim поддерживает сценарии на Lua.
- Lua поддерживается NSClient++ как язык скриптов для расширения возможностей
- В СУБД CronosPro[12] Lua используется для создания сценариев управляющих (кнопочных) форм и форм ввода
- FXCM Marketscope Charts использует язык Lua для написания технических индикаторов и торговых стратегий.
- Треккер (DAW) Renoise поддерживает использование Lua для написания дополнений расширяющих возможности программы
- Начиная с Far 3.0.2851, в Фаре вместо встроенного макроязыка используется скриптовый язык Lua 5.1.
IDE
Примечания
- ↑ Lua Implementations (англ.). Lua-users wiki. Архивировано из первоисточника 24 августа 2011. Проверено 18 мая 2009.
- ↑ Wikimedia Foundation Report, April 2012 (англ.). Архивировано из первоисточника 23 июня 2012. Проверено 10 мая 2012.
- ↑ Lua scripting // MediaWiki
- ↑ The LuaJIT Project
- ↑ llvm-lua. JIT/Static compiler for Lua using LLVM on the backend.
- ↑ Bret Mogilefsky Lua in Grim Fandango. Архивировано из первоисточника 4 февраля 2012. Проверено 9 декабря 2011.
- ↑ HOPL, 2007, с. 11
- ↑ Which language do you use for scripting in your game engine?. GameDev.net — Poll Results
- ↑ Paul Emmerich Beginning Lua with World of Warcraft Add-ons. — Apress, July 2009. — ISBN 1430223715
- ↑ James Whitehead II, Bryan McLemore, and Matthew Orlando World of Warcraft Programming. — Wiley, May 2008. — ISBN 0470229810
- ↑ 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
- ↑ ИСУБД CronosPRO
Ссылки
- Официальный сайт разработчиков Lua (англ.)
- Сайт проектов Lua (англ.)
- Сайт пользователей Lua (англ.)
- Cправочное руководство Lua 5.2 (англ.)
-
- История языка
- R. Ierusalimschy, L. H. de Figueiredo, W. Celes The evolution of Lua // Proceedings of ACM HOPL III. 2-1–2-26. — 2007.
- Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes The evolution of an extension language: a history of Lua. Reprint from Proceedings of V Brazilian Symposium on Programming Languages (2001) B-14–B-28.. Архивировано из первоисточника 4 февраля 2012. Проверено 9 декабря 2011.
-
- Lua-проекты
- Kepler Project team — Платформа веб-разработки под Lua (англ.)
- LuaGL — интерфейс к OpenGL для Lua 5.1
Lua на русском
-
- Переводы руководств
- Справочное руководство по языку Lua 5.1
- Lua за 60 минут - ракурс синтаксиса и возможностей языка программирования Lua
- Русскоязычный мануал по Lua 5.0 — фрагмент справочного руководства по языку Lua 5.0 для написания скриптов для игр Heroes of Might and Magic V и Серп и молот
- Справочное руководство по языку Lua 4.0
-
- Статьи и обзоры
- Создание встраиваемых сценариев на языке Lua, Мартин Страйчер
- Еще один «летний» язык программирования (часть 2; часть 3; часть 4), Андрей Зубинский
- Введение в Lua, Ash Matheson — перевод статьи An Introduction to Lua (англ.)
- Введение в Lua, Keith Fieldhouse — перевод статьи Introducing Lua (англ.)
- Cерия статей о Lua
- Добавление скриптинга в программу с помощью Lua
- Использование Lua в робототехнике
- Язык Lua и использование скриптов на нём в программах на С++ (часть 2), Алексей Боресков
-
- Прочее
- Я люблю Lua, Илья Белов — уроки по использованию Lua совместно с С++
- — сообщество «Lua» в Живом Журнале
Lua Интерпретаторы и компиляторы Lua • Parrot Фреймворки и библиотеки IUP • Kepler • LÖVE Порты и дистрибутивы Plua • Lua Player • Corona IDE Decoda SciTE • Сравнение Приложения Prosody Основные языки программирования (сравнение • IDE • история • хронология) Используемые
в разработкеАда • APL • Язык ассемблера • ActionScript • ABAP/4 • AutoIt • AWK • Бейсик • Си • Кобол • C++ • C# • Cω • Clarion • Clojure • ColdFusion • Common Lisp • D • dBase • Delphi • Eiffel • Erlang • Euphoria • F# • Форт • Фортран • Gambas • Go • Groovy • HAL/S • Haskell • Icon • Java • JavaScript • Limbo • Lua • Модула-3 • Object Pascal • Objective-C • OCaml • Oz • Parser • Паскаль • Компонентный Паскаль • Perl • PHP • PowerBASIC • Python • ПЛ/1 • Пролог • Ruby • Scala • Scheme • Smalltalk • SQL • PL/SQL • Tcl • Vala • Visual Basic (.NET)
Академические IEC 61131-3 Instruction List • ST • FBD • Ladder Diagram (LD) • SFC
Прочие Эзотерические Визуальные Категории:- Появились в 1993 году
- Языки программирования по алфавиту
- Lua
- Скриптовые языки
- Свободные библиотеки программ
- Свободные компиляторы и интерпретаторы
- Языки программирования, появившиеся в 1990-х
Wikimedia Foundation. 2010.