• 注册 / 登录
  • 切换到窄版
  • 查看: 96|回复: 0

    编译器设计简介

    [复制链接]

    678

    主题

    692

    帖子

    7785

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    7785
    发表于 3 天前 | 显示全部楼层 |阅读模式

    路线栈欢迎您!

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    一、前言

    编译器是一种软件,它将用高级语言(源语言)编写的程序翻译或转换成低级语言(机器语言或汇编语言)。编译器设计是指开发编译器的过程。

    compilerDesignDiagram.jpg
    编译器设计图

    二、编译器的操作

    以下是编译器执行的一些操作。

    • 将源程序分解成更小的部分。
    • 支持创建符号表和中间表示。
    • 有助于错误检测。
    • 保存所有代码和变量。
    • 分析整个节目并进行翻译。
    • 将源代码转换为机器代码。

    三、编译器和其他语言处理系统

    我们知道计算机是由软件和硬件组成的逻辑集合体。硬件使用一种我们难以理解的语言,因此,我们倾向于使用高级语言编写程序,这种语言更容易理解和记忆。这些程序需要经过一系列转换才能被机器直接使用。语言过程系统正是在此发挥作用。

    compilerP.jpg
    高级语言到机器代码

    • 预处理器:预处理器通过文件包含(即包含文件)移除所有 `#include` 指令,并通过宏展开移除所有 `#define` 指令。它执行文件包含、扩展、宏处理等操作。例如:假设源程序中有 `#include "Stdio.h"`。预处理器会将输出中的该文件替换为其内容。
    • 汇编器: 汇编语言既不是二进制形式,也不是高级语言。它是一种中间状态,由机器指令和一些执行所需的其他有用数据组成。每个平台(硬件+操作系统)都有一个汇编器。它们并非通用,因为每个平台都有自己的汇编器。汇编器的输出称为目标文件。它将汇编语言翻译成机器代码。
    • 编译器:与汇编器相比,编译器是一个智能程序。编译器会检查各种限制、范围、错误等。编译器程序运行时间较长,并且占用大量内存空间。编译器的运行速度比其他系统软件慢。这是因为它需要时间,因为它需要遍历整个程序并进行编译。
    • 解释器:解释器和编译器一样,都能将高级语言转换成低级机器语言。但它们读取输入的方式不同。编译器一次性读取输入、进行处理并执行源代码,而解释器则是逐行执行。编译器会扫描整个程序并将其作为一个整体翻译成机器代码,而解释器则一次翻译一条语句。解释执行的程序通常比编译执行的程序慢。
    • 加载器/链接器:加载器/链接器将可重定位代码转换为绝对定位代码,并尝试运行该程序,结果可能是程序运行成功,也可能是出现错误信息(有时两者兼有)。链接器将多个目标文件加载到一个单独的文件中,使其成为可执行文件。然后,加载器将该文件加载到内存中并执行它。
    • 链接器:链接器的基本工作是将编译器、汇编器、标准库函数和操作系统资源生成的目标代码(甚至还没有连接起来)合并在一起。
    • 加载器:编译器、汇编器和链接器生成的代码通常都是可重定位的,也就是说,这些代码的起始位置是不确定的,它们可以位于计算机内存中的任何位置。因此,加载器的基本任务就是找到/计算这些内存位置的精确地址。

    四、编译器类型

    • 自编译器:当编译器在同一台机器上运行,并生成适用于其运行所在机器的机器代码时,它被称为自编译器或驻留编译器。
    • 交叉编译器:编译器可以在一台机器上运行,并生成其他计算机可以使用的机器代码,这种情况下它被称为交叉编译器。它能够为编译器运行平台以外的平台生成代码。
    • 源到源编译器:源到源编译器或转译器或转译器是一种将用一种编程语言编写的源代码翻译成另一种编程语言的源代码的编译器。
    • 单遍编译器:当编译器的所有阶段都位于单个模块中时,就称为单遍编译器。它负责将源代码转换为机器代码。
    • 两遍编译器:两遍编译器是一种将程序翻译两次的编译器,一次是从前端翻译,一次是从后端翻译,也称为两遍编译器。
    • 多遍编译器:当程序中生成多个中间代码,并且语法树被多次处理时,就称为多遍编译器。它将代码分解成更小的程序。
    • 即时编译器(JIT):它是一种在程序执行期间(而不是在程序运行之前)将代码转换为机器语言的编译器。它结合了解释执行(实时执行)和传统编译执行(执行速度更快)的优点。
    • 预编译(AOT):它在程序运行前将所有源代码编译成机器代码。这意味着代码在开发过程中会被完全编译,从而加快启动速度,并在运行时获得更好的性能。
    • 增量编译器:它只编译代码中已更改的部分,而不是重新编译整个程序。这使得编译过程更快、更高效,尤其是在开发过程中。

    五、编译器的历史


    20世纪50年代,格蕾丝·霍珀开发了第一个编译器,由此催生了FORTRAN(1957年)、LISP(1958年)和COBOL(1959年)等语言。20世纪60年代出现了ALGOL等创新语言,70年代则诞生了C语言和Pascal语言。现代编译器专注于优化,支持面向对象特性和即时编译。编译器彻底改变了编程方式,使构建复杂系统成为可能,并提高了软件效率。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|路丝栈 ( 粤ICP备2021053448号 )

    GMT+8, 2025-11-23 13:12 , Processed in 0.043946 second(s), 21 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表