ret*_*tif 5 qt compilation qml
什么是Qt Quick的编译器做什么呢?我的理解是它将 QML/JS“编译”为 C++ 并将其集成到最终的二进制文件/可执行文件中。因此,在运行时没有 JIT 编译或任何其他与 JS 相关的东西。
然而,我在某处看到一篇文章声称它不是这样的,实际上它只是将 QML/JS“捆绑”到最终的二进制/可执行文件中,但在运行时仍然存在一些与 QML/JS 相关的开销。
在文档页面上有这样的解释:
.qml 文件以及随附的 .js 文件可以转换为 中间 C++ 源代码。使用传统编译器编译后,代码会链接到应用程序二进制文件中。
这个“中间C++源代码”是什么?为什么不只是“C++ 源代码”?这让我很困惑,但最后一条语句有点承诺,是的,它是一个 C++ 代码,在用 C++ 编译器编译它之后,你将拥有一个二进制/可执行文件,在运行时无需任何额外的编译/解释。
真的是这样吗?
该代码具有中间性质,因为它不会将 Javascript 直接映射到 C++。例如,var i = 1, j = 2, k = i+j未翻译为 C++ 等效项double i = 1., j = 2., k = i+j。相反,代码被翻译为一系列直接操作 JS 虚拟机状态的操作。JS 语义不是你可以从 C++ 中免费获得的东西:无论你如何实现它,都会有运行时成本。没有额外的编译和解释,但是实现JS状态的虚拟机仍然必须存在。
如果不发出大量大部分死代码来覆盖给定代码段可能运行的所有上下文,或者进行您想要避免的即时编译,那么这不是一个容易消除的开销。这是 JavaScript 的主要问题:它的语义通常不可能将其转换为典型的命令式静态类型代码,从而产生“标准”机器代码。