為什麼不給Python 這樣的解釋語言寫一個編譯器?

如題。解釋語言性能比較差,為什麼一個語言不能既有編譯器又有解釋器?這樣可以在需要性能的時候編譯它。

我剛開始涉足計算機科學,工科生,輕噴…


CPython是會編譯成bytecode的,見pyc文件。其他JPython,IronPython也都是編譯成特定bytecode的。pypy還能進一步JIT編譯成machine code。

性能主要問題不是編不編譯造成的,是動態類型系統以及各種額外的abstractions造成的。


題主是想問2c-python -

2C.py這種靜態編譯器么?

類似的腦洞當然不可能只有一個人開。看還有Nuitka,作者還很興奮:Static Compilation - That is the point. &<- 請結合上下文看:A static Python compiler? What"s the point?

其他腦動請參考Python官網wiki上的列表:PythonImplementations


很高興告訴你,python不是單純的解釋性語言。 我們平時所說的python解釋器其實是Cpython,在執行的時候,python會先將.py文件編譯成中間形式的位元組碼(bytecode)並存放在內存當中,然後在正真執行的時候將位元組碼解釋為機器可識別的二進位碼。

默認情況下,被import的文件編譯出位元組碼會被保存下來,即我們看到的.pyc文件了。當然我們可以顯示的編譯一個.py文件並保存。

靜態語言編譯出的是二進位文件,也就是說,打從編譯結束後,執行這個文件,機器怎麼運行是已經確定好的事情了。

而python是一門動態語言,比如語句a+b,在執行它之前,你丫的根本就不知道a和b是什麼,是執行整數運算呢?還是浮點數運算?要知道,一般的計算機,執行整數運算和浮點數運算的運算單元是不一樣的。

所以,動態語言你怎麼去完全編譯它?python已經做得很不錯了。

如果你是比較純正的python,即沒有太多的第三方庫,可以考慮使用pypy解釋器。不過pypy對大部分第三方庫支持力度不夠。比如強大的科學運算庫numpy就未支持,當然,支持的日子相比不會太長遠。

而且,大部分速度的瓶頸跟語言關係不大,而是在於演算法。實在不行,考慮使用C/C++或者CUDA加速才是王道。

第一次碼這麼多字,真是累。。。。

更新:

@kalam yum提到了numpy有專門的Pypy版本,官網上也確實提供了下載鏈接。不過支持力度不夠啊,想下下來使用一下,發現根本下不下來,似乎是我這個爛網路的原因。暫時我是不會考慮使用PyPy。

還有網上有人提到了結合CPython和PyPy的方法:

https://github.com/fijal/jitpy

沒有試,大家可以看下。

目前看來,還是那句話:

使用C/C++或者CUDA加速才是王道。

使用C/C++或者CUDA加速才是王道。

使用C/C++或者CUDA加速才是王道。

學習Python的同時,學習C/C++和CUDA,何樂而不為?


因為python是一門動態語言。很多特性要依賴於程序元數據。所以即使編譯成機器碼,還是需要帶運行時,垃圾回收器,程序本身的元數據。編譯成機器碼可能在數值運算方面的性能會得到提升,但其他方面未必會得到顯著的性能提升。

編譯為機器碼,其實類似於pypy那種jit,只是把編譯結果保存起來而已。


其實除了科學計算大部分用得上python的場景都不在乎它的性能。


( 抖個機靈

Cython: C-Extensions for Python

你說這個?


Python不是單純的解釋型語言,所以可以認為它的所謂解釋器即普遍意義上的編譯器。這個問題就像馬為什麼不像人躺著睡覺一樣,躺著多舒服。


推薦閱讀:

如何用C++語言開發 tiny Nginx並真正鍛煉C++的使用?
作為軟體在校生,自己如何去找軟體項目並著手去編碼?
用c++寫https客戶端和伺服器大體步驟有哪些?
C++遊戲開發擇業前景?
使用cocos2D遊戲引擎開發遊戲的話,是選擇使用cocos2D-x使用C++來編寫,還是使用cocos2D-html5來編程,原因是什麼?

TAG:Python | 編程 | C | 編譯器 | 計算機語言 |