今天开了一个专题。谈谈我们java程序员每天面对的java虚拟机(jvm)。
本质上来说,jvm分两部分:编译器(compiler)和运行时(runtime)。
所谓的编译器,简单来说,他就是个翻译机,就像人类世界中的英语翻译,打个比方,英语翻译,他主要的工作是把中文翻译成英文。
而编译器,它主要的工作是把程序员写的java代码(就像:中文)翻译成class文件(就像:英文)。就像是一个程序员与虚拟机的翻译者。
而运行时,它主要就是一个执行机器,简单来说,它就是加载class文件,并把它翻译成更底的汇编语言和机器码,并根据程序逻辑调用底层操作系统的函数,来完成程序运行。
那编译器的原理,又是怎么样的呢?
简单来说,它包含两部分:词法分析器和语言分析器。
什么是词法分析器?
词法分析(lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。
简单来说,它就是要把java程序代码,转换成token序列。也就是说,它是语法分析器的翻译者。
什么是语法分析器?
在计算机科学和语言学中,语法分析(英:Syntacticanalysis,也叫Parsing)是根据某种给定的形式文法对由单词序列(如英语单词序列)构成的输入文本进行分析并确定其语法结构的一种过程。
语法分析器(Parser)通常是作为编译器或解释器的组件出现的,它的作用是进行语法检查、并构建由输入的单词组成的数据结构(一般是语法分析树、抽象语法树等层次化的数据结构)。语法分析器通常使用一个独立的词法分析器从输入字符流中分离出一个个的“单词”,并将单词流作为其输入。实际开发中,语法分析器可以手工编写,也可以使用工具(半)自动生成。
简单来说,它就是接受词法分析器的token序列,并转成AST(抽象语法树),并对AST进行操作,从而最终产生虚拟机运行时(runtime)的执行码,也就class文件。
一句说来说,词法分析器是语法分析器的翻译者,而词法分析器和语法分析器组成的编译器,是运行时(runtime)的翻译者。
我们用一幅图来说明程序员与编译器,运行时的关系:
上图,已经很好说明各方的关系,程序员写java代码,编译器把java代码编译成class文件,运行时加载并执行class文件,并通过调用操作系统函数来完成相关任务。
以上,就是java虚拟机的简单架构介绍。
下篇继续谈谈架构的细节部分。
本人精通java高并发,DDD,微服务等技术实践,以及python,golang技术栈。 本人姓名郭莹城,坐标深圳,前IBM架构师、咨询师、敏捷开发技术教练,前IBM区块链研究小组成员、十四年架构设计工作经验,《区块链核心技术与应用》作者之一, 现有成熟团队提供区块链开发相关业务(公链,交易所,钱包,Dapp,智能合约)。 工作微信&QQ:360369487,交易所开发与区块链钱包开发业务,加我注明:博客园+开发,想学习golang和rust的同学,也可以加我微信,备注:博客园+golang或博客园+rust,谢谢!
有疑问加站长微信联系(非本文作者)