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