说说Javac
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++这样的高级语言直接就是源码->编译器->机器码。
联系到现实生活中,比如翻译官,特别是外交访问时,一般身边都会有翻译官。翻译官联系到本文就相当于编译器”。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
微信小程序开发系列七:微信小程序的页面跳转
微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 微信小程序开发系列四:微信小程序之控制器的初始化逻辑 微信小程序开发系列五:微信小程序中如何响应用户输入事件 微信小程序开发系列六:微信框架API的调用 这个系列教程的前六篇文章我们都在单个的视图上操作。现在让我们创建第二个视图,然后实现从第一个视图到第二个视图的跳转。 首先开发第二个视图: <view class="container log-list"> <block wx:for="{{logs}}" wx:for-item="log"> <text class="log-item">{{index + 1}}. {{log}}</text> </block> </view> 做过Angular开发的朋友们对上面的视图设计一定不会陌生。这个视图的数据源由模型logs提供,是一个列表结果,列表每个元素的数据源是模型logs里的一条记录,用log代...
-
下一篇
给女友讲讲设计模式——单例模式(JAVA实例)2
前言 曾经有两个人,一个是A,一个是B,他们俩都是这个世界上独立的个体,每个人都是这个世界上独一无二的。这个A呢,在一出生的时候,别人就会把他需要的食物全部给他,然后等到他饿了的时候,就可以直接拿过来吃,但是在他不饿的时候,天天被在身上确是一种负担,人们都管他叫做饿汉。B呢,则是在出生的时候,并没有任何食物给他,但是在他饿的时候,他连伸手都不用,只需要张嘴喊一嗓子,便有人给他送来了食物,就因为他这么懒,所以被叫做懒汉。为什么要讲这个故事呢,接下来你就会明白了。 单例模式 在web开发中,我们经常碰到这样一种情况,我们在整个项目的上下文中,有且只有一个实例,所有线程操纵的都是它,例如说Mybatis中的SqlSessionFactory。如果说只存在一个实例,那么他绝对是不可以new出来,所以他的构造方法一定是私有的。 单例模式从方式上分为懒汉模式,和饿汉模式,这就像是咱们刚刚提到故事里的B和A一样,具体代码如下: package singleton; /** * 这是懒汉模式,但是对于多线程的情况下是不安全的 * * @author luckyharry * */ public cla...
相关文章
文章评论
共有0条评论来说两句吧...