[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

时间: 2024-08-02 13:05:52

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

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

看到HorkeyChen写的文章<[WebKit] JavaScriptCore解析--基础篇(三)从脚本代码到JIT编译的代码实现>,写的很好,深受启发.想补充一些Horkey没有写到的细节比如字节码是如何生成的等等,为此成文. JSC对JavaScript的处理,其实与Webkit对CSS的处理许多地方是类似的,它这么几个部分: (1)词法分析->出来词语(Token): (2)语法分析->出来抽象语法树(AST:Abstract Syntax Tree): (3)遍历抽象语法

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

[WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析 标签: webkit内核JavaScriptCore 2015-03-26 23:26 2285人阅读 评论(1) 收藏 举报  分类: Webkit(34)  JavascriptCore/JIT(3)  版权声明:本文为博主原创文章,未经博主允许不得转载. 看到HorkeyChen写的文章<[WebKit] JavaScriptCore解析--基础篇(三)从脚本代码到JIT编译的代码实现>

PE文件解析 基础篇

PE文件解析 基础篇 来源 https://bbs.pediy.com/thread-247114.htm 前言 之前学习了PE格式,为了更好的理解,决定写一个类似LoadPE的小工具. 编译器是VS2015,采用MFC框架. 此系列文章采用边介绍知识点,边写代码的形式,以免变的无聊丧失兴趣. PE知识请参照<加密与解密>第10章 文章有错误或则不清楚的地方还请您指出. PE文件格式 1.PE文件基本概念 PE文件是windows系统中遵循PE结构的文件,比如以.exe   .dll为后缀名的

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

原文:http://blog.csdn.net/haoel/article/details/1948051 一.简介 C++中的虚函数的作用主要是实现了多态的机制.虚函数(Virtual Function)其实是通过一张虚函数表(Virtual Table)来实现的.简称为V-Table.在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承.覆盖的问题,保证其容真实反应实际的函数.这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这

关于Java面试知识点解析——JVM基础篇

跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽.切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技术原因(影响自己的发展,偏移自己规划的轨迹),还是钱给少了,不受重视. 准备不充分的面试,完全是浪费时间,更是对自己的不负责(如果title很高,当我没说).今天给大家分享下 Java面试知识点解析--JVM基础篇 1)Java 是如何实现跨平台的? 注意:跨平台的是 Java 程序,而不是 JVM.JVM 是用 C/C++ 开发的,是

Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析

转载请注明出处:CN_Simo. 题解: 本篇内容主讲Qt应用从创建到发布的整个过程,旨在帮助读者能够快速走进Qt的世界. 本来计划是讲解Qt源码静态编译,如此的话读者可能并不能清楚地知道为何要静态编译,所以借此篇内容说明一下原由并为之后文章的学习做准备. 即使本片内容只是在围绕一个小小的HelloWorld程序开展,但还是希望朋友们不要急于求成,"欲速则不达". 文章整体思路: 我们循序渐进地来看,一个Qt应用的完成有以下一个重要的步骤: 项目创建->源码编译->程序运行

JavaScriptCore的基础知识

最近在学习JSC的相关知识,这里写篇博客简单记录一下. JavaScriptCore简介 JavaScriptCore是一个JS 引擎,是专门负责处理javascript代码的虚拟机,简写为JSC,一般会附在浏览器中. 它是一个C++实现的开源项目,使用Apple提供的JavaScriptCore框架.我们可以在Objective-C或者基于C的程序中执行Javascript代码,也可以向JavaScript环境中插入一些自定义的对象. JavaScript 引擎在解析源码后将其转换为抽象语法树

Hybrid APP基础篇(四)-&gt;JSBridge的原理

说明 JSBridge实现原理 目录 前言 参考来源 前置技术要求 楔子 原理概述 简介 url scheme介绍 实现流程 实现思路 第一步:设计出一个Native与JS交互的全局桥对象 第二步:JS如何调用Native 第三步:Native如何得知api被调用 第四步:分析url-参数和回调的格式 第五步:Native如何调用JS 第六步:H5中api方法的注册以及格式 进一步完善JSBridge方案 思路 实现 注意 完整的JSBridge 完整调用流程图 另外实现:不采用url sche

DOM系列---基础篇

DOM (Document Object Model) 即文档对象模型, 针对 HTML 和 XML 文档的 API (应用程序接口) .DOM 描绘了一个层次化的节点树,运行开发人员添加.移除和修改页面的某一部分.DOM 产生于 网景公司及微软公司创始的 DHTML(动态 HTML) ,但现在它已经成为表现和操作页面标记的真正跨平台.语言中立的方式. DOM 中的三个字母: D(文档)可以理解为整个 Web 加载的网页文档: O(对象)可以理解为类似 window 对象之类的东西,可以调用属性