Lua — самый простой полноценный язык, о котором почти никто не знает 🦎

Компактный динамический язык, который легко встраивается в проекты на C/C++ и изучается быстрее Python, Ruby и JavaScript. Разбираемся, почему его минимализм не мешает, а помогает писать серьёзный код.

ОсновыРазработка

Python давно считается «языком‑для‑всех», однако Lua двигает планку ещё ниже: 22 ключевых слова, 8 типов данных и одна структура данных. Этого достаточно, чтобы написать игру, настроить веб‑сервер или автоматизировать облачную инфраструктуру.

За счёт столь малого ядра язык читается как псевдокод, а изучить его можно буквально за вечер. В этой статье нырнём глубоко: посмотрим, как устроены таблицы и корутины, где Lua выигрывает у Python, приведём статистику использования и покажем живые примеры.


Минимум синтаксиса — максимум силы ⏱️

-- рекурсивный факториал
function fact(n)
    if n == 1 then return 1 end
    return n * fact(n - 1)
end

print("fact(5) = " .. fact(5)) -- 120

Блоки закрываются end, строки конкатенируются .., комментарии начинаются --. Чётко и без скрытых правил. Нужен цикл? Однолинейный for решает:

for i = 1, 10 do print(i) end

Сухие цифры: Lua vs Python, Ruby, JavaScript 📊

Показатель

Lua 5.4

Python 3.12

Ruby 3.3

Node.js 20

Ключевых слов

22

35

41

44

Hello World, байт в exe (Linux, сжатие UPX)

404 KБ

27 MБ

31 MБ

61 MБ

Время старта «пустого» скрипта, ms

6

22

38

45

Пик памяти «пустого» скрипта, MB

1.9

9.3

10.8

15.4

LOC для факториала (с i/o)

5

7

9

9

GitHub ★ за год (2024→2025)

+7 %

+3 %

−1 %

+4 %

Ядро + stdlib, строк кода C

29 k

500 k

380 k

620 k

Вывод: Lua запускается быстрее, занимает меньше памяти и остаётся компактнее конкурентов, сохраняя при этом все необходимые возможности.


Одна структура данных — таблица 📦

local arr = {1, 4, 9}
local map = {width = 200, height = 100}

print(arr[1])      -- 1 (индексация с 1)
print(map.width)   -- 200

Хотите массив? Используйте числовые индексы. Нужен словарь? Присваивайте по имени. Хотите и то и другое? Не проблема — таблица может одновременно хранить как позиционные, так и именованные элементы.

Плюсы такого подхода:

  1. Простая модель памяти — один аллокатор.

  2. Нет разницы между JSON‑объектом и массивом при обмене данными с JS.

  3. Снижается время обучения: «выучил таблицы — понял все структуры данных Lua».


Продуктивная среда 🔧

  • Множественные присваивания и возвращаемые значения

local a, b = 10, 20
function size() return 800, 600 end
local w, h = size()
  • Итераторы ipairs и pairs

for i, v in ipairs({"a","e","i"}) do print(i, v) end
for k, v in pairs({john=120, ann=80}) do print(k, v) end
  • Корутины — лёгкий способ писать неблокирующий код без async/await:

local co = coroutine.create(function()
  for i = 1,3 do print("tick", i); coroutine.yield() end
end)

coroutine.resume(co) -- tick 1
coroutine.resume(co) -- tick 2
coroutine.resume(co) -- tick 3

Где Lua уже работает 🚀

Проект / Продукт

Что делает Lua

Причина выбора

Roblox

Игровая логика миллионов игр

Песочница + JIT‑скорость

Blizzard WoW

UI и аддоны

«Горячая» перезагрузка без ребилда

Nginx (OpenResty)

Динамический рендер и A/B

Легковесность, встраиваемость

Adobe Lightroom

Расширения и пресеты

Кроссплатформенный скриптинг

Wireshark

Пользовательские dissector’ы

Быстрая интеграция C‑модулей

Это лишь верхушка айсберга: Lua можно встретить и в Redis, и во встроенных системах DJI, и даже в Tesla Autopilot.


Минимальная, но мощная стандартная библиотека 📚

local msg = "Hello Lua"
print(msg:sub(7):lower():reverse()) -- aul
  • Строки, таблицы, корутины, файловая система, os, debug — всё уже вшито, импортировать ничего не нужно.

  • «Лёгкая регексподобная» система паттернов занимает <500 строк C.

  • Гарbage‑collector со списочным трицветным алгоритмом работает автоматически.


Обработка ошибок без головной боли 🚑

function grade(score)
  if score > 100 then error{code=1002,msg=">100"} end
  return score>=50 and "P" or "F"
end

for _, s in ipairs({20,120,60}) do
  local ok, res = pcall(grade, s)
  if ok then print("Grade:", res)
  else print("Error["..res.code.."]:", res.msg) end
end

pcall ловит исключения, а результат (ok, data) упрощает поток обработки.


Модули без специальных ключевых слов 📦➡️📦

-- calc.lua
local M = {}
function M.add(a,b) return a+b end
return M
-- main.lua
local calc = require("calc")
print(calc.add(2,3)) -- 5

Никаких export/import; таблицы и require — вот и вся «сборка».


Экосистема: маленькая, но растущая 🌱

  • LuaRocks: >9 000 пакетов (рост +12 % за 2024).

  • LuaJIT: ускоряет код до C‑скорости, используется в Nginx и Redis.

  • Тренды вакансий: Upwork отмечает +18 % спроса на Lua‑фриланс за 2024.


Почему стоит учить Lua именно сейчас 🎓

  1. Low‑code boom: стартапы ищут встраиваемые DSL — Lua интегрируется двумя файлами C.

  2. Игровая индустрия: Roblox, Defold, Corona SDK держатся на Lua‑скриптах.

  3. IoT‑рынок: ESP‑прошивки с Lua занимают <512 КБ флеша.

  4. OpenAI API? 🤖 Дописывать сценарии A‑B тестов дешевле на Lua, чем поднимать full‑stack.

  5. Через приложение «Кодик: обучение программированию» можно пройти интерактивный курс по Lua за вечер — 🔥 и сразу применять навыки.


Заключение 🎯

Lua сочетает экстремальный минимализм с практичностью: JIT‑компилятор, LuaRocks, корутины и метатаблицы позволяют писать игры, веб‑серверы и скрипты для DevOps. Если нужен язык, который можно объяснить другу за кофе — попробуйте Lua. А если хотите пройти с нуля до первых корутин за пару часов, загляните в «Кодик: обучение программированию».