00-分类与执行过程

一、分类

1.2.x 与3.x

        Python 2.x is legacy, Python 3.x is the present and future of the language。

2.Python家族

        CPython、JPython、IronPython等等一般是其编译的字节码不相同,为了特定的虚拟机环境识别而封装开发的不同类型。

  •   C语言实现,CPython,扩展可用C/C++
  •   Java实现,Jython,扩展可用Java
  •   .Net实现,IronPython,扩展可用C#

二、执行过程

1.    编译型语言与解释型语言

  计算机是不能够识别高级语言的,需要编译(编译器)和解释(解释器)把高级语言转变成计算机能读懂的机器语言。

  编译型语言在程序执行之前,先会通过编译器对程序执行一个编译的过程,把程序转变成机器语言。运行时就不需要翻译,而直接执行就可以了。最典型的例子就是C语言。

  解释型语言就没有这个编译的过程,而是在程序运行的时候,通过解释器对程序逐行做出解释,然后直接运行,最典型的例子是Ruby。

  解释型语言和编译型语言的优缺点,编译型语言效率比较高源于运行前已经编译而少掉了“翻译”的过程。但是我们也不能一概而论,一些解释型语言也可以通过解释器的优化来在对程序做出翻译时对整个程序做出优化,从而在效率上超过编译型语言。

  此外,随着Java等基于虚拟机的语言的兴起,我们又不能把语言纯粹地分成解释型和编译型这两种。

  

  • Java首先是通过编译器编译成字节码文件,然后在运行时通过解释器给解释成机器文件。所以我们说Java是一种先编译后解释的语言。
  • 命令行中如何执行一个Java的程序:
  • 1 javac hello.java
    2 java hello
  • C#首先是通过编译器将C#文件编译成IL文件,然后在通过CLR将IL文件编译成机器文件。所以我们说C#是一门纯编译语言,但是C#是一门需要二次编译的语言。同理也可等效运用到基于.NET平台上的其他语言。
  • Python和Java/C#一样,也是一门基于虚拟机的语言,准确的说是一门先编译后解释的语言。

2.    运行过程

(1) PyCodeObject与pyc文件

  因为 pyc 文件存储的都是一些二进制的字节数据,而不是能让人直观查看的文本数据,因此也称作字节码文件。被编译后的字节码文件会交给Python虚拟机依次读入每一条字节码指令,并在当前的上下文环境中执行字节码指令。

  一个 pyc 文件包含了三部分信息:Python 的 magic number、pyc 文件创建的时间信息,以及 PyCodeObject 对象。

  magic number 是 Python 定义的一个整数值。一般来说,不同版本的 Python 实现都会定义不同的 magic number来保证 Python 兼容性。比如通过检查 magic number 不同限制低版本编译的 pyc 文件不能让高版本的 Python 程序来执行。由于不同版本的 Python 定义的字节码指令可能会不同,如果不做检查,执行的时候就可能出错。

  在 Python 的世界中,一切都是对象,函数也是对象,类型也是对象,类也是对象,甚至连编译出来的字节码也是对象,.pyc 文件是字节码对象(PyCodeObject)在硬盘上的表现形式.

  这个 PyCodeObject 对象包含了 Python 源代码中的字符串,常量值,以及通过语法解析后编译生成的字节码指令。PyCodeObject 对象还会存储这些字节码指令与原始代码行号的对应关系,这样当出现异常时,就能指明位于哪一行的代码

(2) 目的

  编译的目的为了重用,Python的解释器认为:只有import进来的模块,才是需要被重用的模块,更准确地理解,只把我们可能重用到的模块持久化成pyc文件。

  如果源文件没有被其他文件import也想生成编译文件,使用-m选项。

  字节码形式也增加了反向工程的难度,可以在一定程度上保护源代码。

(3) 生命周期

  以Python2.7.14为例,在查看import.c的源码后可知道,python在写入pyc文件的时候,写入了一个Long型变量,保存了文件的最近修改时间。

 

图2.1 import.c 中time的赋值

 

  每次在载入之前都会先检查一下py文件和pyc文件保存的最后修改时间,如果不一致则会重新生成一份,值得注意的是,如果源文件有改动,重新生成也只用编译改动部分。

 

图-2.2 import.c 文件中检查编译方法

转载于:https://www.cnblogs.com/lealb/p/8192964.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值