编译器和JVM在java中的作用?

时间:2017-02-15 06:51:33

标签: java compiler-construction jvm

我是java新手,对编译器和JVM的作用感到困惑。我已经阅读了几个资源,并列举了一些

  1. What-are-the-functions-of-Java-Compiler ?
  2. Is the JVM a compiler or an interpreter?
  3. 编译器  当我在系统中保存文件.java文件时,计算机在内部将其保存在字节0和1中。我理解编译器是否验证是否编写了java程序 确认java标准与否。如果没有抛出错误,否则会篡改类文件。

    我的问题是生成.class文件需要什么。 能'吨 JVM直接解释它(从对应于.java文件生成的字节),而不需要.class文件?编译器(javac)在这里进行任何类型的优化吗?

    JVM: - 这个问题是另一回事。无法编译生成可由CPU直接解释的字节/机器代码吗?那么为什么需要JVM呢? JVM是否需要解释特定于平台的字节代码,例如windows或linux?

6 个答案:

答案 0 :(得分:0)

Java字节码是一种表示一系列操作的中间紧凑方式。处理器无法直接执行这些操作。处理器执行机器指令。它们是处理器唯一能理解的东西。

JVM 处理字节码操作流,并将它们解释为一系列机器指令,供处理器执行。

  

我的问题是生成.class文件需要什么。 JVM不能直接解释它(从对应于.java文件生成的字节)而不需要.class文件?编译器(javac)在这里进行任何类型的优化吗?

javac生成.class文件,这是实现平台独立性的中间因素。

要查看优化的编译器,只需反编译字节码,例如 javap JD

  

这个问题是另一回事。无法编译生成可由CPU直接解释的字节/机器代码?那么为什么需要JVM呢? JVM是否需要解释特定于平台的字节代码,例如windows或linux?

Java语言的设计者认为语言和编译的代码将是平台无关的,但由于代码最终必须在物理平台上运行,因此他们选择将所有JVM中的平台相关代码。因此,我们需要 JVM 来执行代码。

要查看即时编译器优化的内容, activate debug logging 并阅读反汇编的机器代码。

答案 1 :(得分:0)

编译器生成Java语义的字节代码,它是一个.class文件,包含字节代码,无论您运行的操作系统是什么,都不是由1或0组成的。

JVM解释字节代码以在特定操作系统上运行它

答案 2 :(得分:0)

JVM ,是 Java虚拟机规范的实现。它为计算机的处理器(或"硬件平台")解释编译的Java二进制代码(称为字节码)。

JVM是字节码的目标机器,而不是底层架构。

Java编译器' Javac' 生成平台无关的字节码。这个字节码,我们可以说是通用的,即,它不包括特定于每个平台的机器级细节。

此字节码中的指令不能由CPU直接运行。 因此,其他一些程序'需要它可以解释代码,并提供它可以执行的CPU机器级指令。这个程序是' JVM' (Java虚拟机)是特定于平台的。 这就是为什么你有不同的Windows,Linux或Solaris JVM的原因。

答案 3 :(得分:0)

拥有这两个阶段和中间表示(Java中的“字节代码”)的要点是平台无关。

源代码中的Java程序与平台无关(在某种程度上)。当你将它编译成字节代码时,Java编译器基本上(几乎)可以做的所有事情仍然保持平台独立性:

  • 验证语法
  • 执行静态类型检查
  • 将人类可读的源代码翻译成机器可读的字节代码
  • 执行静态优化

这些都是:

  • 维护平台独立性
  • 只需要执行一次,因为它们不依赖于任何运行时数据
  • 花费(可能很长)时间,每次执行代码时再次执行它们都是浪费时间

现在你有.class个带字节码的文件,这些文件仍然是独立于平台的,可以分发到不同的操作系统甚至硬件平台。

然后第二步是JVM。 JVM本身是特定于平台的,它的任务是转换/编译/解释目标体系结构和操作系统上的字节代码。这意味着:

  • 将字节代码转换为给定平台的指令集,并使用目标OS系统调用
  • 运行时优化

答案 4 :(得分:0)

什么是Java编译器的功能?

'的Javac'是一个生成字节码(.class文件)的Java编译器,该代码与平台无关。

JVM是编译器还是解释器? Ans- Interpreter

JVM是Java虚拟机 - 运行/解释/将Bytecode转换为本地机器代码,它在内部使用 JIT

JIT 在运行时将给定的字节码指令序列编译为机器代码,然后进行本机执行并执行所有重度优化。

所有上述复杂性都存在使 java编译一次运行平台无关语言并且由于该字节码或JAVAC输出是独立于平台但JVM执行该字节码依赖于平台,即我们为Windows和Unix提供不同的JVM。

答案 5 :(得分:0)

我认为首先我们应该讨论执行解释的运行时与机器代码运行时与字节码运行时之间的区别。

在解释的运行时中,只有在代码运行时,解释器才会将(通常是人类可读的)源代码转换为机器代码。通常,这会带来优势,使得代码与平台无关(只要您的平台存在解释器)并且易于调试(代码就在您面前),但代价是执行速度相对较慢,因为您有开销在运行程序时将源代码转换为机器代码。

在编译的运行时中,源代码已由专用编译器提前编译为本机机器代码。这提供了快速的执行速度(因为代码已经是处理器期望的格式),但意味着您分发的东西(编译的二进制文件)通常与给定平台相关联。

字节码运行时是一个中途之家,旨在提供解释和编译的优势。在这种情况下,源代码提前被压缩为中间格式(字节代码),然后在运行时转换为机器代码。字节代码被设计为机器友好而不是人类友好,这意味着它转换为机器代码要比传统解释语言快得多。此外,由于实际转换为机器代码是在运行时完成的,因此您仍然可以获得所有良好的平台独立性。

请注意,是否要进行解释或编译的选择与所使用的语言无关:例如,理论上没有理由说明为什么你不能直接在机器代码中使用c intepreter或编译python。当然,在实践中,大多数语言通常只能编译或解释。

因此,这让我们回到了Java编译器的作用问题 - 本质上它的主要工作是将所有优秀的人类可读java文件转换为java字节码(类文件),以便JVM可以有效地执行他们。

另一方面,JVM的主要工作是获取这些类文件,并在执行时将它们转换为机器代码。当然它也有其他功能(例如它管理你的内存,并提供各种标准库),但从你的问题的角度来看,转换为机器代码非常重要!