LINUX.ORG.RU

Lua 5.5.0 Beta

 

Lua 5.5.0 Beta

1

4

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

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

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

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

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

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

★★★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 28)
Ответ на: комментарий от LINUX-ORG-RU

Не стал это в новость добавлять, но тут напишу, добавить global и не позволять инициализировать вместе с декларированием ну типа global x = 42 выглядит максимально странным. Роберту и друзья предполагают что оно будет использовано как декларация к перечеслению типа global * всё или global foo,bar,tar выбранного. Оно понятно, но немножко контр интуитивно. Ну такое, вроде полезно, но привыкнуть надо, особенно при уже наличии _ENV едрить. Я пока не проникся, от слова совсем. Пока по ощущениям мишура, ну table.create да, норм. Остальное так себе. Ну и ладно, оно всё не обязательное, так что не беда.

LINUX-ORG-RU ★★★★★
() автор топика

Вот, нормальные новости про нормальные языки. А то чуть что, раст всякий лезет изо всех щелей.

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

Ну тут «у кого чего болит», utf8 конечно упрощает жизнь, его легко прикрутить на чистой lua или модулем, но это не из коробки.
Для иных переаллоцированные таблицы table.create, это как манна небесная, а на остальное пофигу :) Третьим global как бальзам на душу, теперь из коробки и без luacheck можно получать по рукам за замусоривание глобального пространства, так как можно блокировать создание глобальных имён. Или быстро чекать чужой код. Всё будет отваливаться на этапе парсера/компиляции байткода. Короче, я хоть и фунькал выше, но это всё вещи которые чисто практические и одновременно дешёвые, во главе угла Lua всегда стоит правило «всё имеет свою цену», и польза от фичи должна перевешивать накладные расходы, и не мешать тому коду где эта фича не используется. Короче баланс на тоненьком, именно поэтому есть 100500 клёвых плюшек, но их не добавляют, так как на деле они нахер не нужны их можно реализовать самим языком.

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

Теперь будет 5 версий этого замечательного языка в дистрах, но при этом есть возможность писать полностью совместимый код при желании, а в рамках использования как вспомогательного языка разность версий значения всё также не имеет?

Да!

Хотя объективности ради, несколько версий могут доставлять дискомфорт, объективно это правда.

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

Хм, хотел написать что у меня ни одной, но потом ввёл dpkg -l и обнаружил целых три liblua. Я конечно не фанат его, но твоё негодование не понимаю. Всякие перлы-питоны намного более настырно лезут изо всех щелей. Хоть у них и не 5 версий, зато пакетов связанных куча.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Я тут на весьма забавное наткнулся вчера как раз по поводу луа:

https://storage.yandexcloud.net/fotora.ru/uploads/49355975254db20d.png

https://storage.yandexcloud.net/fotora.ru/uploads/87fc3ddffb809cb2.png

Вот так вот. Вымирающие языки. Остаются только в старых системных скриптах и легаси коде.

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

Очень долго еще будут разные версии, как мне кажется. Потому что есть две версии луа: 5.1 и все остальные.

5.1 до сих пор активно используется и в разработке игр и во встройке, да везде, а вот все остальные как то не встречал, но они типа есть.

LightDiver ★★★★★
()

Шикарно. Прекрасный список изменений.

Lua всё больше становится похож на полноценный ЯП.

global это прям то, что надо в любой крупной программе для защиты от опечаток.

Лет через десять дойдут до проверки типов?

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

Мне показалось наоборот. После предельной простоты в луа питон заставил делать много лишних движений.

LightDiver ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

есть возможность писать полностью совместимый код при желании

Отлично, может писатели начнут уже использовать такую возможность. Но зачем там синтаксис все время ломают то? Буквально три стула переставляют туда-сюда постоянно.

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

5.1 до сих пор активно используется и в разработке игр и во встройке, да везде, а вот все остальные как то не встречал, но они типа есть.

Есть ещё 5.3, и тоже гвоздями к ней прибились те, кто осилил всё переписать с 5.1. Язык же делают академики, у них своя атмосфера. Проблемы индейцев их не волнуют. Интересно, luajit так навечно и останется под 5.1?

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

дойдут до проверки типов?

та проверь сам если сильно хочется print(type(x))

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

Это простота, которая хуже воровства. Все настолько жидкое и динамическое, что непонятно как на нем вообще писать что-то хоть сколько-нибудь объемное.

В общем, я восторгов насчет этого недоязычка не понимаю.

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

Просто указывай явно при использовании. Я первые полгода помучился, вылавливая баги типов, потом просто стал указывать явно и проблемы исчезли.

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

Lua всё больше становится похож на полноценный ЯП.

В Luau даже дженерики есть: https://luau.org/typecheck#generics

type Pair<T> = {first: T, second: T}

local strings: Pair<string> = {first="Hello", second="World"}
local numbers: Pair<number> = {first=1, second=2}

И своя реализация JIT, хотя и не такая быстрая, как в LuaJIT.

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

Все настолько жидкое и динамическое, что непонятно как на нем вообще писать что-то хоть сколько-нибудь объемное.

Просто не надо этого делать. И на js не надо было, и на питоне. Превратили эти простые языки в хз что, только луа и осталась простой. Другое дело, что язык странный мягко говоря, и писать на нем совсем не хочется.

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

Хз, я по сути начал с луа и сначала он мне казался каким то примитивным и очень жирным. Ровно до тех пор пока я не попробовал другие языки. Оказалось, луа прекрасен. Просто, быстро, нежруще. По сравнению вообще с чем угодно.

Идеальный минималистичный инструмент, позволяющий почти что угодно.

ООП доступно, ничего особо лишнего нет, разногласий в языке нет. Бери и пиши что хочешь, главное структуру продумать.

https://github.com/Vladgobelen/NSQC3/blob/main/classes.lua

Я уже тысяч 50 строк на нем наклепал в рамках одного проекта за последние 2 года.

И уж как раз на нем то писать хочется. Нет лишнего синтаксиса, есть все нужное. Просто пиши что думается, а структура с опытом автоматически формируется.

Там где в других языках тебе нужно 10 строк, в луа это 1 строка. Там где другой язык будет отрабатывать 10 секунд, в луа это одна секунда.

Благодаря минимализму так же минимум подводных камней и исключений. Его единственный недостаток - его же и достоинство: минимум всяких сторонних модулей. Хочешь что то сделать - реализуй сам базовыми инструментами.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 3)

И всетаки, за что я люблю раст и что есть лютый косяк в луа:

https://i.yapx.ru/ZvR7C.png

Люто обосрался, случайный баг висел наверное месяца два, пока его нашел случайный пользователь, запустив игру и начав себе накручивать опыт. Раст бы такого никогда не допустил.

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