Язык программирования Lua
Lua — язык программирования (ЯП), который оснащен свободно распространяемым интерпретатором. По своей задумке он имеет некоторую схожесть с таким языком программирования, как JavaScript. Но в отличие от него Lua считается более гибким ЯП с мощными конструкциями.
Историческая справка
Разработчиком Lua является подразделение Tecgraf, которое располагается в Бразилии. Этот известный язык программирования был запущен в 1993 году. Над его разработкой трудились такие программисты, как Роберт Иерузалимски, Вальдемар Селиш, Луиш Энрике ди Фигейреду. Главная особенность языка — открытый код. Это говорит о то, что каждый желающий сможет поучаствовать в его развитии. Еще одна особенность Lua — его происхождение. Бразилия практически никогда не была замешана в сфере компьютерных разработок.
Прародителями Lua можно назвать два языка программирования — SOL, Del, которые также были выпущены подразделением Tecgraf. Заказчиком языка стала известная компания Petrobras. Последняя версия Lua — 5.4.0. Это обновление вышло во второй половине 2020 года. Несмотря на то, что этот ЯП считается достаточно взрослым, он активно продолжает использоваться в it-сфере, именно поэтому разработчики регулярно выпускают обновления ЯП, исправляют ошибки, вносят некоторые корректировки.
Общая характеристика
Язык программирования Lua применяется как отдельный или встроенный в приложение скриптовый язык. Изначально он был простым и компактным. Он должен был помещаться на исполнительных платформах и создавать хорошую производительность. Изначально разработчики языка желали сделать его простым в обучении, чтобы освоением могли заниматься не только профессионалы, но и начинающие программисты.
Сейчас Lua считается процедурным динамически модульным языком с автоматическим управлением памятью. В него входят базовые инструменты для поддержания различных стилей программирования. Lua также называют мультипарадигменным ЯП. Он дает возможность создавать многопоточные ПО без API и внешних библиотек.
Lua поддерживает небольшое количество встроенных типов данных. Комбинированные структуры в этом случае отсутствуют. Объектами первого класса в представленном языке считаются функции. Lua поддерживает замыкания, позволяет создавать функции высших порядков. Этот ЯП активно используется в сфере промышленности. Он изначально создавался для компании Petrobras, главной сферой деятельности которой была нефтяная промышленность.
Сегодня Lua также активно используется для создания игр. Это объясняется тем, что этот язык дает возможность быстро и легко программировать действия NPC. При помощи Lua можно программировать и иных персонажей. В этом случае поведение персонажей можно будет быстро менять без нагрузки на движок.
Язык программирования Луа применялся при написании интерфейса такой известной игры, как World of Warcraft. Известно, что этот ЯП применялся разработчиками и при создании многих других известных игр — Crysis, Far Cry, Stalker. Сегодня Lua также используется для создания ботов в мессенджере Telegram. Известно, что Википедия также будет использовать данный язык для MediaWiki.
Lua также используется в научных целях, например, его используют в центрах, которые занимаются исследованием космоса. Многие учебные заведения используют этот язык для создания внутренних программ. Известно, что в Бразилии Lua используется программистами практически повсеместно. Многие даже называют его местным государственным ЯП.
Код программы на ЯП Луа:
print(«Hello World!»)
Факториал — пример рекурсивной функции:
funсtion fаctoriаl(n)
if n == 0 thеn
rеturn 1
else
return n * fаctoriаl(n — 1)
еnd
еnd
Цикл со счётчиком:
fоr i = 1,5 dо
— Statements
еnd
Какие главные преимущества и недостатки языка программирования Lua?
Lua имеет немало преимуществ, именно поэтому с ним работают многие компании:
- Хорошая портируемость. Это немаловажный аспект для многих программистов. Например, программы, написанные на Lua, можно без лишних проблем перенести с Windows на Linux.
- Множество библиотек. На официальном сайте Луа можно найти немало библиотек для решения задач разного уровня. Но, естественно, по этому параметру Луа все-таки проигрывает популярному языку JavaScript.
- Возможность добавления библиотек. Луа дает возможность добавлять новые библиотеки, которые были разработаны на языке С.
- Простой синтаксис. Lua достаточно легко учится и быстро осваивается — как новичками, так и профессионалами в сфере It.
- Программное обеспечение, написанное на языке Луа, занимает меньше памяти на устройствах.
У Lua есть и свои недостатки. Прежде всего этот язык считается скриптовым. Это говорит о том, что часто он используется в комбинации с другими языками программирования. Например, С. Самостоятельно Луа применяется не так часто. Поэтому программистам для полноценной работы потребуется изучить еще 1-2 языка программирования.
Мнения критиков
Вокруг этого языка программирования всегда было немало споров. Многие критики неоднократно обсуждали тот факт, что Луа разработан для работы с С, а не с С++. Это действительно так. Но при помощи некоторых библиотек программисты могут встраивать Lua и в С++. Такой принцип программирования, конечно, имеет свои недостатки. Но, несмотря на это, сегодня с ним продолжают работать многие специалисты.
Многие критики подвергали сомнению и скорость языка. Луа считался более медленным Яп, чем его конкуренты. На самом же деле, все эти убеждения оказывались ошибочными. Луа работает с какой-либо логикой, поэтому рабочий процесс здесь замедлять просто нечему.
Также многие профессионалы считали, что Lua подходит только для маленьких проектов. Отчасти это правда. Но не стоит забывать о том, что Луа является модульным языком. Поэтому из небольших модулей можно всегда сделать что-то более грандиозное.
Дальнейшие перспективы
Разработка игр считается весьма перспективным направлением в наши дни. Игровая индустрия развивается ежегодно, поэтому языки программирования в этом случае востребованности своей не теряют. Однако Луа не считается самым популярным ЯП в игровой сфере.
Если ориентироваться на индекс Tiobe, он занимает только 30 место. Впереди него находятся такие известные языки, как Java, Python, C. Это объясняется тем, что несмотря на востребованность в игровой сфере, Lua практически никогда не используется в одиночку. Луа необходим для создания лишь отдельных игровых компонентов. Используя только этот язык программирования, нельзя полностью создать полноценную игру.
Стоит также отметить, что современные компании все меньше и меньше нуждаются в работе разработчиков Lua. Эта вакансия становится все менее востребованной в it-сфере. Несмотря на это, существует немало желающих занять вакансию lua разработчика, если таковая имеется в определенных компаниях. Поэтому специалисты рискуют столкнуться с немалой конкуренцией при трудоустройстве.
Если у начинающего программиста в планах изучать язык Луа, необходимо понимать, что он должен быть не единственным языком, с которым придется работать, особенно в игровой сфере.
Синтаксис языка
Принцип синтаксиса Луа основывается на принципе таких языков, как Модула-2 и Оберон. Запись текста происходит в свободном формате. Разделение команд происходит пробельными символами. Иногда для разделения используется точка с запятой.
Один из рзработчиков языка, Роберт Иерузалимски, объяснял в одном из своих интервью то, что синтаксис Луа можно назвать компромиссным решением. Разработчики хотели, чтобы Lua могли осваивать не только профессионалы, но и начинающие специалисты, поэтому язык так легко учится и имеет весьма упрощенный синтаксис.
Лексика
Главным алфавитом ЯП Луа считается английский язык. В строковых литералах применяются символы из других ЯП. Идентификаторы состоят из букв, цифр, символа подчеркивания. Они никогда не начинаются с цифры и не имеют совпадений с одним из ключевых слов. Если обратиться к материалу по использованию Lua, то можно отметить, что разработчики не советуют работать с идентификаторами, которые начинаются с подчеркивания. Это обусловлено тем, что эти символы преимущественно необходимы для системных целей.
Эти ключевые слова не могут использоваться для имён:
Типы данных
Луа считается языком программирования, который имеет неявное динамическое обозначение типов данных. Переменная в этом случае содержит значения любого типа. Значения в этом ЯП могут оставаться в переменных. При этом они используются как аргументы в случае вызова функций, а затем приходят на исходные позиции в качестве результата их выполнения. В языке программирования Луа имеется 8 главных типов.
- Nil является пустым элементом. Его отличительным качеством можно назвать полное отличие от всех иных значений. Nil обозначает полное отсутствие пригодного значения.
- Boolean — тип, которому можно отнести такие значения, как ложь и истина.
- Number — элемент, к которому относят преимущественно вещественные числа.
- String характеризует массивы символов. Здесь речь может идти о 8-битных символах. Строки в этом случае остаются неизменными. Функции в этом языке программирования могут считаться полноправными объектами. Они дают возможность присваивания и передачи данных в параметрах.
- Thread имеет сопрограммы.
- Тип userdata необходим для того, чтобы получать внешние данные, которые были получены на другом языке программирования. Например, С или С++.
Оператор присваивания (ОП)
ОП в Луа называют символ =. В этом языке программирования возможно использование параллельного присваивания, как и в других ЯП. Допустим, Python, Icon. В самом простом случае это позволяет создавать выражения такого вида:
Если сравнить Луа с языком программирования Go, то станет ясно, что параллельное присваивание в Луа происходит проще. В этом случает не требуется полное соответствие числа переменных количеству значений. К примеру, если число значений и переменных разнится, то данные переменных могут отбрасываться (если значений больше). В обратном случае будет присваиваться тип nil.
Таблицы
Таблицы в Луа называют динамическим ассоциативным массивом. Иными словами, это большое количество пар, которые имеют вид «ключ-значение». В такой ситуации ключом может быть значение любых видов Луа, кроме nil. Иногда ключи бывают литералами. При записи nil в элементы таблицы подобное действие будет равносильно удалению выбранного элемента. Таблицы в Lua — это единственный составной тип данных. Их можно назвать базой и основой для всех пользовательских баз данных.
Мультимножества создаются подобно массивам. Однако в этом случае в качестве значений берутся не логические, а целые числа соответствующих компонентов в множестве. Списки в это случае представляются в качестве массивов двухэлементных массивов, которые будут хранить значения и ссылку на другие компоненты.
Если речь идет о многомерных массивах, то они чаще всего реализовываются как массивы массивов. Если используются более многогранные и сложные элементы, то их реализация будет выполняться на основе таблиц. Вид реализации будет зависеть от типа задачи.
Метатаблицы
Метатаблицы в языке программирования Луа дают многие опции. По своим свойствам они похожи на обычные таблицы в Луа, которые имеют возможность соответствовать всем правилам и нормам. Главная особенность метатаблиц заключается в их использовании Этот элемент хранит различные метаданные типов и объектов.
Иными словами, в них находится информация, которая связана с опциями и параметрами типов и объектов Луа. Данные, которые содержатся в метатаблицах, могут применяться интерпретатором языка программирования. При их использовании функционал программных элементов может значительно расширяться.
Метатаблица в Луа связывается со значениями любого типа. Если речь идет о скалярных данных, то все они имеют цельные метатаблицы для любых видов. Значения типа userdata располагают индивидуальными ссылками на метатаблицы. Изменение метатаблиц всех видов происходит при помощи внешнего кода на С. Таким образом, из Луа будут доступны только метатаблицы таблиц.
Если сделать на этом языке программирования таблицу с самого начала, она не будет иметь метатаблицы. При этом метатаблицу в таком случае можно будет создать от других таблиц. За счет опции getmetatable происходит возвращение метатаблицы таблицы t.
При помощи опции setmetatable происходит установка для таблицы t метатаблицы m. Для метатаблиц в ЯП Луа предоставлен набор полей. Они могут применяться как интерпретатор языка. Чтобы указывать на особую роль имеющихся полей, для них используется правило именования. В этом случае идентификаторы начинаются с двух подчеркиваний.
Отдельные поля содержат данные о специфических свойствах объекта, в котором находится метатаблица. В Луа есть элемент, который обозначается как __mode. Если он будет задан, то таблица может стать слабой. При этом все ссылки на объекты тоже станут слабыми.
По значениям большей части доступных полей метатаблицы называют метаметодами. Это говорит о том, что имеются ссылки на функции, которые иногда вызывают интерпретаторы. Принцип работы метаметода выглядит так — при встрече интерпретатором в программе он будет обращен к связанной с операндом метатаблице. Далее он ищет необходимый метаметод и приводит его к вызову.
—[[ Создание операции сложения для таблиц ]]
— Операнды
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-«
В языке программирования Луа могут применяться все метаметоды для разных арифметических операций. Именно поэтому при помощи Lua можно проводить арифметику для любых объектов. В процессе идет работа как со стандартными, так и с библиотечными метаметодами (их поддержка происходит не ядром ЯП, а определенными библиотеками).
Главное значение в этом случае дает поле __index. Оно используется в тех случаях, когда интерпретатор читает данные таблицы, не может его найти.__index позволяет опираться на таблицы или на методы. Если происходит ссылка на таблицу, то интерпретатор найдет искомый элемент в таблице __index. В ином случае вместо работы с таблицей произойдет вызов этого метода. В Луа имеется возможность реализации наследования, анализа операций с таблицами.
Объектно-ориентированное программирование
Таблицы в языке программирования — это база для объектно-ориентированного программирования. Их можно назвать объектом в ООП. Это объясняется тем, что она имеет поля, которые именуются за счет идентификаторов. При этом таблицы хранят в полях произвольные значения и опции для осуществления поведения объекта. Некоторые синтаксические возможности языка программирования Луа дают описание и обращение с объектами более доступными для пользователей.. которые хорошо знают традиционные языки.
Программисты должны учитывать, что такого понятия, как «класс», в Луа не существует. В этом случае происходит описание отдельных компонентов, при этом все поля и методы будут относиться конкретно к нему.
Описание свойств происходит таким способом, как элементы таблицы с ключами. Методы в этом случае будут использоваться как поля-функции. Описание методов включает в себя указание в элементе «получателя». Этот тот элемент, который в случае вызова метода будет ссылаться на объекты, из-за которых и произошел вызов.
Наследование происходит за счет метатаблиц и метаметодов. При использовании метаметодов данные скрываются и происходит создание контролируемого доступа к полям таблицы, которая служит объектом. Если сравнить подобные особенности с другими языками программирования, то стоит отметить, что в Луа процесс наследования происходит сложнее. Это обусловлено тем, что он требует боле тщательного кодирования . При этом процесс обеспечивает большую гибкость и приводит к упрощению интерпретатора.
Реализация
Реализация в ЯП Луа имеет компилятор с исходного языка и виртуальную машину, которая приводит к работе сгенерированного байт-кода. Байт-коды в этом случае не являются командой сетевой машины. Они представлены как команды виртуального процессора с разными регистрами. Подобный процесс приводит к повышению эффективности исполнения.
В классической виртуальной машине языка программирования происходит распределение памяти со сборкой ненужных данных. Подобный процесс также наблюдается в таких языках программирования, как Java, .NET).
В языке программирования Луа применяется единый строковый пул. Подобные действия снижают расход памяти на хранение строк. Если происходит работа с задачами, которые критичны по времени, имеется JIT-компилятор Луа. Также существует компилятор IIvm-lua, он имеет свойство генерировать код для виртуальной машины LLVM. Она переводит последующие компиляции в машинный код.
Работа с ошибками
Луа считается дополнительным языком, которые используется совместно с другими языками программирования. Все действия Луа берут свое начало из кода С в хвост-программе. Если происходит ошибка в процессе компиляции или в ходе выполнения порции Луа-кода, управление перейдет к хосту, который, в свою очередь, может выполнить соответствующие меры.
Допустим, дать сообщение об ошибке. Код Луа явно генерирует ошибки, вызывая при этом опцию error. При необходимости искать ошибки в языке программирования необходимо применять pcall или xpcall. Это необходимо для вызова функции в режиме защиты.
При обнаружении ошибки происходит распространение ее объекта. Он называется error message. Таким образом, язык программирования Луа генерирует только ошибки, чьим объектом называется строка. Программы при этом генерируют ошибки с любым значением в качестве объекта ошибки.
Если программист применяет xpcall и lua_pcall, ему можно задавать обработчик сообщений, который называется message handler. Он необходим для того, чтобы в дальнейшем получать сообщения об ошибках. Вызов этой опции происходит с исходным сообщением об ошибке. Возвращение в этом случае осуществляется с новым сообщением об ошибке. Подобная опция вызывается до того, как ошибка развернет стек. Таким образом, можно собрать больше сведений об ошибке.
В подобных случаях может происходить проверка стека или создание трассировки стека. Этот обработчик сообщений будет действовать под охраной защищенного вызова. Ошибка внутри обработчика сообщений приведет к вызову обработчика сообщений. При продолжении этого цикла на протяжении долгого времени, Lua прерывает его и возвращает соответствующее сообщение.