Re[2]: C++ JIT
От: watchmaker  
Дата: 03.04.15 23:46
Оценка: 15 (4) +1
Здравствуйте, Went, Вы писали:

W>Можно будет сделать С++ — компилятор частью программы и компилировать С++ — код на лету?

Нет. То есть сделать это ты, конечно, можешь, но libgccjit тут никоим образом участвовать не будет и не поможет.

libgccjit — это библиотека доступа к backend'у компилятора. То есть на вход она получает нечто похожее на AST, а на выходе даёт машинный код под конкретную платформу.

Если же хочется компилировать C++, то тебе нужна frontend часть компилятора, которая собственно переведёт код из C++ в вид понятный backend части. Написание своего C++-frontend это, конечно, крайне сложная задача. Заточить уже существующий проще, но тоже потребует усилий. То есть ни того, ни другого варианта в готовом виде не существует и в непосредственном будущем существовать не будет.

Если уж стоит задача именно в динамической компиляции C++ кода, то разумнее всего взять просто полноценный компилятор (в standalone варианте, или завёрнутый в библиотеку) и запускать его. Это совершенно прямолинейный подход, но от этого получаемый результат не станет хуже.

Так что цель libgccjit не в том чтобы компилировать C++ код, а в том чтобы облегчить создание компиляторов, предоставив уже готовый backend. То есть, как и сказано в описании, если у тебя уже есть готовый frontend для своего языка, или виртуальная машина для какого-то своего байт-кода, и ты хочешь её ускорить, воспользовавшись наработками gcc, то эта библиотека — твой выбор.
Другой аналоги — это, например, llvm, который также умеет переводить описание программы из промежуточного кода в машинный. Ну и в некотором роде к аналогам можно добавить ещё и pypy, запущенный в режиме создания компилятора, а не в режиме одноимённого интерпретатора питона. Он тоже может создать по описанию виртуальной машины её jit версию, хотя там несколько другой подход.

W>А как его потом линковать с основной программой?

Динамически. Это просто вызов функции по указателю.
В результате компиляции будет просто получен контейнер с машинным кодом функций с одной или несколькими точками входа. Их вызов из основной программа как раз приведёт к выполнению той логики, которая была передана исходно в libgccjit. Работа идёт точно так же, как и при импорте функций из динамических библиотек с использованием, например, dlsym или GetProcAddress.
Ну и в режиме Ahead-of-Time можно сразу получить ту же .so, чтобы не компилировать программу каждый раз заново, а просто положить результат в файл и загружать функциями ОС (вроде уже упомянутых dlsym и GetProcAddress) без использования gcc.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.