在电影中我们经常看到这样的画面:
时间紧迫,一个电脑高手疯狂敲击着键盘,在最后一秒按下enter键将指令发出,地球另外一端的某个核武器就被关闭了。最终电脑高手拯救了世界,赢得美人归。
屏幕上代码刷刷地闪烁一通,棘手的问题便被解决了。电脑高手给人的感觉是很了不起的,因为他们干了些看起来很高深的事情,
不过,编程真有那么神奇么?
其实不然,本文就是要来讲讲,编程的本质究竟是什么?孩子究竟要不要学习编程?
Part.1
什么是编程
编程,顾名思义,由两部分组成:
其一是编写。
其二是程序。
有许多活动与编程类似。
作曲:组织音符制作音乐。
烹饪:组织食材制作菜肴。
画画:组织色彩表达画面。
搭积木:组织积木位置关系表达结构。
写作:组织文字表达思想。
说话:组织语言表达思想。
它们与编程的共同点是,组织有限的材料来创作某个东西。
编程是一种编写和组织代码的活动,创作的是程序,而程序是为了完成某种计算,实现某些功能。
代码,由数据和指令组成,是人类和计算机沟通的语言,它的作用就是告诉计算机要如何处理数据。
数据,就是由0和1两种数字组合的二进制数所表达的信息,数据其实是一种信息,不然为什么我们现在要叫做信息时代呢。
由于计算机由电路组合起来,能够响应电路的开和关,开和关又能和二进制数中的0和1对应起来。因此,计算机建立在二进制基础之上,计算机能理解的所有信息,都是二进制形式的。
信息的最小单位是比特,同时也是二进制中的位。每个0或1就是1位,位是存储数据或信息的最小单位。1位也叫做1比特。1比特最多能表达2个信息。
比方说,你看完这篇文章后可能会点赞。假如我想知道你有没有点赞,用1个比特就足够记录了:
0表示没有点赞。
1表示点赞了。
那么,我要怎么知道你是否点赞,以及是否转发呢?点赞与否,转发与否的可能性有4种:
情况1:不点赞,不转发
情况2:仅点赞,不转发
情况3:不点赞,仅转发
情况4:即点赞,又转发
由于1个比特只能表示2个信息,没办法表达4个信息,因此我们增加1位,用2位二进制数(也就是2个比特)来表达。
第1位用来表示是否点赞,第2位用来表示是否转发。那么,上面的信息可以表示为:
00表示不点赞,不转发
10表示仅点赞,不转发
01表示不点赞,仅转发
11表示既点赞,又转发
利用二进制表示信息的好处就是我们可以清楚的知道所有潜在的可能性。
以上,就是用2个比特表示点赞和转发状态的方式,也叫做信息编码。
计算机处理的数据都是通过信息编码得来。通过编码把现实中事物投射到数字世界中。数字、文字、符号、盲文、摩尔斯电码、声音、图片、影像,通通可以编码为数字。只有编码为0和1的数据,计算机才能进行计算处理。
可惜,不是所有的东西都能被编码。对于那些你无法用语言、图画或声音来表达的东西,就不太好编码,所以计算机也无法处理。比如爱情,或者同情心。
指令,是指处理数据的操作或方式,简单来说,就是程序员命令计算机做什么动作。
嗯,的确可以用命令来形容人类对计算机发出的指令。因为计算机对指令是百分百不打折扣地执行。
不信的话?你试试点赞本文,点赞后文末的大拇哥图标旁边的数字就会增加1。这就是计算机对你点赞指令进行百分百执行的结果。
那么,计算机内部有哪些指令呢?
随便说几个,比如加法指令,把两个数加在一起,求它们的和。乘法指令,反复进行加法操作,得到两个数的乘积。保存指令,把前一步加法计算的结果,保存到内存中等待之后使用。
指令和数据一样,也通过编码为二进制0和1表示的。
总之,无论数据还是指令,在计算机的眼中它们就是0和1排列组合成的数字。而且,计算机眼中除了这些数字之外,并没有其他东西。
因此,编写代码实际上是把一堆0和1组成的数字写入计算机中,通过这些0和1组成的数据和指令告诉计算机要做什么。(对这点你可能感到奇怪,我下文会继续来解释)
原理是不是很简单?理解了这个,你已经理解了编程的本质了。
那么编程语言又是这么一回事?
Part.2
什么是编程语言
编程语言是人与计算机沟通的语言,就好像我们的母语的汉语,世界的语言英语一样。语言是用来沟通和交流的,我们用编程语言给计算机发指令,告诉它该做什么。
前面说过,经典计算机只能理解数字0和1组成的数据和指令。最早的程序员是通过输入0和1来形成指令和数据与计算机直接进行交流的。这种语言叫做机器语言。
这种语言对计算机来说简便易懂,但对编写程序的人类来说,使用起来不仅非常繁琐,还十分容易出错。
想象一下,如果汉字被编码成0和1组成的数字,写作时只能写0和1,每4个数字代表一个汉字。阅读起来是不是非常不方便?
01010101010111111010101010101010101101010101101000001110101010000000001101111101101010001011111010110111000101
上面我说了一段话,里面的信息是下一期双色球的中奖号码,能看得懂不?哈哈,开个玩笑。
使用机器语言编写程序就如同用竹篮打水,伸出手臂到水面打水,每次却只能获取到一点点水,整个过程漫长而艰辛。
与此同时,每个机器码所能完成的工作又微乎其微:
指令A是从内存中取得一个数;
指令B是把数加载到处理器;
指令C是与另外一个数相减;
指令D是把运算结果保存起来;
。。。。。。
由于每个机器码所能完成的工作非常少,而你必须从头开始编写每一个机器码,所以很难想象到底如何通过机器码构成整个程序的。或者说,用机器码来构建整个程序,比如微信,是难度非常高的一件事情。
某些聪明又懒惰的程序员很快发现(偷懒果然是人类进步的源泉),实现某些小功能的机器码总是成套重复出现,比方说实现加法需要用到8句机器码。无论哪两个数相加,都可以用这8句机器码实现。
那么,为什么还要重复编写这8句机器码呢?
他们想到一个好办,找来一个盒子,把这8句编码放到盒子里头,盒子外面写上ADD,表示这是若干能完成加法操作的机器码的集合。这个把若干零散的机器码打包起来的操作,就叫做封装。
封装,就是把结构内部的信息隐藏起来,只露出可供人们使用的功能和接口。封装这个概念在编程中很常见,面向对象编程的三大核心概念之一就是封装。说远了,其实封装在生活中也经常运用。
比如电梯,电梯把电机、缆线、电梯井等设备封装起来,只暴露出轿厢和按钮,提供楼层间运输功能。使用者无需关心电梯原理,也能享受电梯带来的便利。
前面说到,把完成加法的一系列列机器码封装起来,取个名字叫做ADD,ADD比01010101010100可容易理解多了,慢慢的,越来越多的封装过的盒子被发明出来,写上NOT(逻辑运算指令),SUB(减法指令),INC(加一指令),CMP(比较指令)等等,这些就是助记符。
助记符是表明指令的英文单词或其缩写,ADD就是加法,SUB就是减法,一看就懂,还容易记忆。
在助记符基础上发展出来的语言叫做汇编语言,它采用助记符编写程序,比用机器语言的二进制代码编程要方便些,在一定程度上简化了编程过程。
现在,会汇编语言的程序员都是大佬哦。
当然,不要误会我的意思。我并不是说汇编语言多好,反而是说汇编语言虽然有所进步,但依然难用。它与人们自然语言的表达方式仍然相距甚远。所以说,现在能掌握汇编语言的程序员,都挺厉害的,挺不容易的。
后来,影响世界进程的C语言出现了。C语言是一种高级语言,它封装了汇编语言,功能更丰富,更强大。
在C的基础上,又出现了很多语言,包括C++、C#、Java、Python等更高级的语言,这些语言又对C语言进行了封装。
整个编程语言其实是朝着更接近自然语言的方向发展的。说白了,编程语言的表达方式越像说话、写作一般自然而然,才会越容易使用。
如果你坐在计算机面前,只需要说出一些口语式命令便能让计算机完成工作,比方说“帮我完成今天的作业“,“帮我处理这张报表,然后发到老板的邮箱”,“把这个月工资打到我老婆账上”。那么,你所使用的才是一种真正高级的语言。可惜,今天的程序语言还达不到如此智能的水平。
Part.3
计算机要计算什么?
前面两节我们聊了编程与编程语言的本质,那么编程活动究竟有什么目的呢?
显然,编程的目的是制作程序,用程序完成某些功能。比方我前段时间做的识字小程序很受大家喜欢。它简单实用,能完成汉字复习、错字记录、字表导入等功能,最终帮助孩子学习汉字和复习汉字。
编写这个程序时,我首先确定程序要做什么(明确需求),然后思考如何组织数据和指令去实现需求。
本质上,这是从实际问题中把数据模型抽象出来的过程,也就是数学建模。
只要信息能被表达为数据,只要你掌握了处理数据的办法,就可以建模。
以前的科研人员在数学建模后,是依靠手动去计算。后来计算机出现了,计算器非常擅长进行运算,人们把计算的工作就交给了计算机。
科研人员只用考虑如何控制计算机,也就是编程。
其实这就是计算机要计算的东西,本质上还是数据和指令。
对于识字程序来说,它的数据是大家在txt文档中输入的汉字,其他乱七八糟的符号、数字,都不是我们需要的数据。
这些汉字会被程序从txt抽取出来,显示到屏幕上。这就涉及到数据的提取、处理、展示等等。
程序还会随机展示一个汉字让孩子复习。这里就设计到随机算法(用一系列指令来生成伪随机数)。好在编程语言已经封装好了一个随机算法,我就不用重复造轮子了,直接拿来用就行。
当然,也有的问题是无法计算的。
一种是违背物理规律的事情,比如五彩斑斓的黑,再厉害的程序员也无法实现。
另一种是违背数学原理。比如前面说的随机数算法,它产生的数不是真正的随机数,只是看起来像随机的数而已。
真正的随机数毫无规律,也无从寻找一个算法去把它计算出来。生成真正随机数的算法的代码恐怕比随机数本身还要长。总而言之,随机数是不可计算的。
因为绝大多数的数是无规律可循的,也就意味着绝大多数的数是不可计算的。但,幸运的是绝大多数的问题是可计算的,这就是为了今天的计算机被如此广泛地运用的原因,各行各业都需要计算机帮助处理数据呀!
从计算机诞生开始,数学和计算机科学并行发展,数学对越来越多的学科进行建模,生物学、化学、经济学、心理学先后被数学建模,因此计算机也就能参与到越来越多的学科研究之中。未来,计算机的运用范围只会越来越广。
Part.4
结束语
说到这里,相信某些朋友心中一定有这样那样的疑问:那孩子要学编程吗?编程应该怎样学?学什么编程语言呢?
其实编程的本质就是建模+数据+指令,非常简单。从编程的本质出发,去思考你心中的疑惑,一定能得到你所想要的解答。
比方说,问编程值得学吗?
其实是在问,数学建模、抽象思维、数据处理、逻辑思维,值不值得学!
建模包含了对现实问题的抽象,数据包含了对信息的编码,对信息的收集、加工,指令包含了流程、逻辑,因此编程的过程是一场综合的思维体操。
好了,关于编程,大家还想要了解什么内容,欢迎留言告诉我。需要再聊一聊儿童编程相关的内容么?点赞告诉我吧!
地址:北京市大兴区星光影视园区A座
电话:400 - 6268 - 656 010-80255133 400-6636-996
邮箱:331404916@qq.com
版权所有:北京聚匠艺传媒有限公司
京ICP备18058632号-4