0°

第七次视频 考证了一下编程的控制流程的历史

文章内容大纲 (右击展开→→)

内容预览:
  • 当有几种条件需要判断的时候,这时候不同的编程语言会有很大的不同~
  • 因此如果是用C语言的话,这时候要用的循环是do…while~
  • 不过不要担心,并行尽管学一门语言吧~

原文始发于微信公众号(软件那些事儿):第七次视频 考证了一下编程的控制流程的历史

拉到下面点原文链接,直接去我的网站看看文本吧,这里根本没法看代码。

这次视频大概45分钟,考证了一下现代编程语言中的控制流程的方法,并且介绍了一本1972年写的书——《structured programming》,本文大量参考了本书内容,因为时间和篇幅,只能取一舍百。如果你对编程语言为何会发展成如今这样有兴趣,可以看看这本书。本书的作者是Dijkstra,一个传奇的科学家。

由于网易云课堂上还是这个转码的状态,我想,今晚20:00前也许能上线。

第七次视频 考证了一下编程的控制流程的历史




这一期继续再讲一期Ruby,主要的内容有:

  1. 程序控制流程

因为我第一个语言学的是C语言,C语言可以说是我学编程的母语,因此,我觉得C语言存在的东西都是理所当然的。后来,我才发现不是那么回事。C语言作为一个取得空前成功的语言,它所定义的一些规则,后来者更多的是继承而不是抛弃。尤其是控制结构,几乎所有的语言都参考了C语言的控制结构。但是C语言参考的谁,我也不知道了。

类C语言的控制结构

条件

首先讲一下这个if条件语句。

网上有一个非常程序员的笑话,只是笑话,老婆对程序员老公说:老婆对你说“老公,晚上回来买一个西瓜,如果看到西红柿,就买两个。”

这其实就是一个if条件语句,用C语言来表示的话可以这样:

这是个笑话,并不是真事,真实的情况是程序员根本找不到老婆。但是,这个if语句还是值得研究一下的。

我上一期做过调查了,因为我不是培训班的老师,对上课的内容把控的能力实在是不行,我有时候会搞不清楚我要讲多深或者多浅。而且我如果一直放飞自我,也对大家不负责任,毕竟上一个45分钟只讲了一个变量赋值,这次我争取多讲一点。这次只讲C语言和Ruby,其它的语言尽量不再涉及了,除非我觉得这种语言特别的不一样,我才会讲到。

我曾经试图考古一下if语句是从哪里来的,没有考证出来,反正汇编语言中没有这个语句,C语言中有。也就是说,没有if语句也是可以写软件的,可以用C语言的goto语句来实现。在这里我就不举例子了,如果大家写一个非常简单的C语言的if语句,比如if(x > 0),然后编译成汇编语言,再看一下,一定会发现几个汇编语言的关键字,其中的cmpl,意思是compare long integer, 比较以后,会有这样几个关键字jne (jump if not equal),jle (jump if less or equal),还有jge (jump if greater or equal),这几个汇编语言的关键字,在C语言中,用goto做跳转就能替代。

我以前试过,用goto和用if写的c语言,编译出来的汇编代码是一样的。我个人非常建议大家如果有时间的话,花一两个小时时间试一试,真TMD的很有意思。反正时间就那些,干啥不是干?花好几个小时的时间看成抖音不也是浪费时间么,虽然抖音的小姐姐确实比调试代码要好看。

在教科书里,老师都会说c语言最好不要用goto语句,这会伤害程序的控制结构。其实老师也不知道为什么,他也只是听别人说的,这个人是计算机界的超级大牛Dijkstra(戴克斯特拉),他在1968年的时候写了一篇文章叫Go To Statement Considered Harmful  这篇文章一出来,大家就觉得,他说的很对。

我多说一点这个戴克斯特拉,每个学计算机的人都知道他,他不仅是最短路径的发明者,还是世界上第一个递归特征的实现者。这个人是个德州大学的教授,他每次开始上课的时候,都是分别给学生拍照,然后,他要记住所有学生的名字。每当课程要结束的时候,他也不进行书面的期末考试,而是花一周的时间对每个人进行谈话,每个人谈两三个小时,来决定你到底会了多少。

他还有个特点是,他写论文的时候不用电脑,而是用一只钢笔,钢笔的牌子叫Mont blanc,中文名叫万宝龙,他写出论文来会复印几份,然后其它人会不停的复印给其它人,因为是钢笔写的,所以他的论文很少写详细的参考文献,但是,没有人认为他会抄袭别人的成果。后来,我觉得我也应该装逼一下,其它地方学不了,但是,我也应该用钢笔写文章。后来我查了一下,万宝龙的钢笔实在是太贵了,比一台电脑要贵,好几千块。所以,在我大二的时候,我就在超市买了一只7块5的英雄钢笔,我希望以后我可以有钱买一只万宝龙,现在20年过去了,我还在用英雄钢笔。现在大家看到的我写的PPT就是用一只几块钱的钢笔写的。

重点是,他和另外两个人写了一本书叫《Structured Programming》,我这篇视频就是参考这本书做的,可能写出了这本书中1/1000的内容吧。这本书是1972年出的,我希望大家能找到这本书看一下。这本书影响了C语言,Pascal语言,定义了现代编程语言的控制结构。

但是,业界另外一个大牛,他的名字叫Donald Knuth,他在1974年的时候写了一篇文章叫《Structured Programming with go to Statements》他在这篇文章里说goto语句还是不错的。

链接我放在这里了,这种超级大牛,我觉得他们说的都有道理。可能Dijkstra说的更有道理,现在大部分的现代语言已经不支持goto语句了,比如Java,Python和Ruby中都不支持。但是,goto语句现在仍然大量的存在于Linux的内核代码中。不用goto,我们这些弱鸡可以用if判断语句来代替。

在所有现代的编程语言中,if语句其实有三种,一种是最简单的if,或者if-then;还有一种叫if-then-else;最复杂的是一大串if-then-else。

Ruby语言有个好处是,只要你想到要写一个东西,你就可以靠直觉去写,不少情况下,你都能蒙对。因为Ruby不像Python,Java这种不能乱来的语言,Ruby对语法那是相当的宽容,所以Ruby经常号称是让程序员快乐的语言。

如果程序比较短的情况下,尤其是program只有一行的情况下,还有一种更简单的写法:

栋哥有个兴趣,如果有机会,我会去公园婚恋市场去看看,那代表一个城市的活力,有相亲市场的城市一定是一线城市。里面经常听到的一句话是:你家有婚房么?这句话其实包含了两层意思,用程序写出来是这样的:

这是两个分支,这在几乎所有主流编程语言中都有相同的实现方法。

还有第三种相对比较复杂。当有几种条件需要判断的时候,这时候不同的编程语言会有很大的不同。比如C,C++,Java中和ruby,python中用的方法不同。

在C/C++和Java语言中,用的是case语句或者switch语句,并且case语句和switch中每次只能取一个值,现代最新的语言比如Apple出的swift语言,这个case则非常不同。我用Java来演示一下,Java其实和C/C++是一样的。假设大家玩过minecraft这个游戏,和其它游戏中一样,使用的是wasd这四个键来控制方向。

现实情况是,ruby中并不支持switch加case语句,也就是说,ruby语言在这里没有完全继承C语言。用Ruby可以这样写:

在这里要注意的是,C语言中也有 else if 这种写法,但是这个 else if 不是独立的语句,是 else 这个关键字后紧跟着 if 这个关键字。但是,ruby中这个elsif是一个单独的关键字。如果大家像我一样,为生活奔波,什么语言都要写一写混口饭吃的话,就会发现,perl和ruby语言用的是相同的elsif这个关键字,sh语言和python语言用的elif这样的关键字。其实也没办法,总共就这几个字母,也没必要在这上面创新,每次我要写这些东西之间,经常要反复试试才知道用哪个。

有些C语言的爱好者还是觉得上面Java,C/C++语言的写法比较好。于是就会想用C语言的方式写,在Ruby中,这是非常可能的,我前面说过,ruby就是这点好,怎么乱来都可以,用夸张的话来说就是表达能力超强。

循环

循环是一种能让代码反复执行的控制结构。常见的循环有C/C++, Java语言中的for, while,do-while。还有本文重点要讲的Ruby中更多种类的循环方法,分别有while, until, block和iterators,还有单独的iterators。

虽然每种编程语言也都对循环语句做一些所谓的改进,但是,还是可以进行分类的,循环就只有以下这四类:

  1. 计数循环,循环的次数是一定的,比如100次

  2. 连续求值循环,不知道会执行多少次,但是每次循环都要求值,看看什么时候能停下来

  3. 无限循环,比如软件是用在心脏起博器的,这个不能停下来

  4. 迭代器循环,因为越高级的语言,用的容器越多,因此现在迭代器循环用的很多

我观察过,第一门语言用的是Python这种高级语言的人,对迭代器循环比较有好感,如果第一门语言用的是C语言这种语言的人,对计数循环比较有好感。

为什么要有这么多循环的方法呢?大家有没有考虑过呢?如果你仔细考虑的话,就会发现答案在一句所有人都会的抱怨中,这句话就是:这样的日子何时是个头啊?!

对这句话的不同回答,只能用不同的循环来表示,我举几个例子。

第一个例子,比如一个罪犯,被判了5年,当他仰望天空,问这句话的时候,这样的日子什么时候是个头呢?答案是确定的,5年。因此,这个循环就比较好写了,结束的规则在开始。如果是用C语言或者Java的话,可以用for循环或者while循环。在Ruby中也是这样的,ruby中不支持C语言的for循环,但是可以用while…do,或者while,省略do这个关键字,这是因为我前面所不停说的,ruby可以乱来,没问题。

第二个例子,比如范进,他要考举人,他会问,这样的日子什么时候是个头呢?这时候,答案是不确定的,因为,他也不知道什么时候会考上举人。这个时候,就要每考一年,然后看看有没有榜上有名,如果考上了,就不考了。因此如果是用C语言的话,这时候要用的循环是do…while。但是在Ruby中有创新,微创新,用的是until。

第三个例子,现在不是有些大名星要举行握手会么,这么大一个大厅,每个人都上来握手,其实很难知道进来了多少狂热的粉丝,只好每个人都轮着握一遍,直到结束。这时候用foreach。这个大厅类似于容器,所以foreach经常用于容器,比如数组或者字典什么的。这有一定的好处,如果用C语言的话,有一个比较容易犯的错误是比原来的数组少了1或者加了1,但是用foreach的话,不用程序员来做内部的数学运算,从而也就消除了这种可能的错误。

在这里的foreach的意思是大厅里的人都轮一遍。每个语言有不同的叫法。C语言中没有,只能自己用for语句实现。但是在Perl,PHP,C#,Ruby中都有这个每个元素都轮一遍的foreach语句。

大家可以比较一下这几种语言的写法是多么的相似:

Ruby语言是少有的可以乱写的语言,所以,不像Python和Java,这两种语言追求的目标是做一件事情只有一个最佳的方法。但是Ruby追求的是,管TMD什么最好的方法,你爱怎么写怎么写。所以,如果大家要写Ruby的话,看到有其它的写法,不要奇怪就是。

顺序结构

顺序结构看起来是最简单的,但是,往往最简单的也是最难的。

我们在现实生活中做一件事情,大部分都是做完一件做另一件。很幸运的是,计算机也是这样的,做完一件事情再做另外一件事情。

但是人类的大脑并不是这样工作的。前两年,Google公司说自己的软件非常历害,已经能识别小猫了,因为它的软件读了几亿张小猫的照片,已经学会了什么是小猫。实际上,人类,大概2岁的小孩,只用看几张小猫的图片,就能识别各种小猫了。还有自动驾驶汽车,要学习几百万公里才能学的差不多,而且还容易出问题,但是如果人去驾校里学的话,我觉得我可能也就开了不到100公里吧。

我觉得这其中的秘密可能是因为我们现在用的电脑是顺序执行的,而人的大脑是并行的。

我们每个人都知道一个定律叫摩尔定律,这个定律告诉我们,每过18个月,我们的电脑的速度就会快一倍,价格还会便宜一半。如果这个定律能一直有用的话,那还不错,我们写的软件只要放在这里不动,速度就会每一年半速度翻倍。可惜的是,摩尔定律早就失效了。

我们假设摩尔定律有效的话,每10年,计算机比10年前快了100倍。但是快的这100倍,都被软件给拿走了,用户没什么太大的感觉,起码绝对不会有100倍的感觉。大家可以看看各种测评,换一代手机,大概就是快了20%就不错了。

原因是在以前用汇编写软件,后来用C写软件,再后来用Java,再后来用Python,Ruby这些越来越慢的软件。再后来,速度的瓶颈成了网络。硬件的发展的成果,被软件给一口吃掉了。微软公司功不可没。

这种状态,对我们程序员,尤其是不爱尝试新东西的程序员反而是好事,因为C语言已经多少年没变化了,始终排名前三。Ruby也好,Python也好,保守势力的能量是远远大于革新势力。比如说,Python的作者想给python加入一些新特征,结果被否决了,他已经从python委员会离职了。同样的情况也发生在Javascript上,一般一种语言的创始人都是相对比较有创新的,但是早晚会被一个保守的委员会给把持住。这样的情况还发生的perl上,perl 5到perl6大概要发布了15年吧,15年在IT行业中,就等于永远。

这给了我们什么启示呢?软件进化实际上是极其缓慢的。作为一个混饭吃的程序员,顺序编程语言再火个10年20年,是没什么太大问题的。所有的编程语言都是顺序编程的,因此,可以同时研究一下C语言,PHP,Python还有Java,Ruby。

如果这些编程语言要发生什么太大的进化,不要担心,广大的程序员会把试图创新的人踢出阵营的,即使这个人是语言的创始人。所以,放心学吧,10年内这几个语言不会发生太大的变化。因为一旦发生了变化,整个体系就都发生变化了,如果并行语言开始流行了,前面讲的判断和循环都会发生很大的变化。不过不要担心,并行尽管学一门语言吧。

总结

推荐这本书《Structured Programming》,这本书因为出的太早了,他出版的时候还没有C语言,因此在里面的描述用的是不常规的编程语言。如果你对考查历史有兴趣的话,可以下载下来看看,就会知道为什么现在的编程语言会变成这个样子。里面讲了很多为什么这样编程比较好,为什么那样编程比较差。

当然了,现在我们认为理所当然的东西,在当时还是有很大争议的。这本书可能比较难下载了,我放个链接在这里,这属于盗版,是不对的,但是,我们也真是买不到了,已经绝版了,连douban上都没有收录这本书,不过这本书真的存在。

链接: https://pan.baidu.com/s/1AF4kbx7bx_JDXT1D4Umn-g 密码: 2pat


和大佬一起学习网络安全知识

以上就是:第七次视频 考证了一下编程的控制流程的历史 的全部内容

本站部分内容来源于互联网和用户投稿,如有侵权请联系我们删除,谢谢^^
Email:[email protected]


0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论