主要介绍Javac的实现过程及原理。 首先弄明白什么是Javac? Javac是一种编译器,将一种语言转换为另一种语言规范。...编译器的作用就是将符合java语言规范的源代码转化为JVM虚拟机能够识别的字节码文件的过程。 对于java而言。javac任务就是将java源代码转换为jvm能够识别的二进制码。...编译过程的原理: 1、词法分析:首先将源代码按照字节的方式读取,然后找出定义的语法关键字(if/else/for等),然后判断哪些关键字是符合java语言规范的,经过整理分析返回一些规范化的Token流...语义分析实现的步骤; 语义分析主要是在Enter类中完成的,这个类主要有两个步骤 (1)将所有类中出现的符号都输入到类自身的符号表中,所有的类符号,类参数列表,超类符号,和继承的接口类型符号都会存储到未处理的符号列表中...按照JVM文件组织的形式将字节码输出到后缀名为class的字节码文件中 整个业务流程: ? 关于javac的基本原理就介绍到这里,有兴趣的可以研究下Javac的源码,可以从OpenJdk下载到源码。
前一篇博文中最后遗留了一个问题: 项目部署用的Tomcat,依赖的也是官方jdk,为什么不会报错呢?...It is different from the javac, the compiler that is shipped with Sun JDK....把原答案翻译一下: Eclipse实现了它自己的编译器,叫做Eclipse Compile for Java(ECJ). 它和Sun JDK提供的编译器javac不同。...一个值得注意不同店在于Eclipse编译器允许运行没有真正正确编译的代码。如果有错误的代码块没有跑到,程序是能够正常运行的。此外,如果试图运行没有编译的代码,ECJ会抛出一个异常指示。...ECJ比javac更受欢迎的几个地方: Apache Tomcat 用ECJ来编译JSPs。
大家好,又见面了,我是你们的朋友全栈君。 java编译器名称是javac,是将源文件编译为字节码文件的程序,而java是java解释器的名称,也就是解释和执行字节码文件的程序。...注意::: java源文件必须是具有 .java 扩展名 java字节码文件必须具有 .class 扩展名 javac 可以将java源文件编译为class字节码文件 如 javac HelloWorld.java...运行javac命令后,如果成功编译没有错误的话,会出现一个HelloWorld.class的文件。
使用javac编译源码的过程如下: 解析和填充符号表 包括解析包括词法分析和语法分析。 词法解析:将源代码的字符流(每个字符)转变为标记(token,比如int a=b+2包括6个标记)集合。...填充符号表:主要记录抽象语法树的顶级节点。 插入式注解处理器的注解处理过程 如果插件在注解处理期间对抽象语法树进行了修改,编译期重新进入第一步,直到没有修改为止。...语义分析则是检查逻辑上的性质,比如变量使用前是否声明,变量赋值类型是否正确,方法是否有返回值等。...字节码生成:将抽象语法树,符号表转化为字节码写到磁盘,并进行少量的代码添加和替换,比如()方法,为了实例化子类过程为:先实例化父类构造器,再初始化变量,最后执行语句块。...替换:比如将字符串的+,替换为StringBuffer或StringBuilder的append方法。 lombok在第二步增加getter和setter等方法定义的相应树节点。
javac 编译过程 ? 一、解析与填充符号表: 1. 语法、词法分析: a) 语法分析:将源代码字符流转换为标记(Token:编译过程最小元素)集合。...b) 词法分析:根据标记序列构造抽象语法树(AST:用来描述程序代码语法结构的树形表示方式,每一个节点代表程序中的一个语法结构。 2. 填充符号表: 一组符号地址和符号信息组成的表格。...二、注解处理器: 插入式注解处理器,编译期间处理注解,读取,修改,删除语法树中的任意元素,编译器会根据修改与否,重新回到解析及符号表填充阶段进行处理。 ...标注检查: 包括变量使用前是否已声明,变量与赋值之间的数据类型是否匹配 +++ 常量折叠:int a = 1 + 2 ==> int a = 3 2....数据集控制流分析: 包括,局部变量是否赋值,方法路径返回值验证,受检异常的正确处理。 3. 解语法糖: 泛型,装箱拆箱,for循环,条件编译等 4. 字节码生成: 转换字节写磁盘。
在前一篇关于Javac编译器文章发布后,公众号后台有小伙伴留言问我javac命令是如何将java文件变成class文件的,我们能否实现一个这样的命令。...所以这篇文章的目的就是以Mac操作系统为例来模拟Javac命令。...首先javac命令在JDK的/bin目录下,其实质可以认为是一个脚本,在Mac系统中javac是一个可执行的 Unix文件,这里我们自己简单制作一个Unix可执行文件。..../" 才能运行这里简单的说明下,我们执行一条Linux命令,本质是在运行一个程序,比如我们运行 javac 命令,那么机器首先会去alias中查找命令的含义,然后去内置命令中查找,最后去环境变量的PATH...知道命令是如何执行之后,我们来实现一个自己的javac命令吧。
Javac 编译器的任务就是讲java语言规范转化成Java虚拟机语言规范,完成 “翻译工作” 什么是Javac Javac 是一种编译器,能将一种语言规范转化成另外一种语言规范。...虽然这种机器码执行起来非常搞笑,但是对人太不友好了, 开发这个代码的成本往往远高于剩下的机器的执行成本。 从某种意义上来说,有了编译器才有了程序语言的繁荣,因为片一起是人类和机器沟通的一个纽带。...那么回过头来,javac的编译器也是将Java这种对人非常友好的编程语言编译成对所有机器都非常友好的语言。注意,这种语言不是针对某个机器的,甚至包括不同种类,不同平台的机器。...如何系哦啊出不同种类,不同机器之间的差别,这个任务就由JVM来完成,而Javac的任务就是将Java源代码语言先转化成JVM能够识别的一种语言,然后由JVM将JVM语言再转化成当前这个机器能够识别的机器语言...如下图所示,javac的任务就是将java源码编译成Java字节码,也就是JVM能够识别的二进制码。
以前就知道javac的逻辑是用java实现的,当时猜测javac应该是个shell脚本,脚本的内容大概就是通过java命令执行对应的java文件来实现javac的逻辑。...$1为上个方法传过来的参数,值为javac $1_MAIN_CLASS为上个方法传过来的参数,值为com.sun.tools.javac.Main $1_MAIN_MODULE的值为jdk.compiler...,使javac命令在编译期就确定了其要执行的包含main方法的java类为 jdk.compiler/com.sun.tools.javac.Main。...在运行javac时,javac获取该java类,调用它的main方法,然后把我们传给javac命令的参数,传给该java类的main方法。...最后,通过该Java类的main方法以及其他相关内容,实现javac命令的总体逻辑。
正文 将一组源文件编译成相应的一组类文件的过程并不简单,但是通常可以分为三个阶段。源文件的不同部分可以在“按需”的基础上以不同的速率进行处理。...这个过程是由JavaCompiler类来处理的: 将命令行上指定的源文件进行读取,解析为语法树,然后将所有外部可见的定义都输入到编译器的符号表中 在编译的过程中会调用适当的注解处理器.如果在调用过程中,..., 使类变得完整).使类变得完整可能是按需发生的,但是任何未以这种方式完成的类最终将通过处理未完成队列来完成.使一个类完成需要如下条件: 确定类的泛型参数,父类,接口 将该类的所有符号输入到它所对应的...这是通过在编译后的类的类符号中安装completer对象来实现的,编译后的类为对应的类树调用MemberEnter阶段。...Lower进行处理的,它重写语法树以通过替换等价的、简单的树来消除特定类型的子树。
前端编译 前端编译大致主要有以下流程: 对源文件进行词法分析产生字符流 对字符流进行语法分析产生抽象语法树 对语法树进行语义分析,确保语义正常 语义分析通过以后生成中间代码(字节码) 下面我们站在javac...词法分析主要由com.sun.tools.javac.parser.Scannaer类来实现。...上述抽象语法树在Java中使用com.sun.tools.javac.tree.JCTree类来表示,之后所有的操作均建立在抽象语法树之上。...4.2.2 字节码生成 字节码生成是javac编译的最后一个阶段。字节码生成阶段不仅仅是把各个步骤生成的信息转换成字节码写到磁盘,还进行了代码的添加和转换工作。...,就会填充了所有信息的符号表交给com.sun.tools.javac.jvm.ClassWriter类,最后由该类的writeClass()方法输出字节码。
大家好,又见面了,我是你们的朋友全栈君。...javac使用 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/140295.html原文链接:https://javaforall.cn
介绍 javac 、 java、javadoc 命令的用法 一、创建类:HelloWorld.java 这里要注意 package,因为运行的时候要根据这个 package 去运行主函数 我的 HelloWorld.java...在文件系统中的位置 D:\workspaceVideo\learnJava\src\com\qicong\HelloWorld.java !...[(https://rongkkboke.com/view.php/718fe3b33f753b2e310c34f78dd35c3d.png) 二、javac 命令进行编译 在 cmd 中,进入 HelloWorld.java...所在的目录,执行命令 cd D:\workspaceVideo\learnJava\src\com\qicong\ javac -encoding utf-8 HelloWorld.java 这个时候...x6267;行命令 java com.qicong.HelloWorld 四、顺便说一下 javadoc 命令 javadoc 命令可以生成 java源码文件 的对应文档
,并绘制了如下的曲线(图中公式使用 Excel 的趋势线进行拟合),见下图 2: 图 2:Tuple 总数与编译时间的关系 可以看到,编译时间随 Tuple 数变化的曲线,完美符合三次函数,即该算法的时间复杂度约为...当程序运行一段时间后,我们找出了热点方法(见图 4),即 javac 编译起内部的 List 相关调用;通过仔细追踪调用链,发现是 checkWithinBounds 方法过于缓慢。...图 4:找出热点方法 既然热点方法找到了,那么下面就需要探究这个方法在 javac 编译器中是做什么的,它的算法为什么这么慢,以及是否有优化的方式。...在这个 2014 年就提出的 JEP-215 中,开发者设计了一种新的 javac 方法类型检测机制 TA(Tiered Attribution)来代替现有的 SA(Speculative Attribution...JDK 的编译耗时 由此可见,这个 JEP-215 起到了立竿见影的效果,让项目构建的时间恢复了往日的情景。
旧系统配置了ANT一键部署功能的脚本,由于部署需要,所以这里又重新配置了下环境。...3、java -version 发现是openJDK版本,开始以为是环境变量的问题,因为openJDK安装的时候是默认的。.../lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin 然而你有没有发现JAVA_HOME 下面根本没有所谓的lib...文件,于是目录下自建lib目录,把本地的相关jar拷贝进去,然后 source /etc/proifle。...4、然后重新执行脚本,又报错了: Error running javac compiler 翻译一下可能就是无法找到javac编译器。 百度搜了一下,终于在老外的网站找到了问题。
错误如下图所示: 解决方法如下: 1、首先进入java文件所在的目录 2、进入目录后,再输入javac 文件名.java即可
JAVA和JAVAC 命令行 javac和java命令行中的-classpath选项 这是个很基础的问题,但是因为基本上都是用现有的IDE工具 来开发java程序,所以很少有人意识到这一点。...javac -classpath,设定要搜索类的路径,可以是目录,jar文件,zip文件(里面都是class文件),会覆盖掉所有在CLASSPATH里面的设定。...所以一个完整的javac命令行应该是这样的, 假设abc.java在路径c:\src里面,在任何的目录的都可以执行以下命令来编译。...javac -classpath c:\classes;c:\jar\abc.jar;c:\zip\abc.zip -sourcepath c:\source\project1\src;c:\source...下编译和运行的例子 /usr/local/java/bin/javac -classpath /tmp/javatest/lib/mail-1.3.3.jar -d /tmp/javatest/bin
通常我们也叫Javac编译器为前端编译器,因为一个传统编译器编译结果是由源码到本地机器码的一个过程,而由于Javac编译器只负责源码到字节码这一步,所以叫前端编译器;字节码到本地机器码这一步是由后端运行时编译器来完成的...Javac编译是使用Java语言实现的,是不是很疑惑,用Java语言编写一个javac编译器去编译Java,那Javac的源码又是如何被编译执行的呢(好像鸡生蛋还是蛋生鸡的问题)?...到这里我们知道javac编译器是如何而来的,那么我们程序中能不能使用javac编译器呢?答案是肯定的。...tools.jar中的com.sun.tools.javac包来调用Java编译器,在这个包的根目录提供了主类完成编译的功能,也就是我们是使用javac命令所执行的程序, 但是由于tools.jar不是标准的...,感兴趣可以通过OpenJDK来下载源码,然后自己编译javac的源码, 也可以通过调用jdk的com.sun.tools.javac.main.Main类来手动编译指定的类
通过用户的环境变量(~/.bash_profile)去改.写入文件.bash_profile vim ~/.bash_profile export JAVA_TOOL_OPTIONS=-Dfile.encoding...shell和fish shell ☆文章版权声明☆ * 网站名称:obaby@mars * 网址:https://h4ck.org.cn/ * 本文标题: 《Mac shell(fish) javac...中文乱码》 * 本文链接:https://h4ck.org.cn/2014/12/mac-shellfish-javac-%e4%b8%ad%e6%96%87%e4%b9%b1%e7%a0%81/...请遵从 《署名-非商业性使用-相同方式共享 2.5 中国大陆 (CC BY-NC-SA 2.5 CN) 》许可协议。...win7去掉快捷方式小箭头最正确的方法!
为什么写这这篇文章 一直有读者问我 javac 源码怎么调试,自己也在写 JVM 掘金小册的过程中阅读了大量的 javac 的源码,网上这方面的文章比较少,那就来写一篇 javac 源码调试的文章吧,作为...javac 系列文章的开篇。...整个 javac 源码调试的过程是比较简单的,它本身就是用 Java 语言写的,对我们理解内部逻辑比较友好。.../arthur-zhang/javac-source-code-reading OpenJDK 的下载方式为:打开 https://hg.openjdk.java.net/jdk8/jdk8/langtools.../jvm/Items.java 的 load() 函数加上断点 可以看到选择的策略依次往下: -1~5 之间选择 iconst_n 的方式 -128~127 之间选择 bipush -32768~32767
领取专属 10元无门槛券
手把手带您无忧上云