日志
个人认为学习编译原理应该树立的心理观点和步骤
2018-07-10 14:38
编译器是什么?
编译器是一种语言处理器,一种语言写的源程序输进去,另外一种语言的文件输出来。 画一个简单的示意图,它是这样的:::源语言(程序)---|||编译器|||---目标语言(程序) 因为汇编指令是机器语言的易记版本,有很多现成的汇编器。 所以,编译器选择的目标语言可以是汇编语言。 现在,它的简单示意图是这样的:::源语言(程序)---|||编译器|||---汇编语言(程序)---机器语言 从上面的简单示意图可以看出,目前我们已经不关心汇编到机器语言的转换了。只专注于源语言到汇编语言的转换。 假设我们的机器使用的是INTEL CPU。那么,上面的汇编语言就是INTEL 汇编语言。 选择广泛使用的CPU可以让自己有很多实验的机会。 很多同学觉得汇编很麻烦,是一只拦路虎。 但其实,我们不需要太过了解汇编语言,因为我们只是学编译原理而已, 又不是要像中国第一程序员求伯君那样用汇编写一个WORD出来。 (成功为自己不深入了解汇编语言找到一个借口。) 下面就是我个人觉得学习编译原理需要树立的心理观点和步骤: ===》我个人认为,要学习编译原理,一开始不是要拿一本编译原理的书去啃; ===》即使是拿一本书去啃,也不是要从头啃到尾。这样太头疼,也很容易失去方向和信心。 ===》学习编译原理的前置条件,是充分了解到编译器的作用是将某种源语言写的程序转换为另外一种语言写的程序 这里的目标语言是汇编语言。 ===》学习编译原理最重要的,则是先让自己成为一个超级简单的“人体编译器”。 ===》“人体编译器”什么意思了?而且是超级简单的。 ===》意思就是说,给你一些最常见的程序片段(例如C程序片段),你可以用手工做转换, ===》将它转换为对应的汇编语言。 ===》如果你能将所有C语言的语言要素手工转换为对应的汇编语言, 那么你就已经成为一个超级简单的“人体编译器”。 ===》接下来,我们就可以将自己这个“人体编译器”模仿着实现! ===》你在模仿实现“人体编译器”的时候,你会发现你自己即使没看过编译原理,也可以实现一个简单的编译器。 ===》实际上,第一个编译器被写出来的时候,它的作者们也没看过编译原理。 ===》这是最自然的做法。但这不是走前辈的老路。因为我们只需要在此实现一个超级简单的编译器。 而且在实现之前已经有了编译器的概念。 ===》在我们尝试模仿实现“人体编译器”时,我们遇到困难,可以去翻看编译原理里类似的概念和例子。 ===》这样,我们就不是为了学习编译原理而学习; 而是为了解决问题而寻找答案,它的答案我们知道就在编译原理那本书。 ===》很显然,这是两种不同的学习方向和学习方法。对于大部分人来说,后者,即带着问题去学习更容易接受和理解。 (两种对比,后者是考试带小抄的感觉,确实比死记硬背再去考试的感觉就是爽,嘿嘿!) 上面步骤中有一个关键的步骤,将C程序片段转换为汇编语言片段; 如果完全没有基础的话,该怎样执行这一步骤呢? 方法也很简单。 1、以WINDOWS系统为例,安装一个完整版的Qt,自带GCC,QtCreator等等等等…… (批注,我很早之前安装的是Qt 5.7,QT版本随意选择) PS,也可以不使用GCC,使用微软的cl也可以,根据自己的喜好随意吧。 2、随意新建一些C程序片段(建议使用C语言之父写的《C程序设计语言》为蓝本)。 3、从开始找到Qt 5.7 for Desktop(MinGW 5.3.0 32bit)——这是我安装的,要根据你安装的选择 4、CD到你存放C程序片段的目录下 5、打开《深入理解计算机系统第114页》原书第三版。 在这一页最后几行有一个命令讲解“gcc -Og -S xxx.c” 这个命令会使用GCC产生C程序片段的汇编文件xxx.s。 6、打开xxx.s,学习之。(最好找一本intel汇编来对照学习,你会发现编译器产生的汇编程序跟书本上 或老师讲的汇编课程的细微差别。) 为什么叫大家学习编译器产生的汇编程序了?因为编译器的作者一般而言比写书的作者或者上课的老师高明一些。 (我又看到大学的汇编课程老师拿板砖来追我来,我先遁为敬!) |
下一篇: 无
上一篇: 有没有人一起重新啃一次编译原理?