Lua
Lua | |
---|---|
Класс языка | язык программирования |
Тип исполнения | интерпретируемый |
Появился в | 1993 году[1] |
Автор |
Роберту Иерузалимски, Валдемар Селиш, Луиш Энрике ди Фигейреду[2] |
Расширение файлов |
*.lua, *.luna *.lunaire или *.anair |
Выпуск | версия 5.4.7 [3] |
Система типов | динамическая |
Испытал влияние | C++ |
Лицензия | лицензия MIT[4] |
Сайт | lua.org |
Платформа | кроссплатформенность |
Lua (лу́а, порт. луна) — скриптовый язык программирования, разработанный бразильскими программистами в подразделении Tecgraf (Computer Graphics Technology Group) Католического университета Рио-де-Жанейро[1].
По идеологии и реализации язык Lua ближе всего к JavaScript, в частности, он также реализует прототипную модель ООП, но отличается паскалеподобным синтаксисом и более мощными и гибкими конструкциями. Особенностью Lua является его возможность лёгкой интеграции с программами, написанными на C++ и других языках.
Lua является языком динамической типизации, то есть в нём нет заранее заданных значений типов переменных. Все значения переменных привносят свой собственный тип[5].
История создания
Язык программирования Lua был создан в 1993 году членами группы технологий компьютерной графики, Tecgraf. Его создателями стали Роберту Иерузалимски, Луис Энрике де Фигейредо и Вальдемар Селиш[1].
Предпосылки создания
В начале 1990-х годов в Бразилии существовали строгие ограничения на импорт программного обеспечения, что вынуждало разработчиков создавать собственные решения. Это стало одной из основных причин, по которой команда решила разработать новый язык программирования. Они хотели создать язык, который был бы легким, гибким и легко интегрируемым в другие системы. В условиях ограниченного доступа к международным программным продуктам, разработчики были вынуждены искать альтернативные пути для удовлетворения своих потребностей.
Начало разработки
Первоначально Lua был разработан как набор библиотек для расширения возможностей существующих систем. Однако вскоре стало ясно, что для достижения поставленных целей необходимо создать полноценный язык программирования. В 1993 году была выпущена первая версия Lua, которая включала в себя основные элементы, такие как таблицы, функции и управление памятью. Этот язык был простым и легким, что позволяло встраивать его в различные приложения.
Основные версии и их особенности
С момента своего создания Lua прошел через множество изменений и улучшений. Основные этапы развития языка отражены в приведенной таблице[6].
Версия | Год выпуска | Описание |
---|---|---|
Lua 1.0 | 1993 | Первая версия включала в себя основные элементы, такие как таблицы, функции и управление памятью. |
Lua 2.0 | 1994 | Вторая версия добавила поддержку метатаблиц и улучшила производительность языка. Это дало возможность создавать сложные и гибкие структуры данных. |
Lua 3.0 | 1997 | Третья версия добавила поддержку замыканий и улучшила систему управления памятью. Замыкания позволили создавать более мощные и гибкие функции. |
Lua 4.0 | 2000 | Четвёртая версия добавила поддержку многозадачности. Эта версия также включала улучшения в области управления памятью и обработки ошибок. |
Lua 5.0 и далее | 2003 | Пятая версия добавила поддержку модулей. С тех пор было выпущено несколько новых версий Lua, каждая из которых добавляла новые возможности и улучшала производительность языка. |
Общие характеристики
Lua — это процедурный динамически типизированный модульный язык с автоматическим управлением памятью. Включает базовые элементы для поддержки функционального и объектного стилей программирования. Встроенные средства параллельного программирования позволяют писать многопоточные программы только средствами языка, не обращаясь к внешним библиотекам. Так как основным назначением Lua является встраивание, он имеет эффективные средства межъязыкового взаимодействия, ориентированные, главным образом, на вызов библиотек C и на работу в C-окружении.
Язык поддерживает небольшое количество встроенных типов данных: логические значения, числа, строки, функции, потоки. Типичные комбинированные структуры данных, такие как массивы, наборы, списки и записи, отсутствуют, вместо всех их используется одна базовая структура Lua — таблица. Отдельный тип userdata предназначен специально для низкоуровневого программирования и обмена данными с внешним кодом на других языках. Функции в Lua являются объектами первого класса, могут присваиваться и передаваться в параметрах. Поддерживаются замыкания, есть возможность создания функций высших порядков. Объектная система прототипная, отсутствует явная поддержка наследования, однако оно легко реализуется с помощью метатаблиц.
Типы данных
В языке Lua представлены следующие типы данных:
Тип данных | Описание | Пример |
---|---|---|
nil | Отсутствие значения или пустая переменная | foo = nil
|
number | Числовой тип, включая целые числа и числа с плавающей точкой | age = 30
|
string | Строковый тип для текстовых данных | name = "Николай"
|
boolean | Логический тип, принимающий значения true или false | isOnline = true
|
table | Структура данных для хранения массивов, списков и словарей (таблица) | user = {name = "Анна", age = 25}
|
function | Тип данных для функций. Lua может вызывать и манипулировать функциями, написанными на Lua и на С | function greet() print("Привет!") end
|
userdata | Предназначен для хранения произвольных С-данных в Lua-скриптах | file = io.open("log.txt", "r")
|
thread | Представляет независимый поток выполнения и используется для реализации сопрограмм | co = coroutine.create(function () print("Hello, World!") end
|
Синтаксис
Основной алфавит языка — английский, в строковых литералах допускается использование символов других языков. Например:
string = "Статистика" --Статистика - литерал
Язык регистрозависимый, все ключевые слова пишутся в нижнем регистре, идентификаторы, различающиеся только регистром букв, считаются различными. Следующие 22 ключевых слова не могут быть использованы для имён[7]:
| and | break | do | else | elseif
| end | false | goto | for | function
| if | in | not | nil | local
| or | repeat| then | true | return
| until| while
Переменные и операторы
- Переменные могут быть локальными и глобальными.
- Условные операторы позволяют выполнять код в зависимости от истинности условия.
- Циклы используются для многократного выполнения блока кода.
Если объявление переменной происходит с помощью ключевого слова local, переменная носит локальный характер и её область видимости ограничена текущим блоком. Без этого слова создаётся глобальная переменная. Третий вид переменных — поля таблиц[5].
Условные операторы в Lua начинаются с ключевого слова if, за которым следует условие и блок кода, выполняемый при истинности условия. Для создания циклов можно использовать while, repeat…until или числовой цикл for. При необходимости выражение break завершает исполнение цикла while, repeat или for, пропуская оставшиеся команды цикла. Ниже представлен пример использования этих конструкций:
Управляющая конструкция | Пример | Описание |
---|---|---|
Объявление переменной | local x = 10
|
Объявление локальной переменной. |
Условный оператор | if x > 5 then print("x больше 5") end
|
Если значение переменной х >5, выводится «x больше 5». |
Цикл while | while x > 0 do x = x - 1 end
|
Повторение блока кода, пока условие истинно. |
Цикл for | for i = 1, 10 do print(i) end
|
Итерация по числовому диапазону. |
Арифметические операторы
Lua поддерживает следующие арифметические операторы:
+
— сложение;-
— вычитание;*
— умножение;/
— деление;%
— остаток от деления;^
— возведение в степень.- Отдельно в этом ряду стоит унарный минус:
-
— это знак, который не является арифметическим действием, а лишь указывает на отрицательное число или меняет знак числа или выражения на противоположный.
Операторы сравнения
==
— равенство;~=
— неравенство;<
— меньше;>
— больше;<=
— меньше или равно;>=
— больше или равно.
Битовые операторы
&
— битовое И;|
— битовое ИЛИ;~
— битовое ИЛИ НЕ;>>
— правый сдвиг;<<
— левый сдвиг.
Логические операторы
Кроме этого, в Lua существуют следующие текстовые логические операторы: and (И), or (ИЛИ) и not (НЕ). Как и управляющие структуры, все логические операторы считают false и nil как false («логический 0»), а все остальное как true («логическая 1»). Оператор отрицания not всегда возвращает false или true, инвертируя значение переменной.
Комментарии
Комментарий в Lua начинается с двойного дефиса и заканчивается до конца строки. Многострочные комментарии заключены в двойные квадратные скобки.
-- Однострочный комментарий. Текст заканчивается до конца строки.
-- [[
-- Многострочный комментарий.
-- Текст может занимать несколько строк
-- ]]
Функции и таблицы
- Создание функции начинается с ключевого слова function, за которым следует имя функции и набор параметров в круглых скобках. Например, функция сложения двух чисел выглядит так:
function addNumbers(a, b)
return a + b
end
Факториал — пример рекурсивной функции. Факториал натурального числа определяется как произведение всех натуральных чисел от 1 до n включительно:
-- определение функции факториала
function fact (n)
if n == 0 then
return 1
else
return n * fact(n-1)
end
end
print("enter a number:")
a = io.read("*n") -- считывание числа
print(fact(a)) -- вывод на терминал
- Таблицы — это динамические ассоциативные массивы. Представляют собой составной тип информации, построенный по принципу массива, состоящего из пар «ключ-значение». Таблицы положены в основу всех пользовательских баз данных. Ключом (индексом) может быть любое значение, кроме nil. Создание таблицы происходит с помощью конструкции { }. При создании многомерных массивах чаще всего встречается реализация по типу «массив массивов»[8].
- Ниже показано, как реализуются таблицы общего вида, а также различные структуры, массивы, множества:
-- Таблица общего вида:
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
Кроссплатформенность
Кроссплатформенность языка программирования — способность программного обеспечения работать как на разных аппаратных платформах, так и под разными операционными системами. Lua является кроссплатформенным интерпретируемым языком, способным работать в операционных системах Linux и Windows одновременно.
Кроме того, существует возможность совместной работы языка Lua с другими языками, например, с языком C++ или с языком JavaScript. Для работы с Луа и его дальнейшим внедрением в другой язык программирования необходим компилятор, совместимый с интерфейсом этого языка. Для того, чтобы работать с Луа в Windows, был создан специальный компилятор — SciTE (от англ. Scintilla based Text Editor). Для работы в Linux в силу его специфичности необходимо в окне «Терминал» выполнить ряд команд, обеспечивающих такую возможность[8].
Использование
В настоящее время Lua используется в различных проектах, где требуется достаточно быстрый и нетрудный в освоении скриптовый язык программирования — например, в разработке игр, где Lua часто используется в качестве прослойки между игровым движком и данными для написания сценариев поведения и взаимодействия объектов. Благодаря компактности применим и в портативных устройствах, в частности, один из графических микрокалькуляторов Texas Instruments, а именно, TI-Nspire CX, использует язык LUA помимо традиционного для такого класса устройств Бейсика.
Пример скрипта на языке Lua
Скрипт реализует мигание светодиодов на базовой плате случайными цветами[9].
-- Упрощение вызова функции распаковки таблиц из модуля table
local unpack = table.unpack
-- Количество светодиодов на базовой плате
local ledNumber = 25
-- Создание порта управления светодиодами
local leds = Ledbar.new(ledNumber)
-- Функция, изменяющая цвет 4-х RGB светодиодов на базовой плате
local function changeColor(col)
for i=0, ledNumber - 1, 1 do
leds:set(i, unpack(col))
end
end
-- Функция, реализующая выключение таймера и изменение цвета светодиодов на красный
local function emergency()
-- Остановка таймера
timerRandomLED:stop()
-- Изменение цвета светодиодов (через секунду - т.к. после остановки таймера timerRandomLED
-- его функция выполнится еще раз)
Timer.callLater(1, function () changeColor({1, 0, 0}) end)
end
-- Функция обработки событий, автоматически вызывается автопилотом
function callback(event)
-- Вызов функции emergency() при низком напряжении на аккумуляторе
if (event == Ev.LOW_VOLTAGE2) then
emergency()
end
end
color = {0, 0, 0}
step = 0.05
index = 1
-- Создание таймера, каждую секунду меняющего цвета каждого из 4-х светодиодов на случайные
timerRandomLED = Timer.new(0.05, function ()
color[index] = color[index] + step
if color[index] > 0.95 or color[index] < 0.05 then
if index < 3 then
index = index + 1
else
index = 1
step = -step
end
end
changeColor(color)
end)
-- Запуск созданного таймера
timerRandomLED:start()
Литература
- Роберто Иерузалимски. Программирование на языке Lua. — 3-е изд.. — ДМК, 2014. — ISBN 9785940747673. (оригинал: 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.
- Mário Kašuba. Lua Game Development Cookbook. — Packt Publishing, 2015. — 402 с. — ISBN 978-1849515504.
- David Young. Learning Game AI Programming with Lua. — Packt Publishing, 2014. — 352 с. — ISBN 978-1783281336.
- Kurt Jung, Aaron Brown. Beginning Lua Programming. — John Wiley & Sons, 2011. — 675 с. — (Programmer to Programmer). — ISBN 9781118079119.
Статьи и обзоры
- Мартин Страйчер. Создание встраиваемых сценариев на языке Lua
- Ash Matheson. Введение в Lua — перевод статьи An Introduction to Lua (англ.)
- Keith Fieldhouse. Введение в Lua — перевод статьи Introducing Lua (англ.)
- Серия статей о Lua // Linux Format
Примечания
- ↑ 1,0 1,1 1,2 About Lua . Lua.org. Дата обращения: 25 июля 2024. Архивировано 26 декабря 2018 года.
- ↑ Lua Authors . Дата обращения: 25 июля 2024.
- ↑ ANN Lua 5.4.7 now available . Дата обращения: 25 июля 2024.
- ↑ Lua Licenses . Дата обращения: 25 июля 2024.
- ↑ 5,0 5,1 Lua 5.3 Справочное руководство . Lua.org, PUC-Rio. Дата обращения: 25 июля 2024.
- ↑ The evolution of an extension language: a history of Lua (англ.). SBLP 2001 invited paper. Дата обращения: 25 июля 2024.
- ↑ Lua 5.1 Reference Manual . Дата обращения: 26 июля 2024. Архивировано 15 ноября 2013 года.
- ↑ 8,0 8,1 Знакомство с LUA и его компилятором: что должен знать программист . Авторские онлайн‑курсы для профессионалов (4 февраля 2022). Дата обращения: 27 июля 2024.
- ↑ Примеры LUA-скриптов . Дата обращения: 25 июля 2024.
Ссылки
Данная статья имеет статус «проверенной». Это говорит о том, что статья была проверена экспертом |