Язык Lua: что это, где используется и как написать первый скрипт

Lua встраивают в другие программы: на нём пишут скрипты в Roblox, конфиги Neovim, расширения Redis и nginx.

Показываем, как поставить Lua 5.5, разбираем синтаксис на запущенных примерах кода и шесть типичных ошибок новичков.

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 3156 статей автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3810 экспертных мнений Подписаться на Телеграм-канал
Обложка: Язык Lua: что это, где используется и как написать первый скрипт

Lua — маленький скриптовый язык программирования, который встраивают внутрь других программ. На нём пишут скрипты в Roblox, настраивают редактор Neovim, расширяют Redis и nginx, делают игры на движках Defold и LÖVE. Язык создали в 1993 году в Католическом университете Рио-де-Жанейро, название по-португальски значит «луна».

Актуальная версия Lua 5.5.1 вышла 3 августа 2026 года (история версий на официальном сайте; из России он иногда открывается только со второй попытки). Ниже разберём, чем Lua отличается от Python, где он нужен на практике, как его поставить и как выглядит код. Если вы только выбираете первый язык, сначала загляните в нашу статью о том, как учить языки программирования самостоятельно.

CheckroiCheckroiПодборка курсов по Lua12 курсов • 9 школСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Что за язык Lua и чем он отличается от Python

Рой пишет первый скрипт на Lua

Авторы называют Lua «встраиваемым скриптовым языком» (страница About официального сайта). Lua написан на C как библиотека, и своей «главной программы» у него нет: код на Lua работает внутри программы-хозяина, которая его вызывает и даёт ему свои функции (справочное руководство Lua 5.5). Стандартная библиотека у Lua небольшая: строки, таблицы, математика, файлы. Зато сам язык легко подключить к игре, базе данных или веб-серверу.

Архив с исходниками Lua 5.5.1 вместе с документацией весит около 390 КБ в сжатом виде. Поэтому Lua так охотно вшивают в игры и устройства.

Что сравниваем Lua Python
Как используют чаще всего Внутри другой программы: игры, редактора, сервера Самостоятельно: скрипты, бэкенд, анализ данных
Структуры данных Только таблица: она и массив, и словарь, и объект Списки, словари, множества, кортежи
Нумерация элементов С 1 С 0
Блоки кода then … end, do … end Отступы
Не равно ~= !=
Склейка строк .. +
Типизация Динамическая Динамическая

Синтаксис у Lua проще, чем у Python: ключевых слов меньше, а единственная структура данных снимает вопрос «список или словарь». Если хочется сначала разобраться в самих понятиях переменной, цикла и функции, у нас есть восемь основ программирования с примерами кода.

Где используется Lua

Lua редко пишут «с нуля в пустом файле». Почти всегда язык работает внутри какой-то среды, и от неё зависит, какая версия Lua вам достанется.

Где Что делают на Lua Какой Lua внутри
Roblox Studio Логику игр: движение, очки, магазины, события Luau, диалект на основе Lua 5.1 (документация Roblox)
Defold Игровую логику 2D- и 3D-игр LuaJIT, совместимый с Lua 5.1 (руководство Defold)
LÖVE 2D-игры целиком Фреймворк на Lua (love2d.org)
Neovim Конфиг редактора init.lua и плагины Lua как основной язык настройки (Lua-guide Neovim)
Redis Скрипты, которые выполняются прямо на сервере базы Встроенный Lua 5.1 (Redis Lua API)
OpenResty (nginx) Логику веб-сервера: маршрутизацию, проверки, кеш LuaJIT (openresty.org)
Tarantool Серверные приложения рядом с данными LuaJIT (документация Tarantool)
Adobe Lightroom Часть логики самой программы Lua (официальный сайт Lua)

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

Многие знакомятся с Lua через Roblox. Как собрать там первую игру, мы разобрали в инструкции «Как создать игру в Роблоксе», а про профессию в целом есть обзор «Кто такой разработчик игр».

Канал основателя Checkroi Вани Буявца3 800 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

Как установить Lua и запустить первый скрипт

Ноутбук с терминалом и стикеры с командами установки

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

  1. macOS: brew install lua. В Homebrew сейчас лежит версия 5.5.1.
  2. Ubuntu и Debian: sudo apt install lua5.4. В репозитории Ubuntu 24.04 пакета 5.5 пока нет, для учёбы 5.4 хватает с запасом.
  3. Windows: скачайте архив с проекта LuaBinaries (последняя сборка там 5.5.0), распакуйте и добавьте папку в переменную PATH.
  4. Без установки: на странице demo официального сайта собраны онлайн-компиляторы, где код можно запустить прямо в браузере.

Проверить, что всё работает, проще всего файлом из двух строк. Создайте hello.lua:

print("Привет, Lua!")
print(_VERSION)

И запустите его в терминале командой lua hello.lua:

Привет, Lua!
Lua 5.5

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

Синтаксис Lua на примерах

Все примеры ниже мы запускали в Lua 5.5.1, вывод скопирован из терминала. В Roblox и Defold они тоже сработают, если не трогать функции, которых там нет (io.write, math.type).

Переменные и типы данных

Тип переменной Lua определяет сам по значению. Слово local делает переменную локальной, без него она станет глобальной (почему это плохо, расскажем в разделе с ошибками).

local name = "Аня"
local age = 27
local price = 1490.5
local isStudent = true
local nothing = nil

print(type(name), type(age), type(price), type(isStudent), type(nothing))
print(math.type(age), math.type(price))
print(name .. ", " .. age .. " лет")
string	number	number	boolean	nil
integer	float
Аня, 27 лет

Основных типов восемь: nil, boolean, number, string, function, table, userdata и thread (справочное руководство Lua 5.5). Числа делятся на целые и дробные с версии 5.3, это видно по второй строке вывода.

Условия

local score = 72

if score >= 85 then
  print("Отлично")
elseif score >= 60 then
  print("Зачёт")
else
  print("Пересдача")
end

print(score ~= 100)
Зачёт
true

Блок закрывается словом end, а elseif пишется слитно. «Не равно» в Lua выглядит как ~=.

Циклы

Циклов три вида: числовой for, while и repeat … until, который выполняется хотя бы один раз.

for i = 1, 3 do
  print("Шаг " .. i)
end

for i = 10, 1, -4 do
  io.write(i, " ")
end
print()

local n = 1
while n < 100 do
  n = n * 3
end
print(n)

local tries = 0
repeat
  tries = tries + 1
until tries == 3
print("Попыток: " .. tries)
Шаг 1
Шаг 2
Шаг 3
10 6 2
243
Попыток: 3

Третье число в for i = 10, 1, -4 задаёт шаг. Без него Lua считает шаг равным единице.

Досрочно выйти из любого цикла можно командой break, она работает так же, как в Python. Подробно про break и пропуск шага мы писали в статье про break в Python. Оператора continue в Lua нет, вместо него ставят goto continue с меткой ::continue:: в конце тела цикла.

Функции

Функция в Lua может вернуть сразу несколько значений. В Python для этого возвращают кортеж, здесь значения просто перечисляют через запятую.

local function minmax(list)
  local min, max = list[1], list[1]
  for _, v in ipairs(list) do
    if v < min then min = v end
    if v > max then max = v end
  end
  return min, max
end

local lo, hi = minmax({ 42, 7, 19, 88, 3 })
print(lo, hi)
3	88

Таблицы

Таблица в Lua единственная составная структура. Одна и та же конструкция работает как массив, как словарь и как объект с полями.

local langs = { "Lua", "Python", "Go" }
print(langs[1], langs[0], #langs)

table.insert(langs, "Rust")
for i, lang in ipairs(langs) do
  print(i, lang)
end

local user = { name = "Ира", city = "Казань" }
user.age = 31
print(user.name, user["city"], user.age)
Lua	nil	3
1	Lua
2	Python
3	Go
4	Rust
Ира	Казань	31

Первый элемент лежит под индексом 1, а langs[0] возвращает nil без всякой ошибки. Оператор # даёт длину массива, ipairs перебирает элементы по порядку, pairs обходит все ключи словаря. Классы и наследование в Lua собирают из тех же таблиц и метатаблиц, сама идея та же, что в нашем разборе ООП простыми словами.

Мини-проект: считаем слова в тексте

Соберём всё вместе. Скрипт ниже считает, какие слова чаще всего встречаются в тексте, и печатает тройку лидеров.

local text = [[
Lua маленький язык. Lua быстрый язык.
Lua встраивают в игры и серверы.
]]

local counts = {}
for word in text:gmatch("[^%s%p]+") do
  counts[word] = (counts[word] or 0) + 1
end

local list = {}
for word, n in pairs(counts) do
  list[#list + 1] = { word = word, n = n }
end
table.sort(list, function(a, b)
  if a.n ~= b.n then return a.n > b.n end
  return a.word < b.word
end)

for i = 1, 3 do
  print(list[i].word, list[i].n)
end
Lua	3
язык	2
быстрый	1

Здесь работают сразу три приёма: многострочная строка в [[ … ]], шаблон [^%s%p]+ (всё, что не пробел и не знак препинания) и сортировка таблицы своей функцией сравнения. Словарь напрямую не отсортировать: table.sort работает только с массивом, а порядок ключей при обходе через pairs не задан. Поэтому пары сначала складываем во временный список.

Частые ошибки новичков в Lua

Рой уверенно отмечает пункты чек-листа

Мы прогнали каждую ошибку в Lua 5.5.1, сообщения ниже взяты из терминала. По ним удобно искать, если вы увидели такое же у себя.

Что пишут Что получается Как правильно
total = salary + 5000 внутри функции Переменная total молча становится глобальной и видна во всей программе Писать local total = …
if x != 4 then 'then' expected near '!' if x ~= 4 then
"Итого: " + 5 attempt to add a 'string' with a 'number' "Итого: " .. 5
list[0] для первого элемента nil без ошибки, баг всплывает позже Нумерация с list[1]
user.adress.city с опечаткой в поле attempt to index a nil value (field 'adress') Проверить имя поля или написать user.adress and user.adress.city
i = 4 внутри for i = 1, 5 attempt to assign to const variable 'i' (с версии 5.5) Завести отдельную переменную или перейти на while

Первая ошибка самая коварная, потому что программа не падает. С версии 5.5 от неё можно защититься объявлением global: если в начале файла явно перечислить разрешённые глобальные имена, Lua откажется запускать код с необъявленной переменной.

global print

local function addBonus(salary)
  total = salary + 5000
  return total
end
lua: g55.lua:4: variable 'total' not declared

Ещё две ловушки связаны с кириллицей. Строки в Lua хранятся байтами, поэтому #"Луна" возвращает 8, а не 4, и правильную длину даёт utf8.len("Луна"). Функция string.lower переводит в нижний регистр только латиницу: ("Lua И Python"):lower() вернёт lua И python.

Решение: для русского текста считайте длину через utf8.len и не полагайтесь на lower и классы вроде %a в шаблонах: в стандартной настройке они видят только латинские буквы.

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 800 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

Стоит ли учить Lua и с чего начать

Lua хорош как первый язык для тех, кто хочет делать игры, особенно в Roblox: результат виден сразу, синтаксис прощает многое. Единственным языком для карьеры мы бы Lua не делали: по таблице выше видно, что он почти всегда работает в паре с другим стеком (игровым движком, nginx, Redis), и работодатель ищет этот стек целиком.

Мы бы советовали такой маршрут:

  • Хотите делать игры в Roblox. Учите Luau по официальной документации Roblox и сразу делайте маленькие механики в Studio.
  • Хотите свои 2D-игры. Берите Defold или LÖVE, у Defold есть руководство по Lua на русском.
  • Хотите разобраться в языке глубоко. Читайте книгу главного архитектора языка Роберто Иерусалимски Programming in Lua: первое издание лежит на официальном сайте бесплатно и, по словам сайта, во многом актуально для поздних версий.
  • Хотите работать в геймдеве. Lua пригодится, но основой станут C# или C++. Тут поможет наш план «Как попасть в геймдев без опыта».

Если язык понравится и захочется понять, как он устроен изнутри, следующим шагом станет C, на котором Lua написан. Чем такой разработчик отличается от программиста C++, мы рассказали в статье «Кто такой разработчик на Си».

Где освоить Lua системно

Базовый синтаксис Lua можно выучить за пару вечеров по примерам выше. Писать игры и скрипты так, чтобы они не разваливались на сотом объекте, проще с наставником, который проверяет код. Программы разных школ собраны на странице курсов по Lua, а ниже пять из них с ценами и отзывами. Если цель именно Roblox, загляните в подборку курсов по Roblox Studio.

КурсШколаСтоимость со скидкойВ рассрочкуДлитель­ностьОбзор курса от Checkroi
ДО Разработчик игр на Lua
Перейти на сайт курса
Skillbox KidsSkillbox Kids74 400 ₽ - 8 месяцевОбзор курса
Программирование на Lua в Minecraft
Перейти на сайт курса
CoddyCoddy9200 ₽ - 3 месяцаОбзор курса
Создание игр в Roblox. Программирование LuaPixel — школа программирования для детей и подростковPixel28 800 ₽ - 9 месяцевОбзор курса
Базы данных для разработчиков
Перейти на сайт курса
SkillboxSkillbox24 908 ₽4151 ₽/мес.4 месяцаОбзор курса
Программирование и дизайн в Roblox
Перейти на сайт курса
SkillboxSkillbox69 086 ₽ - 1 месяцОбзор курса

Больше программ — в полном каталоге курсов по Lua

Часто задаваемые вопросы

Lua — это язык программирования или язык скриптов?

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

Чем Luau в Roblox отличается от обычного Lua?

Luau вырос из Lua 5.1 и добавил постепенную типизацию, свои функции и ограничения безопасности. Базовый синтаксис общий: переменные, условия, циклы и таблицы пишутся одинаково, а функции движка Roblox есть только в Studio.

Почему в Lua массивы начинаются с 1?

Так устроен сам язык: ipairs, table.insert и оператор длины # считают элементы с единицы, поэтому первый элемент массива лежит в t[1]. Обращение к индексу 0 не вызывает ошибку, а просто возвращает nil.

Какую версию Lua учить в 2026 году?

Для учёбы подойдёт актуальная Lua 5.5 или 5.4, разница в основах небольшая. Если вы идёте в Roblox, Defold или Redis, ориентируйтесь на Lua 5.1: на ней основаны эти среды, и некоторых новых возможностей там нет.

Сложно ли выучить Lua после Python?

Обычно хватает пары вечеров на синтаксис. Непривычными покажутся нумерация с единицы, ~= вместо !=, склейка строк через .. и то, что переменные без local становятся глобальными.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!