當前位置:首頁 » 編程軟體 » 動態編譯器

動態編譯器

發布時間: 2023-01-11 20:23:53

① 如何用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,程序才能在別的電腦上跑起來。

希望對你有幫助

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:593
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:888
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:582
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:765
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:684
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1013
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:255
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:114
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:806
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:713