Python 之父談 Python

oschina發表於2015-08-20

在宣傳海報上,Python 之父 Guido van Rossum 在 EuroPython 2015 會議的發言分為講話稿和現場問答部分,但是他上臺後將全程改為現場問答的形式。他在回答現場觀眾的問題前,首先以自己的幾個問題和答案推動了會議的程式。話題包括 Python 3(以及3.5),為何沒有2.8版本,為什麼有這麼多開放的bug,Pypy,還有他討厭 Python 的哪些部分。

Django Girls

Van Rossum 自己的第一個問題是他如何看待 Django Girls ——前一天演講的主題。他說,這是一次偉大的對話,他熱愛講故事。他的講話中將不會有相關的內容,或者任何“漂亮的幻燈片”。當他聽到Ola…或Ola…為這些幻燈片畫了松鼠和獾時,他非常震驚。

他喜歡的另一個方面是他們申明他們不知道他們正在做什麼。讓他想起了 25 年前開始寫 python,他也不知道接下來該怎麼做,例如,他不知道一門程式語言需要不同角色的社群。

他也被他們一年時間創造的“強勢品牌”所感染,“我預計 Ola and Ola、Django Girls 將走的很遠。”

Python 版本

轉換方向,他的下一個疑惑是為什麼開發者轉向 python 3。“你為什麼不能放棄 python 3?”,他設問自己。但他沒有說人們應該轉移向 python 3,但他也不想他們這樣做,但是確實有許多困難的工作需要花費一些其他的東西。例如這些應用和網站的面貌,python 2.7 現在並沒有死去,而且會有更多安全修復,或許,接下來的五年將會有更加安全的面貌。移植到 python 3 將有許多繁雜的工作,所以為什麼要打擾?

Python 之父談 Python

一方面,Python 3是一種要比 Python 2“好得多的語言”。這是一種非常容易教的語言。比如,Django Girls 工作室是完全基於 Python 3 進行開發的。要說 Django 的開發者沒有做過基於框架介面的垃圾工作,那從來都是不可能的。這樣一來,使用這種語言(和這種框架)使得第一次開發體驗更加讓人愉快。

隨著時間推移,Python 將變得越來越好。比方,Python 3.5 中有“很多出色的新的東西”。他說,Python 2 是一種優秀的語言並將一如既往地保持著原本的特性,這讓它漸漸地向完美的2.7版靠近。要想在核心開發者所做的所有工作中獲得益處,唯一辦法是轉移到 Python 3 中去。

一個長期存在的問題是,為什麼沒有讓 Python 2.8 釋出,儘管 Van Rossum 指出,可能有些風格有些過時的問題。 Python 2.8 不能解決任何人們想要解決的問題。沒有新的特性,這意味著沒有理由讓版本升級,而從 Python 3 開始移植的閘門已經開啟。那將使得程式既需要移植到 2.8,還需要移植到 3。

Unicode 是一個移植到 3 的大障礙。但是“該適可而止了”。因此 Python 2 正處在一個狀態中,它沒有得到新的特性。這讓核心的開發者把精力集中在 Python 3 上,把它做得更好。

他接下來談及了即將在 9 月份完成的 Python3.5。他曾經對如此至多的特性無法選擇,舉個例子來說,  os.scandir() 帶來的效能優化非常的棒,但實際上大部分的使用者並不會注意到。另一部分使用者對新的矩陣乘法運算子將會感到非常開心。像 NumPy 和其他的科學計算包將會開始使用這玩意,這個特性將會比呼叫一個函式來的『自然』多了。

或許他最喜歡的 Python3.5 特性是語法提示 , 也就是他自己做的那個 PEP。為了讓 PEP 接受它,他可下了不少功夫,自己做為自己的裁判,說服自己接受自己的工作,這也有點小奇怪。不過他還是希望還是有人來給幫他做一個獨立的 Code Review,就像 Mark Shannon 曾經作為 BDFL 代表做過的事情一樣,他說。

“如果你對這個也不感到意外的話,上一個 PEP 接受的 Python3.5 特性就是他作為興趣研究搞的非同步與等待關鍵詞。這個將會提供一個更自然的途徑去寫關於協程的程式碼。”

公開的bug

最近有人問及他關於 python bug 跟蹤裡所有公開 bug 的問題。如果你隨便找一個公開的 bug 看,你會發現這個 bug 可能已經打上了補丁,還有一長串的討論,甚至核心的開發人員也說補丁可以合併進主幹了,但是其實 bug 並沒有修復。難道這是一個不靠譜的核心開發者或者是老好人?那還需要這些補丁做些什麼?

他說,這些問題同樣也在一些其他大的工程上存在。諸多 bug 沒有通過正確的方式關閉,導致了對文件的誤讀,堆積了更多的 bug。而這些 bug 由於硬體或者開發環境的不同很難復現。但是這種 bug 沒有補丁。

這裡也有一些功能建議的 bug,並附上了補丁,但我們通常會猶豫是否接受這些更改,因為這些關注點沒有什麼用處。比如不具有同類語言的一些功能,或者向後相容。不打破所有的時間很難接受這些補丁。

另外,核心開發人員自己都有大量的工作,沒有人來分擔合併補丁到 Python 核心程式碼的工作。所有如果沒有核心團隊關注的補丁和功能,一般不會插入到合併流程。

在一個公司裡,這些東西是有些不同。人們付款給人做一些枯燥乏味的工作,但要是開源的話你必須自願完成那些不愉快的任務。一些核心開發者已經做這些枯燥乏味的工作太久了,他們希望從這些工作中脫身。一些開放的 bug 在 bug 追蹤器上有很長的歷史,這是有很多原因的。

最終,總是有很多統計效應被忽略。如果你隨機注意到一個 bug,包括已關閉的 bug,你可能會得到一個已關閉的 bug。許多 bug 很快就被關閉,並且 bug 被簡單地修復,類似於那種快速修復。但是,開放的 bug 的平均壽命是隨著專案年齡的增長而線性增長的,他說。

GIL

有些聽眾問到global interpreter lock(GIL),想要更深入瞭解這個問題,以及這個問題是如何解決的。Van Rossum笑著反問道:“你有多少時間?”他簡要的講述了GIL產生的歷史。在Python誕生後,多核計算機出現了。當執行緒執行在不同的核心中時,兩個或更多的處理器要更新同一個物件便產生了競爭機制,特別在Python垃圾回收處理機制中。

一個合理的解決方案就是給每個物件上鎖,這樣能保護資料不被多路存取破壞。但結果導致當沒有鎖的競爭時,上鎖和解鎖操作代價高昂。一些實驗表明,不需要上鎖的單執行緒程式效能會因此降低2倍。這意味著只有在使用三個或多個執行緒或核心的程式會從中獲益。

因此,GIL 誕生了(儘管這個名字在它被新增到直譯器後很久才出現)。它是一個立刻有效鎖定所有物件的單一鎖,這樣所有物件訪問將排序進行。目前的問題是,10年或15年以後,多核處理器無處不在,人們想要不必進行多重處理就可利用它們(例如,使用獨立的程式而不是執行緒通訊)

他說,如果你當今想要設計一種新語言,要讓它沒有易變的物件,或者有限的易變性。然而,聽眾中傳來“這就不是 Python 了”。Van Rossum 贊成的說:“你說出了我要說的話”。GIL 周圍有很多開發者不斷的努力,包括 PyPy 軟體事務記憶體(STM),以及 PyParallel。其他開發者也撞破了腦袋在想解決辦法。如果有人知道有什麼辦法能夠移除 GIL 且讓語言保持 Python 特性,Van 和其他人將很樂意聽到。

PyPy

他被問到 PyPy,他是否使用它,是否有一天它會成為預設的直譯器。他不使用 PyPy,但他下載了一下,玩了幾分鐘,他喜歡他看到的東西。他在兩種模式下使用 Python,或寫些小的指令碼完成一些事情,他只使用一個已經在他系統已經內建安裝的直譯器,或者做為一個 Dropbox 的工程師將 Python 佈署到叢集。

Dropbox 叢集執行修改過的 Python 2.7,他說,這引起觀眾的笑聲。“我說過,這不是祕密”,他說。因為 PyPy 比較快,Dropbox 的一些部分在使用 PyPy。但公司擔心一些小的不相容會導致一些不容易追蹤的 bug。“我們已經遇到了太多這樣的問題。”

PyPy 證實了你可以比 CPython 更快的執行 Python。它同時提供了一個測試平臺,在這個平臺上可以測試像 STM 這樣有意思的創意。但是保守原則讓人們只在需要加快速度時使用 PyPy。這樣做帶來的問題時,當你發現時,你已經在很多機器上部署了以至於很難遷移。因此,這很像遷移到 Python 3 上遇到的問題。

Dropbox 有很多對第三方的依賴,有些甚至不能在它的原始碼上重構。這對那些在生產環境中使用了成千上萬行 Python 程式碼的公司也是同樣的,他發現 Google 也是這樣,要遷移很困難。

總之,PyPy 是一個“非常酷的專案”。但是它有很多核取方塊,需要變得更易檢查。他半開玩笑的建議說,或許 PyPy 需要從 DjangoGirls 中租用 Ola and Ola 來建立一個更大的專案社群。

最喜歡的

Python 之父談 Python

接下來的 5 個小問題是他喜歡的東西。喜歡的 web 框架?他說他在任何一個框架中只寫一個 web app,他最後嘗試的是 Flask。喜歡的測試庫?他主要使用標準庫中的 unittest 和 mock。編輯器?他現在使用 Emacs,但是最開始使用 vi(兩種都得到不同聽眾的喝彩)。他仍然偶爾使用 vi(或 Vim),但是使用 5 分鐘後,他就要花上 15 分鐘重新適應 Emacs。

除 Python 外最喜歡的語言是什麼?他過去常常說是 C 語言,但是“有點無聊”。他信賴的人告訴他現代 C++ 是個優秀的語言。他喜歡 Go,但是沒有用它編寫任何有意義的東西。當他與設計師交談後,他喜歡從 Python 偷了一堆東西的 Swift 的外表。從語言中抄襲你喜歡的不好的東西並以一堆不合邏輯的特性而告終很容易,但是 Swift 的設計者看起來沒有這樣做。最後,喜歡的異常?在更多的歡呼和笑聲中,他輕輕地笑著回答是鍵盤中斷。

他所討厭的

最後的問題是他討厭 Python 哪些方面。他馬上回答:“一切與打包釋出有關的事情”。總是有與版本交叉和依賴有關的問題引起“永無止境的混亂”。他害怕同事跑過來問他“一個簡單的 Python 問題”,有一半是某種輸入路徑問題而且沒有什麼簡單的解決辦法。

然後,他的時間到了。EuroPython 會議主辦方為每個主講嘉賓提供了一份禮物:一頂巴斯克貝雷帽和一個大手帕。它們出現在 Van Rossum 演講的最後(見右上圖)。

相關文章