C程序员的必备常识

先看几张图片,形成感性认识


Apple Ⅱ(1977年发布),8位家用电脑,世界第一代成功量产的微计算机产品之一。用户通过键盘和显示器操控电脑,因此把键盘与显示器合称控制台(console)。顺便指出,右侧是两个软磁盘驱动器(早已淘汰,当时还是很先进的)

屏幕上的文本分行显示,闪烁的方块叫作光标,它指示下一个字符的输出位置

Apple Ⅱ的机箱,键盘左下角的白色按钮(POWER)是电源开关

Apple Ⅱ的机箱内部,布满芯片的绿色主板固定于箱底,扩展板垂直插接于主板

IBM PC(1981年发布),16位个人电脑,一代天骄IBM PC系列机的发端。两个黑色的软磁盘驱动器已被装进了机箱,比Apple Ⅱ前进了一步。重温控制台的概念,是指键盘与显示器的组合体,用户通过它来操控计算机

屏幕上的文本分行显示,闪烁的短线叫作光标,它指示下一个字符的输出位置。光标有多种形态,还有闪烁的竖线,等等

屏幕特写:文本内容反映当时的技术水平,值得品鉴

主板实例(1),CPU藏身于风扇与散热器的下面,风扇下面的灰白色金属散热片导热性能优良,与其下面的CPU芯片紧密贴合,迅速吸收CPU产生的热量并由风扇吹走,避免CPU过热而死机。旁边的绿色内存条垂直插接于主板

主板实例(2),风扇散热模块下面藏着CPU,绿色内存条垂直插接于主板

CPU实例(1),通过数百根针脚垂直插接于主板上的底座

CPU特写,尖尖的针脚与底座插孔清晰可见

CPU实例(2),Intel的第10代处理器,已与底座吻合

内存条实例(1),垂直插接于主板上的内存插槽

内存条实例(2),三星的32GB第4代内存

1. 计算机是怎样工作的?

计算机,无论规模大小,从超级计算机到家用台式电脑再到笔记本和智能手机,都是电子装置。只要按下电源按钮,计算机就开始启动而后进入工作状态。这背后到底发生着什么呢?仅仅发生一件事,那就是CPU一刻不停地执行内存中的程序、直到关机(计算机世界的一切表象都是程序执行的结果)。执行中的程序叫作进程(process)。当CPU没有真正任务可做时,它也不会停止工作,而是执行空闲进程,等待新任务的到来。不管是对用户有用的进程,还是空闲进程,在CPU看来都是一样的工作。机器工作的过程就是各种不同任务的进程交替执行的过程,进程之间的动态切换叫作机器控制(权)的转移。

机器加电,直接触发启动电路,迫使CPU从内存约定地址开始执行一个叫作BIOS(Basic Input Output System)的程序。这个程序由机器生产厂家预先写入内存的约定区域。这种内存芯片很特别,无论机器加电与否,其内容保持不变,也就是说,BIOS程序总是存在的,称为固件。近年生产的计算机采用Flash Memory芯片来固化BIOS,可由厂家提供的固件刷新程序实现对BIOS的改写升级。

BIOS芯片实例(1)
BIOS芯片实例(2)

BIOS程序首先对机器各部件进行检测;若一切正常,再部署一系列中断服务程序和设备驱动程序,把机器硬核封装起来,向上呈现一个初级软件平台、提供基本输入输出(如键盘输入和显示器输出)服务,供上层软件(特别是操作系统)调用;最后通常从硬盘约定区域把操作系统装入内存,把机器控制(权)移交操作系统。操作系统基于BIOS服务,对机器进一步封装,搭建计算机系统最基础、最庞大的软件平台,向用户和应用程序提供全面服务。从机器硬核开始,由各级软件分层封装隔离,逐级向上提供服务平台(也叫界面或接口),这种层次结构观点对于理解整个计算机系统是最重要的。

计算机系统的层次结构

紧接着,操作系统这个最庞大复杂的程序就开始执行了,对CPU、内存、硬盘、键盘、显示器、鼠标以及文件系统等等各种硬、软件资源进行统一管理,以方便用户使用和提高硬、软资源的利用率,因此操作系统堪称整个计算机系统的大管家。当操作系统把各种内务部署处理完成以后,就向用户呈现双方交互的界面,等待用户的操作命令,根据用户命令,执行相应的程序,完成相应的服务。

2. Windows操作系统如何对用户服务

Windows系统启动完成后,就会出现一幅桌面,桌面是用户与系统之间的第一交互界面,如下图所示:

Win 10 的桌面

在Windows系统的开始菜单、开始屏幕和桌面上,布满各种应用程序的快捷方式。用户根据需要、用鼠标单击某个快捷方式,系统便向快捷方式所指向的应用程序移交控制(权)让其执行以对用户提供服务,应用程序的运行过程就是服务过程,当执行结束后再收回控制权。

Windows系统的应用程序提供两种不同的用户界面、据此分为两类:Windows应用程序控制台应用程序,扩展名均为 .EXE,在资源管理器中随处可见。当Windows应用程序打开后,就会弹出一个窗口,窗口内呈现一个图形用户界面GUI(Graphical User Interface),GUI包含各种控件元素,如菜单栏、工具栏、图标、按钮、标签、输入框等等,用户通过鼠标、触屏或键盘进行操作,GUI就是用户与Windows应用程序之间的交互界面。Windows应用程序在Windows GUI子系统搭建的环境中运行。

在控制台应用程序开始执行前,系统预先弹出一个窗口(见下图),并置光标于窗口左上角,为控制台应用程序的运行搭好舞台。这个窗口与键盘合称Windows的控制台,是对传统控制台概念的继承和发展,传统控制台是指键盘与整个显示器屏幕的组合,参见Apple Ⅱ和IBM PC的图片介绍。在图形用户界面GUI盛行之前,应用程序都属于控制台应用程序的范畴。接下来,控制台应用程序开始执行,只能向控制台窗口逐个输出字符,光标指示下一个字符的输出位置;只能从键盘逐个输入字符。程序与用户之间的这种交互界面叫作字符用户界面CUI(Character User Interface)。控制台应用程序在Windows CUI子系统搭建的环境中运行。

Win 7 的控制台窗口示例:系统为控制台应用程序hello.exe预先打开

Windows系统向用户开启多任务并行的服务模式,例如:在一段时间内,用户可以同时打开资源管理器,进行文件的复制粘贴等操作;打开Word应用程序,进行文档的编辑排版;打开Microsoft Visual C++ 2010 Express应用程序,进行C语言程序开发;打开Microsoft Edge浏览器,实现网上冲浪;打开Windows Media Player播放器,欣赏优美的音乐。这样,在一段时间内,电脑桌面上同时呈现多个窗口,每个窗口对应一个正在运行的应用程序,用户通过不同窗口接受应用程序的不同服务,这就是多任务并行的含义,也是Windows操作系统给用户的最直接感受,也是微软给Windows操作系统命名的直接依据。顺便指出,本段提到的这些应用程序都是Windows应用程序。用户可以通过窗口右上角的关闭按钮来终止应用程序的执行和服务。

最典型的控制台应用程序是Windows系统的命令解释程序,文件名为cmd.exe,文件路径为C:\Windows\system32,它的快捷方式叫作”命令提示符”,在Win7开始菜单的程序–附件中,在Win10开始菜单的Windows系统中,点击其快捷方式即开始运行,如下图所示:

Win 7 的命令解释程序正在运行中
Win 10 的命令解释程序正在运行中

命令解释程序采用字符用户界面CUI与用户交互,是Windows系统向用户提供服务的另一接口(与桌面并列)。在上图界面中,命令解释程序首先输出四行文本,前两行向用户说明版本和版权;第三行为空行;第四行的闪烁短线叫作光标,光标左边的C:\Users\Freedom>叫作命令提示符,指出当前目录,并提示用户通过键盘输入一个命令行,按回车键后,就会针对当前目录执行用户命令,例如:用户键入内部命令 dir,命令解释程序cmd就会调用其对应的子程序,显示当前目录下的子目录和文件列表(目录和文件夹是同一概念),而后等待下一个命令,如下图所示:

共5列,依次为日期、时间、目录标志、文件大小(字节数)和子目录名或文件名

再例如:用户键入外部命令 hello.exe,命令解释程序cmd就会向当前目录下的控制台应用程序hello.exe移交控制权让其执行,显示一行文本:hello,world,这就是它的执行结果,然后命令解释程序回收控制权,继续等待下一个命令,如下图所示:

控制台应用程序hello.exe的执行与结果,扩展名.exe可省略

再例如:用户键入内部命令 help,命令解释程序cmd就会调用其对应的子程序,显示其所有内部命令的列表,如下图所示:

命令解释程序cmd的内部命令列表

所谓内部命令,就是命令解释程序cmd本身内部的子程序,执行内部命令就是调用对应的子程序。所谓外部命令,是指驻留硬盘上的控制台应用程序的文件名,执行外部命令就是移交控制权让其执行,然后收回控制权。内部命令和外部命令的执行均与命令解释程序cmd共享同一控制台(继承)。另外,还可以通过资源管理器找到控制台应用程序,双击令其执行,这时系统会自动打开一个控制台供其运行,待运行结束后,控制台自动关闭。顺便指出,在cmd的命令提示符窗口键入Windows应用程序的名字也可打开(前提是路径正确)。

3. Windows操作系统如何对应用程序服务

用户通过Windows系统的用户界面启动应用程序后,应用程序在执行期间离不开系统的支持,如输入输出、动态内存申请等都要调用系统的相应功能模块来完成。操作系统向应用程序提供的基础服务接口是统一格式的,如Windows API(Application Programming Interface ),而应用程序的编写语言却是多种多样的,这就需要一层相应的桥梁软件来适配,它属于语言实现软件的一部分,如C语言的函数库就是这样的适配层。

4. 系统、应用程序、用户之间的关系

在Windows计算机系统中,Windows操作系统通过Windows桌面或命令解释程序窗口这两种界面与用户交互;Windows操作系统直接支持Windows应用程序和控制台应用程序的执行;Windows应用程序通过图形用户界面GUI与用户交互;控制台应用程序通过字符用户界面CUI与用户交互。如下图所示:

三者关系示意图

5. 基于Windows系统的C程序开发

所谓用C语言进行软件开发,就是按照现行C语言国际标准编写在各种操作系统平台都能运行的程序。基于Windows系统的C程序开发,就是用Windows平台上的C程序开发工具,如Microsoft Visual C++ 2010 Express(学习版),从C源程序编码开始直至得到一个控制台应用程序的全过程。C语言属于系统程序开发语言,主要用于底层软件的开发,不需要太多的用户交互。C程序追求的目标是运行速度而不是用户界面。按照C语言标准,它只适合开发控制台应用程序,但不排斥某些扩展版本对图形用户界面GUI的支持。

6. 命令解释程序窗口中的基本操作

每当打开资源管理器就会看到,左窗格内有若干盘符,也叫驱动器号,如C:,D:,E:等,每个盘符代表一个硬盘分区。这些盘符处于文件系统树型目录结构的树根层,每个盘符下面均可创建若干文件夹,也叫目录,每个文件夹下面还可创建子文件夹,也叫子目录,如此可以创建子子孙孙若干层,每个文件夹或目录下面还可以创建若干文件,这种树型目录结构在资源管理器中层次分明、一目了然。

在命令解释程序的窗口中,也可以对这种树型目录进行操作,我们以实际操作示例进行说明。首先,下载下面的Cproject.zip压缩文件:

并解压于D盘根目录下,得到一个文件夹Cproject,在Cproject下面有两个子文件夹source和application,在source下面有一个C源程序文件hello.c,在application下面有一个控制台应用程序hello.exe和一个应用程序扩展文件msvcr100.dll,hello.exe是利用VC2010学习版集成开发环境生成的对应于hello.c的可执行文件,而msvcr100.dll是C语言的运行时(runtime)库,是C程序与Windows系统之间的适配层,使得C程序能够通过它来调用操作系统的服务。hello.exe的执行会在控制台窗口输出一行文本:hello,world。

然后,打开Windows系统的命令解释程序,文件名为cmd.exe,其快捷方式叫作”命令提示符”,在Win7开始菜单的程序–附件中,在Win10开始菜单的Windows系统中,点击其快捷方式即可打开,如下图所示:(也可用Windows徽标与R组合键,再输入cmd打开)

Windows徽标键
注意:先按下Windows徽标键,再按下R键,即可打开本窗口,输入cmd后,点击确定,即可打开命令解释程序窗口
Win 7 的命令解释程序窗口
Win 10 的命令解释程序窗口

接下来,按照下表中的次序,逐个键入操作命令并按回车键,逐一观察命令的执行效果,体验这些基本命令的含义和用法,这些命令在开发和执行C程序时会经常用到的。

序号命令含义
1cls清除窗口内容,光标回归第一行
2d:从C盘的当前目录转到D盘的当前目录
3cd Cproject进入子目录Cproject(cd后要键入空格符)
4dir列出目录Cproject下面的子目录和文件名
5cd source进入子目录source(cd后要键入空格符)
6dir列出目录source下面的子目录和文件名
7type hello.c列出文件hello.c的内容(type后有空格符)
8cd ..返回父目录Cproject(连续两个圆点)
9cd application进入子目录application(cd后有空格符)
10dir列出目录application下的子目录和文件名
11hello.exe外部命令,执行hello.exe(.exe可省略)
12exit退出命令解释程序窗口
注意:第3,5,7,9号命令中,一定要键入空格分隔符。另外,cls,dir,cd分别是clear screen,directory,change directory的缩写
依次执行1–6号命令,仔细观察每个命令的输出信息的格式和意义
依次执行7–12号命令,仔细观察每个命令的输出信息的格式和意义

小 结

  • 计算机从开机到关机一刻不停地执行程序,计算机世界的一切表象都是程序执行的结果,执行不同的程序、完成不同的任务。
  • 执行中的程序叫作进程(process)。机器工作的过程就是各种不同任务的进程交替执行的过程,进程之间的动态切换叫作机器控制(权)的转移。
  • 整个计算机系统是一个层次结构,从机器硬核开始,由各级软件分层封装隔离,逐级向上提供服务,而BIOS和操作系统是其中的两个基础层次。在操作系统内核与各种应用程序之间存在若干轻薄隔离层,分别支持不同的应用程序运行。
  • 操作系统是整个计算机系统的大管家,它根据用户命令,调度相应的应用程序执行。
  • Windows平台上的应用程序分为两类:Windows应用程序和控制台应用程序。Windows应用程序采用图形用户界面GUI,而控制台应用程序则采用字符用户界面CUI。这里,用户界面是对应用程序进行分类的直接依据。
  • Windows系统的桌面和命令解释程序cmd的窗口是系统与用户之间的两种交互界面。
  • 运行中的应用程序通过相应的软件适配层来调用操作系统的功能服务,这种适配层通常就是编程语言的运行时(runtime)库。
  • 用C语言为Windows平台开发应用程序,就是用某种C程序开发工具,从编写源代码开始到生成一个控制台应用程序的全过程。