00:00
行,那在咱们说清楚了,叫Java虚拟机的这个执行引擎,它有一个叫解释执行的过程,还有一个叫git编译的一个过程之后,诶咱们呢,带着大家呢,来看一个图,呃,这个图呢,这是我这个根据这个理解啊,咱们画出来一个图,应该呢,能够方便大家呢去,呃更清晰的看到我们整个这个张化程序的一个执行过程,那上面这块呢,我是以咱们这个人类的语言为例啊来说的,呃,各种各样的这个语言对吧?那对应计算机呢,咱们有各种不同的这个计算机语言,对吧?那咱们在第一章讲Java虚拟机的时候呢,也提到过,说Java虚拟机时至今日呢,它已经不完全是叫Java虚拟机了,任何的只要是能够按照这个GVM能够识别的这个自节码,指定的这个格式,你生成的这个自节码,它呢都可以在GVM上呢进行解释执行是吧,来进行去运行啊,这个咱们前面呢,不也有对应着一个这样的一个图吗。对吧,哎这呢,这个编译器的话呢,是它们各自的编译器啊,是不一样子的,行,这呢是我们说的这个事儿,然后呢,我这呢,画了一个这样的图啊,就是稍微形象点去理解,我们这儿呢,是不同的这个人的语言,你可以理解成呢,就是不同的计算机语言,然后经过我们这个编译器啊,可以称为呢叫一个语言统一的一个处理的一个东西啊,那处理完以后呢,就会出现这种啊乌拉乌拉乌拉是吧,这个你看不懂的这个呢,诶就称为呢叫磁解码文件,这个磁解码文件啊,咱们懂不懂,那计算机呢,不同的这个计算机啊也读不懂。
01:26
啊,也读不懂啊,但是的话呢,我们说这个呃,不同的这个计算机,只要呢,你这块呢想用呃不同的这个语言,只要你这块想用的是Java虚拟机,那么你这个生成自解码文件的规则呀,大家呢,就得是统一的啊,那么下边呢,就是我们Java虚拟机的一个执行过程,那么这个磁解码的话呢,我们说它有两种这个执行的方式,一种呢,直接叫做解释器啊,进行解释执行了,另外一个呢,叫做通过这个git即时编译器的话呢,进行一个编译,翻译成对应的这个机器指令。OK,是这样的过程,那么这里边这个细节啊,咱们一会儿再说啊,这也是咱们这一章呢,接下来给大家要谈的两块算是重心的这个内容,那么讲这个之前啊,我这块呢,又穿插了一个内容,叫做机器码指令和汇编语言啊,包括呢这个高级语言,呃,为什么要谈这一点呢?呃,谈这一节这个内容啊,其实呢,大家也可以完全的去网上去了解是吧?那主要原因是因为咱们一会儿呢机器指令啊,一会儿呢这个汇编啊,一会儿呢高级语言啊,一会儿这个嗯,这个字节码是吧?诶很多同学呢,可能比较懵啊,因为呢,咱们说时至今日,咱们能够做JA,做这个Java也好,做其他语言开发的同学也好,像这个Python的话呢,上手是不是更容易一些啊啊,大家呢,已经不完全是这个计算机专业的了。
02:40
啊,就是现在呢,学编程就有点儿像上个世纪90年代啊,这一说感觉好像说很长时间似的是吧,那其实就是大家呢,现在呢,呃,咱们现在这个算是主力军是吧,年轻人的主力军呢,就是这个九零后嘛。那那我就已经属于上一代了是吧,八零后了,那这个就是大家呢,那个时代的时候呢,呃,是不是人人都在学英语是吧?一个是咱们有这个亚运会啊,还有呢,是这个啊后来的奥运会等等啊,全民学英语啊,就那个时候呢,就是不管你是什么职业的是吧,年龄大小啊,大家都会去学英语,那现在的话呢,就是不管你是什么职业的,不管你年龄大小,当然这个年龄太大了,现在也没人去学这个编程了是吧?那年龄小的话呢,这个呃,下探到这个小学,甚至呢,这个学前就已经开始有这个少儿编程了。
03:26
啊,那么就学这个编程语言对吧,那这个编程语言呢,时至今日呢,已经是非常容易的去被接受了,当然这个呢,还是因为我们的语言呢,计算机语言越来越贴近于人的语言了,所以我们学起来这个成本呢也越来越低啊是这样个原因啊,那么在最初学习的时候啊,就是关于这个机器码呀,指令啊,这个汇编语言啊,这肯定是一开始啊,就是像这个,呃,我是八零后,那像这个七零后啊,那一批人,他们最先接触到计算机的,那这些呢,肯定是他们需要呢直接打交道的,那对于咱们接触高级语言来讲的话,这些呢,可能我们就不直接接触了。
04:00
啊,所以说大家对这样的概念呢,也不是特别的清晰啊,除非呢,你是这个科班出身的是吧?啊那这块呢,咱们来看一下这里边儿这个几个概念啊,大家呢,做一个了解。行,那首先呢这块呢,提到最基础的这个叫机器码,这个机器码就是采用二进制编码的方式来表示这个指令,所以呢,也可以称为呢叫做机器指令码啊,一个意思啊,或者呢,我们就称为呢叫机器语言,这个所谓的机器语言就是我们用010101就是用这样的二进制呢两个符号来表示的。啊,所以说我们编程的这个程序啊,这个就是完全由零一零一来构成的,那你要是去写010,那也也能算一个程序是吧,当然呢,你想这个程序一旦你要出错的话,这就很崩溃了。嗯,太抽象了是吧,不太好排啊这样。行说这个机器语言虽然能够被计算机理解和接受,但是呢,跟人的语言啊差别太大诶,不太容易理解和记忆啊,很容易出错啊,很清楚是吧?那用它编写的这个成绩呢,一呃程序呢,一经输入计算机呃,CPU呢就可以执行啊,因此呢,和其他语言这个编程相比呢,执行速度最快,毫无疑问,这个机器语言啊,它执行速度是最快的。
05:04
当然对于咱们人来讲呢,非常的不友好,对吧,这样啊,下一个呢,说这个机器指令跟这个CPU呢,也是密切相关,不同种类这个CPU呢,它的这个机器指令呢,也是这个,甚至这个差别非常大啊,大相迳庭这样的一个程度,OK,那这呢,首先提到我们这个叫机器码啊,也可以称作叫这个机器语言。OK,然后再往下的话呢,提到这个叫指令啊,在这个汇编之上呢,我们还有一个这个指令的概念啊,说呢,由于这个机器码只有这个临一构成啊,这个可动性太差,哎,人们呢,就发明了一个指令啊,就是特定的一些这个功能呢,我们就给它用一个特定的一个,呃,算是几个字符呢,给合一起,或者咱们也称为呢,叫做单词啊,比如mow是吧,这三个字符呢,合在一起呢,咱们就可以表示呢,叫传送数据。啊,传输数据的一个指令啊,INC是吧,这我们也是特定的一个指令啊,那么特定的一个指令呢,就比咱们用010啊要好很多,就像咱们说呢,大家上网的时候呢,咱们只会输入这个叫域名是吧,百度点com,你不会去输入百度那个IP地址的,因为你也记不住,因为对于咱们人来讲呢,咱们还是很擅长这种形象思维是吧,虽然说这个字符,呃,这个这个单词呢,也不是特别形象啊,像象形文字呢,更形象,当然呢,相较于0101来讲呢,这个已经友好很多了。
06:13
咱不能每个人都指望着是一个叫什么记忆大师是吧?记这些灵异零啊,太不靠谱了啊,这样是吧?啊,其实咱们人的话呢,就特别擅长这个形象思维啊,你在路上看到一个女生长发飘飘是吧?哎,然后呢,身材也挺好的,穿着呢也非常讲究啊,一扭头啊,这个这辈子也忘不了,哎,长得实在是太丑了是吧?哎,把你都吓着了啊呃,那么计算机来讲呢,你让他记住一张人的脸,他其实是很很困难的。啊,那计算机呢,就特别擅长是做运算啊,你让计算机呢做呃,五位数六位数七位数的这个加减乘除啊,它结果一定算不错啊,如果说算错了,那也是你编错了啊,你程序呢编错了是吧,就这样的啊。行,那么这呢,我们就提到一个指令的概念啊,那同样的道理,这个指令的话呢,由于我们这个硬件平台呢不太一样,所以导致我们这个指令的话呢,也是千差万别,哎,这个指令呢,跟我们这个机器码它俩是算这种一一对应的关系啊,是这样的,那么下边呢,就提到这个指令集,那就是指定的一个集合呗,那针对于不同的这个硬件啊平台,我们这块呢,这个指令集呢也是千差万别,那叉八六的这个指令集就对应的是叉八六架构的平台,那ARM指令集呢,就对应的是ARM架构的一个平台。
07:20
啊,有很大的差别,哎,这个大家注意啊,那基于这种差别呢,我们才能继续往下讲啊,然后下一个概念呢,我们提到这个叫汇编。啊,那么嗯,大家呢,现在这个学这个计算机的,嗯,应该呢,可能还有的学校会去讲汇编啊,但是的话呢,咱们开发现在已经没人再去写汇编了,是吧?除非你很老的程序呢,我们才考虑再用汇编的去维护,否则的话我们都不会去了啊,不会去用这个汇编了,咱们现在学的是不是都是一些高级语言是吧。啊,是这样的啊。行,那我们看一下这个汇编说呢,由于这个指令的一个可读性啊,实在太差了,所以人们呢,又基于这个指令啊,咱们再往上提升一层啊,这上提到叫汇编语言,那汇编语言当中呢,我们提到叫诸暨符,使用诸暨符啊,咱们去替代这个机器指定这个操作码。
08:09
啊,机器指令啊,然后呢,用这个地址符或标号呢,去代理这个指令啊,或者是操作数的一个地址,这个大家一听啊了解一下就完了。啊就完了是吧,也不用去深究啊,那么这呢,我们想说的就是这个汇编语言,诶我们要想去这个被咱们的程序啊,被这个CPU呢去解释执行,那你要注意这个汇编语言还一定要翻译成这个机器指令。就汇编语言呢,它是不可以直接被这个咱们这个硬件呢系统识别的啊,这个汇编语言呢,也需要翻译成这个机器指令,那翻译成这个机器指令的话呢,那你就得看这个机器指令呢,是不是对应的是哪一个硬件平台的呀,你是叉八六的呀,还是这个ARM的呀,那这时候这个翻译的时候呢,它又有一个一一对应关系。啊,这要注意啊,所以呢,你要记住的就是汇编语言呢,必须要翻译成机器指令才能够去识别并执行,它自己呢是不行的啊。好,那么基于我们说这个汇编语言呢,咱们再往上谈呢,这就叫做高级语言啊,那高级语言呢,像我们最初的像C语言是吧?哎,Fortune这张都算是这种高级语言了。
09:10
啊,高级语言,这高级语言特点呢,就是更接近于人的语言,对于咱们编程者来讲呢,就更加的友好。啊,就更加的友好,其实这个语言呢,它是层层封装的啊,你可以这样来理解啊,就是高级语言呢,它也不是不是说呢,直接呢,能够被咱们这个程序呢去执行的,那高级语言同样的呢,它也需要去翻译成对应的这个机器指令,它才能够被执行,只不过呢,它这个翻译呢,又分成了两种不同的情况,一种呢叫做解释执行的,一种就叫翻译执行,实际上呢,对应的就是咱们。诶,这个再回到这个图来看吧,诶对应的就是我们说的这个过程,要么是这个绿色的,要么就是这个蓝色的,或者呢,就是我们从这角度要么是这个,这就相当于这个绿色的,这呢就相当于这个蓝色的,哎这样两个过程,那这两个过程特点是什么呢?咱们一会儿呢来讲是吧。好,那这呢,就我们说清楚这个高级语言的这个事情啊呃,那接下来呢,有这样个图,这个图呢,希望大家脑子里边给他记下来。
10:02
啊呃,你基于不同这个,嗯,ARM架构也好,还是这个呃,叉八六这个架构也好啊要想呢,我们这个程序呢,能够正常的去基于我们这个硬件呢,去执行咱们说呀,诶你必须都要翻译成这个机器指令。或者我们叫这个机器码,因为呢,对于咱们这个不同的硬件来讲呢,它只认这个机器指令,它就认机器指令,然后呢,以前的时候,咱们还没有高级语言的时候呢,你就是用汇编呗,是吧,那汇编呢,需要翻译成这个机器指令,然后呢去解释执行,那么对于咱们这个高语言来讲,那那有同学呢,可能会这样想,哎,我画这个图呢,就是怕你有一些误导啊,这个错误认识啊,有同学会想说,诶这个高级语言包括呢,像一些书当中呢,也没有说的很明确。啊,因为咱们呃,很多同学呢,都是非不是学计算机的是吧,包括我也是哈,我大学呢,学的是这个数学应用数学专业啊,这个也没有说刻意的接触过多的这个计算机的这个基础的这些知识啊,然后读研究生的时候呢,才去补前面的些知识啊,组成原理,操作系统啊,编译原理是吧?哎,包括这个计算机网络啊等等这样的一些课程啊,那这个高级语言的话呢,咱们也不是说它呢,直接呢就翻译成这个机器指令去执行了,这不行,这个高级语言啊,他得先过汇编,然后呢,通过汇编呢,再去过这个机器指令。
11:17
再说一遍啊,高级语言呢,需要先这个把它呢翻译成汇编,汇编呢再翻译成这个机器指令,然后被我们这个具体的硬件架构上去来执行。哎,是这样的情况。哎,这个这个大家注意一下这个环节啊,行,那总之一句话呢,就是说我们这个语言呢,它是有一个层层递进的过程啊,就是我这里边想强调这个问题啊行,说清楚了,那么咱们这个自检码又相当于是什么呀。哎,或者说这个之前呢,我们先说这个图吧,刚才有同学呢,说这高级语言需要翻译成这个汇编,汇编再翻译成机器指令是吧,那么把这个高级语言翻译成汇编的过程呢,诶也可以称为呢,叫编译过程,那这个汇编语言翻译成基指令过程呢,可以称为叫汇编过程,这个了解一下就行,这两个名字呢,实际上呢,是基于这个C语言这样的一个称谓来的。
12:00
啊,那我这呢,就套用了这样的一个过程啊,这个图呢,不是特别清晰,这个大家了解一下就行,就是我们这个C程序或者C加这个程序,它在执行的过程当中啊,这是C的这个源代码,或者C加加源代码,它呢最终呢被执行在这个过程当中,我们说呢,它首先呢,首先这也是高级语言对吧,那高级语言的话呢,它需要进行一个叫编译的过程。这整个是它这个一个过程啊,它有个编译的过程,编译编译过程的话呢,它需要呢,去生成的,这叫哎叫这个汇编是吧?呃,使用这个汇编器对应的先得到他这个汇编的这个语言。然后汇编这个呢,在实现一个叫汇编的过程,就把你这个汇编语言这个代码再翻译成这个机器指令来去执行啊,所以呢,我上边这个叫法,这是通过咱们这个C或者C加加这个程序呢,咱们来说明的啊,就是高级语言呢,也需要呢,做一个汇编到机器指定的这样一个环节,大家呢把它记清楚啊,有的时候呢,去网上找这些资料的话呢,这个还还是很困难的哈,这呢我进入一下这个C的一个解释。行,那么这呢,就算是说清楚了,然后呢,咱们再说一下,对于Java程序来讲呢,它有一个特殊的一个概念,叫做自解码是吧?哎,这又是什么鬼,说这个自解码它是一种中间状态的,或者叫中间码的是吧,一种二进制的代码啊,一种中间状态的二进制代码,它呢比机器码呢更抽象。
13:16
啊,需要呢直译啊,直译器翻译以后呢,才能形成这个叫机器码。啊,那大家你想想咱们写的这个,随便我找一个咱之前写的这个程序,诶找这不行了,找这个out是吧。比如第九章随便呢,咱们找一个。啊,随便来一个吧,CTRLC这呢,就是咱们所谓的叫直接码。诶,我粘到这儿啊,那这个字节码的话呢,我这块比如使用这个notepad啊,打打打开啊,打开的话呢,我们使用一下这个插件啊,把它转换成这个,诶16进制的啊,哎,行,你这块来看,这就是这个资金码。嗯,很抽象是吧,你是不是很难翻译过来啊,这个我们需要讲自己码指令的时候呢,一点点的这样去抠啊才行啊,你得知道那个大的class这个文件结构呢,才能给它完全翻译出来是吧?哎,那翻译出来形成什么样的特什么样的这个结构啊,就就是翻译成,诶咱们呢,给大家这个之前讲的,哎,我这打开的话呢。
14:10
恩,用它不行,得用它。那就成这样了是吧,就跟咱们在这个idea当中,你看到这个结构一样。啊,就是我们要自己一点的翻译呢,最终的翻译效果呢,其实就是这样子的啊,这是常量值下边呢,这是你这个实现的,实现的这个相关的接口属性方法啊,这是它这个,哎,这个我们叫域是吧,这叫属性行这样个过程啊。行,那这呢我就关掉了,就是对于我们这个人来讲的话呢,咱看这个自建码呢,实际上呢,还是非常抽象的。啊,这个自检码呢,它主要的目的呢,是为了实现特定的软件运行,呃,实现这个特定软件运行和软件环境啊,它与这个硬件呢是没有关系的,因为本身呢,你看我们这个自解码文件,咱是希望呢,他们是不是就有跨平台的这个特点啊。啊,这资金码是吧,那么咱们前面呢,刚才说的是一个高级语言,需要呢在这里边去执行啊需要呢先到汇编,汇编呢再到这个集体指令,那中间呢,咱们这块呢,诶又出现了一个叫自解码,主要目的呢是为了实现这种叫跨平台性,然后呢,咱们这个Java虚拟机在这里边呢,维护了一个叫直引引擎,诶这个直引引擎啊,专门呢是用来处理这个子解码文件的。
15:16
哎,然后呢,我是解释执行啊,还是编译啊,哎,我们呢,再把它变成通过汇编,再变译成这个角七之令。哎,主要目的呢,是为了咱们实现这个跨平台这个特点。哎,是这样一个情况啊,行,这个呢,就是大家把这几个基本的概念呢,能够了解一下,哎关键呢,就是通过刚才这一节的讲解呢,你把这个图呢,能够给它记下来啊就可以了。
我来说两句