目前信息技术主要经历了互联网、移动互联网以及以大数据、云计算、人工智能和区块链为表明的新兴技术三个阶段。而5G网络的到来则会加速物联网、无人驾驶的应用场景落地。html
自从1945年至今,计算机经历了电子管计算机,晶体管计算机,集成电路计算机以及超大规模集成电路计算机。程序员
电子管计算机(1945年-1957年)
第二次世界大战是电子管计算机产生的催化剂,而最著名的电子管计算机是来自美国的埃尼阿克(ENIAC),这一时期的计算机有以下特色:数据库
晶体管计算机(1957年-1964年)
1948年,贝尔实验室的三个科学家发明了晶体管,相比电子管而言,晶体管有着更小的体积,更低的功耗以及更高的运算效率。而全世界第一台晶体管计算机TX-0诞生于麻省理工大学的MIT林肯实验室,而当时性能最高的计算机是PDP-1,它具有4K的内存,每秒能够执行20W条指令,同时配备了512*512的显示器,晶体管相对于电子管计算机而言:编程
集成电路计算机(1964年-1980年)
集成电路计算机出现的背景是德州仪器的工程师发明了集成电路(IC),windows
超大规模集成电路计算机(1980年-今)
CPU就是超大规模集成电路的典型产品,一个芯片能够集成上百万的晶体管。
并且超大规模集成电路计算机速度更快,体积更小,价格更低,更能被大众接受,同时在此阶段计算机用途也变得丰富起来,能够用于文本处理,表格处理以及高交互的游戏和应用。
而乔布斯在这个阶段推出了Apple,Apple二代。浏览器
将来计算机
随着计算机的发展,将来会出现生物计算机和量子计算机。安全
生物计算机是以蛋白质分支做为主要原材料,和人体结合起来进行相关的运算。并且生物计算机体积小,不易损坏,提供生物级别的自动修复以及不受信号干扰和无热损耗。服务器
量子计算机是遵循量子力学的物理计算机,目前量子计算机已经有相关的研究成果微信
微型计算机主要是计算机发展你的第三个阶段集成电路计算机开始。
微型计算机的发展主要是从计算能力区分的,在早期微型计算机是使用的单核CPU,而单核CPU的发展也经历了以下几个阶段网络
计算机能够按照不一样的用途分为超级计算机,大型机,小型机,我的计算机。
超级计算机
超级计算机是功能最强,运算速度最快,存储容量最大的计算机,主要用于国家高科技领域尖端技术研究,咱们使用每秒一万亿浮点数计算(1TFlop/s)指标来衡量超级计算机的性能。
若是想要了解超级计算机的排名,能够访问网站 https://www.top500.org/。
大型计算机
大型计算机又称为大型机、大型主机、主机等等,大型计算机具备高性能。可处理大量数据与复杂运算,应用场景一般是银行、证券等金融机构。在大型机市场领域,IBM占据着很大的份额。
因为大型机造价高昂,不够灵活,伸缩性弱,目前不少企业替换成小型机。
阿里巴巴在2008年发起去IOE行动,I就是IBM大型机,O就是商业数据库Oracle,E就是EMC存储,IOE表明了高成本,高维护费用的存储系统。去IOE就是将大型机换成了普通的服务器,将Oracle替换成了分布式的MySQL,去IOE行动直接驱动了阿里云的诞生。
服务器
服务器也被称为小型机,普通服务器,相对于大型机而言,不要特殊的空调场所,同时也具有不错的算力。常见的服务器厂商包括戴尔,联想,IBM。
普通服务器已经替代了传统的大型机,成为大规模企业计算机的中枢纽,好比国内的阿里云、腾讯云、华为云都是基于服务器构建的。
工做站
工做站是高端的通用微型计算机,能够提供比我的计算机更强大的性能,相似于普通台式电脑,体积大,性能强劲,例如Mac Pro。
微型计算机
微型计算机又称为我的计算机,是最普通的一类计算机,能够分为台式机、笔记本电脑、一体机,微型计算机是成本最低的,可是从构造本质来说,我的计算机与超级计算机、大型机、小型机、工做站没有区别。
日常开发人员一般接触的比较多的是微型计算机,例如笔记本、台式机,而运维人员一般接触的是服务器。
冯诺依曼体系就是将程序指令和数据一块儿存储的计算机设计概念结构。
早期的计算机仅能运行固定用途的程序,若是想要运行别的程序,必需要更改计算机结构、从新设计电路。而冯洛伊曼是把程序存储起来,并设计通用的电路。存储程序指令,设计通用电路。
冯诺依曼体系由如下部分组成
CPU是由运算器和控制器组成,而冯诺依曼结构是将存储器和CPU分开,会致使冯诺依曼瓶颈:CPU和存储器速率之间的问题没法调和,CPU常常空转等待数据的传输,这样没法充分利用CPU。
现代计算机结构由冯诺依曼结构基础之上进行修改,主要是解决CPU和存储器速度差别的问题:存储器、运算器和控制器集中在一块芯片上。
CPU:
现代计算机结构的运算器和控制器、存储器组成了CPU,主要功能负责数据的计算以及其余设备的控制,程序运行时CPU负责从内存中读取程序的指令和数据执行后将结果返回给内存或者是写入磁盘。
内存
冯诺依曼体系结构中的存储器就是指的内存和外存,其中内存是程序运行时的工做区,即程序运行时的指令和数据都会被加载到内存中,断电后内存的数据容易丢失,内存是编址存储的,一般32位操做系统只能寻址4G,而64位操做系统则会操过4G,一般按照计算机不一样的用途是16G-128G之间。
磁盘
磁盘是冯诺依曼体系结构中存储器的一种,负责永久性存储大容量的数据(TB甚至是PB级别),按照不一样的用途能够分为机械硬盘和固态硬盘两大类。
IO设备
顾名思义就是负责计算机数据的输入输出,经常使用的输入设备有鼠标、键盘,经常使用的输出设备有声卡、显卡。
网卡也是IO设备的一种,主要是负责数据在网络中的传输。
在后期程序排查异常时除了考虑程序自己的问题,还要考虑硬件问题,例如网络不通、磁盘存储空间以及内存运行空间不足等等。
每一个计算机组件的IO性能也各不相同,核心组件(CPU,内存,磁盘)都遵循容量越大,IO性能越差,以下图所示,汇总了它们的IO性能,在后期程序优化时,一般须要考虑时间和空间的问题。
开发者在购买笔记本或者台式机时,一般须要关注CPU,内存、磁盘以及显卡的相关配置。
和普通用户不一样,因为开发时须要安装许许多多相关的应用程序和配置各个集成开发环境,所以推荐购买高配置的电脑,若是你想购买MacBookPro,能够参考以下配置。
组件名称 | 配置 |
---|---|
CPU | i9 2.3HZ |
内存 | 32G |
磁盘 | 512SSD |
显卡 | Radeon pro Vega 20 |
若是你想购买运行Windows的笔记本,参考以下配置。
若是是想要成为软件开发人员,电脑最低配置不要低于Intel i7 CPU + 内存 16G+ 固态硬盘 256G,出色的硬件可以提升开发效率
计算机软件就是运行在硬件之上的各类应用程序。软件的出现改善了人和计算机的交互方式,软是由开发者编写的一系列计算机指令和不一样业务逻辑产生的数据所组成。
软件按照不一样的用途分类能够分为系统软件和应用软件。
系统软件:系统软件有Unix,Linux,macOS,Windows,Android,IOS,编译器、数据库等等。
应用软件:应用软件有淘宝、京东、微信、支付宝等等。
不一样平台的软件有不一样的交互方式:
服务器端:运维开发人员基于命令行的字符界面实现人机交互。
PC桌面端:开发人员、普通用户一般是基于图形化界面实现人机交互。
移动端:用户一般是经过语音,手势触控实现人机交互。
主流的操做系统(Windows,Linux(Ubuntu),MacOS)及大多数应用程序都提供了基于命令行和图形化界面两种交互方式,而移动端是采用手势触控、语音等进行交互。做为普通用户来说,图形化界面容易上手,并且交互效果更加直观。
可是做为一个程序员来说,应该去熟悉各个操做系统的命令行的使用,由于命令行相对图形化界面而言,绝大多数场景下使用更加高效。并且图形化界面本质是对命令行的封装,能用图形化界面实现的基本均可以采用命令行实现。并且在服务器端(CentOS,RedHat)基本上是不会安装图形界面。
Windows系统能够按下windows键而后输入cmd,以下图所示
文件目录相关
命令名称 | 功能描述 |
---|---|
dir | 列出当前目录列表 |
cd | 切换目录(只能在根盘符(例如C盘)内切换) |
md | 建立目录 |
rd | 删除空目录 |
echo | 输出提示信息 例如echo %PATH%查看环境变量 |
del | 删除文件 |
type | 显示文本文件内容 |
cls | 清除屏幕内容 |
exit | 退出终端 |
系统应用相关
命令名称 | 功能描述 |
---|---|
notepad | 记事本 |
calc | 计算器 |
mspaint | 画图 |
explore | 文件资源管理器 |
timedate.cpl | 日期和时间 |
cleanmgr | 磁盘清理 |
desk.cpl | 分辨率设置 |
powercfg.cpl | 电源设置 |
regedit | 注册表编辑器 |
msconfig | 系统配置 |
mstsc | 远程链接 |
firewall.cpl | 防火墙 |
appwiz.cpl | 添加或修改程序 |
tasklist | 查看进程列表 |
taskkill /f /im process.exe | 关闭指定进程 |
msinfo | 系统信息 |
sticky notes | 便签 |
ipconfig | 查看ip |
winver | 查看windows版本 |
dxdiag | DirectX诊断工具 |
聊天:应用程序监听键盘输入的数据,放到内存,而后传给网卡,经过网络传递给另一个网卡,再从网卡传到内存,显示在显示器上。
听音乐:应用程序将音乐数据加载到内存以后,而后写到声卡上。
看视频:应用程序将视频数据加载到内存,而后写到显卡上。
读文档: 应用程序将磁盘中的文档数据加载到内存后显示到屏幕上。
写文档: 应用程序将内存中的数据写入到磁盘上。
以下列表展现了平常使用的开发工具和应用程序
操做系统(Operating System)是实现通用目的的程序,其内核(Kernel)负责和底层硬件交互,应用软件运行在操做系统之上。所以操做系统起着承上启下的做用,操做系统提供的功能以下
目前(2019/7/15)主流的操做系统包含运行在桌面端的Windows10,macOS10.14,Ubuntu18.04以及移动设备的Android 9, IOS12和服务器端的CentOS7.6,Ubuntu Server。
ABI(Application Binary Interface)描述了应用程序与OS之间的底层接口,容许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行,ABI涉及了程序的各个方面,好比:目标文件格式、数据类型、数据对齐、函数调用约定以及函数如何传递参数、如何返回值、系统调用号、如何实现系统调用等。
API(Application Programming Interface)定义了源代码和库之间的接口,所以一样的源代码能够在支持这个API的任何系统中编译。
开发人员在编写应用程序时,一般都是借助API接口实现通用目的的功能,而应用程序编译后,经过ABI接口连接生成可执行的程序格式后运行。
因为高级编程语言和计算机底层语言是互不相通的,计算机最底层只能识别01010这种二进制的机器指令,所以须要使用工具进行语言之间的转换。这个就是程序编译或者解释的由来。
为了理解程序编译和程序解释,这里引入两种语言,分别是高级计算机语言L1,以及低级计算机语言L0。
程序编译
开发人员使用高级编程语言L1编写的应用程序经过编译器生成成计算机底层可以识别的低级语言L0,L0就是计算机实际执行的语言,而编译器生成的计算机底层识别的二进制机器指令过程就是程序编译。常见的编译型语言有C/C++/Objective-C/Go
程序解释
首先使用L0语言实现另一个程序,也就是解释器,而后将开发人员使用高级语言L1编写的应用程序做为输入,每一句L1编写的程序都会在L0中做为等价的转换而后执行,解释的过程就是由L0编写的解释器去解释L1程序。常见的解释型语言有PHP,Python,JavaScript。
而Java和C#属于编译+解释型语言,以Java为例子,Java程序在运行以前首先被编译成Java字节码,而后在JVM虚拟机上解释运行。
计算机的层次由上到下能够分为以下几个层次:
应用层
高级语言层
高级语言就是用来开发平常应用的计算机语言,常见的高级语言有C/C++/Java/Python/Go等等。
汇编语言层
汇编语言也是一种编程语言,汇编语言能够编译成直接执行的机器语言,而完成编译的过程就是汇编器,从汇编语言开始使用的语言就是人类比较容易理解的语言。
操做系统层
操做系统主要是用于给应用软件提供运行平台,同时管理和调度硬件资源。位于软件和硬件的适配层。
传统机器层
编程语言主要是CPU指令集(机器指令),而开发人员使用机器指令编写的程序能够交由微程序直接进行解析,指令集存储在CPU内部,对CPU的运算进行指导和优化应用程序。CPU能够经过指令集运行程序以及进行相应的逻辑处理。
传统机器层的编程语言和硬件直接相关,可是因为不一样架构的CPU使用的是不一样的CPU指令集,也就是英特尔的CPU上运行的程序不能在AMD的CPU上运行。
微程序机器层
编程语言主要是微指令集,微指令所组成的微程序直接交由硬件执行。主要由硬件厂商的开发人员编写。一条机器指令对应一个微程序,一个微程序对应一组微指令,微程序=机器指令。
硬件逻辑层
硬件逻辑层主要有门电路、触发器等逻辑电路组成,所属电子工程领域。
传统机器层、微程序机器层和硬件逻辑层属于实际机器层,和物理设备相关。
操做系统层、汇编语言层、高级语言层和应用层称为虚拟机器。而操做系统层、汇编语言层、高级语言层统称为系统软件,应用层主要是完成平常任务的各类程序,例如Office,微信等等。
任何事物都是从无到有,逐步发展壮大起来的,编程语言也是同样。
计算机程序设计语言经历了机器语言到汇编语言和高级程序设计语言三个阶段,其特色是使得程序员用编程语言开发、测试、部署应用程序愈来愈方便、高效。可是是以牺牲效率为代价,可是随着计算机硬件的发展,绝大多数应用场景的效率损失能够忽略不计。
机器语言
计算机发展的最先期,程序员编写程序采用二进制的指令(010010101)来实现的,而每种CPU都有各自不一样的指令系统(SPARC/Intel X86/ARM),所以在不一样的机器上使用不一样的机器语言实现。其特色是性能特别高效,而面向机器编程也就意味着不能移植,须要手动处理底层硬件的差别性,并且二进制的指令难以理解和维护。
汇编语言
随着时代和计算机技术的发展,汇编语言和编译器的出现解决了机器语言须要记住很是多的二进制机器指令的难题,可是仍是没有从根本上解决移植性的问题,只是将机器指令转换为易懂的英文单词,而后由编译器编译成机器指令,由于计算机终归揭底只能识别0001110100110机器指令,并且汇编语言是面向机器的,不一样机器(SPARC/Intel X86/ARM)的汇编指令是不相同的。
高级程序设计语言
高级程序设计语言的高级之处体如今开发人员在编写程序时无需关心计算机底层硬件差别而只须要专一于业务模块实现便可。甚至是能够实现 一次编译,处处运行,这里以Java为例子:经过实现不一样平台的JVM,编译生成的字节码文件能够在任意的JVM上运行。
高级语言一般都须要编译器或者是解释器将源码编译或者解释后执行。
高级语言主要分为面向过程和面向对象两种,其中典型的面向过程语言就是C,面向对象的编程语言有Java,C++,Python等等。
若是想知道目前主流的编程语言有哪些,能够访问tiobe 首页获取编程语言排行榜,以下图所示,从Tiobe官网获取最新(2019年6月)的编程语言排行榜的前20名,
根据Tiobe排行榜得知,Java/C/Python 分别排在前三名, 随后紧跟着C++,VB.NET,C#,JavaScript,PHP等等,每种语言都有不一样的应用场景和擅长的领域,以下表格所示。
编程语言 | 应用场景 |
---|---|
C | 硬件驱动、操做系统、系统软件 |
C++ | 系统软件、网络通信、科学计算、游戏 |
C# | Windows应用,Web应用、游戏 |
Java | 大型互联网应用(淘宝、天猫),Android,大数据 |
Python | 人工智能、机器学习、自动化运维、数据分析 、图形处理 |
PHP | 中小型网站开发 |
Objective-C/Swift | macOS,iPhone,iPad应用开发 |
JavaScript | 浏览器端、服务端、PC桌面 |
Go | 高并发、区块链 |
在购买电脑时,一般会选择高配置的内存、硬盘。例如最新款(2019)15寸的macBookPro已经能够选配32G内存和4T的固态硬盘,而这里的32G和4T就是经常使用的容量单位。
在物理层面,咱们使用高低电平来记录信息,一般使用高电平表示1,低电平表示0,所以在计算机底层只能认识0,1两种状态。而0,1可以表示的内容太少了,迫切须要更大的容量表示方法,所以诞生了字节(Byte),千字节(KB),兆字节(MB),吉字节(GB),太字节(TB),拍字节(PB),艾字节(EB),它们之间的换算关系以下所示
1EB=1024PB
1PB=1024TB
1TB=1024GB
1GB=1024MB
1MB=1024KB
1KB=1024B
1Byte=8bit
位(bit)是最小的计算机容量单位,一般用于门电路。
而字节(Byte)表示网络传输,文件大小,是最基本的容量单位。
兆字节(MB)表示网速的容量单位
吉字节(GB)一般用于表示计算机内存、磁盘的容量单位
太字节(TB),拍字节(PB)一般是用于表示云硬盘的容量单位
艾字节(EB)一般是用于表示数据中心的容量单位
如今一般笔记本的内存一般是8G,16G,32G,64G等等,而运行在笔记本之上的操做系统广泛都是64位的,由于32位系统只能使用4G内存,下面是4G的内存换算
4G=2^2 * 2^10 * 2^10 * 2^10 =4*1024*1024*1024=2^32
在购买内存或者买移动硬盘时,一般使用的存储单位就是GB或者是TB,
可是在买4T的移动硬盘时,实际的可用容量却只有3T多,由于计算机的存储单位是以2的10次方(即1024)换算,而硬盘厂商们是以1000为换算单位。
4T的硬盘换算成位以下所示
4T=4*1024GB*1024MB*1024KB*1024B*8bit
而硬盘厂商的实际容量
4T=1000*1000*1000*1000*8
所以实际的可用容量是
4*1000*1000*1000*1000/1024/1024/1024/1024≈3.63T
而在一些互联网巨头(例如国内的BAT,国外的亚马逊、苹果、微软、谷歌,脸书)公司中,可能使用到比TB更大的海量数据,也就是PB或者EB,它们的换算单位以下所示。
1PB=1024TB
1EB=1024PB
网络经常使用的单位是Mbps
而网络带宽提供商(例如长城宽带)声称的百兆带宽其实是100Mbit/s,可是100M光纤测试的峰值速度只会有12MB/s,它们之间的换算是100Mbit/s=(100/8)MB/s=12.5MB/s。
CPU的速度通常是由CPU的时钟频率所体现的,而时钟频率的单位是赫兹(HZ),目前主流的CPU时钟频率通常都在2GHz以上,而赫兹(Hz)其实就是秒分之一,也就是每秒钟的周期性变更重复次数的计量。
2GHz=21000^3Hz=2100010001000=20亿,也就是说2GHz的CPU每秒能够变化20亿次。
在计算机底层(内存、硬盘)都是使用01001二进制的方式存储数据,而字符编码集是描述了计算机数据(例如字符数据)和底层二进制数据的对应关系,例如在ASC||码中字符a对应的十进制整数是97,字符A对应的十进制整数是65。
ASC||码
因为计算机最先是诞生在英美,所以最先的字符集是ASC||,用于表示平常开发中经常使用的大小写字母以及经常使用的符号,使用7bits表示,包含95个可打印字符课33各个不可打印字符(包括控制字符),95+33=128,即2的7次方。
可扩展的ASC||码
随着计算机的发展以及逐渐普及,ASC||码在不少应用或者国家中的符号没法表示,例如数学符号"≠,≥,≈,π",所以对ASC||进行扩充,由原来的7bit扩充到8bits,所以能够表示256个字符。扩展的运算符增长了数学运算符、带音标的欧洲字符以及其余经常使用符、表格符等等。
1.6.2.3 Unicode
随着计算机的进一步发展。愈来愈多的国家开始使用使用计算,而对于欧洲、中亚、拉丁美洲国家的语言多样性,因为语言体系不同,不以有限字符组合的语言,而中国、韩国、日本的语言最为复杂。
Unicode定义了世界通用的符号集,能够表示世界上全部的国家、全部语言的文字、符号,使用UTF-8,UTF-16,UTF-32实现了编码。
UFT-8:一种变长的编码方案,使用 1~6 个字节来存储;
UFT-32:一种固定长度的编码方案,无论字符编号大小,始终使用 4 个字节来存储;
UTF-16:介于 UTF-8 和 UTF-32 之间,使用 2 个或者 4 个字节来存储,长度既固定又可变。
1980年国内发布了中文编码集 GB2312,一共收录了7445个字符,包含6763个汉字和682个其余符号,可是GB2312不符合国际标准,后来在1995年推出了GBK编码,向下兼容GB2312,向上支持国际ISO标准,GBK收录了21003个汉字,支持所有中日韩汉字。
可是GBK,GB2312都只是本地化的编码集,若是中国人使用GBK或者GB2312开发了一个网站程序,被国外的用户访问了,可是国外的用户不支持GBK或者GB2312,那么看到的网站内容就是乱码。
在国内,Windows系统的默认编码是GBK编码,而平常开发中最常使用的是UTF-8字符集。