habrahabr

Недопонятый язык Lua

  • вторник, 1 апреля 2025 г. в 00:00:12
https://habr.com/ru/companies/ruvds/articles/895138/

Lua — один из моих любимых языков программирования. Я использовал его для создания CMS на своём старом учебном сайте, для создания крутых IoT-устройств, для разработки мини-игр и экспериментов с децентрализацией сети. Однако экспертом по этому языку я нисколько себя не считаю. Разве что просто разбирающимся в нём пользователем. Я имею в виду, что работал с ним в различных контекстах и на протяжении многих лет, но не вникал глубоко в его реализацию или экосистему.

Так что меня немного расстраивает, когда я читаю о нём статьи и посты, в которых сквозит абсолютным непониманием сути и контекста применения этого языка. Чаще всего такие статьи выглядят как набор неких требований. Из последних могу вспомнить пост на LWN, где автор жаловался на «недокомплект» Lua, и обсуждение этого поста на Hacker News, которое побудило меня написать встречную статью, чтобы ответить на некоторые прозвучавшие в нём комментарии.

▍ Lua нужно рассматривать как набор инструментов


Хишам в своём выступлении на LuaConf в 2017 году сказал, что Lua «минималистичен» (а именно: «В нём есть ноль способов сделать что-либо»).



Естественно, речь шла о том, что Lua предлагает не политики, а механизмы, что он даёт разработчикам возможность адаптировать язык под свою рабочую среду, а не наоборот. Lua нужно рассматривать как базовый ингредиент, к которому вы можете добавить всё, что захотите. Если провести аналогию с приготовлением фруктовых смузи, то Lua — это молоко, в которое вы добавляете любые желаемые фрукты.

Люди, которые требуют «полноценного комплекта», хотят готовый мощный инструмент с кучей возможных опций. Они не смотрят на Lua в разрезе того, что он выполняет свои задачи. Это как смотреть на лодку и жаловаться, что она не может летать. Она и не создавалась для этого — если только вы не дооборудуете её, превратив в гидроплан. Но это уже ваше дело, Lua всё равно.

Этот язык всегда предполагался для скриптовых приложений, и всегда подразумевалось, что вы будете создавать код для своей задачи с помощью чего-то другого и затем уже встраивать движок Lua для повышения гибкости. Разрабатываете игры? Тогда создавайте весь движок на любом подходящем языке, включая тематические элементы, относящиеся только к самой игре, после чего уже добавляйте Lua, чтобы можно было использовать скрипты и корректировать игру без перекомпиляции исходного кода.

То же касается и другого ПО, которое предлагает Lua в качестве языка скриптов для создания плагинов или аддонов. Для этого он и разрабатывался и имеет здесь свои преимущества. Тот факт, что вы можете написать программу полностью на Lua, это лишь побочный эффект его качественной реализации, но не основное назначение.

Люди, которые желают видеть в нём «полный комплект», не осознают, что существует немало дистрибутивов Lua с расширенными возможностями. Другие разработчики выбрали Lua, прикрутили то, что посчитали удачным базовым дополнением, и выпустили готовый пакет. Вы тоже можете создать собственный укомплектованный Lua, в котором будет всё, что вам нужно. Для этого не требуется благословление команды Lua из PUC-Rio (Pontificia Universidade Catolica, Папского католического университета). Так он и задумывался. Вы выбираете язык и докомплектуете его всем необходимым.

Такой подход ведёт к созданию надёжного ПО, поскольку разработчик сам решает, что и как использовать. Здесь вы получаете полный контроль и можете принимать именно те решения, которые оптимально подойдут вашему проекту. Это исключает ситуацию, в которой команда Lua, или команда LuaRocks, может помешать вам делать то, что вы хотите. Тут будет уместно вспомнить драму, развернувшуюся в сообществе языка Elm. Вы можете взять исходный код нужной вам версии и больше никогда не обращаться к сообществу Lua.

Думаю, что по-настоящему вы оцените этот язык, лишь когда встроите его в своё ПО. До того момента всё, что вы создаёте — это комбинация кода на другом языке (например, C), и потенциал Lua будет для вас скрыт. Не только потенциал, но и «Путь Lua». Если вы используете исключительно ресурсы Lua, то он покажется вам просто очередным языком скриптов, не отличающимся от Python или Ruby — и вы начнёте анализировать его в контексте этих других языков, которые с ним не сравнимы, так как ставят перед собой другие задачи.

▍ Жалобы на индексирование массивов с 1


Вот этот комментарий. Я нередко вижу подобные утверждения от людей, которые считают, что единственная правильная реализация — это реализация в стиле C. Было бы здорово, если бы люди чаще задумывались о том, в чём вообще смысл индексирования с 0. В C такой отсчёт используется из-за того, что значение по факту является множителем, который ты можешь использовать для поиска смещения в памяти, где расположены нужные данные. Если у вас есть массив, а значит, и указатель на начальную позицию его данных в памяти, и вы знаете размер элементов этого массива, то можете умножить размер на индекс, прибавить значение указателя и получить данные, соответствующие элементу, находящемуся по этому индексу. Вот в чём смысл. Индексы начинаются с нуля, чтобы было проще находить данные в памяти, когда у вас есть указатель, который, по сути, является единственным, что вам даёт C.

Использование в качестве стартовой позиции в массиве 1 имеет смысл, когда вы рассуждаете как человек. Когда вы с друзьями стоите в очереди, ожидая свои хот-доги, то можете сказать им, что вы первый. Вряд ли вы станете говорить, что вы нулевой. Обычно мы ведём отсчёт с единицы. Кроме того, начало индексирования с 1 помогает при создании итераторов, так как в этом случае вам не нужны приёмчики вроде i-1 или подсчёта с условием i<total. Вы можете без проблем считать от 1 до общего количества, как нормальный человек. Если я правильно помню, таково было соглашение в языке Pascal, который, на мой взгляд, заслуживает огромного уважения.

▍ Жалобы на отсутствие объектной ориентированности


Да, Lua — не объектно-ориентирован. В нём есть таблицы — очень гибкая структура данных. Плюс в Lua есть метатаблицы, дающие ещё бо́льшую гибкость. И эту особенность нужно рассматривать как инструмент (улавливаете суть?). Используя таблицы и метатаблицы, вы можете создавать кучу всяких крутых штук вроде пространств имён и витиеватых систем ООП. Всем управляете вы. Хотите разработать систему вроде NewtonScript с его двойным наследованием прототипов? Запросто. Lua даёт вам механизмы, а не политики. Эти механизмы вы используете для создания всего, что вам нужно. Здесь вы не привязаны к тому, что предлагает автор библиотеки или PUC.

▍ Какой-нибудь язык заменит Lua


Утверждение из того же топика на HackerNews. И здесь я имею в виду не только Janet, о котором писал комментатор, хотя Janet мне нравится. Многие не осознают, что Lua очень подвижный. Его можно скомпилировать, используя стандарт c89 (несмотря на то, что по умолчанию используется c99 IIRC), с минимальными требованиями к оборудованию, на котором он будет работать. И это делает его главным кандидатом как для встраиваемых систем управления, так для ваших приложений. Многим языкам, которые позиционируются как замена для Lua, необходимо больше ресурсов, и они более требовательны к оборудованию и ОС. Хотя Janet всё равно прекрасен (и компилируется по стандарту c89 IIRC).

Lua довольно скромен, и я говорю не о двоичном размере и использовании ресурсов. Я имею в виду сложность исходного кода. Он достаточно мал, чтобы новичок мог понять внутреннее устройство этого языка и удерживать его в уме. В результате он отлично подходит для академических исследований. Язык с понятным внутренним устройством сильно упростит эксперименты. Особенно удачно Lua подходит для использования в исследованиях и практических задачах.

▍ Напоследок


Изначально я назвал этот раздел «Выводы», но мне такое название показалось ошибочным. Это была статья о Lua, поэтому вместо того, чтобы делать выводы, я просто скажу несколько слов напоследок, а выводы оставлю вам.

Я не учёный-компьютерщик. Я учился в PUC-Rio с 1998 по 2001 год и за это время ни разу не повстречал команду Lua, хотя постоянно использовал для работы CGILua. Я бросил разработку и окончил другой университет как кинорежиссёр и сценарист. У меня нет академического опыта, который есть у многих читателей этой статьи, хотя это никогда не мешало мне использовать Lua и получать от этого удовольствие. Я выступал на LuaConf в 2017 году, где презентовал разработанный мной автоматический миксер для коктейлей с подключением к интернету. Я выбрал для этого устройства Lua, потому что счёл его наиболее подходящим. Тогда мне нужен был не язык «с полным комплектом фич и опций» (думаю, у него тут опечатка), а дополнительный инструмент в наборе, который позволит создать то, что мне нужно.

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

Ах да, покажу вам напоследок свой миксер для коктейлей…

Видео с миксером

Telegram-канал со скидками, розыгрышами призов и новостями IT 💻