Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我们有JVM时,为什么我们需要Java编译器?_Java_Jvm_Javac - Fatal编程技术网

当我们有JVM时,为什么我们需要Java编译器?

当我们有JVM时,为什么我们需要Java编译器?,java,jvm,javac,Java,Jvm,Javac,这只是我在阅读JVM简介时提出的一个好奇问题 当我们拥有通用的、独立于平台的Java虚拟机时,为什么需要Java编译器?我认为,考虑Python,它有一个交互shell,它逐行读取源代码,然后执行它,而不必事先编译源代码,为什么JVM不能被设计成能够读取?java文件直接与Python一样,然后执行它?p> 如果不是这样的话,有人能解释一下Java编译器的重要性吗?Java确实可以在到处都可以发布源代码的地方创建(就像JavaScript通常所做的那样)。但是作为一种设计选择,Gosling等人

这只是我在阅读JVM简介时提出的一个好奇问题

当我们拥有通用的、独立于平台的Java虚拟机时,为什么需要Java编译器?我认为,考虑Python,它有一个交互shell,它逐行读取源代码,然后执行它,而不必事先编译源代码,为什么JVM不能被设计成能够读取?java文件直接与Python一样,然后执行它?p>
如果不是这样的话,有人能解释一下Java编译器的重要性吗?

Java确实可以在到处都可以发布源代码的地方创建(就像JavaScript通常所做的那样)。但是作为一种设计选择,Gosling等人决定转而提供字节码,它是由Java编译器从源代码创建的。这样做有几个客观原因:

  • 字节码比源代码小
  • 字节码比源代码更难进行逆向工程(尽管只是稍微有点)
  • 字节码比源代码更难修改
  • 使用字节码意味着JVM不需要Java编译器(减少占用空间,这在1995年比现在更重要)
  • 编译需要大量的时间(以及大量的内存使用)。编译为字节码将保留随处运行(tm),而不会影响启动

不过,这只是他们做出的一个设计决定。微软在.Net上也做出了同样的决定。

Java确实可以在任何地方都可以发布源代码的地方创建(就像JavaScript通常所做的那样)。但是作为一种设计选择,Gosling等人决定转而提供字节码,它是由Java编译器从源代码创建的。这样做有几个客观原因:

  • 字节码比源代码小
  • 字节码比源代码更难进行逆向工程(尽管只是稍微有点)
  • 字节码比源代码更难修改
  • 使用字节码意味着JVM不需要Java编译器(减少占用空间,这在1995年比现在更重要)
  • 编译需要大量的时间(以及大量的内存使用)。编译为字节码将保留随处运行(tm),而不会影响启动

不过,这只是他们做出的一个设计决定。微软对.Net也做出了同样的决定。

java编译器将java源代码转换为字节码

JVM只执行字节码。不同操作系统上的JVM可以运行相同的字节码

像Scala这样的其他语言也可以编译成字节码并在JVM上运行


编译提高了执行效率和安全性

java编译器将java源代码转换为字节码

JVM只执行字节码。不同操作系统上的JVM可以运行相同的字节码

像Scala这样的其他语言也可以编译成字节码并在JVM上运行


编译提高了执行效率和安全性

实际上,python还将
.py
文件的代码编译成字节码
.pyc
,然后在运行时解释字节码。因此,Java应用程序的普通用户只需要JRE,而不需要开发工具。此外,编译后的.class文件比.java文件占用的空间小得多。@TheAlpha:Modern Python有。:-)@T.J.Crowder,我被你的评论弄糊涂了,如果你能解释一下,也许能帮助我澄清我的理解。@TheAlpha:这不重要。:-)但Python最初是被解释的;很多细节。不过,我相信,开始保存pyc文件的时间并不长(更不用说PyPy和Cython以及…)。实际上,python还将
.py
文件的代码编译为bytecode
.pyc
,然后在运行时解释字节码。因此,Java应用程序的普通用户只需要JRE,而不需要开发工具。此外,编译后的.class文件比.java文件占用的空间小得多。@TheAlpha:Modern Python有。:-)@T.J.Crowder,我被你的评论弄糊涂了,如果你能解释一下,也许能帮助我澄清我的理解。@TheAlpha:这不重要。:-)但Python最初是被解释的;很多细节。不过,我相信,开始保存pyc文件的时间并不长(更不用说PYY、Cython和……。“JVM只执行字节码。”-如果它喜欢,则将其编译为二进制代码,因此名称“Hotspot VM=)“JVM只执行字节码。”-如果喜欢,则将其编译为二进制代码,因此名称为“Hotspot VM”谢谢你的回答!关于你提出的观点,我还有几个问题要问。您提到字节码比源代码小,但当我检查我以前制作的一个实践程序时,我发现,实际上,源代码比字节码小(分别是1163字节和2125字节)?这是怎么发生的?另外,您指出字节码更难进行反向工程。这是通过什么方式实现的?就像反向编译一样?@Lemon:小型类,尤其是那些没有JavaDoc或其他注释的类,尤其是那些使用调试信息编译的类,可以走相反的路。逆向工程:搜索将找到各种工具,将字节码转换回源代码。您丢失了局部变量名,但是…谢谢您的回答!关于你提出的观点,我还有几个问题要问。您提到字节码比源代码小,但当我检查我以前制作的一个实践程序时,我发现,实际上,源代码比字节码小(分别是1163字节和2125字节)?这是怎么发生的?另外,您指出字节码更难进行反向工程。这是通过什么方式实现的?就像反向编译一样?@Lemon:小型类,尤其是那些没有JavaDoc或其他注释的类