编程语言是什么?
“编程语言”首先是一种语言。
那么,语言是什么?这是个很大也很难的问题,只敢尝试着说明一下。
想象一个场景,假如世界上只有你和你的宠物狗,那么一人一宠用来交流的“语言”大概只需要两个单词就可以了。
第一个单词是宠物狗对你的称呼。可能就是个“汪”。不论是它想吃东西了、想喝水了、想玩耍了,它都会第一时间想到它的“汪”,也就是它的主人——你。
第二个单词是你对宠物狗的称呼。我们人类的表达会更丰富一点(不然怎么体现食物链顶层生物的优越性^o^),你可能叫你的宠物狗“狗狗”,如果很喜欢它可能叫“宝贝”,再有想象力一点,还可以叫它“来自天堂的毛茸茸的小puppy”或者“来自深渊的恶魔的坐骑”。但无论怎么叫,你都知道你叫的就是你的宠物狗。
所以,语言是我们对客观世界的描述,不仅我们人类这么用,动物也会这么用,比如宠物狗就在用“汪”来代表它的主人。
进入一个略微复杂一点的场景,假如现在你有了一个异性的伴侣,当你指着你的宠物狗对Ta说,“这是来自深渊的恶魔的坐骑”,你的伴侣第一反应可能是“神经病啊……”;但你对Ta说,“这是我的宠物狗”的时候,Ta会“嗯嗯”的赞同你一下,然后还可能弯下身子摸摸你的宠物狗(爱屋及乌啦)。
所以,语言不仅属于我们个人,更属于群体。语言是群体对于客观世界的表达规范,只有遵守了这样的规范,大家才能互相之间无障碍的沟通。中国人的表达规范形成了“汉语”,英国人的表达规范则形成了“英语”。
而英语和汉语之所以能够相互翻译,是因为他们都是基于客观世界的真实存在。比如说汉语的“鸟”和英语的“bird”指的都是“长了两个翅膀,会在天上飞,叫声很悦耳的那种小生灵”。
真实世界,是两种语言之间的桥梁。
回到编程语言是什么的问题。
计算机不像“生物”具有学习和认知的能力,它理解不了真实的世界,理解不了人类的语言,甚至连“编程语言”计算机其实也不理解。它只认识“程序”。
编程语言,就是程序员将Ta所认知的世界翻译成计算机所认识的程序的一种工具(语言)。就像汉语、英语所充当的角色一样,只不过一种将世界翻译给人理解,一种将世界翻译给机器理解。
程序员其实是真实世界与计算机之间的翻译官。所以好的程序员不仅要了解计算机,还得了解真实世界——累(^_-)。
对象是什么?类又是什么?为什么要面向对象?
编程语言的初心是:教计算机认识世界。
作为一位好的老师,在教计算机这个“笨学生”之前,我们得先自己认清这个世界才行,不然不就成了“忽悠”了吗?
这个世界是什么样子的?
物质是不依赖于人的意识,并能为人的意识所反应的客观实在。物质的唯一性是客观实在性(客观实在是指不管人们承认不承认、喜欢不喜欢、知道不知道,它都不依赖于人的意识而实实在在地存在着的特性)。辩证唯物主义的物质概念,概括了宇宙间一切客观存在着的事物和现象的共同本质,而不是指某一种具体的物质形态。只有牢牢掌握了这一点,我们才能进一步领悟:无论是天地自然,还是从大自然中孕育而来的人类社会,他们在本质上都是物质的。
这一段摘自《人教版高二思想政治必修4》的第二单元:探索世界与追求真理^o^。
可以认为,这个世界是由物质组成的。物质是万事万物的共同本质,更具象化一点,我们可以认为世界是由各种物体组成的。
如何去描绘一个物体呢?我们人类使用的方法是“分类”。因为这个世界上存在的物体太多,以人类的大脑是没办法去记住每一个物体的。“分类”的好处是我们可以把这个地球上千千万万的树叶都归类为大脑中的一个“叶子”,其实我们大脑中的这个“叶子”不特指某一片叶子,而是指“叶子类”。
这是一种很“取巧”的办法,想象一下,我们只用“麦子(类)”两个字,就描述了全球种植面积超200万公顷,年产超7亿吨的麦子们;而只用“人(类)”一个字就描述了全球近75亿人;唯物主义哲学家更是只用“物质”两个字,就抽象了整个宇宙。
这样“抽象”之后,我们的大脑可以用来存储更多的有效信息。
但是我们人又是如何去对一个物体进行“分类”的呢?或者说将物体抽象成类的这一“抽象过程”是怎么样进行的呢?
拿灯来说,台灯是放在桌子上的,吊灯则是吊在天花板上的,路灯则由一个高高的支架立在路边上,这些灯所处的位置不同,但我们都认为它们是灯,所以我们应该不是用一个物体所处的位置来做分类。
灯的形状可以是圆形的、方形的,儿童房的灯更可以千奇百怪,但我们还是认为它们都是灯,所以我们应该也不是用一个物体的形状来做分类。
灯的颜色可以是红黄绿的交通灯式的,也可以是太阳的暖色调、月亮的冷色调,虽然颜色各不相同,但我们还是认为它们都是灯,所以我们应该也不是用一个物体的颜色来做分类。
灯的材料同样可以多种多样,有金属材质的灯壳,也有水晶式的吊坠,还有文艺的纸灯罩,但我们还是认为它们都是灯,所以我们应该也不是用一个物体的材质来做分类。
我们人类使用的是“行为”,也可以叫功能。灯的共同行为是会发光。那我们为什么不把太阳和萤火虫称作灯呢?因为它们属于自发光物体,人类所认知的灯:古代的需要点火才会发光,现代的需要通电才会发光,这是人类认知中的“灯类”所该具有的“行为”。
以上,大概是我们对真实世界的一个初步认识,现在尝试着将我们关于世界的初步认知教给计算机:
1.世界是由物体组成的,所以计算机中也应该有物体的概念,对应OOP语言中,就是Object。OOP的英文全称是:Object Oriented Programming,直译过来应该是“以物体为导向进行编程”,“面向对象”这样的翻译反而对我们造成了一定的误导(还以为必须男女结对,并且深爱着对方才能编程呢)。
2.世界上的物体是纷繁复杂、千奇百怪的,为了记住所有的物体并且节省计算机内存空间,我们必须学会抽象,所以我们对物体进行分类,这对应OOP语言中的class。
class既是object的类别,也是制造object的模板。它们之间的关系,很类似于《小王子》中狐狸对小男孩的那段话:
狐狸说:“对我来说,你只是一个小男孩,就像其他成千上万个小男孩一样没有什么两样。我不需要你。你也不需要我。对你来说,我也只是一只狐狸,和其他成千上万的狐狸没有什么不同。但是,如果你驯养了我,我们就会彼此需要。对我来说,你就是我的世界里独一无二的了;我对你来说,也是你的世界里的唯一了。”
继承,则是进一步减少“类”的重复性,并且形成特定的“继承体系”,通常是树状结构,以更好的组织计算机世界的物体类别,就像真实世界对动物分类的一样:界(Kingdom)、门(Phylum)、纲(Class)、目(Order)、科(Family)、属(Genus)、种(Species),比 比如狼的完整归属是:动物界-脊索动物门-哺乳纲-食肉目-犬科-犬属-狼。
3.我们判断真实世界的物体的分类靠的是物体的行为,那么我们在计算机中也应该靠行为来界定一个类。这就对应着我们常说的:面向接口编程,接口代表了一个类的方法,也就是一个类可以产生的行为,属性(成员变量)在定义一个类这个问题上并不那么重要。
总结:
为什么要面向对象?因为它符合我们自然的也是习惯的认知规律,很有可能也是刻在我们基因里的认知规律,因为我们人类在孩童时期就天生会“分类”的技艺。