Qt Quick Compiler 究竟做了啥?
Posted
技术标签:
【中文标题】Qt Quick Compiler 究竟做了啥?【英文标题】:What does Qt Quick Compiler do exactly?Qt Quick Compiler 究竟做了什么? 【发布时间】:2016-12-21 15:47:51 【问题描述】:Qt Quick Compiler 究竟做了什么?我的理解是它将 QML/JS “编译”成 C++ 并将其集成到最终的二进制/可执行文件中。因此,在运行时没有 JIT 编译或任何其他与 JS 相关的事情。
但是,我在某处看到一篇文章声称它不是这样的,实际上它只是将 QML/JS “捆绑”成最终的二进制/可执行文件,但在运行时仍然存在一些与 QML/JS 相关的开销。
documentation page有这样的解释:
.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 语义不是你可以免费获得的东西:无论你如何实现它,都会有运行时成本。没有额外的编译和解释,但是实现JS状态的虚拟机还是要存在的。这不是一个容易摆脱的开销。
【参考方案1】:
该代码具有中间性质,因为它不会将 Javascript 直接映射到 C++。例如。 var i = 1, j = 2, k = i+j
未转换为 C++ 等效的 double i = 1., j = 2., k = i+j
。而是将代码翻译成一系列直接操纵JS虚拟机状态的操作。 JS 语义不是你可以从 C++ 中免费获得的东西:无论你如何实现它,都会有运行时成本。没有额外的编译和解释,但是实现JS状态的虚拟机还是要存在的。
如果不发出很多大部分是死代码来覆盖给定代码可能运行的所有上下文,或者不进行您想要避免的即时编译,这不是一个容易摆脱的开销。这是 JavaScript 的主要问题:它的语义通常无法将其转换为典型的命令式静态类型代码,从而产生“标准”机器代码。
【讨论】:
【参考方案2】:您的问题已经包含答案。
它将代码编译成C++,这是中级性质,因为只有C++-Code是不够的。你需要二进制文件。所以在编译成 C++ 之后,这些文件就会被编译成二进制文件。然后将它们链接起来。 声明只说:我们不编译为二进制,而是编译为 C++。您需要使用您选择的 C++ 编译器将其编译为二进制文件。
捆绑发生,如果你只把它放入资源(qrc-file)。将其放入资源中并不暗示您使用编译器。
然后是 JIT 编译器,它可能(在支持的平台上)执行即时编译。更多关于这个here
【讨论】:
我不确定它是否 100% 转换为 C++,因为编译器生成的 .cpp 还包含一个可能在运行时解释的大二进制 blob,我找不到任何关于此的文档.以上是关于Qt Quick Compiler 究竟做了啥?的主要内容,如果未能解决你的问题,请参考以下文章
MissingSchemaAction.AddWithKey 究竟做了啥?
setUseWideViewPort() 和 setLoadWithOverviewMode() 究竟做了啥?