使用Strategiesgo转换语言生成Django MVC Web框架的通用技术外文翻译资料

 2021-12-11 20:50:00

Generation technique for Django MVC web framework using the stratego transformation language

使用Strategiesgo转换语言生成Django MVC Web框架的通用技术

摘要:

领域特定语言(DSL)允许提高抽象级别,提高开发效率,并在领域专家和开发人员之间建立合理有效的通信。面向语言编程(LOP)是一种基于DSL构建的新范式,它允许将正在开发的系统的特定于领域和特定于技术的方面分离开来。LOP与模型驱动架构和模型驱动开发共享一些思想。Spoofax语言工作台是DSL设计的主要工具,它基于Stratego(一种具有可编程重写策略的转换语言)和语法定义形式主义(一种用于语法定义的语言)。我们考虑了一种用于领域建模的简单文本语言作为DSL的一个实际例子。重写规则和策略被用作生成、验证DSL代码和进行任意抽象语法树转换的统一方法。使用所谓的“字符串插值”技术实现的代码生成规则。DSL源代码在转换成python代码后可以在Django web框架中部署,从而生成带有创建/更新/删除功能的数据库上的web应用程序。开发的DSL是“通过转换定义”方法的一个示例。要从DSL中获得真正的好处,我们需要在DSL中添加更多领域特定的特性。

导言:

面向语言编程(LOP)可以看作是一种软件开发风格,它涉及使用一系列领域特定语言(DSL)而不是多方面的通用语言(GPL)。DSL允许用用户的术语获取需求。DSL是为特定领域设计的编程语言。由于专注于特定的问题类,它能够用比GPL和其他建模工具(如UML)更精确的术语来表达域。

模型驱动开发(MDD)和LOP之间存在内在联系:它们都倾向于减少问题域及其实现之间的差距。这是一种在通用语言(例如Java,C#,Python之类)之后的抽象水平的提升,LOP可以看作是一种新的编程范式,它倾向于将生成式编程、模型驱动方法(模型驱动开发、MDD、模型驱动体系结构、MDA)、意图式编程[2]等方法统一起来。

LOP的主要优势:

  • 提高开发人员的生产力;
  • 与领域得专家沟通;
  • 声明式编程方法(定义将获得什么,而不是如何获得)。

图表 1 从GPL到DSL的抽象级别的提升

要支持面向语言的编程,需要一种称为language workbench[3]的开发工具。Language Workbench为DSL定义(解析、转换、代码生成)、DSL之间的集成、丰富的编辑环境(代码突出显示、静态分析、代码完成和其他现代IDE特性)提供了许多工具。

如何开发和使用DSL有许多不同的方法。内部DSL、编译时元编程和用[4]表示的策略术语重写等方法的比较。xText框架是文本外部DSL开发中使用比较广泛的工具之一。它在Eclipse平台上工作,使用EBNF进行语法定义,ANTLR作为解析器生成器[5]。另一种方法是在JetBrains元编程系统(MPS)[6]中实现Porjectional editors(PE)。Porjectional editors(PE)是源编辑器的另一种选择。在MPS中,开发人员直接使用PE编辑抽象句法树(AST)。

在本文中,我们考虑一种基于策略术语重写的DSL开发方法。Spoofax语言工作台被用作DSL构建的主要工具。Spoofax是一种基于Stratego的转换语言,它采用可编程重写策略和语法定义形式主义(SDF)[7]作为语法定义语言。在Stratego中,DSL是通过术语重写实现的,源DSL程序使用一组转换规则和策略被转换成目标程序(Python、Java等)。

Spoofax语言工作台允许涵盖DSL构建的所有主要方面:

  • 语法定义和解析;
  • 语义分析(DSL程序验证);
  • DSL代码转换;
  • 目标代码生成;
  • 将DSL及其工具集成到IDE中。

DSL开发的最佳实践之一是语义模型是DSL的一部分。此工作中使用的语义模型与[1]中的语义模型具有相同的意义:“语义模型是DSL填充的库或框架”。语义模型提供了DSL生成的代码的运行时上下文。

我们使用Django web框架作为语义模型。源DSL代码被转换成python代码,可以在此web框架中部署,从而生成具有相应数据库上的创建/更新/删除功能的web应用程序管理子系统。

定义DSL

我们考虑一个简单的文本DSL,它将开发中的系统描述为一组相关的实体。DSL可以用作编程语言或建模语言。语言的建模和编程属性之间的区别有些模糊,没有进行精确定义。使用[9]中提出的标准,我们可以将开发中的DSL定义得比编程语言更接近建立的模模型。

客户关系管理一直是一个重要问题领域。我们使用DSL将描述顾客和顾客接触的主要数据进行模型化,让我们开始展示这个实例:

这段代码表示具有属性名称、描述和网站的客户实体。repr关键字用于定义实体的字符串表示形式。在本例中,name字段的值用作Customer实体的字符串表示形式。

实体可以使用多对一关联进行关联。例如:

联系实体使用客户属性与客户实体进行关联。

使用Stratego,我们可以用SDF表示法来定义DSL的语法:

结果使用构造函数名称n进行注释,以便使用{cons (n)}注释在抽象语法树中唯一标识它们。ID表示由字符、数字和下划线符号组成的标识符:

PINT 代表正整数以及不带前导数的零:

Stratego生成相应的代数签名,用来描述DSL的抽象语法。

现在我们可以定义用于转换和代码生成的重写规则。重写规则具有这种形式

R:p1→P2,R是规则的名称,p1左边的模式规则和P2右边的模式。模式是一个带有变量的术语。

让我们为模块的DSL顶层形式编写重写规则。模块有名称并包含一个或多个实体。

左边to-django-model是一种模式Module(x,d⋆)。模式匹配AST节点,如果成功,x绑定的模块名称和伴随实体的列表的d⋆-。规则主体使用字符串插值技术表示代码模板。文本在$[hellip;]块不变,除了方括号像块”(d′⋆]”,应当解释为一个变量。在上面to-django-model规则变量d′⋆被分配在一个“与”条款。表达式lt;map(to-django-model)gt; d⋆是类似于函数式语言:map函数to-django-model规则应用于每一个条目列表d *。

让我们定义实体转换的下一个规则。

在这里,我们为重写规则使用名称 to-django-model,但是该规则有不同的模式要匹配。在这种情况下,一个成功的匹配结合x和一个实体的名字,p⋆repr字段和属性列表和r。r值是可选的,可以是None()或Some(Repr(name))。对于这些情况我们有两个规则:

规则可以如下所示:使用指定名称的字段,如果没有提供repr,则使用pk字段。使用以下规则,变量plowast;用来获得转换代码用于每个属性使用lt;map(djangominus;minus;models)gt;策略

最后一步是为DSL中使用的每种类型定义规则。每个规则都将DSL类型转换为Django web框架模型字段类型的对应类型。

其他类型转换规则具有相同的形式,为了简单起见,我们在这里省略它们。

关联字段由单独的规则处理:

将to- Django模型规则应用到DSL的顶层形式(模块),得到了Django web框架的完整模块。

类似地,我们可以定义转换到Django管理设置的规则。此外,我们还需要一个额外的规则来编写生成的代码到python源代码文件:

Stratego语言允许人们在重写规则时定义副作用。在上面的规则中,我们使用lt;fput gt;策略编写代码生成的结果,使用lt;debuggt;策略向控制台提供一些信息。

可以将project-path变量分配给Django项目的路径,并使用Spoofax在“save”操作上设置此规则,该规则在保存DSL源代码中的更改时被激活。因此,DSL代码的所有更改都将反映在Django项目的文件中。

代码检查和完成

使用策略型术语重写技术的最大优势之一是能够使用相同的符号表达DSL的各个方面,如代码转换、代码验证和上下文完成。让我们考虑使用Stratego语言支持代码检查和完成。

Spoofax workbench生成代码分析的示例规则,然后创建项目。主要规则如下:

可以添加约束-错误、约束-警告、约束-注释等规则来定义自定义错误检查、警告和注释。collection -all (s, un)策略收集s策略在用户定义的union操作符un中成功的所有子项。在这种情况下,union操作符是一个列表连接。

设定一个规则,该规则检查repr子句中指定的属性是否属于实体。

这只是一个普通的重写规则,它将实体节点重写为由属性名和错误消息组成的元组。只有在where成功的条件下,重写才会成功。规则not(lt;some(?Property(prop, _))gt; p⋆)用作条件可以读取如下:只有在没有属性名称属于实体的部分才能成功。not(lt;some(?Property(prop, _)是一个用来匹配的模式。some(s)策略将参数策略s应用于尽可能多的直接子项和至少一个子项。如果没有成功应用参数策略s,则某些策略的应用将失败。

代码补全或自动补全允许预测代码片段,而无需用户实际键入完整的代码。它简化并加速了面向文本环境中的开发。Spoofax提供了为DSL定义自定义代码完成规则的能力。

考虑一个为内置类型定义自动完成的简单规则:

或另一个规则完成的关联实体:

Entity(lt;idgt;, _, _)模式是用于提取实体名称的术语投影。collection -all策略用于获取所有实体名称并将其放入分配给proposal变量的列表中。

Stratego提供了一个强大的模式匹配引擎,结合了一些特殊的策略,它允许对AST进行查询。思考以下例子

get-all-string-props收集具有字符串类型的所有属性。查询get-all- entity -with-2-props返回恰好具有两个属性的所有实体。我们使用术语投影技术对属性计数施加约束。测试使用策略的条件(但不重写节点)。get-all- entity -assoc-with-customer查询稍微复杂一些。它返回与客户实体关联的所有实体。在这里,我们使用带有模式属性(_,EntityAssoc(' Custome '))的策略来查找是否与客户有关联。可以使用类似的查询策略来执行源DSL代码的分析和验证。

结论

使用“通过转换定义语言”的方法重写语言非常适合DSL开发活动。有了IDE的良好支持,可以为DSL开发提供一个高效的环境。

开发的DSL是“通过转换定义”方法的一个示例。它可以用于Django应用程序的快速原型化。要从DSL中获得真正的好处,需要向其添加更多特定于领域的特性。例如,DSL可以通过添加域施加的约束来进行扩展。可以使用Django表单处理库将约束转换为输入数据的运行时验证规则。有些约束不仅可以翻译成python代码。可以通过JavaScript代码执行客户端验证,通过由相同约束生成的python代码执行服务器端验证。DSL允许在单个位置定义业务规则。因为在一般情况下,规则实现或生成源代码位于各个模块在Django项目不容易找出整体业务规则定义的代码,这就是为什么业务规则在DSL是一个更好的系统建模方法。

其他特定于域的特性也可以使用重写规则轻松添加,这些规则完全支持来自Spoofax workbench的类ide特性。该方法允许使用DSL作为领域驱动设计方法的全功能语言。

A Rails / Django Comparison

Rails / Django比较

摘要:

Ruby on Rails(“Rails”)是Ruby的主要Web编程框架,甚至是 在Ruby社区之外,被认为是最新一代高端的生产力的缩影,开源Web开发工具。 Django是许多竞争网站之一 Python的开发框架。值得注意的是,首先,在其中受到高度重视的是Python程序员,第二,作为新一代框架中为数不多的几个网络框架,尽管这不会影响Ruby on Rails。 Rails和Django都声称与更传统的Web开发框架相比大大提高了生产力。 在本文中,我们从开发人员尝试的角度比较了这两个框架,为新项目选择框架时选择两个框架之一。

  1. 简介

本文是为希望为其选择这两个框架之一的开发人员编写的自己的发展。为了进行比较,作者为小型web应用程序编写了一个规范 他们完成了两次的小型Web应用程序:一次是Ben in Rails,一次是Alan in Django的。 然后,通过代码大小和数量来比较实现,实现时间,以及更多的定性测量,如检查“风格”--HTML模板语言。当然,其他领域也可能与开发人员之间的选择

资料编号:[5812]

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。