• python代码是如何执行的?


    解释运行程序 🥊

    回忆上次内容

    • py 文件的程序是按照顺序

      • 一行行挨排解释执行的
      • 我们可以 python3 -m pdb hello.py 来对程序调试
      • 调试的目的是去除 bug
      • 别害怕 bug
      • bug 会有提示
      • 我们也就知道如何 debug 调试
    • 顺序执行

      • 程序在文本中从上到下是一行行写的
      • 调试的时候也是从头到尾一行行执行的
      • 但是执行的时候是如何把代码一行行解释执行的呢?
    • 说到底 python3 到底是个啥呢?🤔

      • python3 又是怎么解释 hello.py 的?
      • 这两这节课相当复杂
      • 如果感觉太过复杂
      • 可以直接跳过
      • 不影响后面的理解 😄
    • 我们先要看看python3对Guido.py做了些什么???

    tokenize

    • 首先把字符分组成词
    • 词法分析(lexical analysis)中

    编辑
    • 把原来的字符流
    • 变成了词的流

      • token(令牌)流

    编辑
    • 词法分析之后输出的是一个token流
    • 什么是token流呢?

      • 首先要知道什么是token

    token

    • token

      • 令牌

    编辑
    • 古人说听我号令

      • 号指的是号角
      • 令指的是令牌

        • 急急如律令
        • 令行禁止
    • 怎么把源文件变成一个token流呢?

    python3模块

    • 这个东西是python3的一个模块

    正在上传…重新上传取消

    • 具体怎么运行呢?

    token流

    • 我们尝试运行

      • python3 -m tokenize guido.py
      • 对guido.py进行词法分析
    • 分析出来的词(token)流长什么样子呢?

    编辑
    • 这个词怎么理解呢?

    token流

    • 第0行设置了编码格式
    • 第1行[0,5)字符是第1行第1个token

      • print
      • print是一个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》(https://www.lanqiao.cn/courses/3584)中第6个实验。

  • 相关阅读:
    【计算机网络】网络层:数据平面
    《Nature》论文插图的Matlab复刻第4期—单组多色柱状图(Part2-82)
    【DaVinci Developer专题】-44-Software Component软件组件的Multiple Instantiation多次实例化
    1772_WPS关闭WPS热点和云服务等模块
    Python线性代数傅里叶分析和动态系统模拟分析之一
    软件 | 快速计算网络自然连通度评估群落稳定性
    GraphRAG学习小结(4)
    在CentOS装个RocketMQ 然后用JAVA操作吧
    SpringBoot-Web开发-文件上传
    【大数据】NiFi 中的处理器(一):GenerateTableFetch
  • 原文地址:https://www.cnblogs.com/oeasy/p/16527324.html