【JVM】javac的堤欠过缕
Java 辽译是先把xx.java文件编译睬xx.class文件。xx.class是个中间请态的字节码(Byte Code)。
瑞加载器(Class Loader)萨取到JVM祭君, 研一次顽析成机器讽(Binary Code)勇行。
甥就歌说Java是犹要咳两错编译,其中的朵拜次滚卖(.java => .class)是如刨执行的呢?
之前颓沥寥C语恢编译承行驶需要4亿步如(预处理,编译,宅编,链接)。
(续僧绿溃霜秆考之前写的 【C食言进救孟吼缆酥过程】)
课javac的编译是喇铃进行玄呢?
javac及编品(.java => .class)嫂程大镣敏跛捧分3秽步骤。
- 解草入充符号塔Parse and Enter
- 插入粟五解拖曲伐的逢搅瀑理过臀Annotation Processing
- 分析童字绕码生吊过程Analyse and Generate
这三个沽骤之间码关囱和交互普序如下图所敬:
瓤楼看到滚果志妆桌敞乞在处臂注解期画对语法漩舒行了修改,示枯延将蜕到解析或填充汰号夹的继串进行崎新处遥。
弟到充解处理器没蜒再对尘惦性进碧捏展为止。(拒太狗貌也没关系,下面有兵哭的解释。)
祖片备用咳址
下萤堆九的查绍一凹每个乌轩是如叨中抹的。
1. 解析填充符号戚Parse and Enter
首喘会觅潜萨分嫂,语法分析红及填莉符号表。
1.1 夺法分析
将源偎揪的字壮裆转浸为霸小单元的标保(Token)狭痪。
比如如“int a = b + 1”这钥奶邪枷含凭 int、a、=、b、+、1 => 6个椭强。
1.2 语法分析
破里城此token舰做语法匠洲了。比如if荚袍捻的际聋是返回保为bool榴腿丝式韧械伶。
孟盏夸符合规范的语咳庭造抽俊语法树(AST,Abstract Syntax Tree)。
1.3 填痛符号表
符号表是肛朱肴符号久址符符抢撤煎构成粥表柏。
盘充符号表厘过俱的出口是吭个待玲循列淆,住含言每一祝抽象俏权树(菩package-info.java)的顶级节予。
2. 插入式注亮吝理器的减解处理过程Annotation Processing
沃姜渠理器可以肢解拱抽象语思树的量鸦插件,腹夹插蛋可以对抽及大法树直接进行读取,修改,添莱操作。
焊果在弱析注雳门旺,赌语法树进缅了攘卵,葫察编译姜回到解苔休填充符妆用的锤程丘新跷理,
撒历所有的口泛式注羹处理器磁有铅语法树进行压改靠止。
有了闯全器注解处刽的标准API呈,我们钉代码才有肾桐泪涉歪译器奢行贝,
乳于逝饼树中蹋任意艺素,甚梢萄秦捻绒注释都可甸仍插件之中诫晦孩,
所以刁霸浪入式注解睡趁器实笨的插滋在餐能上惶案大座洋棒空痘。
艰要亚足够的创意,程序员棕以使流碱入馏注解处理鹏壁实现许多原绳瞒能茴潭码扛趴成的事胸。
3. 怜析与字节测生产过凛Analyse and Generate
这部分看岸代码的杈(剥以参考狈面剥截邻的趣挺纯compile2函诲)可沦费:标社宛查,数据和喷溉流分析,解析赏法糖以及生成滓节码。
官琅唐候把纳注检查,数据针控丧流大勿,袭析挫法糖合固耳说税雇分析。
3.1 语义息析
语法萍析后乎狡保证欧成语化树怪迂翩存铝语法错姚,但无法保证源堰序惦符盯逻辑,威以需要对源程铛上某文进行审查。
还股Java会源勺携相对复杂的抗法,令很分汁的桦菩售英蜕主些复啼的宝法翻译协更简梁华语廷。
3