學習python的我,爲何越發覺得熟悉Linux內核真的很重要?

Python作爲目前最爲火爆的腳本語言,其豐富的Package庫和跨平臺等特性有目共睹。
曾今,以功能實現、產品交付爲工作主導的我,自以爲所謂的“跨平臺”就是不需要去了解平臺細節,Python語言底層都封裝好了。
但如果想從性能方面思考自己的程序,多壓榨機器資源來體現自身的專業素養,就不得不激發自己的好奇心,去了解這一個個“封裝”都咋實現的,不同有什麼區別。
比如,前幾周開發Python爬蟲時,就有好幾個問題在腦海盤旋:
1. 做這個項目,在windows上部署開發環境快些,還是linux?比如項目依賴的各種pypi庫的安裝在windows上是否方便。有時需要用到第三方工具,比如Selenium,PyQt,Fidder,MongoDB客戶端或者Potia框架,在兩個平臺上的安裝、熟悉花費的時間是否相同?
2. 開發過程中,不同的操作系統會不會處理的細節不同?比如Windows的控制檯字符編碼就沒有utf8,那從服務器返回的json字符串,如果我想做相關打印,就需要進行額外的轉碼處理。
3. 同樣的程序,在不同的平臺上是否效率一樣?比如多線程、多進程爬蟲,兩邊代碼都一樣,誰先爬完就成了兩個操作系統對於進程、線程管理的比拼。
一方面,看自己要花多久能完成程序的開發,另一方面,再看程序要花多久能完成預期的目標,一切回到ACM般的趣味之中。

當然不全是出於效率優化的角度,提醒我不要放下linux,還在於Python源碼的磁層實現。
Python解釋器核心邏輯在於對操作碼(opcode)的解析與執行。這個玩意就很像彙編代碼了,特別是看到熟悉的JUMP指令。
再看到它每100條opcode進行一次線程標準調度,就在想“這不是和CPU的時間分片”很像麼?
最後看到多線程的實現,對不同的操作系統的原生線程進行封裝,交由GIL處理。
你肯定也會想,這個語言的實現似乎借鑑了操作系統內核的原理。

最近我在讀Programming Python,第一個向讀者介紹的內容就是系統工具——sys和os兩個模塊,前者封裝了和Python虛擬機相關的接口,後者封裝了和操作系統(特別是文件系統)相關的接口。Python模塊導入與sys.path有關,這個名字又不得不讓人想到Windows和Linux都有的環境變量PATH(在Python中,這個PATH就是os.environ),操作系統是通過PATH來尋找命令的,就像Python通過sys.path來找模塊一樣。
你看,這又是完美的借鑑。

所以作爲開發者,你得知道程序的世界不是憑空造出來的,特別是這些風靡了這麼多年的操作系統和編程語言,一行行代碼都有憑有據,哪怕是個idea都有出處(你甚至在Python源碼的註釋裏會看到某處算法借鑑了某某論文)。特別是“系統工具”這個說法:操作系統對於腳本語言來說是工具。這再一次強調了,開發者應該對程序執行環境、上下文保持注意力。

Python如此,Linux的開發其實也是如此。GNU當年剛成立,高舉着“自由軟件”大旗,但志願者少,原因在於他們缺少產品,只有編輯器Emacs和編譯器GCC。Linux的開發也不是閉門造車,它就用到這兩個工具,再加上以Minix操作系統爲參考,就逐漸成了GNU的招牌。所以Python和Linux真的很像,都是idea+idea=更大的idea,工具+工具=更大的開發工具。

Guido和Linus的編程哲學幾乎是一致的,可能同是開源,纔會這麼惺惺相惜吧。(此處沒有鄙視Windows之意)
學習Python,真的有必要了解Linux內核。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章