Горячая перекомпиляция для C ++ - PullRequest
9 голосов
/ 20 августа 2011

Недавно я был поражен, увидев, что Java-код автоматически перекомпилируется и внедряется в работающую программу. Поскольку современные компиляторы C ++ (например, на основе LLVM) начинают исследовать JIT-компиляцию, мне интересно, есть ли работы по этой теме.

Обновление: Под «горячей перекомпиляцией» я имею в виду редактирование кода, перекомпиляцию определенной части исполняемого файла и запуск его без перезапуска программы. Обычный вариант использования - игровой движок с бесконечным циклом, в котором вы можете редактировать некоторый код на этапе рендеринга и видеть изменения в следующем кадре.

В каком состоянии находится горячая перекомпиляция для C ++? Есть ли рабочая реализация?

Ответы [ 2 ]

10 голосов
/ 20 августа 2011

Это возможно , что под "горячей перекомпиляцией" вы подразумеваете что-то вроде "Редактировать и продолжить" в Visual C ++.

Возможно, эта ссылка представляет собой ответ на вашвопрос.

Но было бы проще, если бы вы определили термин, о котором вы спрашиваете, «горячая перекомпиляция», более четко (как я пишу, это не очень хорошо определено).

добавлено : «Изменить и продолжить» для C ++ было, по-видимому, введено с Visual C ++ 6.0 в 1990-х годах.Так что только немного удивительно, что некоторые реализации Java могут сделать это сейчас. Однако переключатель /Zi, который позволяет редактировать и продолжать, также, насколько я помню, изменяет поведение __LINE__, так что, например, оригинальная реализация ScopeGuard не работает (одинзатем должен использовать Microsoft __COUNTER__).

Cheers & hth.,

2 голосов
/ 20 августа 2011

С automatically recompiled and injected into a running program. Я предполагаю, что вы говорите о том, что JVM фактически наблюдает за выполнением программы и, например, изменяет прогнозируемые значения ветвлений во время выполнения, чтобы минимизировать переходы и отмену конвейеризации.

Это можно сделать в Javaпотому что существует отдельная четко определенная промежуточная стадия между исходным кодом и фактическими машинными инструкциями.Это позволило бы ему заменить промежуточный код во время выполнения, возможно, улучшив производительность.

В C ++ программа встроена непосредственно в машинный язык конкретной архитектуры, а на большинстве аппаратных средств кодовые страницы читаются только по разным причинам, включая предотвращение случайногои изменения вредоносного кода.

Теперь, что вы могли бы сделать в C ++, это использовать что-то вроде библиотеки Clang для перестройки разделов кода в общий объект, а затем использовать dlopen и т. д. для открытияперекомпилированный общий объект, чтобы выбрать новую версию машинного кода.Это, конечно, требует, чтобы ваша программа была намного умнее, чем Java-программа, чтобы использовать преимущества JVM.Я полагаю , что в g ++ / gprof есть режим, в котором данные профилирования могут использоваться, чтобы повлиять на оптимизацию g ++, может, это то, что вы ищете?

...