关于java的困惑

时间:2015-11-05 06:17:10

标签: java jvm

我对java有些困惑。 Java是编译器或解释器语言。我得到了一些有一些很好的描述的链接但是有些人说java是编译语言或者其中一些是说java是解释器语言?甚至我怎么能理解这种语言编译或翻译的语言或两者兼而有之。我还有一个问题是JVM是操作系统的一部分,或者当我们安装java时,就安装了JVM。

8 个答案:

答案 0 :(得分:1)

  

Java是编译器或解释器语言

调用Java编译比解释更准确。 Java源代码被编译为名为“bytecode”的二进制形式。在运行时,JVM运行字节码,并且可以在运行时将该字节码编译为机器代码(使用称为Just In Time [JIT]编译器的东西)。 Java字节码实际上是特定于Java的机器代码(将此值放入此寄存器,跳转到此位置等)。这使得Java程序可以在JVM可用的任何地方运行。

  

...... JVM是OS的一部分......

不,JVM是您安装的程序。

示例:

这个Java源代码:

public class Example {
    public static final void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

编译为此字节码(不带调试信息)(传统的“hexdump”格式):

00000000  ca fe ba be 00 00 00 34  00 1a 0a 00 06 00 0c 09  |.......4........|
00000010  00 0d 00 0e 08 00 0f 0a  00 10 00 11 07 00 12 07  |................|
00000020  00 13 01 00 06 3c 69 6e  69 74 3e 01 00 03 28 29  |........()|
00000030  56 01 00 04 43 6f 64 65  01 00 04 6d 61 69 6e 01  |V...Code...main.|
00000040  00 16 28 5b 4c 6a 61 76  61 2f 6c 61 6e 67 2f 53  |..([Ljava/lang/S|
00000050  74 72 69 6e 67 3b 29 56  0c 00 07 00 08 07 00 14  |tring;)V........|
00000060  0c 00 15 00 16 01 00 0d  48 65 6c 6c 6f 2c 20 57  |........Hello, W|
00000070  6f 72 6c 64 21 07 00 17  0c 00 18 00 19 01 00 07  |orld!...........|
00000080  45 78 61 6d 70 6c 65 01  00 10 6a 61 76 61 2f 6c  |Example...java/l|
00000090  61 6e 67 2f 4f 62 6a 65  63 74 01 00 10 6a 61 76  |ang/Object...jav|
000000a0  61 2f 6c 61 6e 67 2f 53  79 73 74 65 6d 01 00 03  |a/lang/System...|
000000b0  6f 75 74 01 00 15 4c 6a  61 76 61 2f 69 6f 2f 50  |out...Ljava/io/P|
000000c0  72 69 6e 74 53 74 72 65  61 6d 3b 01 00 13 6a 61  |rintStream;...ja|
000000d0  76 61 2f 69 6f 2f 50 72  69 6e 74 53 74 72 65 61  |va/io/PrintStrea|
000000e0  6d 01 00 07 70 72 69 6e  74 6c 6e 01 00 15 28 4c  |m...println...(L|
000000f0  6a 61 76 61 2f 6c 61 6e  67 2f 53 74 72 69 6e 67  |java/lang/String|
00000100  3b 29 56 00 21 00 05 00  06 00 00 00 00 00 02 00  |;)V.!...........|
00000110  01 00 07 00 08 00 01 00  09 00 00 00 11 00 01 00  |................|
00000120  01 00 00 00 05 2a b7 00  01 b1 00 00 00 00 00 19  |.....*..........|
00000130  00 0a 00 0b 00 01 00 09  00 00 00 15 00 02 00 01  |................|
00000140  00 00 00 09 b2 00 02 12  03 b6 00 04 b1 00 00 00  |................|

字节码所表示的符号版本(可以从javap -c Example获得)是:

public class Example {
  public Example();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."":()V
       4: return

  public static final void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #3                  // String Hello, World!
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
}

答案 1 :(得分:0)

  

Java是一种编译的编程语言,而不是编译   直接到可执行的机器代码,它编译成一个中间   二进制形式称为JVM字节代码。然后编译字节代码   和/或解释为运行程序

JVM不是操作系统的一部分,当您安装Java时,实际上创建了一个名为JVM的环境。

更有用的信息here

答案 2 :(得分:0)

从第二个问题开始,JVM是单独的产品,您需要自己安装它。 对于第一个问题,java将您的程序编译为jvm字节码,并将其作为解释器发送到机器

答案 3 :(得分:0)

  

1.Java是编译器或解释器语言

它有两个。首先,Java编译器编译.java文件并创建.class文件。稍后,Java解释器将其转换为依赖于平台的 文件。出于这个原因,java被称为平台独立语言,因为通过 解释器将其转换为当前系统/操作系统可以理解的语言。

  

2.JVM是操作系统的一部分,或者当我们安装java时,则安装了JVM。

它是JAVA的一部分。不是操作系统的一部分

答案 4 :(得分:0)

Java不是编译器或解释器。 Java是一种编码语言。 java代码被编译成字节码并以.class扩展名存储。当代码执行时,字节码使用JIT转换。结果是机器代码,然后被送入内存并执行。

答案 5 :(得分:0)

Java通常是两者。它被编译为由Just-In-Time compiler 1 执行的字节代码。 Java还能够使用ScriptEngine运行解释器。

还有gcj(Java编程语言的GNU编译器)他们的主页说 2 (部分)

  

编译的应用程序与GCJ运行时libgcj链接,后者提供核心类库,垃圾收集器和字节码解释器。 {{1}}可以动态加载和解释类文件,从而产生混合的编译/解释应用程序。

1 正确实现Java Virtual Machine的任何东西都是Java(但Oracle控制着商标,所以它可能不是称为 Java),所以它可能是(并且已经)实现为interpretter(如果JIT不支持您的平台,kaffe会回退到字节码解释器。)

2 2009年9月22日的最新消息

答案 6 :(得分:0)

  The journey of Java code to a Machine code is .
    1. You write .java file.    
    2. give it to javac(the java compiler)
    3. javac compiles it and gives you .class file(call it bytecode)
    4. you put this .class file on JVM(just a software kind of thing) .
    5. JVM interprets that .class file(the bytecode we call it)
    6. JVM vomits machine code acceptable by underlying platform [OS+CPU].            


     JVM is a software package kind of thing which you need to run
     your bytcode it must be compatible with your underlying platform 
     to convert bytecode to machinecode .

答案 7 :(得分:0)

Java是一种专门设计用于Internet分布式环境的编程语言。它强制实施面向对象的编程模型。 Java可用于创建可在单台计算机上运行或分布在网络中的服务器和客户端中的完整应用程序