简单记录-慕课网-编程必备基础 计算机组成原理+操作系统+计算机网络
编程必备基础知识-计算机组成原理-概述篇
回头补补计算机基础知识的理论
计算机基础知识-计算机组成原理、操作系统、计算机网络
目录
计算机组成原理-概述篇
计算机的发展简史
计算机的分类
计算机的体系结构
计算机的层次与编程语言
计算机的计算单位
计算机的字符与编码集
计算机发展简史
计算机发展的四个阶段
微型计算机的发展历史
计算机发展的四个阶段
根据计算机使用物理电子器件,可将计算机发展分为如下四个阶段,
第一阶段:电子管计算机
1946 - 1958
第二阶段:晶体管计算机
1958 - 1964
第三阶段:集成电路计算机
1964 - 1971
第四阶段:超大规模集成电路计算机
1971 - 现在
电子物理元件
第一个阶段:电子管计算机
第二次世界大战是电子管计算机产生的催化剂
(英国为了解密德国海军的密文)
- 战争使用了飞机和火箭
- 打得准则需要计算射击参数
- 射击参数需要几千次运算才能计算出来
没有计算机前,需要人来手算
人算不仅慢,还是会出错的。
最著名的电子管计算机就是ENIAC。它的诞生源于二战,是一个庞然大物,其拥有
1)18000多个电子管,
2)运行耗电量150千瓦,
3)重量达30吨,占地1500平方英尺。
ENIAC
这一阶段的计算机特点:
-
集成度小,空间占用大
-
功耗高,运行速度慢
-
操作复杂,更换程序需要接线
现在我们使用的计算机中,已经看不到电子管的身影了
第二个阶段:晶体管计算机
贝尔实验室的三个科学家发明了晶体管
1947年12月,美国贝尔实验室的肖克利、巴丁和布拉顿组成的研究小组,研制出一种点接触型的锗晶体管。晶体管的问世,是20世纪的一项重大发明,是微电子革命的先声。晶体管出现后,人们就能用一个小巧的、消耗功率低的电子器件,来代替体积大、功率消耗大的电子管了。晶体管的发明又为后来集成电路的诞生吹响了号角。晶体管的发明是划时代的,1956年的诺贝尔物理奖,就授予了这三名科学家。
1957年,美国制成全部使用晶体管的计算机,第二代计算机诞生了。晶体管比电子管功耗小、体积小、重量轻、工作电压低、工作可靠性好。用晶体管取代电子管,使计算机体积大为缩小,计算机的运算速度提高到每秒几十万次,比第一代电子管计算机提高了近百倍。
相比电子管,晶体管拥有更小的体积,更低的能耗,更高的计算效率。如下所示就是晶体管:
晶体管计算机
TX-0
PDP-1
、
第二个阶段:晶体管计算机特点:
- 集成度相对较高,空间占用相对小
- 功耗相对较低,运行速度较快
- 操作相对简单,交互更加方便
第三个阶段:集成电路计算机
德州仪器的工程师发明了集成电路(IC),集成电路(IC)顾名思义,就是把一定数量的常用电子元件,如电阻、电容、晶体管等,以及这些元件之间的连线,通过半导体工艺集成在一起的具有特定功能的电路。
集成电路计算机
- 计算机变得更小
- 功耗变得更低
- 计算速度变得更快
计算机具备进入千家万户的条件
计算机具备进入千家万户的条件
IBM推出兼容的产品System/360 操作系统的雏形
操作系统也出来了
第四个阶段:超大规模集成电路计算机
- 1)一个芯片集成了上百万的晶体管
- 2)使得计算机的速度更快,体积更小,价格更低,更能被大众接受,
- 3)用途也丰富了起来,包括文本处理、表格处理、高交互的游戏与应用等。
PC时代来了
个人计算机
第五个阶段 未来的计算机
生物计算机
以蛋白质分子作为主要原材料
生物计算机
人体
生物计算机
- 体积小,效率高
- 不易损坏,生物级别的自动修复
- 不受信号干扰,无热损耗
量子计算机
遵循量子力学的物理计算机
量子计算机
- 2013年5月,谷歌和NASA发布D-Wave-Two
- 2017年5月,中国科学院宣布制造出光量子计算机
- 2019年1月,IBM展示了世界首款商业化量子计算机
腾讯在2017年就组建了量子实验室
阿里巴巴在2017年成立了达摩院
突破,非常有可能出现的计算机
微型计算机的发展历史
微型计算机的发展通常以CPU的发展为基点。受限于性能
好多年
著名的定律——摩尔定律:集成电路的性能,每18~24个月就会提升一倍。
失效 密集 热损耗
进入21世纪后,随着芯片的发展,芯片里面的电路越来越复杂,越来越密集,并且热损耗也越来越高,我们没有办法解决这样的问题,因此,该定律慢慢失效了。
受限于单核CPU的性能瓶颈,于是来发展多核CPU。
单核CPU 多核CPU
CPU的发展历史
计算机发展简史
计算机发展的四个阶段
微型计算机的发展历史
计算机的分类
超级计算机
-
功能最强、运算速度最快、存储容量最大的计算机
-
多用于国家高科技领域和尖端技术研究,包括天气预报、海洋监测、生物制药、科学计算、核聚变核裂变模拟、加密解密算法的运算、军事战争模拟等等。
用来衡量超级计算机运算速度的单位是TFlop/s,1TFlop/s = 每秒一万亿次浮点计算。
国家实力
截至2018年11月,全世界超级计算机排名前三的见下图。
为什么神威太湖之光的处理器个数远超Summit,但算力还没有Summit高呢?这是因为神威太湖之光采用的全部是拥有自主知识产权的国产芯片。
五倍处理器数量 一半的峰值速度
还没超越
天河二号在广州
大型计算机
- 又称大型机、大型主机、主机等
- 具有高性能,可处理大量数据与复杂的运算,像银行金融交易的数据、证券交易所的数据处理、人口普查、企业资源规划等一些项目里面都会使用到大型计算机
- 在大型机市场领域,IBM占据着很大的份额
IBM
COBOL编程语言
提到大型机,不得不提到的就是——去“IOE”行动。
什么是IOE?
- I——IBM(国际商业机器公司),是服务器提供商,
- O——Oracle(甲骨文),是数据库软件提供商,
- E——EMC(易安信),则是存储设备提供商。
去IOC行动
服务器 数据库 存储设备 软件到硬件
1、去“IOE”是阿里巴巴提出的概念
2、代表了高维护费用的存储系统
3、不够灵活,伸缩性弱
IOE三者构成了一个从软件到硬件的企业数据库系统。由这三驾马车构成的数据库系统在当时几乎占领了全球大部分商用数据库系统市场份额。除阿里巴巴这样需要大量数据运算的电商企业,其他如石油、金融行业也广泛地使用这套系统。
什么是去"IOE"?
它是阿里巴巴提出的概念。其本意是,在阿里巴巴的IT架构中,去掉IBM的小型机、Oracle数据库、EMC存储设备,代之以自己在开源软件基础上开发的系统。
运营成本太低 普通服务器代大型机,MySQL替换Oracle
美国的“八大金刚” 思科、IBM、谷歌、高通、英特尔、苹果、甲骨文、微软。
去“IOE”运动,阿里2008年提出 =》 阿里云2009年成立
为什么要去"IOE"?
因为IOE代表了高维护费用的存储系统,仅Oracle系统三年的销售价格就达到了八位数,且IOE系统伸缩性差,扩展性差,无法满足阿里日益增长的业务需要。
迷你计算机(服务器)
云厂商 云服务 构建在普通的服务器上的
迷你计算机
- 也称为小型机,普通服务器
- 不需要特殊的空调场所
- 具备不错的算力,可以完成较复杂的运算
制造
不像之前的超级计算机和大型计算机只有少数公司可以制造,服务器很多公司(像华为、浪潮、联想等)都可以制造。现代背景下,很多公司已经将传统的大型机替换成了普通服务器,服务器成为大规模企业计算的中枢。
云服务厂商(比如阿里云、腾讯云等),也是使用普通服务器来构建自己的云服务和数据中心的。
工作站
- 高端的通用微型计算机,提供比个人计算机更强大的功能
- 类似于普通台式电脑,体积较大,但性能强劲,主要用于图像处理、动画设计、计算机辅助设计及制造CAD/CAM等领域。
一般是专业用户使用
微型计算机
微型计算机
- 又称为个人计算机,是最普通的一类计算机,可以分为台式机、笔记本电脑、一体机等。
- 麻雀虽小,五脏俱全
从构成的本质上来讲,个人计算机与前面的分类无异,都包含了计算机所必备的一些硬件。
所以,我们在学习计算机的时候,只要对个人计算机进行研究,就能触类旁通,就可理解这里面所有的计算机分类了。因为我们平常学习中主要学习个人计算机PC相关理论。
计算机分为五类,分别是超级计算机、大型计算机、迷你计算机(普通服务器)、工作站、微型计算机(PC),其中,超级计算机、大型计算机、工作站,我们平常接触的比较少,而
迷你计算机(服务器)、微型计算机我们接触的多一些。迷你计算机是普通服务器,而微型计算机就是我们平常使用的个人计算机,
计算机的体系与结构
-
冯诺依曼体系
-
现代计算机的结构
冯诺依曼体系
用一句话来概括就是:将程序指令和数据一起存储的计算机设计概念结构
冯诺依曼体系
早期计算机仅含固定用途程序,怎么理解?举个例子:有个计算机它只能运行数学运算的程序,那么它就不能运行文字处理的软件,也不能拿来玩游戏,如果要让它能够进行别的功能,就需要改变计算机的程序,而在当时,所谓的重写程序并不是指现在的重新编译一个程序那么简单,而是必须更改电路或者说更改结构,甚至重新设计这个机器。
改变程序得更改结构、重新设计电路 难。
这样就很坑爹了啊,如果说计算机只能用来打游戏,不能用来写代码,或者说只能用来写代码,不能用来玩游戏,那么我们就不能先玩一会游戏再写一会代码了,这样子是非常不合理的。于是冯诺依曼就想着将程序存储起来,然后在设计底层硬件的时候,不再是设计专有的电路,而是设计一个通用电路,当我们需要运行某种程序的时候,我们先把这段程序翻译成电路能够理解的语言,然后让通用电路去执行相关的逻辑。
这就是冯诺依曼体系的核心概念——存储程序指令,设计通用电路。
把程序存储起来并设计通用电路
存储程序指令 设计通用电路
计算机领域巨大改变
改变程序 就编写一个程序
了解了冯诺依曼体系是怎样诞生的,如果能够理解冯诺依曼体系给计算机领域带来的巨大改变,我们就能明白冯诺依曼体系为什么这么重要了。由冯诺依曼体系所延伸的存储型计算机的概念,改变了之前糟糕的一切,皆由创造一种通用的指令集结构,并将所谓的运算转化为一串程序指令的运行,使整个计算机更有弹性。借助将指令当成一种特殊类型的计算数据,一台存储型的计算机可以轻易地改变其程序,并且在程序的控制下,改变运行的内容,改变的时候不需要重新设计电路,不需要重新改变计算机的结构,这就是冯诺依曼体系所带来的巨大贡献。
冯诺依曼体系计算机包含五大组件:
-
必须有一个存储器,用来存放程序和数据
-
必须有一个控制器,用来控制程序的流转和数据的输入运行,以及处理运算结果
-
必须有一个运算器,主要运行算数运算和逻辑运算,并将中间结果暂存到运算器中
-
必须有输入设备,用来将人们熟悉的信息形式转换为机器能够识别的信息形式,常见的有键盘,鼠标等
-
必须有输出设备,可以将机器运算结果转换为人们熟悉的信息形式,如打印机输出,显示器输出等
我们现在所使用的计算机,从本质上讲,都是冯诺依曼机,包括笔记本电脑、台式电脑、服务器等等。冯诺依曼体系的计算机,必须有以下的几点功能:
冯诺依曼机
- 能够把需求的程序和数据送至计算机中(由输入设备完成)
- 能够长期记忆程序、数据、中间结果及最终运算结果的能力(由存储器完成)
- 能够具备算术、逻辑运算和数据传送等数据加工处理的能力(由运算器、控制器完成)
- 能够按照要求将处理结果输出给用户(由输出设备完成)
冯诺依曼体系结构示意图:
CPU 存储器
CPU和存储器速率之间的问题无法调和
我们可以看到,存储器和CPU是分开的,这就导致一个问题:CPU和存储器速率之间的问题无法调和。因为CPU是高速运算的,处理速率极快,而存储器没有CPU快,到CPU的数据传输速度慢,这会导致CPU经常空转等待数据传输,这样子是非常浪费CPU资源的。
现代计算机的结构
改变 冯诺依曼瓶颈
CPU处理速度快 存储器传输速度慢
CPU经常空转等待数据传输
那么,如何解决冯诺依曼体系存在的性能瓶颈呢?
现代计算机的结构
现代计算机的结构
- 现代计算机在冯诺依曼体系结构基础上进行修改
- 解决CPU与存储设备之间的性能差异问题
现代计算机的结构示意图:
CPU = 运算器 + 控制器 + 存储器
可以看到,跟前面不一样的是,前面是CPU = 运算器 + 控制器 ,这里运算器、控制器和存储器组成了现代计算机的CPU。
存储器,从广义上,可以理解为存储数据的介质,包括磁带和硬盘。但是,这里的存储器主要是指围绕CPU的高速设备,包括寄存器和内存。现代计算机的结构,可以理解为以存储器为核心的结构。
冯诺依曼体系
现代计算机的结构
计算机的层次与编程语言
-
程序翻译与程序解释
-
计算机的层次与编程语言
程序翻译与程序解释
人类语言 计算机语言
计算机能够理解的语言
计算机是无法直接理解人类语言的,它只认识01010101…这样的比特位,因此,我们需要进行程序翻译或程序解析,把人类语言翻译或解析成计算机所能理解的语言。
需要进行语言之间的转换
较为高级的计算机语言L1
较为低级的计算机语言L0
程序翻译(编译)
什么是程序翻译?
编译
进行程序逻辑描述
计算机实际执行的语言
作为输入
假设我们现在使用较为高级的计算机语言L1来进行程序的逻辑描述,也就是说我们使用L1来编写程序,那么这个由L1编写的程序是怎么样执行的呢?当然了,它不是直接执行的,而是在执行的时候生成一个逻辑等价的由低级语言L0组成的程序,这个L0是计算机实际执行的语言,那么由L1生成L0这个过程,我们称之为程序翻译,用于生成L0的工具叫编译器。
程序解释
每一句 解释
为什么是程序解释呢?
同样的,假如我们使用L1来进行程序的逻辑描述,那么这个由L1编写的程序是怎样执行的呢?为了执行L1,我们还需要使用L0实现另外一个程序,这个程序把L1程序作为输入来进行执行,每一句L1程序会在L0所实现的程序里面进行等价的转换,然后执行,这就是程序的解析,其中,使用L0实现的程序叫做解释器。
简要的总结程序翻译和程序解析:
- 对于前面的两个例子而言,计算机执行的指令都是L0
- 翻译过程生成新的L0程序,解释过程不生成新的L0程序
- 解释过程由L0编写的解释器去解释L1程序
编译 解释
常见的编程语言
上层编译
对于常见的,我们还有Java和C#,它们又属于哪种语言呢?其实,严格的来说,它们既不属于翻译型语言,也不属于解释型语言,它们是属于翻译+解释型语言。
如何理解翻译+解释型语言呢?以Java程序的运行过程为例,Java程序首先会被编译器编译成JVM字节码,然后会通过解释器解释成机器码,从而被计算机执行。
计算机层次与编程语言
按层次来划分计算机系统的话,我们可以划分成七个层次。
硬件逻辑层
硬件逻辑层:
- 1)主要由门电路、触发器等逻辑电路组成,
- 2)属于电子工程的领域… 不会
编程语言是微指令集
微程序机器层
- 编程语言是微指令集
- 微指令所组成的微程序直接交由硬件执行,主要是由生产硬件的公司的程序员来编写的。
生成硬件 公司
传统机器层
-
编程语言是CPU指令集(机器指令)
-
编程语言和硬件是直接相关
程序员所用机器指令编写的程序可以交由微程序直接进行解析,而这里提到的指令集,存储在CPU内部,对CPU的运算进行指导和优化,拥有指令集,CPU就可以有效地运行。我们知道,CPU的制造商分为AMD和Intel两大阵营,那么这两大厂商生产的CPU最大的区别是——指令集不同,Intel的CPU所使用的指令集不适合AMD的CPU,同样的,AMD的CPU所使用的指令集也不适合Intel。除了不同厂商以后,同一个厂商也可以生产不同指令集的CPU
-
不同架构的CPU使用不同的CPU指令集
Intel AMD CPU 指令集
CPU指令集存储在CPU中
微指令 < 微程序 = 机器指令
- 一条机器指令对应一个微程序
- 一个微程序对应一组微指令
操作系统层
-
向上提供了简易的操作界面,使得用户能够容易地操作计算机
-
向下对接了指令系统,管理硬件资源
-
操作系统是在软件和硬件之间的适配层
操作系统对用户程序所使用机器的各种资源进行管理和分配,包括CPU、存储器等等。比如说,当一个用户程序需要运行的时候,首先由操作系统将其加载到内存中,这就需要操作系统首先为其分配内存空间来进行存储。再比如说,某一个程序需要使用某一个输出设备进行结果输出的时候,需要操作系统为其提供该设备的控制权。
汇编语言层
- 编程语言是汇编语言
- 汇编语言可以翻译成可直接执行的机器语言
- 完成这个翻译过程的程序就是汇编器
从这一层开始,它们所使用的编程语言就是人类比较容易理解的语言了。
汇编语言的例子
高级语言层
- 编程语言就是为广大程序员所接受的高级语言
- 高级语言的种类非常多,有几百种
- 常见的编程语言有Python、Java、C/C++、Golang等
应用层
面向问题的
- 计算机针对某种用途而设计的应用,像Word、Excel等。
计算机的层次与编程语言
复杂 过于
为什么要分层呢?
分层的目的是便于理解
计算机的计算单位
-
容量单位
-
速度单位
容量单位
在日常生活中,我们常说,768M的光盘、4G的内存、2T的硬盘,这里的M、G、T就是容量单位,那么它们各自代表着什么含义以及它们之间是如何换算的呢?
M G T
存储信息
容量单位
1)在计算机的物理层面,用高低电平记录信息,高电平代表1,低电平代表0,
2)计算机只认识0和1两种状态,这里的0或1我们就称为一个bit(比特位),
3)但是0/1能够表示的内容太少了,需要更大的容量表示方法
0/1称为bit(比特位)
字节:1Byte=8bits
1000000000Bytes
字节
表示计算机容量
比特位 字节
因此人们用8个比特位来表示一个字节(byte),一个字节等于八个比特位。随着计算机的发展,存储容量越来越大,用字节来表示容量也显得很不方便了,于是,出现了更高的容量单位。
1024=2^10
上图是现在常见常使用的计算机容量单位,可以看到,1Byte=8bit,1KB=1024Byte,1MB=1024KB … …
1G内存,可以存储多少字节的数据?可以存储多少比特数据?
1G=1024 ^ 3 Bytes=1024 ^ 3*8bits
为什么网上买的移动硬盘500G,格式化之后就只剩465G了?
硬盘商一般用10进位标记容量
500*1000 ^ 3 / 1024 ^ 3=465
速度单位
-
网络速度
-
CPU频率
网络速度
100M宽带
100M ??? 100M宽带
这里的100M并不是指容量 带宽
100M = 100M/S
装宽带的时候,我们常说50M宽带、100M宽带,这里的M不是容量单位,而是网络速度——带宽,单位是Mbps(兆位/秒),前面只是省略了bps。
为什么电信拉的100M光纤,测试峰值速度只有12M每秒?
网络常用单位为(Mbps)
100M/s = 100Mbps = 100Mbit/s
100Mbit/s=(100/8)MB/s=12.5MB/s
平常下载速度 MB/S 字节
一个字节 等于 八个位
MBPS
CPU速度
1)CPU的速度一般体现为CPU的时钟频率,也称为主频,
2)单位为赫兹(Hz),是评定CPU性能的重要指标,
3)主流CPU的时钟频率都在2GHz以上。
赫兹
赫兹是国际单位制中频率的单位,是每秒中的周期性变动重复次数的计量,当用来描述计算机的CPU时,表达的是高低电平每秒钟变换的次数,主频越高,一个时钟周期里面完成的指令数也越多,2GHz,就是说每秒高低电平变换20亿次。
高低电平
容量单位
速度单位
计算机的字符与编码集
- 字符编码集历史
- 中文编码集
字符编码集的历史
- ASCII码
- Extended ASCII码
- 字符编码集的国际化
ASCII码
美国信息交换标准代码 American Standard Code for Information Interchange
那它是怎么来的呢?
在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),假如,对于字符a,比尔盖茨想用0001来表示,而乔布斯想用0010来表示,那么他们在沟通交流的时候谁都无法理解对方的语言。因此,为了计算机能够互相通信而不造成混乱,就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。
标准ASCII码也叫基础ASCII码,使用7个比特位来表示所有的大写和小写字母,数字0到9、标点符号,以及在美式英语中使用的特殊控制字符,共定义了128(2的7次方)个字符。
- 使用7个bits就可以完全表示ASCII码
- 包含95个可打印字符
- 33个不可打印字符(包括控制字符)
33+95=128=2^7
下面我们通过一张表来了解部分ASCII码。
表中列出了常见字符的ASCII码,如:字母a表示为01100001、字符1表示为00110001…
Extended ASCII码
在计算机的早期,ASCII码就能满足特定人群的使用了,但是,随着计算机的发展以及计算机的普遍性,ASCII码逐渐不能满足人们的使用需求,比如一些数学符号以及一些国家的符号都无法表示。于是,人们对ASCII码进行了扩充,用8个比特位来表示一个字符,这就是拓展的ASCII码,拓展的ASCII码能表示256个字符。
ASCII很多应用或者国家中的符号都无法表示
Extended ASCII码
计算机的进一步发展
字符编码集的国际化
这里面包括了常见的数学运算符、带音标的欧洲字符以及其他常用符号、表格符号等。使用了拓展的ASCII码极大的补充了原来的码表,使得计算机能表达的内容越来越丰富。
字符编码集的国际化
随着计算机的进一步发展,越来越多的国家加入到了使用计算机的行列中,对字符编码集的要求也越来越高。
字符编码集的国际化
- 欧洲、中亚、东亚、拉丁美洲等国家语言多样性,语言丰富多样
- 语言体系不一样,不以有限字符组合的语言
- 尤其以中国、韩国、日本等的语言最为复杂
ASCII码表根本无法表达这些语言,这就迫切需要使用新的编码集,也就是字符编码集的国际化。
中文编码集
GB2312
GB2312是1980年制定的中国汉字编码国家标准,是我国最早最完备的一个编码集.
- 《信息交换用汉字编码字符集-基本集》
- 一共收录了7445个字符
- 包括6763个汉字和682个其他字符,一个汉字占用两个字节
GB2312需要多少个比特位?13位
一定的问题 不符合 国际的
GBK
由于GB2312不符合国际标准,中国的科学家在1995年推出了第二套完备的编码集——GBK。
GBK
- 《汉字内码扩展规范》
- 向下兼容GB2312,向上支持国际ISO标准
- 收录了21003个汉字,支持全部中日韩汉字
跨国使用有问题
GB2312和GBK都是比较完备的编码集,但是,它们只是一个本地化的编码,在中国使用是没问题的,但要跨国使用就有问题了。举个例子,一个中国人开发了一个网站,一个外国友人访问了这个网站,如果他们本地没有安装GB2312编码集或GBK编码集的话, 那么他们在访问网站网页的时候看到的会是乱码。因此,就需要一个全球统一的编码规范。
Unicode
Unicode
为了统一所有文字的编码,Unicode应运而生。Unicode是一个兼容全球的字符集,定义了世界通用的符号集,可以表达全世界所有的文字和字符。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
- Unicode:统一码、万国码、单一码
- Unicode定义了世界通用的符号集,UTF-*实现了编码
- UTF-8以字节为单位对Unicode进行编码
兼容全球的字符集:Unicode
Unicode
GBK 兼容 GB2312
我们平时用的UTF-8是其中一个编码规则,它以字节为单位对Unicode进行编码,平常写代码的时候都是推荐使用UTF-8编码。
- 中文Windows操作系统默认使用GBK编码
- 使用IDE编程时通常要设置成UTF-8编码