2013-07-31 3 views
1

Я использую C++ (в xcode и code :: blocks), я мало знаю. Я хочу сделать что-то компилируемое во время выполнения.C++ добавить новый код во время выполнения

для например:

char prog []={"cout<<"helloworld " ;} 

Он должен компилировать содержимое прог. Я читал немного о quines, но это не помогло мне.

+1

Вы можете вызвать компилятор из своей программы, скомпилировать файл, который вы можете создать в своей программе, и запустить результат из вашей программы. –

+2

Есть ли новый код * have * для C++? Язык не может этого сделать, но вы можете смонтировать что-то там, где вы пишете код в файл и вызывать компилятор. Я бы не рекомендовал его. Если это не должно быть C++, я слышал хорошие вещи о вложении [Lua] (http://www.lua.org/). – BoBTFish

+0

Я думаю, пришло из фона Python! –

ответ

6

Это возможно, но не переносимо, а не просто. В принципе, вам нужно написать код в файл, затем скомпилировать его в dll (вызывать компилятор с помощью system) и , а затем загрузить DLL. Первый прост, последний не слишком сложный (но потребует конкретного кода реализации), но средний шаг может быть сложным: очевидно, он работает только, если компилятор установлен в системе, но вы должны найдите , где он установлен, убедитесь, что он является той же версией (или , по крайней мере, версией, которая генерирует двоичный совместимый код), вызывают его с теми же параметрами, которые были использованы при компиляции кода и обработке любых ошибок.

C++ не был предназначен для этого. (Скомпилированные языки вообще нет.)

1

Короткий ответ: «Нет, вы не можете этого сделать». C и C++ никогда не были предназначены для этого.

Это в значительной степени также длинный ответ на реальный вопрос, но я немного расширю несколько идей.

Код, который компилируется компилятором, определенно не является тривиальным, чтобы добавить вещи в. Есть несколько методов, которые могут быть использованы для «добавить больше кода» в программе:

  1. Добавление динамической разделяемой библиотеки (DLL), которая содержит код, который был скомпилирован отдельно существующего кода. Конечно, вы могли бы также иметь код в своей программе для вывода некоторого кода, скомпилировать этот код с компилятором, связать его с динамической библиотекой и загрузить его в свой код.

  2. Вы можете создать свой собственный небольшой генератор кода, который генерирует машинный код в куске памяти. Обратите внимание, что вам, вероятно, нужно вызвать функцию «специальной» функции выделения памяти, так как «нормальные» выделения памяти обычно не разрешены для выполнения - вам нужно выделить «с разрешением на выполнение» - VirtualAlloc в Windows имеет такой флаг и mmap в Linux/Unix вкусов тоже. И, конечно же, вы в значительной степени должны «быть компилятором» для достижения этого.

  3. Вы также можете придумать свой собственный интерпретируемый язык, который позволит вашей программе загружать, например, текстовый файл с командами/инструкциями, которые должны выполняться, или содержать текст внутри программы для выполнения с этим языком.

Но, как я сказал, чтобы начать с того, что это не то, что C и C++ (и большинство других скомпилированные языков) были предназначены для, так что это не будет так просто, как «придерживаться некоторых C++ код в строке , и заставить его работать ".

0

Это зависит от того, почему вы хотите это сделать.

Если это по соображениям эффективности - вы знаете, что функция делает только во время выполнения, но она должна быть очень эффективной - то, что уже было предложено (запись в файл, компиляция в dll/so и динамическая загрузка его) - ваш лучший вариант.

НО, если причина, по которой вы хотите, это разрешить поведение пользователя, скажем, общую функцию, которую вы читаете из базы данных (поведение или единичное значение в поле в сюжете?) - или, в общем, вы просто хочу изменить/увеличить поведение во время выполнения, не заботясь об эффективности, я рекомендую использовать внешний язык сценариев, такой как lua, который легко взаимодействует с вашим скомпилированным кодом на C++.

0

Языки C и C++ компилируются в двоичный машинный код, в отличие от Java и C#, которые генерируют инструкции для «виртуальной машины» или интерпретируют языки сценариев, такие как JavaScript. Компиляция C++ выполняется отдельным исполняемым файлом, компилятором, который не включен в результирующий исполняемый файл.

Таким образом, язык не имеет встроенной способности «eval» для перевода дополнительного кода после завершения компиляции.

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

Но если вы на самом деле нужны, чтобы быть в состоянии сделать это, ваши варианты:

  1. Написать код для компиляции нового исполняемого файла с новым кодом, а затем запустить полученную программу.
  2. Написать простой парсер и «виртуальную машину» свой собственный,
  3. Посмотрите на включение в/интерпретируемый язык встроенных сценариев, таких как Lua,
  4. Try и обернуть вокруг головы интеграции CINT,

См. Также: Scripting language for C++

Смежные вопросы