免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5378 | 回复: 4
打印 上一主题 下一主题

[有趣的Python 7] 解释?还是编译?That is the question [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-06-08 11:07 |只看该作者 |倒序浏览
Python是一个解释型的语言。但是为了效率上的考虑,Python也提供了编译的方法。编译之后是bytecode的形式。Python也提供了和Java类似的VM来执行这样的bytecode。不同的是,因为Python是一个解释型的语言,所以编译(compile)不是一个强制的操作。事实上,编译是一个自动的过程。多数情况下,你甚至不会在意他的存在。编译成bytecode可以节省加载模块的时间,从而提高效率

通常,自动的编译过程发生在对模块(module)的调用过程中。我们在查看python提供的标准类库的时候可以看到很多的.pyc文件,用file命令查看一下,发现类型是“data”,也就是二进制文件。我们做个实验,写个自己的module,然后看看他是如何编译的。关于模块的知识我们这里先不深入,以后有机会再谈。

OK,我们先写个自己的模块。文件名就叫做testM.py

  1. #! /usr/bin/py  thon

  2. """testM.py"""
  3. class MyClass:
  4.     i = 1.2
  5.     def f(self):
  6.         return 'hello'
  7.     def __init__(self):
  8.         self.a = 'A'

  9. if __name__ == '__main__':
  10.     x = MyClass
  11.     print x.i
复制代码

其实模块(module)这个词没有什么神秘的。随便一个python文件,只要你愿意把他共享出来,它就是一个模块。

我们再写一个测试用的代码,testU.py

  1. #! /usr/bin/python

  2. import test

  3. x = test.MyClass()
  4. x.j = 123
  5. print x.a
  6. y = test.MyClass()
  7. y.a = 'Y'
  8. print y.a
  9. print x.a
  10. print x.j
复制代码


我们可以看到模块名就是模块所在的文件名。现在我们执行一下testU.py。然后再查看一下当前目录。Aha!一个新文件:testM.pyc出现了。是一个二进制的文件。自动编译发生了。每次当我们更新了.py文件之后,.pyc文件也会对应的更新。

除了效率原因,bytecode也增加了反向工程的难度,在某种程度上保护你的代码。当然,反编译仍然是可以的。所以如果真的想保护代码,还是用别的方法吧。

另外Python还提供了-O选项,可以编译生成“优化”的bytecode,文件扩展名是.pyo。但实际上优化的内容有限,作用不大。

如果希望生成可执行文件,就要依赖于第三方的工具了。

论坛徽章:
0
2 [报告]
发表于 2005-06-08 13:57 |只看该作者

[有趣的Python 7] 解释?还是编译?That is the question

为啥是python 7

现在最高的版本才是2.4啊。

论坛徽章:
0
3 [报告]
发表于 2005-06-08 15:40 |只看该作者

[有趣的Python 7] 解释?还是编译?That is the question

原帖由 "sleetdrop" 发表:
为啥是python 7

现在最高的版本才是2.4啊。

这个是sakulagi系列文章的第7篇,不是Python的版本,呵呵

论坛徽章:
0
4 [报告]
发表于 2005-06-08 20:48 |只看该作者

[有趣的Python 7] 解释?还是编译?That is the question

.pyc是中间代码,类似java和.net的中间代码.
可以让python的虚拟机装载中间代码运行,py2exe的工作原理与此类似.
你可以将用py2exe生成的zip文件打开,可以看到里面有pyc文件.

论坛徽章:
0
5 [报告]
发表于 2008-01-19 16:41 |只看该作者
当然是解释运行,不过生成的字节码倒挺有趣的.因为解释运行,所以源码开放,所以他成为是开源中的中流抵柱.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP