搜索
搜 索
本版
文章
帖子
用户
图文精华
hadoop-2.6.0+zookeeper-3.4.6+hbase-1.0.0+hive-1.1.0完全分布 ...
首页
Portal
专题
BBS
面试
更多
登录
注册
用户组:游客
主题
帖子
云币
我的帖子
我的收藏
我的好友
我的勋章
设置
退出
导读
淘贴
博客
群组
社区VIP
APP下载
今日排行
本周排行
本周热帖
本月排行
本月热帖
会员排行
About云-梭伦科技
»
专题
›
交流区
›
移动云计算
›
探索WebKit内核(二)------ IDL和Bindings
0
0
0
分享
探索WebKit内核(二)------ IDL和Bindings
u010998737
发表于 2013-12-15 23:53:00
[显示全部楼层]
只看大图
阅读模式
关闭右栏
0
5805
WebKit最神奇的一点是JS能调到内核部分(c/c++),这是WebOS向外提供扩展能力的关键(实现或扩展W3C API)。要搞清楚一个JS的方法是如何调到后面c/c++的实现颇费周折,其实就是要把IDL和Bindings弄懂,先解释一下这两个名词:
IDL:接口定义语言,详细解释可见
http://trac.webkit.org/wiki/WebKitIDL
Bindings:WebKit动态生成与其他框架(如JavascriptCore, V8)整合的代码
我这么解释估计还是一头雾水,那就看看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为例,调用流程如下:
[ol] 编译的时候,基于Document.idl为Document.cpp和Document.h动态生成V8Document.cpp和V8Document.h(后面会讲到动态生成这部分逻辑) V8Document.cpp和V8Document.h其实就是包含两样东西,一是对Document.cpp和Document.h各个方法的代理,二是js API和各个实现方法的对照表
WebKit把V8Document中对照表注册到document这个dom中 WebKit中执行脚本document.getElementById WebKit按照最新的document的dom结构初始化V8的context
V8解析和执行document.getElementById V8根据对照表执行getElementById方法对应的V8Document.cpp中的实现
V8Document.cpp代理Document.cpp相应的实现
[/ol]对于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调用到,其大体流程是非常清晰的:
[ol] 解析IDL 调用各个平台相应的CodeGenerate脚本 生成最终bindings代码[/ol]见下图所示:
具体的实现逻辑就看看各个脚本源码,这里就不多说了。另外,对于脚本的注册和执行那块可以看看bindings下的ScriptController.cpp,当然,如何想看V8/JSCore中是如何调用对照表中的代码,就需要再看看V8/JSCore本身的源码,V8就看execution.cc,JSCore就看JITCode.h。
综上所述,WebKit利用IDL和Bindings把自己从JS语言本身中脱离,让自己既可以不需了解JS语言,又能实现JS API背后的逻辑,妙哉!
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
显身卡
没找到任何评论,期待你打破沉寂
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
发表新帖
u010998737
注册会员
关注
9
主题
39
帖子
3
粉丝
TA的主题
探索WebKit内核(二)------ IDL和Bindings
2013-12-15
从Samples中入门IOS开发(三)------ 文档浏览
2013-12-15
phonegap源码分析(一)------ android
2013-12-15
微信的接口配置时在BAE里发布的应用报error403.怎么解决?
2013-10-24
百度云应用引擎(BAE)内置TaskQueue(任务队列)是什么
2013-10-24
24小时热文
互联网大厂年终福利曝光:看看别人家老板怎
矩阵分析引论罗家洪(第四版)
像高手一样发言:七种常见工作场景的说话之
携程允许员工春节回乡办公2个月
数据治理实施方案
关闭
推荐
/2
中文版ChatGPT
1.无需魔法 2.提高编程效率 3.提高文档能力
查看 »
新手帮助
新手帮助:注册遇到问题,领取资源,加入铁粉群,不会使用搜索,如何获取积分等
查看 »
意见
反馈