Tantan Fu

Nov 01, 2014

Hello World!

我觉得程序员这个群体是非常幸运的一群人,我们生在一个技术改变世界的时代,而我们可能正做着能够改变世界的技术,这是何等的荣耀和机遇。 ——《MacTalk 人生元编程》

前言

大概每个程序员在开篇都会写一个Hello World!来作为开始。这是我的第一篇博客,就来写一写程序员眼中的Hello World!

这是一个 01 的世界

每个伟大的梦想都来自最小的尝试。秒写一个代码:hello.c
这段代码相信大家都很熟悉,无非就是输出一个Hello world字符串。下面我们就来分析一下这段代码。 1 预处理阶段 我们可以使用 gcc -E hello.c -o hello.i 来将预处理之后的数据存到hello.i中,或者使用>重定向到指定的文件,预处理的结果比较简单,大家可以直接看输出的结果。 2 编译阶段gcc -S hello.i -o hello.s将预处理之后的文件编译成hello.s文件。 在编译阶段,编译器检查代码的规范性、是否有语法错误等,在检查无误后,gcc 把代码翻译成汇编语言。 我们来看一下编译之后的文件
$> more hello.s
3 汇编阶段 汇编阶段将编译阶段生成的.s文件转成二进制目标代码。 gcc -c hello.s -o hello.o 生成了.o二进制文件,这时就不能使用more来进行文本查看了,可以使用objdump命令。 objdump -d hello.o
我们可以看到,main函数的汇编代码。
4 链接阶段 最后就是链接啦,将.o文件链接成可执行文件gcc hello.o -o hello 我们仍然使用objdump命令来查看hello文件 objdump -d hello 输出比较长,我们截取 main 函数的部分来看
最后执行

到现在我们只是从一个Hello World程序的输出结果走马观花了一下程序运行的过程,对于过程中的每一个文件分析并没有写出,算是留一点神秘感吧,从程序数据组织,包括代码段、数据段等,到汇编代码的底层实现,计算机有着太多的东西让我们去发现和思考。正如开头所说,生在这样的一个时代是非常幸运的。但行好事,莫问前程,出发!

Copyright © 2024 Tantan Fu