Lua: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
imported>VitalikBot
м Обновление шаблона {{improve}}; langs: haw,wls,fj
 
imported>Nika Iriciani
 
Строка 1: Строка 1:
{{Cf|lúa, lụa, lửa}}
{{redirect|Луа|Луа (Приморская Шаранта)}}
{{стиль статьи|дата=2022-02-20}}
{{Язык программирования
| designer = [[Иерузалимски, Роберту|Роберту Иерузалимски]], <br>Валдемар Селиш, <br>Луиш Энрике ди Фигейреду
}}
'''Lua''' (''лу́а'', {{tr-pt|луна}}<ref name=luaabout>{{cite web| url = http://www.lua.org/about.html#name| title = About Lua| publisher = Lua.org| access-date = 2013-06-19| archive-date = 2018-12-26| archive-url = https://web.archive.org/web/20181226034345/http://www.lua.org/about.html#name| url-status = live}}</ref>) — [[Сценарный язык|скриптовый]] [[язык программирования]], разработанный в подразделении Tecgraf (''Computer Graphics Technology Group'') {{iw|Католический университет Рио-де-Жанейро|Католического университета Рио-де-Жанейро|en|Pontifical Catholic University of Rio de Janeiro}} ([[Бразилия]]). Интерпретатор языка [[свободное программное обеспечение|свободно распространяется]] с открытым исходным кодом на [[Си (язык программирования)|языке программирования Си]].
 
По идеологии и реализации язык Lua ближе всего к [[JavaScript]], в частности, он также реализует [[Прототипное программирование|прототипную]] модель [[Объектно-ориентированное программирование|ООП]], но отличается Паскале-подобным синтаксисом и более мощными и гибкими конструкциями. Характерной особенностью Lua является реализация большого числа программных сущностей минимумом синтаксических средств. Так, все составные пользовательские типы данных ([[Массив (программирование)|массивы]], [[Запись (тип данных)|структуры]], [[Множество (тип данных)|множества]], [[Очередь (программирование)|очереди]], [[Список (программирование)|списки]]) реализуются через механизм ''таблиц'', а механизмы [[Объектно-ориентированное программирование|объектно-ориентированного программирования]], включая [[множественное наследование]] — с использованием ''метатаблиц'', которые также отвечают за [[Перегрузка операторов|переопределение операций]] и ряд других возможностей.


= {{-haw-}} =
Lua предназначен для пользователей, не являющихся профессиональными программистами, вследствие чего большое внимание уделено простоте дизайна и лёгкости обучения. Язык широко используется для создания тиражируемого программного обеспечения (например, на нём написан графический интерфейс пакета [[Adobe Photoshop Lightroom|Adobe Lightroom]]). Также получил известность как язык программирования уровней и расширений во многих играх<ref name="pollres"/>, в том числе [[Garry’s Mod]], [[Minetest|Luanti]], [[Factorio]] и [[Roblox Studio]].
{{числа haw}}


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


{{морфо |прист1=|корень1=|суфф1=|оконч=}}
Как отметил Луиш Энрике ди Фигейреду, Lua — единственный язык программирования, разработанный в [[развивающиеся страны|развивающейся стране]] и получивший всемирное признание, которое, в частности, выразилось в приглашении на конференцию {{iw|HOPL}}{{sfn|Бьянкуцци, Уорден|2011|с=216}}.


=== Произношение ===
Историческими родителями языка были языки конфигурирования и описания данных ''SOL'' (Simple Object Language) и ''DEL'' (Data-Entry Language)<ref>{{cite web|url=http://www.lua.org/history.html|title=The evolution of an extension language: a history of Lua|access-date=2016-08-24|year=2001|archive-date=2017-10-14|archive-url=https://web.archive.org/web/20171014054934/http://www.lua.org/history.html|url-status=live}}</ref>, они были независимо разработаны в Tecgraf в 1992—1993 годах для добавления некоторой гибкости в два отдельных проекта (оба были интерактивными графическими приложениями для конструкторских нужд в компании [[Petrobras]]). В SOL и DEL отсутствовали какие-либо управляющие конструкции, и Petrobras чувствовал растущую необходимость в добавлении к ним полноценного программирования.
{{transcriptions||}}


=== Семантические свойства ===
Как пишет автор языка в ''The Evolution of Lua'':{{sfn|HOPL|2007|p = 2–1–2–26}}


==== Значение ====
{{начало цитаты}}В 1993 году единственным реальным претендентом был [[Tcl]], который был специально создан для встраивания в приложения. Однако у Tcl был непривычный синтаксис, не было хорошей поддержки описания данных, и запускался он только на платформах [[Unix]]. Мы не рассматривали [[Лисп]] или [[Scheme]] из-за их недружелюбного синтаксиса. [[Python]] был ещё во младенческом возрасте. В атмосфере «сделай сам», которая тогда царила в Tecgraf, было вполне естественно, что мы решили разработать свой собственный скриптовый язык. Из-за того, что большинство пользователей не было профессиональными программистами, языку следовало избегать замысловатого синтаксиса и семантики. Реализация нового языка должна быть легко [[Портирование программного обеспечения|портируема]], так как клиенты Tecgraf имели очень разнообразные платформы. Наконец, поскольку мы ожидали, что другим продуктам Tecgraf также понадобится встроенный скриптовый язык, новый язык должен следовать примеру SOL и предоставляться в виде библиотеки с [[Интерфейс программирования приложений|API]] на [[Си (язык программирования)|C]].{{конец цитаты|источник=}}
# [[два]] {{пример||перевод=}}
# [[второй]] {{пример|"A ua like nō hoʻi ka {{выдел|lua}} me ia, ‘"E aloha ʻoe i kou hoalauna me kou aloha iā ʻoe iho".’ ʻAʻole kānāwai ʻē aʻe i ʻoi ma mua o kēia mau kānāwai."|PIDF|KBH|2018|ч=Евангелие от Марка 12:31|||перевод={{выдел|Вторая}} подобная ей: «возлюби ближнего твоего, как самого себя». Иной большей сих заповеди нет.}}


==== Синонимы ====
Lua 1.0 была спроектирована таким образом, что конструкторы объектов, тогда чуть отличавшиеся от текущего лёгкого и гибкого стиля, включали в себя синтаксис языка SOL (отсюда название Lua: по-португальски {{lang-pt2|sol}} — «солнце», {{lang-pt2|lua}} — «луна»). Управляющие конструкции Lua в основном заимствованы из [[Модула-2|Модулы-2]] (if, while, repeat/until), хотя на них также повлияли [[Клу]] ([[параллельное присваивание]], множественное [[Тип возвращаемого значения|возвращаемое значение функции]] как более простая альтернатива вместо [[Передача по ссылке|передачи параметров по ссылке]] или явных [[Указатель (тип данных)|указателей]]), [[C++]] («отличная идея объявлять [[Локальная переменная|локальные переменные]] лишь тогда, когда они нужны»), [[Снобол]] и [[awk]] ([[Ассоциативный массив|ассоциативные массивы]]). Создатели Lua также признают, что единый вездесущий механизм структурирования данных в Lisp и Scheme ([[связный список]]) оказал большое влияние на их решение о выборе таблиц в качестве основной структуры данных для Lua<ref name=ddj96>{{Cite news| last1 = Figueiredo| first1 = L. H.| last2 = Ierusalimschy| first2 = R.| last3 = Celes| first3 = W.| title = Lua: an Extensible Embedded Language. A few metamechanisms replace a host of features| magazine = Dr. Dobb's Journal| volume = 21| issue = 12| pages = 26–33| date = 1996-12| url = http://www.lua.org/ddj.html| access-date = 2014-09-20| archive-date = 2014-10-20| archive-url = https://web.archive.org/web/20141020005146/http://www.lua.org/ddj.html}}</ref>.
# ?
# ?


==== Антонимы ====
Версии Lua вплоть до 5.0 выпускались под лицензией, подобной [[Лицензия BSD|лицензии BSD]]. Начиная с версии 5.0 и выше Lua распространяется под [[Лицензия MIT|лицензией MIT]]. Обе лицензии являются [[Разрешительная лицензия свободного ПО|разрешительными]] и практически идентичны.
# —
# —


==== Гиперонимы ====
== Общая характеристика ==
# ?
Язык предназначен для использования в качестве отдельного либо встроенного в приложение скриптового языка. Он изначально создавался достаточно простым и компактным, чтобы поместиться на различных платформах и обеспечить приемлемую производительность. Также при проектировании учитывались требования простоты обучения и возможности использования не профессиональными программистами.
# ?


==== Гипонимы ====
Lua — это [[Процедурный язык программирования|процедурный]] [[Динамическая типизация|динамически типизированный]] [[Модуль (программирование)|модульный]] язык с [[Сборка мусора|автоматическим управлением памятью]]. Включает базовые элементы для поддержки [[Функциональное программирование|функционального]] и [[Объектно-ориентированное программирование|объектного]] стилей программирования. Таким образом, язык можно считать [[Мультипарадигмальный язык программирования|мультипарадигменным]]. Встроенные средства параллельного программирования позволяют писать многопоточные программы только средствами языка, не обращаясь к API операционной системы или внешним библиотекам. Так как основным назначением Lua является встраивание, он имеет эффективные средства межъязыкового взаимодействия, ориентированные, главным образом, на вызов библиотек [[Си (язык программирования)|Си]] и на работу в Си-окружении.
# ?
# —


=== Родственные слова ===
Язык поддерживает небольшое количество встроенных типов данных: логические значения, числа, строки, функции, потоки. Типичные комбинированные структуры данных, такие как [[Массив (программирование)|массивы]], [[Множество (тип данных)|наборы]], [[Список (структура данных)|списки]] и [[Запись (тип данных)|записи]], отсутствуют, вместо всех их используется одна базовая структура Lua — таблица (см. ниже). Отдельный тип <code>userdata</code> предназначен специально для низкоуровневого программирования и обмена данными с внешним кодом на других языках. Функции в Lua являются объектами первого класса, могут присваиваться и передаваться в параметрах. Поддерживаются замыкания, есть возможность создания функций высших порядков. Объектная система прототипная, отсутствует явная поддержка [[Наследование (программирование)|наследования]], однако оно легко реализуется с помощью ''метатаблиц''.
{{родств-блок
|имена-собственные=
|существительные=
|прилагательные=
|числительные=
|местоимения=
|глаголы=
|наречия=
|предикативы=
|предлоги=
}}


=== Этимология ===
Вообще, Lua стремится обеспечить гибкие метафункции, которые могут быть расширены по мере необходимости, а не поставлять набор функций, специфичных для конкретной парадигмы программирования. Как результат, основа языка проста и легко адаптируема к большинству приложений. Предоставляя минимальный набор базовых средств, Lua пытается найти баланс между мощностью и размером.
Происходит от {{этимология:|}}


{{improve|haw|морфо|транскрипция|примеры|этимология}}
== Синтаксис ==
{{Категория|язык=haw|Числа|Два|}}
Синтаксис Lua в основном построен на основе поздних Паскале-подобных языков, таких как [[Модула-2]] или [[Оберон (язык программирования)|Оберон]]. Формат записи текста — свободный, команды в тексте программы разделяются любыми пробельными символами. Допускается, но не является обязательным применение точки с запятой для разделения операций.
{{длина слова|3|haw}}


= {{-pt-}} =
В одном из интервью Роберту Иерузалимски заметил, что синтаксис Lua — это компромиссное решение, которое он был вынужден принять, чтобы упростить освоение языка непрофессиональными программистами. Он охарактеризовал этот синтаксис как «довольно многословный», отметив, что лично для себя предпочёл бы более краткую [[нотация|нотацию]]{{sfn|Бьянкуцци, Уорден|2011|с=216}}<!-- вот не знаю, имел ли он виду C или что-то другое -->.


=== Морфологические и синтаксические свойства ===
=== Лексика ===
{{сущ pt f reg|слоги={{по слогам|lu|a}}|lua|luas}}
Основным алфавитом языка является английский, и в строковых литералах допускаются знаки других языков, идентификаторы которых могут состоять из букв, цифр и знаков подчеркивания, но они не могут начинаться с цифры или совпадать с одним из ключевых слов. В языковом руководстве не рекомендуется использовать идентификаторы, начинающиеся со знака подчеркивания, поскольку такие идентификаторы используются в систематических целях.


{{морфо|прист1=|корень1=lu|суфф1=|оконч=a}}
Язык регистрозависимый, все ключевые слова пишутся в нижнем регистре, идентификаторы, различающиеся только регистром букв, считаются различными. Следующие 22 ключевых слова не могут быть использованы для имён<ref name="man1">{{Cite web |url=http://www.lua.org/manual/5.1/manual.html |title=Lua 5.1 Reference Manual<!-- Заголовок добавлен ботом --> |access-date=2019-11-05 |archive-date=2013-11-15 |archive-url=https://web.archive.org/web/20131115025136/http://www.lua.org/manual/5.1/manual.html/ |url-status=live }}</ref>:
<syntaxhighlight lang="lua">
  and  break  do    else elseif
  end  false  goto  for  function
  if    in    local  nil  not
  or    repeat return then true
  until while
</syntaxhighlight>


=== Произношение ===
=== Комментарии ===
{{transcriptions|'luɐ|'luɐʃ}}
Для комментариев используется синтаксис, аналогичный реализованному в [[Ада (язык программирования)|Аде]], [[SQL]] и [[VHDL]]:
<syntaxhighlight lang="lua">
-- Простой однострочный комментарий в Lua начинается с двойного минуса и продолжается до конца строки.
dim = { "one", "two", "three" } -- Строчный комментарий не обязан начинаться с начала строки,
                                -- он может следовать за другими языковыми конструкциями,
                                -- поясняя их.
--[[Многострочный комментарий начинается с идущих подряд за двумя минусами двух открывающихся квадратных скобок
  и продолжается до двух подряд закрывающихся квадратных скобок. Как здесь: ]]


=== Семантические свойства ===
-- Интересный эффект можно получить сочетанием строчных и многострочных комментариев:
{{илл|lang=pt|}}
--[[ Чтобы раскомментировать код ниже, достаточно добавить в этой строке пробел между минусами и скобками.
for i=1,#dim do
  print(dim[i])
end
-- Если выше между минусами и скобками будет добавлен пробел, то
--]] -- здесь конец многострочного комментария превратится в обычный строчный
</syntaxhighlight>


==== Значение ====
=== Типы данных ===
# {{астрон.|pt}} [[луна]] {{пример|Ora, naqueles dias, depois daquela aflição, o sol se escurecerá, e a {{выдел|lua}} não dará a sua luz. ||Almeida Revista e Corrigida|1898 |ч=Евангелие от Марка 13:24|||перевод=Но в те дни, после скорби той, солнце померкнет, и {{выдел|луна}} не даст света своего,}}
Lua представляет собой язык с неявным [[динамическая типизация|динамическим]] определением [[Тип данных|типов данных]]. [[Переменная (программирование)|Переменная]] языка может содержать значения любого типа. Все значения в Lua могут храниться в переменных, использоваться в качестве [[Аргумент (программирование)|аргументов]] при вызове [[Функция (программирование)|функций]] и возвращаться в виде результата их выполнения.
#


==== Синонимы ====
В Lua восемь основных типов:
# ?
* '''nil''' (неопределенный);
#
* '''boolean''' (логический);
* '''number''' (числовой);
* '''string''' (строковый);
* '''function''' (функция);
* '''userdata''' (пользовательские данные);
* '''thread''' (асинхронный поток);
* '''table''' (таблица).


==== Антонимы ====
''nil'' — это тип значения nil [пустое значение], главное свойство которого — отличаться от всех остальных значений и обозначать отсутствие пригодного значения.
# —
#


==== Гиперонимы ====
К типу ''boolean'' относятся значения false (ложь) и true (истина).
# ?
#


==== Гипонимы ====
К типу ''number'' относятся обычно вещественные числа (double). В первых версиях Lua целые числа не выделялись в отдельный тип; такое решение мотивируется тем, что вещественное представление позволяет точно представить достаточно широкий диапазон целых чисел. Начиная с версии 5.3 добавлена возможность явного определения целого или вещественного формата числа. Внутреннее представление чисел можно изменить при сборке интерпретатора.
# —
#


=== Родственные слова ===
Тип ''string ''обозначает массивы символов. Строки Lua могут содержать любые 8-битные символы, включая ноль ('\0'). Строки неизменяемы. Строковые литералы могут записываться в одинарных или двойных кавычках, служебные символы помещаются в них в стандартной для C нотации с ведущим обратным слэшем. Многострочные литералы ограничиваются двумя подряд открывающимися и двумя подряд закрывающимися квадратными скобками.
{{родств-блок
|умласк=
|имена-собственные=
|существительные=
|прилагательные=
|числительные=
|глаголы=
|наречия=
}}


=== Этимология ===
Встроенная в язык поддержка Юникода отсутствует, хотя допускается использование символов UTF-8 в строковых литералах, а сама система представления UTF-8 позволяет вводить, выводить и частично обрабатывать строки в этой кодировке стандартными системными средствами. В последние версии Lua входит библиотека utf8, обеспечивающая более развитую поддержку UTF-8, существуют также библиотеки сторонних разработчиков, предоставляющие средства работы с Юникод-строками в различных кодировках.
От лат. [[luna]] «луна».


=== Фразеологизмы и устойчивые сочетания ===
Функции в Lua являются полноправными объектами, допускающими присваивание, передачу функции в параметре и возврат функции как одного из значений. Тип '''thread''' имеют сопрограммы, тип '''userdata''' предназначен для представления внешних данных, полученных или предоставляемых из/в код на другом языке (главным образом, на C/C++).
*


<!-- Служебное: -->
=== Операции ===
{{improve|pt|}}
; Присваивание
{{Категория|язык=pt|Луна||}}
: Оператором присваивания служит символ '''<code>=</code>'''. Подобно таким скриптовым языкам, как [[Perl]], [[Python]], [[Ruby]] и [[Icon (язык программирования)|Icon]], допускает [[параллельное присваивание]]. В простейшем случае это позволяет писать выражения вида:
{{длина слова|3|pt}}
: <source lang="lua">
  x, y = y, x
</source>
: В отличие, например, от языка [[Go]], параллельное присваивание в Lua очень либерально, оно не требует точного соответствия числа переменных числу значений. Если значений больше, чем переменных, то последние значения отбрасываются, если значений меньше — последние переменные в списке получают значение nil.
; Сравнения и логические операторы
: Операторы сравнения: '''<code><nowiki> <, >, <=, >=, ==, ~= </nowiki></code>''' (последние два означают, соответственно, сравнение на равенство и на неравенство). Сравнения на равенство и неравенство применимы к любым типам данных, прочие — только к строкам и числам.
: Логические операторы: '''<code>and, or, not</code>''' — логические «и», «или» и «не», соответственно, могут применяться к значениям любых типов и возвращают true либо false. В параметрах этих операция значения nil и false считаются ложными, любые другие значения — истинными. В отличие от C и ряда других языков, даже числовой нуль (0) или пустая строка ("") с точки зрения логических операторов представляют значение «истина». Вычисление бинарных логических операторов традиционно выполняется до тех пор, пока результат не будет определён, причём в качестве результата возвращается последнее вычисленное подвыражение. Поэтому их можно использовать как тернарный оператор '''<code><nowiki>?:</nowiki></code>''' в языке Си:
<syntaxhighlight lang="lua">
-- аналогично r = ( a < b)? f(a) : f(b); в Си,
r = ( a < b ) and f(a) or f(b)
-- r получит значение функции f() от меньшего из двух значений: a и b,
-- при условии, что f(a) не равно nil или false.
</syntaxhighlight>
; Арифметические операторы
: '''<code><nowiki>+</nowiki></code>''' — сложение;
: '''<code><nowiki>-</nowiki></code>''' — вычитание;
: '''<code><nowiki>*</nowiki></code>''' — умножение;
: '''<code><nowiki>/</nowiki></code>''' — деление;
: '''<code><nowiki>-</nowiki></code>''' — [[унарный минус]];
: '''<code><nowiki>%</nowiki></code>''' — остаток от деления;
: '''<code><nowiki>^</nowiki></code>''' — возведение в степень.


= {{-ro-}} =
Все арифметические операторы поддерживают вещественные операнды, давая предсказуемый результат. Так, <code><nowiki>x^0.5</nowiki></code> возвращает квадратный корень из <code>x</code>, <code><nowiki>x^(-1/3)</nowiki></code> — значение, обратное кубическому корню из <code>x</code>. Оператор <code><nowiki>%</nowiki></code> определяется выражением: <code><nowiki>a % b = a - math.floor(a / b) * b</nowiki></code>, где функция <code><nowiki>math.floor()</nowiki></code> вычисляет целую часть своего аргумента. Для целых аргументов его результат вполне обычен. Для вещественного делимого нужно учитывать, что операция не производит никаких дополнительных округлений или отбрасывания дробной части, поэтому результат сохранит дробную часть делимого. Например, <code><nowiki>math.pi % 2</nowiki></code> вернёт не <code>1</code>, а <code>1.1415926535898</code>. Такая реализация даёт некоторые дополнительные возможности. Например, для усечения <code>x</code> до трёх знаков после запятой достаточно взять выражение <code><nowiki>x - x % 0.001</nowiki></code>


=== Морфологические и синтаксические свойства ===
=== Таблицы ===
{{гл ro |слоги={{по слогам|lu|a}}|основа=|основа1=}} Неправильный, 1-е спряжение.
Таблица в Lua — это [[Динамический массив|динамический]] [[Гетерогенность|гетерогенный]] [[ассоциативный массив]], то есть множество пар «<code>ключ-значение</code>». Ключами могут быть значения любых типов Lua, кроме <code>nil</code>. Ключи также могут быть литералами (идентификаторами) Lua. Запись <code>nil</code> в элемент таблицы равносильна удалению данного элемента.
{| class="wikitable"
|+
!
!
!
!
|-
|'''Eu'''
|iau
|'''Noi'''
|luam
|-
|'''Tu'''
|iei
|'''Voi'''
|luați
|-
|'''El, ea'''
|ia
|'''Ei, ele'''
|iau
|}
{{морфо|прист1=|корень1=lu|суфф1=|оконч=a}}


=== Произношение ===
Таблицы являются единственным в Lua составным типом данных. Они являются фундаментом для всех пользовательских типов данных, таких как [[Структура (программирование)|структуры]], [[Массив (программирование)|массивы]], [[Множество (тип данных)|множества]] и другие:
{{transcription|lu’a|}}


=== Семантические свойства ===
<syntaxhighlight lang="lua">
-- Таблица общего вида:
empty = {} -- Пустая таблица
empty[1] = "первый"        -- Добавление элемента с целым индексом
empty[3] = "второй"        -- Добавление элемента с целым индексом
empty["третий"] = "третий" -- Добавление элемента со строковым индексом
empty[1] = nil            -- Удаление элемента из таблицы


==== Значение ====
-- Классический массив - строки индексируются по умолчанию целыми числами, начиная с 1
# [[брать]], [[взять]] {{пример||перевод=}}
days1 = {"понедельник", "вторник", "среда", "четверг", "пятница", "суббота", "воскресенье"}
#


==== Синонимы ====
-- Массив с произвольной индексацией
# ?
days2 = {[0]="воскресенье", [1]="понедельник", [2]="вторник", [3]="среда", [4]="четверг", [5]="пятница", [6]="суббота"}
#


==== Антонимы ====
-- Запись (структура) - значения различных типов индексируются литералами
# [[da]]
person = {tabnum = 123342,                  -- Табельный номер
#
          fio = "Иванов Степан Васильевич",  -- Ф.И.О.
          post = "слесарь-инструментальщик", -- Должность
          salary = 25800.45,                -- Оклад
          sdate = "23.10.2013",              -- Дата приёма на работу
          bdate = "08.08.1973"}              -- Дата рождения


==== Гиперонимы ====
pfio = person.fio --Обращение к элементу структуры.
# ?
#


==== Гипонимы ====
-- Множество - индексы используются для хранения значений
# ?
workDays = {["понедельник"]=true, ["вторник"]=true, ["среда"]=true, ["четверг"]=true, ["пятница"]=true}
#
workDays["суббота"] = true -- Добавление субботы в число рабочих дней
workDays["среда"] = nil    -- По средам больше не работаем


=== Родственные слова ===
-- Проверка, является ли d рабочим днём
{{родств-блок
if workDays[d] then
|умласк=
  print (d.." - рабочий день")
|имена-собственные=
else
|существительные=luare
  print (d.." - выходной день")
|прилагательные=
end
|числительные=
</syntaxhighlight>
|глаголы=
|наречия=
}}


=== Этимология ===
Мультимножества (множества, которые могут содержать более одного экземпляра одного и того же элемента) реализуются аналогично последнему примеру, только в качестве значений используются не логические, а целые — счётчики числа соответствующих элементов в множестве. Связанные списки могут быть представлены как массивы двухэлементных массивов, хранящих значение и ссылку на следующий элемент. Многомерные массивы могут быть реализованы как массивы массивов. Более сложные структуры, такие как очереди, графы, сети также реализуются на основе таблиц, конкретный способ реализации определяется задачей.
От {{этимология:levare|ro}}


=== Фразеологизмы и устойчивые сочетания ===
=== Замыкания ===
* [[a lua masa]] — обедать
Lua поддерживает концепцию [[Замыкание (программирование)|замыканий]], например:
* [[a lua trenul]] — сесть на поезд
<source lang="lua">
* [[a lua loc]] — садиться
function makeaddfunc(x)
* [[a lua parte]] — участвовать (принять участие)
  -- Возвращает новую анонимную функцию, которая добавляет x к аргументу
  return function(y)
    -- Когда мы ссылаемся на переменную x, которая вне текущей области,
    -- и время жизни которой меньше, чем этой анонимной функции,
    -- Lua создаёт замыкание.
    return x + y
  end
end
plustwo = makeaddfunc(2) -- т.е plustwo = function(y) return 2 + y end
print(plustwo(5)) -- Выводит 7
</source>
Каждый раз, когда вызывается <code>makeaddfunc</code>, создаётся новое замыкание для переменной <code>x</code>, так что каждая возвращаемая анонимная функция будет ссылаться на свой параметр <code>x</code>. Как и у любого другого объекта Lua, временем жизни замыкания управляет сборщик мусора.


<!-- Служебное: -->
== Средства и методы программирования ==
{{improve|ro|пример}}
{{Категория|язык=ro|Глаголы передачи собственности||}}
{{длина слова|3|ro}}
= {{-wls-}} =
{{числа wls}}


=== Морфологические и синтаксические свойства ===
=== Метатаблицы ===
{{числ wls |слоги={{по-слогам|lua}}|основа=|основа1=}}
Механизм ''метатаблиц'' обеспечивает многие возможности, в других языках предоставляемые за счёт введения отдельных синтаксических механизмов. Метатаблицы по структуре являются обычными таблицами Luа, подчиняющимися всем правилам и ограничениям языка. Особенность их состоит в применении. Метатаблица хранит дополнительные метаданные типов и объектов, то есть информацию о параметрах и функциях, связанных с ними. Сведения, хранящиеся в метатаблицах, используются интерпретатором Lua, их использование позволяет изменить или расширить функциональность программных объектов.


{{морфо|прист1=|корень1=|суфф1=|оконч=}}
Метатаблица в Lua может быть связана со значением любого типа. Скалярные типы данных (все, кроме userdata и таблиц) имеют общие метатаблицы для каждого типа. Таблицы и значения типа <code>userdata</code> имеют индивидуальные ссылки на метатаблицы в каждом экземпляре. Изменять метатаблицы всех типов, кроме таблиц, можно только посредством внешнего кода на Си. Непосредственно из Lua доступны только метатаблицы таблиц.


=== Произношение ===
Созданная «с нуля» таблица Lua не имеет метатаблицы (её ссылка на метатаблицу равна nil). Но метатаблица для неё может быть в любой момент создана либо получена от другой таблицы. Встроенная функция <code>getmetatable(t)</code> возвращает метатаблицу таблицы t, а функция <code>setmetatable(t, m)</code> устанавливает для таблицы t метатаблицу m.
{{transcriptions|||}}


=== Семантические свойства ===
Для метатаблиц документирован набор полей, которые могут использоваться интерпретатором языка. Для указания на особую роль этих полей для них принято специальное правило именования: их идентификаторы начинаются с двух подчёркиваний. Некоторые из таких полей содержат информацию о специфических свойствах объекта, к которому относится метатаблица. Например, параметр <code>__mode</code>, когда он задан, может превратить таблицу в ''слабую'', то есть таблицу, все ссылки на объекты которой являются [[слабая ссылка|слабыми ссылками]]. Но значениями большинства возможных полей метатаблицы являются так называемые ''метаметоды'', то есть ссылки на функции, которые интерпретатор вызывает при определённых условиях. Общая логика использования метаметодов интерпретатором состоит в следующем: когда интерпретатор встречает в программе операцию, которая не определена для объекта-операнда, он обращается к связанной с операндом метатаблице, находит в ней соответствующий метаметод и вызывает его.
{{илл|size=|lang=wls|}}
<syntaxhighlight lang="lua">
--[[ Создание операции сложения для таблиц ]]
-- Операнды
t1 = {1,2,3}   
t2 = {10,20,30} 
-- Создание метатаблицы
mt = {}
-- Запись в метатаблицу метаметода "__add"
mt.__add = function(a, b)
            local res = {}
            for k in pairs(a) do res[k] = a[k] + b[k] end
            return res
          end
-- Привязка метатаблицы к таблице t1
setmetatable(t1, mt)


==== Значение ====
-- Теперь сложение таблиц - корректная операция
# {{помета.|wls}} [[два]] {{пример||перевод=|автор=|титул=|дата=|перев=|дата издания=|источник=}}
t3 = t1 + t2
#
-- соединяем с t3 метатаблицу с метаметодом __tostring
setmetatable(t3, {__tostring=function(t)
                    local res = "\n"
                    for _,v in pairs(t) do
                      res = res .. tostring(v) .. "-"
                    end
                    return res.."\n"
                  end})
-- В результате будет выведено: "11-22-33-"
for _,v in ipairs(t3) do
  io.write (v,",")
end
print(tostring(t3))  -- выведет "11,22,33,"
</syntaxhighlight>
В Lua поддерживаются метаметоды для всех арифметических операций и операций сравнения, так что с их помощью можно реализовать арифметику для любых объектов, созданных программистом. Помимо стандартных, можно использовать так называемые «библиотечные» метаметоды, которые поддерживаются не ядром языка, а конкретными библиотеками. В примере выше это метаметод <code>__tostring</code>, поддерживаемый библиотекой string; этот метод выполняет конвертацию таблицы в строку.


==== Синонимы ====
Наибольший интерес представляет поле <code>__index</code>. Обращение к нему происходит тогда, когда интерпретатор пытается прочитать элемент таблицы, но не находит его. Поле <code>__index</code> может ссылаться либо на таблицу, либо на метод. В первом случае интерпретатор, не найдя искомого значения в основной таблице, будет искать его в таблице <code>__index</code>. Во втором вместо обращения к таблице будет происходить вызов этого метода. Задавая таблицы или метаметоды для данного поля, в Lua можно реализовать наследование, сокрытие данных объекта, отслеживание операций с данными таблицы и многое другое.
# ?
#


==== Антонимы ====
=== Объектно-ориентированное программирование ===
# —
Основой для ООП в Lua являются таблицы. В принципе, таблица и есть объект в ООП-смысле, так как она может иметь поля, именованные с помощью идентификаторов, и хранить в этих полях произвольные значения (свойства объекта) и функции для реализации поведения объекта (методы объекта). Некоторый синтаксический сахар, предоставляемый Lua, делает описание и обращение с объектами более привычным для программистов, имеющих опыт работы с традиционными ООП-языками. Понятия «[[Класс (программирование)|класса]]» в Lua нет, поэтому описывается отдельный объект и все поля и методы относятся именно к нему. Свойства описываются аналогично элементам таблицы с ключами-идентификаторами, методы — как поля-функции. Подобно классическому Оберону, описание методов включает явное указание в первом параметре так называемого «получателя» — параметра, который при вызове метода ссылается на объект, для которого он вызван. Но, помимо стандартного обращения к полю таблицы через точку, которое требует и в вызове метода явно указывать получателя, Lua поддерживает дополнительный синтаксис: когда в вызове или описании метода его заголовок записываются в виде «<code>Объект:метод</code>», то получатель не указывается. При этом в теле метода он всё равно доступен под именем <code>self</code>:
#


==== Гиперонимы ====
<syntaxhighlight lang="lua">
# ?
-- Объект
#
Account = {                    -- Объект "счёт"
  id, name, balance=0,          -- свойства объекта: номер, название, баланс
  credit = function (self, v)  -- метод "расход" - описание внутри объекта с явным указанием получателя
    if self.balance < v then error "Недостаточно денег на счёте" end
    self.balance = self.balance - v
  end
}


==== Гипонимы ====
function Account:debet(v)      -- метод "приход" - внешнее сокращённое описание (self не указывается)
# —
  self.balance = self.balance + v
#
end


=== Родственные слова ===
Account.debet(Account, 10000)  -- вызов метода - полный вариант
{{родств-блок
Account:credit(5000)            -- вызов метода - сокращённый вариант
|умласк=
</syntaxhighlight>
|имена-собственные=
|существительные=
|прилагательные=
|числительные=
|глаголы=
|наречия=
|полн=
}}


=== Этимология ===
Наследование, в том числе множественное, реализуется с помощью метатаблиц и метаметодов. Также с помощью метаметодов можно реализовать сокрытие данных и контролируемый доступ к полям таблицы-объекта. Если сравнивать данный подход с другими языками, где всё вышеперечисленное реализуется с помощью специальных языковых средств, то можно заметить, что реализация Lua сложнее и требует более тщательного кодирования, но обеспечивает бо́льшую гибкость и упрощает интерпретатор.
Из {{этимология:|wls}}


=== Фразеологизмы и устойчивые сочетания ===
== Примеры кода ==
*
Классическая программа «[[Hello, world!]]» на Lua выглядит так:
<syntaxhighlight lang="lua">
print("Hello, world!")
</syntaxhighlight>


=== Библиография ===
[[Факториал]] — пример [[рекурсия|рекурсивной]] функции:
*  
<syntaxhighlight lang="lua">
function factorial(n)
  if n == 0 then
    return 1
  else
    return n * factorial(n - 1)
  end
end
</syntaxhighlight>


{{improve|wls|морфо|транскрипция|пример}}
[[Цикл со счётчиком]]:
<syntaxhighlight lang="lua">
for i = 1,5 do
    -- инструкции/операции
end
</syntaxhighlight>


{{Категория|язык=wls|Числа||}}
Работа с функциями как с [[Объект первого класса|объектами первого класса]] демонстрируется в следующем примере, в котором модифицируется поведение функции print:
{{длина слова|3|wls}}
<syntaxhighlight lang="lua">
do
  local oldprint = print  -- Сохраняем текущую функцию print как oldprint
  function print(s)        -- Переопределяем функцию print
    if s == "foo" then
      oldprint("bar")
    else
      oldprint(s)
    end
  end
end
</syntaxhighlight>
Любой будущий вызов <code>print</code> теперь будет перенаправлен к новой функции, и благодаря поддержке в Lua [[Лексический контекст|лексического контекста]] старая функция print будет доступна только посредством новой, модифицированной функции print. Lua также поддерживает [[Замыкание (программирование)|замыкания]], как описано выше, в соответствующем разделе.


= {{-fj-}} =
Ключевой особенностью Lua является расширяемая семантика, механизм метатаблиц даёт большие возможности по настройке уникального поведения для таблиц Lua. В следующем примере демонстрируется «бесконечная» таблица. Для любого <math>n</math> <code>fibs[n]</code> даст <math>n</math>-е [[Числа Фибоначчи|число Фибоначчи]] с использованием [[Мемоизация|мемоизации]].
<syntaxhighlight lang="lua">
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
})
</syntaxhighlight>Lua позволяет использовать логические операторы <code>and</code> и <code>or</code> для ввода [[Тернарная условная операция|тернарных конструкций]], как, например, в [[C Sharp|C#]], или обращение к одному из существующих объектов.<syntaxhighlight lang="lua">
do
    local num = tonumber(io.read()) -- Записывание в переменную введённой из консоли информации и преобразование её к целочисленному типу
    print(num == 1 and "Вы ввели правильное число" or "Вы ввели неправильное число") -- Если переменная num равняется 1, тогда в консоли выведится текст после and, во всех остальных случаях после or
end
</syntaxhighlight>Обращение к существующей таблице и получение значения по первому индексу:<syntaxhighlight lang="lua">
do
    local tbl = nil
    local tbl2 = {1}
    print( (tbl or tbl2)[1] ) -- Выведится число 1, так как в таблице tbl2 на индексе 1 присвоено это значение
end
</syntaxhighlight>Вызов функции из одной из существующих таблиц:<syntaxhighlight lang="lua">
do
    local tbl = nil
    local tbl2 = {}
    tbl2.DoSomething = function() print("Делать что-то") end
    (tbl or tbl2).DoSomething()
end
</syntaxhighlight>


=== Морфологические и синтаксические свойства ===
== Реализация ==
{{гл fj
Как и многие [[Интерпретируемый язык программирования|интерпретируемые языки программирования]], реализация ''Lua'' имеет отдельно [[компилятор]] с исходного языка в исполняемый [[байт-код]] и [[виртуальная машина|виртуальную машину]] для исполнения сгенерированного байт-кода. Причём байт-код — это не команды стековой машины, а команды некоего виртуального процессора с несколькими регистрами, что повышает эффективность исполнения. В стандартной виртуальной машине ''Lua'' используется распределение памяти со сборкой мусора (аналогично Java или .NET).
|основа=lua
|слоги={{по-слогам|lua}}
}}


{{морфо|прист1=|корень1=|суфф1=|оконч=|частица=}}
''Lua'' использует единый [[Пул строк|строковый пул]], что позволяет снизить расходы памяти на хранение строк.


=== Произношение ===
Для задач, критичных по времени, имеется [[JIT-компиляция|JIT]]-[[компилятор]] ''Lua'' — LuaJIT<ref>{{Cite web |url=http://luajit.org/ |title=The LuaJIT Project |access-date=2009-05-18 |archive-date=2009-04-16 |archive-url=https://web.archive.org/web/20090416174446/http://luajit.org/ |url-status=live }}</ref>. Также разработан компилятор llvm-lua<ref>{{Cite web |url=http://code.google.com/p/llvm-lua/ |title=llvm-lua. JIT/Static compiler for Lua using LLVM on the backend. |access-date=2009-01-21 |archive-date=2009-01-22 |archive-url=https://web.archive.org/web/20090122040815/http://code.google.com/p/llvm-lua/ |url-status=live }}</ref>, генерирующий код для виртуальной машины [[Low Level Virtual Machine|LLVM]], предоставляющей возможность последующей компиляции в очень эффективный машинный код для процессоров различной архитектуры.
{{transcriptions||}}


=== Семантические свойства ===
== Использование ==
{{addoncat|Программное обеспечение, использующее Lua}}
В настоящее время используется в различных проектах, где требуется встроить достаточно быстрый и нетрудный в освоении [[Сценарный язык|скриптовый язык]] программирования — например, в разработке [[компьютерная игра|игр]], где ''Lua'' часто используется в качестве прослойки между [[Игровой движок|игровым движком]] и данными для написания сценариев поведения и взаимодействия объектов. Благодаря компактности применим и в портативных устройствах, в частности, один из графических микрокалькуляторов [[Texas Instruments]], а именно, TI-Nspire CX, использует язык LUA помимо традиционного для такого класса устройств [[Бейсик]]а.


==== Значение ====
=== Игры ===
# [[блевать]] {{пример||перевод=}}
<!-- Здесь стоит упоминать только те игры, информацию о которых можно извлечь из авторитетных источников, посвящённых Lua, а не этим играм -->
#
Первыми в разработку компьютерных игр язык ''Lua'' внедрила компания [[LucasArts Entertainment|LucasArts]] начиная с игры [[Grim Fandango]]<ref>{{cite web|url=http://www.grimfandango.net/?page=articles&pagenumber=2|title=Lua in Grim Fandango|author=Bret Mogilefsky|access-date=2011-12-09|archive-url=https://www.webcitation.org/65BoxDdvU?url=http://www.grimfandango.net/?page=articles|archive-date=2012-02-04}}</ref>. Авторы языка в своём докладе на конференции {{нп3|HOPL}} вспоминают, что в январе 1997 они получили сообщение от Брета Могилефски, главного разработчика Grim Fandango, где он писал, что, прочитав о языке в статье 1996 года в [[Dr. Dobb’s Journal]], он планирует заменить используемый ими самодельный скриптовый язык [[SCUMM]] на ''Lua''{{sfn|HOPL|2007|с=11}}. В результате им был создан игровой движок [[GrimE]], используемый также более поздним квестом от LucasArts — [[Escape from Monkey Island]].


==== Синонимы ====
В 2003 году в результате опроса на сайте [[GameDev.net]] ''Lua'' был признан самым популярным скриптовым языком для разработки игр<ref name="pollres">[https://web.archive.org/web/20031207171619/http://gamedev.net/gdpolls/viewpoll.asp?ID=163 Which language do you use for scripting in your game engine?. GameDev.net — Poll Results]</ref>.
# ?
#


==== Антонимы ====
Примером игры, программируемой с помощью ''Lua'', является [[World of Warcraft]]<ref>{{книга|автор=Paul Emmerich|заглавие=Beginning Lua with World of Warcraft Add-ons|ссылка=https://archive.org/details/beginningluawith0000emme|издательство=[[Apress]]|год=July 2009|isbn=1430223715}}</ref><ref>{{книга|автор=James Whitehead II, Bryan McLemore, and Matthew Orlando|заглавие=World of Warcraft Programming|ссылка=https://archive.org/details/worldofwarcraftp00whit|издательство=[[John Wiley & Sons|Wiley]]|год=May 2008|isbn=0470229810}}</ref>. На языке ''Lua'' описываются уровни игры-головоломки [[Enigma (компьютерная игра)|Enigma]]<ref>{{книга|автор=Tom Gutschmidt|часть=Ch. 8. The Lua Game Community → Game Engines|заглавие=Game Programming with Python, Lua, and Ruby  |ссылка=https://archive.org/details/micorsoftofficee0000koer|издательство=Premier Press|год=2003|allpages=472|isbn=1-59200-079-7}}</ref>.
# —
#


==== Гиперонимы ====
Язык программирования Lua также использовался при разработке игры [[Baba Is You]], вышедшей в 2017 году<ref name=":2">{{Cite web|url=https://www.gamasutra.com/view/news/314548/Road_to_the_IGF_Hempuli_Oys_Baba_Is_You.php|title=Road to the IGF: Hempuli Oy's Baba Is You|last=Couture|first=Joel|date=|website=Gamasutra|language=en|archive-url=https://web.archive.org/web/20180308163041/https://www.gamasutra.com/view/news/314548/Road_to_the_IGF_Hempuli_Oys_Baba_Is_You.php|archive-date=2018-03-08|access-date=2019-03-14}}</ref>.
# ?
#


==== Гипонимы ====
Доступен ряд [[свободное ПО|свободных]] игровых движков, программируемых на Lua, таких, как [[Defold]]<ref>{{Cite web|url=http://www.defold.com/manuals/lua/|title=Defold game development manual -  Lua in Defold|publisher=Defold game engine|access-date=2017-03-02|archive-date=2017-03-03|archive-url=https://web.archive.org/web/20170303043241/http://www.defold.com/manuals/lua/|url-status=live}}</ref>{{не АИ}}{{значимость факта}}, [[Аркада (игра)|аркадный]] движок [[LÖVE]]<ref>{{cite web|url=http://www.h-online.com/open/features/The-H-Speed-Guide-to-Lua-1517427.html%3Fpage=2|title=The H Speed Guide to Lua → Developing with Lua|author=Dj Walker-Morgan|date=2012-04-17|publisher=The H|access-date=2015-02-26|archive-date=2015-02-26|archive-url=https://web.archive.org/web/20150226083959/http://www.h-online.com/open/features/The-H-Speed-Guide-to-Lua-1517427.html%3Fpage=2|url-status=live}}</ref><ref>{{книга|автор=Darmie Akinlaja|заглавие=LÖVE for Lua Game Programming|издательство=Packt|год=2013|allpages=106|isbn=978-1-78216-160-8}}
# —
</ref>, игровой конструктор [[Novashell]]<ref>{{книга |автор = Alan Thorn. |часть = Chapter 8. Novashell and 2D Games |заглавие = Cross Platform Game Development |ссылка = https://archive.org/details/crossplatformgam00thor |издательство  = Jones & Bartlett Learning |год  = 2008  |pages  = [https://archive.org/details/crossplatformgam00thor/page/225 225]—264 |allpages = 421 |isbn = 978-1-59822-056-8}}</ref> и ориентированный на [[квест]]ы (преимущественно — [[interactive fiction|текстовые]]) [[INSTEAD]]<ref>{{статья|автор=Пётр Косых|заглавие=INSTEAD: Как все начиналось|ссылка=http://ifprint.org/articles/insteadstory/|издание=IFPrint.org|год=Март 18, 2013|issn=2307-535X|выпуск=1|archive-url=https://web.archive.org/web/20150226063116/http://ifprint.org/articles/insteadstory/|archive-date=2015-02-26}}</ref>.
#


=== Родственные слова ===
Также используется в авиасимуляторе X-Plane, в движке [[X-Ray (движок)|X-Ray]] для [[S.T.A.L.K.E.R.|S.T.A.L.K.E.R]]<ref>{{Книга|автор=Ronnie Tucker|заглавие=Full Circle Magazine #90: THE INDEPENDENT MAGAZINE FOR THE UBUNTU LINUX COMMUNITY|ссылка=https://books.google.com/books?id=7q0iBQAAQBAJ|издательство=Full Circle Magazine|год=2014-10-31|страниц=50}}</ref>[[S.T.A.L.K.E.R.|.]]
{{родств-блок
|умласк=
|уничиж=
|увелич=
|имена-собственные=
|существительные=
|прилагательные=
|числительные=
|местоимения=
|глаголы=
|наречия=
|предикативы=
|предлоги=
}}


=== Этимология ===
Для популярной игры [[Minecraft]] созданы модификации ComputerCraft и его более совершенный аналог OpenComputers, которые добавляют компьютеры, программируемые на языке Lua<ref>{{Книга|автор=Matthew Monk, Simon Monk|заглавие=ComputerCraft: Lua Programming in Minecraft|ссылка=https://books.google.com/books?id=f06vlwEACAAJ|издательство=CreateSpace Independent Publishing Platform|год=2013-01-28|страниц=58|isbn=9781481927659}}</ref>.
Происходит от {{этимология:|}}


=== Фразеологизмы и устойчивые сочетания ===
Известная игра [[Garry's Mod]] программируется, а также поддерживает модификации, написанные на Lua.
*


=== Библиография ===
Команда [[Croteam]] (разработчики [[Serious Sam (серия игр)|Serious Sam]] и [[The Talos Principle]]) использует Lua в скриптах начиная с версии Serious Engine 3.5<ref>{{Cite web|url=http://gamegpu.com/history/istoriya-tehnologii-serious-engine.html|title=История технологий - Serious Engine {{!}} History {{!}} Тест GPU|author=Zero_Cool|publisher=gamegpu.com|access-date=2016-04-10|archive-date=2016-04-20|archive-url=https://web.archive.org/web/20160420061350/http://gamegpu.com/history/istoriya-tehnologii-serious-engine.html|url-status=live}}</ref>.
*


{{improve|fj|морфо|транскрипция|пример|этимология}}
Для игры [[Grand Theft Auto: San Andreas|GTA: San Andreas]] создаются модификации, написанные на языке Lua и поддерживаемые плагином Moonloader.<ref>{{Cite news|title=Избранное - Lua - ASI - MoonLoader|url=https://blast.hk/threads/13305/|work=BlastHack - Cheating as Art|access-date=2018-01-28|lang=ru|archive-date=2018-01-29|archive-url=https://web.archive.org/web/20180129011149/https://blast.hk/threads/13305/}}</ref> Также игра [[Multi Theft Auto]] поддерживает программирование скриптов на языке Lua.
{{Категория|язык=fj|Глаголы физиологии||}}
{{длина слова|3|fj}}


= {{-eo-}} =
Игровая платформа [[Roblox]] использует Lua в качестве языка кодирования игр и управления игровой средой<ref>{{Cite web|url=https://developer.roblox.com/en-us/learn-roblox/coding-scripts|title=Learn Roblox {{!}} Coding and Scripts|publisher=developer.roblox.com|access-date=2019-08-23|archive-date=2019-08-23|archive-url=https://web.archive.org/web/20190823080559/https://developer.roblox.com/en-us/learn-roblox/coding-scripts|url-status=live}}</ref>.


=== Морфологические и синтаксические свойства ===
Сообществом игры [[Satisfactory]] создан мод Ficsit-Networks, дающий возможность программировать какие-либо действия на языке Lua<ref>{{Cite web|lang=en|url=https://docs.ficsit.app/ficsit-networks/latest/index.html|title=FicsIt-Networks :: Satisfactory Modding Documentation|website=docs.ficsit.app|access-date=2022-03-24}}</ref>.
{{прил eo}}


{{морфо eo|прист1=|корень1=lu|суфф1=|оконч=a}}
В игре [[Factorio]] используется Lua для создания модов.<ref>{{Cite web|url=https://wiki.factorio.com/Modding/ru|title=Моддинг - Factorio Wiki|website=wiki.factorio.com|access-date=2022-06-01|archive-date=2022-06-01|archive-url=https://web.archive.org/web/20220601155145/https://wiki.factorio.com/Modding/ru|url-status=live}}</ref><ref>{{Cite web|url=https://lua-api.factorio.com/latest/|title=API Docs {{!}} Factorio|website=lua-api.factorio.com|access-date=2022-06-01|archive-date=2022-05-18|archive-url=https://web.archive.org/web/20220518072047/https://lua-api.factorio.com/latest/|url-status=live}}</ref>


=== Произношение ===
{{нет значимости 2|В игре Dual Universe используется для внутри игровой механики и программирования игровых блоков|17|10|2022}}
{{transcription eo|{{transcription/eo}}}}


=== Семантические свойства ===
=== LuaTeX ===
Программа компьютерной вёрстки [[LuaTeX]], расширенная версия [[pdfTeX]], использует Lua как встроенный скриптовый язык<ref>{{Cite web|url=https://ctan.org/pkg/luatex|title=CTAN: Package luatex|lang=en|access-date=2019-02-06|archive-date=2019-02-07|archive-url=https://web.archive.org/web/20190207015400/https://ctan.org/pkg/luatex|url-status=live}}</ref>.


==== Значение ====
=== RPM ===
# [[арендный]] {{пример||перевод=}}
Пакетный менеджер [[RPM]] содержит встроенный интерпретатор Lua<ref>{{Cite web|url=http://rpm.org/user_doc/lua.html|title=Lua in RPM|lang=en|access-date=2019-02-11|archive-date=2018-06-24|archive-url=https://web.archive.org/web/20180624211140/http://rpm.org/user_doc/lua.html|url-status=live}}</ref>.
#


==== Синонимы ====
== IDE ==
# ?
Существует как минимум две «родные» [[Интегрированная среда разработки|среды разработки]] для Lua:
#
* [[ZeroBrane Studio]]<ref>{{Cite web |url=http://studio.zerobrane.com/ |title=ZeroBrane Studio — Lua IDE/editor/debugger for Windows, Mac OSX, and Linux |access-date=2013-07-31 |archive-date=2016-01-18 |archive-url=https://web.archive.org/web/20160118143837/http://studio.zerobrane.com/ |url-status=live }}</ref> — [[кроссплатформенность|мультиплатформенная]] среда разработки, написанная на самом Lua;
* [[Decoda]] — среда разработки под Windows, написанная на [[C++]], с богатыми возможностями отладки Lua-скриптов, в том числе в работающих приложениях. На 2018 год последний выпуск среды датировался 2014 годом и имеет статус [[бета-версии]].


==== Антонимы ====
Кроме того, Lua поддерживается некоторыми универсальными IDE, в частности:
# ?
* [[Geany]];
#
* [[Lua Development Tools]]<ref>{{Cite web |url=http://www.eclipse.org/koneki/ldt/ |title=Lua Development Tools |access-date=2012-02-14 |archive-date=2012-02-09 |archive-url=https://web.archive.org/web/20120209024151/http://eclipse.org/koneki/ldt/ |url-status=live }}</ref> для [[Eclipse (среда разработки)|среды Eclipse]];
* плагин EmmyLua для среды [[IntelliJ IDEA]], также оснащённый проверкой синтаксиса «на лету» и развитой системой аннотаций типов<ref>{{Cite web|url=https://plugins.jetbrains.com/plugin/9768-emmylua|title=EmmyLua :: JetBrains Plugin Repository|publisher=JetBrains Plugin Repository|lang=en|access-date=2018-02-26|archive-date=2018-02-27|archive-url=https://web.archive.org/web/20180227035812/https://plugins.jetbrains.com/plugin/9768-emmylua|url-status=live}}</ref>;
* расширение для [[Visual Studio Code]] с поддержкой [[IntelliSense]], подсветки синтаксиса, форматирования кода, отладки.


==== Гиперонимы ====
Существовал модуль поддержки Lua для среды [[NetBeans]], но его развитие прекратилось в 2013 году и он доступен только для версии NetBeans 7.4 и более ранних. В NetBeans 8 плагин не поддерживается.
# ?
#


==== Гипонимы ====
== См. также ==
# ?
* {{нп5|Список приложений, использующих Lua||en|List of applications using Lua}};
#
* [[Squirrel]] — язык программирования на основе Lua.
* [[Википедия:Модули]] — об использовании языка Lua в Википедии.


=== Родственные слова ===
== Примечания ==
{{родств:eo:lu}}
{{примечания}}


=== Этимология ===
== Литература ==
Происходит от {{этимология:|eo}}
* {{Книга|автор = Роберто Иерузалимски |заглавие = Программирование на языке Lua |ответственный = |издание = 3-е изд. |место = |издательство = ДМК |год = 2014 |страницы = |страниц = |isbn = 9785940747673 |ref = Иерузалимски}} (оригинал: {{Книга|автор = Roberto Ierusalimschy |заглавие = Programming in Lua |ответственный = |издание = 3-nd ed. |место = |издательство = |год = 2012 |страницы = |страниц = |isbn = 9788590379850}})
* {{Книга|автор = Ian Dees |часть = Lua |заглавие = Seven More Languages in Seven Weeks. Languages That Are Shaping the Future |ответственный =Bruce Tate, Fred Daoud, Jack Moffitt, Ian Dees |издание = |место = |издательство = The Pragmatic Bookshelf |год = 2015 |страницы =1—48 |страниц =320 |isbn = 978-1941222157 |ref=Dees}}
* {{Книга|автор=Mário Kašuba|заглавие=Lua Game Development Cookbook|ответственный=|издание=|место=|издательство=Packt Publishing|год=2015|страницы=|страниц=402|isbn=978-1849515504|ref=Kasuba}}
* {{Книга|автор=David Young|заглавие=Learning Game AI Programming with Lua|ответственный=|издание=|место=|издательство=Packt Publishing|год=2014|страницы=|страниц=352|isbn=978-1783281336|ref=Young}}
* {{Книга|автор=Jayant Varma|заглавие=Learn Lua for iOS Game Development|ссылка=https://books.google.com/books?id=dLI7IloCzR8C|издательство=Apress|год=2012|страниц=410|isbn=9781430246626|ref=Varma}}
* {{Книга|автор=Kurt Jung, Aaron Brown|заглавие=Beginning Lua Programming|ссылка=https://books.google.com/books?id=Br8l4Z_XUgoC|издательство=John Wiley & Sons|год=2011|страниц=675|серия=Programmer to Programmer|isbn=9781118079119|ref=Jung, Brown}}
'''История языка'''
* {{статья|автор=R. Ierusalimschy, L. H. de Figueiredo, W. Celes|заглавие=The evolution of Lua|ссылка=http://www.lua.org/doc/hopl.pdf|издание=Proceedings of ACM HOPL III. 2-1–2-26|год=2007|ref=HOPL}}
* {{cite web|url=http://www.lua.org/history.html|title=The evolution of an extension language: a history of Lua|author=Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes|publisher=Reprint from Proceedings of V Brazilian Symposium on Programming Languages (2001) B-14–B-28.|access-date=2011-12-09|archive-url=https://www.webcitation.org/65Boxgnss?url=http://www.lua.org/history.html|archive-date=2012-02-04}}
* {{Книга|автор=Федерико Бьянкуцци, Шейн Уорден|часть=Глава 7. Lua|заглавие=Пионеры программирования. Диалоги с создателями наиболее популярных языков программирования|оригинал=Masterminds of Programming: Conversations with the Creators of Major Programming Languages|ответственный=|издание=|место=|издательство=Символ|год=2011|страницы=211—230|страниц=608|isbn=9785932861707|тираж=1500|ref=Бьянкуцци, Уорден}}
* [https://web.archive.org/web/20080913222414/http://www.computerworld.com.au/index.php/id;1028768484;fp;4194304;fpid;1 Интервью Роберту Иерузалимски] для [[Computerworld]] о языке Lua


=== Фразеологизмы и устойчивые сочетания ===
== Ссылки ==
*  
* [http://www.Lua.org Официальный сайт разработчиков Lua]{{ref|en}}
* [https://web.archive.org/web/20070202005230/http://luaforge.net/ Сайт проектов Lua]{{ref|en}}
* [http://Lua-users.org Сайт пользователей Lua]{{ref|en}}


=== Библиография ===
=== Lua на русском ===
*  
'''Переводы руководств'''
* [https://antirek.github.io/luabook/ Lua 5.3 Руководство пользователя]
* [[mw:Extension:Scribunto/Lua reference manual/ru|Справочное руководство по языку Lua 5.1 (включая дополнительные библиотеки, используемые при работе с MediaWiki)]]
* [https://web.archive.org/web/20070927201515/http://www.scarface.ru/modules.php?name=Downloads&d_op=viewdownloaddetails&lid=2 Русскоязычный мануал по Lua 5.0] — фрагмент справочного руководства по языку Lua 5.0 для написания скриптов для игр [[Heroes of Might and Magic V]] и [[Серп и молот (игра)|Серп и молот]]
* [http://www.rldp.ru/mysql/mysqldev/glava04.htm Справочное руководство по языку Lua 4.0]
'''Статьи и обзоры'''
* ''Мартин Страйчер.'' [http://www.ibm.com/developerworks/ru/library/l-lua/ Создание встраиваемых сценариев на языке Lua]
* ''Андрей Зубинский.'' [http://itc.ua/articles/eshhe_odin_letnij_yazyk_programmirovaniya_20951 Еще один «летний» язык программирования] ([http://itc.ua/articles/eshhe_odin_letnij_yazyk_programmirovaniya_chast_2_21025 часть 2]; [http://itc.ua/articles/eshhe_odin_letnij_yazyk_programmirovaniya_chast_3_21293 часть 3]; [http://itc.ua/articles/eshhe_odin_letnij_yazyk_programmirovaniya_chast_4_21409 часть 4])
* ''Ash Matheson.'' [http://club.shelek.ru/viewart.php?id=77 Введение в Lua] — перевод статьи [https://web.archive.org/web/20090601161043/http://www.gamedev.net/reference/articles/article1932.asp An Introduction to Lua]{{ref|en}}
* ''Keith Fieldhouse.'' [http://netsago.org/ru/docs/1/4/ Введение в Lua] — перевод статьи [https://web.archive.org/web/20060312124121/http://www.onlamp.com/pub/a/onlamp/2006/02/16/introducing-lua.html Introducing Lua]{{ref|en}}
* [http://wiki.linuxformat.ru/wiki/LXF122:LUA Серия статей о Lua] // [[Linux Format]]
* [http://ilovelua.narod.ru/ Я люблю Lua] — уроки по языку Lua и его встраиванию в C++ приложения ([https://ilovelua.wordpress.com/ Новый Сайт]) <!-- это «народ», но это качественный авторский материал -->
* [http://robot-develop.org/archives/3717 Использование Lua в робототехнике]


<!-- Служебное: -->
{{Lua (язык программирования)}}
{{improve|eo|пример|этимология}}
{{Выполнение программы}}
{{Категория|язык=eo|Собственность||}}
{{длина слова|3|eo}}


{{multilang|6}}
[[Категория:Lua]]
[[Категория:Свободные библиотеки программ]]
[[Категория:Свободные компиляторы и интерпретаторы]]
[[Категория:Прототипно-ориентированные языки программирования]]

Текущая версия от 21:09, 2 марта 2026

Шаблон:Redirect Ошибка скрипта: Модуля «Unsubst» не существует. Шаблон:Язык программирования Lua (лу́а, Шаблон:Tr-pt<ref name=luaabout>Шаблон:Cite web</ref>) — скриптовый язык программирования, разработанный в подразделении Tecgraf (Computer Graphics Technology Group) Шаблон:Iw (Бразилия). Интерпретатор языка свободно распространяется с открытым исходным кодом на языке программирования Си.

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

Lua предназначен для пользователей, не являющихся профессиональными программистами, вследствие чего большое внимание уделено простоте дизайна и лёгкости обучения. Язык широко используется для создания тиражируемого программного обеспечения (например, на нём написан графический интерфейс пакета Adobe Lightroom). Также получил известность как язык программирования уровней и расширений во многих играх<ref name="pollres"/>, в том числе Garry’s Mod, Luanti, Factorio и Roblox Studio.

История

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

Как отметил Луиш Энрике ди Фигейреду, Lua — единственный язык программирования, разработанный в развивающейся стране и получивший всемирное признание, которое, в частности, выразилось в приглашении на конференцию Шаблон:IwШаблон:Sfn.

Историческими родителями языка были языки конфигурирования и описания данных SOL (Simple Object Language) и DEL (Data-Entry Language)<ref>Шаблон:Cite web</ref>, они были независимо разработаны в Tecgraf в 1992—1993 годах для добавления некоторой гибкости в два отдельных проекта (оба были интерактивными графическими приложениями для конструкторских нужд в компании Petrobras). В SOL и DEL отсутствовали какие-либо управляющие конструкции, и Petrobras чувствовал растущую необходимость в добавлении к ним полноценного программирования.

Как пишет автор языка в The Evolution of Lua:Шаблон:Sfn

<templatestyles src="Шаблон:Начало_цитаты/styles.css" />{{#ifexpr: 0 mod 2 = 0 and 0 != 4 and 0 != 104 |

}}{{#if: |

:

}}

{{#ifexpr: 0 mod 2 = 0 and 0 != 4 and 0 != 104 |

}}В 1993 году единственным реальным претендентом был Tcl, который был специально создан для встраивания в приложения. Однако у Tcl был непривычный синтаксис, не было хорошей поддержки описания данных, и запускался он только на платформах Unix. Мы не рассматривали Лисп или Scheme из-за их недружелюбного синтаксиса. Python был ещё во младенческом возрасте. В атмосфере «сделай сам», которая тогда царила в Tecgraf, было вполне естественно, что мы решили разработать свой собственный скриптовый язык. Из-за того, что большинство пользователей не было профессиональными программистами, языку следовало избегать замысловатого синтаксиса и семантики. Реализация нового языка должна быть легко портируема, так как клиенты Tecgraf имели очень разнообразные платформы. Наконец, поскольку мы ожидали, что другим продуктам Tecgraf также понадобится встроенный скриптовый язык, новый язык должен следовать примеру SOL и предоставляться в виде библиотеки с API на C.{{#if:

| <templatestyles src="Шаблон:Конец цитаты/styles.css" />

}}

Lua 1.0 была спроектирована таким образом, что конструкторы объектов, тогда чуть отличавшиеся от текущего лёгкого и гибкого стиля, включали в себя синтаксис языка SOL (отсюда название Lua: по-португальски Шаблон:Lang-pt2 — «солнце», Шаблон:Lang-pt2 — «луна»). Управляющие конструкции Lua в основном заимствованы из Модулы-2 (if, while, repeat/until), хотя на них также повлияли Клу (параллельное присваивание, множественное возвращаемое значение функции как более простая альтернатива вместо передачи параметров по ссылке или явных указателей), C++ («отличная идея объявлять локальные переменные лишь тогда, когда они нужны»), Снобол и awk (ассоциативные массивы). Создатели Lua также признают, что единый вездесущий механизм структурирования данных в Lisp и Scheme (связный список) оказал большое влияние на их решение о выборе таблиц в качестве основной структуры данных для Lua<ref name=ddj96>Шаблон:Cite news</ref>.

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

Общая характеристика

Язык предназначен для использования в качестве отдельного либо встроенного в приложение скриптового языка. Он изначально создавался достаточно простым и компактным, чтобы поместиться на различных платформах и обеспечить приемлемую производительность. Также при проектировании учитывались требования простоты обучения и возможности использования не профессиональными программистами.

Lua — это процедурный динамически типизированный модульный язык с автоматическим управлением памятью. Включает базовые элементы для поддержки функционального и объектного стилей программирования. Таким образом, язык можно считать мультипарадигменным. Встроенные средства параллельного программирования позволяют писать многопоточные программы только средствами языка, не обращаясь к API операционной системы или внешним библиотекам. Так как основным назначением Lua является встраивание, он имеет эффективные средства межъязыкового взаимодействия, ориентированные, главным образом, на вызов библиотек Си и на работу в Си-окружении.

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

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

Синтаксис

Синтаксис Lua в основном построен на основе поздних Паскале-подобных языков, таких как Модула-2 или Оберон. Формат записи текста — свободный, команды в тексте программы разделяются любыми пробельными символами. Допускается, но не является обязательным применение точки с запятой для разделения операций.

В одном из интервью Роберту Иерузалимски заметил, что синтаксис Lua — это компромиссное решение, которое он был вынужден принять, чтобы упростить освоение языка непрофессиональными программистами. Он охарактеризовал этот синтаксис как «довольно многословный», отметив, что лично для себя предпочёл бы более краткую нотациюШаблон:Sfn.

Лексика

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

Язык регистрозависимый, все ключевые слова пишутся в нижнем регистре, идентификаторы, различающиеся только регистром букв, считаются различными. Следующие 22 ключевых слова не могут быть использованы для имён<ref name="man1">Шаблон:Cite web</ref>: <syntaxhighlight lang="lua">

 and   break  do     else elseif 
 end   false  goto   for  function 
 if    in     local  nil  not 
 or    repeat return then true
 until while

</syntaxhighlight>

Комментарии

Для комментариев используется синтаксис, аналогичный реализованному в Аде, SQL и VHDL: <syntaxhighlight lang="lua"> -- Простой однострочный комментарий в Lua начинается с двойного минуса и продолжается до конца строки. dim = { "one", "two", "three" } -- Строчный комментарий не обязан начинаться с начала строки,

                               -- он может следовать за другими языковыми конструкциями,
                               -- поясняя их.

--[[Многострочный комментарий начинается с идущих подряд за двумя минусами двух открывающихся квадратных скобок

 и продолжается до двух подряд закрывающихся квадратных скобок. Как здесь: ]]

-- Интересный эффект можно получить сочетанием строчных и многострочных комментариев: --[[ Чтобы раскомментировать код ниже, достаточно добавить в этой строке пробел между минусами и скобками. for i=1,#dim do

 print(dim[i])

end -- Если выше между минусами и скобками будет добавлен пробел, то --]] -- здесь конец многострочного комментария превратится в обычный строчный </syntaxhighlight>

Типы данных

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

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

  • nil (неопределенный);
  • boolean (логический);
  • number (числовой);
  • string (строковый);
  • function (функция);
  • userdata (пользовательские данные);
  • thread (асинхронный поток);
  • table (таблица).

nil — это тип значения nil [пустое значение], главное свойство которого — отличаться от всех остальных значений и обозначать отсутствие пригодного значения.

К типу boolean относятся значения false (ложь) и true (истина).

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

Тип string обозначает массивы символов. Строки Lua могут содержать любые 8-битные символы, включая ноль ('\0'). Строки неизменяемы. Строковые литералы могут записываться в одинарных или двойных кавычках, служебные символы помещаются в них в стандартной для C нотации с ведущим обратным слэшем. Многострочные литералы ограничиваются двумя подряд открывающимися и двумя подряд закрывающимися квадратными скобками.

Встроенная в язык поддержка Юникода отсутствует, хотя допускается использование символов UTF-8 в строковых литералах, а сама система представления UTF-8 позволяет вводить, выводить и частично обрабатывать строки в этой кодировке стандартными системными средствами. В последние версии Lua входит библиотека utf8, обеспечивающая более развитую поддержку UTF-8, существуют также библиотеки сторонних разработчиков, предоставляющие средства работы с Юникод-строками в различных кодировках.

Функции в Lua являются полноправными объектами, допускающими присваивание, передачу функции в параметре и возврат функции как одного из значений. Тип thread имеют сопрограммы, тип userdata предназначен для представления внешних данных, полученных или предоставляемых из/в код на другом языке (главным образом, на C/C++).

Операции

Присваивание
Оператором присваивания служит символ =. Подобно таким скриптовым языкам, как Perl, Python, Ruby и Icon, допускает параллельное присваивание. В простейшем случае это позволяет писать выражения вида:
<source lang="lua">
 x, y = y, x

</source>

В отличие, например, от языка Go, параллельное присваивание в Lua очень либерально, оно не требует точного соответствия числа переменных числу значений. Если значений больше, чем переменных, то последние значения отбрасываются, если значений меньше — последние переменные в списке получают значение nil.
Сравнения и логические операторы
Операторы сравнения: <, >, <=, >=, ==, ~= (последние два означают, соответственно, сравнение на равенство и на неравенство). Сравнения на равенство и неравенство применимы к любым типам данных, прочие — только к строкам и числам.
Логические операторы: and, or, not — логические «и», «или» и «не», соответственно, могут применяться к значениям любых типов и возвращают true либо false. В параметрах этих операция значения nil и false считаются ложными, любые другие значения — истинными. В отличие от C и ряда других языков, даже числовой нуль (0) или пустая строка ("") с точки зрения логических операторов представляют значение «истина». Вычисление бинарных логических операторов традиционно выполняется до тех пор, пока результат не будет определён, причём в качестве результата возвращается последнее вычисленное подвыражение. Поэтому их можно использовать как тернарный оператор ?: в языке Си:

<syntaxhighlight lang="lua"> -- аналогично r = ( a < b)? f(a) : f(b); в Си, r = ( a < b ) and f(a) or f(b) -- r получит значение функции f() от меньшего из двух значений: a и b, -- при условии, что f(a) не равно nil или false. </syntaxhighlight>

Арифметические операторы
+ — сложение;
- — вычитание;
* — умножение;
/ — деление;
- — унарный минус;
% — остаток от деления;
^ — возведение в степень.

Все арифметические операторы поддерживают вещественные операнды, давая предсказуемый результат. Так, x^0.5 возвращает квадратный корень из x, x^(-1/3) — значение, обратное кубическому корню из x. Оператор % определяется выражением: a % b = a - math.floor(a / b) * b, где функция math.floor() вычисляет целую часть своего аргумента. Для целых аргументов его результат вполне обычен. Для вещественного делимого нужно учитывать, что операция не производит никаких дополнительных округлений или отбрасывания дробной части, поэтому результат сохранит дробную часть делимого. Например, math.pi % 2 вернёт не 1, а 1.1415926535898. Такая реализация даёт некоторые дополнительные возможности. Например, для усечения x до трёх знаков после запятой достаточно взять выражение x - x % 0.001

Таблицы

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

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

<syntaxhighlight lang="lua"> -- Таблица общего вида: empty = {} -- Пустая таблица empty[1] = "первый" -- Добавление элемента с целым индексом empty[3] = "второй" -- Добавление элемента с целым индексом empty["третий"] = "третий" -- Добавление элемента со строковым индексом empty[1] = nil -- Удаление элемента из таблицы

-- Классический массив - строки индексируются по умолчанию целыми числами, начиная с 1 days1 = {"понедельник", "вторник", "среда", "четверг", "пятница", "суббота", "воскресенье"}

-- Массив с произвольной индексацией days2 = {[0]="воскресенье", [1]="понедельник", [2]="вторник", [3]="среда", [4]="четверг", [5]="пятница", [6]="суббота"}

-- Запись (структура) - значения различных типов индексируются литералами person = {tabnum = 123342, -- Табельный номер

         fio = "Иванов Степан Васильевич",  -- Ф.И.О.
         post = "слесарь-инструментальщик", -- Должность
         salary = 25800.45,                 -- Оклад
         sdate = "23.10.2013",              -- Дата приёма на работу
         bdate = "08.08.1973"}              -- Дата рождения

pfio = person.fio --Обращение к элементу структуры.

-- Множество - индексы используются для хранения значений workDays = {["понедельник"]=true, ["вторник"]=true, ["среда"]=true, ["четверг"]=true, ["пятница"]=true} workDays["суббота"] = true -- Добавление субботы в число рабочих дней workDays["среда"] = nil -- По средам больше не работаем

-- Проверка, является ли d рабочим днём if workDays[d] then

 print (d.." - рабочий день")

else

 print (d.." - выходной день")

end </syntaxhighlight>

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

Замыкания

Lua поддерживает концепцию замыканий, например: <source lang="lua"> function makeaddfunc(x)

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

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

Средства и методы программирования

Метатаблицы

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

Метатаблица в Lua может быть связана со значением любого типа. Скалярные типы данных (все, кроме userdata и таблиц) имеют общие метатаблицы для каждого типа. Таблицы и значения типа userdata имеют индивидуальные ссылки на метатаблицы в каждом экземпляре. Изменять метатаблицы всех типов, кроме таблиц, можно только посредством внешнего кода на Си. Непосредственно из Lua доступны только метатаблицы таблиц.

Созданная «с нуля» таблица Lua не имеет метатаблицы (её ссылка на метатаблицу равна nil). Но метатаблица для неё может быть в любой момент создана либо получена от другой таблицы. Встроенная функция getmetatable(t) возвращает метатаблицу таблицы t, а функция setmetatable(t, m) устанавливает для таблицы t метатаблицу m.

Для метатаблиц документирован набор полей, которые могут использоваться интерпретатором языка. Для указания на особую роль этих полей для них принято специальное правило именования: их идентификаторы начинаются с двух подчёркиваний. Некоторые из таких полей содержат информацию о специфических свойствах объекта, к которому относится метатаблица. Например, параметр __mode, когда он задан, может превратить таблицу в слабую, то есть таблицу, все ссылки на объекты которой являются слабыми ссылками. Но значениями большинства возможных полей метатаблицы являются так называемые метаметоды, то есть ссылки на функции, которые интерпретатор вызывает при определённых условиях. Общая логика использования метаметодов интерпретатором состоит в следующем: когда интерпретатор встречает в программе операцию, которая не определена для объекта-операнда, он обращается к связанной с операндом метатаблице, находит в ней соответствующий метаметод и вызывает его. <syntaxhighlight lang="lua"> --Создание операции сложения для таблиц -- Операнды t1 = {1,2,3} t2 = {10,20,30} -- Создание метатаблицы mt = {} -- Запись в метатаблицу метаметода "__add" mt.__add = function(a, b)

            local res = {}
            for k in pairs(a) do res[k] = a[k] + b[k] end
            return res
          end

-- Привязка метатаблицы к таблице t1 setmetatable(t1, mt)

-- Теперь сложение таблиц - корректная операция t3 = t1 + t2 -- соединяем с t3 метатаблицу с метаметодом __tostring setmetatable(t3, {__tostring=function(t)

                   local res = "\n"
                   for _,v in pairs(t) do 
                     res = res .. tostring(v) .. "-"
                   end
                   return res.."\n"
                 end})

-- В результате будет выведено: "11-22-33-" for _,v in ipairs(t3) do

 io.write (v,",")

end print(tostring(t3)) -- выведет "11,22,33," </syntaxhighlight> В Lua поддерживаются метаметоды для всех арифметических операций и операций сравнения, так что с их помощью можно реализовать арифметику для любых объектов, созданных программистом. Помимо стандартных, можно использовать так называемые «библиотечные» метаметоды, которые поддерживаются не ядром языка, а конкретными библиотеками. В примере выше это метаметод __tostring, поддерживаемый библиотекой string; этот метод выполняет конвертацию таблицы в строку.

Наибольший интерес представляет поле __index. Обращение к нему происходит тогда, когда интерпретатор пытается прочитать элемент таблицы, но не находит его. Поле __index может ссылаться либо на таблицу, либо на метод. В первом случае интерпретатор, не найдя искомого значения в основной таблице, будет искать его в таблице __index. Во втором вместо обращения к таблице будет происходить вызов этого метода. Задавая таблицы или метаметоды для данного поля, в Lua можно реализовать наследование, сокрытие данных объекта, отслеживание операций с данными таблицы и многое другое.

Объектно-ориентированное программирование

Основой для ООП в Lua являются таблицы. В принципе, таблица и есть объект в ООП-смысле, так как она может иметь поля, именованные с помощью идентификаторов, и хранить в этих полях произвольные значения (свойства объекта) и функции для реализации поведения объекта (методы объекта). Некоторый синтаксический сахар, предоставляемый Lua, делает описание и обращение с объектами более привычным для программистов, имеющих опыт работы с традиционными ООП-языками. Понятия «класса» в Lua нет, поэтому описывается отдельный объект и все поля и методы относятся именно к нему. Свойства описываются аналогично элементам таблицы с ключами-идентификаторами, методы — как поля-функции. Подобно классическому Оберону, описание методов включает явное указание в первом параметре так называемого «получателя» — параметра, который при вызове метода ссылается на объект, для которого он вызван. Но, помимо стандартного обращения к полю таблицы через точку, которое требует и в вызове метода явно указывать получателя, Lua поддерживает дополнительный синтаксис: когда в вызове или описании метода его заголовок записываются в виде «Объект:метод», то получатель не указывается. При этом в теле метода он всё равно доступен под именем self:

<syntaxhighlight lang="lua"> -- Объект Account = { -- Объект "счёт"

 id, name, balance=0,          -- свойства объекта: номер, название, баланс
 credit = function (self, v)   -- метод "расход" - описание внутри объекта с явным указанием получателя
   if self.balance < v then error "Недостаточно денег на счёте" end
   self.balance = self.balance - v
 end

}

function Account:debet(v) -- метод "приход" - внешнее сокращённое описание (self не указывается)

 self.balance = self.balance + v

end

Account.debet(Account, 10000) -- вызов метода - полный вариант Account:credit(5000) -- вызов метода - сокращённый вариант </syntaxhighlight>

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

Примеры кода

Классическая программа «Hello, world!» на Lua выглядит так: <syntaxhighlight lang="lua"> print("Hello, world!") </syntaxhighlight>

Факториал — пример рекурсивной функции: <syntaxhighlight lang="lua"> function factorial(n)

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

end </syntaxhighlight>

Цикл со счётчиком: <syntaxhighlight lang="lua"> for i = 1,5 do

    -- инструкции/операции

end </syntaxhighlight>

Работа с функциями как с объектами первого класса демонстрируется в следующем примере, в котором модифицируется поведение функции print: <syntaxhighlight lang="lua"> do

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

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

Ключевой особенностью Lua является расширяемая семантика, механизм метатаблиц даёт большие возможности по настройке уникального поведения для таблиц Lua. В следующем примере демонстрируется «бесконечная» таблица. Для любого <math>n</math> fibs[n] даст <math>n</math>-е число Фибоначчи с использованием мемоизации. <syntaxhighlight lang="lua"> 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

}) </syntaxhighlight>Lua позволяет использовать логические операторы and и or для ввода тернарных конструкций, как, например, в C#, или обращение к одному из существующих объектов.<syntaxhighlight lang="lua"> do

   local num = tonumber(io.read()) -- Записывание в переменную введённой из консоли информации и преобразование её к целочисленному типу
   print(num == 1 and "Вы ввели правильное число" or "Вы ввели неправильное число") -- Если переменная num равняется 1, тогда в консоли выведится текст после and, во всех остальных случаях после or

end </syntaxhighlight>Обращение к существующей таблице и получение значения по первому индексу:<syntaxhighlight lang="lua"> do

   local tbl = nil
   local tbl2 = {1}
   print( (tbl or tbl2)[1] ) -- Выведится число 1, так как в таблице tbl2 на индексе 1 присвоено это значение

end </syntaxhighlight>Вызов функции из одной из существующих таблиц:<syntaxhighlight lang="lua"> do

   local tbl = nil
   local tbl2 = {}
   tbl2.DoSomething = function() print("Делать что-то") end
   (tbl or tbl2).DoSomething()

end </syntaxhighlight>

Реализация

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

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

Для задач, критичных по времени, имеется JIT-компилятор Lua — LuaJIT<ref>Шаблон:Cite web</ref>. Также разработан компилятор llvm-lua<ref>Шаблон:Cite web</ref>, генерирующий код для виртуальной машины LLVM, предоставляющей возможность последующей компиляции в очень эффективный машинный код для процессоров различной архитектуры.

Использование

Шаблон:Addoncat В настоящее время используется в различных проектах, где требуется встроить достаточно быстрый и нетрудный в освоении скриптовый язык программирования — например, в разработке игр, где Lua часто используется в качестве прослойки между игровым движком и данными для написания сценариев поведения и взаимодействия объектов. Благодаря компактности применим и в портативных устройствах, в частности, один из графических микрокалькуляторов Texas Instruments, а именно, TI-Nspire CX, использует язык LUA помимо традиционного для такого класса устройств Бейсика.

Игры

Первыми в разработку компьютерных игр язык Lua внедрила компания LucasArts начиная с игры Grim Fandango<ref>Шаблон:Cite web</ref>. Авторы языка в своём докладе на конференции Шаблон:Нп3 вспоминают, что в январе 1997 они получили сообщение от Брета Могилефски, главного разработчика Grim Fandango, где он писал, что, прочитав о языке в статье 1996 года в Dr. Dobb’s Journal, он планирует заменить используемый ими самодельный скриптовый язык SCUMM на LuaШаблон:Sfn. В результате им был создан игровой движок GrimE, используемый также более поздним квестом от LucasArts — Escape from Monkey Island.

В 2003 году в результате опроса на сайте GameDev.net Lua был признан самым популярным скриптовым языком для разработки игр<ref name="pollres">Which language do you use for scripting in your game engine?. GameDev.net — Poll Results</ref>.

Примером игры, программируемой с помощью Lua, является World of Warcraft<ref>Шаблон:Книга</ref><ref>Шаблон:Книга</ref>. На языке Lua описываются уровни игры-головоломки Enigma<ref>Шаблон:Книга</ref>.

Язык программирования Lua также использовался при разработке игры Baba Is You, вышедшей в 2017 году<ref name=":2">Шаблон:Cite web</ref>.

Доступен ряд свободных игровых движков, программируемых на Lua, таких, как Defold<ref>Шаблон:Cite web</ref>Шаблон:Не АИШаблон:Значимость факта, аркадный движок LÖVE<ref>Шаблон:Cite web</ref><ref>Шаблон:Книга </ref>, игровой конструктор Novashell<ref>Шаблон:Книга</ref> и ориентированный на квесты (преимущественно — текстовые) INSTEAD<ref>Шаблон:Статья</ref>.

Также используется в авиасимуляторе X-Plane, в движке X-Ray для S.T.A.L.K.E.R<ref>Шаблон:Книга</ref>.

Для популярной игры Minecraft созданы модификации ComputerCraft и его более совершенный аналог OpenComputers, которые добавляют компьютеры, программируемые на языке Lua<ref>Шаблон:Книга</ref>.

Известная игра Garry's Mod программируется, а также поддерживает модификации, написанные на Lua.

Команда Croteam (разработчики Serious Sam и The Talos Principle) использует Lua в скриптах начиная с версии Serious Engine 3.5<ref>Шаблон:Cite web</ref>.

Для игры GTA: San Andreas создаются модификации, написанные на языке Lua и поддерживаемые плагином Moonloader.<ref>Шаблон:Cite news</ref> Также игра Multi Theft Auto поддерживает программирование скриптов на языке Lua.

Игровая платформа Roblox использует Lua в качестве языка кодирования игр и управления игровой средой<ref>Шаблон:Cite web</ref>.

Сообществом игры Satisfactory создан мод Ficsit-Networks, дающий возможность программировать какие-либо действия на языке Lua<ref>Шаблон:Cite web</ref>.

В игре Factorio используется Lua для создания модов.<ref>Шаблон:Cite web</ref><ref>Шаблон:Cite web</ref>

Шаблон:Нет значимости 2

LuaTeX

Программа компьютерной вёрстки LuaTeX, расширенная версия pdfTeX, использует Lua как встроенный скриптовый язык<ref>Шаблон:Cite web</ref>.

RPM

Пакетный менеджер RPM содержит встроенный интерпретатор Lua<ref>Шаблон:Cite web</ref>.

IDE

Существует как минимум две «родные» среды разработки для Lua:

  • ZeroBrane Studio<ref>Шаблон:Cite web</ref> — мультиплатформенная среда разработки, написанная на самом Lua;
  • Decoda — среда разработки под Windows, написанная на C++, с богатыми возможностями отладки Lua-скриптов, в том числе в работающих приложениях. На 2018 год последний выпуск среды датировался 2014 годом и имеет статус бета-версии.

Кроме того, Lua поддерживается некоторыми универсальными IDE, в частности:

Существовал модуль поддержки Lua для среды NetBeans, но его развитие прекратилось в 2013 году и он доступен только для версии NetBeans 7.4 и более ранних. В NetBeans 8 плагин не поддерживается.

См. также

Примечания

Шаблон:Примечания

Литература

История языка

Ссылки

Lua на русском

Переводы руководств

Статьи и обзоры

Шаблон:Lua (язык программирования) Шаблон:Выполнение программы