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的更多相关文章

  1. Fedora javac 命令提示 [javac: 未找到命令...]

    [joy@localhost ~]$ java -version openjdk version "1.8.0_91" OpenJDK Runtime Environment (b ...

  2. javac -encoding utf8 in linux

    由于另外负责编码的同事用的是utf-8,我用的默认的编码格式gbk,在提交代码时,为了迁就他,我打算把格式用工具转成utf-8. 转化成果后,然后在make一下,发现javac -encoding u ...

  3. javac编译不同目录的源码提示找不到符号

    对于单个文件的且不引用其他类文件的java源码用javac编译大家都很熟悉即 javac mycode.java 但是如果这个文件引用到了其他的类文件,在进行编译的时候就会提示找不到符号,这时我们需要 ...

  4. JAVA安装过程中出现的“javac不是内部或外部指令”的解决方法

    近来重新安装了JAVA,安装过程中出现问题,网上找到解决办法,汇总发布. 解决流程: 1.确定自己的环境变量设置没问题,没有出现遗漏 : . 等情况 (具体环境变量设置百度) 2.环境变量设置后 ,d ...

  5. java与javac命令的功用

    一.javac用来编译java程序,比如说我写了一个Server.java文件,首先通过命令行进入.java文件所在的路径, 然后通过输入 javac Server.java 命令行来完成编译,编译之 ...

  6. 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 ...

  7. eclipse中的javac命令与java命令

    一.eclipse的javac命令:当eclipse对.java(源文件)文件进行保存操作时(快捷键ctrl+s),会执行javac命令.见上图,Default output folder(默认输出文 ...

  8. 配置javac环境

    初始的javac是默认不可用,如下图: 系统变量->新建->变量名:JAVA_HOME 变量值:(C:\Program Files\Java\jdk1.7.0_03)(这只是我的JDK安装 ...

  9. javac 导入第三方jar包

    如果是导入一个包,只需要 javac -classpath xxx/xxx/xxx.jar xxx.java 即可 如果有多个包,windows下用分号隔开,Lunix下用冒号隔开即可.

  10. javac找不到或无法加载主类 com.sun.tools.javac.Main

    在安装jdk后或者以前安装了jdk某时使用javac编译java文件时出现找不到或无法加载主类com.sun.tools.javac.Main,这个问题时,网上一般都说是环境变量配置不对,这样的说法其 ...

随机推荐

  1. zookeeper 选举

    选举概述: 1.启动时期的选举 所有的服务器状态为 LOOKING. 1.1.每个Server 会投出一票(投票规则为:SID.ZXID ,即 服务器ID 和 最大事务ID). 1.2.处理选票 (A ...

  2. LINQ语法类似于SQL的语法

    LINQ语法类似于SQL的语法如下, Models.BookStoreEntities 是从添加新建项中的数据--->ADO.NET实体数据模型--->从数据库生成--->使用5.0 ...

  3. UVAlive6807 Túnel de Rata (最小生成树)

    题意 题目链接 Sol 神仙题Orz 我们考虑选的边的补集,可以很惊奇的发现,这个补集中的边恰好是原图中的一颗生成树: 并且答案就是所有边权的和减去这个边集中的边的权值: 于是我们只需要求最大生成树就 ...

  4. drupal7设置不含www的url跳转到含www的url

    打开drupal的.htaccess文件 找到 If your site can be accessed both with and without the 'www.' prefix 将下面对应的三 ...

  5. 清除浮动以及:after元素

    http://www.iyunlu.com/demo/enclosing-float-and-clearing-float/index.html 以上这篇示意图把清除浮动的几种方法讲的非常清楚了,其中 ...

  6. 数据是ERP系统搭建的基础,但,不要让数据毁了ERP

    很难想象没有数据的ERP是什么样子的.然而,实际情况又是如何的呢? 根据AMT的研究,在那些上线不成功或者上线后掉线的案例中,有高达70%的项目都有一个共同的直接原因,那就是在数据上出了问题.有的是在 ...

  7. SQL注入 payload 记录

    使用 REGEXP盲注 payload select user() from users where user_id=1 and (select(user)from users where user_ ...

  8. ExtJs 4.1.1 文件结构解析

  9. PyQt4(简单界面)

    import sys; from PyQt4 import QtCore, QtGui; app=QtGui.QApplication(sys.argv); widget=QtGui.QWidget( ...

  10. leetCode题解之Reshape the Matrix

    1.题目描述 2.分析 使用了一个队列. 3.代码 vector<vector<int>> matrixReshape(vector<vector<int>& ...