Python执行过程

我走在路上,和范斯聊天。我问他,Python到底是不是一门解释性脚本语言呢?范斯说,当然是。但是,严格来讲,我想不是这样的。
我们一起来看看Python的执行过程,如下图:

source code先经过编译器(居然是编译器),编译器会将源码变成字节码(bytecode),然后字节码会在虚拟机中按行进行解释,我想这就是它为什么叫解释性语言的原因吧。
这里的字节码就如同我们在汇编里面看到的汇编指令一样,只是更高层级的抽象;这里叫做虚拟机的原因是,虚拟机是对真实机器的模仿,Python虚拟机模仿了X86构造机器的运行时栈,所以把它叫做虚拟机。

字节码

字节码应该是至关重要的一环,因为它是虚拟机执行的依据。
字节码是如何得到的呢?
从源码到Parse Tree->AST->symbol Table -> CFG -> code object。

if you want to see the bytecode ,you can use the module named dis:

>>>python -m dis filename

if this is my source code:

i = 0
l = []
s = "hello"

如果你使用上面的命令行就会得到:

  1           0 LOAD_CONST               0 (0)
              3 STORE_NAME               0 (i)

  2           6 BUILD_LIST               0
              9 STORE_NAME               1 (l)

  3          12 LOAD_CONST               1 ('hello')
             15 STORE_NAME               2 (s)
             18 LOAD_CONST               2 (None)
             21 RETURN_VALUE

这段代码即为字节码。
字节码定义在头文件中。
最左面这一列对应着源代码的行号,根据字面我们就可以基本理解这些字节码的含义。而它就是运行在虚拟机中(X86栈模型的一个抽象)。
而在真正执行的时候,code object 负责保存字节码。所以,我们还应该看一下code object。

由PyCodeObject创建代码

如果想看上一段代码的PyCodeOject,你可以这样写:

<br />co = compile("func_0.py","func_0.py","exec")
type(co)    # this is a code object

dir(co)     # you can many info about code object

评论已关闭。

X