大家好,我是貓哥。我對於編程語言跟其它學科的融合非常感興趣,這種興趣在創辦公眾號時就已非常濃烈,因此,幾個月來,就做了不少大膽的嘗試。不敢說取得了什麼“成果”吧,但至少是做到了獨樹一幟。

在這個過程中,我有幸認識了幾位“跨界跨學科”的群友:既有學貫多門語言的大佬,也有深夜研讀斯賓諾莎倫理學的同學,還有逛遍各種展館興趣無邊界的能人。非常有趣。

今天這篇文章的原作者也挺能跨界的,他很佩服毛主席的《矛盾論》,因此把它跟 Python 放在一起思考,寫出了一篇文章來投稿。我欣賞他的發散思維 ,以及 跨學科知識融合 的嘗試,於是稍作編輯,發佈出來。至於內容,就不多說了,建議你往下一看便知。


用《矛盾論》來解讀 Python


本文原創並首發於公眾號【**Python貓**】,未經授權,請勿轉載。

原文地址:https://mp.weixin.qq.com/s/g1VGexWl2hvGlJXRgp0FOQ

我的戰鬥力是53萬 | 原創作者

豌豆花下貓 | 編輯潤色

《矛盾論》是毛主席寫的哲學著作,1975 年由人民出版社出版。

通過閱讀,我發現《矛盾論》中的一些方法論可以應用在編程語言之中,本文以 Python 語言舉例描述。

1.矛盾的普遍性

《矛盾論》原文中有這樣一段話:

列寧也這樣說過矛盾的普遍性:"在數學中,正和負,微分和積分。在力學中,作用和反作用。在物理學中,陽電和陰電。在化學中,原子的化合和分解。在社會科學中,階級鬥爭。"戰爭中的攻守,進退,勝敗,都是矛盾的現象。失去一方,他方就不存在。

這段話描述的是矛盾的普遍性。那在 Python 中的矛盾是什麼呢?大概就是編寫代碼的速度和代碼運行速度之間的矛盾吧。

請看下面例子,現在有一個任務:在近萬個文件的目錄下,數一數有多少個 JPEG 文件?

看看用各個編程語言實現的情況:

用《矛盾論》來解讀 Python

結果顯示 Python 的運行速度明顯慢於 Go 和 Rust,但是,寫這個程序用 Python 需要 15 行代碼,Rust 語言需要 29 行,Go 語言需要 30 行。

(以上例子的出處:https://blog.lilydjwg.me/2018/6/14/walk-a-directory-python-vs-go-vs-rust.212932.html)

這個任務顯示出了 Python 語言中的矛盾:開發速度和運行速度之間的矛盾。

《矛盾論》中關於矛盾有這樣一個描述:

如果是存在兩個以上的矛盾的複雜過程的話,就要用全力找到它的主要矛盾,捉住這個主要矛盾,一切問題就迎刃而解了。

在 Python 中還存在著其它的矛盾,比如內存,併發,可讀性等等,有那麼一句笑話“動態語言一時爽,重構代碼火葬場”。

但在 Python 中的主要矛盾就是速度,這一點是被人議論最多的,其它的矛盾也有些是因為速度這個主要矛盾而產生的。

2.為什麼會有矛盾?

Python為什麼運行速度慢?

首先因為 Python 是動態語言,動態類型語言之所以慢,就是因為每一個簡單的操作都需要大量的指令才能完成。一般來說,虛擬機擁有很強的優化器,但卻是為靜態語言設計的,對 Python 幾乎沒有效果。

舉一個例子。對於整數加法,C 語言很簡單,只要一個機器指令 ADD 就可以了,最多不過再加一些內存讀寫。但是,對於 Python 來說,a + b 這樣的簡單二元運算,可就真的很麻煩了。Python 是動態語言,變量只是對象的引用,變量 a 和 b 本身都沒有類型,而它們的值有類型。所以,在相“加”之前,必須先判斷類型。

其次,Python 的解釋器 CPython 中存在 GIL(全局解釋器鎖),它會讓 Python 只能執行單線程,Python 中所謂的多線程,只是在各個單線程之間的快速切換,讓程序看上去像是在執行多線程。

(對於 Python 慢的分析,這裡有篇文章《Python 為什麼這麼慢?》值得一看,另外, GIL 的問題並不是不可解決的,詳見《GIL 已經被殺死了麼?》)

Python 為什麼開發速度快?

首先,也是因為 Python 是動態語言,編程時不用定義變量類型。比如要定義一個變量 a,讓 a 的值為 1,用 C 語言來寫分為兩步,第一步是“int a”,第二步是“a = 1”,另外C語言還需要導入頭文件“#include”和定義主函數 main。而 Python 只需要一步“a = 1”。

其次,Python 擁有大量的模塊、庫和包,讓開發者拿來即用,提高開發效率。

3.矛盾的同一性

“事情不是矛盾雙方互相依存就完了,更重要的,還在於矛盾著的事物的互相轉化。”

《矛盾論》舉了大量例子來說明矛盾的同一性。

比如:”被統治的無產階級經過革命轉化為統治者,原來是統治者的資產階級卻轉化為被統治者,轉化到對方原來所佔的地位。”

還有:“大家都知道,戰爭和和平是相互轉化的。戰爭轉化為和平,例如第一次世界大戰轉化為戰後的和平,中國的內戰現在也停止了,出現了國內的和平。和平轉化為戰爭,例如一九二七年的國共合作轉化為戰爭,現在的世界和平局面也可能轉化成第二次世界大戰。“

由此可見,矛盾著的雙方都向著它們的對立面慢慢地轉化。

Python 也是同理。比如想讓 Python 程序運行的快,那可以部分程序用 C/C++ 重寫,那代碼量就會增多,開發速度就會變慢。

運行速度從慢到快,開發速度從快到慢,從相反的方向互相轉化,體現了矛盾的同一性。

4.認識的過程

看一段矛盾論的原文:

就人類認識運動的秩序來說,總是認識個別的和特殊的任務,逐步地擴大到認識一般的事物。人們總是首先認識了許多不同事物的特殊本質,然後才有可能進行更近一步的概括工作,認識諸種事物的特殊本質。

搞編程的人可能多少會聽過一句話“語言是相通的”。一方面,每個編程語言都有自己擅長的領域,比如 Python 適合人工智能,PHP 適合網站開發,Java 適合軟件開發,但每個編程語言又有類似的功能和語法。

前提是你要精通一種語言,瞭解背後的思想,才可以更好的過渡到其它語言,從而發現各種編程語言的共通之處,從個別到一般。

5.語言的發展

正是由於 Python 存在著“開發快,運行慢”的矛盾,Python 的核心開發團隊才不斷地研究改進,讓 Python 不斷地發展。

毛主席在《矛盾論》中說:

黨內如果沒有矛盾和解決矛盾的思想鬥爭,黨的生命也就停止了。

當有一天 Python 中的矛盾消失了,那這門語言也就走到了盡頭,這一點或許也可以映射到其它的編程語言吧。

相關推薦

推薦中...