LINUX.ORG.RU

Новая статья: «Эволюция Lua, продолжение»

 , , ,


5

3

Вышла вторая статья посвящённая эволюции развития языка Lua.

Анонс

Первая часть - 2007

Вторая часть - 2025

Я ещё не читал, кому интересно, почитайте :)

---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
(function(v) local f f = function(v) print(v) return f end return f(v)  end)
----------------------------------------------------------------------------
                                "Lua"
                                "Это"
                               "Весело!"
                              "Полезно!"
                             "Интересно!"
----------------------------------------------------------------------------
                  string.format("%s","hello world!")
---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

Всем бобра. Досвиданья.

Перемещено hobbit из general

★★★★★

Последнее исправление: LINUX-ORG-RU (всего исправлений: 5)

Было бы интересно узнать про интеграцию с .NET типа Python.net .

В идеале компиляцию в .NET в качестве таргета для Lua аналогично IronPython.

Какие есть родные обфускаторы кода для Lua?

Примеры программ на HAXE с Lua таргетом.

Вот это было бы очень интересно и весело.

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

обфускаторы кода для Lua

Зачем? То что в луа должно быть доступно для модификации юзерами и мододелами, иначе тебе надо не брать Lua, а брать что-то другое. Весь смысл lua как раз чтоб из игр выносить контент на откуп мододелам, когда идея игры большая, но у студии тупо нет ни денег ни людей, чтоб всё сделать или даже когда идей не хватает. А так мододелы может сделают из говна конфетку. Продавать один фиг двигло ты будешь. Чем больше юзеров, тем больше продаж.

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

Это выражение (условно, правая часть в x=y), которая объявляет глобальную функцию f, которая возвращает значение (глобальной) переменной f с побочным эффектом print

g = (...)
g(1)(2) -- тут объявляется глобальная f
f(3)(4) -- тут уже можно дергать напрямую f

1
2
3
4
anonymous
()
Ответ на: комментарий от peregrine

Мне игры неинтересны в качестве разработчика, интересны только в качестве девопса.

Обфускаторы для любых ЯП нужны обычно для защиты своей интеллектуальной собственности.

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

Вспоминаю классическое:

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

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

Неa :)
бонба это

function foo(v)
   print(v)
   return foo(v)
end

А тут, если переписать нагляднее, замыкание

function foo(v)
   print(v)
   return function(v)
        return foo(v)
   end
end
foo("Lua")("Это")("Весело!")("Полезно!")("Интересно!")((string.format("%s","hello world!")))

Просто начальная функция была анонимна, и нахлобучена глобальная, ну и опущены скобки

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

Можно и так, да. Но никакого отношения к ООП это не имеет (это одно из чем можно ООП реализовать), это чисто луашный синтаксический сахар, по переносу значения перед : в неявный первый аргумент функции, и то тут ещё исключительная ситуация где тип строка напрямую ассоциирован со своей таблицей, за исключением самих таблиц конечно же.

Хотя ладно, чего я пристал, да, иногда удобнее так.

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

Какие есть родные обфускаторы кода для Lua?

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

Было бы интересно узнать про интеграцию с .NET

Не использую сишапр и платформу .нет, бинды туда/сюда есть 146%, просто поищи, Nlua есть какой-то.

В идеале компиляцию в .NET в качестве таргета для Lua

Не знаю, про такое

Примеры программ на HAXE с Lua таргетом.

https://haxe.org/manual/target-lua-getting-started.html

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

Обфускаторы потеряли смысл с приходом ИИ. Я тут обфусцировал обфусцировал луа, а потом взяли скормил свой обфусцированный код дикпику. Так тот мне через три секунды выдал обратно мой же рабочий код, при этом рассказал о чем я думал в момент написания, чего хотел на самом деле и какие глубинные комплексы при этом испытывла. Так что это уже давно чушь, а не защита. Хрен ты что так защитишь.

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

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

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

Не, я про то что это то чем ООП (часть) можно реализовать, супротив того что это является ООП как его частью. Типа это не что-то самостоятельное, а «скопированное из идей ООП», слишком часто с таким задним смыслом слышу, вот и придрался немножечко.

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

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

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

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

Ты немножечко путаешь, тёплое и мягкое =) А именно, ты почитал про растовую модель памяти и почему то проецируешь её на всё остальное что как-то работает с памятью, но не так как в расте =)

Можешь например использовать это для логгирования, да для чего угодно, вешаешь на __close функцию которая сработает для переменной тогда, когда область её видимости исчезнет и всё, например, для файлов при выходе и перед его закрытием ты можешь сделать seek прочитать его снова и записать ещё один файл, сделав его бекап например и потом уже всё позакрывать. Тем самым ты можешь в теле функции делать основную работу, а boilerplate код, общий для таких файлов вынести в метатаблицу и он будет срабатывать автоматически для помеченных значений.

Единственный минус мне <> не нравятся, понятно что в угоду простоте и скорости сделали, с этой точки зрения подход хороший и красивый, просто к уголовым скобочкам предвзятое мнение, но это мне к психологу надо :D я так понял это теперь общий синтаксис тудет для квалификаторов переменных, в том числе и <const>

Вот так

local close f = io.open("file.txt","w");
local const x = 42;

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

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

Мы все еще про луа? Ты учти, код должен остаться рабочим, но при этом нечитаемым. Я хз как это теперь сделать. Дай пример кода на луа, который будет рабочим, я скормлю ИИ и посмотрим.

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

Слово «нормально» в программировании вообще использовать нужно с оговорками и лучше не надо. Нормальность тут понятие очень относительное.

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

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

поддержка утф-8?

Библиотека utf8 включена в базу с 5.3

utf8
utf8.char
utf8.charpattern
utf8.codepoint
utf8.codes
utf8.len
utf8.offset

И регулярки нормально работают?

В lua нет регулярок, там шаблоны, можно даже назвать трафареты :), строка шаблона utf8.charpattern задаёт поиск символов.

for v in ("Привет"):gmatch(utf8.charpattern) do 
   print(v) 
end

("Привет"):gsub(utf8.charpattern,function(v) print(v) end)

В остальном Lua глубоко плевать что там в строке лежит, это просто последовательность байт

print(("П1р2и3в4е5т6=мир"):match("(%S+)%d(%S+)%d(%S+)%d(%S+)%d(%S+)%d(%S+)%d=(%S+)"))
LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)
Ответ на: комментарий от LightDiver

У первого оратора речь шла не о

Тебе нужно сделать так, чтобы пользователь не получал преимущество.

а об интеллектуальной собственности.

Касательно игор:

  • для мультиплеера это всё надо на сервак переносить, иначе читеры всё равно поломают,
  • для сингла вообще пофиг, что игроки там меняют.
apt_install_lrzsz ★★★
()
Ответ на: комментарий от sanyo1234

Какие есть родные обфускаторы кода для Lua?

Мне в свое время результаты Axon понравились, но он то ли проприетарный, то ли платный, да и вообще автор удалил репозиторий почему-то.

Другие скорее минификаторы, чем обфускаторы. Как минификатор SrcOnDiet неплох. Prometheus не пробовал.

Если не выпилили исполнение кода, то можно исполнять сразу байт-код или даже зашифровать.

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

Кстати, новость про Питон видали?

https://habr.com/ru/companies/ru_mts/articles/905098/

Не то, чтобы я был его большим фанатом, но полезных либ на нём понаписано немало и для DevOps, и для ML и для BigData.

Так вот у Питона и почти всех его либ есть шикарнейшая интеграция с другими .NET сборками:

https://github.com/pythonnet/pythonnet

И даже есть компилятор в .NET: IronPython.

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

Обфускаторы для любых ЯП нужны обычно для защиты своей интеллектуальной собственности.

Что-то путаешь. IP защищает гражданское право. Обфускация прячет исключительно говнокод и иногда трояны. К счастью, для борьбы с этой нездоровой практикой есть деобфускаторы и нейросети.

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

Что-то путаешь.

Скорее ты путаешь.

IP защищает гражданское право.

Невсегда такое право справляется со своей функцией.

Обфускация прячет исключительно говнокод и иногда трояны.

Ога, тысячи производителей проприетарного софта только и производят, что трояны и говнокод.

К счастью, для борьбы с этой нездоровой практикой есть деобфускаторы и нейросети.

К счастью есть обфускаторы и другие защиты, которые успешно препятствуют реверсингу проприетарного кода.

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

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

Ну да, всё так. Преимущественно говнокод и нарушения лицензий, конечно. Трояны это скорее редкость.

К счастью есть обфускаторы и другие защиты, которые успешно препятствуют реверсингу проприетарного кода.

Ха-ха, ага.

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

Вот вроде ничего такого на написал, но это тут настолько не к месту,

Для сравнения и объяснения, чего мне не хватает в Lua, чтобы к нему появился интерес.

что я даже не знаю, что на это отвечать.

Может быть, знаешь транспайлер из Lua в .NET?

Кстати больше всего в мире Луа, меня заинтересовал Нелуа :)

https://nelua.io/

sanyo1234
()