网站大量收购独家精品文档,联系QQ:2885784924

白话Ruby与DSL以及在iOS开发中的运用.docxVIP

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
白话Ruby与DSL以及在iOS开发中的运用

何为 DSLDSL(Domain Specific Language) 翻译成中文就是:“领域特定语言”。首先,从定义就可以看出,DSL 也是一种编程语言,只不过它主要是用来处理某个特定领域的问题。广为人知的编程语言有 C、Java、PHP 等,他们被称为 GPL(General Purpose Language),即通用目的语言。与这些语言相比,DSL 相对显得比较神秘,他们中的大多数甚至连一个名字都没有。这主要是因为 DSL 通常用来处理某个特定的、很小的领域中的问题,因此起名字这事没有太大的必要和意义。说了这么多废话, 一定有读者在想:“能不能举个例子讲解一下,什么是 DSL”。实际上,DSL 只是对一类语言的描述,它可以非常简单:UIView (0, 0, 100, 100) black UILabel (50, 50, 200, 200) yellow ……比如这就是我自己随便编的一个语言。它的语法看上去很奇怪,不过这不是重点。语言的根本目的是传递信息。为什么要用 DSL其实从上面的代码中已经可以比较出 DSL 和 GPL 的特点了。DSL 语法更加简洁,比如可以没有括号(这取决于你如何设计),因此开发、阅读的效率更高。但作为代价,DSL 调试很麻烦,很难做类型检查,因此几乎难以想象可以用 DSL 开发一个大型的程序。如果同时接触过编译型语言和脚本语言,你可以把 DSL 理解为一种比脚本语言更加轻量、灵活的语言。DSL 的执行过程了解过 C 语言的开发者应该知道,从 C 语言源码到最后的可执行文件,需要经过预编译、编译(词法分析、语法分析、语义分析)、汇编、链接等步骤,最终生成 CPU 相关的机器码,也就是一堆 0 和 1。脚本语言不需要编译(有些也可以编译),他们在运行时被解释,当然也需要做词法分析和语法分析,最终生成机器码。于是问题来了,自定义的 DSL 如何被执行呢?对于词法分析和语法分析,由于语言简单,通常只是少数关键字,即使使用最简单的字符串解析,工作量和复杂度也在可接受的范围内。然而最后生成汇编代码就显得不是很有必要了,DSL 的特点不是追求执行效率,而是高效,对开发者友好。因此一种常见的做法是,用别的语言(可以理解为宿主语言)来解析 DSL,并执行宿主语言。继续以上面的 DSL 为例,我们可以用 OC 读取这个文本文件,了解到我们要创建一个?UIView?对象,因此会执行以下代码:UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; view.backgroundColor = [UIColor blackColor];如何实现 DSL可以看到,DSL 的定义与实现毫无技术难度可言,与其说是一门语言,不如说是一种信息的标记格式,一种存储信息的协议。从这个角度来说,JSON、XML 等数据格式也可以被称为 DSL。然而,随着关键字数量的增多,对 DSL 的解析难度迅速提高。举个简单的例子,Cocoa 框架下的控件类型有很多,因此在解析上述 DSL 时就需要考虑很多情况。这显然与 DSL 的初衷不符。有没有一种快速实现 DSL 的方法呢?选择 ruby 一定程度上可以解决上述问题。在解释为什么偏偏选择 ruby 之前,首先介绍一些基础知识。Ruby这篇文章不是用来介绍 Ruby 语法的,感兴趣的读者可以阅读 《七周七语言》 或者 《松本行弘的程序世界》这两本书的前面几个章节来入门 Ruby,进阶教程推荐 《Ruby 元编程》。本文主要介绍为何 Ruby 经常作为宿主语言,被用来实现 DSL,用一句话概括就是:DSL 其实就是 Ruby 代码上文说过,实现 DSL 的主要难度在于利用宿主语言解析 DSL 的语法,而借助 Ruby 实现的 DSL,其本身就是 Ruby 代码,只是看起来比较像 DSL。这样在执行的时候,我们完全借助了 Ruby 解释器的力量,而不需要手动分析其中的语法结构。借用?Creating a Ruby DSL?这篇文章中的例子,假设我们想写一段 HTML 代码:html body div id=container ul class=pretty li class=activeItem 1/li liItem 2/li /ul /div /body/html但又感觉手写代码太麻烦,希望简化它,所以使用一个自创的 DSL:html = HTMLMaker.new.document do body do div id: container do ul class: pretty do li I

文档评论(0)

2017ll + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档