Size: a a a

Compiler Development

2020 March 10

AT

Alexander Tchitchigin in Compiler Development
Bonart
Неужели? У вас есть реальные опровержения? Чтобы в язык приехало совершенно чужое слово без адаптации? Лингвисты вам за такое Нобелевку дадут
Насчёт Нобелевки сильно сомневаюсь. У меня прямо перед глазами (ушами?) пример татарского языка, в котором на мой взгляд вполне официально русские заимствования произносятся полностью по-русски. Да и в английском французские заимствования не сильно-то адаптировались. Как и в обратном направлении.
источник

B

Bonart in Compiler Development
> в котором на мой взгляд вполне официально русские заимствования произносятся полностью по-русски
Носители татарского сейчас в массе являются и носителями русского, так что совершенно чужими слова из русского назвать будет трудно.
источник

B

Bonart in Compiler Development
С английским все еще веселее - из-за сильного расхождения письменности и фонетики английский массово адаптируется под себя в каждом регионе. Скоттиш какой-нибудь непривычный человек даже читать не сможет, не то что на слух воспринимать
источник

VK

Vladimir Kazanov in Compiler Development
друзья, все хорошо, но где здесь компиляторы? Я понимаю, что при буквальном переводе с английского слово "compiler" теряет в однозначности, но тут что-то перебор.
источник

B

Bonart in Compiler Development
Vladimir Kazanov
друзья, все хорошо, но где здесь компиляторы? Я понимаю, что при буквальном переводе с английского слово "compiler" теряет в однозначности, но тут что-то перебор.
Каюсь :( С формальными языками вопрос куда проще - здесь с адаптацией новых фич под язык никто не спорит
источник

FO

FORTRAN ONE LOVE in Compiler Development
Alexander Zaitsev
Понимаю, что не совсем по компиляторам, но все же. Есть у кого что посоветовать по ast-based форматированию кода? Если уже есть что-то готовое для с++, то вообще шикарно будет
Я храню куски кода построчно + комментарии в виде дерева. Часть конструкций обрабатывается и изменяется. Вроде норм выходит, только медленно и не эффективно.

Больше всего мучался с форматированием комментариев :(
источник

M

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

АВ

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

E

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

E

EgorBo in Compiler Development
я так делал для LINQ to LLVM
источник

M

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

E

EgorBo in Compiler Development
MaxGraey
Раст такое разворачивает в компайл тайм, но у него на итераторах все
triggered
источник

АВ

Александр Вольнов in Compiler Development
MaxGraey
Раст такое разворачивает в компайл тайм, но у него на итераторах все
Как и в C++20 и D ranges. Меня интересует именно рантайм, где можно последовательность map, filter, reduce описать в файле и в рантайме получить близкую к нативному циклу производительность.
источник

M

MaxGraey in Compiler Development
А вообще не должно быть сложно, достаточно проверить есть ли сайд-эффекты, то есть чистые ли функции в этой цепочке и тогда можно заменить все это на композицию которая впоследствии заинлайниться
источник

E

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

АВ

Александр Вольнов in Compiler Development
EgorBo
я так делал для LINQ to LLVM
Это в рантайме было, через рефлекшен как-то? Или это было конвертирование существующей программы в LLVM байткод?
источник

АВ

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

E

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

M

MaxGraey in Compiler Development
Александр Вольнов
Но JIT ведь этого не делает? Я не смог нагуглить такого, чтобы JIT умел такое оптимизировать.
Дело в том, что проверка на «чистоту» может быть не такой уж и простой и тривиальной даже для AOT. Поэтому в некоторых языках есть атрибут/декоратор вроде «pure». В функциональных ЯП это не нужно зачастую, там это гарантируется языковыми средствами и иммутабельными структурами
источник

E

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

contracts.Where(c => c.Order.Date == now).Select(c => c.Name)
и это всё преобразуется в один SQL запрос
источник