为什么需要编译?

我们平常写代码,有规范的命名方式,都能够看得懂,但是我们写的代码计算机是看不懂的,所以需要编译,也就是一个转换的过程,如下:

1.这个是咱们平时写的代码,就比较好理解,对人友好

2.编译后就变成了这样的字节码文件,对JVM友好

那么这个转换的过程是什么样子呢?

我们可以回想一下,我们在写代码的时候,我们使用的开发工具idea或者eclipse编写代码的时候,是不是会遇到一些提示,比如说写了一个if,但是后面的括号内不是一个bool值,就会出现一个红色的提示波浪线,出现这种情况,那么编译是肯定不可能通过的,所以我们可以肯定,编译的过程一定有一个这样的基本语法的规则;

一个完整的规则可以用下面这张图来表示(引用,文章结尾给出url)

1)词法分析:读取源代码,一个字节一个字节的读进来,找出这些词法中我们定义的语言关键词如:if、else、while等,识别哪些if是合法的哪些是不合法的。这个步骤就是词法分析过程。

词法分析的结果:就是从源代码中找出了一些规范化的token流,就像人类语言中,给你一句话你要分辨出哪些是一个词语,哪些是标点符号,哪些是动词,哪些是名词。

2)语法分析:就是对词法分析中得到的token流进行语法分析,这一步就是检查这些关键词组合在一起是不是符合Java语言规范。如if的后面是不是紧跟着一个布尔型判断表达式。

语法分析的结果:就是形成一个符合Java语言规定的抽象语法树,抽象语法树是一个结构化的语法表达形式,它的作用是把语言的主要词法用一个结构化的形式组织在一起。这棵语法树可以被后面按照新的规则再重新组织。

3)语义分析:语法分析完成之后也就不存在语法问题了,语义分析的主要工作就是把一些难懂的,复杂的语法转化成更简单的语法。就如难懂的文言文转化为大家都懂的百话文,或者是注释一下一些不懂的成语。

语义分析结果:就是将复杂的语法转化为简单的语法,对应到Java就是将foreach转化为for循环,还有一些注释等。最后生成一棵抽象的语法树,这棵语法树也就更接近目标语言的语法规则。

4)字节码生成:将会根据经过注释的抽象语法树生成字节码,也就是将一个数据结构转化为另外一个数据结构。就像将所有的中文词语翻译成英文单词后按照英文语法组装文英文语句。

总结如下:

词法分析就是将关键词组织成token流即检查源码中的的关键词是否真确并组织成token流,而语法分析就是检查源码是否符合java语法规范并将词组成语句。语义分析就是简化复杂的添加缺少的,检查变量类型是否合法。代码生成器就是(javac编译器调用com.sun.tools.javac.jvm.Gen)遍历这棵树生成符合JVM规范的代码。

这些最后生成的二进制文件就是CPU执行的指令。

原文学习来自https://blog.csdn.net/fuzhongmin05/article/details/54880257

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

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

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

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

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

  3. 浅谈JVM(六):方法调用过程

    上一篇: 浅谈JVM(一):Class文件解析 浅谈JVM(二):类加载机制 浅谈JVM(三):类加载器和双亲委派 浅谈JVM(四):运行时数据区 浅谈JVM(五):虚拟机栈帧结构 6.方法调用过程 ...

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

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

  5. build 之前执行task_浅谈VS编译自定义编译任务—MSBuild Task(csproject)-阿里云开发者社区...

    在上一篇浅谈.NET编译时注入(C#-->IL)中我们简单的反编译查看了几种c#语法糖和PostSharp在编译成IL时为我做的MSIL注入.紧接着在这节,要来看的就是MSBuild Task. ...

  6. 浅谈如何编译COIN-OR的开源代码

    转载自http://hi.baidu.com/kaien_space/blog/item/420918134592880a5aaf53c9.html 浅谈如何编译COIN-OR的开源代码 2009-0 ...

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

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

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

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

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

    浅谈前端路由原理hash和history

最新文章

  1. Python+OpenCV实现AI人脸识别身份认证系统(2)—人脸数据采集、存储
  2. 知乎热议:科研界是如何保护自己的成果免于剽窃的?
  3. mysql查看和启用二进制日志
  4. QT学习 之 计算器的实现
  5. play!framework框架概述
  6. 获取拍照图片,显示大图像
  7. [cpyhon源代码]dict对象原理学习
  8. “自启动”树莓派上的 .NET Core 3.0 环境
  9. ASP.NET Core 静态文件及JS包管理器(npm, Bower)的使用
  10. 【C++ grammar】抽象、封装与this指针
  11. numpy的基本使用 附python代码详细讲解(numpy函数,创建数组,常用属性,索引切片,数组的复制,修改维度,数组的分割、拼接、转置)
  12. 力扣买卖股票系列总结
  13. 在JAVA中把JSON数据格式化输出到控制台
  14. 华为机试HJ28:素数伴侣
  15. SpringBoot使用@Asyn注解注意事项
  16. Java基本数据类型自动转换
  17. 如何正确安装驱动程序
  18. 改变指标改变图(FusionChart)
  19. [iOS,mac]Coding.Net(码市)进行代码管理
  20. 脸上不同位置长痘痘的原因

热门文章

  1. html5画动漫人物,画动漫人物女生可爱
  2. EDXposed| 小米8
  3. Atititjs h5调用摄像头视频聊天 拍照功能 相机功能 录像attilax总结
  4. Linux之cp复制文件或文件夹到文件夹
  5. NodeJS 中的mongoDB设置指定字段的隐藏,查询的时候强制显示指定隐藏的字段
  6. 微信小程序利用百度AI实现扫描身份证获取信息功能
  7. 无人机入门(一)位置与电机速度控制
  8. RT-Thread 模拟器 simulator LVGL控件:switch 开关按钮控件
  9. 1、non-finite loss, ending training tensor(nan, device=‘cuda:0‘,2、‘LogSoftmaxBackward3、Function ‘MulB
  10. 华为手机的定价,恐怕连苹果都叹一声服