Есть ли способ конвертировать из строки в чистый код в С++?
Я знаю, что его можно читать из .txt файла, а затем преобразовывать различные части этого в строки, char и int значения, но можно ли взять строку и использовать ее в качестве реального кода в программе
Код:
string codeblock1="cout<<This is a test;";
string codeblock2="int array[5]={0,6,6,3,5};}";
int i;
cin>>i;
if(i)
{
execute(codeblock1);
}
else
{
execute(codeblock2);
}
Где execute
- это функция, которая преобразует текст в реальный код (я не знаю, есть ли на самом деле функция, называемая execute, я использую ее для моего примера).
Ответы
Ответ 1
Вы можете создать функцию и проанализировать все строки, которые вам нравятся, и создать из нее структуру данных. Это известно как дерево разбора. Впоследствии вы можете изучить дерево разбора и создать необходимые динамические структуры для выполнения логики therin. Затем дерево разбора преобразуется в исполняемое представление времени выполнения.
Все компиляторы делают именно это. Они берут ваш код и производят машинный код на основе этого. В вашем конкретном случае вам нужен язык для написания кода для себя. Обычно это делается в контексте генератора кода и является частью более крупного процесса сборки. Если вы пишете программу для синтаксического анализа своего языка (рассмотрите flex и bison для этой операции), который генерирует код, вы можете достичь желаемых результатов.
Ответ 2
В С++ нет простого способа сделать это. Эта функция доступна на языках более высокого уровня, таких как Python, Lisp, Ruby и Perl (обычно с некоторым изменением функции eval
). Однако даже на этих языках эта практика не одобряется, потому что это может привести к очень нечитаемому коду.
Очень важно спросить себя (и, возможно, рассказать нам), почему вы хотите это сделать?
Или вы только хотите знать, возможно ли это? Если так, то это, хотя и в волосатой манере. Вы можете написать исходный файл на С++ (сгенерировать все, что захотите, до тех пор, пока оно будет действительным С++), затем скомпилировать его и связать с вашим кодом. Разумеется, все это можно сделать автоматически, пока компилятор доступен вам во время выполнения (и вы просто выполняете его с помощью system
). Я знаю кого-то, кто сделал это для некоторой тяжелой оптимизации. Это не очень, но можно заставить работать.
Ответ 3
Многие языки сценариев предлагают такую функцию, полностью возвращаясь к eval
в LISP, но C и С++ не выставляют компилятор во время выполнения.
В спецификации нет ничего, что помешало бы вам создавать и выполнять какой-либо произвольный машинный язык, например:
char code[] = { 0x2f, 0x3c, 0x17, 0x43 }; // some machine code of some sort
typedef void (FuncType*)(); // define a function pointer type
FuncType func = (FuncType)code; // take the address of the code
func(); // and jump to it!
но в большинстве случаев произойдет сбой, если вы попробуете это по соображениям безопасности. (Многие вирусы работают, убеждая обычные программы делать что-то вроде этого.)
В обычной среде одна вещь, которую вы могли бы сделать, - создать полную программу в виде текста, а затем вызвать компилятор для его компиляции и вызвать полученный исполняемый файл.
Если вы хотите запустить код в своем собственном пространстве памяти, вы можете вызвать компилятор для создания библиотеки DLL (или .so, в зависимости от вашей платформы), а затем связать ее с DLL и перейти в нее.
Ответ 4
Во-первых, я хотел сказать, что я никогда не реализовал что-то подобное, и я, возможно, ушел, однако, вы пробовали класс CodeDomProvider
в пространстве имен System.CodeDom.Compiler
? Я чувствую, что классы в System.CodeDom
могут предоставить вам функциональность, которую вы ищете.
Конечно, все это будет .NET-код, а не любая другая платформа
Перейти здесь для примера
Ответ 5
Да, вам просто нужно создать компилятор (и, возможно, линкер), и вы там.
Несколько языков, таких как Python, могут быть встроены в C/С++, поэтому это может быть вариант.
Ответ 6
Это своего рода возможный, но не только прямой C/С++. Вам понадобится слой под LLVM.
Отъезд c-repl и ccons
Ответ 7
Один из способов сделать это - Boost Python. В этот момент вы не будете использовать С++, но это хороший способ позволить пользователю использовать язык сценариев для взаимодействия с существующей программой. Я знаю, что это не совсем то, что вы хотите, но, возможно, это может помочь.
Ответ 8
Похоже, вы пытаетесь создать "С++ Script", который, насколько мне известно, не существует. С++ - это скомпилированный язык. Это означает, что он всегда должен быть скомпилирован в собственный байт-код перед выполнением. Вы можете обернуть код как функцию, запустить его через компилятор, а затем запустить результирующую DLL динамически, но вы не получите доступ ко всему, что обычно не скомпилировала DLL.
Вам лучше попытаться сделать это в Java, JavaScript, VBScript или .NET, которые на одном или другом языке интерпретируются. Большинство этих языков либо имеют функцию eval
, либо execute
для этого, либо могут быть include
d в качестве текста.
Конечно, выполнение блоков кода не самая безопасная идея - это оставит вас уязвимыми для всех видов атак на выполнение данных.
Моя рекомендация заключалась бы в создании языка сценариев, который служит целям вашего приложения. Это предоставит пользователю ограниченный набор инструкций по соображениям безопасности и позволит вам взаимодействовать с существующей программой гораздо динамически, чем скомпилированный внешний блок.
Ответ 9
Не легко, потому что С++ - это скомпилированный язык. Несколько человек указали вокруг способов заставить его работать - либо выполнить компилятор, либо включить в свою программу компилятор или интерпретатор. Если вы хотите перейти на маршрут интерпретатора, вы можете сэкономить много работы, используя существующий проект с открытым исходным кодом, например Lua