从浏览器到JS系列(一)JS引擎,JS虚拟机,JS运行时(2)

接上一篇的问题:

1.什么是虚拟机

2.什么是指令集

3.什么是字节码

4.什么是字节码指令集.....

5.JS引擎的组成部分

6.什么是解释器和编译器

7.什么是JIT

从第二个问题开始,什么是指令集

指令顾名思义就是用来引导某一硬件工作的方式的,集即集合的意思,也就是很多种不同引导指令的集合!

指令集是存储于CPU内部,用来引导CPU进行加减运算和控制计算机操作系统的一系列指令集合

可以这样说指令集是软件与CPU之间的一个接口而CPU就是接口的实例化

其实指令集就是一组汇编指令的集合,不同的CPU使用的指令集不同。

————深度理解“指令集”

然而,机器语言太过于专业难懂,科学家们用了一种高级的语言来代替它,这就是汇编语言。汇编语言更接近人类的语言,用编译器可以将汇编语言转为机器可以识别的机器语言。

这编译器就相当于一个翻译机,它根据设定好的规则,将汇编语言一条条转化为二进制语言。

这个时候,问题就来了!编译器所用的规则,是由设计计算机(现在归结为CPU)的人规定的,那么用汇编语言的工程师,就必须按照他所给的规则来编,要不然,编译器转化出来的二进制语言就是乱七八糟的,在电脑上反应出来的就是蓝屏了,因为CPU根本不管你输入的101010是对是错,它就按给的来执行,这时出来的结果就不知道是什么东西了。

好了,设计CPU的人给出的编写规则就可以说是指令,这一系列的规则就是指令集(合)。

————通俗的说一说指令集是什么?CPU是如何工作的?

  指令集是指令的集合,指令是指导CPU工作的命令。指令有不止一种形式,如有汇编指令和机器码指令。代码是层层翻译,即是层层抽象。

3.什么是字节码

字节码(Bytecode)是一种包含执行程序、由一序列 op 代码/数据对 组成的二进制文件字节码是一种中间码,它比机器码更抽象,需要直译器转译后才能成为机器码的中间代码。

通常情况下它是已经经过编译,但与特定机器码无关。字节码通常不像源码一样可以让人阅读,而是编码后的数值常量、引用、指令等构成的序列。

字节码主要为了实现特定软件运行和软件环境、与硬件环境无关。字节码的实现方式是通过编译器和虚拟机器。编译器将源码编译成字节码,特定平台上的虚拟机器将字节码转译为可以直接执行的指令。字节码的典型应用为Java bytecode。

字节码在运行时通过JVM(JAVA虚拟机)做一次转换生成机器指令,因此能够更好的跨平台运行。

————机器码和字节码

字节码是一种中间码,经过编译生成。字节码由虚拟机运行,因此与平台无关,因虚拟机本身就是跨平台的。Java号称一次编译处处运行,其原理就是Java源码经编译后并不直接生成机器码,而是生成Java字节码。Java字节码由JVM运行,所以只要有对应的JVM,即可处处运行。

比对一下JS引擎的执行过程:

最后回到JavaScript语言上来。前面已经说了它是一种解释性脚本语言。是的,它的确是,但是随着众多工程师不断投入资源来提高它的速度,这使得它能够使用了Java虚拟机和C++编译器中众多的技术,它的工作方式也在演变。早期也是一样由解释器来解释它们即可,就是将源代码转变成抽象语法树,然后在抽象语法树上解释执行。随着将Java虚拟机的JIT技术引入,现在的做法是将抽象语法树转成中间表示(也就是字节码),然后通过JIT技术转成本地代码,这能够大大的提高了执行效率。当然也有些做法直接从抽象语法树生成本地代码的JIT技术,例如V8

————理解WebKit和Chromium: JavaScript引擎简介

可以JS源码解析时也会生成字节码(统称),由JS引擎中的字节码解释器执行。既有虚拟指令集,也能处理字节码(类似JVM),所以JS引擎也被视作虚拟机的一种。

4.什么是字节码指令集

这个概念就比上面的清晰多了。拆做一半,字节码即经过编译的中间码,指令集即指引CPU工作的一系列指令集合。二者结合起来即以字节码形式表示的指令集合。但不同于机器码指令集,它不能直接指引CPU工作,CPU一般只能直接执行机器码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值