学前端做前端有一段时间了,但至今学得越多就觉得不会的也越多。同时知识越来越杂乱,没有结构,难以管理。所以虽然杂七杂八知道一些,但还是感觉很不扎实。受最近看的一篇文章的启发,决定写一个系列的文章用于总结所学。那篇文章是以我的水平,目前所看到的,最为全面的梳理前端知识结构的博文。十分感谢原作者的总结和分享,因他的启发,我对前端的知识脉络有了大致的认识。
在此先放上原文的链接:从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理,此文十分详实与清晰。而我接下来所写的这一系列的文章,不过是在他人的基础上添些茅草,并无自己的创建。这个系列的文章我会依上面那篇文章的结构写,初衷是想对自己所学的知识做一个整理。所以我的文章完全是按着自己的想法来,并不是以分享讲解为目的,所以会比较凌乱。如果说有什么价值,那就是为大家推荐了一些我认为好的文章,并以一定的顺序结构展示。
首先介绍三个概念:JS引擎,虚拟机,运行时。
虽然在网上查阅了一些资料,但也仍不是很清楚。先说JS引擎与JS虚拟机,下面是一些摘取自他人的看法。如侵权,请告知删除
“JavaScript 引擎”通常被称作一种 虚拟机。“虚拟机”是指软件驱动的给定的计算机系统的模拟器。有很多类型的虚拟机,它们根据自己在多大程度上精确地模拟或代替真实的物理机器来分类。
例如,“系统虚拟机”提供了一个可以运行操作系统的真完整仿平台。Mac 用户很熟悉的 Parallels 就是一个允许你在 Mac 上运行 Windows系统虚拟机。
另一方面,“进程虚拟机”不具备全部的功能,(只)能运行一个程序或者进程。Wine 是一个允许你在 Linux 机器上运行 Windows 应用的进程虚拟机,但是并不在 Linux 中提供完整的 Windows 操作系统。
JavaScript 虚拟机是一种进程虚拟机,专门设计来解释和执行的 JavaScript 代码
..........
JavaScript 引擎的基本工作是把开发人员写的 JavaScript 代码转换成高效、优化的代码,这样就可以通过浏览器进行解释甚至嵌入到应用中。事实上,JavaScriptCore 自称为“优化虚拟机”。
..........
按照上述关于虚拟机的定义,把 JavaScript 引擎称作进程虚拟机就很好理解了,因为它的唯一的目的就是读取和编译 JavaScript 代码。这并不意味着它只是个简单的引擎。比如,JavaScriptCore 就有六个“构建模块”可以分析、解释、优化、垃圾回收 JavaScript 代码。
其实“JavaScript引擎”从来都不是一个正式的叫法,只是大家习惯了这么叫而已。 这种非正式的叫法或许源自“execution engine”(执行引擎)这个词。
.........
这种叫法是把“那个东西”用“高级语言虚拟机”(HLLVM,High-level Language VM)的角度看待。到底什么东西能叫做“虚拟机”,这也是有争议的。
《Virtual Machines: Versatile Platforms for Systems and Processes》一书试着将“虚拟机”一词的各种用法归纳为几种情况,其中专门用于执行高级编程语言的、进程虚拟机的一种特例就是“高级语言虚拟机”(HLLVM)。
然而作为一个“虚拟”的“机器”,它应该具备的一个特征就是有一个虚拟的指令集(ISA)。想想,现实中的CPU的特征之一是不是就是它们的指令集?
许多内含字节码解释器的JavaScript引擎可以向“虚拟机”的叫法上贴,正是将其字节码指令集看作一个虚拟机器的特征。即便这些字节码可能后面还会进一步被JIT编译器编译了再执行,字节码指令集所描述的虚拟机器的概念还是存在。
..........
然而现实中也有像V8这种只用JIT编译器,不用解释器来执行JavaScript的实现。(V8正在添加一个解释器,但这是题外话。V8直到最近都是只有JIT编译器的)V8没有字节码,那还能不能把它称为“JavaScript虚拟机”呢?
“高级语言虚拟机”发展至今,从比较早期的Pascal p-code machine,到Smalltalk,到Java VM、JavaScript这些,其中比较注重性能的纯解释器实现都会采用某种中间指令来解释执行(“字节码”,但有些中间指令的单元是双字节、四字节之类,“字节码”只是个笼统的称呼),因而以其字节码指令集是可以贴上虚拟机的概念。但随着JIT编译的发展和流行,也有些实现采用混合的字节码解释执行与JIT编译执行,或者干脆跳过字节码直接从源码编译出机器码来。
这些只用JIT编译器的实现之所以通常也还是归类到“高级语言虚拟机”当中,主要是因为其技术根源还是跟那些有字节码解释器的高级语言实现相同,是在同一个领域中发展的。
js引擎通常被称作一种虚拟机(可能是js并没有明确的VM的概念吧),是专门用来解释和执行js脚本的。js虚拟机是一种进程虚拟机,就是能运行一个进程或程序。每个js引擎都实现了ECMAScript规范(当然,有的实现并不全或者未能实现最新规范)ActionScript也支持这种规范。早期的js脚本只包含很简单的逻辑,所以处理js脚本的引擎性能自然也好不到哪里去,非常早期的“Mocha”引擎只包含字节码解释器、引用计数方式的自动内存管理方式。js引擎从原始的遍历语法树,到字节码方式到引入JIT编译方式(即时编译),性能得到了质的飞跃 。
JavaScript 引擎的主要作用是,读取网页中的 JavaScript 代码,对其处理后运行。
JavaScript 是一种解释型语言,也就是说,它不需要编译,由解释器实时运行。这样的好处是运行和修改都比较方便,刷新页面就可以重新解释;缺点是每次运行都要调用解释器,系统开销较大,运行速度慢于编译型语言。
为了提高运行速度,目前的浏览器都将 JavaScript 进行一定程度的编译,生成类似字节码(bytecode)的中间代码,以提高运行速度。
早期,浏览器内部对 JavaScript 的处理过程如下:
- 读取代码,进行词法分析(Lexical analysis),将代码分解成词元(token)。
- 对词元进行语法分析(parsing),将代码整理成“语法树”(syntax tree)。
- 使用“翻译器”(translator),将代码转为字节码(bytecode)。
- 使用“字节码解释器”(bytecode interpreter),将字节码转为机器码。
逐行解释将字节码转为机器码,是很低效的。为了提高运行速度,现代浏览器改为采用“即时编译”(Just In Time compiler,缩写JIT),即字节码只在运行时编译,用到哪一行就编译哪一行,并且把编译结果缓存(inline cache)。通常,一个程序被经常用到的,只是其中一小部分代码,有了缓存的编译结果,整个程序的运行速度就会显著提升。
字节码不能直接运行,而是运行在一个虚拟机(Virtual Machine)之上,一般也把虚拟机称为 JavaScript 引擎。并非所有的 JavaScript 虚拟机运行时都有字节码,有的 JavaScript 虚拟机基于源码,即只要有可能,就通过JIT(just in time)编译器直接把源码编译成机器码运行,省略字节码步骤。这一点与其他采用虚拟机(比如 Java)的语言不尽相同。这样做的目的,是为了尽可能地优化代码、提高性能。下面是目前最常见的一些JavaScript虚拟机:
- Chakra(Microsoft Internet Explorer)
- Nitro/JavaScript Core (Safari)
- Carakan (Opera)
- SpiderMonkey (Firefox)
- V8 (Chrome, Chromium)
下面是我的一些整理
1.“虚拟机”是指软件驱动的给定的计算机系统的模拟器
2.虚拟机根据其在多大程度上精确地模拟或代替真实的物理机器来分类,可分为"系统虚拟机"和"进程虚拟机"
3.虚拟机应该具备的一个特征就是有一个虚拟的指令集(ISA)
4. js引擎通常被称作一种虚拟机,准确来讲是一种"进程虚拟机"
5.JavaScript引擎可以向“虚拟机”的叫法上贴,正是将其字节码指令集看作一个虚拟机器的特征
到这简单地得出一个结论,JS引擎即可称为JS虚拟机。真不敢相信查阅了这么多资料只得出这样一个结论。。但我觉得即使只是这个结论我也尚未理解深入,仍然有太多不明白:
1.什么是虚拟机
2.什么是指令集
3.什么是字节码
4.什么是字节码指令集.....
5.JS引擎的组成部分
6.什么是解释器和编译器
7.什么是JIT
.......
看来引出更多的问题。。。一个一个来吧,有问题不是坏事
1.什么是虚拟机。老规矩,先上前辈的说法。所以我只是个搬运工而已。
随着服务器的能力和容量的逐渐增加,而一个机器上只能一次运行一种操作系统。因此虚拟机应时而生,在物理服务器的上层运行软件模拟特定的硬件系统。Hypervisor位于硬件和系统之间,是创建虚拟机必须的一个部分。
————虚拟机和容器的区别
结合上文:“系统虚拟机”提供了一个可以运行操作系统的真完整仿平台。所以虚拟机是是一套软件,在物理服务器上层运行模拟 特定的硬件系统以供操作系统运行。即是虚拟操作系统的底层?搭建了虚拟操作系统运行的平台?(问号即我也不确定)
为什么要有虚拟机?这个问题虚拟机的定义基本能回答,它有什么用即它意义所在
你说的是哪个虚拟机?JVM这样的?还是VMware这样的?
如果兼指所有,那么虚拟机的出现单纯就是为了抽象掉底层。为什么要抽象掉底层?因为硬件和操作系统都越来越不一样了。同样是X86的CPU,有的支持到SSE4,有的只支持MMX,还有的只支持3DNow!,代码若要跑得快需要自己去做繁琐的检测,还要写多份代码来应对。在只有MMX和3DNow!之分的年代最多代码量翻倍,但之后的发展越来越不可控制了。这还只是CPU的一项区别。其他硬件也出现了各种不同,例如硬盘接口SCSI、IDE、SATA、iSCSI,3D运算DirectX、OpenGL、3dfx,等等。操作系统之差异则无需赘述了。
这一切都应该有一个机制来代理。适配硬件的事情都很机械,理论上只要设计一种合适的机制,就能自动兼容所有硬件。于是虚拟机就诞生了。JVM之类的运行时虚拟机还抽象了操作系统,而VM之类的硬件虚拟机则只抽象了硬件。
————虚拟机的出现是为了解决什么问题?@沈万马
操作系统是对硬件的抽象,系统虚拟机是对操作系统的抽象?
篇幅太长,接下来的问题另起一篇来写