源代码必须经过编译才能运行,而在开源软件中,每个人都可以访问源代码。无论您是自己编写了代码并想要编译和运行它,还是下载了别人的项目来试用,了解如何通过编译器处理源代码,以及编译器到底对所有代码做了什么,都是非常有用的。
构建更好的捕鼠器
我们通常不会将捕鼠器视为计算机,但信不信由你,它确实与运行您正在阅读本文的设备的 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 程序的生命周期
-
带有宏的 C 源代码 (
.c
) 使用cpp
预处理以生成.i
文件。 -
带有展开宏的 C 源代码 (
.i
) 使用gcc
翻译以生成.s
文件。 -
汇编语言文本文件 (
.s
) 使用as
汇编成.o
文件。 -
二进制目标代码包含 CPU 指令,以及未绑定到相对于其他目标文件和库的内存区域的偏移量 (
*.o
) 与ld
链接以生成可执行文件。 -
最终的二进制文件要么包含所有必需的对象,要么设置为加载链接的动态库 (
*.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。这取决于您。
下载我们的新电子书: 开源开发者构建应用指南
1 条评论