突然很纠结几个关于java的问题。

JJZHK 2014-11-14 10:58:32
1.OpenJDK中并没有发现Javac.exe的源代码。我查了一些资料说javac.exe和java.exe都用的是java.c文件编译而成的,只不过传入的参数有差别,导致编译成了不同的文件,包含javap.exe也是一样的。不知道是否正确?
2.java.exe启动以后,会找到java的主方法,然后新开启线程去执行,不知是否正确?
3.如果问题二是对的,那么既然c可以直接执行java程序,那还要javac干嘛,还非要翻译成class干嘛?
...全文
251 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
JJZHK 2014-11-15
  • 打赏
  • 举报
回复
@healer_kx 1. javac的源代码都在openjdk\langtools\src\share\classes\com\sun\tools\javac 2.javac.exe是一个包装器,JRE环境下是没有的,它实际上是在运行下面的命令 java -classpath C:\j2sdk\lib\tools.jar com.sun.tools.javac.Main 那我更纠结了,jar里面都是class,class是javac生成的,javac内部调用的又是java****,这不成了死循环? 暂且不管它是不是死循环,因为编译openjdk的时候,需要安装bootstrap jdk的,tools.jar是bootstrap jdk编译出来的,这个倒也好理解。可是问题来了。那最初的java1.0的tools.jar是谁编译的??? 高手请作答啊。
a12939026 2014-11-15
  • 打赏
  • 举报
回复
我的理解: 用class文件而不是直接JNI掉接口使得可以更好的优化JAVA的性能。 关于javac的问题,第一个JAVAC的CALSS文件完全可以是程序员自己人肉生成的么。。。
JJZHK 2014-11-15
  • 打赏
  • 举报
回复
@a12939026。 没错,class可以是程序员自己生成的。不过我就是想知道真相呀。哈哈哈
wpnhwq2013 2014-11-15
  • 打赏
  • 举报
回复
javac 是编译工具,编译.java文件成clalss文件, java平台只能运行class文件
JJZHK 2014-11-14
  • 打赏
  • 举报
回复
@ healer_kx 1. 那你还记得在什么地方吗?我找了很久都没有找到。 2. jvm load class,然后执行main函数,这个我知道肯定是正确的,因为一直都是这么用的。class是javac编译出来的,可是据我所知,java编译采用的是自举形式,也就是用java代码来编译java程序,那么相当于javac也是会直接调用com.sun.tools.javac.Main主函数来进行java代码的编译工作。不知道这么理解是不是对的。如果真是这样,那还是c语言直接调用了java程序啊。我知道c可以通过JNI技术来跟java函数进行交互。我是在想,既然c能直接跟java交互,那干嘛还需要class呢。 感谢回复。
healer_kx 2014-11-14
  • 打赏
  • 举报
回复
1.OpenJDK应该有的,它是很完整的,它编译器部分,我之前还研究过,是ANTLR的作品。 我相信只是你没有找到。 2. Java.exe是虚拟机嘛,它是不是起线程我不是很确定了。但是你可以研究一下ClassLoader那些知识点。 Load完class,才会执行main。当然了,这些都发生在 字节码和JVM的层面上。 3. 那不是真的,Javac不可能是一个或者几个c文件编译出来的。那个工程可大了。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧