本科独立用C语言完成没有优化的C语言编译器属于什么水平?

Python019

本科独立用C语言完成没有优化的C语言编译器属于什么水平?,第1张

我觉得水平还是很高的,但意义恐怕不大。编译器技术是非常成熟的领域,而且由于应用场景的限

制实时,复杂的算法已经自动出局了,你可选的东西是有限的。编译器可能有很多实现的形

式,虚拟机/解释器/静态编译器 等,也有成熟的开源实现。作为本科生,而非专门研究该分支的学生,应该合理分配自己学习的时间,如果做这个编译器就干

掉了大半年,那计网和OS这些课程该咋办? 

我知道很多人会认为没有做编译器优化特指中段优化,不考虑机器码上的优化比较划水。但编

译器优化是一个很复杂的东西:首先它和你用的IR表示有关而且是强烈耦合,SSA IR基本还

好,有开源代码和文献记载,你想要的都能在网上挖到但这怎么体现你的水平是吧。你

要考虑编译器的性能,尽管编译器的后端优化基本上可以纳入到某种PEabstract interpretation的

范畴中。

一、但是直球实现这些算法都在指数级,所以只能折中成某种图论算法 ,理解这些奇怪的算

法变体就要花时间了。最后,所有命令式语言必须考虑pointer alias 的问题,这个课题本身都足够

开一门形式验证的课。在C编译器里做这个更加复杂,因为你有pointer cast与arithmetic,没法直

接用TBAA得到好的结果,然后光是整个这玩意就够呛的。 

做一个功能完整的C编译器是相当困难的:首先最重要的原因,做这个耗时,且完全没有资

金回馈,会导致动力不足。要考虑到学生的时间也是金钱,不是可以随便浪费的。很多功能

本来就是有问题而做不出来/做不对的,比如restrict语义以及和某些弱内存模型/多线程的优化,以

至于近些年不得不让PL学者在上面打了无数补丁来修正这些有问题的东西。 

二、这就是为什么实现Lisp编译器是对于学习者来说更简单的选择,Lisp不需要有这些乱七八糟的、理

论上不清晰的构造其实还是有的,就是如果你要做Lisp静态编译,那有够你受的,不过这个全天

下也没几个人做的出来的,所以也不用妄自菲薄;可变性少,因此pointer的问题不用太在意;基

于AST或某种ANF形式的优化更加直观等等。

放在中国大学来说,是中等偏上水平,放在国际一流计算机名校哪里,是基本水平。并不是危言耸

听,自己去看下那些名校编译课的课后大作业。

中国的大学编译原理 课程更多的是古老过时的原理概念,真正的编译器课程是从头写实践一个编

译器。

中国的大学编译原理基本篇幅都在讲分词和ast,真正的编译器课程教你怎么设计IR ssa cfg 优化。 

三、C语言编译器其实算是有丁点难,主要是因为细节太多,如果要真正实现一个能完整编译开源项目

比如编译libc 的c语言编译器,很少人能做到,大部分大学生写的c语言编译器只能编译基础的c代

码 ,比如我,要完成一个完整的支持全部c语言能编译libc的c编译器需要做很多工作,我并没有持

续下去而是更专注后端。简历里可以写一笔,但意义不大,因为这只是从无到有的过程,从有到

精的过程是个无底洞,不考虑时间精力你都基本是吃不下的,到头来只是造了个玩具。

每个程序员

都有造轮子的理想,但是我觉得操作系统编译器这种太底层的对普通人来说意义不大。个人建议可

以去造框架这一层,因为这是实实在在有利于你以后的业务开发,只要你肯投入时间精力你完全可

以吃得下且通过你的不懈努力完全有可能造出成熟的生产级的被广泛使用的框架。那时候你获得的

成就感将远大于你造个玩具编译器或操作系统,甚至还会给你带来可观的收入。至于造哪方面的轮

子,推荐和你以后想要从事的领域一致,前端就前端框架,后端就后端框架,或者细化到相关的库

走精品化路线。

四、你已经在编译器这块卷死了99.9%的同行,但是到这里这仍

然是只是一个能用但不是好用的编译器,你看github上的tiny compiler很多,你用么?你敢用么?不,

你不敢,且不说小作坊编译器存不存在各种各样奇奇怪怪的bug,你把代码写好了怎么调试都是个大问

题,所以为什么叫toolchain toolchain,脱离编辑器,调试器和分析工具的单打独斗的compiler就是玩

具,而一个好用的编辑器和调试器。

这两个哪个是省油的灯,你试试写个editor试试,我们就算不扯永恒

屎山编码问题,光一个富文本编辑的渲染问题都够你醉生梦死了,调试器更是和编译器实现高度相关,

如果你编译器一开始就没有考虑好如何做好符号表映射一类的调试问题,那等重构吧,有的你酸爽了。不要问我怎么知道的.如果你想从头建立整个toolchain,你首先要考虑的不是技术问题,而是你有多少

钱和多长命的问题,整个时候。

要不然你可以通过编写插件的方式白嫖例如visual studio code这类软

件的强大编辑功能,如果你写的不是c compiler,你也可以尽量把语法设计得很像c,这样你又能进一步

白嫖其强大的intellisense code,当然仍然有不少人或者应该说团队达到了这一步,到这里,应该卷死

了99.99%的同行应该毫无问题。

其实选哪家的开发板好好学都能把ST公司的STM32学好。

就开发板STM32来说,我个人推荐正点原子:

1、STM32开发板两家的开发资料其实差不多,只不过正点的外围模块多,而且外表美观;

2、开发板重在于实验和反复练习,硬件资源其实差不多,视频也差不多,开始讲库函数和API调用,后面讲了ucos的实现。

3、个人喜好与观点,仅供参考

希望可以帮到你,如果满意,请采纳!

C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。

C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码。它既具有高级语言的特点,又具有汇编语言的特点。

C语言继续发展,在1982年,很多有识之士和美国国家标准协会为了使这个语言健康地发展下去,决定成立C标准委员会,建立C语言的标准。委员会由硬件厂商,编译器及其他软件工具生产商,软件设计师,顾问,学术界人士,C语言作者和应用程序员组成。

1989年,ANSI发布了第一个完整的C语言标准——ANSI X3.159—1989,简称“C89”,不过人们也习惯称其为“ANSI C”。