Size: a a a

Compiler Development

2020 March 10

E

EgorBo in Compiler Development
по этому же аналогу можно написать свой провайдер
источник

АВ

Александр Вольнов in Compiler Development
EgorBo
есть 3рд пати, обычный линке такого не делает именно из-за того что он был сдизайнен максимально универсально и удобно
Как он называется?
источник

E

EgorBo in Compiler Development
есть разные, есть LinqSimd или как-то так на симдах
источник

E

EgorBo in Compiler Development
но вообще в любом языке если у тебя прям горячий код в смысле перфа - оптимиизируй сам
источник

АВ

Александр Вольнов in Compiler Development
EgorBo
зато благодаря линуку можно делать так:

contracts.Where(c => c.Order.Date == now).Select(c => c.Name)
и это всё преобразуется в один SQL запрос
Он получает IL-код и преобразует в аналогичный SQL? А если там сложная функция вызывается? И что он в итоге делает с нечистыми функциями?
источник

E

EgorBo in Compiler Development
он разбирает лямбды на экспрешны
источник

E

EgorBo in Compiler Development
аст по сути
источник

M

MaxGraey in Compiler Development
«An important characteristic of the standard query operators is that they are implemented as pure functions.»
источник

M

MaxGraey in Compiler Development
источник

АВ

Александр Вольнов in Compiler Development
EgorBo
но вообще в любом языке если у тебя прям горячий код в смысле перфа - оптимиизируй сам
Я просто хочу сделать свой язык, где пользователь может что угодно нагородить через map/reduce/filter и подобные штуки, и хочу, чтобы он получил максимальную производительность. Соответственно, я не могу контролировать, что именно пользователь напишет, для моей программы это всё находится в рантайме.
источник

АВ

Александр Вольнов in Compiler Development
EgorBo
аст по сути
А откуда AST в дотнете? Это какая-то компиляторная магия во время компиляции? Или он этот AST из IL-байткода получает?
источник

А

Алексей in Compiler Development
Александр Вольнов
Я просто хочу сделать свой язык, где пользователь может что угодно нагородить через map/reduce/filter и подобные штуки, и хочу, чтобы он получил максимальную производительность. Соответственно, я не могу контролировать, что именно пользователь напишет, для моей программы это всё находится в рантайме.
что-то ленивое тогда надо делать
источник

AZ

Alexander Zaitsev in Compiler Development
Александр Вольнов
Я просто хочу сделать свой язык, где пользователь может что угодно нагородить через map/reduce/filter и подобные штуки, и хочу, чтобы он получил максимальную производительность. Соответственно, я не могу контролировать, что именно пользователь напишет, для моей программы это всё находится в рантайме.
ну так и оптимизируй в рантайме. тебя же никто не ограничивает. потом код подменишь и всё
источник

E

EgorBo in Compiler Development
Александр Вольнов
А откуда AST в дотнете? Это какая-то компиляторная магия во время компиляции? Или он этот AST из IL-байткода получает?
источник

АВ

Александр Вольнов in Compiler Development
Alexander Zaitsev
ну так и оптимизируй в рантайме. тебя же никто не ограничивает. потом код подменишь и всё
Ну в общем понятно, если делать реализацию на .NET, то надо просто не использовать IEnumerable, а сразу генерировать циклы целиком с помощью кодогенерации...
источник

B

Bonart in Compiler Development
Александр Вольнов
Такой вопрос, есть ли языки, в которых JIT мог бы заинлайнить длинную цепочку виртуальных методов и/или делегатов?
Например, чтобы в Java Streams, .NET LINQ и чём-то подобном в другом языке можно было сделать что-то вроде
arr.map(x => x + a1).map(x => x => x + a2).sum()
и получить производительность, близкую к аналогичному циклу? Хотя бы для длинных коллекций, где у JIT есть возможность прогреться?
Понятно, что в C++20 и D есть ranges на шаблонах, которые хорошо оптимизируются компилятором, но меня интересует именно формирование таких цепочек в рантайме.
Есть такая штука как LINQ Optimizer Но у него ОЧЕНЬ дорогая константная стоимость
источник

B

Bonart in Compiler Development
источник

B

Bonart in Compiler Development
Александр Вольнов
Ну в общем понятно, если делать реализацию на .NET, то надо просто не использовать IEnumerable, а сразу генерировать циклы целиком с помощью кодогенерации...
Уже украдено до нас. Только по ходу мертвое, оживлять надо. https://github.com/antiufo/roslyn-linq-rewrite
источник

B

Bonart in Compiler Development
Автора просьба не обсуждать
источник

B

Bonart in Compiler Development
https://github.com/Kirill-Maurin/Sample.Struct/blob/cfcd67cfd9b8c5dd6cb2403d6cb4b4247dab466b/Sample.Struct.Benchmarks/ArraySumBenchmarks.cs#L107 - а вот здесь попытка настропалить именно JIT на инлайн. Рекомендую в райдере посмотреть реальный тип лямбды - разрыв шаблона гарантирован
источник