Qt快速编译器到底做了什么?

时间:2016-12-21 15:47:51

标签: qt compilation qml

Qt Quick Compiler 到底做了什么?我的理解是它"编译" QML / JS转换为C ++并将其集成到最终的二进制/可执行文件中。因此,在运行时没有JIT编译或任何其他与JS相关的东西。

然而,我在某处看到一篇文章声称它不是这样的,实际上它只是"捆绑" QML / JS进入最终的二进制/可执行文件,但在运行时仍然存在一些与QML / JS相关的开销。

documentation page有这样的解释:

  

.qml文件以及随附的.js文件可以翻译成   中级C ++源代码。用传统编译后   编译器,代码链接到应用程序二进制文件。

这是什么" 中间 C ++源代码"?为什么不只是" C ++源代码"?这让我感到困惑,但是最后一句话有点承诺是的,它是一个C ++代码,在用C ++编译器编译之后,你将有一个二进制/可执行文件,在运行时没有任何额外的编译/解释。

它实际上是怎么回事?

2 个答案:

答案 0 :(得分:4)

您的问题已包含答案。

它将代码编译成C ++,即中间性质,因为它不足以拥有C ++ - Code。你需要二进制文件。因此,在编译到C ++之后,文件将被编译为二进制文件。然后将它们联系起来 该声明只说:我们不编译为二进制,而是编译为C ++。您需要使用您选择的C ++编译器将其编译为二进制文件。

如果你只将它放入资源( qrc-file ),就会发生 bundeling 。将它放入资源中暗示您使用编译器。

然后是JIT编译器,可能(在支持的平台上)执行即时编译。有关此here

的更多信息

答案 1 :(得分:2)

代码属于中间性质,因为它没有直接将Javascript映射到C ++。例如。 var i = 1, j = 2, k = i+j未转换为等效的C ++ double i = 1., j = 2., k = i+j。相反,代码被转换为一系列直接操作JS虚拟机状态的操作。 JS语义不是你可以从C ++免费获得的东西:无论你如何实现它都会有运行时成本。没有额外的编译或解释,但实现JS状态的虚拟机仍然必须存在。

这不是一个容易摆脱的开销,而不会散布很多死代码,以涵盖可能运行给定代码的所有上下文,或进行您想要避免的即时编译。这是JavaScript的主要问题:它的语义通常不可能将其转换为典型的命令性静态类型代码,从而产生标准"机器代码。