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. Linux学习3-Linux系统安装CentOS6.5

    1.启动虚拟机(虚拟机的安装参见Linux学习1-创建虚拟机) 本此安装系统:CentOS6.5         2.启动客户端后迅速按下F2键进入Bios设置,注意:启动后需鼠标点击虚拟机的屏幕并迅 ...

  2. 初级版python登录验证,上传下载文件加MD5文件校验

    服务器端程序 import socket import json import struct import hashlib import os def md5_code(usr, pwd): ret ...

  3. Spring 、SpringMVC 、Struts2之间的区别

    一.Spring与SpringMVC的区别: spring是一个开源框架,是为了解决企业应用程序开发,功能如下: 功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能 范围:任何Ja ...

  4. js-权威指南学习笔记18

    1.除mouseenter和mouseleave外的所有鼠标事件都能冒泡. 2.传递给鼠标事件处理程序的事件对象有clientX和clientY属性,它们制订了鼠标指针相对于包含窗口的坐标. 3.一个 ...

  5. CSS选择器之基本选择器+属性选择器

    1.1      id选择器 #main{ font-size:12px; margin:0; padding:0; } 其中的#main就是id选择器,用于选择HTML页面中id = "m ...

  6. 深入解析 ERP 计划的各个层次

    ERP 生产计划管理按照 ERP 计划的层次主要分为:经营规划.销售和运作规划.主生产计划.物料需求计划.能力需求计划.执行能力计划.执行物料计划等. 经营规划是企业的战略规划,用于确定企业经营目标和 ...

  7. 带你从零学ReactNative开发跨平台App开发(五)

    ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...

  8. 使用ServiceBroker自动激活模拟"秒杀"场景

    1.简介 SQL Server Service Broker 是SQL server 里面比较独特的一个功能.它可帮助开发人员构建异步的松散耦合应用程序 ServiceBroker入门文章:http: ...

  9. ubuntu下配置JDK7环境变量

    ubuntu下JDK配置本质上和win是一样的: 1.去官网下载JDK7,找jdk-7u21-linux-i586.tar.gz并下载:http://www.oracle.com/technetwor ...

  10. 使用 PowerShell 创建和修改 ExpressRoute 线路

    开始之前 安装最新版本的 Azure Resource Manager PowerShell cmdlet. 有关详细信息,请参阅 Azure PowerShell 概述. 在开始配置之前,请查看先决 ...