龙空技术网

python代码是如何执行的?

oeasy 238

前言:

现时同学们对“python程序的执行方法”大致比较关心,大家都想要了解一些“python程序的执行方法”的相关资讯。那么小编在网上网罗了一些有关“python程序的执行方法””的相关资讯,希望咱们能喜欢,我们快快来了解一下吧!

解释运行程序 回忆上次内容py 文件的程序是按照顺序一行行挨排解释执行的我们可以 python3 -m pdb hello.py 来对程序调试调试的目的是去除 bug别害怕 bugbug 会有提示我们也就知道如何 debug 调试顺序执行程序在文本中从上到下是一行行写的调试的时候也是从头到尾一行行执行的但是执行的时候是如何把代码一行行解释执行的呢?说到底 python3 到底是个啥呢?python3 又是怎么解释 hello.py 的?这两这节课相当复杂如果感觉太过复杂可以直接跳过不影响后面的理解 我们先要看看python3对Guido.py做了些什么???tokenize首先把字符分组成词词法分析(lexical analysis)中把原来的字符流变成了词的流token(令牌)流词法分析之后输出的是一个token流什么是token流呢?首先要知道什么是tokentokentoken令牌古人说听我号令号指的是号角令指的是令牌急急如律令令行禁止怎么把源文件变成一个token流呢?python3模块这个东西是python3的一个模块具体怎么运行呢?token流我们尝试运行python3 -m tokenize guido.py对guido.py进行词法分析分析出来的词(token)流长什么样子呢?这个词怎么理解呢?token流第0行设置了编码格式第1行[0,5)字符是第1行第1个tokenprintprint是一个Name(名字)第1行[5,6)字符是第1行第2个token((是一个Operator(操作符)第1行[6,30)字符是第1行第3个token"1982------Guido in cwi"这是一个String(字符串)第1行[30,31)字符是第1行第4个token))是一个Operator(操作符)第1行[31,32)字符是第1行第5个token\n\n是一个NewLine(换行符)换行符意味着第一行结束第2行...词分析出来之后呢?组词词分析出来就是怎么组词的问题哪些词和哪些词先组合哪些词和哪些词后组合生成一棵抽象语法树AST(Abstract Syntax Tree)具体怎么生成这棵ast树呢?引入ast模块具体怎么做呢?流程先把这个ast模块导入(import)进来然后读取guido.py并送到s然后对于s进行语法分析(parse)不过这乱七八糟堆一起怎么理解呢?缩进换行把分析的结果进行dump(转储)目前lanqiao.cn上面的python是3.8这个换行需要在3.9以上完成只能在本地演示一下缩进演示这个就是把词组成语法树的样子但是语法树还不能直接执行什么才能直接执行呢?翻译成字节码字节码(指令)才能真正执行怎么把ast转化为字节码(指令)呢?需要编译从一种语言到另一种语言从py文件到字节码(指令)我可以看看这个编译过程么?compile这个东西完全是乱码我看不懂啊?vi打开这个这个pyc文件二进制形态:set wrap设置换行可以看到他的二进制形态么?二进制:%!xxd把文件转化为二进制实在是看不懂啊能把这个字节码(指令)变成我们人能看懂的么?反编译disassembler这个词由两部分组成dis (反着来的)assembler (汇编语言)整体就是把py源文件编译成的字节码(指令)反编译(disassembler)成这些字节码对应的助记符(指令的含义)这可以用么?去试试!反编译(dis)python3 -m dis guido.py我们可以看见前面是行号每行对应4条指令LOAD_NAME 装载函数名LOAD_CONST 装载参数CALL_FUNCTION 调用函数POP_TOP 弹栈返回每条指令对应一个字节码那具体这个LOAD_NAME是什么意思呢?指令指令对应着一个字节码状态但是LOAD_NAME这条指令具体对应什么二进制字节状态呢?二进制状态我们找找程序中的4条指令对应的字节状态4条指令

指令助记符

指令含义

十进制状态

十六进制状态

LOAD_NAME

装载函数名称

101

0x65

LOAD_CONST

装载参数

100

0x64

CALL_FUNCTION

调用函数

142

0x8e

POP_TOP

弹栈返回

1

0x01

可以找到源代码的对应关系么?好像找到了但是0x83 对应的是 GET_AWAITABLE显然00 83是从表中的0号位置取得字符串变量01 83是从表中的1号位置取字符串以此类推,直到05 83那这些代码究竟是什么指令集的呢?龙芯intel还是arm呢?虚拟机的虚拟cpu这些字节码(bytecode)对应的是python虚拟机上面虚拟cpu的指令集怎么还有虚拟机虚拟cpu呢?我们先把这节课总结一下总结我们把python源文件词法分析 得到 词流(token stream)语法分析 得到 抽象语法树(Abstract Syntax Tree)编译 得到 字节码 (bytecode)反编译 得到 指令文件不过这个指令文件是基于虚拟机的虚拟cpu的指令集怎么这么虚呢?我们下次再说

本文章来自于《oeasy教您玩转python》()中第6个实验。

标签: #python程序的执行方法 #python编程代码怎么运行