Категория: Руководства
Lua ([лу?а], порт. «луна» ; не путать с «LUA» [3] это не акроним) — скриптовый язык программирования. разработанный в подразделении Tecgraf (Computer Graphics Technology Group ) Католического университета Рио-де-Жанейро (Бразилия ). Интерпретатор языка является свободно распространяемым. с открытыми исходными текстами на языке Си .
По возможностям, идеологии и реализации язык ближе всего к JavaScript. однако Lua отличается более мощными и гораздо более гибкими конструкциями. Хотя Lua не содержит понятия класса и объекта в явном виде, механизмы объектно-ориентированного программирования. включая множественное наследование. легко реализуются с использованием метатаблиц. которые также отвечают за перегрузку операций и т. п. Реализуемая модель объектно-ориентированного программирования — прототипная (как и в JavaScript).
Язык широко используется для создания тиражируемого программного обеспечения (например, на нём написан графический интерфейс пакета Adobe Lightroom ). Также получил известность как язык программирования уровней и расширений во многих играх (в том числе World of Warcraft ) из-за удобства встраивания. скорости исполнения кода и лёгкости обучения [4] .
СодержаниеLua разработана подразделением Tecgraf (группа технологий компьютерной графики) Католического университета Рио-де-Жанейро в Бразилии, история языка ведёт отсчёт с 1993 года. Авторы языка — Роберту Иерузалимски. Луиш Энрике ди Фигейреду (Luiz Henrique de Figueiredo ) и Валдемар Селиш (Waldemar Celes ). Lua распространяется свободно, с открытыми исходными текстами на языке Си .
Историческими родителями Lua были языки конфигурирования и описания данных SOL (Simple Object Language) и DEL (Data-Entry Language). [5] Они были независимо разработаны в Tecgraf в 1992—1993 годах для добавления некоторой гибкости в два отдельных проекта (оба были интерактивными графическими приложениями для конструкторских нужд в компании Petrobras ). В SOL и DEL отсутствовали какое-либо управляющие конструкции, и Petrobras чувствовал растущую необходимость в добавлении к ним полноценного программирования.
Как пишет автор языка в The Evolution of Lua. [6]
В 1993 году единственным реальным претендентом был Tcl. который был специально создан для встраивания в приложения. Однако у Tcl был непривычный синтаксис, не было хорошей поддержки описания данных, и запускался он только на платформах Unix. Мы не рассматривали LISP или Scheme из-за их недружелюбного синтаксиса. Python был ещё во младенческом возрасте. В атмосфере «сделай сам», которая тогда царила в Tecgraf, было вполне естественно, что мы решили разработать наш собственный скриптовый язык. Из-за того, что большинство пользователей не были профессиональными программистами, языку следовало избегать замысловатого синтаксиса и семантики. Реализация нового языка должна быть легко портируема. так как клиенты Tecgraf имели очень разнообразные платформы. Наконец, поскольку мы ожидали, что другим продуктам Tecgraf также понадобится встроенный скриптовый язык, новый язык должен следовать примеру SOL и предоставляться в виде библиотеки с API на C .
Lua 1.0 была спроектирована таким образом, что её конструкторы объектов, тогда чуть отличающиеся от текущего лёгкого и гибкого стиля, включали в себя синтаксис языка SOL (отсюда название Lua: по-португальски sol — «солнце», lua — «луна»). Управляющие конструкции Lua в основном заимствованы из Modula (if, while, repeat/until), хотя на них также повлияли CLU (параллельное присваивание. множественное возвращаемое значение функции как более простая альтернатива вместо передачи параметров по ссылке или явных указателей ), C++ («отличная идея объявлять локальные переменные лишь тогда, когда они нужны»), SNOBOL и AWK (ассоциативные массивы ). Создатели Lua также признают, что единый вездесущий механизм структурирования данных в LISP и Scheme (связный список ) оказал большое влияние на их решение о выборе таблиц в качестве основной структуры данных для Lua. [7]
Версии Lua вплоть до 5.0 выпускались под лицензией, подобной лицензии BSD. Начиная с версии 5.0 и выше Lua распространяется под лицензией MIT. Обе лицензии являются пермиссивными и практически идентичны.
Некоторые возможности Править
Lua обычно называют мультипарадигменным языком. Он обеспечивает небольшой набор базовых механизмов, которые могут быть расширены для решения различных задач, а не набор сложных жёстких спецификаций, обеспечивающих программирование в единой парадигме .
Так, в Lua отсутствует явная поддержка наследования. однако оно легко реализуется с помощью метатаблиц .
В общем, Lua стремится обеспечить гибкие мета-функции, которые могут быть расширены по мере необходимости, а не поставлять набор функций, специфичных для одной парадигмы программирования. Как результат, основа языка легка и легко адаптируема к большинству приложений.
Lua — это динамически типизированный язык, предназначенный для использования в качестве расширения или в качестве скриптового языка, и при этом достаточно компактный, чтобы поместиться на различных исполняющих платформах. Он поддерживает небольшое количество структур данных, такие как логические значения, числа (по умолчанию — двойной точности с плавающей точкой), а также строки. Типичные структуры данных, такие как массивы, наборы, списки и записи, могут быть представлены с использованием родной структуры данных Lua — таблицы, которая по существу является гетерогенным ассоциативным массивом.
Lua реализует небольшой набор дополнительных функций, такие как сборщик мусора, принудительное приведение типов и прочие. Включая минимальный набор типов данных, Lua пытается найти баланс между мощностью и размером.
Параллельное присваивание ПравитьПодобно таким скриптовым языкам, как Perl. Python. Ruby и Icon. допускает параллельное присваивание. В простейшем случае это позволяет писать выражения вида:
Типы ПравитьLua представляет собой язык с динамическим определением типов данных. Переменная языка может содержать значения любого типа. Все значения в Lua могут храниться в переменных, использоваться в качестве аргументов при вызове функций и возвращаться в виде результата их выполнения.
В Lua восемь основных типов:
nil — это тип значения nil [пустое значение], главное свойство которого — отличаться от всех остальных значений и обозначать отсутствие пригодного значения. К типу boolean относятся значения false (ложь) и true (истина). Значения nil и false считаются ложными, любое другое значение считается истинным. К типу number относятся обычно вещественные числа (double), но внутреннее представление чисел можно изменить при сборке интерпретатора. Тип string обозначает массивы символов. Строки Lua могут содержать любые 8-битные символы, включая ноль ('\0'). Строки неизменяемы.
Таблицы ПравитьТаблицы являются самым важным типом данных в Lua и являются фундаментом для пользовательских типов данных, таких как структуры. массивы. списки. множества. Таблица в Lua представляет собой набор пар — (Ключ, Значение). Ключом может выступать значение любого типа, кроме nil.
Замыкания ПравитьLua поддерживает концепцию замыканий. например:
Каждый раз, когда вызывается makeaddfunc. создаётся новое замыкание для переменной x. так что каждая возвращаемая анонимная функция будет ссылаться на свой параметр x. Как и у любого другого объекта Lua, временем жизни замыкания управляет сборщик мусора.
Примеры кода ПравитьКлассическая программа «Hello, world! » на Lua выглядит вот так:
Для комментариев используется следующий синтаксис, близкий к языкам Ada. SQL и VHDL :
Работа с функциями как с объектами первого класса демонстрируется в следующем примере, в котором модифицируется поведение функции print:
Любой будущий вызов print теперь будет перенаправлен к новой функции, и благодаря поддержке в Lua лексического контекста. старая функция print будет доступна только посредством новой, модифицированной функции print. Lua также поддерживает замыкания. как описано выше, в соответствующем разделе.
Ключевой особенностью Lua является расширяемая семантика, механизм метатаблиц даёт большие возможности по настройке уникального поведения для таблиц Lua. В следующем примере демонстрируется «бесконечная» таблица. Для любого , fibs[n] даст -е число Фибоначчи с использованием мемоизации .
Как и многие интерпретируемые языки программирования. реализация Lua имеет отдельно компилятор с исходного языка в исполняемый байт-код и виртуальную машину для исполнения сгенерированного байт-кода. Причём байт-код — это не команды стековой машины, а команды некоего виртуального процессора с несколькими регистрами, что повышает эффективность исполнения. В стандартной виртуальной машине Lua используется распределение памяти со сборкой мусора (аналогично Java или .NET).
Lua использует единый строковый пул. что позволяет снизить расходы памяти на хранение строк.
Для задач, критичных по времени, имеется JIT -компилятор Lua — LuaJIT [8]. Также разработан компилятор llvm-lua [9]. генерирующий код для виртуальной машины LLVM. предоставляющей возможность последующей компиляции в очень эффективный машинный код для процессоров различной архитектуры.
В настоящее время используется в различных проектах, где требуется встроить достаточно быстрый и нетрудный в освоении скриптовый язык программирования — например, в разработке игр. где Lua часто используется в качестве прослойки между игровым движком и данными для написания сценариев поведения/взаимодействия объектов.
Игры ПравитьПервыми в разработку компьютерных игр язык Lua внедрила компания LucasArts. начиная с игры Grim Fandango [10]. Авторы языка в своём докладе на конференции HOPL (англ.) русск. вспоминают, что в январе 1997 они получили сообщение от Брета Могилефски, главного разработчика Grim Fandango, где он писал, что, прочитав о языке в статье 1996 года в Dr. Dobb’s Journal. он планирует заменить используемый ими самодельный скриптовый язык SCUMM на Lua [11]. В результате им был создан игровой движок GrimE. используемый также более поздним квестом от LucasArts — Escape from Monkey Island .
В 2003 году в результате опроса на сайте GameDev.net Lua был признан самым популярным скриптовым языком для разработки игр [12] .
Примером игры, программируемой с помощью Lua. является World of Warcraft. [13] [14] На языке Lua описываются уровни игры-головоломки Enigma [15] .
Для популярной инди-игры Minecraft создан мод Computer Craft, который добавляет компьютеры, программируемые на языке Lua [21] .
Зарубежная команда Croteam (разработчики Serious Sam и The Talos Principle) используют Lua в скриптах начиная с версии Serious Engine 3.5 [22] .
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, Pontificia Universidade Catolica do Rio de Janeiro), история языка ведёт отсчёт с 1993 года. Авторами языка стали Роберто Иерусалимски, Luiz Henrique de Figueiredo и Waldemar Celes. Lua распространяется свободно, с открытыми исходными текстами на языке Си .
Некоторые возможностиLua обычно называют мультипарадигменным языком. Он обеспечивает небольшой набор базовых механизмов, которые могут быть расширены для решения различных задач, а не набор сложных жёстких спецификаций, обеспечивающих программирование в единой парадигме .
Так, в Lua отсутствует явная поддержка наследования. однако оно легко реализуется с помощью метатаблиц .
Параллельное присваиваниеПодобно таким скриптовым языкам, как Perl. Python. Ruby и Icon. допускает параллельное присваивание. В простейшем случае это позволяет писать выражения вида
Lua представляет собой язык с динамическим определением типов данных. Переменная языка может содержать значения любого типа. Все значения в Lua могут храниться в переменных, использоваться в качестве аргументов при вызове функций и возвращаться в виде результата их выполнения.
В Lua восемь основных типов:
Nil — это тип значения nil [пустое значение], главное свойство которого — отличаться от всех остальных значений и обозначать отсутствие пригодного значения. К типу Boolean относятся значения false (ложь) и true (истина). Значения nil и false считаются ложными, любое другое значение считается истинным. К типу Number относятся обычно вещественные числа (double), но внутреннее представление чисел можно изменить при сборке интерпретатора. Тип String обозначает массивы символов. Строки Lua могут содержать любые 8-битные символы, включая ноль ('\0'). Строки неизменяемы.
Таблицы являются самым важным типом данных в Lua и являются фундаментом для пользовательских типов данных, таких как структуры. массивы, списки. множества. Таблица в Lua представляет собой набор пар — (Ключ, Значение). Ключом может выступать значение любого типа, кроме nil.
Lua поддерживает концепцию замыканий. например:
Каждый раз, когда вызывается makeaddfunc. создаётся новое замыкание для переменной x. так что каждая возвращаемая анонимная функция будет ссылаться на свой параметр x. Как и у любого другого объекта Lua, временем жизни замыкания управляет сборщик мусора.
Примеры кодаКлассическая программа hello world на Lua выглядит вот так:
Для комментариев используется следующий синтаксис, близкий к языкам Ada. SQL и VHDL :
Работа с функциями как с объектами первого класса демонстрируется в следующем примере, в котором модифицируется поведение функции print:
Любой будущий вызов print теперь будет перенаправлен к будущей функции, и благодаря поддержке в Lua лексического контекста. старая функция print будет доступна только посредством новой, модифицированной функции print. Lua также поддерживает замыкания. как описано выше, в соответствующем разделе.
Ключевой особенностью Lua является расширяемая семантика, механизм метатаблиц даёт большие возможности по настройке уникального поведения для таблиц Lua. В следующем примере демонстрируется «бесконечная» таблица. Для любого , fibs[n] даст -е число Фибоначчи с использованием мемоизации .
РеализацияКак и многие интерпретируемые языки программирования. реализация 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 (скрипт смены группировки):
В модификации Garry's Mod. Lua является основным инструментом. Используется для реализации игровых режимов и дополнений.
Программное обеспечениеСписок примеров в этой статье не основывается на авторитетных источниках непосредственно о предмете статьи.
Добавьте ссылки на источники, предметом рассмотрения которых является тема настоящей статьи в целом, и содержащие данные элементы списка как примеры. В противном случае раздел может быть удалён.
Книга является детальным и авторитетным введением во все аспекты прграммирования на Lua, написанная разработчиком архитектуры Lua. Первая редакция была нацелена на Lua 5.0 и остается наиболее значимой.
Copyright © 2003-2004 Roberto Ierusalimschy. All rights reserved.
Перевод на русский Artem13.
Только для персонального использования. Копирование на другие сайты и дальнейшее распространение в любом виде запрещены.
Часть III · Стандартные библиотеки
У этого термина существуют и другие значения, см. LUA.
При полной или частичной перепечатке текстов статей и публикаций гиперссылка на www.4debian.info обязательна. | "4Debian.Info" | © 2016