深入理解JSCore

文章链接:
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是什么

  1. OC是C的超集,所有C语言的特性,在OC上都可以使用

寄存器(Register)

  1. 是中央处理器内用来暂存指令、数据和地址的电脑存储器。
  2. 寄存器的存贮容量有限,读写速度非常快。
  3. 在计算机体系结构里,寄存器存储在已知时间点所作计算的中间结果,通过快速地访问数据来加速计算机程序的运行。
  4. 寄存器位于存储器层次结构的最顶端,也是CPU可以读写的最快的存储器

ios native和js逻辑层运行在jsCore
android native和js逻辑层运行在v8

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值