00:00
好,我们回下上节课内容啊,上节课讲的是什么呢?上节课讲的是这个PPI文件到底是怎么被解释执行的,首先呢,是把字分成词是吧?哎,就是leical analy词法分析,然后把这个这个token流生成啊,然后呢,词呢,再生成一棵语法树,谁先呀谁后啊,谁跟谁在一起啊,哎,生成一个语法树啊,语法树之后怎么办呢?再编译,把它翻译成计算机的这个Python能够识别的这个这个这个PYC文件,也就是pthon虚拟机,这个虚拟CPU能执行的东西,哎,但这个东西我们看不懂,可以把它Dis啊,就是Dis啊symbol可以把它反编译,反编译,反编译得到什么呢?得到这个指令注记符,哎,就这么一个过程,那么这个Python虚虚拟机呢,上面运行的是虚拟CPU,虚拟CPU源自什么呢?源自我们的真实CPU什。
01:00
什么是CPU?我们去这个这个网上可以搜啊,什么是CPU,有多少钱,哎,有现在主要是什么呢?主要是啊有M的,有这个X86的是吧?这这些指令集,那么不管是什么样的指令集,那它其实都可以跑拍子,诶怎么跑拍子呢?首先我们看看这个拍子在哪啊,Which which谁啊,Which拍子拍子在哪呢?在这个位置啊,在这个位置,那么既然它在这个位置,我是不是可以把它做一个列表啊。这个列表,我们看看这个东西到底是个什么。它呢是13个字节,是一个软链接,哎指向谁呢?指向这个PYTHON3,那PYTHON3是什么呢?我们就继续观察,PYTHON3是个软连接,又指向什么呀?哎,指向Python3.8 Python3.8是什么呢?诶这个大了是吧,55.5.3兆是吧,5.3兆,那这5.3兆到底是个什么呢?我们呀,把它拷到我当前的这个文件夹,也就是把这个。
02:07
啊,USR底下的bin底下的Python3.8给它拷过来,拷到哪呢?拷到当前的这个这个位置,拷过来之后呢,我当前这就可以看到这550.8兆兆的这个东西了,哎,55.3兆的东西啊。差点说成258兆东,哎,然后呢,我们就可以看到这个东西,那这个是什么呢?我们就去编辑它一下,编辑这个波浪线,就当前的这个Python3.81大堆东西是吧,总共多少行呢?总共两万多行,两万多行,但是呢,它可能每一行都特别长是吧,每每一行可能特别长是吧,你看这个位置,它就这一行有。有这个有有这么多个字符是吧,有四万一行就四万多个字符是吧,这咱也看不懂是吧?有人能看懂吗?其实有人能看懂,就是CPUCPU呢,它其实能把这些东西啊,就是这些是。
03:03
操作码是吧,我们呢,看不懂,看得懂什么呢?这个指令也就是我们的汇编指令啊,和操作码这个对应关系,首先呢,先把它变成这个助剂符的形,那这这个字节的形态,哎,字节的形态也就也就是这个状态,哎,当我们进到字节状态的时候呢,我们可以看到还是这么一个思路,左边最左边是未知信息啊,一行有16个字节。哎,那么是是第二行呢,是从一零开始,也就说这是0123456789ABCDEF,然后是一零啊1011,这是EF是这么一个,是这么一个位置啊,这个是位置,这是字节形态,字节形态,然后这边是这种字节形态,如果说我们把它当成字符串来观察的话,那就是字符串形态。
04:00
好,这个是什么呢?这就是我们的这个这个虚拟机的样子,虚拟机的样子,那么我们把它转成字节形态之后,我们可以看到它有相当多的字节是吧?相当多的字节5.8兆嘛,那么这个东西呢,我们能不能把它存存100,我们就别叫这个pad3.8了。叫叫什么呢,3.8H1,哎,把它另存一下,然后呢,再把它退出,哎,这个时候我们可以观察一下这个是什么呢?我们在当前的这个3.8是能运行的吗。3.8是不是能运行的,哎,确实是能运行,然后呢,这个字节形态呢,就比它大了很多,因为它有很多位置信息啊,还有很多的这个字节形态啊这些东西,那既然这个能运行的话,我怎么才能知道这个这个东西它的这个。呃,反汇编的汇编语言状态呢,就是OGOG目标就是我们要这个,就是已经产生的这个这个Python3.8,也就是说这个Python3.8要把它怎么样呢?要把它杠D邓铺出来啊,就是专出出来里面到底有些什么反汇编的东西,就可以把它变成Python Python3.8的asm文件。
05:26
嗯,Asm asm的意思是什么呢?就是。啊啊什么,那么我们可以看到这有一个水拍的。3.38asm,还有一个Python3.8,然后是HAP是16进制,那么我们既然这样呢,我们就可以找到这个关系是吧,找到这个关系。我们呢用VR哎空格python3.python。点38ASM就是这个东西,观察一下它。我们可以看到确实是确实是都是指令是吧,指令啊,Push啊,还有这个占卜啊之类的这之类东西,那么总共呢,是六万多行,也就是说他把每一个字都或者说几个字节都变成一个一个这么一个状态,哎,但是我们要找到的是什么呢?找到的是对应关系是吧?找到对应关系,那么怎么样找到这个对应关系呢?我们就得想办法啊,VI空格杠O空格,然后呢,我们上边呢是呃是字节状态,下边呢是这个汇编状态,然后把这个东西给它打开,打开了之后呢,它就分成上下两层是吧,上下两层CTRLJ就是的,就是可以。
06:49
就是切换这这个东西啊,CTRLK就是往上走,CTRLJ是往下走,现在在这儿呢是吧,然后JJGGGG就可以到到底下的这个头啊CTRL加K呢。
07:01
哎,就是往CTRL加J啊,就首先你得是。这个在这个状在这个在这个当前活跃active的情况下,然后就可以可以找到,那我们现在要找的是什么呢?我们要现在要找的是这个东西,我们翻啊这个东西啊,我们这块可以看到它这个是有一个开始位置,就是64位机的这么一个啊分支结束,然后呢,后边是CPU指令,这个是什么指令呢?是4883EC08,是这么一个指令,那什么是483EC08,那么我们就得上去去找那个4883EC08,那么就是CTRL加K翻上去,然后斜杠在这块会进行搜索四八。八三,哎,我们可以看到4883找到了是吧?哎,9688961这个位置,然后呢,EC08是不是又找到了EC08,然后是488B488B,然后是5亿。
08:05
啊,0510511是吧,然后是5F。4D,然后是0048,再往后是八五到八五这块其实就是往后走了,基本上基本上找到这个位置,这个位置是一个唯一的位置,也就是说这个NN可以找到这个相关的位置,这这个位置是一个唯一的位置,那我就找到这个位置了是吧。那么这个东西是不是应该是一些指令呢?那我们就看看它到底是什么指令,什么指令啊,指令就是计算机执行的一条一条的这种字节码。那么指令的集合呢,就是指令集,现在有很多种指令集,那我们这个用的是什么指令集呢?我们可以可以在这个底下的这个位置。在这个底下的位置找到这个指令集呢,是X86杠六四,X86杠六四呢,应该是属于是X86类型的指令集是吧,指令你指令级必须得是明确,要不然那你就你你就你如果把ARM上运行的东西放在X86上想运行,那那基本上它就是驴唇部对马嘴是吧,鸡同鸭桨,哎,你等于是就就完全对不上是吧,所以不同的这种指令集呢,需要移植是吧?移植这个时候这个单词啊,就看到我们的农耕文化的的基础是吧,移植就是。
09:30
把这个花哎,挪到那个盆里去,这个感觉。或者把这个树或者庄稼,哎就就就挪挪到别的地儿去,哎,那么那么英文叫什么呢?英文叫port啊,Port是港口啊,就是运输嘛,是吧,运输把一个3A大作移植到一个呃,这个PC机上去。那这个里面呢,其实就可以找到这个这个东西,那么他说什么呢?OBG,但说什么呢?说这个4883EC08对应什么呢?对应减法,哎,这谁规定的呢。
10:05
哎,要说这个规定呢,其实就得知道它的架构,我们已经知道它的架构是X86杠六四,那么就得找到英特尔的这么一个说明书,去英特尔官网去下载这个说明书,说明书到这儿呢,我们就可以找什么呀,找找找这个CTRLF4883,哎找不到是吧?那但是是用二进制的。四这是四,然后八,哎,然后是八,这个东西就应该是四,八这个B呢,既可以是零,也可以是一,然后这是三啊000,呃,001。啊,我们可以看到这个这个位置就是。就是这个,这个是什么指令呢?是立即的八位减,立即的八位减,也就是说它对应一个什么呢?它对应一个减法,是整数的减法,它是从一个寄存器里边减一个立记数啊,减一个立记数,那这块其实也就对应上了,对吧?哎,就找找到这个位置,它对应它的这个这个类型,然后它这个有什么内存减呀,什么立即数减呀,或者寄存器减呀,有各种各样的几倍的都可以有,那那我们可以看到这块是什么,这个东西就是一个立记数啊,就是八减八,让这个东西减八是什么呢?是从这块减半是吧,这个这个就是就是谁减谁的这么一个意思。
11:29
哎,立即数和寄存器的这么一个减法运算,哎,那么就对应这个4883 4883找着了是吧,确实是一个减法啊,也就是说我们使用这个obj弹MP找到这个指令集是对的,那除了减法之外还有什么样的运算呢?我们可以就这翻一下幕府是吧,移动,然后这是测试,然后根据测试是否跳转啊调用等等,哎,返回。这这些都是一些,就是那这些呢,就是X所谓的X86指令集啊,就是X86架构这么一个事儿是吧,也就是说我们的这个。
12:08
这个所谓的所谓的Python3.9在哪呢?在这个硬盘上呢,是吧,挂挂在这个这个位置上,然后呢,它就是5.3兆,它就搁在这那搁在这儿之后呢,它就是就就在那呆着是吧,什么时候你要你要你要说我运行一个拍子3.9或者拍子3.8,那你就运行它,就把它从这个硬盘上,哎就移动到哪呢,就移动到这个内存里,哎,然后再从内存里面的I盘去执行,诶但如果说我们用当前的这个东西。去运行一个gridle.py这个是个什么意思呢?也就是说我们先把这个东西装进来,然后这个东西再把这个东西装进来,然后装进来之后再进行什么呀,词法分析,语法分析,然后编译,然后然后再放到这个,它自身就是一个什么,就是一个Python虚拟机,然后就是说就相当于我们的这个计算机上的这个这个模拟器一样,就相当于我们计算机上的这个,比如说安卓模拟器,就模拟成一个我我不是ARM的架构,但是我把自己模拟成一个安卓的这么一个东西就可以用是吧,就可以用,然后呢,我们就可以找到这样的一个过程啊,找到这么样的过程,那么然后然后他他他其实就他就就就就接管了这些东西,然后就在这个Python虚拟机上面去运行这个东西,已经编译好的这么一个这个P文件,是这么一个过程。
13:41
这个呢,就是这个这个这个解释执行的整个流程,执行个程,简单来说呢,就是我写了点,然后呢,就是终端运行这个解释器,然后就把它给解释执行了,这是一句话的事,但是呢,实际上是也经历了一些法语法分析,还有这个这个编译,然后然后具具体运行这么一个过程。
14:07
那么为什么不同的架构,比如说M,或者这个X86,或者所有的mixs之类的都可以运行Python呢?哎,是因为Python它其实是一个。是一个Python虚拟机,只要只要你有这个PY文件,那么那么我这个Python虚拟机是在你这种目标的架构上编译的啊,你你你这这个ARM上有ARM的这个这个。Python,然后是在安卓系统之上,X86呢,它有X86的这个这个架构是在这个Windows系统之上,那这就是这么一个过程,我们看一下底层啊,底层比如说物理层,就是物理原料是吧,然后在子之上呢,就可以有晶体管物理原料,比如说有P啊,有N呐,有导啊,有不导啊是吧,有半导啊,然后形成晶体管,晶体管二级三级,然后再形成门电路,门电路就指的是什么呢?就是。
15:07
逻辑啊,语或非这些真真假假的东西,然后在此之上呢,再形成这个这个这个所存器呀,还有一些加法器呀之类的东西,这些各种各样的这个指令就是加法也好,锁这个加法也好,这个移动也好,它就构成什么呢?构成指令集,诶到这儿为止呢,它就是硬件的部分,硬的东西,诶再往上呢,它就是把这些指令集呢,要对应什么呀,对应字节码,一个一个的字解码,这字解码呢,它它其实是有汇编语言的,它就咱看不懂这机器码,咱们就可以怎么样,就可以用汇编语言去编写程序,但这个东西呢,离机器码比较近,但是离这个人的思路比较远,所以有高级语言,比如说C,哎,甚至有拍子是吧,拍子去编写这个东西,然后呢,再往上呢,就是就是C语言可以有算法,拍子也可以有算法,然后然后在此之上的应用,这这么一一个东西,那为什么。
16:08
不管是Windows还是Mac都可以去运行print,这个函数呢,是因为这个函数它是。基于你这个架构的,你这个系统的类库的这么一个过程,那么我在你这个上面用用就可以,就可以调用这些这些就可以使用你这些指令就可以,就可以调用这些输入输出这些基本的操作。这么一个过程,这个呢就是它跨平台的原理,你可以看到它还支持什么呢,Solo系统啊,VMS系统,惠普unix啊,Ipad之类的,他什么都支持啊,什么都支持,所以Python呢,就是跨平台这方面做的很好。这个pad3.8本身是个二进制文件是吧?哎,它这个东西是个二进制文件,然后呢,它可以执行你这个上面真实的CPU的真实的指令,是这么一个过程,然后呢,这次是我们非常烧脑的一个实验,先总结一下。
17:13
PYTHON3这个东西是个二进制的东西,它里面一条一条的都对应二进制的指令,这些指令呢,都可以去执行啊,这什么什么指令呢?不同的机器有不同的指令集,那我们这个上面呢,就是S86的指令集,那这个这个东西一大堆指令,它怎么用呢?这些指令干点什么活呢?首先就是如果你执行一个P文件的话,那么就是把这个P文件拿过来,然后词法分析,语法分析,生成ast,生成ST之后再生成字节码,然后再把这些字节码放在Python的虚拟CPU上进行执行,哎,这就是这么一个过程,比如说执行一个最简单的hello word,是这么一过程,那为什么我们总是从hello word开始呢?哎,学什么语言都是为什么呢?我们下次再说。
我来说两句