一、javac是什么?

1、javac是一种编译器,能够将一种语言规范转化成另外一种语言规范

2、javac的任务就是将Java源代码转化成JVM能够识别的一种语言(Java字节码),这种字节码不是针对某种机器、某种平台的

二、javac编译器编译程序的步骤

1、词法分析

首先是读取源代码,找出这些字节中哪些是我们定义的语法关键词,如Java中的if、else、for等关键词。

语法分析的结果:从源代码中找出一些规范化的token流。

注:token是一种认证机制

2、语法分析

检查关键词组合在一起是不是Java语言规范,如if后面是不是紧跟着一个布尔表达式。

语法分析的结果:形成一个符合Java语言规范的抽象语法树

3、语义分析

把一些难懂的、复杂的语法转化为更加简单的语法。

语义分析的结果:完成复杂语法到简单语法的简化,如将foreach语句转化成for循环结果,还有注解等。最后形成一个注解过后的抽象语法树,这颗语法树更接近目标语言的语法规则。

4、生成字节码

通过字节码生成器生成字节码,根据经过注解的抽象语法树生成字节码,也就是将一个数据结构转化成另一个数据结构。

代码生成器的结果:生成符合Java虚拟机规范的字节码。

注:抽象语法树

在计算机科学中,抽象语法树是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。

三、javac编译器的基本结构

按照上述编译步骤来看,可以将javac编译器分为4个模块:词法分析器、语法分析器、语义分析器和代码生成器。

素小暖讲Java@目录

转载于:https://my.oschina.net/u/4006148/blog/3067315

浅谈Javac编译原理相关推荐

  1. 浅入浅出Javac编译原理——爪哇岛探险(1)

    浅入浅出Javac编译原理 Java语言是当今程序员中使用最广的语言,不光是从语言本身来说,还包括了与Java相关的一些概念.例如JDK,J2EE,JVM等等.还不断有新的语言出现,如groove,s ...

  2. 编译原理代码生成器java_浅入浅出Javac编译原理

    浅入浅出Javac编译原理 Java语言是当今程序员中使用最广的语言,不光是从语言本身来说,还包括了与Java相关的一些概念.例如JDK,J2EE,JVM等等.还不断有新的语言出现,如groove,s ...

  3. java转换成class文件_浅谈JVM编译原理-.java文件转变为.class文件的过程

    为什么需要编译? 我们平常写代码,有规范的命名方式,都能够看得懂,但是我们写的代码计算机是看不懂的,所以需要编译,也就是一个转换的过程,如下: 1.这个是咱们平时写的代码,就比较好理解,对人友好 2. ...

  4. 编译原理代码生成器java_浅谈JVM编译原理-.java文件转变为.class文件的过程

    为什么需要编译? 我们平常写代码,有规范的命名方式,都能够看得懂,但是我们写的代码计算机是看不懂的,所以需要编译,也就是一个转换的过程,如下: 1.这个是咱们平时写的代码,就比较好理解,对人友好 2. ...

  5. 浅谈会话劫持原理及实践

    <监视你的一举一动> ---浅谈会话劫持原理及实践 前言 通常,大家所说的入侵,都是针对一台主机,在获得管理员权限后,就很是得意:其实,真正的入侵是占领整个内部网络.针对内部网络的攻击方法 ...

  6. 浅谈反编译在项目中的使用

    浅谈反编译在项目中的使用 什么是反编译 反编译的作用 反编译工具 动态编程 JavaSsist 源码安全 什么是反编译 将可读性较好的高级计算机语言(JAVA,C#,C)转换成计算机能解读.运行的低阶 ...

  7. 浅谈:Spring Boot原理分析,切换内置web服务器,SpringBoot监听项目(使用springboot-admin),将springboot的项目打成war包

    浅谈:Spring Boot原理分析(更多细节解释在代码注释中) 通过@EnableAutoConfiguration注解加载Springboot内置的自动初始化类(加载什么类是配置在spring.f ...

  8. 浅谈前端路由原理hash和history

    浅谈前端路由原理hash和history

  9. 浅谈“三层结构”原理与用意(转帖)

    浅谈"三层结构"原理与用意 序 在刚刚步入"多层结构"Web应用程序开发的时候,我阅读过几篇关于"asp.net三层结构开发"的文章.但其多 ...

最新文章

  1. git reset用法
  2. c实现多语言编程,C/C++编程中多国语言处理
  3. noi.ac NOIP2018 全国热身赛 第四场 T1 tree
  4. iOS----------使用cocoapods遇到的问题
  5. 数据结构基础:栈(Stack)
  6. UVA - 133 ​​​​​​​The Dole Queue
  7. VUE学习和开发中的注意点总结(一),便于回顾(不断完善补充。)
  8. sqlserver 只有函数和扩展存储过程才能从函数内部执行
  9. 第六章——并行接口技术
  10. java ssh2连接_通过JCraft的jsch包基于SSH2协议实现连接linux服务器提供终端操作的java工具实现类SftpUtil...
  11. Android中SQLite,ContentProvider和ContentResolver的使用(一)
  12. axi时序图_AXI总线学习
  13. 【Redis学习笔记(九)】之 Redis客户端详解
  14. 计算机网络之数据传输方式:电路交换、报文交换和分组交换
  15. oracle excel vba6,如何在WPS个人Excel表格中启用宏功能来使用VBA
  16. (待补充)【读书笔记】20190809《运营之光》——黄有璨
  17. html语音对话,纯CSS对话框/对话气泡/语音泡沫/speech bubbles【27个示例】
  18. 响应式布局——Bootstrap
  19. webpack打包生成的map文件_Webpack的devtool和source maps
  20. EfficientNet网络解析

热门文章

  1. 今天给大家介绍一下苹果手机的“播客”这个软件
  2. python数据分析 统计学_Python数据分析之统计学基础(案例:描述统计)
  3. 商品管理系统--分类、品牌、属性、商品、价格、图片管理
  4. Linux--同步IO/异步IO区别
  5. Excel文件导出总结,包含大数据量的分批导出方式
  6. Linux在线终端模拟器
  7. 爬取今日头条小心(新)得
  8. Centos如何安装vnc
  9. java 反射教程_Java基础教程——反射机制
  10. 新手自学php,curl应用时接口数据无返回值