Lua 5.5.0

good-penguin.png

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  *
    

    Но при этом важно отметить, что global, будучи применённый к таблице, делает константным только таблицу — в неё нельзя внести новые значения, но это не делает константными значения таблицы:

    global  math, print -- или global  *
    math.pi = 42
    print(math.pi)
    

    Будет выведено 42. Читайте документацию и обсуждение, экспериментируйте.

  • Также для обратной совместимости с прошлыми версиями языка, по причине того, что global может использоваться как имя переменной, сейчас возможно использование этого имени и как имени переменной, и как ключевого слова:

local global = 42
print(global)
global  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-readline and linux-noreadline для Linux

>>> Релиз Lua5.5 релиза в списке рассылки

>>> Онлайн документация

>>> Прямая ссылка на архив исходного кода

>>> Прямая ссылка на архив с тестами

>>> Инструкции по сборке и установке

>>> Полный исходный код в веб-интерфейсе

>>> Подробности

©  Linux.org.ru