操作系统系列之——程序
这是这个系列的第一篇文章,如果对后续感兴趣,可以不时检查os是否更新。
1. 什么是程序
计算机程序是一组指示电子计算机或其他具有消息处理能力设备每一步动作的指令。————《维基百科:计算机程序》
2. 程序有啥用
定义中也提到了程序是指示每一步动作的指令,简单的说,程序就是实现某个目标所需要经历的步骤。
举一个现实中的例子,当我的目标是得到一杯手冲咖啡时,那我实现这个目标的程序就是:
- 取出一包咖啡豆、V60滤杯、V60滤纸、自己喜欢的咖啡杯、够用的电子秤、尽量贵的咖啡磨豆机、一个能倒出水的手冲壶。
- 用电子秤秤出15g咖啡豆。
- 用咖啡磨豆机研磨咖啡豆,得到咖啡粉。
- 将手冲壶装满水。
- 将手冲壶里的水加热到90°
- 将V60滤纸放入V60滤杯中,用热水湿润后,倒干多余的水。
- 将咖啡粉倒入V60滤杯,滤杯架放在咖啡杯上。
- 将热水倒入滤杯,用电子秤观察自己的倒入的水量到达225g时停止。
- 等待所有热水通过滤杯滴入咖啡杯,移开滤杯。
如果你发现你看不懂这个程序,没有关系这是正常的,你只需要知道这个复杂的一系列流程其实就相当于计算机中的一个程序,它给出了实现得到一杯手冲咖啡这个目标所需要的步骤。但如果你发现这个程序简直跟自己每天在做的一样,请留下评论让我们交个朋友!
3. 源代码
前面举了一个比较抽象的例子,也许有的人已经get到了,有的人还是一脸雾水,接下来会继续用更具体的例子,不过这要求你对C语言和命令行有简单的了解。
你现在有一个很简单的目标:向屏幕输出三次"HelloWorld!",你很轻易地想到了你可以利用你曾学的C语言去实现:
#include <stdio.h>
int main(){
for(int i=0; i<3; i++){
printf("No.%d: HelloWorld!\n",i);
}
return 0;
}
回顾一下这个段非常简单的源代码,除了必要的include
、main
、return
等结构,核心的代码只有三行,用for
循环3
次,在循环内printf
:
for(int i=0; i < 3; i++){
printf("No.%d: HelloWorld!\n",i);
}
除了必要的结构外,实际上我们就是用这三行代码去描述了如何实现我们需要的目标。这是C语言(或者Python、Java、JS、Golang)提供给我们的一种描述的能力。但是到目前为止,我们所编写的这几行代码还停留在文本这个阶段,这是一段你能读懂、修改的文本,但它们并不是计算机能够识别并执行的指令。
4. 编译源代码
让源代码成为程序也很简单,对于C语言而言,只需要用C语言的编译器去编译源代码即可。
4.1. 编译器做了什么
简单地说,编译器将我们写的源代码翻译成了机器能执行的二进制。
因为计算机是二进制的,在计算机的底层世界里都是0
和1
,但是我们直接用0
和1
去给计算机写程序、下指令太过反人类,为了便于我们与计算机的对话,编程语言应运而生。
编程语言是更接近人能读懂的语言(尽管它依旧有不小的上手难度,但已经比更底层的指令已经好太多了),虽然人能更方便地使用编程语言编写程序了,但计算机很蠢只懂二进制,为了让计算机也能理解我们所编写的内容,就需要编译器来充当这中间的翻译官。
4.2. 简单的编译尝试
以下操作在类Unix系统中进行,不同操作系统的编译工具可能会不同。
将3
中的源代码保存为main.c
,打开命令行进入当前目录,利用gcc
编译工具去编译源代码,指令如下:
cd $源代码所在文件夹
gcc main.c
现在main.c所在文件夹包含内容如下:
- main.c
- a.out
通过gcc编译后得到了一个二进制可执行文件a.out
。此时它被保存在硬盘的中,并且计算机也能够执行它,这时候我们才终于通过源代码获得了一个程序。