Как я могу динамически компилировать и перезагружать пользовательский код C++ во время выполнения (например, горячую перC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как я могу динамически компилировать и перезагружать пользовательский код C++ во время выполнения (например, горячую пер

Сообщение Anonymous »

Я хочу создать небольшую программу на C++ со встроенным базовым редактором и окном предварительного просмотра, в котором отображается изображение/текстура/набор пикселей.
Пользовательский интерфейс будет состоять из двух столбцов: слева пользователь может вводить код C++, а справа находится окно предварительного просмотра, в котором отображается изображение/текстура/набор пикселей. Цель — создать что-то похожее на редактор p5.js.
Пример эскиза, который напишет пользователь:

Код: Выделить всё

// sketch.cpp

// global state...

// setup() runs once
void setup();

// draw() runs once per "tick", e.g., 30 times a second
void draw();
Должна быть возможность предоставить пользователю API, например, функции и «встроенные» переменные. Например, такая функция:

Код: Выделить всё

void create_canvas(uint32_t width, uint32_t height);
который, как ожидается, будет вызываться из setup().
Когда пользователь нажимает кнопку Выполнить, я хочу взять код из редактора, скомпилировать его и «встроить» в внутренний механизм, который вызывает setup() один раз, а затем повторно вызывает draw() в каждом кадре.

Примерно, как я это делаю представление работы системы:
  • Основное приложение предоставляет редактор и окно рендеринга, написанное на C++ и использующее, например, GLFW/SDL и ImGUI для окон и пользовательского интерфейса соответственно.
  • Когда пользователь нажимает Выполнить, программа сохраняет пользовательский код во временный файл .cpp.
  • Этот код компилируется в файл общая библиотека ( в Linux/macOS, .dll в Windows).
  • Затем основное приложение загружает эту общую библиотеку во время выполнения.
  • Приложение находит и вызывает setup() и draw() из этой библиотеки.
  • Когда пользователь снова редактирует код и нажимает Выполнить, приложение выгружает старую библиотеку и загружает новую, фактически давая «живой» update».
Идея состоит в том, что мы каким-то образом внедряем код, который пишет пользователь, в наше приложение, чтобы мы могли его запустить. Я не знаю, возможно ли это, я не настолько опытен, когда дело касается библиотек и внедрения кода.

Более конкретно, я не уверен в том, как правильно и безопасно справиться с этой живой перезагрузкой:
  • Как я могу безопасно выгрузить и перезагрузить общую библиотеку, которая используется в каждом кадре?
  • Есть ли там рекомендуемые шаблоны для сохранения некоторого состояния (например, определяемых пользователем глобальных переменных или содержимого холста) между перезагрузками? Я не думаю, что на самом деле хочу сохранить какое-либо состояние, поскольку считаю приемлемым просто перезагрузить все для будущего использования. Я по-прежнему спрашиваю об этом в основном из соображений производительности, например, потенциально может быть полезно избежать перераспределения памяти между перезагрузками, если пользовательский код сложный и «тяжелый». Мне любопытно, вот и все.
  • Лучше ли запускать пользовательский код в отдельном процессе и взаимодействовать через межпроцессное взаимодействие (IPC), чем загружать/выгружать общие библиотеки в одном и том же процессе?
  • Существуют ли какие-либо фреймворки, движки или примеры, которые уже реализуют подобную перезагрузку живого кода C++?
По сути, я пытаюсь воспроизвести Рабочий процесс p5.js «редактировать-запустить-немедленно просмотреть выходные данные», но с собственным C++.
Любые указатели, шаблоны проектирования или реальные примеры (игровые движки, плагины и т. д.), которые делают это, будут очень полезны.
РЕДАКТИРОВАТЬ: Программа должна использоваться только мной в изолированной автономной среде. Код может редактироваться только одним человеком одновременно, а именно человеком, который запускает программу в своей изолированной автономной среде. Таким образом, проблемы безопасности, которые естественным образом возникают, когда речь идет о внедрении и запуске кода в приложение, которое вы запускаете, в моем конкретном случае по сути не являются проблемой.

Подробнее здесь: https://stackoverflow.com/questions/798 ... e-hot-relo
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»