编译其本质是将一种语言规范转换成另一种语言规范,即将Java语言规范转换为JVM虚拟机语言规范。结果就是.java文件到.class文件。

对于C/C++编译直接将高级语言转换为机器语言,Java语言不是采用这种策略,而是将高级语言编译成一种中间态的语言--与平台无关,其执行

过程是依靠对应平台的JVM在执行时刻逐条的将字节码指令转换为对应的机器语言,为了提高转换速度存在JIT技术。

二、javac编译的具体过程

  源码-->Token流-->语法树-->注释语法树-->字节码文件

  词法分析:扫描源程序的字符流,按照源程序语言的的词法规则选取各类单词符号,产生用于语法分析的记号序列。同时创建符号表,将

所有的标识符记录在符号表中。

  语法分析:是编译过程的核心,依据源程序的语法规则,组织上一步产生的记号序列。形成一个按照特定语法规则组织的结构---通常是语法

树的形式体现。

  语义分析:主要包括两部分的内容,语义检查,其就是对上步产生的语法树进行检查,包含类型检查、控制流检查、唯一性检查等。另一个

任务就是对符号表的管理。

  代码生成器:将处理过的语法树组织成Class文件的格式。

  符号表的作用:记录源代码中使用的标识符,收集每个表示符的各种属性信息。符号表的维护是贯穿整个编译过程的。

  错误处理:编译过程中的每一步都可能产生错误,编译器要能对这些错误给予处理。

三、不同种类Java语言编译器

根据编译器的种类不同,编译器编译的过程可能存在很大的不同,商用的JVM一般具有前端编译器和解释器。

  前端编译器:直接将源文件转化为字节码文件

  即时编译器:将源码转换为字节码,在将字节码转换为机器码。

  运行前编译:直接将源码转换为指定平台的机器码

Java源代码编译过程的更多相关文章

  1. 【转】Java代码编译过程简述

    转载:https://blog.csdn.net/fuzhongmin05/article/details/54880257. 代码编译是由Javac编译器来完成,流程如下图1所示: 图1 Javac ...

  2. JAVA 程序编译过程;编辑器,编译器和解释器

    最基本的软件工具包括,编辑器,编译器,解释器; 编译器:编译器就是将一种编程语言代码翻译成另一种语言的等效代码程序. 解释器:解释器将编译和执行交织在一起,即编译一部分代码后执行该部分代码,然后再编译 ...

  3. Android源代码编译过程及指令

    编译Android源代码分为两种情况: 1. 完整编译源码: ./mk_aliphone.sh --> 完整编译脚本 --> 6735  输入对应的编号 --> userdebug ...

  4. 3DSlicer源代码编译过程vs2008+windows xp [转]

    一 下载QT源代码编译 1.  简述   在 Windows2000/xp/vista 下,安装 VS2008, QT 4.7.2 :并在 VS2008上建立 QT 的集成开发环境,利用 VS2008 ...

  5. OpenSift源代码编译过程记录

    本文记录了在CentOS6.5上编译Sift的开源实现OpenSift的编译过程,同一时候记录了编译过程中的几个问题. sift的理论已经有非常多了,以下会给出链接: 1.Requirements a ...

  6. java的编译过程

    用记事本编写两个java文件 第一个Employee.java import java.io.*; public class Employee{ String name; int age; Strin ...

  7. java代码编译过程

    简单随笔 java程序需要先编译成class文件然后才能执行,由于是编程成立机器代码,虚拟机加载内存的时候更快的执行. java文件编译成class文件步骤如下: 1)词法分析,检查每一个关键字单词是 ...

  8. Linux1.0源代码编译过程

    根据源代码包中的readme文件及http://chfj007.blog.163.com/blog/static/173145044201191195856806/?suggestedreading& ...

  9. Mariadb源代码编译过程

    从微博上看到有人提及Mariadb,搜索了一下.找到地址https://mariadb.org/,这是mysql的一个分支,由原作者维护.意在与oracle分庭抗礼,避免oracle将来毕源. 眼下版 ...

随机推荐

  1. 1.0 docker介绍

    简介: 一种虚拟化的方案 将应用程序自动部署到容器   特点: 轻量 环境的一直性 提高开发生命周期 使用面向服务的架构   场景: 开发.测试.部署 创建隔离的运行环境 集群测试环境 云计算应用   ...

  2. js删除数组中重复的元素

    1.方法一 将数组逐个搬到另一个数组中,当遇到重复元素时,不移动,若元素不重复则移动到新数组中 function unique(arr){ var len = arr.length; var resu ...

  3. Tornado 目录

    第一章:引言 1.1 Tornado是什么? 1.1.1 Tornado入门 1.1.2 社区和支持 1.2 简单的Web服务 1.2.1 Hello Tornado 1.2.1.1 参数handle ...

  4. java===java基础学习(14)---封装

    package dog; public class Demo4 { public static void main(String []args) { Worker w1= new Worker(&qu ...

  5. 64_g4

    gnatcoll-2014-10.fc26.x86_64.rpm 28-Feb-2017 17:44 1738266 gnatcoll-devel-2014-10.fc26.i686.rpm 28-F ...

  6. DXEditingRow的错误原因

    原因之一:例如commbox理由id这一列但是数据库表中没有的话就会报这个错误

  7. vue 文件引入

    直接 <script> 引入 直接下载并用 <script> 标签引入,Vue 会被注册为一个全局变量.重要提示:在开发时请用开发版本,遇到常见错误它会给出友好的警告. 开发环 ...

  8. nginx+uwsgi+django+virtualenv+supervisor部署web服务器

    wsgi 全称web server gateway interface,wsgi不是服务器,也不是python模块,只是一种协议,描述web server如何和web application通信的规则 ...

  9. AC日记——「SCOI2016」背单词 LiBreOJ 2012

    #2012. 「SCOI2016」背单词 思路: Orz: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1 ...

  10. CentOS7配置sentinel高可用redis

    redis哨兵:用于管理和实现多个redis组实现高可用,sentinel哨兵只监控主节点,因为主节点上有所有的从节点信息,当master节点发生故障,sentinel之间会进行投票选举一个slave ...