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

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

这次的内容主要是:

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

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

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

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

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

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

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

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

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

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

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

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,学起来比较烦。

几乎所有的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语言了,类似于“四个意识,四个自信,要从娃娃抓起”这句话,前面这八个字,可以扩展为小一百字。

我要再稍微的扩展一点知识,因为我第一次用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是如何写,以及如何工作的。

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

[视频演示部分]

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

责任编辑:

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

  1. C语言 | 结构体数组

    C语言结构体数组概述 一个结构体变量中可以存放一组有关联的数据,如一个学生的学号.姓名.成绩等数据,如果有10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组. 结构体数组与之前介绍的数值型 ...

  2. c语言结构体实验报告加注释,C语言结构体实验报告.doc

    C语言结构体实验报告 <高级语言程序设计>实验报告 实验序号:8 实验项目名称:结构体 学 号 姓 名 专业.班级 实验地点 指导教师 实验时间 一.实验目的及要求 1.掌握结构体变量的定 ...

  3. c语言2个字符串可以相互赋值吗,c语言结构体2之变量赋值于字符串

    #include #include struct dangdang { char email[]; char name[]; char addr[]; int num; int bugnum; cha ...

  4. golang常用库之mapstructure包 | 多json格式情况解析、GO json 如何转化为 map 和 struct、Go语言结构体标签(Struct Tag)

    文章目录 golang常用库之mitchellh/mapstructure包 | go将map转换为struct 一.msgpack 二.背景 三.多json格式情况解析使用思路 四.mapstruc ...

  5. 【Go】Go语言结构体

    文章目录 一.前言 二.结构体 三.定义结构体 四.结构体初始化 1. 结构体默认初始化 2. 使用值或键值对初始化结构体 3. 用访问成员的方式初始化结构体 五.访问结构体成员 六.匿名结构体 与 ...

  6. C语言——结构体struct与typedef的使用

    我们常常在某些C语言代码中看到有时候typedef关键字和struct一起连用定义结构体,有时候只用struct关键字直接定义结构体,在此记录两者的一些用法,给自己做一个笔记,希望对大家也有所帮助.如 ...

  7. C语言——结构体(全)

    目录 一.结构体的设计 二.结构体变量的初始化 2.1结构体在内存表示: 2.2结构体初始化: 2.3结构体指针变量 2.4结构体嵌套结构体 三.结构体成员访问 3.1.结构体成员访问 3.2.结构体 ...

  8. c语言结构体和联合体,C语言结构体和联合体

    1.单链表插入 #include #include #define FALSE 0 #define TRUE 1 typedef struct NODE{ STRUCT NODE *link; int ...

  9. ARM汇编语言实现peek()_ARM汇编之访问C语言结构体数据

    前言 本文的写作目的在于装逼,没有要产生实际价值的意思. 前几天在做编译器的项目,有一个项目团队成员一直在问我ARM汇编能不能读C语言的结构体.我心想,我这生成ARM汇编的代码是用C++写的呀,又不是 ...

最新文章

  1. 今晚8点直播 | 详解聊天机器人落地及进阶实战
  2. ​采访了14位技术公司的创始人,他们如何看待2020年的AI行业?
  3. Office 365系列之十:批量部署O365客户端
  4. 欢迎使用CSDN-markdown编辑器test
  5. 这就是数据分析之numpy
  6. 批处理引擎MapReduce程序设计
  7. python的优点有哪些-Python有哪些技术上的优点?比其他语言好在哪儿?
  8. [转贴]SQL2005数据类型
  9. 系统学习NLP(二十)--SWEM
  10. Rust : 为什么没有lifetime是不行的?
  11. 通讯录管理软件Cardhop for Mac
  12. 计算机与通信会议排名
  13. 不一样的【青椒炒蛋】—36道超人气家常菜
  14. Java——字母大小写全排列
  15. 解决Mac下pycharm不提示element.click()方法
  16. SiT5356:±0.1~±0.25ppm超高精度Stratum 3温补振荡器TCXO,1-60MHz
  17. java实现三角螺旋阵
  18. 无胁科技-TVD每日漏洞情报-2022-12-15
  19. 答案原文及解释!!守株待兔死脑筋,旁门左道不正规是什么意思指什么含义怎么理解答!!
  20. MacBookPro2016款连接无线wifi速率只有20mb/s解决方案

热门文章

  1. NMOS双向转换电路实测以及上升沿尖峰处理
  2. xmapp启动mysql出现Error: MySQL shutdown unexpectedly.
  3. 贝塞尔曲线是什么?如何用 Canvas 绘制三阶贝塞尔曲线?
  4. Java银行柜员业务绩效考核系统(含源码+论文+答辩PPT等)
  5. 记一次生产大对象导致的OOM让架构师连夜排查解决
  6. FastDFS,Redis,Solr,ActiveMQ核心技术整合五
  7. 3种iPhone手机数据备份,轻松备份和恢复数据
  8. ARKit之路-运动跟踪原理
  9. java语言实现修改文件名称的功能
  10. Eclipse安装PMD插件