文章目录

  • 那究竟是什么是程序呢?
  • 程序是怎么来的呢?
  • 天才的榆木疙瘩
  • 从文本字符串到机器指令
  • 翻译官编译器和解释器
  • 伟大的C语言
  • 回到操作系统
  • 操作系统也是程序
  • 总结

虽然在这里我们主要关注的是操作系统,但毕竟操作系统的目的就是能更好的运行用户程序,而且该教程主要是站在程序员的角度来讲解操作系统的,作为程序员是绕不开程序这个话题的。因此在深入理解操作系统之前还是有必要来聊一聊程序是怎么一回事。

那究竟是什么是程序呢?

我们引用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等等,这个程序也是接下来该教材的主角。

更多计算机内功文章,欢迎关注微信公共账号:码农的荒岛求生


彻底理解操作系统系列文章
1,什么程序?
2,进程?程序?傻傻分不清
3,程序员应如何理解内存:上篇
4,程序员应如何理解内存:下篇
5,程序员应如何理解内存:下篇
6,程序员应如何理解CPU:上篇
7,程序员应如何理解CPU:下篇
8,操作系统是如何看待进程的
9,系统调用是如何实现的
10,程序员应如何理解系统调用:上篇
11,程序员应如何理解系统调用:下篇
12,以发展的眼光来看待操作系统
13,操作系统是如何获取键盘按键的
14,操作系统是如何获取键盘按键的

计算机内功决定程序员职业生涯高度

彻底理解操作系统:1,什么是程序?相关推荐

  1. 深入理解操作系统(16)第六章:存储器层次结构(2)高速缓存存储器+对程序性能的影响(包括:L1/L2高速缓存历史/缓存写:直写和写回/暂无L4级缓存/缓存命中率/存储器山/高速缓存友好的代码/)

    深入理解操作系统(16)第六章:存储器层次结构(2)高速缓存存储器+对程序性能的影响(包括:L1/L2高速缓存历史/缓存写:直写和写回/暂无L4级缓存/缓存命中率/存储器山/高速缓存友好的代码/) 1 ...

  2. 计算机操作系统开启审计功能,深入浅出理解操作系统安全

    原标题:深入浅出理解操作系统安全 引言 操作系统安全在计算机信息系统的整体安全性中具有至关重要的作用,没有操作系统提供的安全性,计算机业务系统的安全性是没有基础的. 什么是操作系统 操作系统(英语:o ...

  3. CPU位数、操作系统位数、应用程序位数浅析

    问题起源: 64位CPU的64指的是什么 32位计算机的32位指的是啥 32位计算机装8G内存有用吗 32位应用程序和64位应用程序又是啥... ... 能说上来一点,但实际上含糊不清的概念有很多 下 ...

  4. 计算机漫游模式,深入理解操作系统之一 —— 计算机系统漫游

    这些内容都是摘自<深入理解操作系统>这本书,很多年前学习操作系统都是马马虎虎,突然感觉现在很需要再次深入了解操作系统,读了这本书感觉对自己有用的就记下来了,方面以后查阅. 计算机系统漫游这 ...

  5. 通往编程高手之路:《深入理解操作系统》

    亚达斯密在其经济学巨著<国富论>中提出了"看不见的那只手"的概念,意指市场机制对经济发展的作用,作为普通的个人来说我们在平时的生活中可能很难感受到市场机制所发挥的作用, ...

  6. 深入理解操作系统(12)第四章:处理器体系结构(4)Y86-64的流水线实现(包括:PIPE-处理器/预测下一个PC/分支预测/流水线冒险/暂停,转发避免冒险/PPE硬件结构及实现/CPI)

    深入理解操作系统(12)第四章:处理器体系结构(4)Y86-64的流水线实现(包括:PIPE-处理器/预测下一个PC/分支预测/流水线冒险/暂停,转发避免冒险/PPE硬件结构及实现/CPI) 1. Y ...

  7. 深入理解操作系统(10)第四章:处理器体系结构(2)Y86-64的顺序实现(包括:SEQ/指令的各阶段操作:取指,解码,执行,访存,回写,更新PC/序列指令/硬件结构/时序/阶段的实现/SEQ+)

    深入理解操作系统(10)第四章:处理器体系结构(2)Y86-64的顺序实现(包括:SEQ/指令的各阶段操作:取指,解码,执行,访存,回写,更新PC/序列指令/硬件结构/时序/阶段的实现/SEQ+) 1 ...

  8. 操作系统学习(一)-- 从发展史理解操作系统设计需求

    这是操作系统系列第 1 篇. 尽管操作系统发展史不是研究操作系统的重点,但是在这一发展过程中,衍生出了许许多多与操作系统相关的重要概念,如果知道这些概念出现在怎样的背景下,以及产生的原因,在后期学习中 ...

  9. 人生理解---2、看《程序员年龄增大后的职业出路是什么》有感

    人生理解---2.看<程序员年龄增大后的职业出路是什么>有感 一.总结 一句话总结: 身体垮掉,才是真的死路一条. 1.身体垮掉,才是真的死路一条.? 每天需要弄一点时间出来锻炼,我太久没 ...

最新文章

  1. 机器学习与高维信息检索 - Note 1 - 信息检索、机器学习与随机变量
  2. linux 创建crontab文件位置,[基础教程]linux系统的crontab计划任务添加和删除
  3. 2.12 总结-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  4. 取得 Git 仓库 —— Git 学习笔记 04
  5. v3s 全志_基于全志V3s的开源开发板,提供pcb和系统源码和资料
  6. 【性能优化】之 BITMAP 及分区表 的演示
  7. osgi简介_OSGi:简介
  8. Linux的命令之 man -- 查看帮助文档
  9. SpringShell文档阅读笔记-SpringShell的基本使用
  10. Fragment标签页+OKHttp网络请求数据+MVP模式
  11. sqlserver text最大长度_1156. 单字符重复子串的最大长度
  12. struts 进不了action方法
  13. qTip2 精致的jQuery提示信息插件
  14. HTML网页作业个人网站源码div+css布局
  15. android 沙盒 ios,iOS之沙盒机制
  16. 别让学历限制你,你可能是AI领域的下一个巨星
  17. 重识Nginx - 18 网络收发与Nginx事件间的对应关系
  18. 图片太普通,教你轻松制作画中画特效
  19. 微风:AI新手入门学习教程
  20. 移远NBIOT模块选型指南

热门文章

  1. java什么时候要重写equse,【音频技术】何时使用均衡(When to Use EQ)【EQ均衡器】
  2. PyQt5按下按键选择文件夹并显示
  3. PHP左侧分类表显示,利用CSS实现wordpress侧边栏分类目录分两列显示 | 迷失的世界...
  4. 小米路由器R2D刷机
  5. 计算机常用英语1000个,1000个最常用英语单词以及翻译
  6. 钱诚12.31黄金原油最新行情资讯分析,纸白银投资操作指南
  7. Unity3D打砖块游戏入门教程
  8. composer更新_PHP面试中经常出现的composer 问题总结
  9. 我的CAD二次开发程序中的操作excel的部分
  10. 海外华人OTT直播点播系统搭建方案详解