【问道】编译原理

简介: ​上篇 计算机er要掌握的计算机思维 推理得出,编译原理就是将高级语言翻译成汇编语言或机器语言的过程,本章我们详细介绍编译设计原理和过程,并佐以Graal编译器证明

image.png

前言:

📫 作者简介:小明java问道之路,专注于研究计算机底层,就职于金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的设计和架构📫

🏆 Java领域新星创作者、阿里云专家博主、华为云享专家🏆

🔥 如果此文还不错的话,还请👍关注点赞收藏三连支持👍一下博主哦

本文导读:上篇 计算机er要掌握的计算机思维 推理得出,编译原理就是将高级语言翻译成汇编语言或机器语言的过程,本章我们详细介绍编译设计原理和过程,并佐以Graal编译器证明

一、编译过程是什么样子的?

首先,我们看下人工翻译英语转汉语是怎么做到的,我们需要找到这句话中的,词的意思,在分析这句话的语法,最后通过语义将这句话翻译成中文,我们计算机的编译过程和这个过程类似

image.png


我们想诸如Java、PyThon、Go、C++语言等是不能直接操作ISA指令集(前文中有介绍)的,我们还需要一个能把高级语言 编译 成统一的汇编语言(需要一个工具就是,编译器),再去调用汇编代码的过程。

当我Java、Python、C++等等语言,编译器会通过 分析词法,例如if else等等,根据得到的词和词性去构件AST(AST:抽象语法树(abstract syntax code,AST)是源代码的抽象语法结构的树状表示),得到的树是一个每个节点都表示源代码中的一种树形结构,通过语义将其转化为IR语言(这里面例如java转化为 .class字节码),最后根据编译器的优化策略进行分析优化(例如JVM中指令重排等等)得到目标语言

image.png

二、编译基本原理

熟悉编译的过程后我们还需要更多的知识点支撑,通过几个细节的问题了解更多,定义的语法有什么?既然我们要构件AST,我们就要定义每个编译的语法和单词的位置,所以这里面会定义编码信息、编码单词、规定单词出现的地方;定义(识别)单词有什么?标识信息的最小单位

针对我们需要做的事情(将高级语言编译成汇编语言或机器语言)这个过程,我们可以理解为将大象放进冰箱需要三步,打开冰箱,塞进大象,关上冰箱 。

编译也可以分为三步 前端-》中间语言-》后端,前端就是由不同需要接入当前编译器的前端开发者进行开发,来适配多门语言,过程为 高级语言源代码-》词法分析-》语法分析-》构件AST的过程-》到中间语言,中间语言解耦,后端由不同需要接入当前编译器的后端开发进行开发,来适配多门目标机器语言(ISA),拿到中间语言-》做分析优化,最终生成目标语言。

image.png

三、深入浅出 Graal编译器

了解了编译的原理和过程,我们要知道是谁帮我们做了这么多工作,这个工具就是编译器,这里用作者Java语言(同时也可以编译scala、python等语言)的编译器 Graal就上述原理做介绍

Graal编译器支持基于跨平台的Hot spotJVM上层中间语言IR语言——字节码,将各类语言(Java、Python、R、JS、C/C++、Scala)都可以在JVM上执行,可以享有JVM的高性能。GC、化平台等特性,下图是GraalVM编译器的架构图

image.png


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编译器证明。

相关文章
|
2月前
|
算法 安全 编译器
编译原理 - 中间表示
编译原理 - 中间表示
25 0
|
8月前
|
自然语言处理
【编译原理】第二章,词法分析
【编译原理】第二章,词法分析
|
4月前
|
自然语言处理
【编译原理】词法分析
【编译原理】词法分析
29 0
|
8月前
|
自然语言处理 Java 编译器
【编译原理】第一章,什么是编译原理?
【编译原理】第一章,什么是编译原理?
|
8月前
|
自然语言处理 IDE 开发工具
【编译原理】第三章语法分析
【编译原理】第三章语法分析
|
11月前
|
Java 程序员 C#
【C语言学习-复习_第一课】什么是C语言?什么是计算机语言?
人与人之间交流需要使用语言,中国人和中国人之间使用汉语,其他国家之间的交流也需要使用其他国家的语言,计算机也要进行交流,他们使用哪种语言了?当然有人说使用汉语,呼叫某某某小助手可以帮助我们进行和计算机交流,但是某某某小助手是通过怎样实现的,也是程序员使用中文和计算机对话设计出来的吗?当但不是了。这样的话我们人人都是程序员,人人都是大佬!
49 0
|
自然语言处理 前端开发 JavaScript
重学前端 28 # 通过四则运算的解释器快速理解编译原理
重学前端 28 # 通过四则运算的解释器快速理解编译原理
68 0
|
前端开发 Java 编译器
|
SQL 自然语言处理 JavaScript