LINUX.ORG.RU

Lua 5.5.0

 , ,

Lua 5.5.0

0

6

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 <const>, будучи применённый к таблице, делает константной только таблицу – нельзя перезаписать саму таблицу, но можно перезаписать значения её «ключей» и добавлять новые.

    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-readline and linux-noreadline для Linux.

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

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

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

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

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

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

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

★★★★★

Проверено: dataman ()
Последнее исправление: CrX (всего исправлений: 14)
Ответ на: комментарий от rechnick

Часто используется в конфигурационных файлов (например neovim, awesome), почти во всех игровых движках-конструкторах(core, roblox), и часто используется в моддинге игор.

daniyal
()

Lutok is a lightweight C++ API library for Lua.

Lutok provides thin C++ wrappers around the Lua C API to ease the interaction between C++ and Lua. These wrappers make intensive use of RAII to prevent resource leakage, expose C++-friendly data types, report errors by means of exceptions and ensure that the Lua stack is always left untouched in the face of errors. The library also provides a small subset of miscellaneous utility functions built on top of the wrappers.

Lutok focuses on providing a clean and safe C++ interface; the drawback is that it is not suitable for performance-critical environments. In order to implement error-safe C++ wrappers on top of a Lua C binary library, Lutok adds several layers or abstraction and error checking that go against the original spirit of the Lua C API and thus degrade performance.

https://github.com/freebsd/lutok/blob/master/NEWS.md:

Changes in version 0.6.2 Released on 2025/12/27.

Update the minimum C++ standard to C++-20.

dataman ★★★★★
()
Ответ на: комментарий от daniyal

И дело тут не в чём-то глобальном, а в мелких банальных вещах вроде for i=1, 100 do.

Так у них ещё есть вариант for in с итераторами, который выглядит почти так же, но делает совсем другое. Чудесатый дизайн. А вот сишного универсального for нету. Такие сахарные недоязычки лучше обходить стороной. А тут прямо с первого примера видна вся суть: нумерация с 1, глобальные переменные по умолчанию, нет нормальных циклов. На помойку сразу же, и пофиг насколько там эффективная реализация.

bread
()
Последнее исправление: bread (всего исправлений: 1)
Ответ на: комментарий от Somebody

Если скрипт выполняет поставленную функцию этого достаточно:)

REDDERa
()
Ответ на: комментарий от bread

сахарные язычки иногда неплохи, тот же питон бывает удобен, когда лень заморачиваться, а скриптик написать надо, но для чего-то серьёзнее скриптов такая переслащёность языка - погибель

daniyal
()
Ответ на: комментарий от daniyal

Ну питон хотя бы можно оправдать наличием либ на все случаи жизни. И он из коробки везде, к сожалению. Использование луа не оправдано ничем, если твоя специальность не написание скриптов для игрулек. Когда луа притаскивают в качестве языка для плагинов и особенно конфигов, становится совсем грустно. Из-за этого овсом и неовимом невозможно пользоваться. Хотя я когда-то сам писал скрипты для ion3, но решительно осуждаю такое. Кстати, автор ion3 тоже был не в восторге, считая конфигурирование и расширение через луа временным этапом. Ему там пришлось объектную модель с нуля делать, потому что луа совершенно беспомощный из коробки. Получилось неплохо, жаль всё это заброшено.

bread
()
Ответ на: комментарий от qulinxao3

Вы делаете сильное утверждение. То, что «сначала подумать, потом сделать» хорошо работает в науке — очевидно. А вот то, что это не работает в бизнесе, требует серьёзного обоснования.

ugoday ★★★★★
()
Ответ на: комментарий от bread

Уж насколько я ненавижу си, но читаю его вполне сносно, хотя не написал на нем и 5 тысяч строк.

Просто дело привычки и не более. Даже если тебе не нравится. Это не сознательный навык, а рефлекторный. Он нарабатывается тупо повторением.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от bread

Пора переходить на лисп

А вот сейчас особенно жестоко было... :))

Somebody ★★★★
()
Ответ на: комментарий от bread

Пора переходить на лисп, раз так всё легко даётся.

А что сложного в Lisp? С каких пор концепция cons ячеек стала сложной?

Obezyan
()
Ответ на: комментарий от Obezyan

Я не говорю, что концепция сложная. Предлагаю просто написать 30 тысяч строк кода на лиспе и как-то с этим жить потом. Или хотя бы прочитать.

bread
()
Ответ на: комментарий от bread

30к строк на Лиспе в коммерческой разработке не видел, ~12к видел, полет нормальный. Если понимаешь язык то количество строк не важно, имхо.

Obezyan
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.