java编译器(java编译器都有哪几种)

Java编译器有许多代码,我大约把他们分红两类:编译流程相关内容、编译流程无关内容。其间编译流程无关内容这儿不具体介绍。

编译流程相关内容:

Parse:解析过程。输出是源程序字符流,输出是笼统语法树,顶层的语法树是JCCompilationUnit,直译便是编译单元。首要的操作类在com.sun.tools.javac.parser包中,首要的数据结构在包com.sun.tools.javac.tree中。包含词法剖析器lexer和语法剖析器parser。

InitModule和Enter:构建符号表。输入是笼统语法树,输出是符号表(Symtab类的内容)、环境(Env类)和上下文(AttrContext类),其间Env里面含有对应的输入的语法树和AttrContext。一个由Env构成的行列,被笼统成类Todo(即Queue)。首要的操作类在com.sun.tools.javac.comp包中,首要的数据结构在包com.sun.tools.javac.code和包com.sun.tools.javac.tree中。

AnnotationProcessing:注解处理。构建符号表的时分,会把遇到的注解悉数保存下来,给这一阶段使用。输入是笼统语法树和上个阶段保存的各个注解,输出是依据用户自定义的注解处理器决定的。注解处理器是用户自己写的代码,使编译器遇到某些注解的时分能够履行用户自定义的代码,咱们往常开发一般用不到这个功用,想具体了解的读者能够自行看其他材料。已然遇到注解的时分履行的代码是用户自定义的,那如果用户使用注解处理器生成java源代码,编译器会怎样处理这些新的Java源代码呢?编译器会检测注解处理器是否生成新的Java源程序,如果生成新的Java源程序,编译器会从头履行Parser、InitModule、Enter这三个阶段,对新的源程序进行处理,然后又从头进行AnnotationProcessing注解处理。这样循环下去,直到没有新的源程序生成。上文链接里面有一些图,比较形象地描绘这个过程,读者能够自行参考。首要的操作类在com.sun.tools.javac.processing包中,首要的数据结构在包com.sun.tools.javac.code和com.sun.tools.javac.tree中。

Attr:属性标示。输入是上面几个阶段生成的内容“Todo目标”,也便是一个由Env组成的行列(即Queue),留意一个Env里面有一个上下文AttrContext和对应的语法树,AttrContext还有一个作用域Scope。输出仍是由一个由Env组成的行列(即Queue),只不过里面的语法树多了类型Type和符号Symbol等信息,Env、AttrContext、Scope的许多字段都进行了初始化。这一阶段首要包含类型检测、命名解析、常量折叠、类型推导等内容,其间对函数参数、匿名类、lambda表达式、办法引证做了许多扑朔迷离的操作。许多bug都出现在这一阶段。首要的操作类在com.sun.tools.javac.comp包中,首要的数据结构在包com.sun.tools.javac.code和com.sun.tools.javac.tree中。

Flow:数据流剖析。输入和输出都是上文说的由Env组成的行列(即Queue)。这一阶段首要对数据流的合法性进行多种剖析,更新Env的状况很少,不像Attr,Attr几乎每一步都会设置类型和符号或者作用域,而Flow一般是剖析完后,只依据剖析的结果进行报错或者不报错。这些数据流剖析包含活跃性剖析、反常捕获剖析、有限赋值剖析、本地变量捕获剖析等,并且这些剖析种类是分隔的,一般互不影响。相对于Attr的扑朔迷离,Flow对各个剖析分隔完成,真是太好理解了。首要的操作类在com.sun.tools.javac.comp包中,首要的数据结构在包com.sun.tools.javac.code和com.sun.tools.javac.tree中。

Desugar:解(de)语法糖(sugar)。输入是由Env组成的行列,输出是由Env和类语法树的二元组(即Pair)组成的行列(即Queue>)。Desugar会履行范型擦除、形式转化、lambda转化、内部类转化、foreach语句转化等操作。JDK8及之后的版本所加的语言功用根本都能够在这儿找到对应的转化操作。Desugar遍历语法树,在遇到这些“高档”语法结构的时分,就把它转化成对应的“初级”语法结构。首要的操作类在com.sun.tools.javac.comp包中,首要的数据结构在包com.sun.tools.javac.code和com.sun.tools.javac.tree中。

Generate:中间代码生成。输入是desugar生成的由Env和类语法树的二元组(即Pair)组成的行列(即Queue>),输出便是咱们往常看到的class文件了。这一步的关键是理解字节码和class文件结构,还有这些内容和Java语法结构的对应关系。JLS和JVMS对这些内容做了具体阐明。我建议想对JDK、JVM进行开发的读者:依据遇到的bug去读JLS,比如遇到关于枚举的bug,就去读JLS关于类和枚举那一章。而对于JVMS,除了4.10VerificationofclassFiles之外,其他都应该完好看完,其间第7章TheJavaVirtualMachineInstructionSet能够粗看可是不能不看。第7章相似一个手册,可是不粗读一遍,很难理解中间代码生成过程的内容。了解了Java语言和字节码及他们的对应关系,这个阶段的代码就很简单理解了。
图片[1]-java编译器(java编译器都有哪几种)-宏启网络科技丨崇尚专注-追求极致,java编译器都有哪几种,大家能够点击文中蓝色的东西称号,直接进入官网下载。

1)Notepad++

Notepad++是Windows操作体系下的一套文本修改器,有完好的中文化接口及支撑多国言语编写的功用(UTF8技术)。

Notepad++长处:

功用比Windows中的Notepad(记事本)强大,除了能够用来制作一般的纯文字说明文件,也非常适合编写计算机程序代码。

不只有语法高亮度显现,也有语法折叠功用,并且支撑宏以及扩充基本功用的外挂模组。

是免费软件,能够免费使用,自带中文,支撑所有干流的计算机程序言语。

Notepad++缺陷:

比起专用的IDE缺少语法查看,颜色选取,代码的outline,注释的解析,TODO,调试东西集成,部署东西集成等等好多功用。

翻开大文件比较慢

Java开发东西Notepad++

Notepad++

2)EditPlus

EditPlus是一款由韩国SangilKim(ES-Computing)出品的细巧可是功用强大的可处理文本、HTML和程序言语的Windows修改器,甚至能够经过设置用户东西将其作为C,Java,Php等等言语的一个简略的IDE。

EditPlus长处:

EditPlus界面简练美观,且发动速度快。

对中文支撑比较好。

支撑多种日期、时间输入;支撑语法高亮;支撑代码折叠;支撑代码自动完结。

配置功用强大,且比较简单,扩展也比较强。

适合修改网页。

EditPlus缺陷:

不支撑代码提示功用。

不免费,收费单位美元,注册费用高

功用较简略。

版别更新比较慢。

Java开发东西EditPlus

EditPlus

3)UltraEdit

UltraEdit是一套功用强大的文本修改器,能够修改文本、十六进制、ASCII码,完全能够替代记事本,它是一款需要花费49.95美元的共享软件。

UltraEdit长处:

提供了友好界面的编程修改器,支撑语法高亮,代码折叠和宏。

内置了关于HTML、PHP和JavaScript等语法的支撑,可一起修改多个文件,并且即便开启很大的文件速度也不会慢。

UltraEdit缺陷:

发动速度较慢。

默许的设置中不支撑Pascal言语。

对中文支撑不是很好。

Java开发东西ultraedit

UltraEdit

4)SublimeText

SublimeText是由程序员JonSkinner于2008年1月份所开发出来,它最初被设计为一个具有丰厚扩展功用的Vim。

它是一款收费软件,可是能够无限期试用,它是一个跨渠道的修改器,一起支撑Windows、Linux、MacOSX等操作体系。

SublimeText长处:

干流前端开发修改器

体积较小,运转速度快

文本功用强大

支撑编译功用且可在控制台看到输出

SublimeText

SublimeText

5)Vim

Vim是从Vi发展出来的一个文本修改器。代码补全、编译及过错跳转等便利编程的功用特别丰厚,在程序员中被广泛使用。是Unix体系用户最喜欢的文本修改器。

Vim长处:

支撑多种操作体系

翻开大文件速度较快,在大文件中查找的速度也非常快。

免费,开源

有搜索高亮功用

支撑多中修改言语

功用强大

Vim缺陷:

比较难学

虽然有菜单,但Windows用户第一次上手会很难

界面不太美观

键盘命令多,必须长期使用才干熟练。

© 版权声明
THE END
喜欢就支持一下吧
点赞42赞赏 分享
评论 抢沙发

请登录后发表评论