编译简单的字符串

只是想知道c ++ OR c#中是否有任何内置函数可以让你在运行时使用编译器? 例如,如果我想翻译:

!print "hello world"; 

成:

 MessageBox.Show("hello world"); 

然后生成一个exe,然后才能显示上面的消息? 我几年前在网上看到过这样做的样本项目,但是找不到它了。

可以使用C#。 从CodeProject看一下这个示例项目 。

代码提取

 private Assembly BuildAssembly(string code) { Microsoft.CSharp.CSharpCodeProvider provider = new CSharpCodeProvider(); ICodeCompiler compiler = provider.CreateCompiler(); CompilerParameters compilerparams = new CompilerParameters(); compilerparams.GenerateExecutable = false; compilerparams.GenerateInMemory = true; CompilerResults results = compiler.CompileAssemblyFromSource(compilerparams, code); if (results.Errors.HasErrors) { StringBuilder errors = new StringBuilder("Compiler Errors :\r\n"); foreach (CompilerError error in results.Errors ) { errors.AppendFormat("Line {0},{1}\t: {2}\n", error.Line, error.Column, error.ErrorText); } throw new Exception(errors.ToString()); } else { return results.CompiledAssembly; } } public object ExecuteCode(string code, string namespacename, string classname, string functionname, bool isstatic, params object[] args) { object returnval = null; Assembly asm = BuildAssembly(code); object instance = null; Type type = null; if (isstatic) { type = asm.GetType(namespacename + "." + classname); } else { instance = asm.CreateInstance(namespacename + "." + classname); type = instance.GetType(); } MethodInfo method = type.GetMethod(functionname); returnval = method.Invoke(instance, args); return returnval; } 

在C ++中,您不能在运行时使用编译器,但可以在项目中嵌入解释器,如CINT。

你总是可以用脏的方式来做,用system()并调用编译器“gcc …”或你的等价物

尼克的建议很好,但有一种替代方案可能更容易实施(但可能并不适合所有项目)。 如果您可以假设您的用户已安装了编译器,则可以生成文件,然后使用其编译器对其进行编译。

.NET框架提供了一些类,使您可以访问C#和VB.NET的编译器和代码生成器,从而导致程序集加载到内存或简单的.exe文件中。 请参阅CSharpCodeProvider和本文 。

或者,您可以只创建源文件并手动编译它们(命令行调用( system )到编译器,makefile)。

关于你的源代码的翻译:你必须在这里使用像正则表达式这样的解析机制,或者使用像Coco / R,yacc等编译器编译器工具。(注意在C ++下, boost::spirit也很有用)

在C#中,您可以创建一个.NET“CodeDom”树,然后使用.NET编译器对其进行编译。 这使您可以完全访问.NET的大多数function。

有关详细信息,请参阅CodeCompileUnit的“System.CodeDom”命名空间或MSDN帮助 。