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背后的逻辑,妙哉!

一些特殊的Webkit Idl属性

Conditional=CONDITIONALNAME Wraps the generated binding code in "#if ENABLE(CONDITIONALNAME)". Ty...
  • lichwei1983
  • lichwei1983
  • 2015年02月18日 09:22
  • 985

Webkit IDL的各种自定义接口

[JSCustomToNativeObject](i), [JSCustomFinalize](i), [CustomIsReachable](i), [JSCustomMarkFunction](i...
  • lichwei1983
  • lichwei1983
  • 2015年02月21日 00:19
  • 1080

Webkit IDL中自定义[命名]属性的获取(Getter)以及设置(Setter)函数

自定义命名属性的获取(Getter)以及设置(Setter)函数: [CustomNamedGetter](i), [CustomNamedSetter](i) 命名属性的W3C链接如下:​T...
  • lichwei1983
  • lichwei1983
  • 2015年02月20日 16:30
  • 818

webkit idl 资料

csdn lidp  http://blog.csdn.net/perfectpdl webcore 通过 idl 实现与 js引擎的绑定,idl为 w3c定义的一个 接口定义语言,为简化开发过程,...
  • perfectpdl
  • perfectpdl
  • 2011年12月09日 10:35
  • 2198

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

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

用IDL编写读取ROI样本点的方法

IDL作为遥感界常用的语言,在图像处理方面相比于Python,Matlab等具有很大的优势。IDL语言在编译的过程中编译器自动将代码进行多线程的编译和执行。因此其对数据的处理速度是Python和Mat...
  • dxh0907070012
  • dxh0907070012
  • 2015年01月22日 21:22
  • 1961

IDL读取显示保存图像(李英冰老师教程)

1、首先运行IDL主程序,选择默认工作空间 格式:Yn = QUERY_IMAGE ( Filename, Info, CHANNELS=variable , DIMENSIONS=variable...
  • whucv
  • whucv
  • 2014年01月11日 22:05
  • 5003

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

原文:http://blog.csdn.net/cutesource/article/details/8862287 WebKit最神奇的一点是JS能调到内核部分(c/c++),这是WebOS向...
  • cc96610536
  • cc96610536
  • 2013年05月30日 10:30
  • 462

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

探索WebKit内核(二)------ IDL和Bindings WebKit最神奇的一点是JS能调到内核部分(c/c++),这是WebOS向外提供扩展能力的关键(实现或扩展W3...
  • maojh
  • maojh
  • 2014年03月22日 14:19
  • 384

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

WebKit最神奇的一点是JS能调到内核部分(c/c++),这是WebOS向外提供扩展能力的关键(实现或扩展W3C API)。要搞清楚一个JS的方法是如何调到后面c/c++的实现颇费周折,其实就是要把...
  • cutesource
  • cutesource
  • 2013年04月28日 11:33
  • 23909
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WebKit之IDL的binding
举报原因:
原因补充:

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