Javac源代码阅读理解(未完待续)

Javac是java的编译器,负责将java源代码转化成符合java规范的ClassFile格式的字节码文件

程序入口调用过程

整个转化的入口在Main类中的main方法,之后调用到了JavaCompiler中的compile方法。

编译器前端

compile方法中首先用javacParser来进行编译器前端的工作,负责把java代码变成Token流,之后再把TokenSteam变成抽象语法树

java的ast长这个样子java language specification

编译器后端

之后在compile2方法中进行把一个parse好了的抽象语法树的一些后续操作,如attribute,data flow分析等等

ClassFile生成

在compile2方法中的调用了generate来对一个已经设置好属性和进行过各种分析和处理的语法树生成相应的ClassFile。其中,主要分为两个部分

Gen

这部分主要有com.sun.tools.javac.jvm.Gen类完成,Gen类集成自com.sun.tools.javac.tree.JCTree.Visitor类(一个定义了对所有Ast节点进行访问的方法的抽象类),负责访问对应的Ast的每个节点,生成字节码(待confirm)

调用过程如下,一层套一层说都不知道怎么说了,用这个类为例

import com.ipads.Persist;
import com.ipads.Root;

@Persist
public class Hello
{
    @Persist
    public String test = "hello world";

    public static void main(String[] args)
    {

        @Root Hello test2 = new Hello();
        test2.test = new String("javac");
        System.out.println(test2.test);
    }
}
generate -> 对所有的顶级CompileUnit调用genClass

genClass -> 对类中所有的method或field定义调用genDef

--------------目前节点-----------------
public <init>() {
    super();
    test = "hello world";
}
genDef -> 相应ast节点的accept方法,接受this对自己进行visit
    accept -> 调用visitor相应的visitXXX方法,这里是Gen.visitMethodDef
        Gen.visitMethodDef(JCMethodDef) -> Gen的genMethod方法
            genMethod -> 如果有body,对body(Block)进行Gen.genStat

--------------目前节点-----------------
{
    super();
    test = "hello world";
}
genStat -> 直接调用genDef进行gen
    genDef -> accept -> visitBlock
        Gen.visitBlock(JCBlock) -> 调用Gen的genStats方法,把自己所有stats作为一个list传进去
            genStats -> 对所有的stats依次调用genStat(这里是一个多参数版本的genStat,然而多的参数干什么的并不知道)

--------------目前节点-----------------
super();
genStat -> 做了一些看不懂的操作,之后调用两个参数的正常genStat
    genStat -> genDef -> accept -> visitExec
        Gen.visitExec(JCExpressionStatement) -> 看一下当前节点里面的expr有没有tag,有的话打上,没有的话不管了,之后对expr调用Gen.genExpr

--------------目前节点-----------------
super()     // method invocation expression, without ;, is not a statement
genExpr -> 判断一下是不是常量,如果是的话用ClassReferenceVisitor这个类进行visit,不是的话用Gen进行visit,调用accept进行visit
    accept -> visitApply -> genExpr && genArgs

--------------目前节点-----------------
super       // JCIndent
genExpr -> apply -> visitIndent
    Gen.visitIndent -> 

Writer

这部分由writer类完成,负责将之前生成好的字节码和常量池等等在内存中的数据结构们按照ClassFile的格式打印到真正的ClassFile中。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
建立Java项目的源代码需要经过以下步骤: 1. 创建项目文件夹:首先,我们需要在计算机上选择一个适当的位置来创建项目文件夹。可以在命令行中使用以下命令创建文件夹: ``` mkdir 项目名称 ``` 2. 进入项目文件夹:使用以下命令进入项目文件夹: ``` cd 项目名称 ``` 3. 创建Java源代码文件:在项目文件夹中,创建一个Java源代码文件,可以使用任何文本编辑器,比如Notepad、Sublime Text或者Eclipse等。例如,使用以下命令创建一个名为HelloWorld.java的文件: ``` touch HelloWorld.java ``` 4. 编写Java代码:打开HelloWorld.java文件,并使用Java编程语言编写源代码。例如,下面是一个简单的Hello World程序的例子: ```java public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } } ``` 5. 编译Java源代码:使用Java编译器将源代码编译成可执行的字节码文件。 在命令行中,使用以下命令进行编译: ``` javac HelloWorld.java ``` 6. 运行Java程序:编译成功后,使用Java虚拟机来运行生成的字节码文件。 在命令行中,使用以下命令运行程序: ``` java HelloWorld ``` 通过按照上述步骤,就可以创建和运行一个基本的Java项目源代码。请注意,以上步骤仅包括基本的源代码建立项目过程,实际上在开发Java应用程序时还需要进行其他的配置和编码工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值