Size: a a a

WebAssembly — русскоговорящее сообщество

2021 October 07

PP

Petr Penzin in WebAssembly — русскоговорящее сообщество
да, лямбда может работать только через ++ механизмы, например указатель не получится сделать
источник

PP

Petr Penzin in WebAssembly — русскоговорящее сообщество
вообще такой код в статических компиляторах редко красиво выглядит, функциональные языки решают это не всегда напрямую
источник

D

Danya in WebAssembly — русскоговорящее сообщество
Если без замыкания, то получится
источник

D

Danya in WebAssembly — русскоговорящее сообщество
(держу в курсе)
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
В общем поэтому такие замыкания в C++ не очень часто используют, разве что очень примитивные без std::function которые гарантированно всплывут и заинлайнятся. Помню в Binaryen была проблема с производительностью когда кто-то отрефакторил код и заменил обычный указатель на функцию на std::function =)
источник

PP

Petr Penzin in WebAssembly — русскоговорящее сообщество
А, да 😁
источник

D

Danya in WebAssembly — русскоговорящее сообщество
На самом деле используют и много
источник

D

Danya in WebAssembly — русскоговорящее сообщество
Бездумно заменять указатель на функцию на function конечно фу
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Возможно на тех участках где не критична производительность
источник

D

Danya in WebAssembly — русскоговорящее сообщество
Лучше пытаться избежать function
источник

PP

Petr Penzin in WebAssembly — русскоговорящее сообщество
В LLVM довольно активно используется
источник

D

Danya in WebAssembly — русскоговорящее сообщество
Имхо, если мы не стираем тип замыкания, то компилятор я уверен умеет хорошо это инлайлить
источник

D

Danya in WebAssembly — русскоговорящее сообщество
Пруфов не будет
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Компилятор может заинлайнить только те замыкания которые всплывут (lambda lifting). Хотя я даже не уверен что LLVM поддерживает такой вид трансвормации
источник

D

Danya in WebAssembly — русскоговорящее сообщество
Можно простыми словами про lambda lifting?
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Это когда мы имеем вот такую функцию:
fn foo(a) {
 return x => a + x
}
foo(1)(2)

и компилятор может ее превратить в

fn foo() {
 return (x, a) => a + x
}

foo()(2, 1)

а потом в

fn foo_lifted(x, a) {
 return a + x
}

foo_lifted(2, 1)
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Иными словами все свободные переменные (немутирующие) попадают в сигнатуру в качестве параметра. И все вызовы (call sites) так же модифицируются соответствующим образом. В конечном итоге мы полностью избавляемся от замыкания
источник

Б

Богдан in WebAssembly — русскоговорящее сообщество
А как тут понять что происходит? Хотелось бы все же выяснить как эта проблема решается во взрослых языках и компиляторах где есть замыкания потому что я вижу в этом большую проблему - если функция вызывается в горячем цикле а внутри создается замыкание под if-ом который срабатывает очень редко то с простым боксингом замыкаемых переменных мы получаем падение производительности на каждой итерации даже когда замыкания не создаются
источник

D

Danya in WebAssembly — русскоговорящее сообщество
Интересно конечно
источник
2021 October 08

DM

Demi Murych in WebAssembly — русскоговорящее сообщество
ваш вопрос касается того каким образом себя поведет современный v8 в описанной ситуации?
источник