黑马程序员技术交流社区

标题: javac 在运行的时候到底做了什么事情 [打印本页]

作者: toShareBeauty    时间: 2013-7-7 18:34
标题: javac 在运行的时候到底做了什么事情
本帖最后由 杨兴庭 于 2013-7-9 11:19 编辑

现在复习以前的东西,所以有些东西研究得细致一点,所以碰到下面的问题了,

下面是我在 windows 命令行编译一个 .java 程序,时能 verbose 选项时打印的东西:


D:\j2se 练习\others>javac -verbose RandomTest.java

[语法分析开始时间 RegularFileObject[RandomTest.java]]
[语法分析已完成, 用时 15 毫秒]
[源文件的搜索路径: .]
[类文件的搜索路径: D:\Program Files (x86)\Java\jdk1.7.0_15\jre\lib\resources.jar
,D:\Program Files (x86)\Java\jdk1.7.0_15\jre\lib\rt.jar,D:\Program Files (x86)\J
ava\jdk1.7.0_15\jre\lib\sunrsasign.jar,D:\Program Files (x86)\Java\jdk1.7.0_15\j
re\lib\jsse.jar,D:\Program Files (x86)\Java\jdk1.7.0_15\jre\lib\jce.jar,D:\Progr
am Files (x86)\Java\jdk1.7.0_15\jre\lib\charsets.jar,D:\Program Files (x86)\Java
\jdk1.7.0_15\jre\lib\jfr.jar,D:\Program Files (x86)\Java\jdk1.7.0_15\jre\classes
,D:\Program Files (x86)\Java\jdk1.7.0_15\jre\lib\ext\access-bridge-32.jar,D:\Pro
gram Files (x86)\Java\jdk1.7.0_15\jre\lib\ext\dnsns.jar,D:\Program Files (x86)\J
ava\jdk1.7.0_15\jre\lib\ext\jaccess.jar,D:\Program Files (x86)\Java\jdk1.7.0_15\
jre\lib\ext\localedata.jar,D:\Program Files (x86)\Java\jdk1.7.0_15\jre\lib\ext\s
unec.jar,D:\Program Files (x86)\Java\jdk1.7.0_15\jre\lib\ext\sunjce_provider.jar
,D:\Program Files (x86)\Java\jdk1.7.0_15\jre\lib\ext\sunmscapi.jar,D:\Program Fi
les (x86)\Java\jdk1.7.0_15\jre\lib\ext\sunpkcs11.jar,D:\Program Files (x86)\Java
\jdk1.7.0_15\jre\lib\ext\zipfs.jar,.]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/lang/Object.class)]]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/lang/String.class)]]
[正在检查RandomTest]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/lang/AutoCloseable.class)]]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/lang/System.class)]]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/io/PrintStream.class)]]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/io/FilterOutputStream.class)]]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/io/OutputStream.class)]]
[已写入RegularFileObject[RandomTest$1.class]]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/lang/StringBuilder.class)]]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/lang/CharSequence.class)]]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/io/Serializable.class)]]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/lang/Comparable.class)]]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/lang/AbstractStringBuilder.class)]]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/lang/StringBuffer.class)]]
[已写入RegularFileObject[RandomTest.class]]

[共 530 毫秒]


问题在这里

从这个结果可以看出, java compiler 至少做了 1.分析 java 源文件 2.搜索源文件路径 3.搜索类文件路径 4.加载依赖的类 5.把结果写入 .class 文件,但是这5个事情 javac 到底是怎么做的,请高人解答一下,如果有和我一样想知道的同学请帮忙点一下这个

免得没人看到就沉了,小弟在此先行谢过!



作者: enmoor    时间: 2013-7-8 00:06
javac 是javac语言编程编译器。javac工具读由java语言编写的类和接口的定义,并将它们编译成字节代码的class文件。
编译器的主要工作流程如下:
源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 汇编程序 (assembler) → 目标代码 (object code) → 连接器 (Linker) → 可执行程序 (executables)
详情可以百度编译原理
作者: toShareBeauty    时间: 2013-7-8 00:12
enmoor 发表于 2013-7-8 00:06
javac 是javac语言编程编译器。javac工具读由java语言编写的类和接口的定义,并将它们编译成字节代码的clas ...

大哥,首先感谢你的回答。但是你说的编译器原理不是 javac 的原理,那个对 c 编译器管用。我在做底层的时候把 arm 的编译器 链接器手册都完整看过,但是 java compiler 和那个完全不同。
作者: 张承富    时间: 2013-7-9 01:58
我只知道你的第四点是类加载器做的
根加载器
扩展加载器
系统加载器
作者: toShareBeauty    时间: 2013-7-9 09:19
本帖最后由 toShareBeauty 于 2013-7-9 09:21 编辑
张承富 发表于 2013-7-9 01:58
我只知道你的第四点是类加载器做的
根加载器
扩展加载器

感谢你的参与,
类加载器在加载类的时候做4个事情1.定位和导入二进制class文件,2.验证 .class 文件的格式,3.给 .class 中描述的静态成员变量分配内存并进行默认初始化,4.解析使用这个类的那个类在方法区中的常量池的符号引用5.把类变量初始化为正确初始值。
其实类加载器会加载类,javac 在编译的时候也是需要加载相互依赖的类。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2