Есть ли способ конвертировать из строки в чистый код в С++?

Я знаю, что его можно читать из .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