Interesting idea!
https://groups.google.com/d/msg/golang-china/okoCj4pwiEA/S03ewhboTeoJ
See translation:
https://translate.google.com/translate?sl=auto&tl=en&js=y&prev=_t&hl=en&ie=UTF-8&u=http%3A%2F%2Fmailp.in%2Fn4LlnN0f%2F&edit-text=
这个工具可以简称为 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