Рассмотрим следующую проблему:
Программа на C ++ может выдавать источник функции C ++, например, скажем, что она создаст строку с содержимым, как показано ниже:
std::vector<std::shared_ptr<C>> get_ptr_vec()
{
std::vector<std::shared_ptr<C>> vec;
vec.push_back(std::shared_ptr<C>(new C(val1)));
vec.push_back(std::shared_ptr<C>(new C(val2)));
vec.push_back(std::shared_ptr<C>(new C(val3)));
vec.push_back(std::shared_ptr<C>(new C(val4)));
return vec;
}
Значения val1
etc будет определен во время выполнения, когда программа создаст строку исходного кода выше. И этот источник будет записывать в файл, скажем, get_ptr_vec.cpp
,
Тогда другой программе на C ++ нужно будет прочитать этот исходный файл, скомпилировать его и вызвать get_ptr_vec
функция и получить объект, который он возвращает. Вроде как JIT-компилятор.
Есть ли способ, которым я могу сделать это? Я думаю, что одним из обходных путей будет наличие сценария, который скомпилирует файл и встроит его в общую библиотеку. И вторая программа может получить функцию через dlopen
, Тем не менее, есть ли в любом случае пропустить это и наличие второй программы для компиляции файла (без вызова system
). Обратите внимание, что вторая программа не сможет увидеть этот исходный файл во время компиляции. На самом деле, вероятно, тысячи таких небольших исходных файлов будут выпущены первой программой.
Чтобы немного рассказать об этом, первая программа создаст дерево выражений и сериализует дерево путем прохождения через порядок. Каждый узел дерева будет иметь строковое представление, записанное в файл. Вторая программа прочитает список узлов этого сериализованного дерева и должна будет иметь возможность восстановить этот список строк в список объектов C ++ (и позже из этого списка я могу восстановить дерево).
Я думаю, что фреймворк LLVM может что-то предложить Может кто-нибудь дать мне несколько советов по этому поводу? Не обязательно полный ответ, просто где-то для меня, чтобы начать.
Вы можете скомпилировать сгенерированный код с помощью clang и создать битовый код LLVM (-emit-llvm
флаг). Затем статически связывайте вашу программу с частями LLVM, которые читают файлы с битовым кодом и JIT-файлы. Наконец, возьмите скомпилированный битовый код и запустите на нем JIT, чтобы они были доступны в адресном пространстве вашей программы.
Других решений пока нет …