CS:APP第一章:计算机系统漫游 笔记

背景知识

计算机是由软件和硬件组成的

一些程序员希望深入了解这些组件是如何工作的以及这些组件是如何影响程序的正确性和性能的,以此来提高自身的技能。本书便是为了这些读者而写。

Unix shell

[Shell]1

在计算机科学中,shell俗称壳(用来区别于核),是指为使用者提供操作界面的软件,命令解析器。它类似于DOS下的command.com和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。
Shell分两大类:
一:图形界面shell
例如:应用最为广泛的Windows Explorer微软的windows系列操作系统,还有广为人知的Linux shell,其中linux shell包括X window manager(BlackBox和FluxBox),以及功能更强大的CDE、GNOME、KDE、XFCE
二:命令行式shell(Command Line Interface shell,即CLIshell)
例如bash,MS-DOS系统,cmd.exe命令提示字符,

1.1 信息就是位+上下文

源程序实际上就是一个由值0和1组成的位(又称为比特)序列,8个位被组织成一组,称为字节。每个字节表示程序中的某些文本字符。
像hello.c这样只由ASCII字符构成的文件称为文本文件,所有其他文件都成为二进制文件。
hello.c的表示方法说明了一个基本思想:系统中所有的信息——包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由一串比特表示的。区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。
作为程序员,我们需要了解数字的机器表示方式,因为它们与实际的整数和实数是不同的。它们是对真值的有限近似值,有时候会有意想不到的行为表现。

C编程语言的起源

C语言是贝尔实验室的DennisRitchie与1969年~1973年间创建的。美国国家标准学会(Amaerican National
Standards Institute,ANSI)在1989年颁布了ANSI
C的标准,后来C语言的标准化成了国际标准化组织(International Standards
Organization,ISO)的责任。这些标准定义了C语言和一系列函数库,即所谓的C标准库。Kernighan和Ritchie在他们的经典著作中描述了ANSI
C,这本著作被人们满怀情感地称为“K&R”。用Ritchie的话来说,C语言是“古怪的、有缺陷的,但同时也是一个巨大的成功”。为什么会成功呢?

c语言与Unix操作系统关系密切

C从一开始就是作为一种用户Unix系统的程序语言开发出来的。大部分Unix内核(操作系统的核心部分),以及所有支撑工具和函数库都是用C语言编写的。20世纪70年代后期到80年代初期,Unix风行于高等院校,许多人开始接触C语言并喜欢上它。因为Unix几乎全部是用C编写的,它可以很方便地移植到新的机器上,这种特点为C和Unix赢得了更广泛的支持。

C语言小而简单。

C语言的设计是由一个人而非一个协会掌控的,因此这是一个简洁明了、没有什么冗杂的设计。K&R这本书用到大量的例子和联系描述了完整的C语言及其标准库,而全书不过261页。C语言的简单使它相对而言易于学习,也易于移植到不同的计算机上。

C语言是为实践目的设计的

C语言是设计用来实现Unix操作系统的。后来,其他人发现能够用这门语言无障碍地编写他们想要的程序。

C语言是系统编程的首选,同时也非常适用于应用程序的编写。然而,它也并非适用于所有的程序员和所有的情况。C语言的指针是造成程序员困惑和程序错误的一个常见原因。同时C语言还缺乏对非常有用的抽象的显式支持,例如类、对象和异常。像C++和Java这样针对应用级程序的新程序语言解决了这些问题。

1.2 程序被其他程序翻译成不同的格式

hello程序的生命周期是从一个高级C语言程序开始的,因为这种形式能够被人读懂。然而,为了在系统上运行hello.c程序,每条C语句都必须被其他程序转化为一系列低级机器语言指令。然后这些指令按照一种称为可执行目标程序的格式打好包,并以二进制磁盘文件的形式存放起来。目标程序也称为可执行目标文件
在Unix系统上,从源文件到目标文件的转化是由编译器驱动程序完成的:

linux> gcc -o hello hello.c

在这里,GCC编译器驱动程序读取源文件hello.c,并把它翻译成一个可执行目标文件hello。这个翻译过程可分为四个阶段完成,如图1-3所示。执行这四个阶段的程序(预处理器、编译器、汇编器和链接器)一起构成了编译系统(compilation system)。

编译系统示意图
预处理阶段。预处理器(cpp)根据以字符#开头的命令,修改原始的C程序。结果就到了另一个C程序,通常以.i作为文件扩展名。
编译阶段。编译器(cll)将文本文件hello.i翻译成文本文件hello.s,它包含一个编汇语言程序。改程序包含函数main的定义。
汇编阶段。接下来,汇编器(as)将hello.s翻译成机器语言指令,这些指令打包成一种叫做可重定位目标程序的格式,并将结果保存在目标文件hello.o中,hello.o文件是一个二进制文件,它包含的字节是函数main的指令编码。如果我们在文本编辑器中打开hello.o文件,将看到一堆乱码。
链接阶段。请注意,hello程序调用了printf函数,它是每个C编译器都提供的标准C库中的一个函数。printf函数存在于一个名为printf.o的单独的预编译好了的目标文件中,而这个文件必须以某种方式合并到我们的hello.o程序中。链接(Id)就负责处理这种合并。结果就得到hello文件,它是一个可执行目标文件(或简称为可执行文件),可以被加载到内存中,由系统执行。


  1. 百度百科shell ↩︎

猜你喜欢

转载自blog.csdn.net/weixin_44725869/article/details/89328385