文章目录
- 一、计算机组成
- 1.1 硬件系统
- 1.2 软件系统
- 二、程序运行机制
- 2.1 编译型和解释型
- 2.2 计算机处理程序的流程
- 2.3 计算机语言发展史
- 三、Python语言的诞生与发展史
- 3.1 诞生与发展
- 3.2 设计哲学
- 3.3 优势与不足
- 3.4 应用场景
- 四、结语
一、计算机组成
计算机已经成为我们这个时代的核心设备,我们无时无刻都需要它。它也已经不是人们印象中的台式机、服务器,已经演变成了我们身边的任何物体,如手机、平板电脑和笔记本,以及很多人主观上没有意识到,但实际设备内部确实包含“计算机”的设备,如电视机、微波炉、汽车,甚至小孩玩的智能机器人等。毫不夸张地说,计算机已经成为人身体的延伸,大脑的延伸,成为不可或缺的一部分。未来,计算机将真的进入人体、进入大脑,真正成为人体的一部分。比如,在科幻电影《黑客帝国》中的主角被超级针头插在颈部后方便可以实现快速学习,改变大脑神经网络,几秒成为功夫高手。计算机,俗称电脑(Computer),用于高速计算的电子机器,是20世纪最伟大的科学技术发明之一,可以进行数值计算和逻辑判断,同时还具有存储记忆和数据处理的功能。一个完整的计算机系统由硬件系统和软件系统组成,如下图所示:
1.1 硬件系统
硬件系统主要可以分为主机和外设,是指构成计算机系统的物理实体,它们主要由各种各样的电子器件和机电装置组成。从ENIAC
(世界上第一台计算机)到目前最先进的电脑,硬件系统的设计采用的都是冯·诺依曼
体系结构,如下所示:
- 运算器: 负责数据的算术运算和逻辑运算,即数据的加工处理;
- 控制器: 计算机的中枢神经,协调计算机各部分组件工作以及内存和外设的访问;
其中:运算器和控制器统称为中央处理器,即CPU
- 存储器: 实现记忆功能的部件,用来存储程序、数据、命令和各种信号等信息,并在需要时提供这些信息;
- 输入设备: 实现将程序、原始数据、文字、字符、控制命令或现场采集的数据等信息输入到计算机中;
- 输出设备: 实现将计算机处理后生成的中间结果或最终结果输出,包括各种数据符号、文字和控制信号等信息;
1.2 软件系统
软件系统主要可以分为系统软件和应用软件,是指保证计算机正常运行所需的各种程序,是我们编程实践的主要对象,组成如下:
- 系统软件: 保证计算机硬件的正常工作和性能得到发挥,并且为计算机用户提供一个直观、友好和方便的使用界面。
- 操作系统: 方便用户控制和管理计算机软硬件资源的系统软件,功能复杂,是所有软件正常运行的基础和核心;
- 编译程序: 也叫语言处理程序,作用是把程序员使用各种编程语言,如Java和Python等所编写的程序,翻译成计算机可执行的机器语言。
- 应用软件: 应用软件是计算机为满足不同用户的需求而提供的那部分软件,它可以拓宽计算机系统的应用领域,方法硬件的性能。
- 社交办公类: 微信、QQ、WPS、腾讯会议、钉钉、陌陌等;
- 休闲娱乐类: 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 计算机处理程序的流程
- 用户打开程序,程序开始执行;
- 操作系统将程序内容和相关数据送入计算机内存;
- CPU根据程序内容从内存中读取指令;
- CPU分析、处理指令,并为下一条指令做好准备;
- 读取下一条指令分析并处理,如此循环往复直至处理完程序中的全部指令,最后将计算结果放入指令指定的存储器地址中;
2.3 计算机语言发展史
算法是计算机的灵魂,而编程语言是使得计算机具有灵魂的工具。伴随着计算机硬件的发展,计算机编程语言也历经了从低级到高级的演变,而每一次改变的核心思想就是“让人更容易编程”。计算机硬件的速度越快、体积越小、成本越低,应用到人类社会的场景就会越多,那么所需要的算法就会越复杂,也就要求计算机编程语言越高级。最初重达几十吨但一秒只能运算5000次的ENIAC,只能做非常小的应用,如弹道计算。如今,任何一个人的手机运算能力都可以秒杀那个年代地球上所有计算机运算能力的总和。越容易使用的语言,就有越多人使用;越多人使用,就有越多人协作;越多人协作,就可以创造越复杂的物体。现代社会,一个软件动辄几十或几百人、甚至几千人协作也成为可能,这自然就为开发复杂软件提供了“人力基础”。这是一个人类普遍的社会现象,越容易使用的工具,通过使用数量,通过大量人的协作,彻底改变某个行业甚至人类社会。未来三十年必将是软件人才的世界,除普通软件,大量人工智能软件,如自动驾驶、机器人保姆以及机器人女友都会进入我们的生活,甚至计算机技术和基因工程结合以实现长生不老,感兴趣的可以阅读一下《未来简史: 从智人到智神》。
- 机器语言: 相当于人类的的原始阶段;
机器语言由数字组成所有指令。当让你使用数字编程,写几百个数字、甚至几千个数字,每天面对的是纯数字,可以大胆预测:“程序员群体100%会有精神问题”。机器语言通常由数字串组成(最终被简化成二进制0和1),对于人类来说,机器语言过于繁琐。使用机器语言,人类无法编出复杂的程序。如下为一段典型的机器码:
0000
,
0000
,
000000010000
代表 LOAD A, 16
0000
,
0001
,
000000010000
代表 LOAD B, 16
0000,\ 0000,\ 000000010000 \text{代表 LOAD A, 16} \\ 0000,\ 0001,\ 000000010000 \text{代表 LOAD B, 16}
0000, 0000, 000000010000代表 LOAD A, 160000, 0001, 000000010000代表 LOAD B, 16
- 汇编语言: 相当于人类的手工业阶段;
为了编程的方便,以及解决更加复杂的问题,程序员开始改进机器语言,使用英文缩写的助记符(单词)来表示基本的计算机操作。这些助记符构成了汇编语言的基础,如:LOAD、MOVE
之类,这样人更容易记忆和使用。识别成百上千个单词,总比成百上千个数字,感觉会好很多。汇编语言相当于人类的手工业社会,需要技术极其娴熟的工匠,但是开发效率也非常低。汇编语言虽然能编写高效率的程序,但是学习和使用都不是易事,并且很难调试。另一个复杂的问题,汇编语言以及早期的计算机语言(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: 本质是调用命令,它不是一个真正的语言;
这种编程方式让吉多感到苦恼。吉多知道如何用C语言写出一个功能,但整个编写过程需要耗费大量的时间,即使他已经准确的知道了如何实现。他的另一个选择是shell。Bourne Shell
作为UNIX系统
的解释器已经长期存在。UNIX的管理员们常常用shell去写一些简单的脚本,以进行一些系统维护的工作,比如定期备份、文件系统管理等等。shell可以像胶水一样,将UNIX系统下的许多功能连接在一起。许多C语言上百行的程序,在shell下只用几行就可以完成。然而,shell的本质是调用命令,它并不是一个真正的语言。例如,shell没有数值型的数据类型,加法运算都很复杂。总之,shell不能全面调动计算机的功能。
- ABC语言: 可读易用,弊端明显;
吉多希望有一种语言,这种语言能够像C语言那样,能够全面调用计算机的功能接口,又可以像shell那样,可以轻松的编程。ABC语言让吉多看到希望。ABC是由荷兰的数学和计算机研究所开发的。吉多在该研究所工作,并参与到ABC语言的开发。ABC语言以教学为目的。与当时的大部分语言不同,ABC语言的目标是“让用户感觉更好”。ABC语言希望让语言变得容易阅读、使用、记忆和学习,并以此来激发人们学习编程的兴趣。
然而,ABC语言编译器需要很高的电脑配置才能运行,而这些电脑的使用者通常都精通电脑,所以他们更多的是关注程序的效率,而非它的学习难度。另一方面,如下致命的设计问题是它没有流行起来的原因:
- 可扩展性差: ABC不是模块化语言,如果想在其中增加功能,如对图形化的支持,需要改动很多地方。
- 不能直接进行
IO
: ABC不能直接操作文件系统,即不能直接读写数据。输入输出的困难对于计算机而言是致命的,你能想象一个不能打开车门的跑车吗? - 过度革新: ABC用自然语言的形式来表达程序的意义。例如,它使用
How to
来定义一个函数,而对于程序员来说,他们更习惯用function
或define
。 - 传播困难: ABC编译器很大,必须保存在磁带上,这也就意味着如果想要使用它,必须先准备一个大大的磁带。
- Python孕育与成长: 介于
C
和Shell
之间的简单易学、功能全面的语言;
1989年,为了打发圣诞节假期,吉多开始写Python语言的编译器。Python这个名字,来自吉多所挚爱的电视剧Monty Python’s Flying Circus。他希望这个新的叫做Python的语言,能符合他的理想:介于C和shell之间,功能全面,易学易用,可拓展的语言。吉多作为一个语言设计爱好者,已经有过设计语言的尝试。这一次,也不过是一次纯粹的hacking行为。
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。吉多维护了一个mail list,Python用户就通过邮件进行交流。Python用户来自许多领域,有不同的背景,对Python也有不同的需求。Python相当的开放,又容易拓展,所以当用户不满足于现有功能,很容易对Python进行拓展或改造。随后,这些用户将改动发给吉多,并由吉多决定是否将新的特征加入到Python或者标准库中。如果代码能被纳入Python自身或者标准库,这将是极大的荣誉。由于吉多至高无上的决定权,他因此被称为“终身的仁慈独裁者”
。2018年7月12日,在完成PEP(Python Enhancement Proposals)572后,吉多决定退出Python核心决策层。
Python以及其标准库的功能强大,这些是整个社区的贡献。Python的开发者来自不同领域,他们将不同领域的优点带给Python。例如,Python标准库中的正则表达式(Regular expression)是参考Perl,而lambda, map, filter, reduce等函数参考了Lisp。Python本身的一些功能以及大部分的标准库来自于社区。Python的社区不断扩大,进而拥有了自己的newsgroup,网站,以及基金。从Python 2.0开始,Python也从mail list的开发方式,转为完全开源的开发方式。社区气氛已经形成,工作被整个社区分担,Python也获得了更加高速的发展。到今天,Python的框架已经确立。Python语言以对象为核心组织代码,支持多种编程范式,采用动态类型,自动进行内存回收。Python支持解释运行,并能调用C库进行拓展。Python有强大的标准库。由于标准库的体系已经稳定,所以Python的生态系统开始拓展到第三方包。这些包,如Django、web.py、wxpython、numpy、matplotlib、PIL,将Python升级成了物种丰富的热带雨林。
Python崇尚优美、清晰、简单,是一个优秀并广泛使用的语言。Python在TIOBE排行榜中排行第八,它是Google的第三大开发语言,Dropbox的基础语言,豆瓣的服务器语言。Python的发展史可以作为一个代表,带给我们许多启示。在Python的开发过程中,社区起到了重要的作用。吉多自认为自己不是全能型的程序员,所以他只负责制订框架。如果问题太复杂,他会选择绕过去,也就是cut the corner。这些问题最终由社区中的其他人解决。社区中的人才是异常丰富的,就连创建网站,筹集基金这样与开发稍远的事情,也有人乐意于处理。如今的项目开发越来越复杂,越来越庞大,合作以及开放的心态将成为项目最终成功的关键。
Python从其他语言中学到了很多,无论是已经进入历史的ABC,还是依然在使用的C和Perl,以及许多没有列出的其他语言。可以说,Python的成功代表了它所有借鉴的语言的成功。同样,Ruby借鉴了Python,它的成功也代表了Python某些方面的成功。每个语言都是混合体,都有它优秀的地方,但同时也有各种各样的缺陷。同时,一个语言“好与不好”的评判,往往受制于平台、硬件、时代等等外部原因,程序员经历过许多语言之争。
3.2 设计哲学
- 获取Python设计哲学: 成功安装Python软件后(下一个专题),打开任意一个编辑环境键入
import this
运行即可;
- 总结: 简单优雅可扩展,实用扁平是关键,最佳方案only one😂😂😂
3.3 优势与不足
- 优势:
- 简单易学可扩展: 阅读一个良好的Python程序就像欣赏一篇优美的文章一样,尽管它的要求非常严格,如强制缩进可提高代码的可读性。Python的这种伪代码本质使得我们可以更多地关注于解决问题的逻辑而非搞明白语言本身,如我们无需过多关注诸如内存管理这样的底层细节。如果我们希望一段关键代码运行的更快(C要比Python快50倍以上)或希望某些算法不公开,可以把部分程序用
C
或C++
语言编写,然后在Python程序中进行调用。 - 免费开源可移植: Python是FLOSS(自由/开放源码软件)之一,也就是说我们可以自由地发布这个软件的拷贝、阅读它的源代码 、对它做改动、把它的一部分用于新的自由软件中。由于其开源本质,Python可移植在许多计算机平台上,如Windows、Linux等。
- 面向对象: Python既支持面向过程的编程也支持面向对象的编程。在“面向过程”的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。与其它的编程语言如C++和Java相比,Python以一种非常强大又简单的方式实现面向对象编程,而封装、继承和多态三大特性则是它成"神"的关键。
- 动态语言: 动态语言,又称为弱类型语言,是指变量在创建时不需声明类型,具体类型根据指向的内存单元中的数据类型决定,即指向什么类型就是什么类型。相反,静态语言(强类型语言),定义变量时需要声明类型,变量指向的内存单元可存放的数据类型固定。例如,Python中定义一个整数变量为
num = 10
,而在Java中则为int num = 10;
。总结:动态类型,指向可变,内存单元中的内容不可变;静态类型,指向不可变,内容可变。 - 解释型语言: 编译型语言,如
C++
写的程序可以从源文件(C++语言)转换到一个你的计算机使用的语言,即二进制代码(0和1)。这个过程通过编译器和不同的标记以及选项完成。当我们运行程序的时候,连接转载器软件把我们的程序从硬盘复制到内存中并且运行。而Python语言写的程序不需要编译成二进制代码。我们可以直接从源代码运行程序。在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器码并运行。由于只需要把我们的Python程序拷贝到另外一台计算机上,它就可以工作了,这也使得Python程序更加容易移植。 - 丰富的库: 包括Python自带的标准库和第三方库。其中Python的标准库可以帮助我们处理各种工作,包括正则表达式、文档生成、线程、数据库、HTML、GUI等。这被称作Python的“功能齐全”理念。除了标准库以外,Python也支持安装第三方库,如wxPython、Twisted和Python图像库等。
- 缺点: Python语言非常完美,没有明显的短板和缺点。唯一的不足就是执行效率慢,而这个是解释型语言所通有的,不过这一缺陷会随着计算机硬件性能的不断提升而弱化。
3.4 应用场景
四、结语
由于水平有限,能力一般,不想因为自己不成熟的理论或方法对他人造成误导,几番思想斗争后,最终决定在CSDN上开始分享一些平时的所见所想。此外,写文的初心一方面是为了锻炼自己的写作能力和对知识的理解掌握能力,另一方面就是希望以自己的绵薄之力帮助更多想要学习Python的人,所以若有内容相似或雷同请留言告知。为了更好地对知识进行管理,日后本人并不会对同一内容或相似度过大的内容发表新的文章,暂定在原内容上进行扩充和修改。写作不易,各位看官的鼓励和支持是本人坚持下去的动力。
更多推荐
Python简介
发布评论