文章链接:
https://tech.meituan.com/2018/08/23/deep-understanding-of-jscore.html
WebKit
简介
WebKit就是一个页面渲染以及逻辑处理引擎;
输入:js、css、html
输出:看到以及操作的Web页面
组成
- WebKit Embedding API: 是负责浏览器UI与WebKit进行交互的部分
- WebKit Ports:底层接口适配层
- WebCore:将html、css,js处理为CSSOM树、dom树并合并为render tree的部分。整个WebKit中最核心的渲染引擎,所有WebKit共享的。
- JSCore:解释执行JS脚本。JSCore是WebKit默认内嵌的JS引擎,各浏览器有但单独开发此功能(Chrome的V8)
JSCore
JS和DOM树之间存在着互相关联,这是因为浏览器中的JS脚本最主要的功能就是操作DOM树,并与之交互。
流程:词法分析、语法分析以及解释执行。
1. 词法分析 – Lexer(lexical analyzer)
把一段我们写的源代码分解成Token序列的过程,这一过程也叫分词。
作用:仅做分词,不做关联关系
2. 语法分析 – Parser
Parser会把Lexer分析之后生成的token序列进行语法分析,并生成对应的一棵抽象语法树(AST)
查看链接:https://esprima.org/demo/parse.html
3. ByteCodeGenerator
根据AST来生成JSCore的字节码,完成整个语法解析步骤
4. 解释执行 – LLInt和JIT
JS源代码经过了词法分析和语法分析这两个步骤,转成了字节码,1-3步骤可以合称为编译。
JS编译结束之后生成的指令字节码(ByteCode),会被立即被JSCore这台虚拟机进行逐行解释执行。
JSByteCode的解释执行是一套很复杂的系统,特别是加入了OSR和多级JIT技术之后,整个解释执行变的越来越高效,并且让整个ByteCode的执行在低延时之间和高吞吐之间有个很好的平衡:由低延时的LLInt来解释执行ByteCode,当遇到多次重复调用或者是递归,循环等条件会通过OSR切换成JIT进行解释执行(根据具体触发条件会进入不同的JIT进行动态解释)来加快速度。(此处我是一个无情的文字复制器)
特点:
- 基于寄存器的指令集结构(执行效率更高、内存开销更大)
- 单线程机制(JS存在多线程异步是因为强大的事件驱动机制)
- 事件驱动机制
事件驱动机制为什么就可以支持JS存在多线程异步?
遇到耗时任务时,JS将任务丢给由JS宿主提供的工作线程(WebWorker)去处理。等工作线程处理完之后,会发送一个message让JS线程知道这个任务已经被执行完了,并在JS线程上去执行相应的事件处理程序。
JS的事件驱动,跟消息队列其实是“异曲同工”。也正因为工作线程和事件驱动机制的存在,才让JS有了多线程异步能力。
注意,由于工作线程和JS线程并不在一个运行环境,所以它们并不共享一个作用域,故工作线程也不能操作window和DOM。
JS线程和工作线程,以及浏览器事件之间的通信机制叫做事件循环(EventLoop),它有两个概念,一个是Call Stack,一个是Task Queue。当工作线程完成异步任务之后,会把消息推到Task Queue,消息就是注册时的回调函数。当Call Stack为空的时候,主线程会从Task Queue里取一条消息放入Call Stack来执行,JS主线程会一直重复这个动作直到消息队列为空。
接下里就要补充了。。。
WebWorker
作用:为 JavaScript 创造多线程环境,允许主线程创建 Worker线程,将一些任务分配给后者运行。在主线程运行的同时,Worker 线程在后台运行,两者互不干扰。等到 Worker线程完成计算任务,再把结果返回给主线程。这样的好处是,一些计算密集型或高延迟的任务,被 Worker 线程负担了,主线程(通常负责 UI交互)就会很流畅,不会被阻塞或拖慢。
JS线程
JavaScript引擎是单线程运行的,JavaScript中耗时的I/O操作都被处理为异步操作,它们包括键盘、鼠标I/O输入输出事件、窗口大小的resize事件、定时器(setTimeout、setInterval)事件、Ajax请求网络I/O回调等。当这些异步任务发生的时候,它们将会被放入浏览器的事件任务队列中去,等到JavaScript运行时执行线程空闲时候才会按照队列先进先出的原则被一一执行,但终究还是单线程。
oc是什么
- OC是C的超集,所有C语言的特性,在OC上都可以使用
寄存器(Register)
- 是中央处理器内用来暂存指令、数据和地址的电脑存储器。
- 寄存器的存贮容量有限,读写速度非常快。
- 在计算机体系结构里,寄存器存储在已知时间点所作计算的中间结果,通过快速地访问数据来加速计算机程序的运行。
- 寄存器位于存储器层次结构的最顶端,也是CPU可以读写的最快的存储器
ios native和js逻辑层运行在jsCore
android native和js逻辑层运行在v8