我知道可以从.txt文件中读取然后将其中的各个部分转换为字符串,字符和整数值,但是是否可以获取字符串并将其用作程序中的实际代码?
码:
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的函数,我正在使用它来实现我的例子)。
您可以创建一个函数并解析您喜欢的任何字符串并从中创建数据结构。这称为解析树。随后,您可以检查解析树并生成必要的动态结构以执行逻辑运算。随后将解析树转换为执行的运行时表示。
所有编译器都是这样做的。他们接受您的代码并根据此生成机器代码。在您的特定情况下,您希望语言为自己编写代码。通常,这是在代码生成器的上下文中完成的,它是更大的构建过程的一部分。如果您编写一个程序来解析您的语言(考虑使用flex和bison进行此操作)生成代码,您可以获得所需的结果。
在C ++中,没有简单的方法可以做到这一点。此功能适用于更高级别的语言,如Python,Lisp,Ruby和Perl(通常有一些变体 eval
功能)。但是,即使在这些语言中,这种做法也是不受欢迎的,因为它会导致代码非常难以理解。
重要的是你问自己(也许告诉我们)你为什么要这样做?
或者你只是想知道它是否可能?如果是这样的话,那就是毛茸茸的。你可以编写一个C ++源文件(生成你想要的任何内容,只要它是有效的C ++),然后编译它并链接到你的代码。当然,只要编译器在运行时可用(并且您只需执行它),所有这一切都可以自动完成 system
)。我知道有人曾经做过一次重大优化。它不漂亮,但可以使用。
许多脚本语言提供了这种功能,一直回到过去 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!
但出于安全考虑,如果您尝试这样做,大多数环境都会崩溃。 (许多病毒通过说服普通程序来做这样的事情来工作。)
在正常环境中,您可以做的一件事是创建一个完整的程序作为文本,然后调用编译器来编译它并调用生成的可执行文件。
如果您想在自己的内存空间中运行代码,可以调用编译器来构建DLL(或.so,具体取决于您的平台),然后链接DLL并跳转到它。
首先,我想说,我从来没有实现过类似的东西,但我可能会离开,但是,你试过了吗? CodeDomProvider
上课 System.CodeDom.Compiler
命名空间?我感觉上课了 System.CodeDom
可以为您提供您正在寻找的功能。
当然,它都是.NET代码,而不是任何其他平台
走 这里是样品
是的,你只需要构建一个编译器(可能还有一个链接器)就可以了。
可以将诸如Python之类的几种语言嵌入到C / C ++中,这可能是一种选择。
这有点可能,但不仅仅是直接的C / C ++。你需要一些底层,比如LLVM。
查看 C-REPL 和 CCONS
你可以做到这一点的一种方法是 提升Python。此时您不会使用C ++,但它是允许用户使用脚本语言与现有程序交互的好方法。我知道这不是你想要的,但也许它可能有所帮助。
听起来你正在尝试创建“C ++脚本”,据我所知,它并不存在。 C ++是一个 编译语言。这意味着它必须在执行之前始终编译为本机字节码。您可以将代码作为函数包装,通过编译器运行,然后动态执行生成的DLL,但是您不会访问编译的DLL通常不会获得的任何内容。
您最好尝试在Java,JavaScript,VBScript或.NET中执行此操作,这些都处于一个阶段或另一个阶段 解释语言。大多数这些语言都有 eval
要么 execute
功能就是这个,或者可以只是 include
d作为文本。
当然,执行代码块并不是最安全的想法 - 它会让您容易受到各种数据执行攻击。
我的建议是创建一个服务于您的应用程序的脚本语言。出于安全原因,这将为用户提供有限的指令集,并允许您比编译的外部块更加动态地与现有程序交互。