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

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

[WebKit] JavaScriptCore解析--基础篇 (一)JSC与WebCore的更多相关文章

  1. [WebKit内核] JavaScriptCore深度解析--基础篇(一)字节码生成及语法树的构建

    看到HorkeyChen写的文章<[WebKit] JavaScriptCore解析--基础篇(三)从脚本代码到JIT编译的代码实现>,写的很好,深受启发.想补充一些Horkey没有写到的 ...

  2. [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析

    [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析 标签: webkit内核JavaScriptCore 2015-03-26 23:26 2285 ...

  3. PE文件解析 基础篇

    PE文件解析 基础篇 来源 https://bbs.pediy.com/thread-247114.htm 前言 之前学习了PE格式,为了更好的理解,决定写一个类似LoadPE的小工具. 编译器是VS ...

  4. 3D游戏常用技巧Normal Mapping (法线贴图)原理解析——基础篇

    http://www.cnblogs.com/wangchengfeng/p/3470310.html

  5. C++虚函数表解析(基础篇)

    原文:http://blog.csdn.net/haoel/article/details/1948051 一.简介  C++中的虚函数的作用主要是实现了多态的机制.虚函数(Virtual Funct ...

  6. Python数据类型解析(基础篇)

    Python语言的类型   数字类型   字符串类型   元组类型   列表类型   文件类型  字典类型     1.数字类型   Python有三种数字类型:整数,浮点数,复数 Python中的整 ...

  7. 3D游戏常用技巧Normal Mapping (法线贴图)原理解析——高级篇

    1.概述 上一篇博客,3D游戏常用技巧Normal Mapping (法线贴图)原理解析——基础篇,讲了法线贴图的基本概念和使用方法.而法线贴图和一般的纹理贴图一样,都需要进行压缩,也需要生成mipm ...

  8. 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制

    你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...

  9. [源码解析] TensorFlow 分布式 DistributedStrategy 之基础篇

    [源码解析] TensorFlow 分布式 DistributedStrategy 之基础篇 目录 [源码解析] TensorFlow 分布式 DistributedStrategy 之基础篇 1. ...

随机推荐

  1. PHP调用百度api生成短网址&根据短网址恢复长网址

    接口api文档地址:http://dwz.cn/#/apidoc?_k=i9ev5p 代码demo header("Content-type: text/html; charset=utf- ...

  2. SSIS教程:创建简单的ETL包 -- 4. 增加错误处理流程(Adding Error Flow Redirection)

    为了处理在转换过程中可能发生的错误,MicrosoftIntegration Services 允许根据每个组件和每个列来决定如何处理无法转换的数据. 可以选择忽略某些列中的失败.重定向整个失败的行或 ...

  3. java模式之一------代理模式

    代理模式的概念:对其他对象提供一种代理以控制对这个对象的访问 代理模式的三种实现 (1)静态代理 静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类. e ...

  4. Rafy中的EventBus

    EventBus主要是干嘛使的,直接翻译叫事件总线. 是观察者模型的实现,利用它你既可以实现观察者模型的业务场景,还可以基于它的事件驱动机制来实现应用程序内组件之间的解耦与通信. 我们来看看有Even ...

  5. maven 程序包com.sun.image.codec.jpeg

    在 Pom.xml 增加 <build> <plugins> <plugin> <artifactId>maven-compiler-plugin< ...

  6. lumen配置日志daily模式

    默认的日志保存模式是single 也就是单文件模式 要想改成每日的daily模式可以在bootstrap/app.php下添加: /* * 配置日志文件为每日 */ $app->configur ...

  7. Q:java中的泛型数组

     对于java,其是不支持直接创建泛型数组的.当采用如下的方式去创建一个泛型数组时,其会出现错误,编译无法通过的情况. package other.jdk1_5; /** * 该类用于演示泛型数组的创 ...

  8. java设计模式-----8、策略模式

    Strategy模式也叫策略模式是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略).S ...

  9. bitset(01串)优化

    bitset的经典使用: 见代码及注释: #include<bitset> #include<algorithm> using namespace std; //只需调用< ...

  10. JS实现小图放大轮播效果

    JS实现小图放大轮播页面效果入下(图片为优行商旅页面照片): 实现效果:图片自动轮播,鼠标移入停止,移出继续轮播点击下方小图可以实现切换 步骤一:建立HTML布局,具体如下: <body> ...