U12 编译生成方法与工具

文章目录

  • 一、自编译
  • 二、自展
  • 三、交叉编译
    • 1、移植
    • 2、步骤
      • 1)第一次编译
      • 2)第二次编译(交叉编译)
  • 四、编译器自动生成

一、自编译

如果一个高级语言能用来书写自己的编译程序,则该语言具有自编译性,并称该语言为自编译语言。

PS:自编译语言除可编写编译自己的编译程序外,也可用来编写其他高级语言的编译程序。

自编译性不是绝对的,只是强弱不同:数据类型丰富的语言,控制结构丰富的语言自编译性强。
一组奇怪的图示:
U12 编译生成方法与工具_第1张图片

U12 编译生成方法与工具_第2张图片
U12 编译生成方法与工具_第3张图片

二、自展

利用高级语言的自编译性,还可以通过自展方式生成语言的编译程序。

步骤:

  1. 首先,将语言划分为N个部分:
    L = L 1 + L 2 + … + L n L = L_1+ L_2+…+ L_n L=L1+L2++Ln
    L 1 L_1 L1 ——核心部分
    L 2 ~ L n L_2~ L_n L2Ln——扩充部分
    用自展方式进行编译,可提高生产率。因核心语言小,可用汇编实现。其余部分高级语言编写。比全用低级语言效率高。
  2. 先用A机上的汇编编写L1的编译程序,L1.Aa
    L 1 . A a → A s s e m b e r → L 1 . A o L_1.Aa→Assember→L_1.A o L1.AaAssemberL1.Ao
  3. L 1 L1 L1编写 L 1 + L 2 L1+L2 L1+L2的编译程序
    在这里插入图片描述
  4. ( L 1 + L 2 ) (L1+L2) (L1+L2)编写 L 1 + L 2 + L 3 L1+L2+L3 L1+L2+L3的编译程序
  5. ……
    在这里插入图片描述

三、交叉编译

问题:如何在一个跑不起来Linux操作系统的RISC-V开发板上运行C程序?
U12 编译生成方法与工具_第4张图片

1、移植

移植:将某台机上的成熟软件移植到另一台机器上,也就是将宿主机上的软件移植到目标机上。

具有自编译性的高级语言来书写程序,则移植是方便的。
在这里插入图片描述
通过移植,在B机上可得到语言L的编译程序,具B机目标形式,可在B机上运行。

移植步骤:

  1. 将L. L分为两部分: 一部分与机器无关 F . L F.L F.L 一部分与机器有关 A . L A.L A.L
    ∴ L . L = F . L + A . L ∴ L. L = F.L+ A.L L.L=F.L+A.L
  2. 用语言L改写与具体机器有关的部分(增加后端):
    U12 编译生成方法与工具_第5张图片
    ∴ 交叉编译器: L . L = F . L + B . L ∴交叉编译器: L.L= F.L+ B.L 交叉编译器:L.L=F.L+B.L
    用A机上的L语言所写的能生成B机目标代码的语言L的编译程序。

2、步骤

1)第一次编译

将L.L在宿主机A上用L的编译程序进行编译,生成能在宿主机A上运行的语言L的交叉编译器,它能生成目标机B的代码。
U12 编译生成方法与工具_第6张图片

2)第二次编译(交叉编译)

U12 编译生成方法与工具_第7张图片

四、编译器自动生成

U12 编译生成方法与工具_第8张图片

目前还没有一个系统能自动生成整个编译系统。

前端分析,即针对语法规则的形式化,有框架。
有词法分析器的自动生成器和语法分析器的自动生成器。
U12 编译生成方法与工具_第9张图片
U12 编译生成方法与工具_第10张图片

对编译程序后端,(目标机有关的代码生成与优化),由于对语义和目标机进行形式化描述方面所存在的困难,最近有所突破,但未见到流行的产品。(样机——未形成真正产品)

你可能感兴趣的:(编译原理,汇编,机器翻译)