U12 编译生成方法与工具

一、自编译

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

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

自编译性不是绝对的,只是强弱不同:数据类型丰富的语言,控制结构丰富的语言自编译性强。
一组奇怪的图示:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

二、自展

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

步骤:

  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程序?
在这里插入图片描述

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改写与具体机器有关的部分(增加后端):
    在这里插入图片描述
    ∴ 交叉编译器: 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的代码。
在这里插入图片描述

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

在这里插入图片描述

四、编译器自动生成

在这里插入图片描述

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

前端分析,即针对语法规则的形式化,有框架。
有词法分析器的自动生成器和语法分析器的自动生成器。
在这里插入图片描述
在这里插入图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值