<b>面向Java开辟人员的Scala指南 - 构建计算器,第1部份</b>[Java编程]
本文“<b>面向Java开辟人员的Scala指南 - 构建计算器,第1部份</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
特定于范畴的语言已经成为一个热门话题;很多函数性语言之所以受欢送,主如果因为它们可以用于构建特定于范畴的语言.鉴于此,在 面向 Java™ 开辟人员的 Scala 指南 系列的第 8 篇文章中,Ted Neward 着手构建一个简单的计算器 DSL,以此来展示函数性语言的构建 “外部” DSL 的强盛功效.他研究了 Scala 的一个新的特点:case 类,并重新审视一个功效强盛的特点:情势匹配.
上个月的文章发表后,我又收到了一些抱怨/评论,说我迄今为止在本系列中所用的示例都没触及到什么实质性的问题.当然在学习一个新语言的早期利用一些小例子是很公道的,而读者想要看到一些更 “实际的” 示例,从而理解语言的深层范畴和强盛功效以及其上风,这也是理所当然的.因此,在这个月的文章中,我们来分两部份操练构建特定于范畴的语言(DSL)— 本文以一个小的计算器语言为例.
特定于范畴的语言
大概您无法(或没有时间)承受来自于您的项目经理给您的压力,那么让我直接了本地说吧:特定于范畴的语言无非就是尝试(再一次)将一个利用程序的功效放在它该属于的地方 — 用户的手中.
通过定义一个新的用户可以理解并直接利用的文本语言,程序员成功摆脱了不断地处理 UI 恳求和功效加强的麻烦,并且这样还可以利用户可以自己成立脚本以及其他的工具,用来给他们所构建的利用程序成立新的行为.固然这个例子大概有点冒险(大概会惹来几封抱怨的电子邮件),但我还是要说,DSL 的最成功的例子就是 Microsoft® Office Excel “语言”,用于表达电子表格单元格的各种计算和内容.乃至有些人认为 SQL 本身就是 DSL,但这次是一个旨在与关系数据库相交互的语言(想象一下假如程序员要通过传统 API read()/write() 调用来从 Oracle 中获得数据的话,那将会是什么模样).
这里构建的 DSL 是一个简单的计算器语言,用于获得并计算数学表达式.其实,这里的目标是要成立一个小型语言,这个语言可以答应用户来输入相对简单的代数表达式,然后这个代码来为它求值并产生后果.为了尽大概简单明了,该语言不会支持很多功效完善的计算器所支持的特点,但我不也不想把它的用处限定在讲授上 — 该语言一定要具有充足的可扩大性,以使读者无需完好改变该语言就可以够将它用作一个功效更强盛的语言的核心.这意味着该语言一定要可以被简单地扩大,并要尽大概保持封装性,用起来不会有任何的阻碍.
换句话说,(终究的)目标是要答应客户机编写代码,以到达以下的目的:
清单 1. 计算器 DSL:目标
// This is Java using the Calculator
String s = "((5 * 10) + 7)";
double result = com.tedneward.calcdsl.Calculator.evaluate(s);
System.out.println("We got " + result); // Should be 57
我们不会在一篇文章完成全部的阐述,但是我们在本篇文章中可以学习到一部份内容,在下一篇文章完成全部内容.
从实现和计划的角度看,可以从构建一个基于字符串的解析器来着手构建某种可以 “挑选每个字符并动态计算” 的解析器,这的确极具引诱力,但是这只实用于较简单的语言,并且其扩大性不是很好.假如语言的目标是实现简单的扩大性,那么在深化研究实现之前,让我们先花点时间想一想若何计划语言.
按照那些基本的编译理论中最精华的部份,您可以得知一个语言处理器(包含注释器和编译器)的基本运算至少由两个阶段构成:
解析器,用于获得输入的文本并将其转换成 Abstract Syntax Tree(AST).
代码生成器(在编译器的情形下),用于获得 AST 并从中生成所需字节码;或是求值器(在注释器的情形下),用于获得 AST 并计算它在 AST 里面所发现的内容.
拥有 AST 就可以够在某种程度上优化后果树,假快意识到这一点的话,那么上述辨别的缘由就变得越发显而易见了;关于计算器,我们大概要细心查抄表达式,找出可以截去表达式的整个片段的位置,诸如在乘法表达式中运算数为 “0” 的位置(它表明无论其他运算数是多少,运算后果城市是 “0”).
您要做的第一件事是为计算器语言定义该 AST.幸运的是,Scala 有 case 类:一种供应了丰富数据、利用了非常薄的封装的类,它们所具有的一些特点使它们很合适构建 AST.
以上是“<b>面向Java开辟人员的Scala指南 - 构建计算器,第1部份</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |