当前位置:网站首页>【问道】编译原理
【问道】编译原理
2022-07-07 09:21:00 【华为云】
前言:
作者简介: ,专注于研究计算机底层,就职于金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的设计和架构
Java领域新星创作者、阿里云专家博主、华为云享专家
如果此文还不错的话,还请关注、点赞、收藏三连支持一下博主哦
本文导读:上篇 推理得出,编译原理就是将高级语言翻译成汇编语言或机器语言的过程,本章我们详细介绍编译设计原理和过程,并佐以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编译器证明。
边栏推荐
猜你喜欢
学习笔记|数据小白使用DataEase制作数据大屏
JS add spaces to the string
Array object sorting
Opencv installation and environment configuration - vs2017
对比学习之 Unsupervised Learning of Visual Features by Contrasting Cluster Assignments
分布式数据库主从配置(MySQL)
MPX plug-in
Socket socket programming
How to use cherry pick?
Transaction rolled back because it has been marked as rollback only
随机推荐
测试优惠券要怎么写测试用例?
数据库同步工具 DBSync 新增对MongoDB、ES的支持
软件设计之——“高内聚低耦合”
Introduction to shell programming
Web端自动化测试失败的原因
When initializing 'float', what is the difference between converting to 'float' and adding 'f' as a suffix?
The fifth training assignment
從色情直播到直播電商
滚动踩坑--UNI_APP(八)
How to get hardware information in unity
关于SIoU《SIoU Loss: More Powerful Learning for Bounding Box Regression Zhora Gevorgyan 》的一些看法及代码实现
Avoid mutating a prop directly since the value will be overwritten whenever the parent component
audit 移植
互联网协议
使用引用
通过 Play Integrity API 的 nonce 字段提高应用安全性
PR Lecture Notes
JS add spaces to the string
0.96 inch IIC LCD driver based on stc8g1k08
[untitled]