说说Javac
Java语言有Java语言的规范,,这个规范详细描述了Java语言有哪些词法、语法,而Java虚拟机也有其Java虚拟机的规范,同样Java虚拟机的规范和Java语言规范并不一样,它们都有自己的词法和语法解析规则,而且解析规则也是不同的。那么如何将Java的语法规则适应到Java虚拟机的语法规则呢?这个任务就由Javac编译器来完成。它的任务就是将Java语言规范转化成Java虚拟机语言规范,完成"翻译工作"。
本文主要围绕如下三个方面来讲解:
第一、Javac是什么;
第二、Javac编译器的基本结构;
一、Javac是什么
Javac是一种编译器,能将一种语言规范转成另外一种语言规范,通常编译器都是将人易理解的语言规范转化成机器易理解的语言规范,如C、C++、Python或者汇编语言都是将源码直接编译成目标机器码,这个目标机器码是CPU直接执行的指令集合。这些指令集合也就是底层的一种语言规范,这种语言规范机器能够直接识别,但是人不可能直接去写目标机器码。虽然这种机器码执行非常高效,但是对人太不友好了,往往开发这个代码的成本远远高于省下的机器的执行成本,所以才有了编译器,有了编译器才有可能出现如此多的高级语言。
从某种意义上说,有了编译器才有了程序语言的繁荣,因为编译器是人类和机器的沟通的一个纽带。那么回过头来,Javac的编译器也是将Java这种对人非常友好的编程语言编译成对所有机器都非常友好的一种语言。注意,这种语言不是针对某个机器的,甚至包括不同种类、不同平台的及其。如何消除不同种类、不同平台机器之间的差别,这个任务就由JVM来完成,而Javac的任务就是将Java源代码语言先转换成JVM能够识别的一种语言,然后由JVM将JVM语言再转化成当前这个机器能够识别的机器语言。
所以这样看来,Java语言要比其他语言(如C语言)多了一层转换,这一层转换虽然牺牲了一些执行效率,但是向Java语言的开发者屏蔽了许多和目标机器相关的细节,使得Java语言的执行和平台无关,这也成就了Java语言的繁荣。
二、Java编译器的基本结构

比如拿Java运行原理简要概述,
总的来说,高级语言基本都遵循一个总的原则:源代码->机器码
流程:
java源文件通过java编译器(javac)生成字节码文件(.class),字节码再通过Java虚拟机转化为机器码。
.java->.class->jvm->机器码
从这里也体现出Java比其他编程语言(比如c语言)多了一步就是jvm。
从上面的图也可以看出Javac主要由词法分析器、语法分析器、语义分析器、代码生成器等四个模块组成。
词法分析器:
词法分析的过程:读取源代码,识别关键字,比如if、else、while、for、swich等等,那些是Java的关键字那些不是。
词法分析的结果:从源代码找出规范的Token流,就像人类语言中,给你一句话,你能分辨出那些是名词、那些是动词、那些是标点符号等等。
语法分析器:
语法分析的过程:对上述Token流进行语法分析,检查关键字组合在一起是否符合Java规范,比如String s不能只声明而不赋值,因为非基本数据类型没有默认值。
语法分析的结果:形成一个符合Java语言规范的抽象语法树,
例如:
Java代码:

抽象成语法树:

语义分析器:
语义分析的过程:难懂复杂的语法转成简单易懂的语法,联系到上学学过的文言文,也就是将文言文翻译成白话文。
语义分析的结果:复杂语法->简单语法
代码生成器:
生成字节码文件
本文主要参考《深入分析JavaWeb技术》
小结:
Java需要通过编译器转化成字节码,通过JVM识别字节码转换cpu可以执行的机器码。而像c/c++这样的高级语言直接就是源码->编译器->机器码。
联系到现实生活中,比如翻译官,特别是外交访问时,一般身边都会有翻译官。翻译官联系到本文就相当于编译器”。
说说Javac的更多相关文章
- Fedora javac 命令提示 [javac: 未找到命令...]
[joy@localhost ~]$ java -version openjdk version "1.8.0_91" OpenJDK Runtime Environment (b ...
- javac -encoding utf8 in linux
由于另外负责编码的同事用的是utf-8,我用的默认的编码格式gbk,在提交代码时,为了迁就他,我打算把格式用工具转成utf-8. 转化成果后,然后在make一下,发现javac -encoding u ...
- javac编译不同目录的源码提示找不到符号
对于单个文件的且不引用其他类文件的java源码用javac编译大家都很熟悉即 javac mycode.java 但是如果这个文件引用到了其他的类文件,在进行编译的时候就会提示找不到符号,这时我们需要 ...
- JAVA安装过程中出现的“javac不是内部或外部指令”的解决方法
近来重新安装了JAVA,安装过程中出现问题,网上找到解决办法,汇总发布. 解决流程: 1.确定自己的环境变量设置没问题,没有出现遗漏 : . 等情况 (具体环境变量设置百度) 2.环境变量设置后 ,d ...
- java与javac命令的功用
一.javac用来编译java程序,比如说我写了一个Server.java文件,首先通过命令行进入.java文件所在的路径, 然后通过输入 javac Server.java 命令行来完成编译,编译之 ...
- Maven打包 报 Unable to locate the Javac Compiler in: C:\Program Files\Java\jre1.8.0_73\..\lib\tools.jar
无法找到javac 编译环境 右键项目 --> properties -->Java Build Path -->选中JRE 点击右侧 Edit 编辑 --> 把你设置的JRE ...
- eclipse中的javac命令与java命令
一.eclipse的javac命令:当eclipse对.java(源文件)文件进行保存操作时(快捷键ctrl+s),会执行javac命令.见上图,Default output folder(默认输出文 ...
- 配置javac环境
初始的javac是默认不可用,如下图: 系统变量->新建->变量名:JAVA_HOME 变量值:(C:\Program Files\Java\jdk1.7.0_03)(这只是我的JDK安装 ...
- javac 导入第三方jar包
如果是导入一个包,只需要 javac -classpath xxx/xxx/xxx.jar xxx.java 即可 如果有多个包,windows下用分号隔开,Lunix下用冒号隔开即可.
- javac找不到或无法加载主类 com.sun.tools.javac.Main
在安装jdk后或者以前安装了jdk某时使用javac编译java文件时出现找不到或无法加载主类com.sun.tools.javac.Main,这个问题时,网上一般都说是环境变量配置不对,这样的说法其 ...
随机推荐
- BootStrap-select 插件的使用
这是一款下拉框多选的插件,非常的抢到,什么样式都是有的:首先去参看一下官网的信息,详细介绍是怎么使用的: 相关官网网址: https://silviomoreto.github.io/bootstr ...
- elasticsearch安装指导(new)
1 直接去官网下载rpm包安装或者下载tar包 2 服务启动后,发现打不开页面,修改yml文件即可 用rpm包安装的软件有一个特点就是不同的目录在不同文件夹,比如config文件夹根据下面进程信息查到 ...
- xib Nib IB 可视化编程详解
简单的说,Xib就是拖控件编程,也可以说是可视化编程. 相对于代码,使用IB和xib文件来组织UI,可以省下大量代码和时间,从而得到更快的开发速度. 如果你曾经受到过微软家Visual Basic或者 ...
- angular2.0---服务Service,使用服务进行数据处理
1.创建服务 打开命令窗口,cd到项目目录下,输入 ng g service myData1 回车 创建服务,如下图所示: 这样就成功创建了服务,此时,可以在项目的app文件夹下生成了两个serv ...
- linux中文字体
◆ 背景说明 报表,在windows下,展现.导出都正常,在linux下,字体变大了.比如,单元格的大小设计好后,里面的字当好能一行显示完,将报表放到linux下后,字变大了,一行显示不完了,变 ...
- is_palindrome 回文递归
# coding=utf-8def is_palindrome(n,start,end): if start>end: return 1 else: return is_palindrome(n ...
- Java 性能调优指南之 Java 集合概览
[编者按]本文作者为拥有十年金融软件开发经验的 Mikhail Vorontsov,文章主要概览了所有标准 Java 集合类型.文章系国内 ITOM 管理平台 OneAPM 编译呈现,以下为正文: 本 ...
- 解决MyEclipse不能导出war包
原因:无法导出是由于软件破解不完成导致的: 解决办法: 找到MyEclipse安装目录下MyEclipse\Common\plugins文件夹中的com.genuitec.eclipse.export ...
- phantomJs页面截图
因为phantomjs使用了一个真正的渲染引擎WebKit,它能截取一个web页面的真实影像,这是因为phantomjs能够折射出WEB页面上的任何东西,包括html,css,svg和Canvas等. ...
- 微信网页IOS上传图片旋转解决方案
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...