成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

漫談IronPython 編譯器講述說明

開發 后端
本文向大家介紹IronPython 編譯器,可能好多人還不了解IronPython 編譯器,沒有關系,看完本文你肯定有不少收獲,希望本文能教會你更多東西。

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

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

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

  1. /// <summary> 
  2. /// 編譯  
  3. /// </summary> 
  4. public void Compile() {  
  5.     string fullPath = Path.GetFullPath(outputAssembly);  
  6.     string outDir = Path.GetDirectoryName(fullPath);  
  7.     string fileName = Path.GetFileName(outputAssembly);  
  8.  
  9.     // Python 編譯器的接受池  
  10.     PythonCompilerSink sink = new PythonCompilerSink(compilerSink);  
  11.  
  12.     // 程序集產生器  
  13.     assemblyGen = new AssemblyGen(  
  14.         Path.GetFileNameWithoutExtension(outputAssembly),  
  15.         outDir, fileName, includeDebugInformation, staticTypes, executable, machine  
  16.         );  
  17.  
  18.     // 是否以設定入口點(entry point)  
  19.     bool entryPointSet = false;  
  20.  
  21.     // 設定默認的主文件(對非 DLL 的輸出文件類型而言)  
  22.     if (mainFile == null && sourceFiles.Count == 1 && targetKind != PEFileKinds.Dll) {  
  23.         mainFile = sourceFiles[0];  
  24.     }  
  25.  
  26.     // 對每個源文件依次編譯  
  27.     foreach (string sourceFile in sourceFiles) {  
  28.         // 是否產生 Main 方法  
  29.         bool createMainMethod = sourceFile == mainFile;  
  30.         // 每個源代碼文件編譯為一個模塊  
  31.         CompilePythonModule(sourceFile, sink, createMainMethod);  
  32.  
  33.         if (sink.Errors > 0) return;  
  34.  
  35.         if (createMainMethod) {  
  36.             entryPointSet = true;  
  37.         }  
  38.     } 

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

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

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

  1. // 編譯模塊  
  2. private void CompilePythonModule(string fileName, PythonCompilerSink sink, bool createMain) {  
  3.     // 設定當前要編譯的源文件  
  4.     assemblyGen.SetPythonSourceFile(fileName);  
  5.     // 創建編譯器環境對象  
  6.     CompilerContext context = new CompilerContext(fileName, sink);  
  7.     // 創建分析器  
  8.     Parser p = Parser.FromFile(state, context);  
  9.     // 調用分析器的分析方法,得到一個語句對象(語句應該是利用了組合模式的一個嵌套的概念,這個語句代表整個文件里的一個大語句)  
  10.     Statement body = p.ParseFileInput();  
  11.  
  12.     if (sink.Errors > 0) return;  
  13.  
  14.     // 創建一個全局套件??有可能是指 globals() 這個字典對象。有待分析。。。  
  15.     // 這里面的 Binder 是干什么的也有待研究。  
  16.     GlobalSuite gs = Compiler.Ast.Binder.Bind(body, context);  
  17.     string moduleName = GetModuleFromFilename(fileName);  
  18.     // 這里看到了 TypeGen,該類代表一個類型產生器  
  19.     // tg 指向了一個模塊類型(IronPython 中,每一個模塊產生為一個對應的類。)  
  20.     TypeGen tg = OutputGenerator.GenerateModuleType(moduleName, assemblyGen);  
  21.     // 編譯模塊的 __init__ 方法??(猜測)  
  22.     CodeGen init = CompileModuleInit(context, gs, tg, moduleName); 

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

【編輯推薦】

  1. 如何使Python嵌入C++應用程序?
  2. 深入探討Ruby與Python語法比較
  3. Python學習資料介紹分享
  4. Python學習經驗談:版本、IDE選擇及編碼解決方案
  5. 淺析Python的GIL和線程安全
責任編輯:chenqingxiang 來源: CSDN
相關推薦

2010-01-18 10:34:21

C++編譯器

2010-02-02 17:08:26

Python靜態編譯器

2010-02-02 17:08:26

Python靜態編譯器

2010-01-28 15:56:38

VC++ 6.0編譯

2010-01-13 13:58:49

C++編譯模式

2010-01-13 17:12:26

C++編譯器

2010-01-21 09:11:38

C++編譯器

2010-01-14 17:08:10

C++日期

2009-08-10 17:12:54

C#編譯器

2017-03-20 18:01:55

編譯器匯編

2013-03-29 10:02:37

編譯器語言編譯開發

2010-03-23 11:17:16

Python 動態編譯

2009-12-11 15:38:40

VS2008編譯器

2010-01-19 18:24:53

C++編譯環境

2010-10-20 13:43:37

C++編譯器

2019-08-06 08:20:07

編譯器工具開發者

2010-02-22 14:54:47

Python應用程序

2010-03-02 10:55:47

Linux SkyEy

2011-05-18 11:06:25

java編譯器

2010-09-16 15:57:25

Java編譯器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美亚洲日本 | 91精品国产777在线观看 | 午夜精品影院 | 国产视频1区 | 日本免费小视频 | 国产伦精品一区二区三区高清 | 国产在线色| 国产传媒在线观看 | 久久中文字幕一区 | 免费一看一级毛片 | 99精品在线| 日韩在线免费电影 | 国产成人高清成人av片在线看 | 免费观看一级特黄欧美大片 | 日韩在线高清 | 另类专区成人 | www久久久 | 欧美日高清视频 | 特黄色一级毛片 | 精品视频久久久 | 中文字幕二区 | 国产色婷婷久久99精品91 | 欧美黄a| 一区二区在线 | 国产精品1区 | 日韩在线成人 | 伊人看片 | 久久久久久久国产 | 日韩一区二区三区视频 | 久久国产精品72免费观看 | 亚洲视频在线观看免费 | 久久久久国产一区二区三区四区 | 性做久久久久久免费观看欧美 | 色在线免费 | 亚洲精品综合一区二区 | 日韩超碰在线 | 欧美日韩精品久久久免费观看 | 成人a在线观看 | 日韩成人在线免费视频 | www.操.com | 青青草这里只有精品 |