当前位置:   article > 正文

[oeasy]python0135_python_语义分析_ast_抽象语法树_abstract_syntax_tree_python 语义分析

python 语义分析

语义分析_抽象语法树_反汇编

回忆

  • 上次回顾了一下历史
    • python 是如何从无到有的
    • 看到 Guido 长期的坚持和努力

图片描述

  • python究竟是如何理解
    • print(“hello”)的?
    • 这些ascii字母如何被组织起来执行?

纯文本

  • 首先编写Guido的简历
print("1982------Guido in cwi")
print("1995------Guido in cnri")
print("2000------Guido in beopen")
print("2005------Guido in google")
print("2012------Guido in dropbox")
print("2020------Guido in microsoft")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 并保存为Guido.py

生成token流

  • 回到shell之后
    • 从字符流生成token流

图片描述

  • 这个过程叫做分词

分词

  • 首先把一个个字符组成词
  • 分析一下哪些字可以组成词
    • 术语叫词法分析(lexical analysis)

图片描述

  • 词分析出来之后呢?

组词

  • 词分析出来就是怎么组词的问题
    • 哪些词和哪些词先组合
    • 哪些词和哪些词后组合
  • 生成一棵抽象语法树
    • AST(Abstract Syntax Tree)

图片描述

  • 我能看看这棵ast树么?

引入ast模块

图片描述

  • 具体怎么做呢?

流程

  • 先把这个ast模块导入(import)进来
    • 第一句就是import ast
    • 回车之后没有任何报错
    • 那就是执行成功了
    • 后面也一样
    • 没有报错就是执行成功了

图片描述

  • 然后读取guido.py并送到s
  • 然后对于s进行语法分析(parse)

图片描述

  • 再把分析(parse)的结果进行转储(dump)

  • 看起来有点乱

    • 可以清晰一些么?

升级Python

  • 目前lanqiao.cn上面的python是3.8
  • 这个清晰缩进的格式需要在3.9以上完成
  • 需要升级
sudo apt update
sudo apt install python3.9
  • 1
  • 2
  • 升级之后就可以使用Python3.9了

图片描述

缩进换行

  • 只能在本地演示一下

图片描述

  • 这个就是把词组成语法树的样子
  • 如何理解这棵树呢?
  • 我们看一个例子

表达式运算

  • 如果给的表达式为 1 * 2 * 3

图片描述

  • 结合序为下图

图片描述

  • 前两个先结合
  • 得到的结果作为下一个运算的左操作数
  • 然后和第3个结合

结合序

  • 如果把 第一个* 改成 + 号
  • 其他什么也没加

图片描述

  • 表达式是1 + 2 * 3

图片描述

  • 后两个会先结合
    • 得到的结果 作为下一个运算的 右操作数
    • 然后再和1 进行 加法运算
  • 有了 语法树
    • 下一步 要做什么呢?
  • 这棵语法树 我们能看懂
    • 但是cpu 需要的是
      • 能执行的 一条条字节码指令

翻译成 字节码

  • 要把源程序 翻译成字节码 才能执行
    • 字节码 对应着cpu的指令
  • 怎么把ast 转化为字节码(指令) 呢?
    • 需要 编译(compile)
  • 从一种语言 到 另一种语言
    • 从py文件
    • 到字节码(指令)
    • 就是编译
      • compile

图片描述

compile

图片描述

  • 我可以看看这个编译过程么?

指令

  • instruction
  • python3 -m dis Guido.py
    • -m 代表使用模块
    • dis 代表反编译(disassemble)

图片描述

  • 我们可以看见
    • 前面是行号
    • 每行对应4条指令
      • LOAD_NAME 装载(函数)名字
      • LOAD_CONST 装载常量
      • CALL_FUNCTION 调用函数
      • POP_TOP 弹栈

编译结果

  • 先看看这个pyc文件
    • 注意他在__pycache__文件夹下

图片描述

  • :%!xxd
    • 把文件转化为字节形态

图片描述

  • 这纯纯的机器语言字节形态
推荐阅读
相关标签