Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

1.1 从Hello World说起

毫无疑问,“Hello World”对于程序员来说肯定是如雷贯耳。就是这样一个简单的程序,带领了无数的人进入了程序的世界。简单的事物背后往往又蕴涵着复杂的机制,如果我们深入思考一个简单的“Hello World”程序,就会发现很多问题看似很简单,但实际上我们并没有一个非常清晰的思路;或者在我们脑海里有着模糊的印象,但真正到某些细节的时候可能又模糊不清了。比如对于C语言编写的Hello World程序:

#include <stdio.h>

int main()
{
    printf("Hello World\n");
    return 0;
}

对于下面这些问题,你的脑子里能够马上反应出一个很清晰又很明确的答案吗?

  • 程序为什么要被编译器编译了之后才可以运行?
  • 编译器在把C语言程序转换成可以执行的机器码的过程中做了什么,怎么做的?
  • 最后编译出来的可执行文件里面是什么?除了机器码还有什么?它们怎么存放的,怎么组织的?
  • #include <stdio.h>是什么意思?把stdio.h包含进来意味着什么?C语言库又是什么?它怎么实现的?
  • 不同的编译器(Microsoft VC、GCC)和不同的硬件平台(x86、SPARC、MIPS、ARM),以及不同的操作系统(Windows、Linux、UNIX、Solaris),最终编译出来的结果一样吗?为什么?
  • Hello World程序是怎么运行起来的?操作系统是怎么装载它的?它从哪儿开始执行,到哪儿结束?main函数之前发生了什么?main函数结束以后又发生了什么?
  • 如果没有操作系统,Hello World可以运行吗?如果要在一台没有操作系统的机器上运行Hello World需要什么?应该怎么实现?
  • printf是怎么实现的?它为什么可以有不定数量的参数?为什么它能够在终端上输出字符串?
  • Hello World程序在运行时,它在内存中是什么样子的?

对于上面的问题,如果你确信能够非常清楚地了解里面的各个细节,并且对其中的过程和机制都了如指掌,那么很遗憾,这本书不是为你准备的;如果你发现对其中一些问题并不是很了解,甚至从来没有想到过一个Hello World还能引出这么多值得思考的问题,而你又想了解它们,那么恭喜你,这本书就是为你准备的。随着各个章节的逐步展开,我们会从最基本的编译、静态链接到操作系统如何装载程序、动态链接及运行库和标准库的实现,甚至一些操作系统的机制,力争深入浅出地将这些问题层层剥开,最终使得这些程序运行背后的机制形成一个非常清晰而流畅的脉络。

在开始进入庞大而又繁琐的系统软件之前,让我们先进行热身活动,那就是一起来回顾计算机系统的一些基本而又重要的概念。整个计算机系统回顾过程将分为两个部分,分别是硬件部分和软件部分。本书的主要目的不是介绍计算机系统结构,第1章的回顾只是巩固和总结计算机软硬件体系里面几个重要的概念,这些概念在我们后面的章节中将时时伴随着我们,失去了它们的支撑,后面的章节将会显得繁琐而又晦涩。如果你自认为这些基本概念很简单,那么你可以大概地浏览一遍几个知识点的标题,然后直接跳到第2章;反之,如果你觉得有些概念还不是很清楚,甚至从来没听说过这些概念,那么请你仔细阅读相关章节,相信这个过程对你阅读本书甚至对你深入了解计算机大有裨益。