关于代码编译,你需要了解的

使用这个方便的捕鼠器类比来理解代码编译。然后下载我们的新电子书,《开源开发者构建应用指南》。
2 位读者喜欢这篇文章。
women programming

WOCinTech Chat。由 Opensource.com 修改。CC BY-SA 4.0

源代码必须经过编译才能运行,而在开源软件中,每个人都可以访问源代码。无论您是自己编写了代码并想要编译和运行它,还是下载了别人的项目来试用,了解如何通过编译器处理源代码,以及编译器到底对所有代码做了什么,都是非常有用的。

构建更好的捕鼠器

我们通常不会将捕鼠器视为计算机,但信不信由你,它确实与运行您正在阅读本文的设备的 CPU 有一些相似之处。经典的(非猫)捕鼠器有两种状态:已设置或已释放。您可以将其视为开启(杀杆已设置并存储势能)和关闭(杀杆已被触发)。从某种意义上说,捕鼠器是一台计算老鼠是否存在的计算机。您可以想象用一种假想的语言描述这个过程的代码

if mousetrap == 0 then
  There's a mouse!
else
  There's no mouse yet.
end

换句话说,您可以根据捕鼠器的状态推导出老鼠的数据。当然,捕鼠器并非万无一失。老鼠可能在捕鼠器旁边,而捕鼠器仍然会被注册为开启,因为老鼠尚未触发陷阱。因此,该程序可以使用一些增强功能,但这很典型。

开关

捕鼠器最终是一个开关。您可能使用开关来打开家里的灯。许多信息都存储在这些机制中。例如,人们常常认为当灯亮着时您在家。

您可以根据您社区中灯光的活动来编程操作。如果所有灯都熄灭了,那就调低你的大声音乐,因为人们可能已经睡觉了。

CPU 使用相同的逻辑,但放大了几个数量级,并缩小到微观层面。当 CPU 在特定寄存器接收到电信号时,另一个寄存器可能会被触发,然后再触发另一个,依此类推。如果这些寄存器被赋予意义,那么就会发生通信。也许同一主板上的某个芯片会变得活跃,或者 LED 会亮起,或者屏幕上的像素颜色会发生变化。

[ 相关阅读 2022 年值得尝试的 6 个 Python 解释器 ]

循环往复。如果您真的想在多个地方检测啮齿动物,而不仅仅是在您碰巧设置了捕鼠器的一个地方,您可以编程一个应用程序来做到这一点。使用网络摄像头和一些基本的图像识别软件,您可以建立一个空厨房的基线,然后扫描变化。当老鼠进入厨房时,之前没有老鼠的像素值会发生变化。记录数据,或者更好的是触发一架无人机,专注于老鼠,抓住它,并将其移到外面。您通过开关信号的魔力构建了一个更好的捕鼠器。

编译器

代码编译器将人类可读的代码翻译成直接与 CPU 对话的机器语言。这是一个复杂的过程,因为 CPU 本身就很复杂(甚至比捕鼠器更复杂),而且还因为这个过程比严格意义上的“需要”更灵活。并非所有编译器都是灵活的。有些编译器只有一个目标,它们只接受特定布局的代码文件,因此该过程相对简单。

幸运的是,现代通用编译器并不简单。它们允许您使用多种语言编写代码,并且允许您以不同的方式链接库,并且它们可以针对几种不同的架构。GNU C 编译器 (GCC)在其 --help 输出中有 50 多行选项,而 LLVM clang 编译器在其 --help 输出中有 1000 多行。GCC 手册包含超过 100,000 个单词。

当您编译代码时,您有很多选择。

当然,大多数人不需要了解所有可能的选项。GCC 手册页中有一些部分我从未读过,因为它们是针对 Objective-C 或 Fortran 或我从未听说过的芯片架构。但我珍视为几种不同架构、为 64 位和 32 位编译代码的能力,以及在行业其他部分已经抛弃的计算机上运行开源软件的能力。

编译生命周期

同样重要的是,理解编译代码的不同阶段具有真正的力量。这是一个简单 C 程序的生命周期

  1. 带有宏的 C 源代码 (.c) 使用 cpp 预处理以生成 .i 文件。

  2. 带有展开宏的 C 源代码 (.i) 使用 gcc 翻译以生成 .s 文件。

  3. 汇编语言文本文件 (.s) 使用 as 汇编成 .o 文件。

  4. 二进制目标代码包含 CPU 指令,以及未绑定到相对于其他目标文件和库的内存区域的偏移量 (*.o) 与 ld 链接以生成可执行文件。

  5. 最终的二进制文件要么包含所有必需的对象,要么设置为加载链接的动态库 (*.so 文件)。

这是一个简单的演示,您可以尝试一下(需要根据库路径进行一些调整)

$ cat << EOF >> hello.c
 #include
 int main(void)
 { printf("hello world\n");
   return 0; }
   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。这取决于您。

下载我们的新电子书: 开源开发者构建应用指南

标签
Avatar
我喜欢我的隐私。

1 条评论

这是一个很好且简洁的解释。谢谢。

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.