前言:
📫 作者简介:小明java问道之路,专注于研究计算机底层,就职于金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的设计和架构📫
🏆 Java领域新星创作者、阿里云专家博主、华为云享专家🏆
🔥 如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主哦
本文导读:上篇 计算机er要掌握的计算机思维 推理得出,编译原理就是将高级语言翻译成汇编语言或机器语言的过程,本章我们详细介绍编译设计原理和过程,并佐以Graal编译器证明
一、编译过程是什么样子的?
首先,我们看下人工翻译英语转汉语是怎么做到的,我们需要找到这句话中的,词的意思,在分析这句话的语法,最后通过语义将这句话翻译成中文,我们计算机的编译过程和这个过程类似
我们想诸如Java、PyThon、Go、C++语言等是不能直接操作ISA指令集(前文中有介绍)的,我们还需要一个能把高级语言 编译 成统一的汇编语言(需要一个工具就是,编译器),再去调用汇编代码的过程。
当我Java、Python、C++等等语言,编译器会通过 分析词法,例如if else等等,根据得到的词和词性去构件AST(AST:抽象语法树(abstract syntax code,AST)是源代码的抽象语法结构的树状表示),得到的树是一个每个节点都表示源代码中的一种树形结构,通过语义将其转化为IR语言(这里面例如java转化为 .class字节码),最后根据编译器的优化策略进行分析优化(例如JVM中指令重排等等)得到目标语言
二、编译基本原理
熟悉编译的过程后我们还需要更多的知识点支撑,通过几个细节的问题了解更多,定义的语法有什么?既然我们要构件AST,我们就要定义每个编译的语法和单词的位置,所以这里面会定义编码信息、编码单词、规定单词出现的地方;定义(识别)单词有什么?标识信息的最小单位
针对我们需要做的事情(将高级语言编译成汇编语言或机器语言)这个过程,我们可以理解为将大象放进冰箱需要三步,打开冰箱,塞进大象,关上冰箱 。
编译也可以分为三步 前端-》中间语言-》后端,前端就是由不同需要接入当前编译器的前端开发者进行开发,来适配多门语言,过程为 高级语言源代码-》词法分析-》语法分析-》构件AST的过程-》到中间语言,中间语言解耦,后端由不同需要接入当前编译器的后端开发进行开发,来适配多门目标机器语言(ISA),拿到中间语言-》做分析优化,最终生成目标语言。
三、深入浅出 Graal编译器
了解了编译的原理和过程,我们要知道是谁帮我们做了这么多工作,这个工具就是编译器,这里用作者Java语言(同时也可以编译scala、python等语言)的编译器 Graal就上述原理做介绍
Graal编译器支持基于跨平台的Hot spotJVM上层中间语言IR语言——字节码,将各类语言(Java、Python、R、JS、C/C++、Scala)都可以在JVM上执行,可以享有JVM的高性能。GC、化平台等特性,下图是GraalVM编译器的架构图
1、Truffle Framework:Java's AST Interpreter Framework(Java的AST解释器框架,这个东西就是将各种其他语言转换为中间语言的工具)
2、Graal Compiler :JIT compiler written in Java(用Java编写的JIT编译器,是一个JIT即时编译器,它实现了3)
3、JVM CI (JVM Compiler Interface) Interface for Writing JIT Compiler in Java(JVM编译器接口,是一个接口规范,定义了JIT即时编译器的规范)
4、Java Hotspot VM(这个也就是我们俗称的JVM)
5、JIT(即时编译器),这个自己实现了编译原理的前端和后端,只不过在内存中动态对语言进行编译
Graal是和JDK一起发行的,作为一个内部的模块jdk.internal.vm.compiler中。Graal和JVM是通过JVM CI(JVM Compiler Interface)来进行通信的。其中JVM CI也是一个内部的模块在jdk.internal.vm.ci中。这里简单介绍编译器证明编译过程,以及编译器应该如何设计,后续笔者详细讲解编译器原理。
本文小结:本章我们首先通过翻译英语应该怎么做,推理出,计算机的编译原理,并详细介绍编译设计原理和过程,佐以Graal编译器证明。