[讨论] javac解析Java源码生成classfile的过程

tiancongyun 2014-09-16
大家好,最近在看关于javac的源码,想了解一下在一个java源文件是如何解析成class文件里的那些bytecode的。
我知道javac编译的入口在langtools里的JavaCompiler类里,主要过程包括了解析与填充符号表,处理annotation,分析并生成bytecode
delegateCompiler =
                processAnnotations(
                    enterTrees(stopIfError(CompileState.PARSE, parseFiles(sourceFileObjects))),
                    classnames);

            delegateCompiler.compile2();

while (!todo.isEmpty())
                    generate(desugar(flow(attribute(todo.remove()))));

但是我对编译原理方面的知识不是非常了解,所以这些代码跟进去有些地方也不太明白,希望能有高手能带着走一遍。
比如下面这样一个简单的只包含一个for循环的方法:
static void mulc(double[] a0, double[] a1) {
    for (int i = 0; i < a0.length; i++) {
      a0[i] = (a1[i]*VALUE);
    }
 }

是怎样一步步生成这些classfile里的bytecode的(javap解析后的method)
static void test_mulc(double[], double[]);
    Code:
       0: iconst_0
       1: istore_2
       2: iload_2
       3: aload_0
       4: arraylength
       5: if_icmpge     24
       8: aload_0
       9: iload_2
      10: aload_1
      11: iload_2
      12: daload
      13: ldc2_w        #18                 // double 15.0d
      16: dmul
      17: dastore
      18: iinc          2, 1
      21: goto          2
      24: return
RednaxelaFX 2014-09-16
请参考我以前写的一组演示稿的前半部分:http://www.valleytalk.org/2011/07/28/java-%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%BC%96%E8%AF%91%EF%BC%8C%E5%8A%A0%E8%BD%BD-%E5%92%8C-%E6%89%A7%E8%A1%8C/
itxiaohua 2014-10-13
百度jvm指令就知道结果了
Global site tag (gtag.js) - Google Analytics