tgoop.com/cxx95/87
Create:
Last Update:
Last Update:
#opensource
Обзор на Lua
Lua это классический скриптовый язык, широко известный в некоторых кругах. На нем пишутся аддоны к World of Warcraft, Nmap, Nginx, Adobe Lightroom, Neovim, и еще к сотне других проектов. Я решил сделать обзор и собрал всякую редкую информацию.
Этот язык простой как пробка. Основу можно узнать в Learn Lua in 15 minutes.
В языке единственная структура данных это хэш-таблица. Там есть многочисленный синтаксический сахар, то есть эти записи:
foo.bar = 1337... аналогичны этим:
function Lib.sum (x, y) return x + y end
list = {"apple", "orange", "banana"}
foo["bar"] = 1337... то есть "массив" это тоже хэш-таблица с ключами от
Lib["sum"] = function (x, y) return x + y end
list = {[1] = "apple", [2] = "banana", [3] = "orange"}
1
до n
(нумерация массивов в Lua с единицы)Через эти хэш-таблицы имитируется абсолютно всё с использованием разного рода костылей.
Даже можно реализовать, с позволения сказать, ООП.
Объекту
foo
(хэш-таблице) можно придать ссылку __index
на базовый класс (другую хэш-таблицу).Если какого-то поля
foo.bar
(ключа bar
в таблице foo
) нет, то интерпретатор Lua посмотрит в таблицу foo.__index
, а если и там нет, то в foo.__index.__index
, и так далее.В языке есть корутины, closure (как лямбда-функции в C++), рефлексия, и прочие нужные приколы.
В интернете есть многие сотни статей про Lua, даже я написал статью 10 лет назад, но лучше читать книгу от автора Programming in Lua. В книгах обычно самое полное изложение, в то время как статьи в интернете заведомо неполные и обычно пишутся чтобы "показать чето крутое".
В книге есть такая информация, которой больше нигде нет, например:
LUA_32BITS
скомпилирует интерпретатор "Small Lua" с 32-битными числамиИзначально Lua состоял только из интерпретатора и годился для интеракции с проектами на C/C++ (хотя Lua можно использовать и сам по себе как самостоятельный язык).
За долгое время накопилась куча библиотек и проектов. Есть даже несколько новых интерпретаторов/компиляторов, то есть от авторского Lua там только синтаксис языка. Есть полуживой менеджер пакетов LuaRocks (я туда делал пару коммитов).
Конечно, с Python объем всего добра не сравнится, но по сравнению с другими скриптовыми языками Lua выглядит хорошо.
Интересно, что в языке есть навороченный сборщик мусора. Это реализация обычного mark-and-sweep, с крутыми особенностями:
stop-the-world
(когда посреди исполнения программа останавливается и сборщик собирает весь мусор), а сейчас сборщик инкрементальный.Каждый раз, когда нужно аллоцировать память в
N
байт, сборщик мусора заодно делает небольшой объем работы, прямо пропорциональный этому N
.В итоге не происходит никаких "фризов", просто аллокация памяти выглядит чуть замедленной.
В книге есть разные примеры использования этой техники.
Кстати, у Вани в канале есть сборник постов о GC, можно подписаться и почитать
Интерпретатор Lua работает так - читает исходник, транслирует его в "байткод" и интерпретирует этот байткод (как в Java), это быстрее и удобнее.
Поисследовать этот процесс можно, скомпилировав исходники Lua в debug-режиме и запуская его из-под gdb.
Лексер (перевод кусков кода в "токены") и парсер (перевод "токенов" в байткод) работают одновременно, трансляция происходит в один проход, достаточно смотреть на следующий токен (это LL(1)-парсер).
Это самый простой транслятор, и наверное каждый смог бы реализовать перевод Lua в байткод.