2011年7月3日 星期日

2011-04-06-正規化AST的異動控管策略

原文網址: Formalizing the AST Change Control Policy

Python 在 AST 模組中公開了抽象語法樹(abstract syntax tree [1], AST)用來呈現Python原始碼編譯過的形式。 AST 模組容許使用者的程式碼在原始碼分析與編譯過的bytecode之間對AST 表達式(representation) 進行檢視與操作。

雖然Python 原始碼的語義已經在 language reference 中被定義了,AST 模組只是CPython的實作細節,在其它的Python實作版本中沒有必要去實作它。

AST模組相容性

某些 工作 中需要在AST上對CPython 中的區域程式碼優化器(peephole optimizer [2] )進行全面改寫(而不是在bytecode 這層,就這個case 而言),為此 Eugene Toder 需要對AST的結構進行修改。AST 作為一個CPython實作上的細節,沒辦法立即明瞭它是否也採用向後相容策略。 為此, Eugene向python-dev 問了這個問題 。 在修改AST時是否需要確保它的向後相容性?

一般來說社群裡一致同意 沒必要 去考量向後相容。AST 模組對外公開了一個常數 ast.__version__ , 讓使用者的程式碼得以依照AST的版本資訊對於它的程式行為自行調整。對於一個與實作版本相關的模組而言,這 樣子已經提供了足夠的相容性了。

其它 Python 的實作版本

事實上,Jython 和 IronPython 的維護者們指出他們各自的實作版本要嘛擁有一個相容的AST模組或是 傾向提供一個。即便如此,他們並不認為這代表 AST 模組應該被凍結發展並且樂見隨著 ast.__version__ 常數的更動,能在不用考慮相容性下修改AST模組。

有一個被提出的觀點指出在 test_ast.py 中的完整 test suite 可以幫助其它的實作 版本確保它們的 AST 表達式與 CPython 相容。 增加 test_ast.py 的涵蓋對於想要參與 Python 內部運作的的人們是一個好的 Project。

之後會發生什麼?

開啟這個討論串的 patch截至目前為止尚未 被整進 CPython中。 有可能,什麼事都不會發生。無論如何,如果它真的被commit了,AST 將會 以不向後相容的形式存在。 ast.__version__ 這個常數將會隨之更動來對應, 這樣子使用者們的程式碼才會知道可是程式也要隨之改動。概括來說,這將是未來AST更動 後要處理的方式。

Python 的開發者們對於這個策略被採用後,對已使用 AST的程式影響有多廣多深很有興趣。 如果有讀者們的程式會因為AST變更而受到影響,鼓勵大家去參與 在python-dev上的討論


[1]譯註: 關於 AST 可參閱 Wiki上的解釋
[2]譯註: 它的基本概念是為瞭解決statement by statement translation 可能會產生冗餘code的問題, 所以它在最佳化的時候是一次看一小段程式碼進行優化的動作,可以參閱 薛智文老師的投影片Wiki上的解釋

沒有留言:

張貼留言