只是想知道 c++ 或 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 和 本文。
或者,您也可以只创建源文件并手动编译它们(对编译器、makefile 的命令行调用 (
system
))。
关于源代码的翻译:您必须在这里使用正则表达式等解析机制,或者使用 Coco/R、yacc 等编译器-编译工具。(请注意,在 C++ 下,
boost::spirit
也非常有用)
在 C# 中,您可以创建一个 .NET“CodeDom”树,然后使用 .NET 编译器对其进行编译。这使您可以完全访问 .NET 的大多数功能。
有关详细信息,请参阅“System.CodeDom”命名空间或 CodeCompileUnit 的 MSDN 帮助。