Lua 5.5 экономит 60% памяти и вводит обязательные глобальные переменные.

Спустя пять лет разработки команда из Папского католического университета Рио-де-Жанейро представила Lua 5.5 — новую версию популярного встраиваемого языка сценариев. Код интерпретатора написан на языке Си и распространяется под лицензией MIT.
Главное нововведение касается работы с глобальными переменными. Слово global теперь стало зарезервированным ключевым словом, а программистам предстоит явно объявлять глобальные переменные. Раньше любое присваивание неизвестному имени автоматически создавало глобальную переменную, что приводило к трудноуловимым ошибкам из-за опечаток. Теперь можно выбирать режим работы: использовать global * для совместимости со старым поведением, global<const> * чтобы сделать все необъявленные переменные доступными только для чтения, или явно объявлять каждую глобальную переменную через global X. Это изменение делает код безопаснее и понятнее.
Ещё одно важное изменение затрагивает циклы for: управляющие переменные теперь доступны только для чтения. Попытка изменить счётчик внутри цикла приведёт к ошибке, что делает поведение кода более предсказуемым.
Серьёзная работа проделана над оптимизацией памяти. Большие массивы с однотипными данными теперь занимают примерно на 60% меньше места. Экономия достигается благодаря тому, что информация о типе сохраняется не для каждого элемента отдельно, а для группы элементов. Сборщик мусора тоже стал умнее: в генерационном режиме полный цикл сборки теперь выполняется инкрементально, разбиваясь на отдельные шаги, чередующиеся с выполнением программы. Это позволяет избавиться от длительных пауз в приложениях с большим числом объектов в памяти.
Оптимизирована работа с памятью и в других местах. При загрузке предварительно скомпилированного байткода Lua теперь может переиспользовать исходную память для некоторых внутренних структур. Обеспечено повторное использование строк в операциях сериализации и десериализации байткода, а вспомогательные буферы теперь переиспользуются без лишнего копирования при создании финальной строки.
Среди других улучшений — новая функция table.create для создания таблиц с заранее выделенной памятью, увеличенное число уровней вложенности конструкторов таблиц, а также расширенная функция utf8.offset, которая теперь возвращает не только начальную, но и конечную позицию символа. Числа с плавающей точкой выводятся с достаточным количеством знаков для точного восстановления при обратном преобразовании из строки.
Для разработчиков, встраивающих Lua в свои приложения, появилась поддержка внешних строк через новую функцию C API. Она позволяет работать со строками, размещёнными в памяти вне управления сборщиком мусора Lua. Также добавлены функции luaL_openselectedlibs для выборочной загрузки стандартных библиотек и luaL_makeseed для генерации начального значения хеширования. Интерпретатор теперь динамически загружает библиотеку readline при её наличии в системе.
При переходе с Lua 5.4 разработчикам следует учитывать несовместимости: помимо нового ключевого слова global и запрета на изменение переменных цикла, изменились параметры настройки сборщика мусора, а бинарные чанки от предыдущих версий несовместимы с новой.