首先,将语言划分为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
L2?~Ln?——扩充部分 用自展方式进行编译,可提高生产率。因核心语言小,可用汇编实现。其余部分高级语言编写。比全用低级语言效率高。
先用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?.Aa→Assember→L1?.Ao
用
L
1
L1
L1编写
L
1
+
L
2
L1+L2
L1+L2的编译程序
用
(
L
1
+
L
2
)
(L1+L2)
(L1+L2)编写
L
1
+
L
2
+
L
3
L1+L2+L3
L1+L2+L3的编译程序
……
三、交叉编译
问题:如何在一个跑不起来Linux操作系统的RISC-V开发板上运行C程序?
1、移植
移植:将某台机上的成熟软件移植到另一台机器上,也就是将宿主机上的软件移植到目标机上。
具有自编译性的高级语言来书写程序,则移植是方便的。
通过移植,在B机上可得到语言L的编译程序,具B机目标形式,可在B机上运行。
移植步骤:
将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
用语言L改写与具体机器有关的部分(增加后端):
∴
交叉编译器:
L
.
L
=
F
.
L
+
B
.
L
∴交叉编译器: L.L= F.L+ B.L
∴交叉编译器:L.L=F.L+B.L 用A机上的L语言所写的能生成B机目标代码的语言L的编译程序。