动态编译器
① 如何用C#动态编译,执行代码
代码如下:
/*
*使用C#动态编译代码和执行
*作者:yaob
*/
staticvoidMain(string[]args)
{
//编译器
CodeDomProvidercdp=CodeDomProvider.CreateProvider("C#");
//编译器的参数
CompilerParameterscp=newCompilerParameters();
cp.ReferencedAssemblies.Add("System.dll");
cp.GenerateExecutable=false;
cp.GenerateInMemory=true;
//编译结果
CompilerResultscr=cdp.CompileAssemblyFromSource(cp,HelloWorld());
if(cr.Errors.HasErrors)Console.WriteLine("编译出错!");
else
{
//编译后的程序集
Assemblyass=cr.CompiledAssembly;
//得到HelloWorld类中的SayHello方法
Typetype=ass.GetType("HelloWorld.HelloWorld");
MethodInfomi=type.GetMethod("SayHello");
//执行
mi.Invoke(null,null);
}
}
//动态构建的代码
staticstringHelloWorld()
{
StringBuildersbCode=newStringBuilder();
sbCode.AppendLine("usingSystem;");
sbCode.AppendLine("namespaceHelloWorld");
sbCode.AppendLine("{");
sbCode.AppendLine("classHelloWorld");
sbCode.AppendLine("{");
sbCode.AppendLine("publicstaticvoidSayHello()");
sbCode.AppendLine("{");
sbCode.AppendLine("Console.WriteLine("Hello~World~!");");
sbCode.AppendLine("}");
sbCode.AppendLine("}");
sbCode.AppendLine("}");
returnsbCode.ToString();
}
② 动态编译和静态编译哪个快
动态编译快。动态编译相比较静态编译具有速度快,节省系统资源,利于扩展的优点。使用动态编译的执行环境一开始几分钟执行慢,完成大部分的编译和再编译后,会执行快。
③ 怎么动态编译Java源文件
(Write once, run anywhere)” 的目标。Java类文件中包含的字节代码可以被不同平台上的JVM所使用。Java字节代码不仅可以以文件形式存在于磁盘上,也可以通过网络方式来下载,还可以只存在于内存中。JVM中的类加载器会负责从包含字节代码的字节数组(byte[])中定义出Java类。在某些情况下,可能会需要动态的生成 Java字节代码,或是对已有的Java字节代码进行修改。这个时候就需要用到本文中将要介绍的相关技术。首先介绍一下如何动态编译Java源文件。
动态编译Java源文件
在一般情况下,开发人员都是在程序运行之前就编写完成了全部的Java源代码并且成功编译。对有些应用来说,Java源代码的内容在运行时刻才能确定。这个时候就需要动态编译源代码来生成Java字节代码,再由JVM来加载执行。典型的场景是很多算法竞赛的在线评测系统(如PKU JudgeOnline),允许用户上传Java代码,由系统在后台编译、运行并进行判定。在动态编译Java源文件时,使用的做法是直接在程序中调用Java编译器。
JSR 199引入了Java编译器API。如果使用JDK 6的话,可以通过此API来动态编译Java代码。比如下面的代码用来动态编译最简单的Hello World类。该Java类的代码是保存在一个字符串中的。
publicclassCompilerTest{
publicstaticvoidmain(String[]args)throwsException{
Stringsource="publicclassMain{publicstaticvoidmain(String[]args){System.out.println(\"HelloWorld!\");}}";
JavaCompilercompiler=ToolProvider.getSystemJavaCompiler();
=compiler.getStandardFileManager(null,null,null);
=newCompilerTest.StringSourceJavaObject("Main",source);
Iterable<extendsJavaFileObject>fileObjects=Arrays.asList(sourceObject);
CompilationTasktask=compiler.getTask(null,fileManager,null,null,null,fileObjects);
booleanresult=task.call();
if(result){
④ 静态编译和动态编译有何不同
静态编译与动态编译的区别:
1、动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令。
所以其优点一方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源。
缺点一是哪怕是很简单的程序,只用到了链接库中的一两条命令,也需要附带一个相对庞大的链接库;二是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文件就不能运行。
2、静态编译就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。所以其优缺点与动态编译的可执行文件正好互补。
⑤ C/C++不能运行时动态编译代码,编写公式编辑器,用户输入循环判断语句保存后执行该怎么实现啊
这个需要实现一个简单得编译器,需要对编译原理比较精通,不是三两句就搞定得
这不是C++,只是一些简单得逻辑
⑥ 如何用C#动态编译,执行代码
如何用C#动态编译、执行代码
在开始之前,先熟悉几个类及部分属性、方法:CSharpCodeProvider、ICodeCompiler、CompilerParameters、CompilerResults、Assembly。
一、CSharpCodeProvider
提供对C#代码生成器和代码编译器的实例的访问。如果要动态生成VB代码,可以使用VBCodeProvider。
CreateCompiler():获取编译器的实例。
二、ICodeCompiler
定义用于调用源代码编译的接口或使用指定编译器的CodeDOM树。每种编译方法都接受指示编译器的CompilerParameters对象,并返回指示编译结果的CompilerResults对象。
CompilerAssemblyFromSource(CompilerParameters option, string source):使用指定的编译器,从包含源代码的字符串设置编译程序集。
三、CompilerParameters
表示用于调用编译器的参数。
ReferencedAssemblies:获取当前项目所引用的程序集。Add方法为程序集添加引用。
GenerateExecutable:获取或设置一个值,该值指示是否生成可执行文件。若此属性为false,则生成DLL,默认是false。
GenerateInMemory:获取或设置一个值,该值指示是否在内存中生成输出。
四、CompilerResults
表示从编译器返回的编译结果。
CompiledAssembly:获取或设置以编译的程序集,Assembly类型。
五、Assembly
就是程序集了(不知道如何描述了)。
大致了解了以上知识之后,就可以使用C#动态的编译并执行代码了,一下是一段示例程序:using System;
using System.Reflection;
using System.Globalization;
using Microsoft.CSharp;using System.CodeDom;
using System.CodeDom.Compiler;using System.Text;
namespace ConsoleApplication1
{ public class Program
{ static void Main(string[] args)
{ // 1.CSharpCodePrivoder
CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider(); // 2.ICodeComplier
ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler(); // 3.CompilerParameters
CompilerParameters objCompilerParameters = new CompilerParameters();
objCompilerParameters.ReferencedAssemblies.Add("System.dll");
objCompilerParameters.GenerateExecutable = false;
objCompilerParameters.GenerateInMemory = true; // 4.CompilerResults
CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, GenerateCode()); if (cr.Errors.HasErrors)
{
Console.WriteLine("编译错误:"); foreach (CompilerError err in cr.Errors)
{
Console.WriteLine(err.ErrorText);
}
} else
{ // 通过反射,调用HelloWorld的实例
Assembly objAssembly = cr.CompiledAssembly; object objHelloWorld = objAssembly.CreateInstance("DynamicCodeGenerate.HelloWorld");
MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");
Console.WriteLine(objMI.Invoke(objHelloWorld, null));
}
Console.ReadLine();
} static string GenerateCode()
{
StringBuilder sb = new StringBuilder();
sb.Append("using System;");
sb.Append(Environment.NewLine);
sb.Append("namespace DynamicCodeGenerate");
sb.Append(Environment.NewLine);
sb.Append("{");
sb.Append(Environment.NewLine);
sb.Append(" public class HelloWorld");
sb.Append(Environment.NewLine);
sb.Append(" {");
sb.Append(Environment.NewLine);
sb.Append(" public string OutPut()");
sb.Append(Environment.NewLine);
sb.Append(" {");
sb.Append(Environment.NewLine);
sb.Append(" return \"Hello world!\";");
sb.Append(Environment.NewLine);
sb.Append(" }");
sb.Append(Environment.NewLine);
sb.Append(" }");
sb.Append(Environment.NewLine);
sb.Append("}"); string code = sb.ToString();
Console.WriteLine(code);
Console.WriteLine(); return code;
}
}
}
⑦ c# 动态编译
要用到C#的编译器、反射功能,自己瞧着去吧
using System;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection;
public class Example
{
static void Main()
{
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameter = new CompilerParameters();
parameter.ReferencedAssemblies.Add("System.dll");
parameter.GenerateExecutable = false;
parameter.GenerateInMemory = true;
CompilerResults result = provider.CompileAssemblyFromSource(parameter,
CreateCode("256*56*(145+56.0*254/345)"));//将你的式子放在这里
if (result.Errors.Count > 0)
{
Console.WriteLine("动态编译出错了!");
}
else
{
Assembly assembly = result.CompiledAssembly;
Type AType = assembly.GetType("ANameSpace.AClass");
MethodInfo method = AType.GetMethod("AFunc");
Console.WriteLine(method.Invoke(null, null));
}
Console.Read();
}
static string CreateCode( string para)
{
return "using System; namespace ANameSpace{static class AClass{public static object AFunc(){return "+para+";}}}";
}
}
⑧ 什么是qt动态编译
你好
说简单点,你打开一些安装后的文件,比如在windows系统,会有一些dll文件。这些文件是程序运行过程中,按照需要动态加载级内存,如果暂时用不着某个功能,把dll从内存释放就行了。
动态编译的好处是exe文件小,适合版本升级(替换dll文件就行了)。
静态编译,就是只有一个exe文件,比较适合小程序,不升级的程序。
我们写qt,写着玩,qt默认是动态编译,其实我们的功能很简单,但不得不加载一堆dll,好几十M,程序才能在别的电脑上跑起来。
希望对你有帮助
