在真正领略Linux下各种微型语言那震人心脾的功效之前,我们应该先要搞清楚一个问题——什么是微型语言?
在计算机这门科学技术诞生之后的几十年里,人们经过对大量的软件错误模式进行深入研究之后,得出了一个一致的结论:程序员每百行代码的出错率和所使用的语言是无关的。依此可以推断,如果可以用更少的代码行数来完成更多的功能,那也就意味着更少的bug。如何能够做到这样的效果呢?
人们首先想到的就是模块化编程,将各种独立的功能抽象成模块,然后像搭积木一样利用很少的代码将各功能模块组合起来。但是模块化编程并没有真正做到减少代码行数,毕竟每个模块也是需要一定量的代码去构成。
经过长期的模块化编程,人们发现在特定领域中总是有一些十分通用的功能模块,并且可以利用配置文件将这些功能模块组织起来去完成这个领域的多种不同的功能。因此这种方法开始流行起来,配置文件的结构也逐渐的复杂起来。但配置文件的结构不管有多么复杂,却很难表达复杂的控制逻辑,这迫使人们在需要处理复杂的控制逻辑时不得不再次向程序中添加新的代码。于是代码不断的膨胀,bug也随之滋生。
面对这种状况,人们的智慧发挥了无穷的作用,索性让配置文件具备逻辑控制能力算了。这个时候,有些具备了很强逻辑控制能力的配置文件,已经具备了顺序、循环、选择分支这写作为编程语言的三大要素,从而演变成了一种解释型语言。从此人们在针对特定领域编程时,只需要组织好一份“配置文件”就行了。虽然这个时候也可以算是一种编程行为,但总的代码行数要比使用C一类的通用编程语言少很多,bug自然也少了很多,而且还能更快的完成任务。
这种具备了逻辑控制能力的“配置文件”,就是微型语言。从它的诞生历程可以了解,它们都是针对特定领域的,不具备通用性,这也是称它们为微型语言的主要原因。
逻辑控制能力的强弱,决定了微型语言的表达性;功能涵盖范围的宽窄,决定了微型语言的通用性。当一个微型语言的逻辑控制和功能涵盖达到了与高级通用语言相同的高度时,它也就可以看作是一种新型的通用脚本语言了。很多时候,微型语言介乎于专属配置文件和通用脚本语言之间,它们之间的界限也非常的模糊。图2-1展示了配置文件到脚本语言的这种过度趋势。
在Linux中,微型语言是随处可见的,它们都是为专门应用领域特制的、大量减少程序行数的语言。比如前面说过的用于文本匹配的正则表达式、编写shell程序的一些实用工具(awk、sed、dc、bc)和软件开发工具(make、lex、yacc)等。
图1 配置文件到脚本语言的过度趋势
为特定领域设计微型语言是一种强大的设计理念,这也就是所谓的数据驱动编程。它可以让我们为手头的工作定义自己的高级语言,以便严格规定合理的方法、规则和算法。这样不但降低了全局复杂度,还增加了个人向同行炫耀的资本从而增加成就感。简直就是一石二鸟的绝妙方法。
但是讲解如何去设计一个新的高级语言,已经严重超出本书的范围了,那需要另外一本大部头的著作来完成。这样的著作比比皆是,但是笔者仅为各位读者推荐一本,就是拥有“龙书”之称的《编译原理》。但是别被人给忽悠了,“龙书”的主要作者是Alfred V. Aho,其它人的笔者不能担保其质量。
虽然讲述如何去做设计一个新的高级语言不属于本书的范围,但是让各位读者去领略一些Linux中常用微型语言,本书则是责无旁贷的。也是图2中所列出的大部分微型语言。想用好Linux,它们是必备的知识。
正则表达式在前面的章节中已经介绍过了,本章将不再复述;XML应该有太多人熟悉了,笔者还是不要在这里自毁形象了;make由于其可以帮助我们作为研究Linux下绝大多数开源软件源代码以及内核源代码的指路明灯,因此会单独拿出来一章着重介绍。至于lex和yacc,笔者还是知道天有多高地有多厚的,那是“龙书”的责任。余下的rpm、m4、groff、awk、以及bc和dc这是本章的全部内容,那么接下来我们就领略一下那些为这些为特定领域而设计的微型语言们的风采吧!
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。