Size: a a a

Compiler Development

2021 May 07

s

suhr in Compiler Development
Потому, что это кривая попытка компенсировать отсутствие базовой фичи в языке?
источник

Т8

Т-34 85 in Compiler Development
так почему кривая-то?
источник

KR

K R in Compiler Development
Правильно ли я понимаю, что в Хаскеле к функциям классов типов почти всегда применяется оптимизация девиртуализации? Ну, в отличие от виртуальных функций С++/Java.
источник

RE

Roman Elizarov in Compiler Development
В C++ и в Java всё совсем по-разному в плане девиртуализации (поэтому вряд ли на так поставленный вопрос, с неверной посылкой, можно получить адекватный ответ)
источник

KR

K R in Compiler Development
Хорошо, ограничимся C++. Я был неправ, добавив язык с Jit.
источник

RE

Roman Elizarov in Compiler Development
Здесь важен не язык, а конкретный компилятор + runtime. В AOT (не jit) компиляторах Java отдельная своя история.
источник

kO

kikimych O_O in Compiler Development
Девиртуализация сама по себе особой ценности не имеет, оверхед на вызов виртуальной функции - лишний лод по офсету в виртуальной таблице. Но она очень часто необходима для инлайна, и вот тут уже профит может быть значительным. Конкретно в жаве проинлайнив  колл довольно часто можно избавиться от баунд чеков и прочей грязи, поэтому в компиляторах java с ней заморачиваются, а в плюсовых нет. Ну и в плюсах не все методы виртуальны всё-таки, в отличии от.
источник

AT

Alexander Tchitchigi... in Compiler Development
Как ни парадоксально, я бы сказал, что нет, вообще не применяется. 😊

Как я это вижу, оно работает так: поскольку для инстансов гарантируется единственность, если компилятор вывел достаточно конкретные типы (в месте вызова) и инстанс — он просто подставляет прямой вызов нужной функции. Потому что никакая другая туда прийти просто не может в любом случае. А вот если тип остаётся общим или инстанс не вывелся (потому что оказались в разных пакетах, например, или ещё чего) — вызов остаётся "виртуальным", потому что как иначе?
источник

PG

Per-Lorean Graph in Compiler Development
Разве там не статический биндинг?
источник

AT

Alexander Tchitchigi... in Compiler Development
Код на C++ от инлайнинга тоже дофига выигрывает ровно по тем же самым причинам, так что компиляторы очень стараются делать девиртуализацию. Только они спекулировать не могут в отличие от.
источник

PG

Per-Lorean Graph in Compiler Development
Вот-вот
источник

AT

Alexander Tchitchigi... in Compiler Development
Нет, там словарь методов передаётся.
источник

KR

K R in Compiler Development
Оно же vtable
источник

AT

Alexander Tchitchigi... in Compiler Development
В некотором (расширенном) смысле слова "vtable". 😉
источник

KR

K R in Compiler Development
C++ при всех его недостатках даёт посмотреть потроха. Как УАЗик. ;-)
источник

卜根 in Compiler Development
только не в boost::spirit и прочем метапрограммировании
источник

AT

Alexander Tchitchigi... in Compiler Development
Тут у меня вопрос не в доступе к потрохам, а к привязке vtable к объекту во всех ОО-языках. Словари классов типов, как известно, живут отдельно от значений.
источник

KR

K R in Compiler Development
У меня была мысль, что нужно делать для них компилятор наоборот - из С++ в какую-нибудь Miranda. Разумеется приблизительный.

Чтобы хоть в общих чертах понимать, что происходит.
источник

KR

K R in Compiler Development
Но пока наделали наоборот - кодогенераторов в шаблоны.
источник

卜根 in Compiler Development
в GNAT, кстати, есть возможность запросить полупереваренное дерево на адаподобном языке
источник