解释型语言和编译型语言

  CPU 只能直接执行机器语言,所以需要将高级语言转为机器语言,这个过程分为两种,一种是编译,一种是解释。

  编译型语言是在程序执行之前,通过编译器对程序源代码进行编译,转为机器语言,直接运行,最具代表的就是 C 语言。

  解释型语言是指在程序执行的时候,通过解释器对程序逐行做出解释,直接运行,不需要提前编译,最具代表的是 Ruby。

  随着技术的发展,也出现了不同于以上两种的语言类型。C#在编译时生成中间码,在.NET 平台上运行。Java 首先通过编译器生成字节码文件,在运行时通过解释器解释为机器语言。

  Ps:动态语言和静态语言是指程序运行时是否能够改变改变程序的结构,与解释、编译型语言无关。Java 是解释型语言但不是动态语言。
  PPs:动态类型语言和静态类型语言是指语言的数据类型是在哪个过程确定的。动态类型语言在运行期间确定数据类型;静态类型语言的数据类型是运行前确定是
  PPPs:强类型语言和弱类型语言。强类型语言是指变量的数据类型不经过强制转换不能改变;弱类型语言的一个变量可以赋不同数据类型数值

编译器与解释器

  编译器与解释器都是将程序源代码转为二进制机器码,只是过程不同。

No1.png

  编译器将整个模块整体编译再去执行,此方式运行速度快,可以脱离编译环境运行;缺点在于任何一点改动都需要整体重新编译。

  解释器是在程序运行时边解释边执行,此方式运行速度慢,部分改动不需要整体编译;但不可脱离编译环境运行。

Python 程序运行原理

No2

  Python 与 Java 类似是一种混合型语言。在运行程序时首先将程序源代码编译为字节码(PyCodeObject),再有解释器生成机器码,交由 CPU 运行程序。

  字节码是一种中间码,比机器码更加抽象,需要解释器转为机器码。这种方式可以实现程序跨平台运行,采用在不同平台上的解释器即可生成符合的机器指令;同时也可以提高运行性能。

  常用的 Python 解释器有:

  1. CPython:官方版本,采用 C 语言开发。
  2. IPython:基于 CPython 开发的一个交互式解释器。
  3. PyPy:采用 Python 实现的 Python 解释器,采用 JIT 技术,执行速度快。
  4. Jython:运行在 Java 平台上的解释器,可以直接将 Python 代码编译为 Java 字节码。

PyCodeObject

  PyCodeObject 是 python 中的一个命名空间(有独立变量定义的 Code block 如函数、类、模块等)的编译结果在内存中的表示。PyCodeObject 包含了 Python 源代码中的字符串,常量值,以及通过语法解析后编译生成的字节码指令。PyCodeObject 对象还会存储这些字节码指令与原始代码行号的对应关系,这样当出现异常时,就能指明位于哪一行的代码。同时为了以后能够重复利用这些编译信息,Python 解释器会将编译的版本号、编译时间、PyCodeObject 等信息储存在 .pyc 文件中。

  并不是所有的 .py 文件都会生成.pyc 文件,只有用来 import 的模块会生成.pyc 文件,当 .py 文件修改日期比.pyc 记录的日期早时,便会重新编译生成.pyc 文件。(可以通过 py_compile 手动编译.pyc 文件,如 python -m py_compile XXX.py)

import 指令

  import 指令是用来载入 module 的,如果需要,也会顺道做编译的事。但 import 指令,还会做一件重要的事情就是把 import 的那个 module 的代码执行一遍,这件事情很重要。
Python 是解释执行的,连函数都是执行的时候才创建的。如果不把那个 module 的代码执行一遍,那么 module 里面的函数都没法创建,更别提去调用这些函数了。

  执行代码的另外一个重要作用,就是在这个 module 的命名空间中,创建模块内定义的函数和各种对象的符号名称(也就是变量名),并将其绑定到对象上,这样其他 module 才能通过变量名来引用这些对象。

  Python 虚拟机还会将已经 import 过的 module 缓存起来,放到一个全局 module 集合 sys.modules 中。这样做有一个好处,即如果程序的在另一个地方再次 import 这个模块,Python 虚拟机只需要将全局 module 集合中缓存的那个 module 对象返回即可。

此部分参考

Python 文件类型

  python 运行过程生成的几种常见文件

  1. .py 源代码文件
  2. .pyc 编译文件
  3. .pyw 用来设计 GUI 程序,运行时,不在出现 shell 窗口
  4. .pyo 编译文件,相对.pyc 而言是优化后的
  5. .pyd 由其他语言编写-编译生成的 python 扩展模块,实际上是封装的一个 module

此部分参考