c语言结构体张三丰,第五次视频我发到网易云课堂上了

原标题:第五次视频我发到网易云课堂上了

因为我上次录的Ruby实在是太长了,出差回来后,就重新录一遍,录成两次课,这次45分钟,下次可能也是60分钟左右 :)先难后易,类似语法这种相对简单的东西,等下次再讲。这次讲Ruby语言的精华部分(我自以为的精华),元编程和DSL。

这次的内容主要是:

介绍DSL(Domain Specific Language)特定领域的语言

Ruby on Rails可以称为web开发领域的DSL

视频演示了一下DSL的用法,以Ruby on Rails大量应用的Rake为例

因为这个视频是收费的,100块钱,可以在网易云课堂上购买。如果大家要购买的话,可以先免费看两期视频了解一下。如果购买的话,请通过我的网站:

lmzdx.com (绿帽子大学) 首页的购买链接,这样我能多分一些钱,否则要交给网易云课堂30%

以下是视频的文字稿,图片什么的,只放一部分,否则太浪费流量了。

所有的编程都要用到一种叫编程语言的东西,我这个视频也不例外,这个用的编程语言叫Ruby。

f6095e41e82bbf282986b44a034fc28a.png

我小时候,当时电视台里热播一个电视剧叫《海灯法师》,我那时候还是充满梦想的年龄,我就买了不少武林秘籍,那是90年代初期,书店里卖武林秘籍,现在书店里卖励志,其实这两件事是一样的,都是忽悠。我当然也没练成二指禅。但是我对武侠小说产生了浓厚的兴趣。在我看武侠小说的时候,就发现了一个问题,越是水平不太行的人,这个自我介绍就越炸裂。比如:金庸《鸳鸯刀》里,有一对组合叫太岳四侠,自我介绍就非常的炸裂:大哥是烟霞神龙逍遥子,二哥是双掌开碑常长风,三哥是流星赶月花剑影,区区在下是八步赶蟾、赛专诸、踏雪无痕、独脚水上飞、双刺盖七省盖一鸣!

这个不用想,水平非常的一般。反而是高手,介绍就非常的普通。比如说贫道张三丰,在下萧峰,老衲法名渡厄。

也正是因为这个原因,我不想把Ruby介绍的像盖一鸣一样,什么八步赶蟾、赛专诸、踏雪无痕、独脚水上飞、双刺盖七省这样的,看起来挺搞笑的。但是不介绍也不好,我还是介绍一下吧。

主要从这三个方面来介绍: 1. 开源 2. 面向对象 3.强大的DSL功能

06c75791f33b901f07df1c9e9915ef19.png

Ruby语言有优点也有缺点,在某些方面讲,和大部分的动态语言差不多,无非就是这个语言是开源的,说实在的,现在还有编程语言是不开源的么?现在所有的语言都是开源的,连微软的.net都是开源的。如果一个编程语言还把开源当成是一项特别了不起的宣传点,那就相当于我开了个餐馆,宣传吃了我这个饭店的饭不会拉肚子一样。所以,不要认为自己是开源的,就是一项优点。

还有就是面向对象的,这个其实也不算什么,主流的语言都是面向对象的,比如Java,Python,还有PHP都有面向对向的机制。要是C语言写的好,用struct(结构体)也可以写出面向对象的程序,结构体可以看成是类,结构体里可以有属性和方法。Ruby语言,Python语言的面向对象机制和Java语言有些不同,因为Ruby和Python语言宣称自己是真正的面向对象,叫“一切皆对象”。虽然我是在说Ruby的优点,但是,也不能把这个语言夸的太狠了,其实Ruby和Python所谓的Late binding(延迟绑定)这个特征,给自己带来了不少麻烦,在某些地方,Ruby和Python有方便的地方,但是这个随意的重载,会导致程序变大以后,有些隐藏的bug难以被发现,所以,特别重要的应用,比如银行的核心系统,电信的核心系统,是不会用Python和Ruby来开发的。但是,如果像我这样做个web应用,就像做个玩具一样,用Ruby语言还是可以的。

我之所以说这些,是因为软件小的时候没什么问题,等到软件大了以后,Ruby和Python所采用的IDE,可能不如Java或者C语言所用的IDE好用。这并不是做IDE人做不出来,这其实是Python和Ruby语言的动态性决定的,甚至连变量替换这么简单的重构,这种在Java和C语言的IDE里,是常用的功能,但是在Python和Ruby的IDE里,可能就是不可能完成的任务,非常容易出错。因为Python的Ruby中没有类型标记,不可能准确的判定这个变量是不是要替换的变量。反正,这个自己心里有个数就行了。套用一句台词:委座,不是国军无能,实在是共军太狡猾!这里可以说,同志,不是IDE不行,是语言太狡猾了。(我说这个的意思是希望大家不要操心找IDE了,都差不多,同样是Apple出的XCode,对Objective-C语言重构的时候非常智能,对swift语言就无能为力,写Ruby,大家老老实实的用个文本编辑器就好。)

但是,第三点我得着重介绍一下,就是Ruby有强大的DSL功能。我要着重的强调一下什么叫做DSL,这是个缩写,全称叫Domain Specific Language。翻译成中文叫特定领域的语言,如果你不理解这个叫什么,再通俗一点就叫“黑话”。黑话是在特定群体中才有意义,离开了某个特殊群体,这个黑话就没什么意义了,从这一点上来说,Ruby on Rails可以看作是web开发领域的黑话。

这样讲可能有些抽象,其实我们在现实中经常会用到DSL。我举几个例子。

比如,“四个意识,四个自信,要从娃娃抓起”,这句话就算是特定领域的语言,只是大家都懂,我们知道前八个字是什么意思,什么叫四个意识,什么叫四个自信。但是,如果把时间提前100年,这四个字:文章山斗。这是古代特定领域的语言,现在人已经不太懂了,就是说两个读书人互相吹捧,说对方写的文章是山中的泰山,星中的北斗。现在我们看到这个词可能想到的是文章,马伊琍,什么且走且珍惜。

在编程界,我们用到了海量的DSL,比如SQL语言可以看作是数据库界的DSL,CSS可以看作是网页界的DSL,还有apache的配置文件也是一种DSL,markdown语言也是一种DSL,vim的配置文件也是一种。从某种方面来说,几乎每个Linux上的软件都有自己定义一套DSL。

接下来就是讲一下我认为DSL的优点和缺点,优点是能完成一些工作,缺点就是这么多DSL,学起来比较烦。

b1badd3896592ca70e1fa211372a457e.png

几乎所有的DSL都有自己的一套数据结构,控制结构,条件判断,表达式。如果没有,就一定会有人给他们加上这个东西,比如,以后在课程里会用到的CSS的一个升级版, SCSS或者SASS,这两个东西其实是一回事,就是把CSS这个DSL,升级成有自己的一套数据结构,控制结构,条件判断和表达式的语言。就是让DSL接近普通的编程语言。这时候你可能会有个疑问,既然这些DSL都有自己的判断语句,自己的表达式,这不是和编程语言没什么区别么?那要这些DSL有什么用?我自己也是这么认为的,绝大部分的DSL本身就是没什么用,而且确实不应该存在这么多的DSL。如果你是Linux的爱好者,也会为存在如此众多的DSL语言感到绝望的,几乎每个出名的软件都定义了自己的一套DSL。比如前面提到的CSS, 数据库上的SQL语言,但是由于每个数据库的语法又有些不太相同,也就是说MySQL和PostgreSQL所采用的DSL语言是不同的,比如说顶多有80%相同,于是又出现了一种新的DSL来让他们统一,这个DSL就是HQL。

不管怎么说了,要接受这个世界上有无数种DSL的现实,而且也要清楚,绝大部分的DSL都不太好用。不是有句话叫作“存在即合理”么,我们只能用这些不同水平的人设计出来的各式各样的DSL。多一种Ruby on Rails的DSL也没什么关系,说实在的,Ruby on Rails设计的还算是非常NB的,以我的眼光来看,比90%的DSL设计的要好。那么DSL的设计有什么共同点么?我总结了一下,可以分成两种,一种是内部的,一种是外部的。先来说外部的DSL。

最典型的代表就是Unix/Linux了,在Unix文化中,有一个根深蒂固的文化叫“一且皆文件”,实际上也做不到,比如驱动程序,外设什么的,就不是文件。在Unix中,绝大部分的DSL是使用外部DSL的方式来实现的,比如用个文件文件,或者XML文件,当然XML文件现在用的很少了,看起来眼睛疼。使用外部DSL的话,大部分软件都要有一个Parse(解释器),这个解释器来实现读取或者生成这些外部文件,这里就不多说了。因为和Unix不同的是,Ruby使用的是内部DSL的方式来做的。

在前几次视频中,我提到过,为什么Rails开发会快一些呢?是因为大量的代码是自动生成的。那这些代码是如何生成的呢?这就是上面我所说的DSL语言了,类似于“四个意识,四个自信,要从娃娃抓起”这句话,前面这八个字,可以扩展为小一百字。

3d97fddc6d903bc679fe2035cb073377.png

我要再稍微的扩展一点知识,因为我第一次用Ruby on Rails的时候,我脑子里第一想到的一个软件就是它,到现在也是如此,我觉得这个Ruby on Rails使用的这个Rake软件,可能大量的借鉴了这个软件。这个软件就是大名鼎鼎的make,make love的make。在Linux上,我们在使用源代码安装开源软件的时候,一般都是这三个命令, configure, make, make install。这个make软件就是一个将很多工作自动化的软件,在Ruby on Rails中,使用的是一个叫Rake的软件,两个名字都只差一个字母,并且,两个软件都定义了自己的DSL语言,make使用的那个文件名字叫makefile,rake使用的文件名字叫rakefile。而且,这两个软件做的事情也差不多,区别就是rake是用Ruby写的,make是用c语言写的,而且是GNU开源组织的老大Richard Stallman写的。在这里不是教C语言,我就不教大家写make所使用的makefile了,我就只演示一下Ruby on Rails使用的Rakefile吧,通过一个非常小的例子,来说明一下Ruby的DSL是如何写,以及如何工作的。

584e183ef2eee4cc67d0971ad827994d.png

前面提到过,实现DSL,一般可以分为两种,一种是以Unix大部分软件为代表的外部实现方式,这种方式要自己写个parser(解释器);另一种是内部实现方式,这种方式不用自己写parser,如果使用Ruby的话就用Ruby,也就是宿主语言来解释就行,但是,还可以细分为至少两个流派,一个是实现一个minilanguage,我就不展开去讲了。如果有人对此特别有兴趣,可能会深入研究,我只是把我自己的一点小发现分享给大家,希望对你有帮助。另一种就是Ruby on Rails所参用的,叫作language enhancements,增强语言的方式。使用这种方法,可以增强语言,但是,又不会影响宿主语言,这里的宿主语言就是Ruby。因此,在很多时候,感觉用Ruby on Rails,就像是Ruby语言增加了一些新的关键字,我觉得这是一种非常优美的方式。如果打个比方的话,使用这种方式,类似于开了美颜相机,不用对Ruby语言真的动刀做手术,一下子就变成范冰冰的脸了。下面就视频演示一下Rake的使用方法,以及这个DSL如何运行的。

ff82df98997772a2fd0a98881b968b31.png

[视频演示部分]

16bdd7b0a66674af3f86d04244556a7b.png

以找老婆这个任务举例,如何解决买房,买车,装修洞房之间信赖的关系。最后再展示一下namespace的用法。返回搜狐,查看更多

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值