下面我们来一起回顾一下计算机技术的演进。从1946年第一台计算机诞生,我们可以看到计算机技术呈指数趋势来发展,整个世界已经被计算机技术进行了翻天覆地的改造,然而从计算机技术发展的历程来讲,也是分不同阶段的。我们认为在计算机技术发展过程中,一共分成四个小阶段。
其中,1946年第一台计算机的诞生到1981年IBM的PC机的诞生(35年),这个阶段我们称之为计算机系统结构阶段。在这一个时代中,所有的科学家和计算机工程师都在很努力的去研制不同类型的计算机以及计算机的体系结构,在这个时期我们有了很多种的CPU,我们有了很多种的计算机系统,操作系统,以及编译器、解释器等不同的系统软件。
那么1981年,个人PC机的诞生,使得计算机走入了每一个寻常人的生活中,一直到2008年,2008年有一个非常标志性的事件,那就是安卓操作系统的诞生,它标志着计算机由个人PC计算机时代向进一步的移动时代去转换。那么1981年到2008年这27年间,我们看到了有两类技术有了翻天覆地的发展。我们把它命名为网络和视窗时代。其中一项技术就是互联网,另外一项技术就是windows视窗化操作系统。
在08年之后,一直到某一个时期,又发生了一件很重要的事件。那就是2016年,计算机首次打败了国际围棋的世界冠军。我们发现,可能另外一个时代就要到来。那么在2008年到2016年这8年间,我们看到的是什么呢?我们听到了很多的计算机领域的新名词,比如云计算、大数据、网络安全等等。事实上,只有计算机系统变得非常复杂的时候,我们才会去关系网络安全。因为一个很简单的系统我们可以通过很少的规则性的定义就能保证它的安全性。只有当一个系统变得非常复杂的时候,我们才需要用很多的额外方法去关注它的安全性。因此在2008年到2016年我们认为计算机演进到了复杂信息系统时代。
随着计算机智能的日益增强,我们认为从2016年开始,可能会有一个新的时代诞生,那即将是人工智能时代。
我们回顾计算机演进的四个时代我们会发现:
在1946年到1981年计算机系统结构时代中,我们重点解决的是计算能力的问题,即通过设备来提供更充分、充足、好用的计算能力。
那么1981年到2008年网络和视窗时代我们主要解决的是人与计算机的交互问题以及计算机和计算机的交互问题。人与计算机的交互通过操作系统的视窗来体现,计算机与计算机的交互问题通过网络来体现。
2008年到2016年我们叫复杂信息系统时代,我们将各种信息化系统在各种维度上进行整合,系统一旦进行了整合我们会发现我们实际上解决的问题都在与数据相关,无论是数据接口问题、数据产生的速度问题,数据存储问题等等。所以,在这个时代我们关心数据。
2017年虽然标志着人工智能时代的到来,我们离真正的人工时代应用还有很长一段距离。那么在人工智能时代,机器会接管很多的基础的数据处理问题,会接管很多的基础功能性问题,那么在人工智能时代我们需要关心什么问题呢?实际上,到了这个时代,正是由于基础工作更容易被计算机接管,我们更多的关心的是人类自身的问题,我们用计算机帮助人类解决人类希望达到的功能效果。那么在复杂信息系统时代到过渡到真正人工智能时代之间我们认为会有一个新的关键时期叫新计算时代。也就是我们现在所处的这个时代,在这里,我们要关心计算,我们要关心交互效果,关心数据,更要关心人工智能。
我们回过头来可以看一下,在这个时代我们有大量的计算需求,而且计算需求以爆炸形式发展。而计算机技术呢又在呈指数形式来发展。最终会带来整个计算机技术先人工智能时代的快速演进。
下面我们来了解一下编程语言的多样初心。
到底世界上有多少种编程语言呢?这里列举一批:
Basic,C,C++,C#,CSS,Fortran,Go,HTML,Java,JavaScript,Lisp,Lua,Matlab,Object C,Pascal,Perl,PHP,PostScript,Python,Ruby,Scala,SQL,Swift,VBA,VB,NET,Verilog,VHDL,Visual Basic
据不完全统计,世界上有超过6百种编程语言。如果以编程语言的名字来排列,可以覆盖A-Z的全部字母表,应该说,编程语言也是一个江湖。
这里我们举几个非常常用的,也是大品种的编程语言,来看待一下不同编程语言的设计初心和试用对象。
首先,我们来说说C语言,如果有人接触过C语言,你就会知道,在C语言中,我们重点来学习指针,内存,数据类型,比如整数数据类型C语言将提供超过5种以上的具体的数据类型,那为什么会这样呢?一个整数就要有5种以上类型去表达它呢?实际上,C语言的语言本质希望编程者能够理解计算机系统结构,使得你编写的计算机程序更符合计算机的结构,使得它运行起来的效率更高。它核心解决的是性能问题。这是因为C语言诞生在计算机系统结构时代,它是用于写操作系统的语言,在C语言诞生之初,计算机的内存只有几兆,在编写程序的时候,如果不关系你使用的内存,你很难让程序正确运行起来,因为计算机的硬件没有那么多的资源和内存来支撑程序运行,因此C语言更关心计算机系统结构它适合计算机类的专业做计算机底层程序的设计和开发。
再来说说Java语言。Java语言诞生在一个非常有意思的时代,那就是网络和视窗时代。当时所有的计算机都希望,能与其他的计算机进行交互。但是呢,在一台计算机上编写的程序是不是能在另一台计算机上运行呢?这就是一个问题。所以Java语言提出了面向对象的方式,通过跨平台的方法,来去解决跨平台问题。面向对象又进一步的抽象了计算机吧编程代码的级别。使得代码复用变得更为高级和更为灵活。因此在我们学习Java语言的时候,我们会学习对象、跨平台、运行时等相关概念,它实际上这个语言希望我们去理解程序设计过程中主体和客体之间的关系。本质上呢,它是来解决跨平台和程序中的交互问题。它更适合软件类专业的学习者去学习。
那么另外一个编程语言C++,它既是C语言的演进,它又具有面向对象的特点。在我们学习C++的时候,我们会学习对象、多态、继承等面向对象的概念。事实上,它也希望使用者去理解主客之间的关系。C++非常适合大规模程序的编写。比如:操作系统的编写,大规模图像处理程序的编写等等。它更适合计算机类专业的学习者作为核心的编程语言来学习。
此外我们知道有一类语言叫VB以及VB衍生的VB.NET等相关语言。在学习这类编程语言的时候,我们去学习的是对象,学习的是按钮,学习的是文本框,通过编写VB程序,我们能实现一个小的桌面窗口。该语言的本质呢,也是希望编程者能够去理解交互逻辑,这种交互不是程序之间的交互,而是人机之间的交互。它比较适合做桌面应用的开发。到了今天,由于我们很少在桌面上编写程序,大多数程序都要求既能在桌面上运行,又能在手机上运行,最主要是一种网络程序。因此VB的使用对象已经变得很小了。
再来说说Python,Python是一种面向编程逻辑,并且使用第三方库来完成程序的语言,这个语言的本质是希望使用者去理解问题的求解。它解决的是各种各样的问题的计算部分的实现。它适合各类专业。
我们认为各种编程语言的历史时期跟使命是不同的,比如C语言,出在计算机系统结构时代,Java语言诞生于网络与视窗时代,VB语言也诞生于网络与视窗时代,而Python语言发展于复杂信息系统时代,所以我们说不同语言有不同的设计初心,而Python语言是计算时代演进的选择。
我们看一下2018年以后的计算环境。到今天,计算机性能已经不再是解决一般问题的瓶颈,移动互联网广泛普及以及广泛应用,听说了好多新的词汇:大数据、云计算、物联网、信息安全、人工智能等这些领域的发展带来了大量的计算需求。那么解决日益增长的计算需求,我们该使用什么样的语言呢?
下面我们来了解一下Python语言的特点。我们都知道Python语言是由大牛Guido van Rossum创立的,我们说Python语言是通用语言,脚本语言,开源语言,跨平台语言,多模型语言,也有人说Python语言是粘性语言,这么多种特性来标志Python语言,说明它有很多的作用,但是在我看来,我们只需要记住一点,Python语言是通用语言。
什么是通用语言?也就说这门语言可以用于普适的计算问题求解的开发。无论你是想做一个图形运算,还是想解决一个操作系统的文件处理的问题,还是希望去发现一个引力波…我们都可以Python来实现。它并不局限于某一门类的应用,所以Python语言的通用性是它最大的特点。
此外Python有一些优势,我们也听过很多的名词来标志或说明Python语言的优势。比如在Python语法这个层面上,我们知道Python语法具有强制的可读性,我们之前学习过缩进,通过缩进实现的强制可读性使得你编写的代码看起来非常的整洁漂亮。Python语言有较少的底层语法元素,它不去操作内存,也不去操作很低级的接口,所以对编写程序的时候,我们可以变得非常容易和简单。它支持多重编程方式,更支持中文字符的处理,从Python的语法角度讲,我们认为它的最大的特点也就是它的优势,是语法简洁,通过简洁的语法,完成相同的功能,Python语言的代码量是C语言的代码量不到10%。不到10%的代码量能带来什么呢?它可以带来非常短的编程时间,可以带来非常少的调试的工作量,以及非常好的维护体验。语法简洁,那么代码行数更少,我们发现,使用Python语言可以提高将近10倍的编程产出。下面我们再来看一下,Python语言还有超过13万个第三方库。这些库是由全球的工程师、爱好者他们在自己的工作中逐渐形成的。这些库开源、开放任何人都可以通过简单的安装使用这些功能,而且,13万的第三方库在进行着快速的增长,平均以每年两万个以上的第三方库的规模在去增长,使用其他人的功能模块来编写程序,我们可以重复造轮子,我们可以使得整个程序的生态变得开放共享。同时,Python支持跨操作系统平台,使得第三方生态的使用变得更为灵活,因此,我们总结出Python语言的另外一个重要特点——生态高产。通过利用第三方库,我们可以将Python的编程产出进一步的再提高十倍。
通过语法简洁性我们可以提高10倍的产出,通过计算生态我们可以提高10倍的产出。这就是Python语言的特点和优势。
我们再来看待一下Python语言,有一句话叫人生苦短,我学Python。我们首先说对于C和C++语言来讲,Python归Python,C归C。Python语言能做Python语言能做的事情,但是涉及到计算机操作系统底层,涉及到计算机内存,涉及到计算机接口方面的工作,还是需要由底层的C语言来去完成,那么由C语言完成的代码,可以经过封装形成Python的接口,我们以第三方库的形式或者以语句的形式来调用C语言的代码,而不需要跟计算机内存打交道的或者说对效率、执行速度没有更高要求的程序我们完全可以通过Python语言来去实现它,进而使得整个程序的编写变得非常快速和高效。这就是Python归Python,C归C。对于Java语言来看呢?我们认为它非常适合特定的开发和岗位需求,比如像安卓手机端的原生应用的开发,包括某一些网络应用的后台中间件的开发等。
还有一类语言像HTML、CSS、JavaScript语言,这一类语言是用来做网络前端开发的,它们不可替代。我们常听到一个词叫全栈能力,指的就是你要会前端的技术,同时你还要会后端的技术。那么后端有什么语言呢?Python语言就是其中的候选之一。
另外还有一些其他的语言,像R语言、Go语言、Matlab语言等,它们针对特定的数据处理及相关领域,那么在那些领域它们也会有相当大的作用。
但是,怎么理解Python呢?我们认为Python是最高产的程序设计语言,以及它是掌握抽象并求解计算问题综合能力的语言,也是了解产业界解决复杂计算问题方法的语言,更是享受利用编程将创新变为实现乐趣的语言。国际上有句话——工具决定思维。如果你是开车,和你是坐高铁,不同的速度会带来不同的思维模式,那么你用Python语言编程,相比其他语言有10倍的高效产出,那么你的思维方式也将不同。建议大家关注工具变革的力量,学好Python,看到不一样的信息技术世界。
下面我们一起来了解一下超级语言的诞生记。编程语言可以分为很多种,其中有一类语言叫机器语言。机器语言就是一种二进制语言,它直接使用二进制代码表达指令。它是计算机硬件,主要是CPU可以直接执行的语言。这种语言和具体的CPU型号有关。比如我们完成2+3,那么机器语言表达的是一串由0和1组成的代码——11010010 00111011,至于这串代码可以具体在哪一款CPU上执行、怎样执行、执行结果如何表达就要去参考每一个CPU的参考手册。显然,使用机器语言来编写代码是不现实的。因此呢,计算机科学家进一步在机器语言的基础上演进提出了汇编语言。
汇编语言将一种二进制代码直接对应为助记符,并且利用这种助记符开展程序设计。汇编语言由于与二进制代码,即机器语言是一一对应的,所以它也与具体的CPU型号有关。在某一款CPU上编写的程序,无法在其他CPU上运行。比如完成2+3功能的汇编语言,可能表示为:
add 2,3,result 的形式,它表示的是第一个参数2与第二个参数3相加存到result里。这种add操作符在前,操作数在后是一种典型的CPU指令格式。虽然我们可以看到机器语言和汇编语言其实并不适合编程,它更适合计算机底层硬件的设计和开发。因此,人们很早(在上世纪60年代)就提出了高级语言。
高级语言是更接近自然语言、更容易描述计算问题的语言。其中,一个标志是用高级语言编写的代码应该与具体的CPU型号无关,我们使用编译器去将高级语言编写的源代码编译成计算机能够执行的目标代码。那么在编译的过程中,编译器去参考具体某一款CPU的型号。比如完成2+3这样一个最基本的计算功能,如果使用高级语言来完成,就可以写为:result = 2 + 3 ,即将2+3运算的值赋值给result。
经过高级语言代码的设计,我们发现,人类在编写程序的时候,可以不按照计算机指令格式设计的方式来编写,而用一种对人类更友好的方式进行编写程序。这就是高级语言的概念。
总结为:
机器语言是代码可以直接执行,与CPU型号有关。
汇编语言有助记符,通过汇编器,与CPU型号也有关系。
高级语言更接近自然语言,我们使用编译器或解释器,与CPU型号无关(代码通过编译器或解释器在与CPU构成关系)。
在此之上,还有没有其他编程语言类型呢?其实我们认为还有一种类型,我们叫它超级语言,超级语言不仅接近自然语言,不仅与CPU型号无关,它还可以粘性整合已有程序,具备庞大的计算生态。
到今天,计算机技术发展了将近70年的时间,编写程序甚至与CPU无关的编写程序,已经不是很重要的问题,更重要的是我们怎么去复用别人已经写好的代码,我们怎么利用已有的功能模块完成未知的功能模块。这为编程语言的设计提出了更高的挑战。我们认为这一类型的语言叫超级语言。
超级语言需要具有庞大的计算生态,可以很容易利用已有代码的相关功能,在超级语言的编程思维中,编程不只是刀耕火种,而是集成开发。比如2+3这样一个基本的计算功能,如果利用超级语言来完成,我们可以写为result = sum(2,3) 的形式,我们只需要将参数给到一个函数里,再由这个函数返回结果就可以。至于sum这个函数是我们自己写的,还是通过别人的生态库去完成的并不重要。