导读:用那个便利的捕鼠器比方来理解编译代码。
本文字数:2772,阅读时长大约: 4分钟
用那个便利的捕鼠器比方来理解编译代码。
用那个便利的捕鼠器比方来理解编译代码。
源代码必需要颠末编译才气够运行法式,而关于开源软件,每小我都能够获取源代码。无论你是本身编写了代码,想要编译和运行它,仍是下载了某人的项目来测验考试它,领会若何通过 编译器 🔗 opensource.com 处置源代码,以及编译器若何处置那些代码,那都很有用。
创建一个更好的捕鼠器
一般情状我们不会将一个捕鼠器比做电脑,但不管你信不信,它确实与你正在利用的设备(手机或电脑)的 CPU 有一些类似之处。典范的捕鼠器(我说的不是 🐈)有两种形态:翻开或者释放。你能够认为 翻开是将捕鼠器设置好筹办捕捉老鼠,以及 释放是捕鼠器被老鼠触发。某种意义上来说,捕鼠器就像是一台有鼠标的电脑。你能够想象一下那个代码,用一种虚构的语言来描述那个过程:
ifmousetrap ==0then
There's a mouse!
else
There's nomouse yet.
end
换句话说,你能够基于捕鼠器的形态发现能否有老鼠(数据)。当然,捕鼠器不是满有把握的,有可能有一只老鼠在捕鼠器旁边,因为老鼠还没有触发捕鼠器,所以它的形态仍是 翻开的。因而该法式能够停止改良,那都长短常典型的。
展开全文
开关
总的来说,捕鼠器就是一个开关。你会在家里利用开关翻开灯。能够从开关中获得许多信息。好比,人们会从你家灯的形态领会到你能否在家。
你能够根据邻人家灯的形态来改动行为。若是邻人家所有的灯都熄灭了,那么请关掉你高声的音乐,因为人们可能已经上床睡觉了。
CPU 也利用如许的逻辑,只不外乘以几个数量级,缩小到了微不雅级别。当 CPU 在特定存放器上领受到电信号时,能够触发其他一些存放器,然后触发另一个,以此类推。若是那些存放器有特定的意义,那么就能够通信。也许激活统一主板上某处的芯片,或者使 LED 亮起,或者改动屏幕上的像素颜色。
编译器
代码编译器将人们可阅读的代码转换成 CPU 能够理解的机器语言。那长短常复杂的过程,因为 CPU 十分复杂(以至比捕鼠器愈加复杂),同时因为该过程比严酷“需要”的愈加灵敏。并非所有的编译器都很灵敏。有一些编译器只要一个目的,它们只会处置特定格局的代码文件,处置过程也因而而简单了然。
幸运的是,现代的通用编译器其实不简单。它们允许你编写差别语言的代码,也允许你用差别的体例链接库文件,而且能够生成运行在差别架构上的文件。 GNU 编译器聚集 🔗 opensource.com (GCC)的 gcc 编译器 --help 会输出超越 50 行的选项,LLVM 的 clang 编译器的 --help 输出超越 1000 行。GCC 指点手册的字数超越 10 万。
当你在编译代码时会有良多选项。
当然,大大都人其实不需要晓得所有的选项。我从未读过 GCC 的手册页,因为它们是针对 Objective-C、Fortran 以及我从未传闻过的芯片架构的。不外我重视它将代码编译为差别的架构 —— 64 位或者 32 位 —— 的才能,以及在其他行业已经落后的计算机上运行开源软件的才能。
编译生命周期
同样重要的是,理解编译代码的差别阶段。那是一个简单的 C 语言法式的生命周期:
1. 带有宏定义的 C 源代码 .c 文件,用 cpp 预处置为 .i 文件。
2. 扩展了宏定义的 C 源代码 .i 文件,会被 gcc 转译成 .s 文件。
3. 以汇编语言写的文本文件 .s 文件被汇编为目的 .o 文件。
4. 带有 CPU 指令的二进造目的代码,以及其他目的文件和库 *.o 文件,以内存区域无关的偏移量,利用 ld 链接以生成可施行文件。
5. 最末的二进造文件要么包罗所有需要的目的,要么设置以动态链接库 *.so 文件加载。
你能够尝尝那个简单示例(可能需要对库途径做一些调整):
$ catEOF hello.c
#include
intmain(void)
{printf("hello world\n");
return0;}
EOF
$ cpp hello.c hello.i
$ gcc-S hello.i
$ as-o hello.o hello.s
$ ld-static-o hello \
-L/usr/lib64/gcc/x86_64-slackware-linux/5.5.0/\
/usr/lib64/crt1.o /usr/lib64/crti.o hello.o \
/usr/lib64/crtn.o --start-group -lc -lgcc \
-lgcc_eh --end-group
$ ./hello
hello world
可获得的常识
计算机已经变得十分强大,而且用户友好。请不要走向那两种可能的极端中的任何一种:计算机不像捕鼠器和电灯开关那么简单,但它们也不是无法理解的。你能够领会编译代码、若何链接以及针对差别架构停止编译。一旦你晓得了,你就能够更好地调试代码。你能够理解你下载的代码,以至能够修复此中的一两个错误。同时从理论上来讲,你能够建造一个更好的捕鼠器,或者用捕鼠器造一个 CPU。由你决定。
via:
做者: Alan Smithee 选题: lkxed 译者: Donkey-Hao 校对: wxy
本文由 LCTT 原创编译, Linux中国 荣誉推出
LCTT 译者 :Donkey
翻译: 27.0篇
奉献: 144天
2022-06-09
2022-10-31
欢送遵照 CC-BY-SA 协议规定转载,
如需转载,请在文章下留言 “ 转载:公家号名称”,
我们将为您添加白名单,受权“ 转载文章时能够修改”。