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

Если ни один из вышеперечисленных ответов не сработал для вас, просто закройте свою IDE IntelliJ и удалите файл и папку intelliJ IDE из корня проекта:

rm -rf .idea *.iml 

Затем откройте проект с помощью intelliJ. Теперь он должен работать.

11
задан GEOCHET 1 June 2009 в 16:48
поделиться

9 ответов

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

Все компиляторы делают именно это. Они берут ваш код и производят машинный код на основе этого. В вашем конкретном случае вы хотите, чтобы язык писал код для себя. Обычно это делается в контексте генератора кода и является частью более крупного процесса сборки. Если вы напишите программу для синтаксического анализа вашего языка (для этой операции используйте гибкость и бизон), которая генерирует код, вы можете достичь желаемых результатов.

3
ответ дан 3 December 2019 в 08:05
поделиться

Во-первых, я хотел сказать, что я никогда сам не реализовывал нечто подобное, и, может быть, я ушел, хотя вы пробовали класс CodeDomProvider в системе .CodeDom.Compiler пространство имен? Я чувствую, что классы в System.CodeDom могут предоставить вам ту функциональность, которую вы ищете.

Конечно, это будет код .NET, а не любая другая платформа

Go здесь для примера

1
ответ дан 3 December 2019 в 08:05
поделиться

Многие языки сценариев предлагают такую ​​функцию, начиная с eval в LISP - но C и 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!

, но большинство сред потерпит крах, если вы попытаетесь это сделать из соображений безопасности. (Многие вирусы работают, убеждая обычные программы сделать что-то вроде этого.)

В обычной среде вы могли бы создать единую программу в виде текста, а затем вызвать компилятор, чтобы скомпилировать ее, и вызвать полученный исполняемый файл.

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

3
ответ дан 3 December 2019 в 08:05
поделиться

В C ++ нет простого способа сделать это. Эта функция доступна в языках более высокого уровня, таких как Python, Lisp, Ruby и Perl (обычно с некоторыми вариациями функции eval ). Однако даже на этих языках эта практика не одобряется, поскольку она может привести к очень нечитаемому коду.

Важно, чтобы вы спросили себя (и, возможно, сказали нам), почему вы хотите это сделать?

Или вы хотите только узнать, возможно ли это? Если это так, то это хоть и волосатым способом. Вы можете написать исходный файл C ++ (сгенерировать в нем все, что вы хотите, если это действительно C ++), затем скомпилировать его и связать с вашим кодом. Конечно, все это можно делать автоматически, если компилятор доступен вам во время выполнения (и вы просто выполняете его с помощью системы ). Я знаю кого-то, кто сделал это для тяжелой оптимизации. Это не красиво, но можно заставить работать.

8
ответ дан 3 December 2019 в 08:05
поделиться

Да, вам просто нужно собрать компилятор (и, возможно, компоновщик), и вы здесь.

Несколько языков, таких как Python, могут быть встроены в C / C ++, так что это может быть опцией.

0
ответ дан 3 December 2019 в 08:05
поделиться

Это вроде как возможно, но не с простым C / C ++. Вам понадобится слой под ним, такой как LLVM.

Ознакомьтесь с c-repl и ccons

0
ответ дан 3 December 2019 в 08:05
поделиться

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

0
ответ дан 3 December 2019 в 08:05
поделиться

Звучит так, будто вы пытаетесь создать «С ++ Script», которого, насколько я знаю, не существует. C ++ - это скомпилированный язык . Это означает, что он всегда должен быть скомпилирован в собственный байт-код перед выполнением. Вы могли бы обернуть код как функцию, запустить его через компилятор, а затем динамически выполнить полученную DLL, но вы не получите доступа к тому, что скомпилированная DLL обычно не получит.

Вы были бы лучше не пытаться делать это в Java, JavaScript, VBScript или .NET, которые на том или ином этапе интерпретируются . Большинство из этих языков либо имеют для этого функцию eval или execute , либо могут просто включать d в качестве текста.

Конечно, выполнение блоков код не Самая безопасная идея - это сделает вас уязвимым для всех видов атак на выполнение данных.

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

0
ответ дан 3 December 2019 в 08:05
поделиться

Непросто, потому что C ++ - это компилируемый язык. Несколько человек указали разные способы заставить его работать - либо запустить компилятор, либо включить компилятор или интерпретатор в свою программу. Если вы хотите пойти по пути интерпретатора, вы можете сэкономить много работы, используя существующий проект с открытым исходным кодом, такой как Lua

0
ответ дан 3 December 2019 в 08:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: