程序本质
回忆上次内容
-
py 的程序是按照顺序
-
一行行挨排解释执行的
-
我们可以 python3 -m pdb hello.py 来对程序调试
-
调试的目的是去除 bug
-
别害怕 bug
-
bug 会有提示
-
我们也就知道如何 debug 调试
-
python3 这个解释器到底是怎么执行的呢?????
-
python3 到底是怎么解释 hello.py 的?
-
我们得先来看看什么是 python3
啥是 Python3
#什么是python3
sudo whatis python3
#如果不能解释
sudo unminimize
# 更新时间比较长,更新结束后再
sudo whatis python3
-
帮助告诉我们
-
python3 是一种解释性的、可交互的、面向对象的编程语言
python3 在哪?
#python3在哪里?
whereis python3
#可执行的这个东西到底在哪?
which python3
在文件管理器中查看
-
这个 python3 是一个软链接文件
-
他指向 python3.8
-
python3 就是 python3.8
-
他俩存在一个位置
-
都在 /usr/bin 里面
-
python3.8 就在硬盘里存着
-
位置就在/usr/bin/python3.8
-
usr 是用户 user
-
bin 是二进制 binary
-
python3.8 是这个文件的名称
-
在运行命令的时候
-
把这个文件从硬盘装载到内存
-
然后用 cpu 开始逐行执行文件内容中的指令
研究 python3
#把python3拷贝到当前用户文件夹~
cp /usr/bin/python3 ~
#确认python3已经到用户文件夹
ls ~/python3
#查看python3文件细节
ls -lah ~/python3
#运行用户文件夹下的这个刚考过来的python3
~/python3
打开 python3
#用vi打开这个刚拷贝过来的python3
vi ~/python3
-
左下角 : 进入命令行模式
-
:%!xxd我们可以看到这个文件的二进制形态
-
%是指的对于所有行的范围
-
!是执行外部命令
-
xxd指的是转化为 16 进制形式
-
这个 xxd 命令 到底什么意思????
-
:q!退回到 shell 来看一下
关于 xxd
-
man xxd
-
xxd 可以查看文件的二进制形态
-
:%!xxd –r 可以还原回去 ????
-
反复横跳
对比
-
重新 vi ~/python3
-
:%!xxd
-
一行是(16)10 进制 个字节
-
G 到最后一行
-
有 343148 行
-
这就是 真正的机器语言????
-
存在硬盘上 01010 的二进制可执行指令!!
-
这些指令其实都能执行!!!
-
可是这个指令我们看不懂怎么办?????
查看 Python3 汇编指令
#把python3对应的汇编指令输出
objdump -d ~/python3 > ~/python3.asm
#分窗口分别打开打开python3 和 python3.asm
vi -o python3 python3.asm
查找对应关系
-
423000 就是初始的 cpu 开始执行指令的地方
-
endbr64 意味着 64位结束分支
-
-
/4883 找到上下的对应关系
-
也就是第一条执行的汇编指令
-
汇编指令是计算机 cpu 指令的助记符
-
指令的集合就是计算机的架构
-
架构也叫指令集
架构
-
不同架构的 cpu 就会有不同的指令集
-
我们目前的这个是 x86-64
-
除此之外 arm、MIPS、RISC-V 也是常用的指令集
-
不同的架构想运行相同的程序就需要移植
-
如果不移植的话
-
就像让一个意大利泥瓦匠看一份中文写成的烹饪书来砌墙
-
鸡同鸭讲
-
驴唇不对马嘴
查看指令集
-
可以在 shell 用 uname -a 进行查看本机所用的指令集
-
当前指令集是 x86_64
Python3 执行过程
Python3 执行的过程大致是这样
-
把参数 hello.py 导入内存
-
分析 hello.py 词法结构
-
把文件分成一个个 单词
-
通过单词组成表达式
-
通过表达式组成语句
-
比如 print("hello")
-
这就是一个语句
-
然后编译成 Python 虚拟机指令 的目标文件
-
使用 Python3 这个二进制程序
-
对于生成的语法树
-
进行解释并且执行
换句话说
-
简化版的 Python3 的执行过程是:
-
系统执行 python3 这个可执行文件
-
也就是把硬盘上的文件装在到内存
-
然后按顺序还行
-
python3 完成后续工作
-
给了 python3 一个参数 hello.py
-
使用 python3 这个解释器来解释 hello.py
-
一句句的依次解释执行
-
全解释完成后
-
这些都是基于解释器python3.8的
-
而解释器是用目标架构的机器语言直接在cpu上运行的
架构的层次
-
不同架构的 cpu 都可以运行 python
-
不同系统的环境都可以运行 python
跨架构跨平台原理
总结
阅读(832) | 评论(0) | 转发(0) |