把 Python 源碼自動轉化為 Go 源碼
Interesting idea!
https://groups.google.com/d/msg/golang-china/okoCj4pwiEA/S03ewhboTeoJ
See translation:
這個工具可以簡稱為 Python to GoLang,把 Python 源碼自動轉化為 Go 源碼,然后可編譯為獨立的可執行文件。(附:Go 語言是新興的類C可編譯語言,開源)
大家一般把 Python 理解為是一個腳本語言,雖然開發效率高,但運行速度慢,解釋執行,不可編譯,依賴解釋環境,不方便發布。
多年以來,無數先烈做了大量的努力工作,試圖提高 Python 的運行速度,有 pypy,Cython 等。但結果都不理想。
我認為:Python 實際上規定了一套開發規范。用這套規范,你可以快速地表達你的邏輯思想。它并沒有限定必須是腳本語言,不可編譯。只不過現在只有一個用C實現的 Python 解釋器,簡稱 CPython。于是我們就想當然地認為,Python 是腳本語言,不能編譯。
我認為,一個軟件,不管用什么編程語言,都是表達一些邏輯。它們之間應該是可以轉化的。經過幾個月的努力,就有了現在這個工具。
我的思想:Python 是開發效率最高的編程語言。無數天才的程序員都狂熱地喜歡 Python 和 Go。現在有了本軟件,使 Python 可編譯,使 Python 可提速,Python 語言不再有缺點!從此我們再也不需要學 C 和 C++ 了!Python 獲得了新生!
有人問,為什么要把 Python 轉為 Go ,直接用 Go 開發不就行了?
首先,Python 開發效率極高,而 Go 為了簡潔缺失很多有用的內容。我不建議把 Go 作為主開發語言。其次,Python 的第三方庫非常豐富,而 Go 作為新興語言,如果能把 Python 的所有庫都繼承下來,必大大提高 Go 的地位。
本軟件有兩種工作方式:
方式一:如果你的產品只在已安裝 Python 的環境下運行,或者為了方便分析調試,可以用方式一。這時,只會轉化主工程文件目錄下的 py 文件。對于 import 的系統模塊則不作轉化處理。一般一行 Python 代碼轉化后變成 1.5 行 Go 代碼。轉化后代碼清晰明了,基本保持原函數名,變量名,調用關系。方便再修改優化。
方式二:全轉化。這會試圖把所有 import 用到的系統模塊全部轉化為 Go 代碼。這通常會產生超過十五萬行 Go 代碼。優點是這樣轉化后編譯生成的可執行文件不再需要 Python 環境,單獨一個 exe 加 python27.dll 加可能的 pyd 文件就可以運行了。方便發布。
有人說,你為什么需要 python27.dll ? 如果帶 dll 的話,我一行 exec 就全解決了,何必這么麻煩呢?
如果用 exec 的話,還是解釋執行的。達不到提速和安全的目的。
我的做法,是把每一個函數都變成一個對應的 Go 函數。每一個變量都變成一個對應的 Go 源碼下的變量。我會盡量智能識別變量類型。如果發現變量是 integer 類型,就會直接使用 go 的 int ,優化了速度。對于不能識別的變量,或 list, tuple 等,則用 PyObject ,對應的操作也只能調用 python27.dll 中的對應函數。
還有,Python 的一大優勢是庫非常豐富。大量的庫實際上都是用C編譯而來的 pyd 文件。這些 pyd 文件實際上是 dll 格式,它們依賴 python27.dll。
有了本軟件的轉化,大量的 python 庫都可以在 go 下運行了。極大地豐富了 go 的功能。比如 go 至今沒有好的 gui 庫,現在就可以借用 Python 間接實現 gui 開發。
整個項目用了我多半年時間,約 3 萬行代碼。主要編程語言用 Python,輔以一些 Go 和 C 代碼。如你所想,本軟件可以轉化自身。本軟件的轉化過程中,直接面對復雜的 Python 邏輯,把每一個知識點都要細致地從 Python 源碼層轉化為 PyObject 層,再用 go 語言實現,工作量非常大。特別是一些 Python 中有而 Go 中沒有的概念,處理起來非常有難度。比如 try/exception, yield, var scope, no use var, var declare 等。
本項目準備以開源形式發布。源碼稍后提供。暫只支持 Python 2.7.6 不支持 Python3。已經在 Win32,Win64 平臺上測試通過。相信也可以很容易地運行在所有支持 Python 和 Go 的平臺。Python 是用C實現且開源,Go 也是用C實現且開源,幾乎可以運行于所有平臺。有了這個 Python to Go ,相信將來 Python+Go 會成為主流的開發方式。
作為本轉化工具的第一個樣例,一個我寫的英語聽力小工具 http://pan.baidu.com/s/1o6x5zRk 內有 Python 源碼,和轉化后的 go 源碼 (17 萬行)。
現在可以提供的服務:
1、協助你把 Python 源碼轉化為可編譯的 Go 源碼。方便部署,更安全,運行速度更快。
2、協助你對 Python 項目優化提速。
3、演講,傳達我的思想。
劉濤濤 8. pcka@qq.com
<span id="shareA4" class="fl">
</span>