我知道这个问题有点傻。
我是一名 Java 程序员,以前从未研究过 Java 源代码,我一直在使用 Java(官方)框架(例如 javax.swing.、java.util.、java.collection.* 和 blah blah)来构建一些应用程序。
现在我尝试查看Java源代码(我是黑盒编程范式的受害者),发现源代码完全是用Java编写的。现在,我很困惑,Java 使用什么框架(Java 源代码中的框架,我知道这里有点困惑)来形成我们经常使用的框架?
我真诚地希望在 Java 源代码中看到一些汇编类型的代码,但事实上并非如此。我“感觉”我们使用的普通框架(java..、javax..)并不是 JVM 的最低入口点。一定有比这“更低”的东西。
谁能解释一下这个?
大部分 Java 库(即所谓的框架)都是用 Java 编写的。 解释已编译字节码的 JVM 大部分是用 C++ 实现的,并且该库确实包含用较低级语言(C 或 C++)编写的“本机”方法。
使用较低级语言编写方法只有两个原因:平台依赖性(每个平台上必须有所不同的东西)和性能(一直使用并受益于本机代码的东西)。
最终结果是几乎所有的库都是与平台无关的,并且不必为每个平台重写。非 Java 代码的范围仅限于必须特定于平台的内容。
我不是专家,但是...
JVM 将 Java 源代码转换为机器代码。 这是最低级别,一旦您拥有运行 Java 源代码(JVM)的东西,那么您就可以围绕它创建一个框架(用 Java)。
也就是说,仍然有一些本机操作系统函数调用 - 抱歉我对它们了解不多。
仅供参考,.NET 是相同的,是用 .NET 编写的框架,其中充斥着本机调用。
Java源代码:一些用Java程序语言编写的代码
javac:一个命令行实用程序,用于将Java源代码编译为类文件(包含字节码)
jvm:加载类文件,并执行该文件中的字节码。
字节码:一种指令集,看起来像汇编语言。一条指令的长度是一个字节(这就是为什么它被称为字节码)。
JNI:Java Native Interface(主要由C/C++编写),扩展Java程序能力的接口,用java很难/无法实现,比如一些关于OS的程序。
字节码是这样的:
public static void main(java.lang.String[]);
Code:
0: ldc #16 // String a a \"fsd fsd\" sfd gfd \"fs d\"
2: astore_1
3: getstatic #18 // Field java/lang/System.out:Ljava/io/PrintStream;
6: aload_1
7: invokestatic #24 // Method t:(Ljava/lang/String;)Ljava/lang/String;
10: invokevirtual #28 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
13: return
您可以使用命令实用程序 javap 获取上面的代码。