今天开了一个专题。谈谈我们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虚拟机|系列1|架构简介的更多相关文章

  1. 浅谈java虚拟机|系列2|JVM运行时

    今天我们继续谈谈JVM架构. 今天主要讲讲JVM运行时, 先来一个图: 上篇文章,我们知道,JVM运行时,简单来说就是把class文件翻译成操作系统相关的机器码(或汇编语言),然后通过调用操作系统函数 ...

  2. 【Java虚拟机】浅谈Java虚拟机

    跨平台 Java的一大特性是跨平台,而Java是如何做到跨平台的呢? 主要依赖Java虚拟机,具体来说,是Java虚拟机在各平台上的实现. Java虚拟机在不同的平台有不同的实现.同一份字节码,通过运 ...

  3. 浅谈Java虚拟机内存中的对象创建,内存布局,访问定位

    参考于 深入理解Java虚拟机 这里介绍HotSpot虚拟机(自带的虚拟机) 1.对象的创建 对于程序员来说,创建对象的方法: User user1 = new User(); User user2 ...

  4. Java虚拟机系列一:一文搞懂 JVM 架构和运行时数据区

    前言 之前写博客一直比较随性,主题也很随意,就是想到什么写什么,对什么感兴趣就写什么.虽然写起来无拘无束,自在随意,但也带来了一些问题,每次写完一篇后就要去纠结下一篇到底写什么,看来选择太多也不是好事 ...

  5. 浅谈java类集框架和数据结构(2)

    继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...

  6. 浅谈Java线程安全

    浅谈Java线程安全 - - 2019-04-25    17:37:28 线程安全 Java中的线程安全 按照线程安全的安全程序由强至弱来排序,我们可以将Java语言中各种操作共享的数据分为以下五类 ...

  7. !! 浅谈Java学习方法和后期面试技巧

    浅谈Java学习方法和后期面试技巧 昨天查看3303回复33 部落用户大酋长 下面简单列举一下大家学习java的一个系统知识点的一些介绍 一.java基础部分:java基础的时候,有些知识点是非常重要 ...

  8. 浅谈Kotlin(一):简介及Android Studio中配置

    浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 前言: 今日新闻:谷 ...

  9. 浅谈Java中的栈和堆

    人们常说堆栈堆栈,堆和栈是内存中两处不一样的地方,什么样的数据存在栈,又是什么样的数据存在堆中? 这里浅谈Java中的栈和堆 首先,将结论写在前面,后面再用例子加以验证. Java的栈中存储以下类型数 ...

随机推荐

  1. mybatis 动态SQL .1

    MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦.例如拼接时要确保不能忘记添加必要的空格,还要注意去掉 ...

  2. oracle导入导出常见问题及解决方案

    一.导出 1.导出命令     exp 用户名/密码@实例名 file=路径 2.出现问题:空表不能导出, 解决方案:   --查找空表 SELECT TABLE_NAME FROM USER_TAB ...

  3. beego项目部署到nginx(含http转https)

    beego项目部署到nginx(含http转https)    之前的程序部署到服务器采用的直接部署,比较方便,现在把它部署到nginx,以便后续的反向代理和负载均衡,同时,因为要接入微信小程序,所以 ...

  4. python基础之字符串常用方法

    str常用命令:字符操作:.capitalize() .upper() .lower() .title() .swapcase()判断:.startwith() .endwith() .isalnum ...

  5. 从“int中提取高八位”开始的学习

    今天有个学弟问了一个问题,怎么提取int中的高八位. 这个是个非常基础的问题,随便用位运算瞎搞几下就出来了. 看到这个问题的时候,也不知道我当初想了些啥,想了个骚操作,用memcpy把int放到字符串 ...

  6. Windows 下 C/C++ 多线程编程入门参考范例

    #include <windows.h> #include <iostream> using namespace std; DWORD WINAPI myThread(LPVO ...

  7. c++ tcp 服务器和客户端例子

    目标:  完成一个精简TCP服务器,可接收来自多个用户的请求,并返回结果. 思路:  (1)服务器      C++ TCP服务器的实现主要由以下几个函数来完成:        a)socket    ...

  8. 第五周课程总结&实验报告(三)

    实验三 String类的应用 实验目的: (1)掌握类String类的使用: (2)学会使用JDK帮助文档: 实验内容: 1.已知字符串:"this is a test of java&qu ...

  9. adb 打印kernel输出的log

     一. linux 内核printk机制     1.1. Android内核是基于Linxu kernel的,因此其log机制也是通用的,在Android内核中使用printk函数进行Log输出.与 ...

  10. python 写简单的职员信息管理系统

    职员信息管理系统要求依次从键盘录入每位员工的信息,包括姓名.员工id.身份证号要求:1.身份证号十八位,要求除了第18位可以为x,其余都只能为数字2.id须由5位数字组成3.否则提示用户重新输入不符合 ...