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

news2025/1/12 19:07:44

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

回忆

  • 上次回顾了一下历史
    • 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")
  • 并保存为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
  • 升级之后就可以使用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
    • 把文件转化为字节形态

图片描述

  • 这纯纯的机器语言字节形态
    • 实在是看不懂啊😭
    • 这真的是指令么?
  • 究竟什么是指令呢?

指令

  • py文件每行print 对应4条指令
    • LOAD_NAME 装载(函数)名字
    • LOAD_CONST 装载常量
    • CALL_FUNCTION 调用函数
    • POP_TOP 弹栈
  • https://github.com/python/cpython/blob/main/Lib/opcode.py

图片描述

  • 这样 我们 能否找到
    • 4条指令 分别对应的 字节状态值

找到对应关系

指令助记符指令含义十进制状态十六进制状态
LOAD_NAME装载函数名称1010x65
LOAD_CONST装载参数1000x64
CALL_FUNCTION调用函数1420x8e
POP_TOP弹栈返回10x01
  • 可以找对应关系

图片描述

  • 我们从头捋一下

python3 执行过程

  • 不管是python3这个游乐场
    • 还是Guido.py这个python程序
    • 都在我们的硬盘上

图片描述

  • 先得把文件从硬盘读到内存

python3 执行的过程大致是这样

  • 先把python3.8这个主解释器
    • 加载到内存中
  • 然后 在x86-64的cpu上 执行
    • 模拟出 一台python虚拟机

图片描述

  • 准备开始 对py文件 解释执行

先编译

  • 然后把参数 Guido.py 这个需要执行的程序 加载到内存
    • 词法分析 得到 词流(token stream)
    • 语法分析 得到 抽象语法树(Abstract Syntax Tree)
    • 编译 得到 字节码 (byte_code)

图片描述

  • 也就是编译后 的pyc文件

解释执行

  • 不过 这个pyc指令文件
    • 是基于python虚拟机的 虚拟cpu的 指令集的

图片描述

  • 需要放到 模拟好的 python虚拟机中
  • 一条条指令 进行执行

换句话说

  • 简化版的 hello.py 的执行过程是:
    • 给了 python3 一个参数 Guido.py
    • 使用 python3 这个解释器来解释执行 Guido.py
    • Guido.py中的语句一句句地依次解释执行
  • 全解释完成 后
    • 退出python这个程序
    • 把控制权交回到shell

图片描述

  • 这些 都是基于 解释器python3的
    • 所谓的 解释器python3
      • 先编译成 python虚拟机的 虚拟指令字节码
      • 然后用 python虚拟机 直接执行虚拟指令
  • 而解释器(python3) 是
    • 在不同系统 不同架构的cpu语言上 运行的

图片描述

  • 那不同的系统、cpu架构
    • python3 为什么 都能正确地解释?

总结

  • 这次把py源文件
    • 词法分析 得到 词流(token stream)
    • 语法分析 得到 抽象语法树(Abstract Syntax Tree)
      • 这里确立了优先级
    • 编译 得到 字节码 (bytecode)
  • 字节码我们看不懂
    • 所以反编译 得到 指令文件(opcode)
      • 指令文件是基于python虚拟机的虚拟cpu的指令集

图片描述

  • 先从 python3最基础的

    • 变量声明和赋值来看看
      • python虚拟机是如何做的?🤔
  • 我们下次再说👋

  • 蓝桥->https://www.lanqiao.cn/courses/3584

  • github->https://github.com/overmind1980/oeasy-python-tutorial

  • gitee->https://gitee.com/overmind1980/oeasypython

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/436107.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode刷题集(五)(LeetCode1.两数之和)

学习目标: 掌握LeetCode第一题两数之和 学习内容: LeetCode第一题两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会…

ASEMI代理AD9951YSVZ原装ADI车规级AD9951YSVZ

编辑:ll ASEMI代理AD9951YSVZ原装ADI车规级AD9951YSVZ 型号:AD9951YSVZ 品牌:ADI/亚德诺 封装:HTQFP-48 批号:2023 引脚数量:48 安装类型:表面贴装型 AD9951YSVZ汽车芯片 特征 400 MS…

shell编程实例 — 实现4G开机自动运行,实时监测,断线自动重拨》

shell编程实例 — 实现4G开机自动运行,实时监测,断线自动重拨》 往事只能回味味道 于 2021-11-20 02:30:53 发布831 收藏 1 分类专栏: shell 文章标签: ubuntu linux udp 版权 ​编辑shell专栏收录该内容 3 篇文章0 订阅 订阅…

Mysql日志系统-InnoDB引擎层

一、redo log日志 接下来的两个日志,是innodb为解决不同问题而引出的两类日志文件。 redo log(重做日志)的设计主要是为了防止因系统崩溃而导致的数据丢失,其实解决因系统崩溃导致数据丢失的思路如下: 1、每次提交事务…

SpringBoot解决用户重复提交订单(方式二:通过Redis实现)

文章目录 前言1、方案实践1.1、引入Redis依赖1.2、添加Redis环境配置1.3、编写获取请求唯一ID的接口,同时将唯一ID存入redis 1.4、编写服务验证逻辑,通过 aop 代理方式实现1.5、在相关的业务接口上,增加SubmitToken注解即可 2、小结 前言 在…

华润数科、京东科技、京彩未来携手共进,求解“科技×产业”最大值

4月18日,华润数科、京东科技、京彩未来三方代表在中国深圳签署三方合作协议。面向产业数字化的市场机遇,华润数科物联网事业部总经理刘楚明先生表示,华润数科作为华润集团重点培育的数字科技业务单元,基于技术优势及资源整合能力&…

在SAP中使用QUERY

在SAP中使用QUERY 一、SAP query介绍 ​ QUERY是SAP提供的方便无编程基础用户的报表工具,使用图形化的界面,让用户托托拽拽就能轻松完成报表编写。我们可以将Query理解成QuickView的高级版本,它在QuickView的基础上增加的功能有&#xff1a…

一、摄影基础课

目录 第一章 控制曝光1. 曝光及曝光三要素1.1 曝光1.2 光圈1.3 快门1.4 感光度(ISO)1.5 曝光三要素之间的关系 2. 曝光模式3. 测光模式4. 曝光补偿 第二章 控制对焦1. 对焦区域2. 对焦模式 第三章 控制色彩 第一章 控制曝光 1. 曝光及曝光三要素 1.1 曝…

尚硅谷大数据技术Zookeeper教程-笔记01【Zookeeper(入门、本地安装、集群操作)】

视频地址:【尚硅谷】大数据技术之Zookeeper 3.5.7版本教程_哔哩哔哩_bilibili 尚硅谷大数据技术Zookeeper教程-笔记01【Zookeeper(入门、本地安装、集群操作)】尚硅谷大数据技术Zookeeper教程-笔记02【服务器动态上下线监听案例、ZooKeeper分布式锁案例、企业面试真…

外包干了4年,直接废了···

有一说一,外包没有给很高的薪资,是真不能干呀! 先说一下自己的情况,大专生,19年通过校招进入湖南某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了&#xff0…

[java/初学者]java常用API(1)——包装类

前言 在学习本课题之前,我们首先需要知道什么是API。 API,即Application Programming Interface,中文名称是“应用程序接口", 这些接口就是"jdk所提供"给我们使用的类,我们不需要去深究它是如何实现…

STM32+EC20实现4G无线通信

EC20是一款集成度非常高的4G无线通信模块,支持多种常见通信频段,能满足几乎所有的M2M(MachinetoMachine)应用需求。模块支持TCP/UDP/FTP等一众网络协议,内置多星座高精度定位GNSS接收机,快速提供准确的经纬度信息,UART…

vscode java环境扩展

下载安装jdk: Java Downloads | Oracle 下载安装maven: Maven – Download Apache Maven windows系统选择 Binary zip archive maven目录中的conf文件中有一个settins.xml文件 镜像&#xff08;mirrors&#xff09;二选一 <mirror><id>nexus-aliyun</…

影视动画设计有些SCI期刊推荐? - 易智编译EaseEditing

以下是几本影视动画设计方向的SCI期刊&#xff1a; ACM Transactions on Graphics: 该期刊是ACM&#xff08;Association for Computing Machinery&#xff0c;美国计算机协会&#xff09;下的一个子刊&#xff0c;涵盖了计算机图形学和交互技术等领域&#xff0c;也包括了动…

虚拟化技术 — 硬件辅助的虚拟化技术

目录 文章目录 目录硬件辅助的虚拟化技术概览CPU 虚拟化技术基于二进制翻译的全虚拟化技术&#xff08;Full-Virtualization&#xff09;需要改造 GuestOS 的半虚拟化技术&#xff08;Para-Virtualization&#xff09;Intel VT-x 硬件辅助的虚拟化技术&#xff08;Hardware-ass…

智芯Z20K11x串口printf重定向

智芯Z20K11x串口printf重定向 目录 智芯Z20K11x串口printf重定向前言1 串口代码编写2 Keil勾选MicroLIB库结束语 前言 智芯Z20K11x系列是基于ARM CORTEX M0的中低端微控制器&#xff0c;高达256K P FLASH 128K D FLASH&#xff0c;2路CANFD接口&#xff0c;4路UART/LIN接口&a…

综合能源系统中基于电转气和碳捕集系统的热电联产建模与优化研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

HashMap理解

简单介绍 HashMap是双列集合Map接口下的实现类&#xff0c;jdk1.8之前其数据结构是数组链表、jdk1.8之后是数组链表红黑树&#xff0c;是线程不安全的&#xff0c; 原理图&#xff1a; HashMap放值的过程&#xff1a; HashMap先是根据Hash算法算出key的hashcode码值&#xff0…

Vivado之VIO原理及应用

虚拟输入输出&#xff08;Virtual Input Output,VIO)核是一个可定制的IP核&#xff0c;它可用于实时监视和驱动内部FPGA的信号&#xff0c;如图所示。 可以定制VIO的输入和输出端口的数量与宽度&#xff0c;用于和FPGA设计进行连接。由于VIO核与被监视和驱动的设计同步&#xf…

Linux操作系统原理—内核网络协议栈

前言 本文主要记录 Linux 内核网络协议栈的运行原理 数据报文的封装与分用 封装&#xff1a;当应用程序用 TCP 协议传送数据时&#xff0c;数据首先进入内核网络协议栈中&#xff0c;然后逐一通过 TCP/IP 协议族的每层直到被当作一串比特流送入网络。对于每一层而言&#xff…