🐅🤦‍♂️
Вот к примеру еще один
terra это исследовательский проект языка для написания компиляторов. Специфический 👅 язык с метапрогаммированием, для генерации большого количества кода.
🐅🤦‍♂️
очень неудачный синтаксис констант
Мне нравится как Хишам Муххамад развивает Луа. В частности он очень аккуратен в Teal чайпчекере что-бы не ломать существующую устоявшуюся логику языка.
🐅🤦‍♂️
LuaJIT.
У luajit есть ограничения. А один из основных недостатков на мой взгляд - очень мутный и плохо поддерживаемый исходный код. При всей мощи и красоте что-то исправить в нем проблематично.
🐅🤦‍♂️
ну лично у меня всегда была надежда что луаджит подтянется до 5.4, но до пенсии боюсь не будет
Это все из-за того, что luajit написан в сложноподдерживаемой манере. Никто не хочет заниматься ни то, что 5.4, а 5.2 боль сделать.
🐅🤦‍♂️
для ленивых: означает жёсткий запрет страницам памяти быть одновременно записываемыми из запущенного процесса и исполняемыми
Знаешь, я на этот запрет клал с прибором. Очень бесит, это чисто политическое решение. На винде и линуксе можно спокойно выделить память, пометить как исполняемую и писать свой just-in-time
🐅🤦‍♂️
Смотрю его твиттер. Категорически согласен про инструментарий.
Чел известен давнь в кругах геймдева. Писал под разные платформы в том числе и PlayStation
Tony
Прикол
🐅🤦‍♂️
Поэтому я и говорю: переписать его на плюсы. Для начала. А потом от трассировки отказаться.
Трассировка сильная сторона на мой взгляд. Не стоит от нее отказываться.
Timur
Трассировка сильная сторона на мой взгляд. Не стоит от нее отказываться.
так-то, в индустрии трассирующие jit-ы проиграли https://news.ycombinator.com/item?id=16204373
🐅🤦‍♂️
Поэтому я и говорю: переписать его на плюсы. Для начала. А потом от трассировки отказаться.
Так как сложно написать виртуальную машину быстрее чем есть если не генерировать машинный код и передавать на него управление.
Snusmumriken
Ну типа да. Зачем переписывать на плюсы если уже написано на сишке? Какой профит дадут плюсы? Потому что видно только ухудшения.
Snusmumriken
> Сишка многократно лучше портируется и стабильно функционирует. Потеряешь несколько десятков платформ и разрастёшь бинарь раз в тридцать. А ещё он начнёт требовать visual c++ пяти разных версий или аналогов. Да, да, бинарь можно обрезать. Но смысл? Ещё потеряются сишные интерфейсы, которые используют ВСЕ: шарпы, сами плюсы, всякие расты и прочие голанги, при подключении внешних либ.
Timur
Ну типа да. Зачем переписывать на плюсы если уже написано на сишке? Какой профит дадут плюсы? Потому что видно только ухудшения.
(даже переписывание Сишного кода Майка на Си обычного человека даст выигрыш. Извинити)
Timur
выигрыш с точки зрения читабельности и поддерживаемости
Snusmumriken
Если реализовать трассировку, она будет невозможна на сишке. Майк шаманил с динасмом, динасм нереализуем на сишке и плюсах насколько я знаю.
🐅🤦‍♂️
(даже переписывание Сишного кода Майка на Си обычного человека даст выигрыш. Извинити)
Денис Солдатов рассказывал, что они вспомогательный код написанный на Луа Майком переписали на C. Избавились от кучи магических констант.
🐅🤦‍♂️
Snusmumriken
Зачем тут нужно ООП? Просто зачем?
Snusmumriken
Почему бы не запилить ECS или аналог? DOD? Потому что ООП понятнее всего для типовых разработчиков? )
R
(даже переписывание Сишного кода Майка на Си обычного человека даст выигрыш. Извинити)
Примерно +100500. Мне сейчас приходится немножко в этом сидеть. Майк, конечно, робот из будущего, но код у него кошмарный.
🐅🤦‍♂️
Почему бы не запилить ECS или аналог? DOD? Потому что ООП понятнее всего для типовых разработчиков? )
Да, понятно для типовых разработчиков. К примеру стратегии оптимизатора кода можно сделать расширяемыми. Наследуйся от базовых классов и пробуй.
🐅🤦‍♂️
Была сильной. Сейчас тормозит развитие.
Можете рассказать подробнее о проблемах?
Leon174
Да про JIT все равно пока упоминается в том контексте, что, мол, возможно когда-нибудь. Но методы LuaJIT потырят.
Snusmumriken
Методы LuaJIT уже потырили в пых и v8 ))
ᴠɪᴋᴀʀɪ ʜᴏɴᴇsᴛ
🐅🤦‍♂️
Методы LuaJIT уже потырили в пых и v8 ))
Если я не ошибаюсь jit как концепция имеет академическое происхождение. Кстати в C# и Erlang также компиляция по требованию.
R
Можете рассказать подробнее о проблемах?
Накладные расходы на контекст, многопоточность, сборка. Вероятно, всё решаемо, но по мере решения выигрыш по сравнению с метод-бэйсед сперва нивелируется, затем становится отрицательным.
R
Но АОТ годный, ускорение местами поражает.
🐅🤦‍♂️
В Эрланг 24 чистый АОТ. Называется JIT, потому что типа "оно само вызывается".
Просто я в расылке либы AsmJit видел ссылки на исходный код Erlang. Зачем-то они применяют AsmJit? Особо глубоко я не заглядывал.
R
Просто я в расылке либы AsmJit видел ссылки на исходный код Erlang. Зачем-то они применяют AsmJit? Особо глубоко я не заглядывал.
В детали не лез, но компиляция там строго после загрузки модуля, но перед исполнением.
Leon174
Можете рассказать подробнее о проблемах?
Сразу это вспомнилось. Другой наш чувак пишет. https://github.com/luafun/luafun/issues/31#issuecomment-277508076
R
Method-based, есть статьи почитать что за подход?
Прям так и гуглится. А ещё лучше читать статьи, где сравнивается method и tracing.
🐅🤦‍♂️
В детали не лез, но компиляция там строго после загрузки модуля, но перед исполнением.
Возможно для чего-то вроде ffi? Для генерапции кода вызова внешних функций. Вот кстати интереснейшая библиотека https://asmjit.com/ Но я не люблю C++
R
Возможно для чего-то вроде ffi? Для генерапции кода вызова внешних функций. Вот кстати интереснейшая библиотека https://asmjit.com/ Но я не люблю C++
Тут как вышло. Меня сосватали на Луа/ЛЖ как раз тогда, когда вышел Эрланг 24. В итоге я по инерции погонял 24 на всяких бенчах, что-то там отслеживаю - но глубоко в кишки, как раньше, уже не лез. Когда по работе дойду до следующего этапа, вот там будут задействованы идеи в том числе из Эрланга, буду вникать.
R
Сейчас мне понятно, что метод+статический анализ будут быстрее, чем трейс. Но СА должен быть заточен под язык. С Луа это по очевидным причинам сложно.
R
В luajit мне нравится идея трассировки и отслеживания горячих участков кода.
Это красивая идея, но в долгосрочной перспективе проигрышная. Но красивая.
🐅🤦‍♂️
Сейчас мне понятно, что метод+статический анализ будут быстрее, чем трейс. Но СА должен быть заточен под язык. С Луа это по очевидным причинам сложно.
Мне не нравится то, что статический анализ занимает много времени. Он хорош, но тормозит цикл разработки. Если допустим 20% вычислительного времени будет занимать нагрузка от вирт машины и среды выполнения, а 80% - собственно выполнение кода пользователя, то уже хороший расклад. Теряешь производительность, особенно в момент запуска программы, загрузки модули и т.д. но выигрываешь в скорости разработки.
🐅🤦‍♂️
Это красивая идея, но в долгосрочной перспективе проигрышная. Но красивая.
К тому же на современных машинах может иметь смысл использовать несколько потоков. Основной поток - код пользователя и вм, сгенерированный код. Второй поток может допустим по таймеру сканировать память первого потока и проверять временные метки циклов(сколько раз вызывался код и тд) в памяти и переписывать часть кода. Пока только концепт.
🐅🤦‍♂️
К тому же на современных машинах может иметь смысл использовать несколько потоков. Основной поток - код пользователя и вм, сгенерированный код. Второй поток может допустим по таймеру сканировать память первого потока и проверять временные метки циклов(сколько раз вызывался код и тд) в памяти и переписывать часть кода. Пока только концепт.
Также можно использовать шире механизм виртуальной памяти. Я не знаю как это работает в LuaJit, не помню эти моменты. Идея в выделении большого куска через mmap или VirtualAlloc и писать в него код. Тут еще нужен отдельный менеджер памяти со списком свободных блоков. Большой кусок - от нескольких гигабайт. Я не ориентируюсь на встроенные системы, а скорее на многоядерные машины с достаточным количеством памяти.
R
К тому же на современных машинах может иметь смысл использовать несколько потоков. Основной поток - код пользователя и вм, сгенерированный код. Второй поток может допустим по таймеру сканировать память первого потока и проверять временные метки циклов(сколько раз вызывался код и тд) в памяти и переписывать часть кода. Пока только концепт.
Оно несколько не так работает, конечно. Там даже расстановка меток требует определённых эвристик (читай: интуиции). И в итоге всё равно выделенный "горячий путь" оказывается довольно мал. Да, он охренеть как быстр, но не 100%, и девиации логики его ломают. А метод, может, и помедленнее, но это под 100% кода. Сильно упрощаю, конечно.
🐅🤦‍♂️
В LuaJIT вариант dlmalloc. Отличная штука, быстрая, но общего назначения. Хотя, может, Майк уже допилил custom-fit.
Я говорю про выделение большого участка вирт памяти и сверху свой менеджер памяти. Вот здесь рассказывается про такой подход https://www.youtube.com/watch?v=0SrB7O4udZQ&ab_channel=GaijinJam
🐅🤦‍♂️
Ну т.е арены? Стандартный подход.
Еще мне не очень нравится, что в LuaJit используется свой ассемблер. Я хочу использовать FASM в своей реализации. Он компактен, многопроходен и быстр, не требует линковщика(встроенный).
R
Еще мне не очень нравится, что в LuaJit используется свой ассемблер. Я хочу использовать FASM в своей реализации. Он компактен, многопроходен и быстр, не требует линковщика(встроенный).
Только он статический. Скомпилять "int foo(int, int)" легко, потому что заранее всё известно. Компилять "function foo(a, b)" куда сложнее, потому что хрен его знает, что прилетит со стека. Поэтому надо уметь на ходу подстраиваться. В итоге DynASM - это такой своеобычный вариант IR, как во многих современных трансляторах.
🐅🤦‍♂️
Только он статический. Скомпилять "int foo(int, int)" легко, потому что заранее всё известно. Компилять "function foo(a, b)" куда сложнее, потому что хрен его знает, что прилетит со стека. Поэтому надо уметь на ходу подстраиваться. В итоге DynASM - это такой своеобычный вариант IR, как во многих современных трансляторах.
У меня такая идея - взять ванильую Lua и добавлять в нее вызовы своей библиотеки в разный местах. После генерации кода, в основной цикл и т.д. Библиотека пишется на Rust, в нее встроен FASM. Те начать не с переписывания Lua, а с замены выполнения байткода своим генерированным кодом. Не уверен в таком подходе, но он позволит начать с минимальных изменений в код Lua. И в целом легче переносить на все версии - 5.2, 5.3, 5.4
Mikhail
Ну что... Luau теперь для всех. Больше это не часть Роблокса. https://devforum.roblox.com/t/luau-goes-open-source/1534471
Snusmumriken
Ля, ты опоздал где-то на неделю, уже обсудили и обсосали ))
Mikhail
соряныч.
Snusmumriken
Да всё хорошо
Александр
Всем привет , хочу сделать заказ на языке ЛУА , для World of Warcraft игры... Кто готов взяться ,Пишите в личку.
🐅🤦‍♂️
так-то, в индустрии трассирующие jit-ы проиграли https://news.ycombinator.com/item?id=16204373
Идея в том, что трассирующие jit могут позволить писать программисту "говнокод", но он будет довольно хорошо работать. К примеру использовать сложное многоуровневое хэширование, создавать много промежуточных объектов. Человек пишет понятный ему код, занимается логикой алгоритма. А машина оптимизирует до приемлемого уровня. Статический анализ может не дать таких выгод, особенно с динамическими языками.
R
Коэффициенты трассер может подтянуть, а большое О не исправит.
mva
ага... вы ещё JAVA пишите
Just Another Vendor-lock Achtung? :)
🐅🤦‍♂️
а может просто надо больно бить за говнокод?
Ну а кто напишет этот мифический идеальный код? Если человек может решить задачу, то отлично. Задача компилятора что-бы работало приемлимо быстро. Как отметили, что О(n^2) не исправит никакой компилятор.
Джифорсович
usernameak
Ор
какие люди
Luсky
ну вот ПОЧЕМУ, ПОЧЕМУ ВЫ ВСЕ ПИШЕТЕ "Lua" КАПСЛОКОМ, А?!?!?!?!?!?!?!?!
Хз. Что за язык такой - ЛУА? Линейно-управляемых автоматов?