网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
05月21日
漏签
0
天
c++吧
关注:
541,422
贴子:
2,091,073
看贴
图片
吧主推荐
游戏
1
2
3
下一页
尾页
41
回复贴,共
3
页
,跳到
页
确定
<<返回c++吧
>0< 加载中...
【科普】编译器的构建基本原理
只看楼主
收藏
回复
WXYHYXY
^
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
原文地址:
网页链接
在介绍原理以前,考虑到很多人连什么是体系结构,什么是操作系统内核,什么是C库都不知道。在这先介绍一下。
WXYHYXY
^
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
二楼给度娘
WXYHYXY
^
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
指令集体系结构(ISA)
指令集体系结构又叫计算机体系结构。ISA是一种计算机抽象的模型。而执行ISA描述的指令的设备,例如中央处理器(CPU)叫指令集的实现。
比如说我们平时用的台机笔记本,一般都是x86_64,x86_64是代表64位的x86指令集.是AMD公司在32位的x86发展而来,因而叫x86_64。32位的x86往往叫i386,i486,i586或是i686,但其实都一样。
手机则往往用aarch64 (也可以叫arm64)
最近国内的龙芯龙架构,它就是一种新的指令集。32位的龙架构叫loongarch,64位的龙架构叫loongarch64.
设计一个指令集并不困难,难的是在CPU本身的工艺上。指令集设计的再好,工艺不行,也是不会有足够的性能的。因而不应用CPU本身的性能来直接评价指令集的好坏。
WXYHYXY
^
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
操作系统(OS)
操作系统就不多说了。比如windows, linux, darwin(就是苹果的操作系统代号叫dawrin),freebsd, msdos等等,或是你自己随便写的操作系统。
WXYHYXY
^
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
C库 (libc)
C库,Windows上叫它C运行时(C Runtime)。C库是按操作系统标准POSIX (Portable Operating System Interface)标准规定的具体实现。C库包括了除了ISO C库规定的功能以外,还提供了网络,文件系统等等的功能。
C库一般由操作系统厂商直接提供,然而也不是没有例外,最常见的就是Linux. 因为linux只提供了内核,而不提供libc.所以libc就有很多种,你自己做一个也是可以的。我们平时用的linux又被叫GNU/Linux,就是因为C库是由自由软件基金会的GNU项目提供的,它们用的C库都是glibc (GNU C Library).而安卓用的C库是谷歌自己做的BIONIC libc,因而程序即使体系结构相同,操作系统相同,程序仍然不能互相运行。
WXYHYXY
^
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
Windows上的C运行时,也是一种具体的C库。分为msvcrt和现在win10上用的Universal CRT. CRT除了提供POSIX的功能以外,还提供了访问windows上的API及各个DLL功能的接口。比如windows.h,NTDDK,COM系的api,d3d,Windows Runtime等的头文件. DLL的访问包括ntskornl.exe,ntdll.dll,kernel32.dll,msvcrt.dll,gdi32.dll,d3d12.dll等等。Windows上除了微软自己提供的C运行时库以外,还有mingw-w64提供的C运行时库,它们功能并没什么实际差别,只是针对的不同工具链用的,最终都是链接到Windows CRT。而cygwin或是msys2的C库就完全是自己重写的,因而cygwin和mingw完全不同,用的C库叫newlib-cygwin,这种C库也是嵌入式最常用的C库。
WXYHYXY
^
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
三连音 (triplet)
三连音(triplet)是描述平台的方式。一个平台对应一个三连音。具体为isa-(vendor)-os-libc [指令集体系结构-(厂商)-操作系统-C库]。除了厂商可以不同以外,体系结构,操作系统内核或C库这三者有任何的不同,他们都不是一个平台。互相之间程序不能互相运行。
厂商可以被省略,被省略的情况下,它可以代表默认值pc或是unknown.
C库在某些条件下也会被省略。这种情况往往是因为操作系统自带了libc,比如freebsd,苹果darwin.
WXYHYXY
^
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
常见的三连音有
x86_64-linux-gnu
x86_64-linux-musl
x86_64-linux-android 安卓的
aarch64-linux-gnu
loongarch64-linux-gnu CPU体系结构龙芯的龙架构
x86_64-windows-gnu
x86_64-windows-msvc
x86_64-freebsd
x86_64-darwin
wasm32-wasi
i586-msdosdjgpp
x86_64-elf
WXYHYXY
^
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
有人会问为何桌面linux上的程序不能直接运行在安卓上。这就是因为平时我们用的linux的三连音的体系结构-linux-gnu,而安卓的三连音是体系结构-linux-android. 仅仅是libc的不同的情况下,它们仍然是两个不同的平台。互相之间的程序完全不通用。
WXYHYXY
^
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
构建(build),宿主(host),目标(target)
在编译中,我们需要注意三个三连音,分别为构建,宿主和目标各自的三连音。
构建:构建编译器的平台的三连音。
宿主:编译器运行平台的三连音。
目标:编译器编译出来的程序平台的三连音。
要注意的是某些编译器不存在目标三连音,只有构建和宿主。代表就是clang。因而对于clang,只有构建和宿主的关系,没有宿主和目标的关系。
WXYHYXY
^
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
关于本地编译,交叉编译,加拿大编译,是对编译的不同类别的描述方法。
本地编译和加拿大编译的分类方式,估且叫它分类方式A。
在这种分类方式下,讨论的是构建和宿主的关系,也就是指编译器本身的产生的方式。在这种分类方式下:
本地编译:构建==宿主
加拿大编译:构建!=宿主
WXYHYXY
^
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
举例:
例1:
比如说你手上有个x86_64的linux机器,你想搞一个新的编译器出来,这个编译器仍然会在x86_64的linux运行,这就是本地编译。
但你同时还有一台x86_64的Windows机器,你想为x86_64的Windows机器搞一个编译器出来,然而可能在windows上直接搞编译器不容易,这个时候,你会想到,是否有可能在x86_64的linux上帮助这台x86_64的x86_64的windows机编译编译器出来?答案是可以的。所以这种利用另一个平台来帮助本平台构建编译器的方式就是加拿大编译。
WXYHYXY
^
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
例2:
龙芯上的本地工具链,或是你自己写的新的操作系统的GCC
你可能认为是从机器码手工一步一步搞出来的,之后编译C编译器,一步一步得到GCC13。实际上这是完全错的,也是不可能行的。实际上新的三连音平台上的GCC都是通过加拿大编译直接得到的。
WXYHYXY
^
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
本地编译和交叉编译的分类方式,估且叫它分类方式B
在这种分类方式下,讨论的是宿主和目标的关系。在这种分类方式下:
本地编译:宿主==目标
交叉编译:宿主!=目标
而对于使用这个编译器的人来说,构建平台是什么感觉上不会有任何区别。比如说树苺派上用的源管理器上的编译器往往就是从x86_64的linux上加拿大编译而成。
WXYHYXY
^
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
举例:
比如说你在x86_64的linux上编译x86_64的linux程序,这就是本地编译。
比如说你在x86_64的linux上编译x86_64的windows程序,这就是交叉编译。
一般意义下的描述,也就是GCC的描述方式
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示