编译器是怎么写出来的,怎么自己写一个编译器

首页 > 实用技巧 > 作者:YD1662023-05-29 22:45:24

仔细看看,其实其中有很多关键字是为了帮助编译器进行优化的,还有一些是用来限定变量、函数的作用域、链接性或者生存周期(函数没有)的,这些在编译器实现的早期根本不必加上,于是可以去掉 auto, restrict, extern, Volatile, const, sizeof, static, inline, register, typedef,这样就形成了C的子集,C3 语言,C3 语言的关键字如下:

编译器是怎么写出来的,怎么自己写一个编译器(5)

再想一想,发现 C3 中其实有很多类型和类型修饰符是没有必要一次性都加上去的,比如三种整型,只要实现 int 就行了,因此进一步去掉这些关键词,它们是:unsigned, float, short, char (char 是 int), signed, _Bool, _Complex, _Imaginary, long,这样就形成了我们的 C2 语言,C2 语言关键字如下:

编译器是怎么写出来的,怎么自己写一个编译器(6)

继续思考,即使是只有 18 个关键字的 C2 语言,依然有很多高级的地方,比如基于基本数据类型的复合数据结构,另外我们的关键字表中是没有写运算符的,在C语言中的复合赋值运算符->、运算符的 、– 等过于灵活的表达方式此时也可以完全删除掉,因此可以去掉的关键字有:enum, struct, union,这样我们可以得到 C1 语言的关键字:

编译器是怎么写出来的,怎么自己写一个编译器(7)

接近完美了,不过最后一步手笔自然要大一点。这个时候数组和指针也要去掉了,另外 C1 语言其实仍然有很大的冗杂度,比如控制循环和分支的都有多种表述方法,其实都可简化成一种,具体的来说,循环语句有 while 循环,do…while 循环和 for 循环,只需要保留 while 循环就够了;分支语句又有 if…{}, if…{}…else, if…{}…else if…, switch,这四种形式,它们都可以通过两个以上的 if…{} 来实现,因此只需要保留 if,…{} 就够了。可是再一想,所谓的分支和循环不过是条件跳转语句罢了,函数调用语句也不过是一个压栈和跳转语句罢了,因此只需要 goto(未限制的 goto)。因此大胆去掉所有结构化关键字,连函数也没有,得到的 C0 语言关键字如下:

编译器是怎么写出来的,怎么自己写一个编译器(8)

上一页123下一页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.