没有合适的资源?快使用搜索试试~ 我知道了~
理论计算机科学电子笔记141(2005)29-34www.elsevier.com/locate/entcsHaskell Refactorer、HaRe及其API*李慧清a,1西蒙·汤普森a,1克劳斯·雷因克b,1a英国坎特伯雷肯特大学计算实验室b英国坎特伯雷摘要我们演示了Haskell Refactorer,HaRe,作为一个全功能工具的例子,一个完整的(函数式)编程语言,并展示了HaRe为Haskell构建源代码级程序转换我们评论的语言框架和处理器的建设和类似的工具所提出的挑战关键词:Haskell,重构,HaRe,程序转换API,源代码,布局保留,战略编程,Strafunski,语法学重构是一个在保持程序行为的同时改进程序设计的过程.将一般软件更新分为功能更改和重构具有众所周知的好处。这一过程得到了记录重构步骤的效果和副作用的目录的支持,更重要的是,得到了工具的支持。工具可以通过自动化检查重构的条件(使用各种程序分析)和重构本身的应用程序来确保重构步骤的有效性,从而使重构不那么痛苦,也不那么容易出错。作为“重构函数式程序”项目的一部分HaRe支持完整的Haskell 98语言,并且它可以在Haskell程序员的首选工具(根据社区调查,Emacs和Vim)中工作。 对于可用性至关重要的是,它保留了源代码程序的外观为此,*这项工作得到EPSRC赠款GR/R75052的部分支持1电子邮件:H. kent.ac.uk,S.J. kent.ac.uk,claus. talk21.com1571-0661 © 2005 Elsevier B. V.在CC BY-NC-ND许可下开放访问。doi:10.1016/j.entcs.2005.02.05330H. Li等人/理论计算机科学电子笔记141(2005)29--Test1.hs--Test1.hs模块Test1其中模块Test1其中g x=x:(g(x+1))g mx =x:((g m)(x+m))--Test2.hs--Test2.hs模块Test2其中模块Test2其中导入测试1导入测试1h y = g y h y = g 1 yFig. 1. HaRe in action:将g推广到子表达式1上。注释和源代码位置由语言处理器保存(或合成,用于HaRe的初始版本包含了一系列与作用域相关的单模块重构;这些重构的多模块版本在HaRe 0.2中添加,各种数据重构在HaRe 0.3中添加。这个版本重新构建了HaRe,向我们的基础设施公开了一个API,用于实现Haskell程序的重构和更一般的转换HaRe在图1中的一个简单示例中显示了实际操作;原始代码显示在左栏中,重构后的代码显示在右栏中。假设在Test1中函数g的定义中选择了表达式1,则提示用户输入要添加的变量的名称(此处为m)。应用一般化重构将确保g在其定义中被赋予一个额外的形式参数,并且所选择的表达式在整个项目中的g应用程序中作为参数提供(在本例中是在模块Test1和Test2中)。更大的例子出现在我们的论文[3,5]泛化是典型的结构重构类;其他包括重命名定义,改变定义的范围以使其更宽或更窄,以及展开定义。模块重构包括对导入和导出列表的各种操作,以及支持将定义从一个模块移动到另一个模块。数据重构支持许多原子步骤,这些步骤一起构建从具体数据类型到抽象类型的转换。这需要综合各种功能(选择器,鉴别器)和多级模式匹配去除。执行实现这些重构需要有关程序的许多方面的信息;我们在这里参考图1的示例语法. 转换的核心是解析程序的抽象语法树(AST)。为了保留注释和布局,还需要关于所有标记的注释和源代码位置的静态语义。 在插入新的形式参数m之前,需要-H. Li等人/理论计算机科学电子笔记141(2005)2931sary来检查这个新绑定是否没有捕获该名称的任何现有用法。结合分析提供了这一信息。模块分析。在多模块项目中,分析必须包括所有模块。例如,一个绑定m可能已经被导入到Test1中,静态分析必须处理这种可能性。类型系统。如果一个类型声明伴随着g的定义,那么它必须被更新为新的g类型,并添加参数m。显然,我们需要Haskell前端的全部功能,以便完全安全地实现重构。出于实用的原因,我们建立在其他提供Haskell前端和支持Haskell数据类型通用转换的项目上[3]。这些项目使用标准的习惯用法在Haskell中生成或嵌入语言处理器和转换,Haskell作为工具集合的表达性集成框架我们必须扩展它们的基本功能,因为丢失布局信息和注释对于我们的应用程序来说是不可接受的尽可能地保留源代码的外观对工具构建者来说是一个挑战,因为典型的编译器前端,如Pro- gramatica [4],将在程序分析的早期阶段丢弃注释和布局信息为了保留信息,我们同时使用令牌流(用于注释和布局)和AST。在语法中,每个标识符用于实现重构HaRe的体系结构已经发展,以便将API暴露给HaRe该API包含了一系列用于程序分析和转换的辅助函数,涵盖了Haskell 98的各种语法实体,包括标识符、表达式、模式、声明、导入和导出等,并提供了自由变量分析、多方程定义的简化、语法短语的更新/添加/删除/交换等功能。该API与Progra- matica的Haskell 98抽象语法和用于AST遍历的Strafunski [ 2 ]库一起原则上,我们的API公开了完整的抽象语法和嵌入在完整Haskell编程语言中的特定于域的实用程序库在实践中,正如将要证明的,由于对通用策略支持,只需要处理抽象语法类型的一小部分。32H. Li等人/理论计算机科学电子笔记141(2005)29模块RefacCase(ifToCase),其中导入RefacUtilsifToCase fileName验证位置endPos= do(_,_,mod,ts)- parseSourceFile fileName--mod:AST; ts:令牌流。letexp =locToExp假设位置endPosmod tscase expof(Exp(HsIf _))-> do r-applyRefac(worker exp)(Just(mod,ts))fileNamewriteRefactoredFiles False[r]_ -> error“您“哪里worker exp= applyTP(once_buTP(failTPinExp exp1@((Exp(HsIfe e1 e2))::HsExpP)|sameOccurrence expexp1=let newExp =Exp(HsCase e[HsAlt loc0(nameToPat“True”)(HsBodye1)[],HsAlt loc0(nameToPat“False”)(HsBody e2)[]])在更新exp1 newExp exp1 inExp_ = mzero时图二.一个重构的例子:从条件表达式到case表达式。Strafunski提供的语法,一个包含各种树遍历策略的Haskell函数库,以类型泛型的方式实现;使用Strafunski可以使“样板”代码的数量最范围和模块信息随时可用,布局和注释保存的细节在后台处理。这种在程序转换函数中隐藏布局和注释保存的做法消除了在API之前的案例研究中可能出现的编程错误的主要来源:这些函数现在不仅修改AST,还修改令牌流。实现了一系列基本的令牌流操作,如删除或更新令牌列表,获取AST语法短语的相应令牌等。在这些令牌流操作的基础上,是一种布局调整算法,该算法在令牌流被更新时保持程序的布局正确。重构后的程序源代码是从令牌流而不是AST中提取的。示范该演示将简要展示现有的重构-抽象数据类型的概括和介绍-说明它们可以应用于完整的Haskell 98编写的多模块项目。然后,API将通过实现新的重构来演示,强调所产生的代码的紧凑性和高级性质图2显示了将用户选择的条件表达式转换为case表达式的重构。重构的主体将文本化H. Li等人/理论计算机科学电子笔记141(2005)2933如果可能的话,将选择转换为表达式exp,然后调用worker函数来执行转换,并将exp作为参数。在worker中,函数applyTP,once buTP,failTP和administrator TP是来自Strafunski [2]的类型保持策略组合子一旦buTP执行AST的自底向上遍历,在其参数函数在一个节点成功后终止。在这种情况下,它的参数在除了HsExpP 之外的所有类型上都失败,在HsExpP 中它调用函数inExp。如果表达式引用的实例与用户选择的表达式相同,则后一个函数将当前表达式转换为case表达式,否则将失败。因此,总的效果是转换第一次(也是唯一一次)出现的exp。API函数更新用AST和令牌流中相同类型函数parseSourceFile、locToExp、applyRefac、writeRefactoredFiles、same- Occurrence和nameToPat也来自API,它们的含义可以在HaRe网页上的API文档中找到[1]。图2中的示例非常简单,既不涉及范围分析,也不涉及模块系统。在演示中,我们将通过展示一个更复杂的重构的实现来说明范围分析和模块系统是如何在HaRe中处理的,该重构交换了函数的前两个参数。结论Haskell Refactorer,HaRe,是一个实用主义动机的例子,一个完整的(函数式)编程语言的全功能工具。为了确保重构的正确性,HaRe建立在程序分析和转换工具的复杂基础设施之上,使用Haskell作为这些工具的实现语言和集成框架。为了促进进一步重构的实现,并使其他Haskell转换项目能够重用HaRe总之,这些工具提供了一种用于编写转换及其副条件的高级这本身并不能保证程序转换的正确性,但代码的紧凑性和透明性以及常见错误源的隔离使API用户能够高度保证实现忠实于他们的意图。也有可能正式核查执行情况的各个方面;我们目前正在就这方面的各个方面开展工作。34H. Li等人/理论计算机科学电子笔记141(2005)29引用[1] Refactoring Functional Programs,http://www.cs.kent.ac.uk/projects/refactor-fp/。[2] 拉梅尔河和J。 Visser, GenericProgrammingwithith Strafunski(2001),http://www.cs.vu.nl/Strafunski/网站。[3] Li,H.,C. Reinke和S.汤普森,重构功能程序的工具支持,在:ACM Sigplan Haskell研讨会,2003年。[4] 《自然》,http://www.cse.ogi.edu/PacSoft/projects/programatica/。[5] 汤普森,S。和C. Reinke,A Case Study in Refactoring Functional Programs,in:BrazilianSymposium on Programming Languages,2003.
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功