计算机通识
教程地址:点击去往视频教程
在学编程之前,需要先了解一些计算机基本的知识。
1. 计算机组成
上图展示了计算机的重要组成,我们需要有以下认知:
- CPU是计算机的计算单元,类似于人类大脑
- 硬盘用于存储数据,是永久存储
- 内存也是用于存储数据,是临时存储
- 输入设备用于向cpu发起命令
- 输出设备则用于显示命令处理的结果(显示,打印等)
理解上述内容,对编程学习有什么帮助吗?
当我们书写了一段代码:
package main
import "fmt"
func main() {
fmt.Print("Hello Golang")
}
2
3
4
5
将其保存为一个文件main.go
。这个文件永久存储于硬盘
上。
当我们想要运行这段代码,需要在通过键盘
输入以下执行命令go run main.go
,并敲击回车,代表运行此命令,这个时候会发生什么事情呢?
这段代码会从硬盘
加载到内存
当中,CPU
会和内存
中的这段代码频繁沟通,直到处理完成。
如果你有一台电脑,那么你一般清楚你的电脑硬盘多大,内存多大,往往内存比硬盘小的多。
有些人可能会有疑问,为什么CPU不直接和硬盘进行交互呢?
这是因为CPU
运行效率非常高,但是其存储比较小
,不能一次性将数据都加载,所以需要一个媒介来进行数据交互,硬盘的读写效率比较低,内存的读写效率比较高,为了不浪费CPU的性能,我们选择让CPU和内存进行交互而不是硬盘。
需要记住,内存的读写效率高于硬盘,内存大小是有限的。
理解这个过程很重要,因为我们知道原来当我们书写的代码运行后,会加载到内存当中,这有助于我们理解编程中的一些知识,比如类型大小,栈,堆,内存泄漏,GMP等概念
通过这个流程可以简单理解下线程
,进程
,内核空间
,用户空间
。
请配合教学视频进行理解
2. 理解存储
内存是有大小的,当内存满了,也就意味着不能有新的程序运行,所以很多时候,我们会关心我们写的程序到底占用了多少内存,这就需要计量单位。
存储的最小单位为bit
,基本单位为byte
, 1byte=8bit
1bit只有两个值,0和1,所以1byte的范围为00000000-11111111
。
很明显这是二进制
,所以学编程之前,大家还需要有二进制的前置知识,这里我们不在另行讲解。
上述范围用十进制表示就是0-255(2^8-1)
在存储中,我们是以byte
为基本单位,除了byte
还有其他诸如KB
, MB
, GB
等,换算方式为:
- 1KB=1024byte
- 1MB=1024KB
- 1GB=1024MB
- 1TB=1024GB
- 1PB=1024TB
3. 高级语言
计算机本质上只能识别0
和1
,所以诞生了不同的指令,通过指令来对应不同的电路,这些指令集,我们称之为机器语言
或者说操作码(opcode)
,比如加法指令就是00000011。
二进制对我们来说,可读性太差,没法普及,所以就发明了汇编语言。
汇编语言是二进制指令的文本形式,与指令是一一对应的关系。比如,加法指令00000011写成汇编语言就是 ADD。
每一种 CPU 的机器指令都是不一样的,因此对应的汇编语言也不一样,比如X86架构,ARM架构。
为了让我们的程序能在不同的计算机上运行,并且更加易于阅读和编写,就诞生了高级语言
。
比如Java
,Go
,Rust
等这些语言都是高级语言。
倒转过来,所有的高级语言本质上都需要将代码翻译为对应的汇编指令,通过汇编指令对应操作码,CPU才能识别并执行
对于将写的代码翻译为汇编指令,不同的语言采用了不同的策略。
3.1 编译型和解释型
编译是把源代码的每一条语句都编译成机器语言,并最终生成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,在运行时会有很好的性能。
解释是只有在执行到对应的语句时才会将源代码一行一行的解释成机器语言,给计算机来执行,所以使用解释器来执行的语言也被称为动态语言。
举个现实中的例子,比如你现在想读一本英文书,但你自己又不懂英文,然后你去找了个英文翻译小姐姐来帮忙,翻译小姐姐给你提供了两种选择:
- 全本翻译:由翻译小姐姐帮你把整本书翻译完,完成校稿后给你一本翻译完成的中文书,在这个过程中翻译就会花费较长的时间,你阅读时就会很快、很轻松;
- 随身翻译:就是翻译小姐姐随时守在你身边,你想阅读那一句,他就给你翻译那一句,这这种方式翻译时很快,但对你来说,阅读就会花费较长的时间;
全本翻译
就是编译型语言采用的策略,随时翻译
就是解释型语言采用的策略。