V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
janxin
V2EX  ›  Go 编程语言

使 Python 可编译(Python2Golang)

  •  
  •   janxin · 2014-05-24 18:30:24 +08:00 · 2223 次点击
    这是一个创建于 3873 天前的主题,其中的信息可能已经有所发展或是发生改变。
    作者:刘涛涛,WinMount的作者。
    开源项目,目前暂时没有工具下载。下面是原文说明。

    -----------

    这个工具可以简称为 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。演讲,传达我的思想。 

    [email protected]

    -----
    原文连接: http://bbs.pediy.com/showthread.php?p=1287059
    10 条回复    2014-05-25 11:49:55 +08:00
    oldcai
        1
    oldcai  
       2014-05-24 18:44:18 +08:00
    我刚准备贴过来,哈哈。
    期待看看,就是要带python.dll,不知道是因为标准库调用需要,或者还是脱离不了解释器。
    janxin
        2
    janxin  
    OP
       2014-05-24 18:52:27 +08:00
    @oldcai 具体实现细节我不太清楚,群里有人说两个月之前测试的时候计算斐波纳契数列性能比单纯python能够提高7倍左右
    HowardMei
        3
    HowardMei  
       2014-05-24 19:26:28 +08:00
    酷,这个思路很有冲击性哦,加上mypy那样的可选类型,python就真变成编译语言了 ;-)
    skybr
        4
    skybr  
       2014-05-24 19:58:38 +08:00
    @janxin 我试了下, Cython转化过的文件没加优化选项大致和纯Go差不多, 加了-ON, 用Cython应该比转成Go更优一些.

    https://gist.github.com/anonymous/2eabd5714c1bd4f37a7b

    @HowardMei Cython就可以
    missdeer
        5
    missdeer  
       2014-05-24 21:27:35 +08:00
    不知道为什么总感觉蛋疼地快碎掉了
    zoowii
        6
    zoowii  
       2014-05-24 21:51:55 +08:00
    和pypy 或者cython比有多大优势?
    canesten
        7
    canesten  
       2014-05-24 22:01:38 +08:00
    想起facebook的hiphop
    ehs2013
        8
    ehs2013  
       2014-05-25 01:02:42 +08:00
    太棒了
    mortal
        9
    mortal  
       2014-05-25 10:17:09 +08:00
    激动人心!

    PS. WinMount 挺好用的
    janxin
        10
    janxin  
    OP
       2014-05-25 11:49:55 +08:00
    @skybr 具体的我现在也没程序,等出来之后可以测试一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1016 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:56 · PVG 03:56 · LAX 11:56 · JFK 14:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.