编程语言历史
在计算机硬件基础中我们大概介绍了一下计算机的发展历史。了解到在曾经有一段时期里计算机是不存在操作系统这一概念的,所有需要计算机完成的操作都需要当时的程序员来与计算机底层硬件进行直接对话,对话的方式就是通过二进制,故最早的编程语言即二进制语言,也被称为机器语言。
早期的操作人员是通过带有孔的纸带将程序输入电脑进行编译(对纸条打点),这使得开发人员的开发效率及其低下。而后为了解决这种问题则出现了汇编语言,汇编语言相较于机器语言来说稍微简洁了一些,实际上说白了汇编语言就是将机器语言的二进制指令用英文标识符做了一次封装,但它也是同底层硬件直接打交道的一种语言。
到了20世纪60年代,贝尔实验室的研究员Ken Thompson(肯·汤姆森)发明了B语言,而后又使用B语言编了个游戏 - Space Travel。他找了一台空闲的机器 PDP-7 想来玩这个游戏,但是这台机器并没有操作系统。所以顺带着 Thompson 又为 PDP-7 开发了一套操作系统,而后来这个OS(OS便是操作系统的意思)被命名为 UNIX。
1971年的时候 Ken Thompson 的同事 D.M.Ritchie(DM里奇)也想玩 Space Travel,所以和 Ken Thompson合作开发UNIX,并且在 1972年的时候改进了B语言且将新语言改名为C语言(取BCPL中的第二个字母,C)。
到了1973年的时候C语言主体完成。Ken Thompson 和 D.M.Ritchie 已然忘记了 Space Travel 这款游戏。并且全身心投入到了UNIX和C语言的开发,至此,UNIX和C语言相辅相成的一直发展道了今天。
-
类C语言起源与历史
CPL(Combined Programming Language) - 1963 CPL是1963年剑桥大学发明的
BCPL(Base Combined Programming Language) - 1967 剑桥的Matin Richards 对CPL做了简化,推出了BCPL
B(B Programming Language) - 1969 贝尔实验室的Ken Thompson(肯·汤普森) 对BCPL又做了改进,设计出了简单的且接近硬件的B语言,并用B语言写了第一个UNIX OS
C(C Programming Language) - 1972 贝尔实验室的另外一个人Dennis MacAlistair Ritchie(D.M.Ritchie - DM里奇)在B语言的基础上设计出了C语言。C语言保持了B语言的优点(精炼、接近硬件),又克服了他的缺点(过于简单,数据无类型)
C++(C plus plus Programming Language) - 1983 还是贝尔实验室的人,Bjarne Stroustrup(本贾尼·斯特劳斯特卢普) 在C语言的基础上推出了C++,它扩充和完善了C语言,特别是在面向对象编程方面。一定程度上克服了C语言编写大型程序时的不足。
Java(Java Programming Language) - 1995 Sun公司的Patrick Naughton的工作小组研发了Java语言,主要成员是James Gosling(詹姆斯·高斯林)
C#(C Sharp Programming Language) - 2000 Microsoft公司的Anders Hejlsberg(安德斯·海尔斯伯格)发明了C#,他也是Delphi语言之父。
-
浏览器和JavaScript的历史
1994年,网景公司(Netscape
)发布了Navigator浏览器0.9版,这是世界上第一款比较成熟的网络浏览器,一经面世便轰动世界。
但是这是一款名副其实的浏览器–只能浏览页面,浏览器无法与用户互动。比如你登录一个网站输入完用户名点击提交的时候。浏览器并不知道你是否输入了,也无法判断。只能传给服务器去判断。
-
计算机的发展越来越好的同时,网上冲浪也越来越流行,对于开发客户端脚本的需求也逐渐增大。此时,大部分因特网用户还仅仅通过 28.8 kbit/s 的调制解调器连接到网络,即便这时网页已经不断地变得更大和更复杂。而更加加剧用户痛苦体验的是,仅仅为了进行简单的表单有效性验证,就需要浏览器与服务器之间进行多次地往返交互。设想一下,用户填完一个表单,点击提交按钮,等待了 30 秒的处理后,看到的却是一条告诉你忘记填写一个必要的字段。
-
网景急于解决浏览器与用户交互这个问题。当时解决这个问题有两个办法,一个是采用现有的语言,比如Perl、Python、Tcl、Scheme等等,允许它们直接嵌入网页。另一个是发明一种全新的语言。这两个选择各有利弊。第一个选择,有利于充分利用现有代码和程序员资源,推广起来比较容易;第二个选择,有利于开发出完全适用的语言,实现起来比较容易。到底采用哪一个选择,网景公司内部争执不下,管理层一时难以下定决心。
-
就在这时发生了一件大事,1995年Sun公司将Oak语言改名为Java,正式向市场推出。Sun公司大肆宣传,许诺这种语言可以"一次编写,到处运行"(Write Once,Run Anywhere),它看上去很可能成为未来编程语言界的主宰。
@H_404_271@
-
网景公司动了心,决定与Sun公司结成联盟。它不仅允许Java程序以applet(小程序)的形式,直接在浏览器中运行;甚至还考虑直接将Java作为脚本语言嵌入网页,只是因为这样会使HTML网页过于复杂,后来才不得不放弃。
-
总之,当时的形势就是,网景公司的整个管理层,都是Java语言的信徒,Sun公司完全介入网景公司对网页脚本语言上的决策。 因此,JavaScript后来就是网景和Sun两家公司一起携手推向市场的,这种语言被命名为"Java+Script"并不是偶然的。
-
此时,34岁的系统程序员(布兰登·艾奇)Brendan Eich登场了。
@H_404_271@
-
1995年4月,网景公司录用了他。Brendan Eich的主要方向和兴趣是函数式编程,网景公司招聘他的目的,是研究将Scheme语言作为网页脚本语言的可能性。Brendan Eich本人也是这样想的,以为进入新公司后,会主要与Scheme语言打交道。
-
仅仅一个月之后,1995年5月,网景公司做出决策,未来的网页脚本语言必须"看上去与Java足够相似",但是比Java简单,使得非专业的网页作者也能很快上手。 这个决策实际上将Perl、Tcl、Scheme等非面向对象编程的语言都排除在外了。
-
Brendan Eich被指定为这种"简化版Java语言"的设计师。但是,他对Java一点兴趣也没有。为了应付公司安排的任务,他只用10天时间就把JavaScript设计出来了。由于设计时间太短,语言的一些细节考虑得不够严谨,导致后来很长一段时间,使用JavaScript写出来的程序混乱不堪。如果Brendan Eich预见到,未来这种语言会成为互联网第一大语言,全世界有几百万学习者,他会不会多花一点时间放在JavaScript的研发上呢?
总的来说,他的设计思路是这样的:
@H_404_271@
-
Granddaddy of Python web frameworks,Zope 1 was released in 1999
-
Python 1.0 - January 1994 增加了 lambda,map,filter and reduce.
-
Python 2.0 - October 16,2000,加入了内存回收机制,构成了现在Python语言框架的基础
-
Python 2.4 - November 30,2004,同年目前最流行的WEB框架Django诞生
-
Python 2.5 - September 19,2006
-
Python 2.6 - October 1,2008
-
Python 2.7 - July 3,2010
-
Python 3.1 - June 27,2009
-
Python 3.2 - February 20,2011
-
Python 3.3 - September 29,2012
-
Python 3.4 - March 16,2014
-
Python 3.5 - September 13,2015
-
Python 3.6 - 2016-12
-
Python 3.7 - 2018
-
Python 3.8 - 2019
所以,Javascript语言实际上是两种语言风格的混合产物----(简化的)函数式编程+(简化的)面向对象编程。这是由Brendan Eich(函数式编程思想忠实拥护者)与网景公司(面向对象编程思想忠实用户群体)共同决定的。
编程语言分类之低级语言
语言的高级和低级之分并不是说语言本身的层次高低,而是指的是与底层硬件的密切程度。就如同机器语言与汇编语言就是直接与底层硬件打交道的语言,故也被称为低级语言。
机器语言
机器语言是不通过任何操作系统就可以直接与底层硬件打交道的语言,说白了就是计算机能读懂的二进制,想要使用机器语言就得充分的了解计算机底层硬件的各个知识。这可能会花上你半生的时间,但是机器语言的执行效率却是无与伦比的高,计算机不需要通过任何编译就能直接运行。但是它的开发效率却是慢到令人发指,除了你需要去学习底层硬件相关的知识外还需要对每一条二进制指令烂熟于心,更加恐怖的是面对满屏的010101如果敲错一个字符就全部推倒重来,显然这已经超出了普通人所能承受的极限。
#指令部份的示例 0000 代表 加载(LOAD) 0001 代表 存储(STORE) ... #暂存器部份的示例 代表暂存器 A 代表暂存器 B ... #存储器部份的示例 000000000000 代表地址为 0 的存储器 000000000001 代表地址为 1000000010000 代表地址为 16100000000000 代表地址为 2^11 的存储器 #集成示例 0000,000000010000 代表 LOAD A,1)">16 0001,1)">000000000001 代表 LOAD B,1)">1 000000010000 代表 STORE B,1)">000000000001 代表 STORE B,1)">1[1]
总结
执行效率 --> 极高
开发效率 --> 极低
跨平台性 --> 极差(由于必须依赖具体的硬件,故移植性极差)
汇编语言
汇编语言仅仅是用一个英文标签代表一组二进制指令,毫无疑问,比起机器语言,汇编语言是一种进步,但汇编语言的本质仍然是直接操作硬件,因此汇编语言仍是比较低级/底层的语言、因为它也是贴近计算机硬件。
汇编的hello world,打印一句hello world,需要写十多行,如下 ; hello.asm section .data 数据段声明 msg db "Hello,world!",0xA 要输出的字符串 len equ $ - msg 字串长度 section .text 代码段声明 global _start 指定入口函数 _start: 在屏幕上显示一个字符串 mov edx,len 参数三:字符串长度 mov ecx,msg 参数二:要显示的字符串 mov ebx,1)">1 参数一:文件描述符(stdout) mov eax,1)">4 系统调用号(sys_write) int 0x80 调用内核功能 退出程序 0 参数一:退出代码 系统调用号(sys_exit) 调用内核功能
总结
执行效率 --> 极高
开发效率 --> 低
跨平台性 --> 极差(同机器语言一样必须依赖具体的硬件,故移植性极差)
编程语言分类之高级语言
高级语言并不关心底层硬件到底怎么样,因为高级语言是在和操作系统打交道。而操作系统又是管控硬件的软件,所以高级语言相较于低级语言来说它的开发效率肯定是要快上不上,但是执行效率上却有所损失。那么对于语言的好坏一味的按照执行效率来区分并非是正确的,语言本身只是一种工具,使用语言的人才是真正的操纵者。并且语言只有场景的适不适用而已,没有什么强弱之分。比如要对底层硬件进行开发,那么无疑汇编语言是最佳的选择,它能与本机硬件打交道所以能充分发挥自己执行效率高的特性,再比如要做一款网络爬虫相关的软件,由于网络具有延迟性会拖慢程序整体的运行速度,故使用汇编语言来编写爬虫便成了弱势(开发周期长,网络环境让汇编语言的高执行效率也体现不出来)。
高级语言中按照翻译方式的不同又大体可分为两类,分别是编译性语言与解释性语言。
编译性语言(如C语言)
编译性语言总结:
1.执行效率高,生成的目标文件可以脱离语言环境独立执行(因为都是存的二进制指令)
2.开发效率低,如果程序需要修改某一功能则必须修改源程序中的代码后再次生成目标程序,倘若只有目标程序而没有源程序的话则修改原本的功能是一件很困难的事情(反编译技术)。
3.跨平台性差,编译型代码只针对某一个平台下进行编译,当前平台下的编译结果(目标程序)无法拿到不同的平台上使用。
其他:现在大多数的编程语言都是编译型的。编译程序(GCC)将源程序翻译成目标程序后保存在另一个文件中,该目标程序可脱离编译程序直接在计算机上多次运行。``大多数软件产品都是以目标程序形式发行给用户的,不仅便于直接运行提升执行效率,同时又使他人难于盗用其中的技术。
解释性语言(如Python)
解释性语言总结:
1.执行效率低,解释型语言的实现中,翻译器并不产生目标机器代码,而是产生易于执行的中间代码。这种中间代码与机器代码是不同的,中间代码的解释是由软件支持的,不能直接使用硬件,``软件解释器通常会导致执行效率较低。
2.开发效率高,用解释型语言编写的程序是由另一个可以理解中间代码的解释程序执行的,与编译程序不同的是,解释程序的任务是逐一将源程序的语句解释成可执行的机器指令,不需要将源程序翻译成目标代码再执行。``解释程序的优点是当语句出现语法错误时,可以立即引起程序员的注意。让程序员在程序开发期间就能进行校``正,故开发效率高于解释性语言。
3.跨平台性强,代码运行是依赖于解释器,不同平台有对应版本的解释器,所以解释型语言的跨平台性更强。
其他:对于解释型Basic语言,需要一个专门的解释器解释执行Basic程序,每条语句只有在执行时才被翻译,这种解释型语言每
执行一次就翻译一次,因而效率低下。一般地,动态语言都是解释型的,例如:Tcl、Perl、Ruby、VBScript、JavaScript等
PS:混合型语言
最典型的就是Java语言,首先生成Java汇编,然后通过虚拟机进一步转换成计算机可以识别的二进制汇编语言。
Python语言介绍
Python这门语言于1989年的圣诞节期间诞生,它的创始人为吉多·范罗苏姆(Guido van Rossum)。PS:江湖人称龟叔,而Python这个名称的由来居然是因为 Guido 所喜欢的一部电视剧叫做 Monty Python's Flying。
Guido希望这门语言能够符合他自己的理想:拥有C语言强大功能的同时并且拥有shell一般简洁的语法。所以Python是崇尚优美、清晰、简单的一门优秀的且广泛使用的语言。
C语言是非常重要的一门语言,同时也是编译性语言的代表,就是C语言奠定了后来风靡全球的Java以及目前势头大火的Python的基础。Java和Python是基于C语言而开发来的,所以他们在代码转换过程中会先将自身的代码转变为字节码,然后通过字节码再转换为机器可读的机器码。这样的话执行效率相较于C语言就没有那么快,但是他们的优点是开发效率特别高。
在Python中很容易写出来的一段程序,在C或者Java中你可能需要成百上千行的代码,Python有自带的垃圾回收机制,所以Python开发者并不用过分将注意力放在内存上面,但是C语言不同,开发人员选用C语言开发的话要时时刻刻注意内存的变化,而Python自问世以来,就已经继承了C语言中对垃圾处理的一套成熟的规则,这让使用Python开发的开发人员不用过分专注内存这个点,这也是Python的一大优势之一。
Python是一种跨平台语言。他的优点非常明显,简洁的设计,让人一目了然的语法以及赏心悦目式的缩进格式都使得Python成为新时代的宠儿,但是有一个致命的缺点就是Python的执行效率偏低。这显然不适合做很大的项目,那么是不是意味着Python没有很大的前途呢?当然不是,其实Python也分很多种类,下面会做一个大概的介绍。
Python的应用领域十分广泛,如:人工智能,数据处理,爬虫,金融量化,云计算,WEB开发,自动化运维/测试,游戏开发,网络服务,图像处理等众多领域。并且国内外很多知名的企业也都在使用Python,如:Youtube、DropBox、BT、Quora(中国知乎)、豆瓣、知乎、Google、Yahoo、FaceBook、NASA、百度、腾讯、汽车之家、美团等等。
Python解释器介绍
Python也分很多种类,我们常说的Python其实就是指的CPython,另外还有JavaPython,lron Python等等不同的版本,那么他们其实就是基于Java和C#而开发而来的Python。相较于常用的Cpython多了一个转换环节所以执行效率降低,在这里并不考虑,但是有一个Python变种却是非常的特殊,它弥补了CPython执行效率低下与不支持并行的特点,它就是PyPy。
PyPy的第一部分:用Python实现的Python
这么说并不准确,准确得说应该是用rPython实现的Python,rPython是Python的一个子集,虽然rPython不是完整的Python,但用rPython写的这个PyPy却是可以解释完整的Python语言。
PyPy的第二部分:编译器
这是一个编译rPython的编译器,或者说这个编译器有一个rPython的前端,目前也只有这么一个前端,不过它的后端却是不少,也就是说这个编译器支持许多的目标语言,比较重要的有:C,CIL,JavaScript ...
由于我们平常讲的Python实际上都为CPython,故我们接下来的学习也是围绕CPython(以下简称Python)学习的。目前Python版本已经更迭到了3.8.2。
1989年,Guido开始写Python语言的编译器。 1991年,第一个Python编译器诞生。它是用C语言实现的,并能够调用C语言的库文件。从一出生,Python已经具有了:类,函数,异常处理,包含表和词典在内的核心数据类型,以及模块为基础的拓展系统。
In November 2014,it was announced that Python 2.7 would be supported until 2020,and reaffirmed that there would be no 2.8 release as users were expected to move to Python 3.4+ as soon as possible
Python 3.0 - December 3,2008
细心的读者会发现,08年时就推出了3.0,2010年反而又推出了2.7?是因为3.0不向下兼容2.0,而很多公司已经基于2.0版本开发出了大量程序,公司已然投入了大量的人财物力,这就导致大家都拒绝升级3.0,无奈官方只能推出2.7过渡版本,之后我们都应该采用3.0解释器开发程序,但为了方便读者维护2.0版本的软件,我们在遇到两种版本的差异时会专门指出来。
下载CPython解释器
注意:这里没有收录MACOS系列的安装,故适用MACOS系统的朋友需自行搜索
全平台:
第一步:打开Python官网 https://www.python.org/
Wndows平台:
第二步:下载相应的版本(这里推荐2个版本都下载)
第三步:下载Python 3.8.2
第四步:下载Python 2.7.18
Linux平台
第二步:下载相应的版本(Linux一般自带Python2.x版本,所以只需要下载Python 3.x版本即可)
Windows平台安装Python解释器
不管是Python 2.x版本还是Python 3.x版本。它们的安装目录中结构都是一样的,我们来简单的看一下:
好了。现在我们的Python已经安装完毕了,我们试着进入Python解释器看看是否大功告成
Linux平台安装Python解释器
那么至此,Linux平台的Python 3.x就配置完成了。
环境变量的配置
在Windows平台进行安装Python解释器的时候我们发现一直会有一个提示添加到环境变量,那么环境变量到底是什么呢?别着急。我们来看图:
Windows平台配置环境变量
那么如何配置环境变量呢?实际上也非常简单。首先我们的Windows平台上安装了2个版本的Python解释器,所以需要对他们进行一些处理才能保证2个版本的Python解释器都能使用。
接下来开始设置环境变量了。
好了。接下来进入终端开始测试。
测试全部通过。都能够正常使用了。
Linux平台配置环境变量
运行Python程序的2种方式
现在。我们已经能够运行Python程序了,开始输入我们的第一条代码。
Python程序运行的底层三步骤
一个Python程序被解释器解释并执行,其实大体上可以分为三个步骤:
python c:/test/test.py
集成开发环境Pycharm下载与安装
上面介绍了运行Python程序的2种方式,并且提到后面基本都会使用第二种方式也就是脚本调用的方式来执行Python程序,那么如果单纯的用文本编辑器的话其实并不是一个很好的选择(大佬除外),所以这边推荐使用集成开发环境Pycharm,对于开发人员来说集成开发环境是必不可少的工具。那么关于它的强大这里也不多做赘述了,使用一段时间后你就能切身的体会到。
Pycharm官方链接:https://www.jetbrains.com/pycharm/
虚拟环境介绍
在安装好Pycharm之后。我们试着新建一个项目并且为它配置解释器:
虚拟环境其实是真实的Python解释器的一份拷贝。由于真实的Python解释器可能在不断的添加各种第三方库,而我们的项目中又没有用到这些库所以就会造成一个环境的污染,比如打包成exe文件后体积过大等问题。所以一个项目的环境干净是十分重要的,而虚拟环境就是为了净化项目环境而生的一种措施。