就这么几个指令能干啥?你别说,我还真有办法能让你亲自见证一下,就这么几个指令,可以让CPU干些什么事。首先,下载《Human Resource Machine》这个小游戏。然后开始玩吧。我已经让群友们验证过了,不管有没有学过编程都可以玩几下。而游戏的主体内容,其实就是以一种有趣的方式在写汇编代码。在过关这个游戏之后,你会发现你自己用这几个最简单的指令,让计算机实现了一些简单的功能,诸如:比较两个数字的大小、判断一个数字的正负、让计算机数数、用加法实现了乘法运算、从一组数中找到最小的数……如果你在游戏里过五关斩六将实现了这些功能,那么你就相当于解决了上个世纪计算机科学早期那些先驱们所面对的问题。给自己一个奖励吧,点击文章末尾的“赏”就会看到编程学习大礼包!额,你说你没有通关?没关系,最后几关是比较难,而且这个游戏只是为了让你体验一下汇编编程的感觉。
现在你会发现,汇编语言其实没有多复杂,而且比起那些0011的代码,真是太好识别了。但是那还不够,比如我要计算一个:
X=Y*Z+(Q/10.5)+P-2这个自然的表达式人人都能看懂吧?但是用汇编语言写出来就不那么好看了:
Mov X, Y
Mul Y, Z
Div Q, 10.5
Add Y, Q
Sub P, 2
Add Y, P一眼看上去不知道是在干嘛。而且汇编语言也不够“自然”,比如我要做一个赋值操作:
X=Y;上面这种写法很自然,我们在学数学的时候就是这么写的,但是在汇编语言中它是这么写的:
Mov X, Y直译就是:把Y移动到X的存储位置(这是计算机硬件能够实现的操作)。再比如:
if x<y
then x=y
else y=x
编程语言发展史
刚刚我们才讲到了C语言。并且说了游戏领域中比较重要的几种语言与C语言的关系。从这张图中我们应该能够更清晰看到这几种语言的发展脉络。每一种新的语言诞生,都摒弃了一些前者的弊病,加入了自己优秀的特性。但无论怎样,每一次编程语言的发展和进步都是在前人的基础之上进行改良和创造,很少有几个语言是凌空出世的。正因为这样,所以编程语言之间的差别,并不是天差地别。并不是我选择了学习JAVA,就意味着放弃了C#;也并不是我如果不先学C语言,我就学不懂C++。编程语言之间都是触类旁通的,只要先掌握了其中一种,那么其他的语言就能很快掌握。
再看一眼上面的图,接下来我来讲讲C、C++和C#、Java、JS、Python的关系。
C++
首先经过我们上面一顿瞎BB,已经知道了C语言是怎么来的,而且知道了C语言的语法比较接近我们的自然语言,更容易读懂了。C语言写的代码,在被CPU运行之前,需要翻译成汇编代码,再翻译成机器码。我们对这个设计很满意,使用了好多年。后来在使用中,特别是开发一些大型项目,比如用C语言开发一个计算机操作系统时,发现有问题处理起来很麻烦,先辈就对C语言进行了改进。有一次改进后新增了一个叫“类(class)”的功能,这个功能很牛逼,导致那个版本的C语言直接脱胎换骨。这种与众不同的牛逼需要在名字上体现出来,所以他们学习iPhone的起名策略,在名字后面加了个“Plus”。“C Plus”=“C+”。一个不够,那就两个“C Plus Plus”=“C++”。(顺便剧透一下C#的起名策略:“C#”=“C Plus Plus Plus Plus”=“C++++”。)所以!C++是C的升级版,多了一个核心功能:类。语法没有变,本质的东西没有变,还需要被翻译成汇编,然后翻译成机器码,再交给CPU执行。所以学校里安排先学C语言,再学C++,其实这种说法是有点狗屎的,就好像是说:我们先学习“浮水”,再学习“游泳”。本来我们学习游泳的过程中就会学习浮水,但是就要把学习“浮水”先说一遍,让人误解为这是两个差别很大的东西。所以懂了吗?我再说明白一点:学习C++就是学习一个高级版本的C语言,学C++的过程中,就会先把C语言的那些东西学到。所以不存在:如果不学C语言打基础,就学不好C++。如果再有人问这个问题,就把这一章节贴到他脸上去。
另外补充:C++从C发展出来后,C语言也没有闲着,自己还是在不断发展,比如后来发展出了Objective-C。严格意义上来说,“学习C语言”和“学习C++”确实是不一样的,因为要去研究它们不同的语言特性。但是!对于没有学过任何编程的初学者来说,最开始就是学习个语法认识几个关键字而已,根本到不了研究语言特性的程度,所以两者说法对他们来说几乎没啥差别。
C#(和其他高级语言)