為什麼不給Python 這樣的解釋語言寫一個編譯器?
來源:互聯網
上載者:User
如題。解釋語言效能比較差,為什麼一個語言不能既有編譯器又有解譯器?這樣可以在需要效能的時候編譯它。
我剛開始涉足電腦科學,工科生,輕噴…
回複內容:
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不是單純的解釋型語言,所以可以認為它的所謂解譯器即普遍意義上的編譯器。這個問題就像馬為什麼不像人躺著睡覺一樣,躺著多舒服。