首先我们先规定Python解释器指的是 CPython解释器。
1.py文件和pyc文件的区别是什么?为什么Python的解释这两个文件都能运行?
CPython虚拟机既可以执行python文件,又可以执行编译过的pyc文件,这是因为CPython里面包含了一个可以编译py文件的编译器,执行py文件时,第一步就是要在cpython内部将py文件翻译成字节码文件即pyc文件。
例如创建hello.py文件
print 1+2+3
使用命令python -m compileall hello.py 编译成 hello.py文件
使用 hexdump hello.pyc 输出 pyc文件
0000000 f303 0a0d 1760 5ec9 0063 0000 0000 0000
0000010 0200 0000 4000 0000 7300 0009 0000 0564
0000020 4700 6448 0003 2853 0006 0000 0169 0000
0000030 6900 0002 0000 0369 0000 4e00 0369 0000
0000040 6900 0006 0000 0028 0000 2800 0000 0000
0000050 0028 0000 2800 0000 0000 0873 0000 6800
0000060 6c65 6f6c 702e 7479 0008 0000 6d3c 646f
0000070 6c75 3e65 0001 0000 0073 0000 0000
000007d
2.Python和JAVA都编译成字节码,但为什么Python就叫解释器,JAVA叫虚拟机呢?
CPython内部流程如下图所示:
- Scanner 对应词法分析器, 将从文件输入的代码切分为 token
- Parser 对应语法分析器, 在Scanner 的分析结果上进行语法分析, 建立 AST
- Compiler 根据建立的 AST 生成指令集合 Python 字节码 (这里的 .pyc 文件类似于Java 的 .class 文件)
- Code Evaluator 执行代码
Jython 是把 Interpreter 给重写了生成的是.class 文件。
简单的说Python 的解释器包含了 Python 的虚拟机。因为Python的解释器是包括Scanner 、Parser 、Compiler 、Code Evaluator的。
Java的编译和执行是分开的,java虚拟机只负责执行。jvm对应的就是Code Evaluator
Python的文件 比如test.py 只需要 python test.py就可以直接编译和执行
参考:
来源:oschina
链接:https://my.oschina.net/u/4344191/blog/4288664