Я работаю над высокопроизводительной системой, написанной на С++. Этот процесс должен быть способен понять сложную логику (правила) во время выполнения, написанную на простом языке, разработанном для этого приложения. У нас есть два варианта:
-
Интерпретировать логику - запустить встроенный интерпретатор и создать динамический вызов функции, который при приеме данных на основе интерпретируемой логики работает с данными
-
Скомпилируйте логику в динамический общий файл plugin.so, используйте dlopen, dlsym для загрузки плагина и функции логической логики во время выполнения
Вариант 2 выглядит действительно привлекательным, поскольку он будет оптимизирован машинным кодом, будет работать намного быстрее, чем встроенный интерпретатор в этом процессе.
Параметры, которые я изучаю:
- написать компиляцию метода компиляции (строковая логика, список и ошибки, список и предупреждения)
- здесь логика ввода - это строка, содержащая логический код в нашем пользовательском языке
- он генерирует llvm ir, возвращаемое значение метода компиляции возвращает строку ir
- написать метод ссылки bool link (строка ir, имя файла строки, список и ошибки, список и предупреждения)
- для метода ссылок я искал документацию llvm, но мне не удалось выяснить, есть ли возможность написать такой метод.
Если я прав, LLVM IR преобразуется в байт-код LLVM или код сборки. Затем либо LLVM JIT используется для запуска в режиме JIT, либо для использования GNU Assembler используется для генерации собственного кода.
Можно ли найти функцию в LLVM, которая это делает? Было бы намного лучше, если бы все было сделано из кода, а не с помощью системной команды из С++, чтобы вызывать "как" для генерации файла plugin.so для моего требования.
Пожалуйста, дайте мне знать, знаете ли вы, каким образом я могу генерировать собственный двоичный код общей библиотеки из моего процесса во время выполнения.