Size: a a a

Compiler Development

2020 March 10

АВ

Александр Вольнов in Compiler Development
polunin.ai
Оптимизация функциональных штук это вообще гиблая тема. Придумывает кучу эвристик, и при этом они не всегда работают. Рекомендую оставить это гиблое дело)
А что там не так? Мне по идее нужно заинлайнить всё в общий цикл, чтобы процессору по бранчам и виртуальным таблицам не прыгать. Это вообще не должно иметь никакого отношения к функциональным штукам.
источник

KR

K R in Compiler Development
Dmitry Ponyatov
вы с RСУБД vim sed и grep используете? тут то же самое
Ув. Дмитрий, вы про что-то другое пишете. Речь там была о неразвитости инструментов для работы с графами непосредственно.

Neo4j - это хорошо, но эти как в MSWord экспортировать программу для вставки и замены потому, что IDE и редакторов не существует.
источник

DS

Doge Shibu in Compiler Development
polunin.ai
Оптимизация функциональных штук это вообще гиблая тема. Придумывает кучу эвристик, и при этом они не всегда работают. Рекомендую оставить это гиблое дело)
Вообще достаточно неплохо работают, но требуют поддержки от компилятора и правильно написанные сами комбинаторы.

Как пример, fusion на rewrite rules в хаскеле.
источник

АВ

Александр Вольнов in Compiler Development
Andrew Rudenko
ну в смысле нет? wasm это набор инструкций, конечно, их можно генерить динамически. есть разные окружения для запуска: интерпретатор wasmtime, генератор машинного кода из wasm cranelift, JS API в браузере — для любого из них можно включить динамическую генерацию wasm-модулей
Можно сгенерировать новый модуль, но можно ли дать ему на обработку память старого модуля? Хотя наверное можно, если в новом модуле будет простая функция, которая не вызывает никакие другие функции, не управляет памятью и не имеет даже сишного рантайма...
источник

M

MaxGraey in Compiler Development
Александр Вольнов
В браузере можно цикл на JS сгенерировать по идее и передать ему нужный кусок ArrayBuffer на обработку.
Так все равно придется загружать (инстанцировать) и заново парсить/декодировать и валедировать весь модуль
источник

M

MaxGraey in Compiler Development
Andrew Rudenko
ну в смысле нет? wasm это набор инструкций, конечно, их можно генерить динамически. есть разные окружения для запуска: интерпретатор wasmtime, генератор машинного кода из wasm cranelift, JS API в браузере — для любого из них можно включить динамическую генерацию wasm-модулей
это как?
источник

АВ

Александр Вольнов in Compiler Development
MaxGraey
Так все равно придется загружать (инстанцировать) и заново парсить/декодировать и валедировать весь модуль
Наверное же можно создать отдельный модуль, который содержит только одну сгенерированную функцию и передать ей ArrayBuffer от основного модуля? Распарсить и валидировать модуль, содержащий одну функцию, будет быстрее.
источник

M

MaxGraey in Compiler Development
Динамическое выполнения из памяти в wasm нету и это хорошо, иначе бы весь «secure by design» коту под хвост
источник

AR

Andrew Rudenko in Compiler Development
MaxGraey
это как?
что именно? wasmtime это, например, это ВМ, о каком AOT тут речь идет?
источник

AR

Andrew Rudenko in Compiler Development
Александр Вольнов
Можно сгенерировать новый модуль, но можно ли дать ему на обработку память старого модуля? Хотя наверное можно, если в новом модуле будет простая функция, которая не вызывает никакие другие функции, не управляет памятью и не имеет даже сишного рантайма...
вот насчет памяти старого модуля зависит от имплементации... мы сейчас об js-имплментации говорим? ну и корректность такой замены гарантировать-то не получится
источник

M

MaxGraey in Compiler Development
Александр Вольнов
Наверное же можно создать отдельный модуль, который содержит только одну сгенерированную функцию и передать ей ArrayBuffer от основного модуля? Распарсить и валидировать модуль, содержащий одну функцию, будет быстрее.
В wasm есть стримовая загрузка но только для браузеров (и то не для всех, например в Safari ее нет). Но это не сильно поможет. Вообще можно конечно делать hot path. Но есть один нюанс - это multitier архитектура всех рантаймов. Иными словами после каждого такого обновления все будет скатываться к медленному tier-0
источник

M

MaxGraey in Compiler Development
Andrew Rudenko
что именно? wasmtime это, например, это ВМ, о каком AOT тут речь идет?
wasm это AOT архитектура, в отлиции от той же JVM
источник

M

MaxGraey in Compiler Development
об этом речь
источник

AR

Andrew Rudenko in Compiler Development
о чем об этом? что за AOT-архитектура? в WASM имплементация есть как и чисто интерпретаторы, так и интерпретаторы с JIT, так и AOT-компиляторы в машинный код
источник

M

MaxGraey in Compiler Development
А то как там рантайм может быть устроен, это уже другое дело. Lucet, InNative, Liftoff - это AOT, wasm3, wasmi - интерпретаторы, WAVM, Cranelift-based (wasmtime) и др - JIT
источник

АВ

Александр Вольнов in Compiler Development
Andrew Rudenko
вот насчет памяти старого модуля зависит от имплементации... мы сейчас об js-имплментации говорим? ну и корректность такой замены гарантировать-то не получится
Я про реализацию, которая в браузерах.
источник

АВ

Александр Вольнов in Compiler Development
MaxGraey
В wasm есть стримовая загрузка но только для браузеров (и то не для всех, например в Safari ее нет). Но это не сильно поможет. Вообще можно конечно делать hot path. Но есть один нюанс - это multitier архитектура всех рантаймов. Иными словами после каждого такого обновления все будет скатываться к медленному tier-0
Я не предлагаю обновлять существующий модуль, а предлагаю для каждого нового цикла генерировать свой маленький wasm модуль, содержащий только одну функцию с циклом внутри и использующий ArrayBuffer основного модуля в качестве кучи, чтобы он мог прямо в нём провести вычисления и записать результаты. Прокатит такая схема?
источник

M

MaxGraey in Compiler Development
Александр Вольнов
Я не предлагаю обновлять существующий модуль, а предлагаю для каждого нового цикла генерировать свой маленький wasm модуль, содержащий только одну функцию с циклом внутри и использующий ArrayBuffer основного модуля в качестве кучи, чтобы он мог прямо в нём провести вычисления и записать результаты. Прокатит такая схема?
то есть для каждой фугкции использовать отдельный модуль? Нет, ну так конечно можно, но это ужасный оверхед как по памяти так и ресурсам. Я не очень понимаю зачем? По моему намного проще запихнуть интерпретатор как это сделано в Blazor / Mono
источник

M

MaxGraey in Compiler Development
Ну а еще проще транспилировать в JS и там тогда можно вообще делать что угодно)
источник

АВ

Александр Вольнов in Compiler Development
MaxGraey
то есть для каждой фугкции использовать отдельный модуль? Нет, ну так конечно можно, но это ужасный оверхед как по памяти так и ресурсам. Я не очень понимаю зачем? По моему намного проще запихнуть интерпретатор как это сделано в Blazor / Mono
Я рассматриваю генерацию кода именно для увеличения производительности как альтернатива интерпретации.
Может дешевле и проще будет просто цикл на JS сгенерировать, о чём я писал выше. Просто я не знаю, насколько там большой оверхед кучи wasm модулей на пол-килобайта. Если там на каждый модуль отдельный тяжёлый инстанс ВМ создаётся, то конечно лучше уж тогда JS генерить.
источник