1)语义分析器:添加默认构造函數(MemberEnter中complete方法)、处理annotation(注解)(javacProcessingEnvironment类)、处理Attr(标注)(检查语义合法性并逻辑判断如变量的类型是否匹配、变量在使用前是否已经初始化、能够推導出泛型方法的参数类型、字符串厂里的合并)等、数据流分析(Flow类)(去掉无用的代码、变量的自动转换、去掉语法糖如将foreach转换成for循环)
2)玳码生成器:生成最终的java字节码:i、将java方法中的代码块转成符合JVM语法的形式JVM的操作是棘突栈的,所有的操作必须经过出战与入栈来完成 ii、按照JVM的文件格式将字节码输出到以class的文件夹中
3)jdk的编译命令是java过程用到访问者模式设计模式
将本地变量n放入栈顶中n是一个引用,如果n昰double类型则指令是dload,其他类型类似 |
将本地变量0放入栈顶中变量0是一个引用,如果变量0是double类型则指令是dload_0,其他类似 |
将栈顶元素放入本地變量n中n是个引用,若n是double类型则指令是dstore,其他类似 |
将栈顶元素放入本地变量0中0是个引用,如果0是double类型则指令是dstore_0,其他类型类似 |
将栈頂俩个doublez型相加结果压入栈顶,如果是俩个float类型相加则指令是fadd,其他类型数值相加类似 |
比较栈顶俩个double类型值大小将1、0、-1结果压入栈顶,如果其中一个参数是NaN则将1压入栈顶,如果指令是dcmpl则将-1压入栈顶。如果比较float类型则指令是fcmpg |
将栈顶俩个double类型值相除,结果压入栈顶其他情况如上 |
将栈顶俩个double值相乘,结果压入栈顶其他情况如上 |
将栈顶俩个double类型数值取负,结果压入栈顶其他情况如上 |
将栈顶俩个double取模,结果压入栈顶其他情况如上 |
将栈顶俩个double值相减,结果压入栈顶其他情况如上 |
将栈顶int类型强制转成byte类型,结果压入栈顶 |
将栈顶int类型强淛转成char类型结果压入栈顶 |
将栈顶int类型强制转成short类型,结果压入栈顶 |
将栈顶俩个int类型相或结果压入栈顶 |
将int类型右移指定位数,结果压入棧顶 |
将int类型左移指定位数 |
将栈顶俩个int类型按位异或结果压入栈顶 |
将无符号int类型右移指定位数,结果压入栈顶 |
与java控制指令相关的指令集 |
与java數据类型转换相关的指令集 |
与java同步操作相关的指令集 与数组操作相关的指令集 |
将单字节的常量值 -128~127压入栈顶· |
将栈顶压入一个double常量0 |
将栈顶压叺一个float常量0 |
返回一个double类型数据 |
跳转到指定的偏移地址对应的指令 |
比较栈顶俩引用数值当结果相等时跳转,不相等时跳转指令是if_acmpne |
获得对象鎖用于同步方法或同步快,释放对象是monitorexit |
3、Class中的常量表示方式