一、计算机组成
**一个完整的计算机系统有硬件系统和软件系统组成。**
1.1硬件系统
硬件系统主要可以分为主机和外设,是指构成计算机系统的物理实体,它们主要由各种各样的电子器件和机电装置组成。从ENIAC(世界上第一台计算机)到目前最先进的电脑,硬件系统的设计采用的都是冯·诺依曼体系结构,如下所示:
(1)运算器: 负责数据的算术运算和逻辑运算,即数据的加工处理;
(2)控制器: 计算机的中枢神经,协调计算机各部分组件工作以及内存和外设的访问;PS:运算器和控制器统称为中央处理器,即CPU
(3)存储器: 实现记忆功能的部件,用来存储程序、数据、命令和各种信号等信息,并在需要时提供这些信息;
(4)输入设备: 实现将程序、原始数据、文字、字符、控制命令或现场采集的数据等信息输入到计算机中;
(5)输出设备: 实现将计算机处理后生成的中间结果或最终结果输出,包括各种数据符号、文字和控制信号等信息;
1.2软件系统
软件系统主要可以分为系统软件和应用软件,是指保证计算机正常运行所需的各种程序,是我们编程实践的主要对象,组成如下:![](https://img.haomeiwen.com/i22917235/7adba4ec7eff0728.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/992/q/50)
系统软件:保证计算机硬件的正常工作和性能得到发挥,并且为计算机用户提供一个直观、友好和方便的使用界面。
(1)操作系统: 方便用户控制和管理计算机软硬件资源的系统软件,功能复杂,是所有软件正常运行的基础和核心;
(2)编译程序: 也叫语言处理程序,作用是把程序员使用各种编程语言,如Java和Python等所编写的程序,翻译成计算机可执行的机器语言。
应用软件:应用软件是计算机为满足不同用户的需求而提供的那部分软件,它可以拓宽计算机系统的应用领域,方法硬件的性能。
(1)社交办公类: 微信、QQ、WPS、腾讯会议、钉钉、陌陌等;
(2)休闲娱乐类: QQ音乐、腾讯视频、Steam、欢乐斗地主等;
二、程序运行机制
机器语言也叫机器码,是可以通过CPU进行分析和执行的指令集。计算机只能识别0和1的机器码,不能接收类似于汉语、英语或其它的人类语言。因此,为了实现人类和计算机的交互,各种编程语言应运而生,如C++、Java、PhP和Python等。
2.1编译型和解释型
分析:计算机可以直接识别下面这段Python代码吗?
分析:在控制台输出以下Python代码,计算机可以直接处理吗?
print("Hello world!") # print()为Python中的内置函数,主要用于输出括号内的内容,类似于Java中的System.out.println("Hello world!")
显然,上述代码主要由英文字母和标点符号组成,但前面已经说过,计算机只能识别机器码(0和1),即它本身压根就不认识这段代码。
那么,我们是如何通过代码控制计算机进行工作的?
人机交互的过程就像一个当地人与一个外国人进行交流时一样,如果双方想要理解彼此的想法,就需要一个中间介质,它可以通过某种方式把对方的语言转换成自己可以理解的语言,反之亦然。因此,计算机如果想要理解我们编写的代码,就需要将其转换为自己可以识别的机器码,而根据转换过程,编程语言又被分为编译型和解释型。
编译型: 编译型语言可以直接将代码转为计算机可以识别并执行的机器码,如C++。
解释型:解释型语言先将代码转换为字节码,然后再将其翻译成计算机可识别的机器码,如Python。
2.2计算机处理程序的流程
1、用户打开程序,程序开始执行;
2、操作系统将程序内容和相关数据送入计算机内存;
3、CPU根据程序内容从内存中读取指令;
4、CPU分析、处理指令,并为下一条指令做好准备;
5、读取下一条指令分析并处理,如此循环往复直至处理完程序中的全部指令,最后将计算结果放入指令指定的存储器地址中;
2.3 计算机语言发展史
算法是计算机的灵魂,而编程语言是使得计算机具有灵魂的工具。伴随着计算机硬件的发展,计算机编程语言也历经了从低级到高级的演变,而每一次改变的核心思想就是“让人更容易编程”。计算机硬件的速度越快、体积越小、成本越低,应用到人类社会的场景就会越多,那么所需要的算法就会越复杂,也就要求计算机编程语言越高级。
机器语言:相当于人类的的原始阶段;
机器语言由数字组成所有指令。当让你使用数字编程,写几百个数字、甚至几千个数字,每天面对的是纯数字,可以大胆预测:“程序员群体100%会有精神问题”。机器语言通常由数字串组成(最终被简化成二进制0和1),对于人类来说,机器语言过于繁琐。使用机器语言,人类无法编出复杂的程序。如下为一段典型的机器码:
0000, 0000, 000000010000代表 LOAD A,
0000, 0001, 000000010000代表 LOAD B,
汇编语言: 相当于人类的手工业阶段;
为了编程的方便,以及解决更加复杂的问题,程序员开始改进机器语言,使用英文缩写的助记符(单词)来表示基本的计算机操作。这些助记符构成了汇编语言的基础;汇编语言虽然能编写高效率的程序,但是学习和使用都不是易事,并且很难调试。另一个复杂的问题,汇编语言以及早期的计算机语言(Basic、Fortran等)没有考虑结构化设计原则,而是使用goto语句来作为程序流程控制的主要方法。这样做的后果是:一大堆混乱的调转语句使得程序几乎不可能被读懂。对于那个时代的程序员,能读懂上个月自己写的代码都成为一种挑战。即使这样,汇编语言仍然应用于工业电子编程领域、软件的加密解密、计算机病毒分析等。
高级编程语言: 相当于人类工业阶段;
对于简单的任务,汇编语言可以胜任。但是,随着计算机的发展以及其渐渐渗透到了工作生活的方方面面,一些复杂的任务出现了,汇编语言就显得力不从心(应该说是程序员使用汇编语言解决复杂问题出现了瓶颈)。于是,出现了高级语言,如C++、Java等。语言越高级,越接近人的思维,使用起来就越方便。高级语言,尤其是面向对象的语言,如Java、Python等,使得编程的难度和门槛越来越低。目前以及可预见的未来,计算机语言仍然处于“第三代高级语言”阶段,高级语言允许程序员使用接近日常英语的指令来编写程序。例如,实现一个简单的任务:A+B=C , 使用机器语言、汇编语言和高级语言的的实现如下所示:
三、python语言的诞生与发展史
Python是一门动态数据类型、面向对象的解释型语言,主要用于人工智能的各个领域,如机器学习、爬虫与数据分析、深度学习、计算机视觉等。
TIOBE编程语言排行榜:
3.1诞生与发展
时代背景硬件限制
Python的作者,Guido von Rossum(吉多·范·罗苏姆),荷兰人。1982年,吉多从阿姆斯特丹大学获得了数学和计算机硕士学位。然而,尽管他算得上是一位数学家,但他更加享受计算机带来的乐趣。用他的话说,虽然拥有数学和计算机双料资质,他总趋向于做计算机相关的工作,并热衷于做任何和编程相关的事情。在那个时候,吉多接触并使用过诸如Pascal、C、Fortran等语言。这些语言的基本设计原则是让机器能更快运行。在80年代,虽然IBM和苹果已经掀起了个人电脑(personal computer)浪潮,但这些个人电脑的配置很低。比如早期的Macintosh,只有8MHz的CPU主频和128KB的RAM,一个大的数组就能占满内存。**所有的编译器的核心是做优化,以便让程序能够运行。为了增进效率,语言也迫使程序员像计算机一样思考,以便能写出更符合机器口味的程序。**在那个时代,程序员恨不得用手榨取计算机每一寸的能力。有人甚至认为C语言的指针是在浪费内存。至于动态类型,内存自动管理,面向对象…… 别想了,那会让你的电脑陷入瘫痪。
Shell: 本质是调用命令,它不是一个真正的语言;
他的另一个选择是shell。Bourne Shell作为UNIX系统的解释器已经长期存在。UNIX的管理员们常常用shell去写一些简单的脚本,以进行一些系统维护的工作,比如定期备份、文件系统管理等等。shell可以像胶水一样,将UNIX系统下的许多功能连接在一起。许多C语言上百行的程序,在shell下只用几行就可以完成。然而,shell的本质是调用命令,它并不是一个真正的语言。例如,shell没有数值型的数据类型,加法运算都很复杂。总之,shell不能全面调动计算机的功能。
ABC语言:可读易用,弊端明显;
与当时的大部分语言不同,ABC语言的目标是“让用户感觉更好”。ABC语言希望让语言变得容易阅读、使用、记忆和学习,并以此来激发人们学习编程的兴趣。
然而,ABC语言编译器需要很高的电脑配置才能运行,而这些电脑的使用者通常都精通电脑,所以他们更多的是关注程序的效率,而非它的学习难度。
Python孕育与成长: 介于C和Shell之间的简单易学、功能全面的语言;
1989年,为了打发圣诞节假期,吉多开始写Python语言的编译器。Python这个名字,来自吉多所挚爱的电视剧Monty Python’s Flying Circus。
他希望这个新的叫做Python的语言,能符合他的理想:介于C和shell之间,功能全面,易学易用,可拓展的语言。
1991年,第一个Python编译器诞生。
它是用C语言实现的,并能够调用C语言的库文件。从一出生,Python已经具有了:类,函数,异常处理,包含表和词典在内的核心数据类型,以及模块为基础的拓展系统。Python语法很多来自C,但又受到ABC语言的强烈影响。来自ABC语言的一些规定直到今天还富有争议,比如强制缩进,但这些语法规定让Python容易读。另一方面,Python聪明的选择服从一些惯例,特别是C语言的惯例,比如恢复等号赋值。
Python从一开始就特别在意可拓展性。Python可以在多个层次上拓展。从高层上,你可以直接引入.py文件。在底层,你可以引用C语言的库。Python程序员可以快速的使用Python写.py文件作为拓展模块。但当性能是考虑的重要因素时,Python程序员可以深入底层,写C程序,编译为.so文件引入到Python中使用。Python就好像是使用钢构建房一样,先规定好大的框架,而程序员可以在此框架下相当自由的拓展或更改。
最初的Python完全由吉多本人开发。Python得到吉多同事的欢迎。他们迅速的反馈使用意见,并参与到Python的改进。吉多和一些同事构成Python的核心团队。他们将自己大部分的业余时间用于hack Python。随后,Python拓展到研究所之外。*Python将许多技术层面上的细节隐藏,交给编译器处理,并凸显出逻辑层面的编程思考。*因此,Python程序员可以花更多的时间用于思考程序的逻辑,而不是具体的实现细节。这一特征吸引了广大的程序员,Python开始流行。计算机硬件越来越强大,Python又容易使用,所以许多人开始转向Python。
Python以及其标准库的功能强大,这些是整个社区的贡献。*Python的开发者来自不同领域,他们将不同领域的优点带给Python。*
Python语言以对象为核心组织代码,支持多种编程范式,采用动态类型,自动进行内存回收。Python支持解释运行,并能调用C库进行拓展。Python有强大的标准库。
Python崇尚优美、清晰、简单,是一个优秀并广泛使用的语言。Python在TIOBE排行榜中排行第八,它是Google的第三大开发语言,Dropbox的基础语言,豆瓣的服务器语言。
3.2 设计哲学
获取Python设计哲学: 成功安装Python软件后(下一个专题),打开任意一个编辑环境键入 `import this` 运行即可;
总结:简单优雅可扩展,实用扁平
3.3 优势与不足
优势:
1、简单易学可扩展: 阅读一个良好的Python程序就像欣赏一篇优美的文章一样,尽管它的要求非常严格,如强制缩进可提高代码的可读性。Python的这种伪代码本质使得我们可以更多地关注于解决问题的逻辑而非搞明白语言本身,
2、免费开源可移植: Python是FLOSS(自由/开放源码软件)之一,也就是说我们可以自由地发布这个软件的拷贝、阅读它的源代码 、对它做改动、把它的一部分用于新的自由软件中。由于其开源本质,Python可移植在许多计算机平台上,如Windows、Linux等。
3、面向对象: Python既支持面向过程的编程也支持面向对象的编程。在“面向过程”的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。与其它的编程语言如C++和Java相比,Python以一种非常强大又简单的方式实现面向对象编程,而封装、继承和多态三大特性则是它成"神"的关键。
4、动态语言: 动态语言,又称为弱类型语言,是指变量在创建时不需声明类型,具体类型根据指向的内存单元中的数据类型决定,即指向什么类型就是什么类型。相反,静态语言(强类型语言),定义变量时需要声明类型,变量指向的内存单元可存放的数据类型固定。例如,Python中定义一个整数变量为num = 10,而在Java中则为int num = 10;。总结:动态类型,指向可变,内存单元中的内容不可变;静态类型,指向不可变,内容可变。
5、解释型语言: 编译型语言,如C++写的程序可以从源文件(C++语言)转换到一个你的计算机使用的语言,即二进制代码(0和1)。这个过程通过编译器和不同的标记以及选项完成。当我们运行程序的时候,连接转载器软件把我们的程序从硬盘复制到内存中并且运行。而Python语言写的程序不需要编译成二进制代码。我们可以直接从源代码运行程序。在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器码并运行。由于只需要把我们的Python程序拷贝到另外一台计算机上,它就可以工作了,这也使得Python程序更加容易移植。
6、丰富的库: 包括Python自带的标准库和第三方库。其中Python的标准库可以帮助我们处理各种工作,包括正则表达式、文档生成、线程、数据库、HTML、GUI等。这被称作Python的“功能齐全”理念。除了标准库以外,Python也支持安装第三方库,如wxPython、Twisted和Python图像库等。
缺点: Python语言非常完美,没有明显的短板和缺点。唯一的不足就是执行效率慢,而这个是解释型语言所通有的,不过这一缺陷会随着计算机硬件性能的不断提升而弱化。
网友评论