《计算机是怎样跑起来的》读书笔记

2023-12-19

目录

本文内容主要来源于《计算机是怎样跑起来的》([日] 矢泽久雄),另外借鉴引用了尚硅谷-宋红康老师《Java从入门到精通》的部分内容。

1 计算机组成

从硬件来看,计算机可以说是执行输入、运算、输出三种操作的机器。计算机的硬件由大量的IC(Integrated Circuit,集成电路)组成。每块IC上都带有很多引脚,这些引脚有的用于输入,有的用于输出。IC会在其内部对外部输入的信息进行运算,并把运算结果输出到外部。
在这里插入图片描述

1 CPU(Central Processing Unit,中央处理器)

CPU是计算机的大脑,负责解释、执行程序。
CPU主频的概念
主频即CPU的时钟频率,单位是Hz(赫兹),表示驱动CPU运转的时钟信号的频率,1秒发出1次时钟信号就是1Hz,比我我的笔记本电脑是2.40 GHz,表示每秒钟向CPU发出2.4×10 9 次时钟信号。
计算机的操作在时钟信号的控制下分步执行,每个时钟信号周期完成一步操作,时钟频率的高低在很大程度上反映了CPU速度的快慢。 主频和实际的运算速度存在一定的关系,但并不是一个简单的线性关系。主频表示在CPU内数字脉冲信号震荡的速度,CPU的运算速度还要看CPU的流水线、总线等各方面的性能指标。也就是说,主频仅仅是CPU性能表现的一个方面,而不代表CPU的整体性能。

2 硬盘(Hard Disk Drive)

计算机最主要的存储设备,容量大,断电数据不丢失。
正常分类:机械硬盘(HDD)、固态硬盘(SSD)以及混合硬盘(SSHD)
固态硬盘在开机速度和程序加载速度远远高于机械硬盘,缺点就是贵,所有无法完全取代机械硬盘。

3 内存(Memory)

负责硬盘上的数据与CPU之间数据交换处理
具体的:保存从硬盘读取的数据,提供给CPU使用;保存CPU的一些临时执行结果,以便CPU下次使用或保存到硬盘。
断电后数据丢失。

在这里插入图片描述

4 输入与输出设备(I/0设备)

输入设备常见的包括鼠标、键盘,常见的输出设备比如显示器和打印机。

2 软件是什么

软件,即一系列按照特定顺序组织的计算机数据和指令的集合。
所谓指令,就是控制计算机进行输入、运算、输出的命令。把向计算机发出的指令一条条罗列出来,就得到了程序。
Pascal之父Nicklaus Wirth: “Programs = Data Structures + Algorithms”(程序=数据结构+算法)
软件有系统软件和应用软件之分。
系统软件包括:
在这里插入图片描述
应用软件:
在这里插入图片描述

3 编程语言

3.1 机器语言

机器语言就是处理器可以直接理解(与生俱来就能理解)的编程语言。机器语言有时也叫做原生代码(Native Code)。
比如下面一段代码就是典型的机器码。
在这里插入图片描述

3.2 汇编语言

在机器语言程序中,虽然到处都是0和1的组合,但是每个组合都是有特定含义的指令或数据。可是对人来说,如果只看0和1的话,恐怕很难判断各个组合都表示什么。
于是就有人发明出了一种编程方法,根据表示指令功能的英语单词起了一个相似的昵称,并将这个昵称赋予给0和1的组合。这种类似英语单词的昵称叫做“助记符”,使用助记符的编程语言叫做“汇编语言”。无论是使用机器语言还是汇编语言,所实现的功能都是一样的,区别只在于程序是用数字表示,还是用助记符表示。
比如上一节机器代码可以转换为下图中的汇编语言。汇编语言的语法十分简单,以至于语法只有一个,即把“标签”“操作码(指令)”和“操作数(指令的对象)”并排写在一行上,仅此而已。
在这里插入图片描述
那么计算机只能识别0101之类的机器码,汇编语言怎么识别呢?答案是不能识别,我们需要使用编译器将汇编语言转为机器码,计算机才能运行。

在这里插入图片描述

3.3 高级语言

高级语言发展于20世纪50年代中叶到70年代,是一种接近于人们使用习惯的程序设计语言。它允许程序员使用接近日常英语的指令来编写程序,程序中的符号和算式也与日常用的数学式子差不多,接近于自然语言和数学语言,容易为人们掌握。比如:
在这里插入图片描述
高级语言独立于机器,有一定的通用性;计算机不能直接识别和执行用高级语言编写的程序,需要将高级语言转换为机器语言才能被识别和执行。在转换过程中需要使用编译器和汇编器。
那么编译器和汇编器到底是什么呢?我们看看

  • 编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码(source code) →预处理器(preprocessor) → 编译器 (compiler) →目标代码(object code)→链接器(Linker) → 可执行程序 (executables)
  • 汇编器是将汇编语言翻译为机器语言的程序。一般而言,汇编生成的是目标代码,需要经链接器(Linker)生成可执行代码才可以执行

可以简单理解为:

  • 汇编器是将汇编语言翻译为二进制代码(机器可以直接执行二进制程序)
  • 编译器是将一种高级语言翻译为另一种低级语言的程序(不一定是二进制代码)
  • 但是现在很多编译器可以直接将程序转化成二进制, 是因为编译器中已经包含了汇编器

综上,高级语言可以通过编译器将代码编译为汇编语言,然后再通过汇编器将代码转换为机器语言。如下图所示。
在这里插入图片描述
一个典型的C语言程序编译过程
在这里插入图片描述

3. 4 高级语言和低级语言的分类

通过上面学习,我们知道编程语言分为机器语言、汇编语言和高级语言,其实他们可以分类为:低级语言和高级语言。

  • 常见的低级语言:机器语言,汇编语言等。
  • 常见的高级语言:C、Java、C++、Pascal、Python等。

低级语言:因其是接近底层的编程,没有编译解析等过程,所以执行效率高,响应速度快;但由于学习和编程以及调试难度较高,故编程比较费时费力,项目周期一般较长。
反观高级语言虽比较依赖编译解析,但其可读性更高,开发效率更高,学习起来相对容易;当然高级语言也有不如低级语言的地方,譬如:执行效率。此外,高级语言的执行依赖于运行环境,如果环境配置不完善或者环境版本不一致,则可能导致程序无法执行。

3. 5 解释型语言

随着时间的推移,一种新的编程方式兴起了。一种被称为“解释器”的特殊程序可以直接读取一个程序将其转换成计算机指令以立即执行。和编译器差不多,解释器读取程序并将它转换成一个中间形态。但和编译器不同的是,解释器直接执行程序的这个中间形态。解释型语言在每一次执行的时候都要经历这个过程;而编译程序只需要编译一次,之后计算机每次只需要执行编译好的机器指令就可以了。
顺便说一句,这个特性就是导致人们感觉解释型程序运行得比较慢的原因。不过现代计算机的性能出奇地强大,以至于大多数人无法区分编译型程序和解释型程序。
解释型程序(有时也被成为“脚本”)甚至更容易被移植到不同的硬件平台上。因为脚本并不包含任何机器特有的指令,同一个版本的程序可以不经过任何修改就直接在很多不同的计算机上运行。不过当然了,解释器必须得先移植到新的机器上才行。
一个很流行的解释型语言是 perl。用 perl 完整地表达我们的加法问题会是这样的:

$x = 1 + 2

虽然这个程序看起来和 C 语言的版本差不多,运行上也没有太大区别,但却缺少了初始化变量的语句。其实还有一些其它的区别(超出这篇文章的范围了),但你应该已经注意到,我们写计算机程序的方式已经和数学家用纸笔手写数学表达式非常接近了。

4 程序开发使用的工具

4.1 程序开发需要哪些工具

在上节中,我们知道了编译器是程序开发的必要工具,但除了编译器是必须的工具,我们往往还需要很多其他辅助软件,例如:

  • 编辑器:用来编写代码,并且给代码着色,以方便阅读;
  • 代码提示器:输入部分代码,即可提示全部代码,加速代码的编写过程
  • 调试器:观察程序的每一个运行步骤,发现程序的逻辑错误;
  • 项目管理工具:对程序涉及到的所有资源进行管理,包括源文件、图片、视频、第三方库等;
  • 漂亮的界面:各种按钮、面板、菜单、窗口等控件整齐排布,操作更方便。

4.2 什么是集成开发工具

这些工具通常被打包在一起,统一发布和安装,例如 Visual Studio、Dev C++、Xcode、Visual C++ 6.0、C-Free、Code::Blocks 等,它们统称为集成开发环境(IDE,Integrated Development Environment)。
集成开发环境就是一系列开发工具的组合套装。这就好比台式机,一个台式机的核心部件是主机,有了主机就能独立工作了,但是我们在购买台式机时,往往还要附带上显示器、键盘、鼠标、U盘、摄像头等外围设备,因为只有主机太不方便了,必须有外设才能玩的爽。
集成开发环境也是这个道理,只有编译器不方便,所以还要增加其他的辅助工具。

5 程序的流程

5.1 程序流程分类

程序的流程分为顺序执行、条件分支和循环。

在这里插入图片描述

5.2 流程图画法含义

所谓流程图,正如其名,就是表示程序流程(Flow)的图(Chart)。
在这里插入图片描述
流程图中各个符号含义
在这里插入图片描述
用流程图表示的顺序执行、条件分支、循环三种流程。
在这里插入图片描述

5.3 结构化程序设计

所谓结构化程序设计就是“为了把程序编写的具备结构性,仅使用顺序执行、条件分支和循环表示程序的流程即可,而不再使用跳转指令”。
在程序设计的世界中,如果看到了以“结构化”开头的术语,就可以这样认为:程序的流程是由程序块表示的,而不是用GoTo 语句等跳转指令实现的。

5.4 特殊的流程处理——中断处理

中断处理是指计算机使程序的流程突然跳转到程序中的特定地方,这样的地方被称为中断处理例程(Routine)或是中断处理程序(Handler),而这种跳转是通过CPU 所具备的硬件功能实现的。人们通常把中断处理比作是接听电话。假设诸位都正坐在书桌前处理文件,这时突然来电话了,诸位就不得不停下手头的工作去接电话,接完电话再回到之前的工作。像这样由于外部的原因使正常的流程中断,中断后再返回到之前流程的过程就是中断处理流程。
在CPU中,有INT 和NMI 两个引脚,它们可以接收从I/O 设备发出的中断请求信号A。以硬件形式连接到CPU 上的I/O 模块会发出中断请求信号,CPU根据该信号执行相应的中断处理程序。在诸位使用的个人计算机上,中断请求信号是由连接到周边设备上的I/O 模块发出的。例如每当用户按下键盘上的按键,键盘上的I/O 模块就会把中断请求信号发送给CPU。CPU 通过这种方式就可以知道有按键被按下,于是就会从I/O设备读入数据。CPU 并不会时刻监控键盘是否有按键被按下。
中断处理以从硬件发出的请求为条件,使程序的流程产生分支,因此可以说它是一种特殊的条件分支。可是,在诸位编写的程序中并不需要编写有关中断处理的代码。因为处理中断请求的程序,或是内置于被烧录在计算机ROM 中的BIOS 系统(Basic Input Output System,基本输入输出系统)中,或是内置于Windows 等操作系统中。诸位只需要先记住以下两点即可:计算机具有硬件上处理中断的能力;中断一词的英文是Interrupt。

5.5 特殊的流程处理——事件驱动

通常把用户在应用程序中点击鼠标或者敲击键盘这样的操作称作“事件”(Event)。负责检测事件的是Windows。Windows 通过调用应用程序的WndProc() 函数通知应用程序事件的发生。而应用程序则根据事件的类型做出相应的处理。这种机制就是事件驱动。
可以说事件驱动也是一种特殊的条件分支,它以从Windows 送来的通知为条件,根据通知的内容决定程序下一步的流程。要实现事件驱动,就必须把应用程序中的WndProc() 函数(称为窗口过程,Window Procedure)的起始内存地址告诉Windows。这一步将在应用程序WinMain() 中作为初始化处理被执行。

6 面向对象编程

6.1 面向过程和面向对象的概念

编写程序的基本方法可以划分为面向过程和面向对象两种。

  • 面向过程(Procedure Oriented 简称PO :如C语言):
    从名字可以看出它是注重过程的。当解决一个问题的时候,面向过程会把事情拆分成: 一个个函数和数据(用于方法的参数) 。然后按照一定的顺序,执行完这些方法(每个方法看作一个过程),等方法执行完了,事情就搞定了。

  • 面向对象(Object Oriented简称OO :如C++,JAVA等语言):
    看名字它是注重对象的。当解决一个问题的时候,面向对象会把事物抽象成对象的概念,就是说这个问题里面有哪些对象,然后给对象赋一些属性和方法,然后让每个对象去执行自己的方法,问题得到解决。

面向对象编程(OOP,Object Oriented Programming)是一种编写程序的方法,旨在提升开发大型程序的效率,使程序易于维护。

6.2 面向对象编程的几个重要观点

  • 面向对象编程就是在为现实世界建模
    程序可以在计算机上实现现实世界中的业务和娱乐活动。计算机本身并没有特定的用途,而是程序赋予了计算机各种各样的用途。在面向对象编程中,可以通过“这个是由什么样的对象构成的呢?”这样的观点来分析即将转换成程序的现实世界。这种分析过程叫作“ 建模 ”。可以说建模对于开发者而言,反映的是他们的世界观,也就是在他们的眼中现实世界看起来是什么样子的。
  • 面向对象编程可以借助UML设计程序
    可以说建模就是在为面向对象编程做设计。为了把对现实世界建模的结果以图形的形式表示出来,还经常使用被称作UML(Unified Modeling Language,统一建模语言)的表记方法。UML 是通过统一历史上曾经出现的各种各样的表记方法而发明出来的,事实上UML 已经成为了建模表记方法中的世界标准。
  • 面向对象编程中使用继承、封装和多态
    “继承”( Inheritance)、“封装”( Encapsulation)和“多态”(Polymorphism,也称为多样性或多义性)被称为面向对象编程的三个基本特性。在作为面向对象编程语言的C++、Java、C# 等语言中,都已具备了能够用程序实现以上三个特性的语法结构。继承指的是通过继承已存在的类所拥有的成员而生成新的类。封装指的是在类所拥有的成员中,隐藏掉那些没有必要展现给该类调用者的成员。多态指的是针对同一种消息,不同的对象可以进行不同的操作。
  • 面向对象编程通过在对象间传递消息驱动程序
    用C++ 等面向对象编程语言编写程序的话,程序可以通过由一个对象去调用另一个对象所拥有的函数这种方式运行起来。这种调用方式被称为对象间的“消息传递”。在面向对象语言中所说的消息传递指的就是调用某个对象所拥有的函数。即便是在现实世界中,我们也是通过对象间的消息传递来开展业务或度过余暇的。在面向对象编程中还可以对对象间的消息传递建立模型。
    如果未使用面向对象编程语言,那么可以用流程图表示程序的运行过程。流程图表示的是处理过程的流程,因此通常把非面向对象语言称为“过程型语言”。而且可以把面向对象编程语言和面向过程型语言,面向对象编程和面向过程编程分别作为一对反义词来使用。
    如果使用的是面向对象编程语言,那么可以使用UML 中的“时序图”和“协作图”表示程序的运行过程。在下图中对比了流程图和时序图。关于流程图已经没有必要再进行介绍了吧。在时序图中,把用矩形表示的对象横向排列,从上往下表示时间的流逝,用箭头表示对象间的消息传递(即程序上的函数调用)。诸位在这里只需要抓住图中的大意即可。
    在这里插入图片描述
  • 类和对象的区别
    类是对象的定义,而对象是类的实例。

7 数据库的基本概念

7.1 数据库是数据的基地

所谓数据库(Database)就是数据(Data)的基地(Base)。在实施企业的商业战略时,如果企业内的数据散布在各个地方,在更新和检索时就要花费大量时间,分析起来就会很麻烦。但是只要把企业内的数据预先汇集到一个“基地”中并加以整理,各个部门中充满干劲的员工就可以根据需要灵活地使用这些数据。这个数据的基地就是数据库。虽然使用纸质文件整理出来的数据也可以称为数据库,但是利用善于处理数据的计算机整理会更加方便。因为计算机是提高手工工作效率的工具,所以就成为了数据的基地。
适合存储大规模数据的是关系型数据库(Relational Database)。

7.2 数据文件、DBMS和数据库应用程序

7.2.1 三者关系

为了编写数据库应用程序(即为了便于操作数据库而编写的程序),诸位可以从零开始埋头编写所有代码,但是一般情况下,还是会借助称作DBMS (数据库管理系统 – database management system, DBMS )的软件。Microsoft Access、Oracle、SQL Server、DB2 等诸位都有所耳闻吧,这些都是DBMS 的实例。数据库的实质虽然是某种数据文件,但是诸位编写的应用程序并不是直接去读写这些数据文件,而是以DBMS 作为中介间接地读写(如下图所示)。DBMS 不但可以使应用程序轻松地读写数据文件,而且还具有一致并且安全地存储数据的功能。
在这里插入图片描述

7.2.2 数据库系统的构成要素

数据库系统的构成要素包括“数据文件”“DBMS”“应用程序”三部分。在小型系统中,把三个要素全部部署在一台计算机上,称作“独立型系统”。在中型系统中,把数据文件部署在一台计算机上,并且使数据文件被部署了DBMS 和应用程序的多台计算机共享,这样的系统被称为“文件共享型系统”。在大型系统中,把数据文件和DBMS 部署在一台(或者多台)计算机上,然后用户从另外一些部署着应用程序的计算机上访问,这样的系统被称作“客户端/服务器型系统”。其中部署着数据文件和DBMS 的计算机是服务器(Server),即服务的提供者;部署着应用程序的计算机是客户端(Client),即服务的使用者。如果把服务器和客户端之间用互联网联结起来,就形成了Web 系统。在Web 系统中,一般情况下应用程序也是部署在服务器中的,在客户端只部署Web 浏览器。
在这里插入图片描述

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《计算机是怎样跑起来的》读书笔记 的相关文章

  • Kubernetes 简介

    1 Kubernetes简介 一个容器管理应用 提高容器化服务的部署和管理效率 2 容器部署 2 1 传统部署形式 应用共用服务器环境 对于底层资源 文件目录 JDK 网络带宽等 存在弹性争夺 冲突等问题 容易导致应用性能不稳定 服务器环境
  • 中国90米分辨率可蚀性因子K数据

    数据时间 2023年 数据空间位置 全国 数据空间分辨率 90m 数据坐标系 WGS1984 数据格式 tiff 数据来源 地球资源数据云平台 www gis5g com 如需要请自行联系 数据简介 土壤可蚀性因子 K 数据 基于多种土壤属
  • 【网络安全】-Linux操作系统—CentOS安装、配置

    CentOS是一个基于Red Hat Enterprise Linux构建的免费操作系统 它提供了企业级的稳定性和安全性 非常适合用于服务器环境 以下是CentOS安装和基本配置的详细指南 准备工作 在安装CentOS之前 需要准备安装介质

随机推荐

  • 二蛋赠书十二期:《一本书讲透Java线程:原理与实践》

    摘要 互联网的每一个角落 无论是大型电商平台的秒杀活动 社交平台的实时消息推送 还是在线视频平台的流量洪峰 背后都离不开多线程技术的支持 在数字化转型的过程中 高并发 高性能是衡量系统性能的核心指标 越来越多的公司对从业人员的多线程编程能力
  • PHP中1688平台商品详情数据API接口采集到数据后如何处理

    PHP的定义和特点 PHP Hypertext Preprocessor 是一种开源的服务器端脚本语言 用于快速构建动态网页和Web应用程序 PHP采用嵌入HTML的方式 可以直接嵌入到HTML代码中 与数据库连接 数据处理 文件上传等操作
  • Vue的网络请求、插槽、Vuex

    axios npm i axios 跨域问题 协议名 ip 端口号 实际上 浏览器是收到数据的 但是没有交付给开发者 解决跨域问题 创建代理服务器 代理服务器和前端端口是一样的 所以不存在跨域问题 代理服务器与后端服务器都是服务器 和浏览器
  • Android的基础开发

    基础开发 listView ListView就是列表条目 可以向下滚动 也可以点击 首先设置两个视图布局 activity main2 xml 充当容器 ListView
  • 「Verilog学习笔记」游戏机计费程序

    专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点 刷题网站用的是牛客网 timescale 1ns 1ns module game count input rst n 异位复位信号 低电平有效 input clk 时
  • 讲解darknet: ./src/cuda.c:36: check_error: Assertion `0‘ failed.

    目录 讲解darknet src cuda c 36 check error Assertion 0 failed 错误原因 解决方案 1 检查CUDA安装 2 检查GPU驱动程序 3 检查CUDA环境变量 4 编译darknet 5 调试
  • 应用在多媒体触摸屏设备中的触摸感应芯片

    多媒体触摸屏设备是触摸液晶显示器结合现代PC机组成的具有触摸显示和计算机操作功能为一体的产品 它包括两个部分 一个是触摸液晶显示器 它具有触控的特性和显示输出的功能 另一个是PC机 也就是所说的计算机 通过两个部分整合到一起 实现了具有触摸
  • Springboot+Mybatis入门案例

    一 项目结构 1 导入依赖
  • Java版企业电子招标采购系统源码—鸿鹄电子招投标系统-企业战略布局下的采购寻源

    项目说明 随着公司的快速发展 企业人员和经营规模不断壮大 公司对内部招采管理的提升提出了更高的要求 在企业里建立一个公平 公开 公正的采购环境 最大限度控制采购成本至关重要 符合国家电子招投标法律法规及相关规范 以及审计监督要求 通过电子化
  • MySQL性能监控

    1 创建监控用户 mysql gt CREATE USER mysqld exporter localhost IDENTIFIED BY Mysqld exporter 123 WITH MAX USER CONNECTIONS 3 my
  • API接口能力不足?Bug处理慢?Lazada开放平台API商品接入

    7月30日正式发布的Lazada开放平台2 0 Lazada Open Platform 2 0 从 商品API 订单API IM 即时通信 API 营销工具等几大方向 带来全新升级的API体系 共 新增47个接口 优化19个接口 向广大的
  • 免费有意思的好用API推荐

    周公解梦 周公解梦大全 周公解梦查询 免费周公解梦 星座查询 根据日期或星座名称 查询星座详细信息 包含 掌管宫位 主管星 颜色 珠宝 幸运数字 性格等等 生肖查询 根据生肖名称 查询生肖详细信息 包含 五行分析 本命佛 生辰 吉祥颜色 幸
  • Vue的组件化

    组件化步骤 1 创建Vue组件 const school Vue extend template div h2 学校名称 schoolName h2 h2 学校地址 schoolAddress h2 div data return scho
  • torch.rand()和torch.randn()的区别

    torch rand 和 torch randn 是 PyTorch 中用于生成张量的两个函数 它们之间的主要区别在于生成张量元素的方式不同 1 torch rand torch rand 用于生成元素值在 0 1 之间均匀分布的随机张量
  • uniapp初级入门-flex布局学习11-骰子多点演示

    代码
  • python pdf转图片

    import fitz def pdf2img pdf path img dir doc fitz open pdf path 打开pdf for page in doc 遍历pdf的每一页 zoom x 2 0 设置每页的水平缩放因子 z
  • Android的组件、布局学习

    介绍 公司组织架构调整 项目组需要承接其他项目组的android项目 负责维护和开发新需求 故学习下基础语法和项目开发 组件学习 Toolbar header布局部分 就是app最顶部的部分 他的显示与否 是与F androidProjec
  • 使用AI大模型增强图像清晰度

    在线体验 点击 图像处理 即可使用 public static final String IMAGE DEFINITION ENHANCE https aip baidubce com rest 2 0 image process v1 i
  • C++基础-一维和二维数组详解

    目录 定义 一维数组 二维数组 定义 数组是相同类型的对象序列 它们占据一块连续的内存区 一维数组
  • 《计算机是怎样跑起来的》读书笔记

    目录 1 计算机组成 1 CPU Central Processing Unit 中央处理器 2 硬盘 Hard Disk Drive 3 内存 Memory 4 输入与输出设备 I 0设备