成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

怎樣理解IronPython編譯器

這篇文章將為大家詳細講解有關(guān)怎樣理解IronPython 編譯器,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

公司主營業(yè)務(wù):網(wǎng)站制作、成都網(wǎng)站設(shè)計、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出南明免費做網(wǎng)站回饋大家。

自 IronPython 正式發(fā)布以來,由于對 Python 語言的喜愛所驅(qū)使,同時我想藉此去了解一下編程語言的IronPython 編譯器,分析器等程序是什么原理,如何運作的,于是就開始進行IronPython 編譯器的學(xué)習(xí)了。

但代碼也看了有一段時間了,之前是看一些實現(xiàn)細節(jié),結(jié)果越看越糊涂?,F(xiàn)在我發(fā)現(xiàn)需要改變一下策略了,因為我們了解一個系統(tǒng)總是從對它的使用方法去開始了解,如果直接去了解底層的運作原理,則可能會迷失在代碼海洋里面。所以我也準備采取自頂而下的分析方法,撿軟柿子捏,從簡單的,宏觀的入手。至于具體的實現(xiàn)細節(jié),可以慢慢再深入研究。

直奔主題,我們看到 Compile() 方法,這是負責(zé)編譯的主控制方法。這個方法不難理解,我讀了一遍,注釋如下:

/// <summary> /// 編譯  /// </summary> public void Compile() {      string fullPath = Path.GetFullPath(outputAssembly);      string outDir = Path.GetDirectoryName(fullPath);      string fileName = Path.GetFileName(outputAssembly);       // Python 編譯器的接受池      PythonCompilerSink sink = new PythonCompilerSink(compilerSink);       // 程序集產(chǎn)生器      assemblyGen = new AssemblyGen(          Path.GetFileNameWithoutExtension(outputAssembly),          outDir, fileName, includeDebugInformation, staticTypes, executable, machine          );       // 是否以設(shè)定入口點(entry point)      bool entryPointSet = false;       // 設(shè)定默認的主文件(對非 DLL 的輸出文件類型而言)      if (mainFile == null && sourceFiles.Count == 1 && targetKind != PEFileKinds.Dll) {          mainFile = sourceFiles[0];      }       // 對每個源文件依次編譯      foreach (string sourceFile in sourceFiles) {          // 是否產(chǎn)生 Main 方法          bool createMainMethod = sourceFile == mainFile;          // 每個源代碼文件編譯為一個模塊          CompilePythonModule(sourceFile, sink, createMainMethod);           if (sink.Errors > 0) return;           if (createMainMethod) {              entryPointSet = true;          }      }

這段代碼中,調(diào)用到了 IronPython 編譯器自身的私有方法 CompilePythonModule() 來完成編譯模塊的功能。下面我們來看一下這個方法在做什么:

    // 依次將所有資源文件添加到程序集中      if (resourceFiles != null) {          foreach (ResourceFile rf in resourceFiles) {              assemblyGen.AddResourceFile(rf.Name, rf.File, rf.PublicResource ? ResourceAttributes.Public : ResourceAttributes.Private);          }      }       // 對非 DLL 的目標文件,必須要求有一個入口點      if (targetKind != PEFileKinds.Dll && !entryPointSet) {          sink.AddError("", string.Format("Need an entry point for target kind {0}", targetKind), String.Empty, CodeSpan.Empty, -1, Severity.Error);      }       // 最終產(chǎn)生輸出的程序集      assemblyGen.Dump();  }   本文來自CSDN博客,轉(zhuǎn)載請標明出處:http://blog.csdn.net/inelm/archive/2006/10/09/4612996.aspx

在上述兩個方法中,我們看到,出現(xiàn)了幾個重要的類,它們將是我們下面接著分析的重點線索:

// 編譯模塊  private void CompilePythonModule(string fileName, PythonCompilerSink sink, bool createMain) {      // 設(shè)定當前要編譯的源文件      assemblyGen.SetPythonSourceFile(fileName);      // 創(chuàng)建編譯器環(huán)境對象      CompilerContext context = new CompilerContext(fileName, sink);      // 創(chuàng)建分析器      Parser p = Parser.FromFile(state, context);      // 調(diào)用分析器的分析方法,得到一個語句對象(語句應(yīng)該是利用了組合模式的一個嵌套的概念,這個語句代表整個文件里的一個大語句)      Statement body = p.ParseFileInput();       if (sink.Errors > 0) return;       // 創(chuàng)建一個全局套件??有可能是指 globals() 這個字典對象。有待分析。。。      // 這里面的 Binder 是干什么的也有待研究。      GlobalSuite gs = Compiler.Ast.Binder.Bind(body, context);      string moduleName = GetModuleFromFilename(fileName);      // 這里看到了 TypeGen,該類代表一個類型產(chǎn)生器      // tg 指向了一個模塊類型(IronPython 中,每一個模塊產(chǎn)生為一個對應(yīng)的類。)      TypeGen tg = OutputGenerator.GenerateModuleType(moduleName, assemblyGen);      // 編譯模塊的 __init__ 方法??(猜測)      CodeGen init = CompileModuleInit(context, gs, tg, moduleName);

到這里為止,我們大致上看到了 IronPython 編譯器的工作流程,從一系列源代碼文件,資源文件,以及其他一些配置屬性出發(fā),經(jīng)過 Parser, 各種 Generator 的運作,最終到達 AssemblyGenerator 的 Dump() 方法,輸出編譯結(jié)果程序集。

關(guān)于怎樣理解IronPython 編譯器就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

本文題目:怎樣理解IronPython編譯器
地址分享:http://jinyejixie.com/article20/ggioco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、App設(shè)計網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計公司