15 декабря, спустя примерно шесть месяцев после публикации предварительной бета версии, утверждён, сформирован и опубликован стабильный выпуск 5.5.0 языка программирования Lua.
Финальное уведомление сообщества о событии произошло вчера, 22 декабря, в списке рассылки.
Lua – это встраиваемый, интерпретируемый язык программирования, используемый в огромном числе программных продуктов как язык-компаньон.
Благодарим всех, кто принял участие в тестировании и обсуждениях.
И просто всех тех, кто просто пользуется языком Lua для решения своих, как повседневных, так и производственных, промышленных, задач. Спасибо!
Основные изменения по отношению к предыдущей версии языка 5.4.8:
-
Новое ключевое слово
globalслужит для управления глобальной областью видимости. Сразу стоит уточнить, это не просто противоположность ключевому словуlocal. По умолчанию в каждом исполняемом чанке, происходит неявное объявлениеglobal *, при этом ничего не происходит – код работает точно так же, как и прежде. Объявлениеglobalсо звёздочкой*указывает на то, что все глобальные переменные просто доступны глобально. При желании можно записать это явно, например:global * print(math.pi)Таким образом сохраняется старое поведение.
Если же через
globalобъявить переменную, то вся глобальная область видимости удаляется и в глобальной области видимости будет только эта и все последующие явно декларированные переменные как глобальные, попытка обратится к неявно декларированной глобальной переменной или неявно создать её приведёт к ошибке.global x -- очистить глобальную область видимости и внести в неё "x" x = 42 -- допустимо, "х" в глобальной области видимости чанка y = 42 -- ошибка переменная "y" не определена print(x+y) -- ошибка функция "print" не определенаЕсли вы используете ключевое слово
globalне с*то после его использования требуется явно декларировать все используемые вами глобальные переменные:global x, y, print x = 42 y = 42 print(x+y)или
global x global y global print print(x+y)Тем самым вы можете изолировать модуль, тело функции, тело условия или тело цикла от глобальной области видимости и задать её там явно. Вы можете в любой момент времени указать в коде
global *, чтобы вернуть видимость всех глобальных переменных назад, для всего последующего за этим объявлением кода. Можно сделать константными все глобальные переменные:global <const> *При этом важно отметить, что
global, будучи применённый к таблице, делает константной только таблицу – в неё нельзя внести новые значения, но это не делает константными значения таблицы:global <const> math, print -- или global <const> * math.pi = 42 print(math.pi)Будет выведено
42. Читайте документацию и обсуждение, экспериментируйте. -
Для обратной совместимости с прошлыми версиями языка, по причине того, что
globalможет использоваться как имя переменной, сейчас возможно использование этого имени и как имени переменной, и как ключевого слова:local global = 42 print(global) global <const> x x = 42 -- сработает ошибкаЭто поведение обратной совместимости можно отключить на этапе сборки, отключив
LUA_COMPAT_GLOBAL.
Другие изменения:
- Счётчики в циклах
forотныне являются константами, попытка их изменения вызывает ошибку, в Lua 5.4 и ниже, изменение значение счётчика в цикле сбрасывалось на следующее значение счётчика, так как счётчики циклов не изменяемые:
for i=1,100 do
i = 10 -- ошибка для Lua 5.5
print(i)
end
Если вам нужна переменная с именем счётчика, и совместимость с предыдущими версиями языка, то объявите её как local:
for i=1,100 do
local i = 10
print(i)
end
floatзначения печатаются с таким количеством знаков, чтобы быть правильно сконвертированными обратно.- Новая функция
table.createсоздаёт новую таблицу с предварительно выделенной памятью, это полезно с точки зрения производительности, когда вы сразу знаете сколько элементов будет в таблице. utf8.offsetтеперь дополнительно возвращает финальную позицию символа.
print(utf8.offset("привет",2))
Lua 5.4 и ранее, вернут 3, Lua 5.5 вернёт 3 и 4.
- Lua C API. Внешние строки (external strings) через
lua_pushexternalstringдля использования данных в обход автоматического управления памяти, строка должна завершаться\0. - Lua C API. Новая функция
luaL_openselectedlibsв отличии отluaL_openlibsпозволяет выборочно загрузить/предзагрузить, нужные части стандартной библиотеки Lua вpackage.loaded,package.preloadиз списка:
LUA_GLIBK : the basic library.
LUA_LOADLIBK : the package library.
LUA_COLIBK : the coroutine library.
LUA_STRLIBK : the string library.
LUA_UTF8LIBK : the UTF-8 library.
LUA_TABLIBK : the table library.
LUA_MATHLIBK : the mathematical library.
LUA_IOLIBK : the I/O library.
LUA_OSLIBK : the operating system library.
LUA_DBLIBK : the debug library.
- Оптимизация памяти, большие
Luaмассивы теперь потребляют до 60% меньше памяти:
collectgarbage("stop")
local array = { }
for i=1,10000000 do
array[i]=i
end
print(collectgarbage("count") * 1024)
Вывод показателей памяти в байтах (потребление памяти, в этом тесте, упало более чем на 40%):
dron@gnu:~/$ lua5.4 mem.lua
268457462.0
dron@gnu:~/$ lua5.5 mem.lua
151015205.0
- Возможность возврата сложных конструкций вида:
return {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,{1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,}}}}}}}
Это не работало в 5.4 и выдавало ошибку «function or expression too complex» или «function or expression needs too many registers».
- Удалена опция сборки
LUA_COMPAT_5_3(совместимость с5.3); lua.cзагружает функциюreadlineдинамически;- удалена опция
LUA_USE_READLINEи цели сборкиlinux-readlineandlinux-noreadlineдляLinux.
>>> Релиз Lua5.5 релиза в списке рассылки
>>> Прямая ссылка на архив исходного кода
>>> Прямая ссылка на архив с тестами
>>> Подробности










