U12 编译生成方法与工具
2024-01-03 06:07:19
一、自编译
如果一个高级语言能用来书写自己的编译程序,则该语言具有自编译性,并称该语言为自编译语言。
PS:自编译语言除可编写编译自己的编译程序外,也可用来编写其他高级语言的编译程序。
自编译性不是绝对的,只是强弱不同:数据类型丰富的语言,控制结构丰富的语言自编译性强。
一组奇怪的图示:
二、自展
利用高级语言的自编译性,还可以通过自展方式生成语言的编译程序。
步骤:
- 首先,将语言划分为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的编译程序。
2、步骤
1)第一次编译
将L.L在宿主机A上用L的编译程序进行编译,生成能在宿主机A上运行的语言L的交叉编译器,它能生成目标机B的代码。
2)第二次编译(交叉编译)
四、编译器自动生成
目前还没有一个系统能自动生成整个编译系统。
前端分析,即针对语法规则的形式化,有框架。
有词法分析器的自动生成器和语法分析器的自动生成器。
对编译程序后端,(目标机有关的代码生成与优化),由于对语义和目标机进行形式化描述方面所存在的困难,最近有所突破,但未见到流行的产品。(样机——未形成真正产品)
文章来源:https://blog.csdn.net/ning_xiao_xuan/article/details/134928532
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!