WebKit之IDL的binding

转载 2015年11月20日 00:33:25

WebKit最神奇的一点是JS能调到内核部分(c/c++),这是WebOS向外提供扩展能力的关键(实现或扩展W3C API)。要搞清楚一个JS的方法是如何调到后面c/c++的实现颇费周折,其实就是要把IDL和Bindings弄懂,先解释一下这两个名词:

我这么解释估计还是一头雾水,那就看看WebKit为啥需要这两个概念。首先我们得明白WebKit的世界里只有DOM和DOM相关的行为,它不认识Script,例如:

document.getElementById('domId')

WebKit知道document,也知道getElementById该做什么事儿,但它不认识getElementById这个函数,不具备script解析和执行的能力,因此它需要第三方的解析器来帮助,这也就是JavascriptCore(JSCore)或V8需要干的事儿。但JavascriptCore或V8很薄,能解析和执行javascript语言本身,不知道getElementById的具体实现,所以需要WebKit把具体实现注入进来,好了,说到这里大家就大概明白为啥需要IDL和Bindings了,其实就是为了提供一个标准的方式(IDL),让WebKit把JS API背后的实现注入给javascript解析器,另外,各个解析器的具体注册和执行机制是不同的,所以需要有Bindings来动态生成与各个解析器结合的部分,这样同一套标准的WebKit就能与各种解析器整合了。说了半天,看个图就清楚了:


其中,V8/JSCore Bindings中包含的是基于IDL规范为各个JS实现动态生成的产物,这些产物是会注册到各个DOM上,并能被V8/JSCore识别,所以以v8上的document.getElementById为例,调用流程如下:

  1. 编译的时候,基于Document.idl为Document.cpp和Document.h动态生成V8Document.cpp和V8Document.h(后面会讲到动态生成这部分逻辑)
  2. V8Document.cpp和V8Document.h其实就是包含两样东西,一是对Document.cpp和Document.h各个方法的代理,二是js API和各个实现方法的对照表
  3. WebKit把V8Document中对照表注册到document这个dom中
  4. WebKit中执行脚本document.getElementById
  5. WebKit按照最新的document的dom结构初始化V8的context
  6. V8解析和执行document.getElementById
  7. V8根据对照表执行getElementById方法对应的V8Document.cpp中的实现
  8. V8Document.cpp代理Document.cpp相应的实现
对于JSCore,流程和原理相同,只是具体的实现细节不同,而这个不同就是在bindings和JSCore中来体现,对于WebKit本身是完全相同的,同样的Document.cpp和Document.h标准实现能适配到不同的解析器上去解析和执行,这就是IDL和Bindings的精妙之处,让WebKit既能单一又能海纳百川。

以上流程中的关键有两点,一是动态生成bindings这块,另外是如何注册和执行bindings,后面这一点由于c/c++功力有限,没完全看懂,留到后面再仔细琢磨,前面这一点是WebKit强大的编译体系中的一部分,下面详细解释一下。

先抽出各个不同编译平台的差异点,WebKit就是通过WebCore/bindings/scripts/中的generate-bindings.pl perl脚本生成bindings中的代码,它在Android平台上会被Android.derived.v8bindings.mk调用到,在mac上被DerivedSources.make调用到,其大体流程是非常清晰的:

  1. 解析IDL
  2. 调用各个平台相应的CodeGenerate脚本
  3. 生成最终bindings代码
见下图所示:


具体的实现逻辑就看看各个脚本源码,这里就不多说了。另外,对于脚本的注册和执行那块可以看看bindings下的ScriptController.cpp,当然,如何想看V8/JSCore中是如何调用对照表中的代码,就需要再看看V8/JSCore本身的源码,V8就看execution.cc,JSCore就看JITCode.h。

综上所述,WebKit利用IDL和Bindings把自己从JS语言本身中脱离,让自己既可以不需了解JS语言,又能实现JS API背后的逻辑,妙哉!

相关文章推荐

通过idl得到.h文件

今天比较郁闷,为了汉化dsoframer1.3(微软网站有下)耗了两个多小时终于找到正确有效的方法通过idl得到了.h头文件。下载的dsoframer1.3在VS2005下编译竟报缺少头文件,晕!上网...
  • nhconch
  • nhconch
  • 2007年12月04日 16:42
  • 3647

探索WebKit内核(二)------ IDL和Bindings

原文:http://blog.csdn.net/cutesource/article/details/8862287 WebKit最神奇的一点是JS能调到内核部分(c/c++),这是WebOS向...

探索WebKit内核(二)------ IDL和Bindings

WebKit最神奇的一点是JS能调到内核部分(c/c++),这是WebOS向外提供扩展能力的关键(实现或扩展W3C API)。要搞清楚一个JS的方法是如何调到后面c/c++的实现颇费周折,其实就是要把...

WebKit中的JavaScript Binding

什么是JavaScript Binding? 在html页面中,我们可以通过JavaScript语句来访问DOM节点,例如document.createElement(“canvas”); 可是doc...
  • yl02520
  • yl02520
  • 2014年03月07日 16:55
  • 2826

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

转载请注明出处:http://blog.csdn.net/horkychen  一.基础知识 首先WebKit IDL并非完全遵循Web IDL,只是借鉴使用。WebKit官网提供了一份说明(...

WebKit中为JS binding扩展DOM对象

DOM对象有三种形态 一.寄生于现有对象,单实例 从属于某个全局变量,访问时通过宿主对象完成。如window.object,也可以直接调用object.method。这个方法最为简单,按需分配,并...
  • zzj1881
  • zzj1881
  • 2013年03月01日 18:39
  • 1046

webkit的js对象扩展(二)——binding方式创建自定义对象(多实例)

今天刚好有时间,把创建多实例对象的方法写一下,也就是可以像new Date()一样。关于new操作符有一篇讲的很详细,大家可以先看下http://www.pushiming.com/blog/2009...

webkit js扩展方式之Binding添加新DOM对象

webkit js Binding添加新DOM对象 一.基础知识 首先WebKit IDL并非完全遵循Web IDL,只是借鉴使用。WebKit官网提供了一份说明(WebKitIDL),比如Web I...

WebKit的JS Binding解析

WebCore与JavaScriptCore之间使用了Proxy模式,WebCore为JSC提供了一层binding层做为封装。 Webkit参照W3C Web IDL(之前称为Lang...

node_sass win32-x64-57_binding.node

  • 2017年11月03日 11:35
  • 854KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WebKit之IDL的binding
举报原因:
原因补充:

(最多只允许输入30个字)