qml 引擎(V8)原理总结

关于qml引擎原理,要从google V8 入手,开始使用qml的时候会对它的语法感到不解,虽然是javascript语言,但总是对各种操作感到困惑,尤其是与后台c++的交互,为什么需要做类型注册、对象注册,直到最近做的一些技术调查后,才感觉明朗了。

v8一般都在各类浏览器中使用,例如chrome,google开源一套实现处理javsscript脚本语言的V8库,会针对javascript语法进行解析,提取出脚本中的AST对象树,而qml脚本就是javascript语法,而qml引擎就是基于V4、V8实现的, qml和qt quick中很多的实现也是在这个原理上实现的,所以了解v8后,就会对qml中的一些神操作霍然开朗。

V8编译流水线:

V8 使用编译器和混合器结合JIT(Just In Time)的方式处理Js代码,

详细的相关介绍可以参照极客时间图解GoogleV8的教程,能够更深一步了解JavaScript语言如何解析、运行;

v8几个关键功能:

1. Isolate   一个 V8 引擎实例
2. Context  函数、对象的执行环境 , 运行时互不干扰
3. Isolate::Scope 保证 Isolate 独立运行
4. Context ::Scope 保证 Context 独立运行
5. Handle 对当前 Isolate 中的对象引用计数,垃圾回收
6. ObjectTemplate 绑定 C++ 函数、对象到 Js 对象 
7. Accessors 可以存取属性的读写回调函数
8. Interceptors 拦截器 ,指定访问属性触发回调函数
9. 安全机制:同源规则(检查域名、协议、端口),不同作用域间有 Security token Security callbacks
 

打通javsscript脚本代码和后台c++代码的,就是绑定在context中ObjectTemplat,它会绑定c++中对象、函数、类到Js中,然后JS代码中就可以运行c++中的代码内容,所以说qml与c++调用的方式就是基于底层v8的,也是通过注册绑定的方式,将c++中的类型、函数、对象通知给前台qml引擎,而c++代码要想调用js中对象或者函数,就是通过findname的方式,根据名称查找,这些在v8的库中都有对应的接口实现,有此基础,qml中的各类操作就好理解啦。

实际上,qml脚本中各类图形组件在c++层都会有对应的实现,qml脚本部分提供了组件的JS实现,最后会调用到c++层进行opengl的绘制,所以再对照Qt的文档,Item对应QtquickItem,这些都在v8引擎中做了类型的映射。

JS脚本调用v8运行代码demo:

https://blog.csdn.net/feiyinzilgd/article/details/8453230

关于Qml V8引擎相关资料:

https://www.cnblogs.com/wzxNote/p/10599370.html

了解这些,再分析qml、qt代码的时候就容易了不少。

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值