什么是程序?
【操作系统基础篇:什么是程序?】
本节是操作系统系列教程的第一篇文章,属于操作系统第一章即基础篇,在真正开始操作系统相关章节前在这一部分回顾一些重要的主题,算是温故知新吧,以下是正文。
虽然在这里我们主要关注的是操作系统,但毕竟操作系统的目的就是能更好的运行用户程序,而且该教程主要是站在程序员的角度来讲解操作系统,作为程序员是绕不开程序这个话题的,因此在深入理解操作系统之前还是有必要来聊一聊程序是怎么一回事。
究竟什么是程序?
我们引用Wikipedia对计算机程序的定义:
A computer program is a collection of instructions that performs a specific task when executed by a computer.
翻译成大白话就是,能指挥计算机干活的一堆指令就叫计算机程序。那怎样才能写出指挥计算机干活的指令呢?这就涉及到程序是怎么来的。
程序是怎么来的呢?
程序是我们广大程序员们用编程语言一个字符一个字符写出来的文本字符串,只不过这些文本字符串是人类可以认识的。无论用的什么程序语言,C/C++、Java、Python、JavaScript、C#、Perl、Lua、Shell、汇编语言等等等等,只要是你写出来的文本字符串能指挥计算机干活,这都叫程序。这些程序员认识的文本字符串就是可以指挥计算机完成特定任务的指令。你可能有点糊涂了,这些文本字符串真的就是计算机能用来完成特定任务的指令吗?计算机不是只认识0和1这两个数字吗?
天才的榆木疙瘩
计算机其实是一个数学学得非常差的家伙,以至于差到只能认识两个数,0和1,其它的就都不能认识了,我们要面对的就是这样一个榆木疙瘩。
虽然这个榆木疙瘩数学不好识数不多,但是这家伙有一个我们人类难以望其项背的能力,不,对于人类来说简直就是超能力,那就是这个榆木疙瘩算数非常快,对于简单的加法我们人类可能一般一秒能算不超过10个,但是计算机一秒可以完成数十亿次的计算,简直是天才!虽然计算机能认识的数就只有0和1这么简单,但是其计算速度体现出了简单的威力。
从文本字符串到机器指令
至此,我们知道程序员(人类)和计算机是两个完全不同的物种,不同的物种能理解的语言是完全不同的,就好比普通的人不会明白一群鸟语在说什么一样,我们人类也不能打开vim或者宇宙无敌IDE——Visual Studio直接写0和1吧(虽然这是可以的,早期的程序员确实就是这么干的,牛不牛)。
因此,我们需要某种魔法把人类认识的C/C++、Java、Python之类的翻译出计算机可以认识二进制01指令。这样的魔法就来自两个东西,编译器和解释器。
翻译官编译器和解释器
编译器大家应该都比较熟悉,我们写好C/C++程序后第一步就是编译,这里编译工作就是编译器来完成的。你可以简单的理解为编译器把C/C++程序直接翻译成计算机可以认识的01二进制机器指令。
对于解释器有的同学可能就不是那么熟悉了,写Java、Python、C#程序的时候你从没有听说过要“编译一下Java,编译一下Python,编译一下C#”吧。你可能会说C/C++程序我能理解了,编译器把C/C++程序直接翻译成了01二进制机器指令,那Java、Python一类的程序是怎么运行的呢?
大家可以想一想,你在写Python、Java、C#程序之前是不是要安装一堆东西,称之为“运行时环境”?
如果你想不起来,赶紧重新搭一套环境试试是不是这么回事。
这里的运行时环境其实就是解释器。你可以把这个解释器简单的理解为就是一个程序,只不过。。。注意注意!!!前方高能!!!,只不过是解释器这个程序可以运行你写的Java、Python、C#的程序,解释器是一个可以运行程序的程序!!!那解释器这个程序又是怎么来的呢?一般情况下这些解释器其实是用C/C++写出来的。只不过用C/C++写的这个程序专门用来执行你写的Java、Python之类的程序,高能完毕。
伟大的C语言
希望到目前为止你还没有晕,到这里我们知道了,不管我们用的是Java、Python、JavaScript什么的也好最终都逃不出C/C++(Go等语言除外),CPU不直接执行Java、Python、JavaScript之类的解释型语言程序,CPU可以直接执行的是解释器代码,解释器最终来执行Java等程序,这就是解释型语言效率不如编译型语言效率高的原因。因为C/C++程序最终被编译器翻译成了01机器指令,CPU可以直接运行运行机器指令,而对于解释型语言来说CPU首先执行的是解释器的程序,然后解释器再执行你写的程序,性能上当然不及编译型语言。
而C++程序其实在编译过程中也会转化为C程序然后再转为01二进制机器指令,并且们使用的Windows、Linux、MacOS等操作系统同样是用C语言来编写的,从最底层的操作系统到上层的应用程序实际上都逃脱不了C语言。
从这个角度看,C语言真是一门伟大的语言。
回到操作系统
饶了一大圈我们回到操作系统,接下来关于操作系统的讲解中涉及到示例程序没有明确说明的话指的是C语言程序。请注意,如果你对C语言不熟悉也没有关系,我们示例都非常简单不会涉及到复杂的C语言相关概念与用法,有任何语言的使用经验都可轻松应对。
C语言程序编译好后生成的可执行程序在Windows中就是我们熟悉的exe程序,在Linux下是elf程序,这些可执行程序编译好后和普通文件一样存放在磁盘当中。
在接下来关于操作系统的讨论当中,没有明确说明的话,以下几个词汇,'程序','用户程序','应用程序'指的都是编译好后放在磁盘上的可执行程序。
操作系统也是程序
一定要认识到,操作系统也是程序,只不过这个程序不是简单的往屏幕上打印helloworld,不能用来文字语音视频聊天,不能用来上网,不能用来看电影,不能用来玩游戏。那么这个貌似什么娱乐设施都提供不了的程序有什么用呢?这个程序的作用无比重要,该程序的作用是为以上用户程序提供一个良好的运行环境,管理计算机硬件资源包括:CPU、内存、磁盘、网卡、外设等等等等,这个程序就是该教程重点关注的操作系统。
总结
这是该教程的第一节,在这一节中我们从各个方面讲解了程序这一话题。
程序分为编译型程序,比如C/C++,以及解释型程序比如Java、Python、JavaScript等。编译型程序被编译器直接翻译成CPU可以直接运行的机器指令,而解释型程序无需编译,其运行依靠的是解释器,解释器是一个可以执行程序的程序,解释器这个程序一般是由C/C++程序编写的。
需要我们注意的是操作系统也是一个程序,只不过这个程序的作用比较特殊,这个程序是用来管理计算机系统中各种软硬件资源的,比如提供进程、线程机制,管理CPU等等,这个程序也是接下来该教程的主角。