从模仿游戏解读——编程是怎么一回事

听学长给你讲讲经,扯扯淡

hello,大家好,从今天开始,学长每周六都会写一篇技术博文,希望不论大家是什么专业,都能从我的文章当中有所收获,甚至如果能学到一点编程的技能,那就再好不过了。

今天是编程系列的第一篇文章,我们先不讲具体的技术,先来聊一聊,编程是怎么一回事,打破它神秘的面纱。

对于外来和小白来说,编程似乎非常神秘,大家不妨看看这个小视频,体会一下别人眼中的程序员和真实的程序员之间的差别:

那么,到底编程是怎么一回事呢?它又是如何一步一步发展成今天这个样子的呢?

说白了,程序员并没有那么高大上,程序也不是什么神秘的黑科技,只是单纯的一串逻辑而已。也就是说,程序员们每天写的代码,其实代表的都是一段逻辑。

在程序员的世界里,虽然有许多不可思议的事情,但是它们都是符合逻辑的。套用福尔摩斯的一句话来说,一切都有合乎逻辑的解释。

我们都知道,逻辑是抽象的,是虚无缥缈的,是人们定义出来的这么一个概念。逻辑本身是没有办法直接编写的,所以,科学家们制定了规则,让人们可以在一定的规则之下把逻辑写出来。而这个规则,其实就是各种语言的语法。

也就是说,不论我们是用Java也好,C也好,虽然代码种类不同,运行模式也不相同,但是其中的逻辑可以是一样的。

下面,就让我们从计算机最早的诞生开始讲起,从原理上让大家明白,编程究竟是怎么回事,又是如何发展的。

不知道大家有没有看过模仿游戏这部电影,没看过的可以看一下,电影不错。

电影讲述的二战时期,图灵制造出了一台计算机用来破解德军密码的故事。上面这张图片背后的机器就是当时的计算机。世界上第一台计算机叫做ENIAC,诞生于美国宾夕法尼亚大学。它的样式和电影当中的计算机差不多,那时候的计算机是通过电子管串联而成的。

那时候的代码其实是一串串纸片,我们都知道计算机基于二进制。那时候的纸片代码就是基于二进制写成的,女工们在纸片上打孔,来代表1,没有打孔代表0。你没有看错,最早的代码都是女工写成的,所以,最早的程序员其实是女性。

当时的计算机读入这样的纸片程序,然后根据程序上的指令进行加减乘除的运算,来完成密码的破译、原子弹和导弹参数的计算等等工作。其实就是可以根据我们制定好的指令进行计算的计算器,所以才叫做计算机,而不是电脑。

虽然过去了好几十年,计算机底层的元器件也由电子管转化成晶体管再到半导体芯片,历经数次技术革新,计算性能更是得到了翻天覆地的提升。但是编程的核心一直没有变,还是让计算机根据人类的执行完成一系列的计算。

最早的代码就是一连串二进制的指令,这样的代码对计算机是最友好的,因为计算机本身就是识别二进制的,所以它拿到这样的代码可以直接运行。但是对于我们人类来说,这不是我们人类的语言,我们不是二进制的,我们也很难用二进制来思考。所以写这样的代码对我们人类来说很困难。

那怎

么办呢?

计算学家对这个问题进行了简化,他们规定好了一系列指令。比如add表示加法,mov表示移动数据等等。熟悉一点的朋友一下子就能猜出来,我说的正是汇编语言。汇编语言和二进制的机器码只隔了一层转换,所以它是除了机器码之外最接近计算机的语言。它能够直接操作寄存器和内存,最为贴近硬件。

但是同样,接近硬件,也就意味着它的语法比较难懂。简单的一个加法操作,都需要用到寄存器,虽然比机器码好了很多,但是一样很难懂。

不仅我们知道这一点,当时的科学家也知道这一点。他们想出了一个天才设想,让程序员们只需要编写核心的逻辑。然后再由另一个程序将这段代码“翻译”成机器可以识别的汇编语言,那样程序员们不就不用关心枯燥无聊的底层指令了吗?

是的,这个“翻译”的步骤被称为编译。现在你们知道编译器是一个什么东西,是用来干什么的了。有了编译器之后,才有了高级语言。高级语言之所以高级,正是因为它们通过编译舍去了对底层指令的控制。

最早的高级语言有很多,比如B语言,Basic,Pascal等等。这其中最流行的是C语言。C语言为什么流行呢?因为当今主流的操作系统(Unix、Linux,Windows不确定)都是基于C语言开发的。也正因此,一系列的硬件设施为了兼容,都支持C语言。使用C语言在Linux上可以直接调用一些操作系统的方法,嵌入式的系统、服务器等等,都是基于C语言。

正因为C语言非常接近底层, 对于汇编的支持非常好,也因此C语言的执行速度最快。因为它能直接编译器汇编语言以及机器码,所以执行效率最高。相比于后面的Java、Python等语言,效率要高很多倍。因此,在一些对于计算速率有着非常高的要求的场景下,都是采用C语言开发。

C语言出身古老,也因此优点很多,但同样,缺点也很明显。最大的缺点就是它对面向对象支持不好,C几乎是纯面向过程的语言。也因此,为什么很多初学者从C语言开始学起,因为C面向过程,不涉及面向对象的那些概念,也因此新手友好。

说到这里,很多人要问我,面向对象是什么。举个简单的例子,游戏当中人物打怪这么一个动作。如果是面向过程实现,那么它实现的是人物怎么打怪的过程。比如人物挥动武器,怪物掉血,怪物反击,人物闪避,这一系列的过程。而面向对象,是把人物和怪物都抽象成对象,把攻击、闪避、掉血、反击这些操作变成对象的属性。代码控制的是对象之间的关系,而不是具体的过程。

这里不能完全理解也没有关系,后面我们会详细讲解。为了支持面向对象,科学家在C语言的基础上新增了对面向对象的支持,于是诞生了C++语言。注意,虽然C和C++许多语法相同,但是它们是不同的语言。++是C语言当中的自增操作,意味着变量增加1,C++这个名称其实意思就是指C语言的自增。

C++是一门伟大的语言,但是它非常的复杂,像是大杂烩融入了许多的思想和概念,据说这个世界上没有人能精通C++。因为C++过于庞大,有些研发人员为了在匮乏的硬件系统上运行代码,所以对C++进行了精简,舍去了其中一部分内容,整体做了规范,Java语言就此诞生。

虽然Java当中并不包含字母C,但是Java却是C系的语言,因为它基于C++而来,许多语法也和C++共通。但是Java和C++有一个很大的不同,Java的编译过程和C++完全不同。Java的代码并不直接运行于计算机,而是运行与JVM虚拟机上。Java代码编译之后产生JVM才能识别运行的class文件,由JVM识别运行。

由于class文件是与平台无关的,各个平台的环境不同体现在JVM上,所以并不影响代码的执行。也正因此,Java拥有了一个非常巨大的优势——跨平台。后面谷歌选中Java开发Android也正是因为它这个优点。

说到跨平台,不得不提另一个语言,那就是C#。

C# 是微软基于.net框架诞生的语言,本意是在C++的基础上赋予跨平台的能力。但是由于微软的封闭性,所以C# 只支持微软自身体系下的设备,也正因此C# 并不出名。提到它的原因是因为,你们知道为什么C# 叫做C# 吗?

其实这个# 的意思指的是四个+号,也就是C++++,不得不说微软也是很恶趣味了。

今天从计算机的诞生一直讲到了最近比较流行的Java和C#,目的只有一个,帮助大家更直观地认识编程到底是怎么一回事,它又是怎么发展而来的。它没有那么神秘,也没有那么困难,不过是人们控制计算机按照执行好的方式进行运算的指令而已。

希望能够对正在学习和想要学习编程的同学们一点启迪和鼓励,如果大家还有什么问题,可以在公众号留言,我看到都会回复

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181013G0O73X00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券