源码编译qt-VS2013编译Qt5.2.032位静态库调试

Java代码静态编译和动态编译有哪些问题?

Java应用程序的性能常常是开发社区讨论的热门话题。 由于该语言旨在使用解释方法支持应用程序可移植性目标,因此早期 Java 运行时提供的性能水平远低于 C 和 C++ 等编译语言。 虽然这种语言可以提供更高的性能,但生成的代码只能在有限数量的系统上执行。 在过去的六年里,Java 运行时供应商开发了复杂的动态编译器,通常称为即时 (JIT) 编译器。 当程序运行时,JIT编译器选择将最常执行的方法编译为本机代码。 原生代码编译是在运行时进行的,而不是在程序运行前进行编译(用C或C++编写的程序恰好属于后一种情况),保证了可移植性的要求。有些J...all

Java应用程序的性能常常是开发社区讨论的热门话题。 由于该语言旨在使用解释方法支持应用程序可移植性目标,因此早期 Java 运行时提供的性能水平远低于 C 和 C++ 等编译语言。

虽然这种语言可以提供更高的性能,但生成的代码只能在有限数量的系统上执行。 在过去的六年里,Java 运行时供应商开发了复杂的动态编译器,通常称为即时 (JIT) 编译器。

当程序运行时,JIT编译器选择将最常执行的方法编译为本机代码。 本机代码编译是在运行时进行的,而不是在程序运行之前进行编译(用C或C++编写的程序恰好属于后一种情况),保证了可移植性的要求。 一些 JIT 编译器甚至可以在不使用解释器的情况下编译所有代码,但此类编译器仍然通过在程序执行时执行某些操作来保持 Java 应用程序的可移植性。

由于动态编译技术的多项改进,现代 JIT 编译器可以在许多应用程序中产生与 C 或 C++ 静态编译相当的应用程序性能。 然而,仍然有许多软件开发人员根据经验或轶事证据认为动态编译会严重干扰程序运行源码编译qt,因为编译器必须与应用程序共享 CPU。

一些开发人员强烈建议静态编译 Java 代码,相信这可以解决性能问题。 对于个人应用程序和执行环境来说,静态编译确实可以极大地提高Java性能,或者说它是唯一实用的选择。

然而,静态编译 Java 应用程序在实现高性能的同时也带来了很大的复杂性。 一般的 Java 开发人员可能无法完全理解 JIT 动态编译器的好处。 本文研究了 Java 语言静态和动态编译所涉及的一些问题,重点关注实时 (RT) 系统。

简要描述Java语言解释器的操作原理,并说明现代JIT编译器执行本机代码编译的优点和缺点。 介绍IBM在WebSphere Real Time中发布的AOT编译技术及其一些优缺点。

然后比较了两种编译策略,并重点介绍了更适合 AOT 编译的几个应用领域和执行环境。 关键是这两种编译技术并不相互排斥:即使在最有效地使用它们的应用程序中,每种技术也都有影响应用程序的优点和缺点。

执行Java程序 Java程序最初通过Java SDK的javac程序编译成与本机平台无关的格式(类文件)。 这种格式可以被认为是 Java 平台,因为它定义了执行 Java 程序所需的所有信息。

Java程序执行引擎,也称为Java运行时环境(JRE),由一个为特定本机平台实现Java平台的虚拟机组成。 例如,运行在AIX操作系统上的基于Linux的Intel x86平台、Sun Solaris平台和IBM System p平台都有一个JRE。

这些 JRE 实现实现了所有本机支持,以正确执行为 Java 平台编写的程序。 事实上,操作数堆栈的大小存在实际限制源码编译qt,但程序员很少编写超出该限制的方法。 JVM 提供安全检查来通知以这种方式创建的程序员。

Java平台程序表示的一个重要部分是字节码序列,它描述了Java类中每个方法执行的操作。 字节码使用理论上无限的操作数堆栈来描述评估。 这种基于堆栈的程序表示提供了平台独立性,因为它不依赖于任何特定本机平台的 CPU 中可用的寄存器数量。

可以在操作数堆栈上执行的操作是独立于任何本机处理器的指令集定义的。 Java 虚拟机 (JVM) 规范定义了此字节码执行(请参阅参考资料)。 任何特定本机平台的任何 JRE 在执行 Java 程序时都必须遵循 JVM 规范中列举的规则。

由于基于堆栈的本机平台很少见(Intel X87 浮点协处理器是一个值得注意的例外),因此大多数本机平台无法直接执行 Java 字节码。 为了解决这个问题,早期的JRE通过解释字节码来执行Java程序。

即JVM循环重复操作: ◆获取下一个要执行的字节码; ◆解码; ◆从操作数栈中获取所需的操作数; ◆按照JVM规范进行操作; ◆将结果写回堆栈。 这种方法的优点是简单:JRE 开发人员只需编写代码来处理每个字节码。

并且由于用于描述操作的字节码超过255个,因此实现成本相对较低。 当然,缺点是性能:这个问题最初导致许多人不喜欢 Java 平台,尽管它有许多其他优点。 解决与 C 或 C++ 等语言的性能差异意味着以不牺牲可移植性的形式为 Java 平台开发本机代码编译。

编译 Java 代码 虽然传闻中的 Java 编程口号“一次编写,随处运行”可能并不在所有情况下都严格适用,但对于大量应用程序来说却是正确的。 另一方面,本机编译本质上是特定于平台的。

那么Java平台如何在不牺牲平台独立性的情况下实现原生编译的性能呢? 答案是使用 JIT 编译器进行动态编译,该编译器已经使用了六年。 使用 JIT 编译器时,Java 程序一次以一种方式编译,因为它们在本机处理器指令中执行以获得更高的性能。

此过程生成方法的内部表示,该内部表示与字节码不同并且处于比目标处理器的本机指令更低的级别。 (IBM JIT 编译器使用操作的表达式树序列表示。)编译器执行一系列优化以提高质量和效率,最后执行代码生成步骤,将优化的内部表示转换为目标处理器的本机指令。

生成的代码依赖于运行时环境来执行活动,例如确保类型转换的合法性或对无法直接在代码中执行的各个类型的对象进行分配。 JIT编译器运行的编译线程与应用程序线程是分开的,因此应用程序不需要等待编译执行。

还描述了用于观察执行器行为的分析框架,通过定期采样线程来查找频繁执行的模式。 该框架还提供了用于临时分析的工具,存储在程序执行过程中可能不会改变的动态值。 因为这个 JIT 编译过程发生在程序执行时,所以保持了平台独立性:发布的仍然是 Java 平台中立的代码。

C和C++等语言缺乏这些优点,因为它们是在程序执行之前进行本机编译的; 发布到(原生平台)执行环境的是原生代码。放起来