Lua 5.5.0 Beta

good-penguin.png

30 Июня состоялся предварительный (бета) релиз новой версии языка программирования Lua.

Lua — это встраиваемый, интерпретируемый язык программирования, используемый в огромном числе программных продуктов как язык-компаньон.

  • Новое ключевое слово 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 отныне являются константами, попытка их изменения вызывает ошибку, в Lua5.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))

Lua5.4 и ранее, вернут 3 Lua5.5 вернёт 3 и 4

  • Lua C API Внешние строки (external strings) через lua_pushexternalstring для использования данных в обход автоматического управления памяти, строка должна иметь \0 в конце.

  • Lua C API Новая функция luaL_openselectedlibs в отличии от luaL_openlibs позволяет выборочно загрузить/предзагрузить, нужные части стандартной библиотеки Lua в package.loaded, packege.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% меньше памяти

mem.lua

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

И другие изменения описанные по ссылкам ниже и в документации. Lua 5.5 — это разрабатываемая на данный момент версия языка, публичный бета релиз нацелен на обратную связь, критика и предложения приветствуются в списке рассылки (абсолютно любое обсуждение, предложения и код рассматриваются исключительно там)

>>> Анонс Lua5.5 релиза в списке рассылки

>>> Описание основных изменений

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

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

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

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

©  Linux.org.ru