当前位置: 首页 > news >正文

[WebKit] JavaScriptCore解析--基础篇 (一)JSC与WebCore

先看一下官方的基本介绍,短短几句就塞满了关键字。

SquirrelFish,正式名称是JavaScriptCore,包括register-based(基于寄存器的虚拟机), direct-threaded, high-level bytecode engine(字节码引擎).它使用基于内置copy propagation(复制性传播算法)的一次性编译器(one-pass compiler),能够延迟从语法树(Syntax Tree)上生成字节码(Bytecodes)。

 

由此可见JavaScriptCore实现的复杂度。做为一个正在努力学习的菜鸟,我愿意给自己这样一个挑战,通过记录和总结学习内容,分成两个大的段落从内部视角来解析JavaScriptCore。首先是基础篇,目的是了解JavaScriptCore是如何与WebKit一起工作的,会涉及一些JavaScript引擎的一些基本概念。然后是高级篇,尝试解释JavaScriptCore中的核心技术,如Byte Code Compiler, JIT, VM以及GC等。

 

内容或许会显得晦涩,如果只是想简单地了解浏览器JS引擎的一些基本内容,推荐读读下面的文章。它们对于理解后面的内容也会非常有帮助。相对于这些资料,这个系列则侧重于从基础及从实例来分析JSC的实现。没办法做到高层次,只能追求贴近实现。

  JavaScriptCore, WebKit的JS实现(一)

 JavaScriptCore, WebKit的JS实现(完)

 为什么V8引擎这么快?

 

当然,JavaScript的知识是必不可少的,推荐阅读一篇(JavaScript核心指南),如果有时间可以深入学习一下其中提到的链接。

 

一. JavaScriptCore与WebCore

两者的关系可以简单的用下图来表示:

 

JSC为WebCore提供两个重要功能:

 1. JS脚本的解析执行 (ScriptController)

    主要是通过调用JavaScriptCore提供的两个C接口来实现的, checkSyntax和evaluate.

 2. DOM节点的JS Bindings

    DOM节点所对应的JS Bindings都可以回溯到JSC::JSNonFinalObject,再到JSObject,以实现和JSC绑定在一起。

    *关于JS Binding,可以先看一下这篇文章: 为JavaScript Binding添加新DOM对象的三种方式及实作。至于JSC实现的细节,以后再展开。

 

二. JavaScriptCore基本工作过程

JSC最简单的执行过程如下,再如之后JIT等在这个基础上的优化。

    

 

三. JavaScript脚本的执行

以下分层说明脚本执行的步骤。 对于涉及到编译及执行的细节,则在后续解释。

 

3.1 接口层的交互

JSC和其它几个主要的JS Engine一样,都是一个库,通过提供简单的API来供调用者使用。

从JSC接口来看,一个完整的JavaScript脚本的解析执行过程,可以概述以下:

 

      

过程很简单,可是很明显有些关键词必须要理解一下,如VM, Global Object, ExecState. 它们的关系也可以通过一张图来解释:

 

      

    VM -> Virtual Machine, JavaScript要借助于一个运行时(Runtime)环境来运行。 SpiderMonkey就称之为Runtime. 

    GlobalObject -> 脚本执行时的全局对象。一个全局负责组织管理执行环境以及各个子对象。

    ExecState -> 用于记录脚本执行上下文或环境, 也由GlobalObject管理。SpiderMoney以及Apple封装后的JavaScriptCore.framework都称之为上下文(Context). 可以将其视为一个执行脚本的对象来理解,只是它所产生和使用的Objects是共享的,并可以由GlobalObject来访问。

 

    JS解释器各自实现的方式略有不同,JSC是由一个全局变量(Global Object)来创建上下文环境(ExecState), 而SpiderMonkey则是由执行上下文来创建全局变量。但无论哪种实现,全局变量和上下文都一一对应的,虽然原则上是允许一对多的情况出现。

 

   最后看下JSC执行JS脚本的接口定义, 就很好理解了:

    JSValue evaluate(ExecState* exec,constSourceCode& source,JSValuethisValue,JSValue* returnedException);

   *thisValue就是JavaScript的this, 代表的是执行者, 但不一定是创建者。

   *使用JSC的示例代码,可以看看WebKit里的jsc.cpp就可以了。

   *如果觉得没有讲清楚,建议读读这里(JavaScript核心指南)。

 

3.2 JSC API执行脚本的步骤

    下图是JSC API函数evaluate的活动图:   

    

  重点在于它会使用要执行的脚本内容建立一个ProgramExecutable对象,然后调用Interpreter执行这个代表脚本的ProgramExecutable对象。

ProgramExecutable和Interpreter都是JSC核心类,ProgramExecutable负责编译代码为ByteCode,属于解释器功能组, 而Interpreter则负责解析执行ByteCode,则属于VM功能组.

    

  *Interpreter提供的两个dump函数对于分析代码也很有用,  dumpCallFramedumpRegisters

再往下的内容,就是一个编译和执行的过程,后续再深入。

 

四. DOM Bindings的响应

实现上的解析在这里:

  WebKit的JS Binding解析

以及另一篇可以加深理解:

  为JavaScript Binding添加新DOM对象的三种方式及实作

 

转载请注明出处:http://blog.csdn.net/horkychen

相关文章:

  • testbench的文件读写
  • JavaScript获取table中某一列的值的方法
  • 设计模式C++实现(14)——职责链模式
  • [BZOJ 1032][JSOI2007]祖码Zuma(区间Dp)
  • Ubuntu 14.04.02 安装深度音乐影音
  • vim中文帮助文档安装
  • 【oracle服务】
  • java操作protobuf
  • 搭建windows server 2008 r2 FTP 后 开启防火墙无法访问的解决办法
  • 解读ASP.NET 5 MVC6系列(4):核心技术与环境配置
  • Python学习(二) 运行Python,编译Python
  • hihoCoder #1094 : Lost in the City(枚举,微软苏州校招笔试 12月27日 )
  • bellman-ford算法
  • 北亚工程师详解数据恢复中RAID6结构
  • NetScaler上配置公网证书时的注意事项
  • 分享的文章《人生如棋》
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【mysql】环境安装、服务启动、密码设置
  • bearychat的java client
  • C++类中的特殊成员函数
  • centos安装java运行环境jdk+tomcat
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • isset在php5.6-和php7.0+的一些差异
  • js继承的实现方法
  • Python_网络编程
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • yii2中session跨域名的问题
  • 测试如何在敏捷团队中工作?
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 排序算法之--选择排序
  • 前端存储 - localStorage
  • 浅谈Golang中select的用法
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 深入浏览器事件循环的本质
  • 学习Vue.js的五个小例子
  • # centos7下FFmpeg环境部署记录
  • ###项目技术发展史
  • #HarmonyOS:基础语法
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (1)SpringCloud 整合Python
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (5)STL算法之复制
  • (6)设计一个TimeMap
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (笔试题)合法字符串
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (转)socket Aio demo
  • (转)关于多人操作数据的处理策略
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NET命名规范和开发约定