Comments 12
Неужели автор ничего не слышал о Cling - ROOT ?
Cling — интерактивный интерпретатор C++, построенный на базе библиотек LLVM и Clang. Его преимущества перед стандартными интерпретаторами заключаются в том, что он имеет командную строку и использует JIT-компилятор для компиляции.
Есть ли английская версия этого поста?
Xочу переслать его своим коллегам из Cling/ROOT
Они могли бы дать наиболее профессиональную рецензию этому труду.
Для динамической компиляции в своём движке я юзал RuntimeCompiledCPlusPlus. Автор обещает поддержу clang MSVC и gcc. Работает она просто, трекает файлы и при измерении даёт возможность запустить процесс рекомпиляции, а затем делает свап dll' ок. Все опции компиляции можно передать в инициализации. Штука рабочая, почему о ней так мало говорят - не знаю
Да, реализована, причем тут механизм немного другой. Сперва из скомпилированного и оптимизированного модуля создается среда JIT выполнения для текущей платформы
llvm::EngineBuilder builder(std::move(module));
...
auto executionEngine = builder.create();
Которая связывает уже загруженный и исполняемый код приложения с вновь созданным. Причем для последнего можно получить, и в дальнейшем использовать реальный адрес скомпилированной функции, точно так же, как и из разделяемой библиотеки:
AddFunc add = reinterpret_cast<AddFunc> (executionEngine->getFunctionAddress("nv_add"));
...
int res = add(40, 2);
В Windows можно пометить кусок памяти как исполнимый через VirtualProtect с флагом PAGE_EXECUTE_READ, в Linux и MacOS - через mprotect с флагом PROT_EXEC. Грузить динамическую библиотеку для этого не нужно.
Для С11 есть ещё https://github.com/vnmakarov/mir.
Динамическая JIT компиляция С/С++ в LLVM с помощью Clang