编译原理之初见续集

编译原理之初见续集

编译器的结构

编译原理之初见续集

  • 编译程序主要分为前端和后端

  • 前端:只依赖于源程序,独立于目标机器,生成中间代码

  • 后端:依赖于目标机器,与源程序无关,只与中间语言有关,从中间代码生成目标代码

  • 可能有些人忘了目标代码是什么?
    目标代码主要是机器语言或者是汇编语言
    编译原理之初见续集

  • 晦涩的语言可能让大家理解起来比较困难,不说了上图

  • 百因必有果,人们设计成这样必然有他们的道理
    好处:提高了开发编译器的效率,这就好比搭积木一样,可以搭不同的东西。

  • 取一个编译器的前端,重写它的后端就可以产生同一源语言在另一机器上的编译器(前端:C语言、Java语言)

  • 不同的前端使用同一个后端,从而得到一个机器上的几个编译器(注意:这里必须是采用同一种中间语言)(后端:Mac后端、Windows后端等)

  • 对源程序或源程序中间表示的一次扫描,每一遍读入一个文件,执行一个或几个阶段的编译操作,并输出源程序的一个中间表示
  • 每一遍的输入是上一遍的输出,第一遍的输入是源程序正文,最后一遍的输出是目标代码
  • 遍数多:编译器结构清晰,但时间效率不高
  • 遍数少:编译速度快,但对机器的内存要求高
    编译原理之初见续集

灵魂发问:世界上第一个编译程序是用什么语言来书写的

答案显而易见,当然是用机器语言开发的

自展技术

  • 直接用目标机器上的机器语言书写源语言的编译程序工作量太大
  • 用目标机器上的机器语言书写源语言的一个子集的编译程序,然后再用这个子集作为书写语言,实现源语言的编译程序,这就是自展技术。

编译器的构造工具

  • 词法分析器自动生成程序 — LEX
  • 语法分析器自动生成程序 — YACC

语言处理系统

编译原理之初见续集

预处理器

  • 删除注释
  • 宏展开
  • 处理包含文件
  • 语言扩充

汇编器

  • 处理汇编语言代码,产生可重定位的机器代码

装配器、连接器

  • 将多个可重定位机器代码文件连接装配成一个可执行机器代码文件。