Qt 6.3 重镑发布了新的 Qt Quick 编译器,号称性能至少有 30% 的提升,能够以接近 native 的速度运行 Qt Quick 程序。我觉得这是一个在工程上相当漂亮的技术,所以在此做了一个介绍。
其基本原理是改造 QML 语言,现在已经不是一个纯粹的 JavaScript 了,而是类似于 TypeScript,能够在变量声明、函数参数、函数返回值添加类型标志。有了类型以后,Qt 提供了两个部件也就顺理成章了:
- QML 脚本编译器
qmlsc,负责把 JavaScript 脚本编译成 C++ 代码。 - QML 类型编译器
qmltc,负责把 QML 文档编译成 C++ 代码。
脚本编译器仍然不能完整翻译动态的 JavaScript 语法,但是能够准确地识别其中 QML 类型的属性访问,算术指令和 ifelse 判断,循环等等结构并翻译成 C++. 其它的仍然被翻译成字节码供 QML 虚拟机解释执行或者 JIT. 目前脚本编译器暂时只对 Qt Device Creation 商业用户开放。普通的开源用户,仍然只能使用自 Qt 5.8 以来的qmlgencache.
而类型编译器,则能够比较准确地把 QML 文档翻译成 C++ 代码,目前这个 QML 类型编译器已经向所有 Qt 6.3 用户开放了。