本文重点解决如下问题:不同的编程语言之间是否存在共性或者说共通之处?能否学会一种编程语言之后,即可触类旁通的学会其它编程语言?即本文重点描述了不同编程语言之间的通用架构。需要指出的是,为便于读者理解,使用了编程语言的通用架构这一说法,实际上要归纳出种类繁多的编程语言的通用架构是非常困难的,这里将编程语言的通用架构理解为编程语言之间的共性更为合适。归纳和掌握不同编程语言之间的共性的目的是为了做到触类旁通,当学会一种编程语言后能够很快地学会其它编程语言;甚至于学会一种编程语言后,对于其它编程语言,只需查一查该编程语言的官方文档就可以上手。
计算机的编程语言层出不穷,根据其出现时间的先后顺序大致可以分为三类:面向机器的编程语言、面向过程的编程语言、面向对象的编程语言。面向机器的编程语言是一种CPU指令系统,也称为CPU的机器语言,它是CPU可以识别的一组由0和1序列构成的指令码。用机器语言编写程序,就是从所使用的CPU的指令系统中挑选合适的指令,组成一个指令序列。这种程序可以被机器直接理解并执行,速度很快,但由于它们不够直观、不便记忆、难以理解、不易查错、开发周期长。所以,现在只有专业人员在编写对于执行速度有很高要求的程序时才采用。例如汇编语言就是一种面向机器的编程语言。面向过程的编程语言也称为结构化程序设计语言,是高级语言的一种。在面向过程程序设计中,问题被看作一系列需要完成的任务,函数则用于完成这些任务,解决问题的焦点集中于函数。面向过程的编程语言采用自顶向下、逐步求解的程序设计方法,使用三种基本控制结构构造程序,即任何程序都可由顺序、选择、循环三种基本控制结构构造。例如,C语言就是一种面向过程的编程语言。面向对象的编程语言是一类以对象作为基本程序结构单位的程序设计语言。所谓对象就是客观物理世界中的实体,例如计算一个班级的所有学生的平均成绩,那么一个学生就是一个对象。面向对象的编程语言不去考虑解决一个问题是怎么一步一步来计算的,它关心的是研究的对象,通过抽象出对象集合的共同属性和功能,从而构造类,通过将类实例化来解决所要解决的问题。典型的面向对象的编程语言如C++、Java等。面向对象的编程语言的典型特点是封装性、多态性、继承性。面向对象的编程语言与面向过程的编程语言的本质差别在于:面向过程的编程语言关心的是解决问题的流程或者步骤,而面向对象的编程语言关心的是所研究对象群体的共同特点。
如上所述,编程语言可分为三个主要的类别,每个类别下又包含很多种编程语言。每种编程语言都有自己的优缺点,很难做到一种编程语言包打天下,一统江湖。例如汇编语言执行效率高,直接面向底层机器指令,缺点是属于底层语言,不够高级,编写困难,可移植性差;C语言的优点是执行效率较高,编程难度相较于汇编语言较容易,缺点是封装性差而导致安全性不够高,主要面向过程编程等;C++语言的优点是可面向对象编程,安全性高,代码可继承性强,具有多态性,缺点是执行效率不如汇编语言和C语言高。正是因为各种语言都具有自己的优缺点,所以造就了编程语言的百花齐放、争奇斗艳的局面。那么是不是每种编程语言都要去学,或者说主流的编程语言是否都要去学一遍呢?这个大可不必。这就像盖房子一样,虽然有不同类型的房子,其实他们的架构大体类似,都由地基、主体框架、承重墙、门、窗等部分组成。所以,为什么工人们能够建造不同类型的房子,是因为他们明白不同类型的房子其架构大致类似。如果把一种编程语言想象为一幢房子,那么不同的编程语言是否有共性或者说是否有比较通用的架构呢?答案是肯定的。那么,我们就没有必要去学习各种编程语言,而是只要掌握了编程语言的通用架构,拿这个通用结构拓展到不同的编程语言,根据不同编程语言的特点加以改动就可以轻松地学会各种编程语言了。
编程语言的通用架构如图 4-2所示,该架构宏观上可以分为两个层次:核心层、扩展层。该图中用虚线圈住的部分为核心层,其余部分为扩展层。核心层由核心模块组成(白色的长方体表示),扩展层由扩展模块组成(彩色的长方体表示)。
图 4-2 编程语言的通用架构
核心层自底向上可以分为数据类型、流程控制、函数、类4个核心模块。第1个模块为数据类型模块,该模块包含了整型、实型、字符型、逻辑性、枚举型、数组、结构体等数据类型。注意:每种编程语言所包含的数据类型略有差异,上面只列出了大部分编程语言通常包含的数据类型。有些编程语言包含的数据类型比上面列出的多,有些则比上面的少。例如MATLAB语言中不能够直接定义整型变量,只要申请变量,系统就会将变量默认定义为double类型,如果强制性的定义整型变量则会报错。如果想生成整型变量则必须先生成double类型,然后再进行类型强制转换。需要解释一下的是,之所以可以将数组和结构体理解为复杂数据类型,这是因为:数组是相同类型的数据的集合,结构体则是不同类型的数据的集合。
核心层的第2个模块为流程控制模块,该模块主要包含分支语句与循环语句两种不同类型的语句。分支语句用于处理算法流程中需要产生分支的情形,循环语句则用于处理算法流程中需要进行循环处理的情形。
核心层的第3个模块为函数模块。函数是完成某一特定功能的代码块(代码块即代码的集合),例如计算课程平均成绩的函数就是实现这一功能的代码集合。函数被用于进行代码的封装和复用。封装可以提高代码的安全性,一些需要保密的代码可以封装在函数中,这样一般人看不到;复用性则可以提高编程的效率,一些相近的功能可以调用同一个函数来实现,从而避免重复写相同的代码。例如,若要编写代码分别计算一个班级的语文、数学、英语三门课程的平均成绩,则可以先写一个计算平均成绩的函数,然后调用此函数三次,分别实现计算语文、数学、英语各课程的平均成绩,这样就不必每计算一门课程的平均成绩都要去重复写计算平均成绩的代码,从而避免了重复性劳动,提升了编程效率。
核心层的第4个模块为类模块。类的出现主要是为了实现代码的继承和派生,这可以极大地提高代码的复用性。这好比于:一个孩子不必从零起步开始打天下,可以通过继承祖辈的基业少奋斗几十年。同时,他可以在原有基业的基础上继续添砖加瓦,形成自己的特色,开辟另外一片天地。比如说,可以将计算学生各门课程成绩的总和以及显示学生的学号、姓名等信息的已有代码打包在一起,形成一个类,叫学生类。基于这样一个类,要实现高考学生的总分排序,那么就可以把已有的代码拿过来,再加上总分排序的功能就好。将已有的代码直接拿过来使用的过程称为类的继承,在已有类的功能基础上再添加新的功能的过程叫做类的派生。例如,可以将增加了总分排序功能的代码集合打包后叫做高中生类。这里由学生类派生出了高中生类,高中生类继承于学生类。
扩展层则包含了I/O(Input/Output,即输入输出)、图像处理、界面编程、网络通信、数据库操作、并行计算、混合编程等模块。扩展层是编程语言实现功能拓展的模块集合。I/O模块是为了实现数据和文件的输入/输出。图像处理模块则是为了使该编程语言具有图像和视频处理和显示功能。界面编程模块是为了给编写的程序加上界面,以实现方便而友好地与用户进行交互,主要包括为用户展示计算结果以及获得用户的界面输入等。网络通信模块则使该编程语言具备网络通信的功能,能够实现数据的网络传输,这是实现网页浏览、网络聊天等功能的基础。数据库操作模块使该编程语言能够对数据库进行操作,实现数据的增加、删除、修改、查询等功能。并行计算模块使该编程语言能够进行并行计算,提升数据处理的效率。混合编程模块则使该编程语言能够与其它语言进行混合编程,实现不同编程语言之间的相互调用,例如利用C++语言中的混合编程模块实现在C++代码中调用Python代码。
需要指出的是,不同的编程语言其架构会略有差异,不要用图 4 2的通用架构去非常严格地对应各种编程语言的架构。每门编程语言都有自己的特色,架构上略有差异正是其具有自身特色的直接反映。但总的来说,常用编程语言的架构与图 4 2所示的通用架构大致接近,所以只要根据这一通用架构去学习具体的编程语言,那就能够做到了然于胸、思路清晰、事半功倍。假设你要学C++语言,按照此通用架构,首先你要搞清楚C++中有哪些基本的数据类型,分别怎么去定义各种数据类型的变量以及给这些变量赋值;接下来,弄清楚C++中分支和循环语句有哪些,分别怎么实现;然后,掌握C++中定义和实现函数的方法;接下来,弄清楚C++中类的基本概念、定义和实现方法,弄明白类的继承和派生的作用及实现方法。通过上面这些学习过程基本上掌握好了C++的核心架构,C++的内容已经掌握了一大半。此外,还需要理解C++实现外围扩展功能的基本方法,例如I/O、图像处理、界面编程、网络通信、数据库操作、并行计算、混合编程等功能。如果你学会C++后还希望学习Java语言,那么你只需要根据编程的通用架构重复上面的步骤即可非常容易的掌握Java语言。从上面的过程不难发现,学完一门编程语言之后,再学其它的编程语言只需将编程语言的通用架构拓展到你想学的编程语言即可,基本只需要查一下该语言的官方文档,搞清楚通用架构中的各个模块如何实现,就能迅速上手该编程语言。这也就是所谓的“以不变应万变”,学习编程关键是要掌握编程语言的通用架构。
如果想了解什么样的代码是好的代码,什么样的程序员是优秀的程序员?敬请关注本公众号的下一篇文章《编程规范及程序员的自我修养》。
关于人工智能中编程能力和技能训练的更多介绍,可以购买《人工智能怎么学》进一步阅读。
图书购买方式
京东:https://item.jd.com/13395339.html
当当:http://product.dangdang.com/29469230.html
天猫:https://detail.tmall.com/item_o.htm?id=687374654836
为了让图书惠及更多的读者,为更多想学习人工智能的人提供帮助,经过向出版社申请,对图书《人工智能怎么学》的部分内容进行改编和连载。图书《人工智能怎么学》的全部内容包含了初级入门、中阶提高以及高级进阶三个级别的内容。连载的内容主要是初级入门级别,适合想对人工智能进行快速和高效入门的读者,对于已有一定的人工智能学习基础,希望进一步进阶或提高的读者,则需要购买图书《人工智能怎么学》,学习中阶提高以及高级进阶的内容。此外,对于学习人工智能感兴趣的读者,也可以加入知识星球《人工智能怎么学》,知识星球是一个构建学习社群的平台,通过加入《人工智能怎么学》的社群,你将获得更多的学习资料和课程信息。
与作者互动和了解更多信息
想跟作者一起学习人工智能和互动,你可以加入如下社群:
知识星球:https://t.zsxq.com/0aLkVg0os
QQ群:600587177
想了解更多关于人工智能学习及实践的内容,请关注如下媒体:
官方网站:https://bigdatamininglab.github.io
官方微信公众号:人工智能怎么学(可扫描下方二维码或者微信搜索“人工智能怎么学”添加关注)
CSDN:https://blog.csdn.net/audyxiao001
参考文献
Robert C. Martin. 代码整洁之道(第2版)[M]. 韩磊, 译. 北京: 中国工信出版集团, 人民邮电出版社, 2020.
Herb Sutter, Andrei Alexandrescu. C++编程规范:101条规则、准则与最佳实践[M]. 刘基诚, 译. 北京: 人民邮电出版社, 2016.
杨冠宝. 阿里巴巴Java开发手册[M]. 北京: 电子工业出版社, 2020.
James Gosling et al. The Java Language Specification:Java SE 8 Edition[M]. Upper Saddle River: Addison-Wesley, 2014.
老九君. C++的发展简史[EB/OL]. https://www.cnblogs.com/ljxt/p/11636342.html, 2019-10-08.
翁惠玉. C++程序设计:思想与方法(第2版)[M]. 北京: 人民邮电出版社, 2012.
谭浩强. C++程序设计(第3版)[M]. 北京: 清华大学出版社, 2015.
Siddhartha Rao. Sams Teach Yourself C++ in One Hour a Day(Eighth Edition) [M]. Boston: Pearson, 2017.
Bjarne Stroustrup. Programming:Principles andPractice Using C++ (Second Edition) [M]. Crawfordsville: Pearson, 2014.
Bjarne Stroustrup. C++语言设计和演化[M]. 裘宗燕, 译. 北京: 人民邮电出版社, 2020.
Stephen Prata. C++ Primer Plus(中文第6版)[M]. 张海龙 等, 译. 北京: 人民邮电出版社, 2020.
Stanley B. Lippman, Josée Lajoie,Barbara E. Moo. C++ Primer(中文第5版)[M]. 王刚 等, 译. 北京: 电子工业出版社, 2013.
Stanley B. Lippman. Essential C++(中文版)[M]. 侯捷, 译. 北京: 电子工业出版社, 2013.
侯捷. STL源码解析 [M]. 武汉: 华中科技大学出版社, 2015.
Ivor Horton. C++标准模板库编程实战 [M]. 郭小虎 等, 译. 北京: 清华大学出版社, 2017.
Brian W. Kernighan, Rob Pike. 程序设计实践 [M]. 裘宗燕, 译. 北京: 机械工业出版社, 2003.
Bruce Eckel. C++编程思想(两卷合订本)[M]. 刘宗田 等, 译. 北京: 机械工业出版社, 2011.
Scott Meyers. Effective C++:改善程序与设计的55个具体做法(第3版)[M]. 侯捷, 译. 北京: 电子工业出版社, 2011.
Scott Meyers. More EffectiveC++:35个改善编程与设计的有效方法[M]. 侯捷, 译. 北京: 电子工业出版社, 2020.
Scott Meyers. Effective STL:50条有效使用STL的经验[M]. 潘爱民 等, 译. 北京: 电子工业出版社, 2013.
陆文周. Qt 5开发及实例(第4版)[M]. 北京: 电子工业出版社, 2019.
王维波. Qt 5.9 C++开发指南 [M]. 北京: 人民邮电出版社, 2018.
冯振, 郭延宁, 吕跃勇. OpenCV 4快速入门 [M]. 北京: 电子工业出版社, 2020.
ghscarecrow.Java的发展历程[EB/OL]. https://blog.csdn.net/ghscarecrow/article/details/82318636, 2018-09-02.
JMCui.Java的发展历程[EB/OL]. https://www.cnblogs.com/jmcui/p/11796303.html, 2019-11-07.
明日科技. Java从入门到精通(第5版)[M]. 北京: 清华大学出版社, 2019.
Kathy Sierra, Bert Bates. Head First Java (Second Edition) [M].Sebastopol: O’Reilly, 2005.
Bruce Eckel. Java编程思想(第4版)[M]. 陈昊鹏, 译. 北京: 机械工业出版社, 2007.
Cay S. Horstmann. Java核心技术 卷I:基础知识(第11版)[M]. 林琪 等, 译. 北京: 机械工业出版社, 2019.
Cay S. Horstmann. Java核心技术卷Ⅱ:高级特性(第11版)[M]. 陈昊鹏, 译. 北京: 机械工业出版社, 2020.
Joshua Bloch. Effective Java(中文第3版)[M]. 俞黎敏, 译. 北京: 机械工业出版社, 2019.
周志明. 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)[M]. 北京: 机械工业出版社, 2019.
Brian Goetz. Java并发编程实战 [M]. 童云兰 译. 北京: 机械工业出版社, 2012.
Kamalmeet Singh. Java设计模式及实践 [M]. 张小坤 等, 译. 北京: 机械工业出版社, 2013.
明日科技. Java Web从入门到精通(第3版)[M]. 北京: 清华大学出版社, 2019.
未来科技.HTML5+CSS3+JavaScript从入门到精通[M]. 北京: 中国水利水电出版社, 2017.
Elisabeth Robson, Eric Freeman. Head First HTML与CSS(第2版)[M]. 徐阳 等, 译. 北京: 中国电力出版社, 2013.
Adam Freeman. HTML5权威指南 [M]. 谢廷晟 等, 译. 北京: 人民邮电出版社, 2014.
Eric A. Meyer, Estelle Weyl .CSS权威指南(第4版)[M]. 安道, 译. 北京: 中国电力出版社, 2019.
David Flanagan. JavaScript权威指南(第7版)[M]. 李松峰, 译. 北京: 机械工业出版社, 2021.
许令波. 深入分析Java Web技术内幕(修订版)[M]. 北京: 电子工业出版社, 2014.
Nicholas S. Williams. Java Web高级编程 [M]. 王肖峰, 译. 北京: 清华大学出版社, 2015.
孙卫琴. Tomcat与Java Web开发技术详解(第3版)[M]. 北京: 电子工业出版社, 2019.
郭霖. 第一行代码Android(第3版)[M]. 北京: 人民邮电出版社, 2020.
欧阳燊. Android Studio开发实战:从零基础到App上线(第2版)[M]. 北京: 清华大学出版社, 2018.
Dmitry Jemerov, Svetlana Isakova. Kotlin实战 [M]. 覃宇 等, 译. 北京: 电子工业出版社, 2017.
Kristin Marsicano, Brian Gardner, Bill Phillips, Chris Stewart. Android编程权威指南(第4版)[M]. 王明发, 译. 北京: 中国工信出版集团, 人民邮电出版社, 2021.
刘望舒. Android进阶之光(第2版)[M]. 北京: 电子工业出版社, 2021.
邓凡平. 深入理解Android: Java虚拟机ART [M]. 北京: 机械工业出版社, 2019.
任玉刚. Android开发艺术探索[M]. 北京: 电子工业出版社, 2015.
林学森. 深入理解Android内核设计思想(上、下册)(第2版)[M]. 北京: 人民邮电出版社, 2017.
何红辉, 关爱民. Android 源码设计模式解析与实战(第2版)[M]. 北京: 人民邮电出版社, 2017.
Christian Keur, Aaron Hillegass. iOS编程(第6版)[M]. 王风全, 译. 武汉: 华中科技大学出版社, 2019.
张益珲. Swift 4从零到精通iOS开发[M]. 北京: 清华大学出版社, 2019.
Aaron Hillegass, Mikey Ward. Objective-C编程(第2版)[M]. 王蕾 等, 译. 武汉: 华中科技大学出版社, 2015.
Matthew Mathias, John Gallagher. Swift编程权威指南(第2版)[M]. 陈晓亮, 译. 北京: 人民邮电出版社, 2017.
Kazuki Sakamoto, Tomohiko Furumoto. Objective-C高级编程:iOS与OS X多线程和内存管理[M]. 黎华, 译. 北京: 人民邮电出版社, 2013.
Erica Sadun. iOS Auto Layout开发秘籍(第2版)[M]. 孟立标, 译. 北京: 清华大学出版社, 2015.
珲少. iOS性能优化实战[M]. 北京: 电子工业出版社, 2019.
罗巍. iOS应用逆向与安全之道[M]. 北京: 机械工业出版社, 2020.
Gaurav Vaish. 高性能iOS应用开发[M]. 梁士兴 等, 译. 北京: 人民邮电出版社, 2017.
刘浩. MATLAB R2020a完全自学一本通 [M]. 北京: 电子工业出版社, 2020.
天工在线. MATLAB 2020从入门到精通 [M]. 北京: 中国水利水电出版社, 2020.
苗志宏, 马金强. MATLAB面向对象程序设计[M]. 北京: 电子工业出版社, 2014.
徐潇, 李远 . MATLAB面向对象编程——从入门到设计模式(第2版)[M]. 北京: 北京航空航天大学出版社, 2017.
王文峰 等. MATLAB计算机视觉与机器认知[M]. 北京: 北京航空航天大学, 2017.
杨淑莹, 郑清春. 模式识别与智能计算——MATLAB技术实现(第4版)[M]. 北京: 电子工业版社, 2019.
Eric Matthes. Python编程:从入门到实践(第2版)[M]. 袁国忠, 译. 北京: 人民邮电出版社, 2020.
Magnus Lie Hetland. Python基础教程(第3版)[M]. 袁国忠, 译. 北京: 人民邮电出版社, 2018.
Luciano Ramalho. 流畅的Python [M]. 安道 等, 译. 北京: 人民邮电出版社, 2017.
Brett Slatkin. Effective Python:编写高质量Python代码的90个有效方法(第2版)[M]. 爱飞翔, 译. 北京: 机械工业出版社, 2021.
Jan Erik Solem. Python计算机视觉编程[M]. 朱文涛 等, 译. 北京: 人民邮电出版社, 2014.
Andreas C. Müller. Python机器学习基础教程[M]. 张亮, 译. 北京: 人民邮电出版社, 2018.
魏坤. Julia语言程序设计[M]. 北京: 机械工业出版社, 2018.
郝林. Julia编程基础(第2版)[M]. 北京: 人民邮电出版社, 2020.
Ben Lauwens, Allen B. Downey. Think Julia [M]. Sebastopol: O’Reilly,2019.
Jalem Raj Rohit. Julia Cookbook [M]. Birmingham: PacktPublishing, 2018.
Zacharias Voulgaris. Julia数据科学应用 [M]. 陈光欣, 译. 北京: 人民邮电出版社, 2018.
朱红庆. Julia机器学习核心编程:人人可用的高性能科学计算[M]. 北京: 电子工业出版社, 2019.
Norman Matloff. R语言编程艺术[M]. 陈堰平, 译. 北京: 机械工业出版社, 2013.
Andy Nicholls, Richard Pugh, Aimee Gott. R语言入门经典[M]. 姜佑 等, 译. 北京: 人民邮电出版社, 2018.
Robert I. Kabacoff. R语言实战(第2版)[M]. 王小宁 等, 译. 北京: 人民邮电出版社, 2016.
Hadley Wickham. 高级R语言编程指南[M]. 潘文捷 等, 译. 北京: 机械工业出版社, 2020.
Brett Lantz. 机器学习与R语言(第2版)[M]. 李洪成 等, 译. 北京: 机械工业出版社, 2017.
程乾, 刘永, 高博. R语言数据分析与可视化从入门到精通[M]. 北京: 北京大学出版社, 2020.
周伟明.程序员的十层楼(一、二、三)[J]. 程序员, 2009(6):134-136;2009(7):118-120; 2009(8):134-136.
注:本文版权归作者个人所有,如需转载请联系作者,未经授权不得转载。