Inside IronPython: IronPython AST语法树(2/2)
接上篇: Inside IronPython: IronPython AST語法樹(1/2)
ASTs簡介:
當 ipy.exe 執行demo.py的時候,IronPython語言自身的實現和DLR共同參與源代碼的編譯處理。從基本層面上來講,編譯器是流水化作業的:從語法解析器生成描述源代碼的特定數據結構開始。這個數據結構是個抽象語法樹(abstract syntax tree),簡稱為AST。編譯器在完成代碼分析階段后將轉換AST或者建立新的數據結構,然后再基于此結果,編譯器產生機器碼或者虛擬機的中間語言(IL)。
IronPython首先產生一個特定于IronPython的抽象語法樹,然后再把這個語法樹轉換成DLR的語法樹。一些語言有自己的語法樹的原因是這樣可以更好的支持對代碼進行分析,也能更好的支持一些基于自有AST的工具(工具需要一個更接近于源代碼的AST。許多語言的AST也許和DLR的AST比較相似,但是DLR的AST包含更多關于確切語義含義的信息。你可以認為DLR AST是編譯器需要的多個轉換中較晚階段需要的那個。
非常有趣的是DLR使用了和CLR Jit編譯技術相似的緩式編譯技術:并不是一下子編譯全部的代碼。這樣在第一次運行的時候我們會有一點點的性能損耗,但是以后執行時可以運行的更快。
查看IronPython的AST
回到VS IDE中,按F5執行程序,在斷點處暫停(其實在你安裝的IronPython中,第一次到達斷點時,并不是處理demo.py文件,而是一個名叫site.py的文件。因為在我們的...\Bin\Debug目錄下根本沒有這個文件,所以就直接處理demo.py文件了)。接下來我們按F10單步執行程序,直到執行了:ast = parser.ParseFile(true);。現在我們就可以在“監視”窗口中查看IronPython的AST了。
由于空間問題, 我只在圖中展開了ast.Body的部分成員。AST的根節點是SuiteStatement,表示了一系列的語句,它有一個成員:Statements。展開Statements中的第一個成員,將看到這個成員是個FunctionDefinition類型的節點,它有一個Body成員(又是一個SuiteStatement類型):表示函數的定義,我們可以看到它有一個Name 成員,并且最后它的名字將綁定到結果函數對象。我們展開demo.py中所有元素,它們之間的關系如下圖所示:
轉載于:https://www.cnblogs.com/Jifangliang/archive/2008/07/30/1256041.html
總結
以上是生活随笔為你收集整理的Inside IronPython: IronPython AST语法树(2/2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql 中优化视图或sql语句的执行效率
- 下一篇: python网易云_使用Python实现