LINUX.ORG.RU

Lua 5.4

 


1

5

После двух лет разработки, 29 июня тихо и незаметно вышла новая версия языка программирования Lua — 5.4.

Lua – это простой интерпретируемый язык программирования, который легко встраивается в приложения. Благодаря этим качествам, Lua широко используется как язык расширения или описания конфигурации программ (в частности, компьютерных игр). Распространяется Lua по лицензии MIT.

Предыдущая версия (5.3.5) выходила 10 июля 2018 года.

Основные изменения в новой версии

  • новый сборщик мусора на основе поколений (generational). В функции collectgarbage параметры setpause и setstepmul объявлены устаревшими, вместо них рекомендуется использовать параметр incremental;

  • новая функция для выдачи предупреждений warn с возможностью отключения их отображения;

  • новая реализация math.random использует алгоритм xoshiro256** вместо предоставляемого libc и инициализирует генератор случайным числом;

  • константы (constant variables);

  • «закрываемые» (to-be-closed) переменные — локальные константы, для которых выполняется метод __close при выходе из области видимости;

  • новая функция lua_resetthread — очищает стек и выполняет закрытие всех «закрываемых» переменных;

  • новая функция coroutine.close — закрывает указанную сопрограмму и все её «закрываемые» переменные;

  • пользовательские данные (userdata) могут содержать набор значений с доступом по индексу. Для работы с ними введены новые функции: lua_newuserdatauv, lua_setiuservalue и lua_getiuservalue;

  • доступна отладочная информация о параметрах и возвращаемых значениях функций;

  • если в цикле по счётчику for используется целочисленный индекс и происходит переполнение — цикл завершается;

  • в функцию string.gmatch добавлен необязательный аргумент, задающий смещение от начала строки для поиска совпадений;

  • функции неявного преобразования строк в числа перемещены в строковую библиотеку, изменилось их поведение. Например, результат операции "1" + "2" теперь целое число, а не число с плавающей точкой;

  • в функции выделения памяти допустимо возникновение ошибки при сокращении блока памяти;

  • новый символ форматирования в функции string.format%p (для указателей);

  • библиотека utf8 принимает коды символов вплоть до 2³¹ (при указании специального флага, без него допускаются только коды до 0x10FFFF и не допускаются суррогаты);

  • целочисленные константы, выходящие за пределы диапазона значений, преобразуются в плавающие числа (ранее происходило битовое отсечение);

  • метаметод __lt больше не используется для эмуляция метаметода __le, при необходимости, метаметод __le должен быть задан явно;

  • метка для оператора goto не может быть создана, если в текущей области видимости уже существует метка с таким же именем (даже если она была определена во внешней области);

  • метаметод __gc может быть не только функцией. Если попытка вызвать метод не удаётся, будет выведено предупреждение;

  • функция print не вызывает tostring для каждого аргумента, а использует свои внутренние преобразования;

  • функция io.lines возвращает набор из четырёх значений вместо одного, для эмуляции старого поведения заключайте вызов в скобки, если подставляете его как параметр при вызове другой функции.

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



Проверено: unfo ()

Вот Lua является популярным выбором для расширения приложений, а кто-нибудь знает хорошие ресурсы (статьи, книги) на тему дизайна API для таких расширений? Интересует именно агрегированный опыт поколений, так сказать.

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

ИМХО, скорее примеры готового кода, да книжка иерузалимски и Lua Gems, в первой основные принципы и способы, во второй разные примеры и как авторы решали задачи, но как хороший пример API можно посмотреть на love2d и стандартную библиотеку луа, что идёт в поставке (loslib.c, ltablib.c и другие), код очень приятный, читать самое оно, не считая несколько громоздких вещей в библиотеке строк, но что в целом оправдано той мощью, что в ней сокрыта, а в качестве примера более менее грамотного встраивания с акцентом именно на использование Луа(т.е. компактный Си интерфейс с логикой приложения на Луа) посмотреть lite, если же ищете скорее обсуждения, как продукт поколений, то можете поискть что интересно на lua-users

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

Книгу автора видел, но не читал, а Lua Gems не попадалась. lite, vis и подобное немного не то. Там инвертированный подход, где Lua всем управляет и так писалось с нуля, а меня скорее интересует использование Lua для написания плагинов, когда за Lua роль альтернативного интерфейса к части существующей функциональности. Тут другие подходы могут понадобится. Но на всякое можно посмотреть, спасибо за информацию.

xaizek ★★★★★ ()

с помощью этого языка создан XMPP-сервер Prosody.

по-моему этот язык особенно хорошо подходит для подобного рода задач. какие особенности языка обеспечивают это?

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

И что теперь будет ещё страшнее в дистрах? lua, lua51, lua52, lua53. Или как оно там у этих поциентов.

Про православный luajut не забудь. Его рано ещё списывать со счётов, хоть и новых плюшек в нём нет.

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

какие особенности языка обеспечивают это?

Никакие. Это скрпитуха для игр издревле. И в Redis на Lua можно комплексные атомарные запросы делать. Просто расширение для Си изнутри как бы.

kostyarin_ ()

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

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

И что теперь будет ещё страшнее в дистрах? lua, lua51, lua52, lua53

К гадалке не ходи. Есть такая традиция у бразильских попов: ломать всё по мелочам. Чтобы жизнь мёдом не казалась.

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

например, еще в nginx, vim, mpv

помню, еще в каком-то аудиопроигрывателе можно было писать плагины на lua, то ли в rhythmbox, то ли еще в каком-то похожем по принципу и тоже гтк-шном

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

Они в принципе и не ломают, просто нумеруют так. В x.y.z номере версии у них x.y это мажорная часть, а между мажорными релизами совместимости они не обещают.

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

Побрился вчера.

Яйца побрил?

(модератору, который удалил с пометкой флуд и минусом 7 - хватит лизать свои яйца, котик. Раз уж удаляешь комментарий, то удаляй и изначальное говно этого анонима. Будь мужиком, а не соской :-*)

Gonzo ★★★★★ ()
Последнее исправление: Gonzo (всего исправлений: 2)
Ответ на: комментарий от anonymous

Лук Тьюринг полная, но как практический язык программирования достаточно убога. Ну типа, хочешь сделать continue в цикле - тебе объяснят почему continue в циклах не нужно. Хочешь битовые операции на числах - только с луа 5.3, а до этого тебе объяснили бы почему битовые операции не нужны. Индексация массивов с единицы потому что во-первых зачем тебе модульная арифметика, во-вторых ты же хочешь попердолиться с багами постоянно забывая вычесть единичку. Ну и т.д. Для непривычного человека должно выглядеть достаточно дико.

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

anonymous ()

функции неявного преобразования строк в числа перемещены в строковую библиотеку, изменилось их поведение. Например, результат операции "1" + "2" теперь целое число, а не число с плавающей точкой

Какого х это вообще число, а не строка "12"?

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

функции неявного преобразования строк в числа перемещены в строковую библиотеку, изменилось их поведение. Например, результат операции «1» + «2» теперь целое число, а не число с плавающей точкой

Какого х это вообще число, а не строка «12»?

муа-ха-ха!

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

Зато в плане встраивания в приложения это наверное лучшее, что есть.

Вовсе нет. На него залипли игроделы из-за скорости и нежирности. Но это не значит, что оно удобное для встраивания. Если нет задачи выжимать каждый байт, то трахаться с луёй последнее дело.

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

На него залипли игроделы

скорее наоборот. луа разрабатывалась с прицелом на скриптование квестов от лукас артс по-моему.

из-за скорости и нежирности

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

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

Я полагаю, что это связано с наличием опций обратной совместимости во время компиляции между x.*. Т.е. на 5.2 можно использовать код 5.1 при желании. Хотя я не знаю насколько полно оно совместимо в таком виде.

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

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

Да вот только встраивают его вовсе не в паскаль, и из этих корней лезут веселые баги. Я может слишком категоричен, но хочется развидеть язык, в котором нужно покурить маны, перед тем как записать !=.

anonymous ()

Хороший язык. Писал на нем логику в openresty с luajit несколько лет назад. Интересно, а со временем комюнити языка растет или всё так же его полтора человека пилят?

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

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

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

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

Побрился вчера.

Когда следующая версия этой рыжей расчёски-бороды ?

P.S. lua нравится, примерно как imagemagick, android studio sdk или joomla php. Кодить интересно, но потом сложно с поисками похожей предметной области.

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

зато с другой стороны сразу видно, что это дсл, и к нему надо относиться как к дсл

А вот и не видно. Выглядит это как обдолбанный жаваскрипт. Писать на нем бэкенды мешает только принципиальное отсутствие батареек. Синтаксические выкрутасы макакам никогда не мешают, наоборот, обезьяны падки на все такое необычное. А вот тем, кому нужно программу на C++ скриптовать, все это необычное говно как раз мешает.

anonymous ()

константы (constant variables);

отсутствие констант, всю дорогу, казалось каким-то безумием. Например можно было невозбранно делать math.pi = 4 и веселиться

(вроде, как-то через етатаблицы решалось, но отчего тогда с math.pi не сделали?)

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

по-моему этот язык особенно хорошо подходит для подобного рода задач. какие особенности языка обеспечивают это?

оригинально: выразил мнение и просишь всех объяснить чем мотивированно?

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

хочешь сделать continue в цикле - тебе объяснят почему continue в циклах не нужно

через готу делается: читается легко. Смысл не делать: чтоб сохранить Lua маленьким

Хочешь битовые операции на числах - только с луа 5.3, а до этого тебе объяснили бы почему битовые операции не нужны

Берешь си, пишешь за 5 минут функцию, вызывешь из Lua и недоумеваешь какие у всех с этим проблемы? Смысл не делать: чтоб сохранить Lua маленьким

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

индексируй хоть с нуля, хоть с -1000: никто тебе не запрещает.

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

Я может слишком категоричен, но хочется развидеть язык, в котором нужно покурить маны, перед тем как записать !=.

«Чтобы строить – надо знать! Чтобы знать – надо учиться!» книжка Иерусалимского читается на одном дыхании, пытаться кодить на языке не прочитав книжку по языку и грешить на язык за то, что ты, не зная его, спотыкаешься об мелочи – странно

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

Да просто пишешь на автомате != и потом недоумеваешь, что ему не нравится. Это как с перлом: когда долго его не трогаешь, потом спотыкаешься об == vs eq. Держать в голове для каждого недоязычка свою таблицу базовых операторов это дисциплина для спецолимпиады по мазохизму. Ну и в луа хватает других приколов. Это было бы еще простительно, если бы была такая профессия «луа программист». Зазубрил все грабли, и работаешь, примерно как с жавой. Но для такого узкоспециализированного язычка логично было бы мимикрировать под C++, чего и близко нет. Тот же жаваскрипт намного адекватнее.

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

для каждого недоязычка

видимо, не такой уж он (и перл, кстати, тоже) недоязычок, раз уж тебя с ними работать заставляют? :)

Тот же жаваскрипт намного адекватнее.

ну так пиши на жаваскрипте, кто ж тебе запретит? Приходишь такой к другу в гости, он тебя борщом угощает, ты попробовал и давай втирать: что мол овощной борщь со шкварками – это не правильно, правильно – на говяжей кости. Ну не ешь, тоже мне – горе

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

Единственное что смущает лично меня, так, что то, что как постоянные, так и закрываемые переменные должны через аттрибуты объявлятся в таком виде:

do
  local v <const> = "Hello World"
end
-- close это по сути завершатель, что выполняется после выхода из облсти видимости,
--   как по мне это почти деструктор, с той разницей, что деструктор это всё-таки close + gc,
--   но теперь в ООП появляется по сути нормальный деструктор в котором можно чистить пользовательские объекты
--   из Си-интерфейса
 local v <close> = setmetatable({}, {__close = function() print("Двери закрываются") end})
end

-- ИМХО лучше было сделать:
const v = ...
close v = ...

AKonia ()
Последнее исправление: AKonia (всего исправлений: 2)
Ответ на: комментарий от anonymous

луа - это примерно как склайт: есть свои странности, но если нужна встроенная база данных, то склайт лучший. сама луа тоже какбы не на паскале написана, но разработчики решили, что индексировать надо с единицы. на самом деле индексация - это не самый страшный косяк который там есть, если копнуть глубже, то бархёрт усилится. но если хочешь встроенное скриптование, то луа лучшая.

ну хотя можешь питухон ещё вкрутить, индексация будет с нуля и != там тоже есть, но в техническом плане это будет днище, ещё переписывать скрипты под каждую минорную версию питухона, а потом он ещё еольнется и будешь вместо питухона прикручивать что-то другое, а потом ещё что-то другое по какой-то другой причине. ну какбы такое, кому что нравится.

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

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

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

local v1 <const>, v2 <const> = 1, 2 -- это должно работать

const v1, v2 = 1, 2 -- это не совсем то же самое, нельзя убрать <const> у v2
anonymous ()