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

漫談IronPython 編譯器講述說明

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

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

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

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

  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.     // 程序集產(chǎn)生器  
  13.     assemblyGen = new AssemblyGen(  
  14.         Path.GetFileNameWithoutExtension(outputAssembly),  
  15.         outDir, fileName, includeDebugInformation, staticTypes, executable, machine  
  16.         );  
  17.  
  18.     // 是否以設(shè)定入口點(diǎn)(entry point)  
  19.     bool entryPointSet = false;  
  20.  
  21.     // 設(shè)定默認(rèn)的主文件(對非 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.         // 是否產(chǎn)生 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.     } 

這段代碼中,調(diào)用到了 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 的目標(biāo)文件,必須要求有一個入口點(diǎn)  
  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.     // 最終產(chǎn)生輸出的程序集  
  14.     assemblyGen.Dump();  
  15. }  
  16.  
  17. 本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/inelm/archive/2006/10/09/4612996.aspx 

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

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

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

【編輯推薦】

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

2010-01-18 10:34:21

C++編譯器

2010-02-02 17:08:26

Python靜態(tài)編譯器

2010-02-02 17:08:26

Python靜態(tài)編譯器

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++編譯器

2009-08-10 17:12:54

C#編譯器

2017-03-20 18:01:55

編譯器匯編

2013-03-29 10:02:37

編譯器語言編譯開發(fā)

2010-01-14 17:08:10

C++日期

2010-03-23 11:17:16

Python 動態(tài)編譯

2009-12-11 15:38:40

VS2008編譯器

2010-01-19 18:24:53

C++編譯環(huán)境

2010-10-20 13:43:37

C++編譯器

2019-08-06 08:20:07

編譯器工具開發(fā)者

2010-02-22 14:54:47

Python應(yīng)用程序

2010-03-02 10:55:47

Linux SkyEy

2011-05-18 11:06:25

java編譯器

2010-09-16 15:57:25

Java編譯器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产一区二区精品在线观看 | 国内精品视频在线观看 | 亚洲精品国产电影 | 成人在线视频一区二区三区 | 久久久久久999 | 久久夜视频 | 91免费观看视频 | 日韩中文一区二区三区 | 免费成人在线网站 | 成人在线观看免费视频 | 91精品国产乱码久久久 | 久久久久久国产 | 国产三区视频在线观看 | 色婷婷激情综合 | 国产精品久久久久久久三级 | 日本成人综合 | 久久久久亚洲精品国产 | 久久久久久久网 | 成人免费淫片aa视频免费 | 日韩一二三区 | 在线中文视频 | www国产成人免费观看视频,深夜成人网 | caoporn国产精品免费公开 | 色频| 黄色在线观看 | 亚洲一区国产精品 | 二区中文字幕 | 国产精品夜色一区二区三区 | 2019天天操| 国产精品一码二码三码在线 | 久久免费看 | 婷婷福利视频导航 | 国产在线97| 视频一区二区三区四区五区 | 91免费福利在线 | 国内精品一区二区 | 亚洲成人福利视频 | 国产精品综合久久 | 日韩精品一区二区三区视频播放 | 国产精品 亚洲一区 | 精品亚洲一区二区三区 |