Size: a a a

Compiler Development

2020 February 26

PS

Peter Sovietov in Compiler Development
Mikhail Maltsev
Надо ещё про производительность не забывать. Тот же самый выбор команд. В LLVM на этапе компиляции паттерны преобразуются в байт-код. Это позволяет сэкономить время в рантайме
Но каким образом байткод "экономит время в рантайме"?
источник

MM

Mikhail Maltsev in Compiler Development
В байт-коде объединены все pattern-ы, по которым производится выбор инструкций, за счёт этого сопоставление идёт со всеми pattern-ами параллельно (с backtracking-ом там где это необходимо)
источник

PS

Peter Sovietov in Compiler Development
Погодите, что именно идет параллельно? Вот, собственно, интерпретатор для 50+ команд:

https://github.com/llvm/llvm-project/blob/master/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp#L2778

Вы видите здесь какую-то параллельную работу?
источник

PS

Peter Sovietov in Compiler Development
Использование байткода здесь не от хорошей жизни, и уж точно не ради быстродействия. Просто авторам нужно было как-то выполнять пользовательские фрагменты сопоставления на C++ и при этом до некоторой степени обобщить механизм работы выбора команд.
С другой стороны ради соображений быстродействия можно было бы, например, ожидать порождения не байткода, а биткода LLVM — с последующей AOT-трансляцией.
источник

MM

Mikhail Maltsev in Compiler Development
Параллелизм в том, что одна команда байт-кода может соответствать сразу нескольким паттернам. Когда я говорил про экономию времени в рантайме я имел в виду что сам байт-код создаётся на этапе компиляции.
источник

MM

Mikhail Maltsev in Compiler Development
> С другой стороны ради соображений быстродействия можно было бы, например, ожидать порождения не байткода, а биткода LLVM — с последующей AOT-трансляцией.
А ещё лучше сгенерировать код на C++, как это сделано в GCC
источник

PS

Peter Sovietov in Compiler Development
Mikhail Maltsev
Параллелизм в том, что одна команда байт-кода может соответствать сразу нескольким паттернам. Когда я говорил про экономию времени в рантайме я имел в виду что сам байт-код создаётся на этапе компиляции.
Это, на самом деле, давно известные техники. И сопоставление по общему префиксу, и предварительная компиляция кода сопоставления с образцом. Использование байткода совершенно необязательно.
источник

PS

Peter Sovietov in Compiler Development
Mikhail Maltsev
> С другой стороны ради соображений быстродействия можно было бы, например, ожидать порождения не байткода, а биткода LLVM — с последующей AOT-трансляцией.
А ещё лучше сгенерировать код на C++, как это сделано в GCC
Согласен, но это уже совершенно противоречит идеологии LLVM %)
источник

E

EgorBo in Compiler Development
сгенеририровать код на С++ и скомпилировать через ллвм
источник

M

MaxGraey in Compiler Development
EgorBo
сгенеририровать код на С++ и скомпилировать через ллвм
Для WebAssembly кстати есть такая тулза под названием wasm2c. Как раз умеет генерировать C из wasm-байткода
источник

FO

FORTRAN ONE LOVE in Compiler Development
MaxGraey
Для WebAssembly кстати есть такая тулза под названием wasm2c. Как раз умеет генерировать C из wasm-байткода
А потом в фортран можно гнать?
источник

E

EgorBo in Compiler Development
MaxGraey
Для WebAssembly кстати есть такая тулза под названием wasm2c. Как раз умеет генерировать C из wasm-байткода
у нас интерны на летней практике в качестве задания делали wasm to IL
источник

is

ilya sheprut @optozorax in Compiler Development
У меня такой вопрос. Связан с компиляторами, так что, думаю, по теме.

Вот есть формальные грамматики, в них есть терминалы и нетерминалы. Там через правила задаются преобразования изначального нетерминала.

А что если всё что у нас имеется - это терминалы и правила их преобразования? Как это называется?

Пример, собственно ради которого я и спрашиваю - это преобразование математических выражений. Вот есть у нас формула, или можно сказать "двустороннее правило": sin(2*x) <-> 2*sin(x)*cos(x), мы по этим формулам делаем допустимые преобразования из одного вида в другой, приходя к результату.

Просто интересно как такое может называться и насколько это исследовали. Может есть уже какие-то математические и программистские правила для описания подобных преобразований (ну как с формальными грамматиками).
источник

M

MaxGraey in Compiler Development
EgorBo
у нас интерны на летней практике в качестве задания делали wasm to IL
Лучше бы сделали IL to wasm. Было бы больше пользы для Blazor)
источник

E

EgorBo in Compiler Development
MaxGraey
Лучше бы сделали IL to wasm. Было бы больше пользы для Blazor)
il to wasm это же и есть блазор (клиентский) -_-
источник

E

EgorBo in Compiler Development
там и интерп и аот
источник

AK

Andrei Kurosh in Compiler Development
MaxGraey
Лучше бы сделали IL to wasm. Было бы больше пользы для Blazor)
Как сконвертить IL в WASM если у второго нет GC?
источник

M

MaxGraey in Compiler Development
EgorBo
il to wasm это же и есть блазор (клиентский) -_-
Да но только для ядра. CIL библиотеки (dll-ки) работают же в режиме интерпретации =) там нет AOT-компиляции пока что
источник

E

EgorBo in Compiler Development
MaxGraey
Да но только для ядра. CIL библиотеки (dll-ки) работают же в режиме интерпретации =) там нет AOT-компиляции пока что
для них тоже аот есть
источник

E

EgorBo in Compiler Development
давно уже
источник