【问道】编译原理

简介: ​上篇 计算机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编译器证明。

相关文章
|
移动开发 vr&ar
数据库系统概论——关系代数详解
关系代数是一种抽象的查询语言,是关系数据操纵语言的一种传统表达方式,它是利用对关系的运算来表达查询的。任何运算都是将一定的运算符作用于一定的运算对象上,得到预期的运算结果。关系代数的运算对象是关系,运算结果亦为关系。集合运算符将关系看成元组的集合从关系的“水平”方向即行的角度来进行运算专门的关系运算符不仅涉及行而且涉及列算术比较符辅助专门的关系运算符进行操作逻辑运算符辅助专门的关系运算符进行操作。
1426 1
数据库系统概论——关系代数详解
|
Kubernetes 负载均衡 API
kubernetes技术分享-可用于企业内部培训
kubernetes技术分享-可用于企业内部培训
|
弹性计算 安全 网络协议
VPC的基本原理|学习笔记
快速学习VPC的基本原理
|
2月前
|
监控 安全 测试技术
理解非功能需求---SRS软件需求规格指南系列
本文全面解析非功能需求(NFR),涵盖性能、安全性、可靠性、可用性、可扩展性等关键质量属性。内容包括定义、现实案例及最佳实践,帮助团队在软件开发生命周期中有效识别、记录与管理NFR,确保系统满足利益相关者期望与行业标准。
170 3
|
9月前
|
人工智能 前端开发 编译器
【AI系统】LLVM 架构设计和原理
本文介绍了LLVM的诞生背景及其与GCC的区别,重点阐述了LLVM的架构特点,包括其组件独立性、中间表示(IR)的优势及整体架构。通过Clang+LLVM的实际编译案例,展示了从C代码到可执行文件的全过程,突显了LLVM在编译器领域的创新与优势。
466 3
|
7月前
|
人工智能 Cloud Native 虚拟化
小白学网络系列之---从物理网络到云网络
本文由阿里云技术服务部枫桥撰写,围绕物理网络和云网络的基础知识展开,强调网络在云计算中的重要性。文章首先介绍了OSI模型下的物理层、数据链路层、网络层、传输层和应用层,解释了各层的功能与作用。接着探讨了云网络的必要性及其核心技术,如VPC(虚拟私有网络)、Overlay和Underlay网络,并阐述了它们之间的协作关系。最后,文章分析了AI大模型浪潮下云网络的演进方向,包括高速RDMA网络架构、高性能集合通信库ACCL和高性能数据主动加载加速软件KSpeed等技术的应用,展示了云网络在支持大规模分布式AI训练中的关键作用。通过本文,读者可以深入了解从物理网络到云网络的技术演进及其未来发展趋势。
510 15
7. 成功解决:io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1
今天使用 Netty 搭建一个项目,接收报文时提示如下错误:`io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1`
1910 1
|
Java Linux Maven
Autogen4j: the Java version of Microsoft AutoGen
Java version of Microsoft AutoGen, Enable Next-Gen Large Language Model Applications
|
运维 监控 安全
WAN 革命:SD-WAN 与传统 WAN 对比
【7月更文挑战第13天】
829 1
WAN 革命:SD-WAN 与传统 WAN 对比
|
机器学习/深度学习 自然语言处理 算法
编译器:原理与技术的奥秘
编译器:原理与技术的奥秘