「700行手写编译器」Part 1:项目背景与设计思路 笔记

因为视频的作者说原本是想让编译器实现比基础的C编译器更多的内容,但是实际上实现的比C编译要缩减,B站视频的作者说实际上应该是C minus,看到评论区里有人说C - -,蛮好玩的,遂给专栏起名C - -编译器。
好吧,C - -编译器的专栏名审核通过不了!那就叫C minus编译器。

在这里插入图片描述
在这里插入图片描述
自举编译器:编译器自举指用本编译器被编译的语言来编写本编译器。

编译器自举一般都是编译器开发的一个里程碑事件。
编译器自举意味着被编译的语言荣升成自编译语言,而且编译器拥有自举能力对实现语言的语法语义本身没有限制。
目前的JAVA是已经实现自举的语言。

在这里插入图片描述
编译器的定义:编译器是用程序吧高级语言转化为低级语言,创建可执行程序的工具。

在这里插入图片描述
工业级编译器分为前端和后端。
1.前端(parser):源代码->中间代码
前端分为两个部分:
①词法分析(tokenize):产出是一大堆token
②语法分析(parse):一般产出的是中间代码(AST,Abstract Syntax Tree,抽象语法树)或者(LVM,Low Level Virtual Machine)

面向过程的C、JAVA变成AST需要经历tokenize、parse的两个过程,得到了抽象语法树之后就会进入编译的最核心的环节-----后端。

2.后端:
①优化器(optimizer):中间代码->中间代码,输入一个中间代码,然后经历一系列的优化过程(剔除重复或者没必要的操作)然后又得到了另一种或者同一种性能更高的中间代码。
②Code Gen(Code Generator,代码生成器):中间代码->目标代码,把中间代码生成平台可执行的代码。
比如平台是x86,Code Gen就把中间代码生成汇编语言的代码,MOV…PUSH…ADD…;如果目标平台是Java虚拟机就会翻译成JVM的语言,Load…Store…ADD…;Code Gen是根据最终的平台选定中间代码生成目标代码的种类的。

著名的一个编译器的项目LLVM(IR)能实现把中间代码转换成能在不同平台上(x86,JVM,ARM…)执行的目标代码。
所以想实现可用的编译器的话,一种方式是写一个parser,把我们自己写的编译器的目标语言翻译成LLVM(IR),然后直接使用LLVM(IR)生成对应平台的目标行代码。

在这里插入图片描述
C - -编译器是:
1.前后端合一,没有中间优化
2.目标代码是基于自定义的VM(虚拟机),这样的话实现会更简单。
3.编译过程是one-pass parse的编译过程,就是读到源码之后,一行一行的做编译和分析,当我们把所有的代码都pass完了之后,我们的目标代码就已经生成好了,就不需要再单独去读源码了,源码只读一遍。

one-pass parse:源代码->parse & Code Gen ->VM code

one-pass parse的一些问题,定义变量只能定义在函数一开始的部分:

//对one-pass parse的正确的变量定义方式
void cal1(){
	int x;
	int y;
	x = 1;
	y = 1;
}

//对one-pass parse的错误的变量定义方式
void cal2(){
	int x;
	x = 1;
	int y = 1; // 错! y定义不能出现在函数后边的位置
	           // 变量必须定义在函数一开头的位置
}

在这里插入图片描述
计算是基于:寄存器和stack两个实现的
寄存器:pc,sp(stack point,维护栈顶指针),bp(base point,维护上一个栈的栈顶),ax(通用寄存器)
这里我们为了简化,通用寄存器只有一个,所以做计算的时候是栈顶元素和该ax寄存器作为ALU的输入。
内存空间MEM:code(存放指令),data(静态数据、字面量…的存储),stack(栈的空间)
这里MEM中没有堆,堆通过“作弊”的方式实现,就是下面的Native-Call
指令集:Save & Load,运算类指令,分支跳转,Native-Call(主要用来处理I/O操作和动态内存的操作,正常的平台是不需要的)
Save & Load:Save把寄存器中的数据存入内存,Load把内存中的数据加载进寄存器。
运算类的指令:主要分为三类①arithmetic运算(算数运算)②bit运算(位运算)③逻辑运算
分支跳转:branch,JMP,CMP
Native-Call:I/O(print,open file,write file,read file),动态内存(malloc,free,memset)
在这里插入图片描述

  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃小酥肉的小波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值