Lua

Эта статья прошла проверку экспертом
Материал из «Знание.Вики»
Lua
Lua-Logo.svg
Класс языка язык программирования
Тип исполнения интерпретируемый
Появился в 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 factorial(n)
  if n == 0 then
    return 1
  else
    return n * factorial(n - 1)
  end
end
  • Таблицы — это динамические ассоциативные массивы. Представляют собой составной тип информации, построенный по принципу массива, состоящего из пар «ключ-значение». Таблицы положены в основу всех пользовательских баз данных. Ключом (индексом) может быть любое значение, кроме nil. Создание‍ таблицы происходит с помощью конструкции { }. При создании многомерных массивах чаще всего встречается реализация по типу «массив массивов»[8].
В качестве примера таблицы можно привести таблицу с именами:
local names = {"Анна", "Светлана", "Галина"}
print(names[1]) -- будет выведено первое в строке имя 'Анна'

Кроссплатформенность

Кроссплатформенность языка программирования — способность программного обеспечения работать как на разных аппаратных платформах, так и под разными операционными системами. Lua является кроссплатформенным интерпретируемым языком, способным работать в операционных системах Linux и Windows одновременно.

Кроме того, существует возможность совместной работы языка Lua с другими языками, например, с языком C++ или с языком JavaScript. Для работы с Луа и его дальнейшим внедрением в другой язык программирования необходим компилятор, совместимый с интерфейсом этого языка. Для того, чтобы работать с Луа в Windows, был создан специальный компилятор — SciTE (от англ. Scintilla based Text Editor). Для работы в Linux в силу его специфичности необходимо в окне «Терминал» выполнить ряд команд, обеспечивающих такую возможность[8].

Примечания

  1. 1,0 1,1 1,2 About Lua. Lua.org. Дата обращения: 25 июля 2024. Архивировано 26 декабря 2018 года.
  2. Lua Authors. Дата обращения: 25 июля 2024.
  3. ANN Lua 5.4.7 now available. Дата обращения: 25 июля 2024.
  4. Lua Licenses. Дата обращения: 25 июля 2024.
  5. 5,0 5,1 Lua 5.3 Справочное руководство. Lua.org, PUC-Rio. Дата обращения: 25 июля 2024.
  6. The evolution of an extension language: a history of Lua (англ.). SBLP 2001 invited paper. Дата обращения: 25 июля 2024.
  7. Lua 5.1 Reference Manual. Дата обращения: 26 июля 2024. Архивировано 15 ноября 2013 года.
  8. 8,0 8,1 Знакомство с LUA и его компилятором: что должен знать программист. Авторские онлайн‑курсы для профессионалов (4 февраля 2022). Дата обращения: 27 июля 2024.

Ссылки

WLW Checked Off icon.svg Данная статья имеет статус «готовой». Это не говорит о качестве статьи, однако в ней уже в достаточной степени раскрыта основная тема. Если вы хотите улучшить статью — правьте смело!