Я работаю над высокопроизводительной системой, написанной на C ++. Процесс должен уметь понимать некоторую сложную логику (правила) во время выполнения, написанную на простом языке, разработанном для этого приложения. У нас есть два варианта:
Интерпретируйте логику — запустите встроенный интерпретатор и сгенерируйте динамический вызов функции, который при получении данных на основе интерпретируемой логики работает с данными
Скомпилируйте логику в динамический разделяемый файл plugin.so, используйте dlopen, dlsym для загрузки плагина и вызова логической функции во время выполнения.
Вариант 2 выглядит действительно привлекательным, так как он будет оптимизирован для машинного кода, будет работать намного быстрее, чем встроенный интерпретатор в этом процессе.
Варианты, которые я изучаю:
Если я прав, LLVM IR преобразуется в байт-код LLVM или код сборки. Затем либо LLVM JIT используется для запуска в режиме JIT, либо используется GNU Assembler для генерации собственного кода.
Можно ли найти функцию в LLVM, которая делает это? Было бы намного лучше, если бы все это делалось из кода, а не с помощью системной команды из C ++ для вызова «as» для генерации файла plugin.so для моего требования.
Пожалуйста, дайте мне знать, если вы знаете, каким образом я могу генерировать собственный двоичный код общей библиотеки из моего процесса во время выполнения.
llc — инструмент llvm, который выполняет преобразование двоичного кода в LLVM-IR. Я думаю, что это все, что вам нужно.
По сути, вы можете создать свой IR LLVM так, как хотите, а затем позвонить в llc по вашему IR.
Вы можете вызвать его из командной строки или перейти к реализации llc и выяснить, как это работает в ваших собственных программах.
Вот полезная ссылка:
http://llvm.org/docs/CommandGuide/llc.html
Я надеюсь, что это помогает.
Других решений пока нет …