编程语言,是用来定义计算机程序的形式语言,用来向计算机发出指令。编程语言的描述一般可以分为语法及语义。语法是说明编程语言中,哪些符号或文字的组合方式是正确的,语义则是对于编程的解释。
00
Scratch是由美国麻省理工学院的“终身幼儿园”团队于2003年开始研发,并于2007年发布的一款图形化编程语言。
麻省理工学院“终身幼儿园”团队之所以选择Scratch作为编程语言的名称,这跟音乐领域的“scratch”有关。

“Scratch”,源自嘻哈音乐家们刮擦音乐的方式。他们截取不同的音乐片段,然后以意想不到的方式创造性地将它们组合在一起,从而形成新的音乐。
同样,在Scratch中,您可以使用不同的代码(块),将它们组合在一起,然后做出新的东西。
Scratch采用搭积木的方式来完成程序的编写。通过Scratch不仅可以学习计算机科学的常见概念,还可以培养孩子如何有创意地思考并创作出各种有趣的动画和游戏。
Scratch是通过将计算机指令模块化,通过拼接块的方式来完成特定的功能。例如“让角色在屏幕上移动”或“显示一个文本信息到屏幕上”。Scratch具有许多编程语言的重要特性,如循环结构、条件结构和事件控制。借助于这些特性,我们可以通过指令或算法来完成特定任务。
Scratch是一种启蒙性的编程语言。常见的学习者为初中生和小学生。工业界和学术界不使用Scratch语言。
01
不死Java,不朽C/C++,新贵Python。
尽管Python出圈的时间相对短一点,但其实Python的诞生时间很早,比1995诞生的Java都早了六年。
1989年,荷兰天才程序员Guido von Rossum(吉多·范·罗苏姆)在为一款基于微内核的分布式系统编写功能模块时,使用C语言编写主要功能,同时使用shell语言作为胶水,调用众多的C语言程序协同完成任务。
因为用C语言编写程序很费时,Guido不禁开始思考,能否有一种编程语言,既能够完成控制中央处理器的工作,又能够像shell语言一样无需编译即可执行,甚至还可以具备胶水语言能力,调用其他语言编写的程序。
当时Guido van Rossum于已经使用ABC语言工作了数年。ABC语言是NWO(荷兰科学研究组织)旗下CWI(荷兰国家数学与计算机科学研究中心)的Leo Grurts,Lambert Meertens,Steven Pemberton主导研发的一种交互式、结构化的高级语言,旨在替代BASIC,Pascal等语言,用于教学及原型软件设计。ABC语言的特点是简洁明快,贴近自然语言,易学易懂。但是ABC语言有一些特点在当时却成为语言发展的拖累:①程序不能扩展,迭代内容如同修改作文,需要大量修改已经完善的代码;②语言本身仅仅专注于编程初学者,没有把有经验的编程人员纳入其中。
于是Guido开始研发一种符合自己期待的编程语言,他想让这种新的编程语言同时具备脚本语言和编译型语言的特征。
最终,结合了C语言和Shell语言特征,并一定程度上受到ABC语言影响的新语言诞生了。如你所想,这种语言就是Python。
有一个有趣的事实是,Python并不是根据这个单词的本义“大蟒蛇”来命名的。当时,Monty Python(蒙提派森)是英国的六人喜剧团体,相当于是喜剧界的披头士。Guido是Monty Python的狂热粉丝,于是就将这种新生的编程语言命名为Pythoh。
Python具有的特征有:可读性强、既支持面向对象也支持面向过程、免费开源、扩展性强、有大量的第三方支持库、简单易学、灵活易用等,Python是一门解释型语言。
Python的用处多多,下面是一些例子。
Python可用于网络应用,包括网站、后台服务等等。
Python可用来编写脚本小工具。脚本指的是一小段代码,这段代码可以用来完成一些自动化工作,比如自动回复邮件、系统管理员所需的定时任务等。
Python可应用于机器学习,机器学习是人工智能的基础。机器学习在生活中应用很广,比如淘宝京东亚马逊的商品推荐就利用了机器学习,再比如您手机上的人脸识别和语音识别也是用的机器学习技术。
Python可以用于数据分析。数据科学家们可以使用Python进行数据分析并将数据可视化成报表。
Python还可以用来编程网络爬虫,以便从浩瀚的互联网信息大海中爬取出对您有用的内容。
Python还可以用来开发游戏、开发嵌入式应用以及桌面应用程序等。
任何编程语言都有缺点,Python也不例外。
第一个缺点就是运行速度慢,和C/C++程序相比很慢很慢,因为Python是解释型语言,代码在执行时会逐行翻译成中央处理器能理解的机器码,这个翻译过程非常耗时,所以很慢。而C/C++程序是运行前将代码编译成中央处理器能执行的机器码,所以非常快。话说回来其实大量的应用程序不需要这么快的运行速度,因为用户根本感觉不出来。例如开发一个下载应用程序,如果是C程序运行时间需要0.001秒,而如果是Python程序运行时间需要0.1秒,慢了100倍。但由于网络更慢,需要等待1秒。您想,用户能感觉到1+0.001=1.001秒和1+0.1=1.1秒的区别吗?这就好比F1赛车和普通的出租车在北京三环路上行驶的道理一样,虽然F1赛车理论时速高达400公里,但由于三环路堵车时速只能达到20公里,因此,作为乘客,你无论坐哪辆车,感觉到的时速都是20公里。除非对于一些实时性要求较高的应用比如金融交易交易系统,否则不用在意程序的运行速度。
第二个缺点就是代码不能加密。如果要发布你的Python程序,实际上就是发布源代码,这一点跟C/C++语言不同。C/C++语言不用发布源代码,只需要把编译后的机器码(也就是你在Windows上常见的.exe文件)发布出去就可以了。要从机器码反推出C代码是不可能的。所以,凡是编译型的语言,都不需要发布源代码,而解释型的语言,则必须把源码发布出去。当然这个缺点仅限于您把编写好的软件卖给别人挣钱的时候。好消息是目前的互联网时代,靠卖软件授权的商业模式越来越少了,靠网站和移动应用卖服务的模式越来越多了,后一种模式不需要把源码给别人。再说了,现在如火如荼的开源运动和互联网自由开放的精神是一致的,互联网上有无数非常优秀的像Linux一样的开源代码,作为程序员不要高估自己写的代码有非常大的“商业价值”。那些大公司的代码不愿意开放源代码的原因,一是因为源代码被视为公司的商业机密,二是因为代码写得太烂了,一旦开源,就没人敢用他们的产品了。
02
在讲述C++的故事之前,咱们不得不提一下C语言。1972年,Denis Ritchie(丹尼斯·里奇)在美国贝尔实验室设计了C语言。Denis Ritchie是在B语言和BCPL语言的基础上,添加了数据类型和一些强大的语言特性,从而造就了C语言。
1979年,Bjarne Stroustrup(本贾尼·斯特劳斯特卢普)在剑桥大学准备博士论文的时候,开始构思C++。那一时期Bjarne使用的是Simula语言,这门语言被认为是世界上第一门面向对象的语言。Bjarne极为喜欢Simula面向对象的思想,但是因为Simula在实际应用中运行速度太慢了,所以他就尝试在C语言的基础上添加面向对象的特性。当时Bjarne把这种新语言会员名为“带类的C语言”(C with classes)。1983年,Bjarne把“带类的C语言”改名为C++、C++在C的基础上添加了很多新特性,比如类、继承、封装、多态、内联、强类型检查等。第一个用于商业领域的C++语言发布于1985年。
自从C++被发明以来,它经历了3次主要的修订,每一次修订都为C++增加了新的特征并作了一些修改。第一次修订是在1985年,第二次修订是在1990年,而第三次修订发生在c++的标准化过程中。
在20世纪90年代早期,人们开始为C++建立一个标准,并成立了一个ANSI和ISO(International Standards Organization)国际标准化组织的联合标准化委员会。该委员会在1994年1月25日提出了第一个标准化草案。在这个草案中,委员会在保持Bjarne最初定义的所有特征的同时,还增加了一些新的特征。
在完成C++标准化的第一个草案后不久,发生了一件事情使得C++标准被极大地扩展了:Alexander stepanov创建了标准模板库(Standard Template Library,STL)。标准模板库不仅功能强大,同时非常优雅,然而,它也是非常庞大的。在通过了第一个草案之后,委员会投票并通过了将标准模板库包含到C++标准中的提议。标准模板库对C++的扩展超出了C++的最初定义范围。虽然在标准中增加STL是个很重要的决定,但也因此延缓了C++标准化的进程。
委员会于1997年11月14日通过了该标准的最终草案,1998年,C++的ANSI/IS0标准被投入使用。通常,这个版本的C++被认为是标准C++。所有的主流C++编译器都支持这个版本的C++。
下图列示了C++历史上的重要事件:
C++是C语言的继承和超集,进一步扩充和完善了C语言,成为一种面向对象的程序设计语言。C++这个词在中国大陆的程序员圈子中通常被读做“C加加”,而西方的程序员通常读做“C Plus Plus”,或者“CPP”。
在一些领域,C++有着根本性的优势:系统程序设计、嵌入式程序设计、数值科学计算、通用程序设计以及混合系统设计等等。
让我们略微展开描述一下:
1 操作系统。Windows/MacOS/Unix/Linux,内核都是用C/C++编写的。
2 数据库。MySQL和Postgres数据库是用C/C++编写的。大多数网站所用的数据库是MySQL。
3 嵌入式。嵌入式Linux的内核基本上都是使用C语言开发的。但是在嵌入式产品的开发过程中,如在 Linux BSP 的开发过程中,为了提高产品的开发效率,方便应用开发工程师的调用,往往需要在BSP中实现大量的中间件,这些中间件往往使用C++开发。Windows CE 的内核开发大部分是采用 C++ 完成的。基于嵌入式 Linux 的产品,规模稍微大点的应用软件,基本上都是使用 C++ 开发的。
4 浏览器。比如Google Chrome、Firefox、Safari、Opera、搜狗、遨游等浏览器,都是用C++编写的。
5 大型桌面应用程序多是用C++编写的。比如Office、 WPS和Photoshop等。
6 主流的大型网络游戏,基本上都是用C++编写的。比如魔兽世界、梦幻西游等,太多了。与其问“哪些大型游戏是用C++写的”,不如问“哪些大型游戏不是用C++写的”。
7 金融模型和证券交易系统。C++之父Bjarne Stroustrup就职于摩根士丹利纽约总部,担任信息技术部的董事总经理。
8 编译器。不少编译性的语言,比如Java和C#的编译器,是用C++写的。
9 扫描仪软件。比如打印Word或PDF文档时,就会用到C++编写的扫描仪软件。
10 动画。知道“蜘蛛人”、“指环王”的电脑特技是使用什么软件做出来的吗?没错,就是Maya(玛雅)。玛雅软件就是用C++开发的。
11 大型电商系统,比如Amazon.com。
12几乎所有严肃的工控系统软件和实时数据采集、处理和表现(主要是图形)软件,都是采用C++(或C,少部分采用Java)编写而成的。
13 银行应用。银行应用系统每天要处理海量交易,因此需要高并发、低延迟的技术支持。C++因为运行速度快、支持多线程等特征,自然就成为银行应用程序的首选语言。
14 云存储/分布式系统。
15 音频播放器、视频播放器。
16 医疗软件。比如核磁共振系统。
C++的一大特点是太灵活,这直接导致了C++语言过于复杂。这里的复杂是指设计上的多样性。但这也是C++的最大优点,C++从不会给你在软件设计上套上任何枷锁。
C++很复杂,学习成本高,心智负担重。这门语言有太多的诱惑,程序员需要极度的自律。而C++设计成这样也是因为Bjarne说过他不希望把自己任何的喜恶都加在语言上,他希望程序员自己去判定,完全信任程序员。
C++就像重武器,如果没有很长时间的开发经验会在开发过程中过度拘泥于语言本身的问题。
C++是一门用程序员的时间、精力去换取程序的运行效率的编程语言。
C++的另一缺点是编译速度慢。
除了语言复杂、编译慢外,C++的最大问题就是有一群二把刀程序员总觉得自己懂C++。
03
C++语言是够灵活,但首先要看看使用者能不能发挥它的灵活性;C++语言是够强大,但要看看使用者有没有本事发挥它的强大功能。
使用C++语言和编译器编写一个快速的程序,并不难,不过编写一个强健而高效的大型程序,就不是那么容易了。
花有几样红,人与人不同。语言与语言之间也不相同。语言之间的区别,绝非只是语法之间的区别。选择了一种语言,就选择了一种思维方式,一种程序设计思想。要想跳出语言的束缚,首先要对语言有着深刻的认识和透彻的把握。世界上一些大师级的人物,也常常毫不掩饰自己对某种语言的偏爱。一些人对语言只是一知半解,就大谈特谈要跳出语言的束缚--你无需跳出,因为你根本不曾深入。
有一些人,喜欢抹杀不同语言、不同开发工具之间的区别。抱持这种观点的人,若非无知,就是别有用心。这就好比杂牌笔记本电脑厂商最喜欢叫嚷“笔记本电脑已经进入同质时代”一样,杂牌机怎能和品牌机相比?
纯粹的技术性和学术性研究,总能给人带来纯粹的快乐。C++语言复杂至极,可研究性极强。一般来说,没有3~5年的持续学习、思考和使用,是不可能真正掌握C++的。只有深入钻研,才有机会达到“用到极处必成神”的境界。
不管你走什么样的技术路线,不管你用不用它做开发,学习C++总会带来长远的好处。一名熟悉C++的开发人员,再去学习Java或Python,会觉得容易得多。反过来一名熟悉Java或Python的开发人员,再去学习C++,可能需要一段时间来适应。
C++不过是一门编程语言,我们总是要用它来解决实际问题,所以要学习开发工具(比如Visual Studio C++),了解操作系统(比如Linux),熟悉领域知识(比如金融交易模型),掌握其他软件技术(比如数据库),钻研算法,等等。编写真正的代码,解决实际问题的能力,才是衡量一名程序员是否有真水平的唯一标准。
04
最后,回归本文的正题:小朋友学编程是否有必要按从Scratch到Python再到C++的顺序学习?
先看看这三者的关系。虽然Scratch最简单,Python也不难,C++最难,但是Scratch不是Python的前提,Python不是Scratch的进阶;Python不是C++的前提,C++也不是Python的进阶。
其次看学习编程的目的。虽然Python和C++的功能很强大,但小朋友学Python通常是以桌面小应用程序或小游戏为主,小朋友学C++则多半是为了准备参加信息学奥林匹克竞赛。所以如果纯粹是为了培养兴趣和提升思维能力,那么学Scratch、Python或C++都可以。如果在培养兴趣、提升思维能力的同时,也想打打信息学奥赛,那么最好直接学C++。
信息学奥赛的C++跟工业上的C++,差别很大。这个世界上只有一种C++,但是信息学奥赛所使用的C++,去掉了面向对象这一部分(其实C++里的结构体也是面向对象的思想,不过初期不需要学得太深入)。C++复杂的地方,正是在于面向对象这一块。信息学奥赛所用到的C++,其实是C语言加上C++中的标准模板库。所以信息学奥赛中的C++,并没有那么难。信息学奥赛的难点,不在于C++语言本身,而在于算法。
算法跟C++有什么有关系呢?对编程接触得较少的人,可以大体上这么类比,算法就好比写作文,写作文可以使用任一个国家的语言:中文、英语、法语、俄语、西班语、阿拉伯语等。C++可类比成这些语言里的某一门,比如中文。作文的主要作用是表达作者的思想,语言只是工具,无论你用的是哪门语言,都可以表达出作者的思想。同样的,算法也可以用任何一门语言,比如C++、Python、Java、Scratch等来表达,但是C++因为运行速度快、面向底层硬件、更有利于小朋友们打基础等特点,成为各种算法比赛(包括信息学奥赛)必然可使用的语言之一,在有些比赛里甚至会成为唯一指定的语言。
再次跟年龄有关。越简单的知识就更适合低龄的小朋友学习。所以Scratch对小朋友的年龄要求最低,Python其次,C++则要求稍大一点的小朋友学习。
最后跟基础有关。Scrarch要求最低,Python高一点,C++(信奥)则要求较好的语数英底子,尤其是数学底子。
所以,学C++之前,不是非得学过Scratch和Python不可。
参考资料:
【1】
https://scrath.mit.edu
【2】
https://en.scratch-wiki.info/wiki/Scratch
【3】
https://exyte.com/blog/a-brief-history-of-python
【4】
https://beginnersbook.com/2018/01/introduction-to-python-programming/
【5】
https://www.sitesbay.com/cpp/applications-of-cpp
【6】
https://hackr.io/blog/features-uses-applications-of-c-plus-plus-language
【7】
https://www.invensis.net/blog/applications-of-c-c-plus-plus-in-the-real-world/