Igor
А у симейка их дофига
UtoECat
UtoECat
А у симейка их дофига
cmake пытается впихнуть невпихуемое в системы в которые он генерирует. Говорю про make тот-же. Понятно что от части там совместимость, отчасти обход багов отдельных имплементаций, но всё же, читать это трудновато.
Igor
Petr
Я скорее понял что в них пользы нет
UtoECat
Я скорее понял что в них пользы нет
но но но... Не спеши с выводами)
Представь что твой проектик разростётся до либ внешних... этак сотни.
И представь что у каждой либы свои скриптики такие сборки.
И каждой либе свои зависимости нужны.
И ты хочешь давать возможность другим проект той собрать. Желательно ещё и на несколько платформ и компиляторов, а не один msvc и windows.
Вот там и начинается боль такого подхода
Petr
Igor
Делал для нескольких платформ скрипты
Igor
И очень сильно удивился, когда узнал, что CMake делает за 2 команды то, что я делал за 100 строк кода скриптового
Igor
И на настройку билдинга у меня стало уходить гораздо меньше времени, чем раньше
Igor
И сэкономленное время ты спокойно можешь потратить на написание кода, а не на интимные действия по отношению к скриптам сборки)
Igor
CMake позволяет тебе очень удобно структуризировать проект, раскидать всё по папкам, а главное - инкрементальная сборка. Что очень важно в проектах больше 10 cpp файлов.
UtoECat
Igor
Igor
Но когда пишешь свой скрипт, настроить инкрементальную сборку - это жопоболь
Igor
Компилятор сам не умеет определять файлы изменённые
Igor
И компилит всё под ряд
Igor
А ведь ещё могут хедеры измениться, CMake это тоже отслеживает успешно
Petr
Крутой конкурс: https://habr.com/ru/companies/yandex/articles/839612/
Восхищаюсь что люди там вытворяют. За предыдущие года можно много чего интересного нарыть, но проходит довольно тихо.
Hello, World! 🎄
Программистам, привет! А в частности линуксоидам!
Если ли в чате люди, которые используют / использовали NixOS?
Как в целом с программированием там? Насколько сложно настройка окружения идет?
В целом хотелось бы просто услышать норм дистр под разработку или нет?
Под разработку для: Python, Lua (Love2d), Frontend (node js)?
Hello, World! 🎄
Насколько я понял там проблемы из-за несовместимости LFS идут, т.к система имеет свою собственную структуру каталогов/файлов, не похожих на обычные дистры
Hello, World! 🎄
Но сама система привлекает интересным подходом к установки пакетов внутри ос
Сергей
Hello, World! 🎄
Hello, World! 🎄
позже гляну
Сергей
I regret doing this...
Сергей
Hello, World! 🎄
Ок, щас
Hello, World! 🎄
https://youtu.be/pmQMTfSABhw
56:25
Хм, ну я думаю, что не будет проблем с установкой ПО, т.к всё что нужно мне +- ставится без проблем через файл конфигурации и отдельные пакеты / библиотеки / фреймворки уже ставятся через pip3, npm и т.д без особых проблем
Hello, World! 🎄
Я себе уже поставил nixos + оставил debian как основную ос
Hello, World! 🎄
Попытаюсь чаще nixos попользоватся (перенести прям все нужны программы) и посмотреть насколько удобно будет
Михаил
@Snusmumriken тут в чатах какая-то движуха начинается насчет многопоточности в луа, можешь объяснить, зачем в луа "истинная" многопоточность? если выполнять вычисления на луа в 8 потоков (8 lua state именно параллельно выполняющихся), это не будет так же полезно, как вызвать те же 8 функций, написанных на си, и выполнить их так же параллельно и вернуть в луа. Есть хоть возможность из корутин вызывать сишные функции и, самое главное - переключаться с одной корутины на другую, пока первая ждет возврата сишной функции? я читал о чем-то подобном в Coco (корутинах в luajit), это оно?
Михаил
и, что самое прикольное - никто не мешает загрузить posix/winapi вместе с Lua API через FFI, и через него создать тред и запустить там еще один луастейт)))
Михаил
https://coco.luajit.org/
UtoECat
@Snusmumriken тут в чатах какая-то движуха начинается насчет многопоточности в луа, можешь объяснить, зачем в луа "истинная" многопоточность? если выполнять вычисления на луа в 8 потоков (8 lua state именно параллельно выполняющихся), это не будет так же полезно, как вызвать те же 8 функций, написанных на си, и выполнить их так же параллельно и вернуть в луа. Есть хоть возможность из корутин вызывать сишные функции и, самое главное - переключаться с одной корутины на другую, пока первая ждет возврата сишной функции? я читал о чем-то подобном в Coco (корутинах в luajit), это оно?
в каких чатах? 🤷♂️
Многопоточность есть разная : реальная и корутины. Реальная многопоточность в луа невозможна в пределах одного стейта, нужен канал для коммуникации сериализованными данными.
Это МОЖЕТ быть полезно, когда логика давно на луашке написана, и будет меняться и дорабатываться. Ты на си всё переписывать соберёшься чтоль?)
Корутины - в одном реальном потоке крутятся, переключаясь с одной на другую.
И нет, нельзя вызвать си функцию и переключиться на корутину сразу. Вызов си функции передаёт управление этой самой си функции, вместо другой корутины. Пока си функция не вернёт управление - стейт в потоке не сможет что-либо делать от слова вообще. А если попытаешься стейт насильно в другом потоке крутить - скорраптишь луа стейт и стек последней активной корутины
Михаил
Snusmumriken
@Snusmumriken тут в чатах какая-то движуха начинается насчет многопоточности в луа, можешь объяснить, зачем в луа "истинная" многопоточность? если выполнять вычисления на луа в 8 потоков (8 lua state именно параллельно выполняющихся), это не будет так же полезно, как вызвать те же 8 функций, написанных на си, и выполнить их так же параллельно и вернуть в луа. Есть хоть возможность из корутин вызывать сишные функции и, самое главное - переключаться с одной корутины на другую, пока первая ждет возврата сишной функции? я читал о чем-то подобном в Coco (корутинах в luajit), это оно?
> зачем в луа "истинная" многопоточность?
Для ряда причин.
1. Блокирующие вызовы, которые нельзя сделать неблокирующими.
Например, ты такой пилишь консольную приложульку, которая непрерывно делает работу, но принимает команды с клавиатуры. И сделать неблокирующий io.read например физически нельзя — только сидеть и только ждать пока юзер не введёт команду. Открываешь соседний поток с работой, посылаешь ему сообщеньки из потока с ожиданием команд.
2. Реальное время. Например, ты делаешь подсистему вывода звука. Чтобы звук не лагал при лагах основного приложения, и на звуковуху ВСЕГДА был подсунут нужный чанк звуковой волны вовремя, ты такой берёшь, и выделяешь звуковую подсистему в соседний поток.
Или ты пилишь сетевое взаимодействие на UDP. Чтобы чётко и точно контролировать скорость приёмо-передачи, чтобы точно не было никаких переполнений буферов, ты выделяешь их в соседний поток, и они там точно и чотко отрабатывают, пока в основной части приложения может всё тупить и тормозить.
3. Использование возможностей множества процессоров. Запускаешь в одном потоке тяжёлую задачу, и в другом потоке тяжёлую задачу. А в третьем потоке — интерфейс. И этот интерфейс прекрасно себя чувствует, а параллельные задачи прекрасно работают на своих процессорах, ускоряя выполнение за счёт настоящей одновременности.
Snusmumriken
Корутины — это хорошо и прекрасно. И асинхронно. И вообще.
Но они ничего не могут сделать блокирующим вызовам, точному выполнению в срок в нечётких условиях, и необходимости использовать несколько процессоров.
Snusmumriken
в каких чатах? 🤷♂️
Многопоточность есть разная : реальная и корутины. Реальная многопоточность в луа невозможна в пределах одного стейта, нужен канал для коммуникации сериализованными данными.
Это МОЖЕТ быть полезно, когда логика давно на луашке написана, и будет меняться и дорабатываться. Ты на си всё переписывать соберёшься чтоль?)
Корутины - в одном реальном потоке крутятся, переключаясь с одной на другую.
И нет, нельзя вызвать си функцию и переключиться на корутину сразу. Вызов си функции передаёт управление этой самой си функции, вместо другой корутины. Пока си функция не вернёт управление - стейт в потоке не сможет что-либо делать от слова вообще. А если попытаешься стейт насильно в другом потоке крутить - скорраптишь луа стейт и стек последней активной корутины
Вообще, можно замутить шаред стате, но на луёвой стороне это будет скорее просто как блок "общей" памяти, на котором разные потоки с запущенной луашкой вписывают свои кусочки строчек, или юзердата-объекты ":getValue() :setValue()" с минимальным копированием.
Шарить луашные объекты между стейтами (строчки, таблички) довольно проблематично. Хотя можно попробовать запилить общий строковый буфер, должно быть мемно, хотя гц на их фоне тоже надо будет объединять.
UtoECat
Вообще, можно замутить шаред стате, но на луёвой стороне это будет скорее просто как блок "общей" памяти, на котором разные потоки с запущенной луашкой вписывают свои кусочки строчек, или юзердата-объекты ":getValue() :setValue()" с минимальным копированием.
Шарить луашные объекты между стейтами (строчки, таблички) довольно проблематично. Хотя можно попробовать запилить общий строковый буфер, должно быть мемно, хотя гц на их фоне тоже надо будет объединять.
многопоточная хеш-мапа будет труднее по поддержке чем та-же мапа, но для лукапа очереди, ссылка на которую потом в registry каждого стейта будет держаться и оверхедом останется одна блокировка мьютекса
Шаред стейт ещё блокировать непонятно как. Всего разом? На каждое чтение и запись каждого поля?)
Шаред стейт, конечно, полезен, в о отдельных ситуациях, но прогонять текстурки, звук, будет всё-таки на очередях поэффективнее.
Но ультимативное решение - иметь оба варианта)
Snusmumriken
многопоточная хеш-мапа будет труднее по поддержке чем та-же мапа, но для лукапа очереди, ссылка на которую потом в registry каждого стейта будет держаться и оверхедом останется одна блокировка мьютекса
Шаред стейт ещё блокировать непонятно как. Всего разом? На каждое чтение и запись каждого поля?)
Шаред стейт, конечно, полезен, в о отдельных ситуациях, но прогонять текстурки, звук, будет всё-таки на очередях поэффективнее.
Но ультимативное решение - иметь оба варианта)
Можно делать много маленьких шаред-стейтов, а ля очереди со слотами, и блокировать отдельно.
UtoECat
Вообще, можно замутить шаред стате, но на луёвой стороне это будет скорее просто как блок "общей" памяти, на котором разные потоки с запущенной луашкой вписывают свои кусочки строчек, или юзердата-объекты ":getValue() :setValue()" с минимальным копированием.
Шарить луашные объекты между стейтами (строчки, таблички) довольно проблематично. Хотя можно попробовать запилить общий строковый буфер, должно быть мемно, хотя гц на их фоне тоже надо будет объединять.
в luajit есть string.buffer который довольно эффективно сериализует объектики. Без перекрёстных ссылок, конечно, и userdata/thread/function, но всё-же лучше чем ничего
UtoECat
UtoECat
Snusmumriken
Например, давай представим, что мы хотим обрабатывать большой объём данных в соседних потоках.
У нас есть например пикча, и мы делим её на чанки и отправляем в соседние потоки на обработку.
Мы можем:
- Скопировать пикчу в N буферов-чанков, сериализовать, переслать потокам, дождаться обработки, потом собрать обратно.
- Закинуть пикчу в шаред-стейт, и скинуть потокам указатель на этот стейт + диапазоны в которых они должны работать. И даже блокировать не надо, лол.
Михаил
Михаил
говно с message passing
Михаил
были патчи на 5.0 интерпретатор с общей кучей
Михаил
UtoECat
Например, давай представим, что мы хотим обрабатывать большой объём данных в соседних потоках.
У нас есть например пикча, и мы делим её на чанки и отправляем в соседние потоки на обработку.
Мы можем:
- Скопировать пикчу в N буферов-чанков, сериализовать, переслать потокам, дождаться обработки, потом собрать обратно.
- Закинуть пикчу в шаред-стейт, и скинуть потокам указатель на этот стейт + диапазоны в которых они должны работать. И даже блокировать не надо, лол.
В буфер никто не мешает поместить FFI указатель) Как и в стейт.
А так полностью согласен, лишний раз копировать не стоит.
Snusmumriken
говно с message passing
У ловки есть очень забавная ерунда.
Луашные типы, ловка сериализует при передаче между тредами.
Но свои типы — передаёт по ссылке.
В результате, можно сделать например один огромный меш, обработать его физику в одном потоке, другую физику в другом потоке, какую-нибудь инверсную кинематику в третьем, а потом взять, и тупо отрисовать в главном потоке. Вообще ни о чём не думая. Мутексы там в наличии, поэтому на ожидании потоки могут поблокировать, но это уже к реализации.
Если сделать двойную буферизацию меша то даже не заблокируется.
Михаил
Snusmumriken
Ну я типа делал игру в жизнь многопоточную на 8-10 потоков фо фан, весело было.
Михаил
Михаил
это всё один и тот же луашный код
Михаил
https://hastebin.com/share/riwakasequ.lua
Михаил
может он криво обращается к FFI
Михаил
https://hastebin.com/share/ukopicanuh.cpp
Михаил
на самом деле это сишный файл, ну ниче
Михаил
в общем это багованая библиотека для асинхронности
Михаил
НО она работает
Михаил
Михаил
вот два результата от того же кода
Michael@hpv15:/s/source/snippets/coro> luajit lmain.lua
started coro 1
started coro 2
async 1
Segmentation fault (core dumped)
Michael@hpv15:/s/source/snippets/coro> luajit lmain.lua
started coro 1
started coro 2
async 1
async 1
async 2
async 2
async 3
async 3
async 4
async 4
async 5async 5
async 6
async 6
async 7
async 7
async 8
async 8
async 9
async 9
async 10
async 10
async 11
async 11
async 12
async 12
async 13
async 13
async 14
async 14
async 15
async 15
async 16
async 16
async 17
async 17
async 18
async 18
async 19
async 19
async 20
async 20
finished coro 1
finished coro 2
^C
Михаил
сегфолт обычно в lj_gc при gc_sweepstr
Михаил
lmain.lua
require("lasync")
function coroutine1()
print("started coro 1")
async_dofile("lsub1.lua")
print("finished coro 1")
end
function coroutine2()
print("started coro 2")
async_dofile("lsub1.lua")
print("finished coro 2")
end
co1 = coroutine.create(coroutine1)
co2 = coroutine.create(coroutine2)
coroutine.resume(co1)
coroutine.resume(co2)
while coroutine.status(co1) ~= "dead" or coroutine.status(co2) ~= "dead" do
os.execute("sleep 0.1")
end
lsub1.lua
for i = 1, 20 do
print("async " .. i)
os.execute("sleep 0.1")
end
Михаил
os.exec sleep 0.1 неинтересно, щас посмотрим что будет если луашный код будет все время выполняться
Михаил
сегфолтит сразу
Михаил
Михаил
но есть идея как это все говно в кучу собрать
Snusmumriken
Михаил
Михаил
я уже нашел что можно соорудить из этого, хоть сколько-нибудь полезного
Михаил
либу-обертку для птредов
Михаил
только она скоро не сможет опираться на чистый lua api, и это хорошо....
Михаил
я добавлю ее в свой форк луажита (наверно)