引导(Bootstrapping)

2025年6月17日 | 3 分钟阅读

引言

编译器的结构中,除了源语言和目标语言之外,还涉及第三种语言在编译器构建过程中。 这称为宿主语言。

Compiler Bootstrapping

我们使用一种语言提供的工具来构建编译器的技术称为引导。 我们使用引导来构建编译器,并通过修改后端优化代码生成将其从一台机器迁移到另一台机器。

下面给出编译器设计中引导的一些特性

  • 引导广泛用于编译开发。
  • 引导用于生成自托管编译器。 自托管编译器是一种可以编译自身源代码的编译器。
  • 引导编译器用于编译编译器,然后您可以使用这个编译后的编译器来编译所有其他内容以及其自身的未来版本。

编译器可以通过三种语言来表征

  1. 源语言
  2. 目标语言
  3. 实现语言

T 图显示了用于 Source S、Target T 的编译器 SCIT,在 I 中实现。

Compiler Bootstrapping

按照一些步骤来生成机器 A 的新语言 L

  1. 使用语言“A”为所需语言 L 的子集 S 创建编译器 SCAA,并且该编译器在机器 A 上运行。
    Compiler Bootstrapping
  2. 为以 L 的子集编写的语言 L 创建编译器 LCSA
    Compiler Bootstrapping
  3. 使用编译器 SCAA 编译 LCSA 以获得 LCAALCAA 是语言 L 的编译器,它在机器 A 上运行并生成机器 A 的代码。
    Compiler Bootstrapping
    Compiler Bootstrapping

T 图描述的过程称为引导。

引导中的交叉编译器

这是一种编译器,它为运行它的平台以外的平台生成可执行代码。 它用于使用引导编译器的简化版本来编译同一编译器的复杂版本。

  • 首先,使用实现语言“N”为源语言(例如“C”)创建一个交叉编译器,并为机器“S”生成目标代码,表示为 CNS
    Compiler Bootstrapping
  • 之后,源语言“N”的交叉编译器使用实现语言(例如“M”)并为机器“M”生成一些代码,表示为 NMM
    Compiler Bootstrapping
  • 源语言“C”的交叉编译器使用实现语言“M”并生成机器“S”的代码,表示为 CMS。
    Compiler Bootstrapping

通过使用引导,前两个交叉编译器是 (CNS 和 NMM),两者都生成第三个编译器,即 (CMS)。

CNS + NMM -> CMS

Compiler Bootstrapping

编译器设计器中引导的优点

以下是编译器设计中引导的一些优点列表

  • 提高效率:它有助于加快开发过程。 基本编译器使用它来构建更高级的版本,这使得创建复杂编译器的整个过程更快。
  • 灵活:引导编译器可用于为不同的平台生成代码,使其更灵活。
  • 减少依赖性:借助引导的概念,您无需担心其他编译器或某些外部工具。

编译器设计器中引导的局限性

以下是编译器设计中引导的一些局限性列表

  • 初始工作:构建编译器最初很困难。 在引导的概念出现之前,您需要从头开始构建一个简单的、可工作的编译器,这需要大量的时间和精力。
  • 耗时:在引导的早期阶段,它需要时间和资源。 它需要频繁的编译器版本构建和升级,这在开始时可能是一个缓慢的过程。

关于编译器设计中引导的常见问题

1. 交叉编译器和引导之间的主要区别是什么?

序号交叉编译器引导(Bootstrapping)
1.交叉编译器在一个平台上运行,但会导致为不同的平台生成可执行代码。它是创建自编译编译器的过程,该编译器以源编程语言编写,它指定要编译的语言。

2. 引导的不同用途是什么?

  • 它有助于从原始编译器创建新的编译器。
  • 它有助于创建新的编程语言。
  • 它有助于优化编译器。

下一个主题有限状态机