具有可扩展句法的编程语言的制作方法

xiaoxiao2020-7-22  4

专利名称:具有可扩展句法的编程语言的制作方法
技术领域
本发明一般涉及在编译单元内具有可扩展句法以适应程序内的其他所需句法的
编程语言。
背景技术
作为背景,当大量数据被存储在数据库中时,如当一组服务器计算机收集很长时间段内的大量数据记录或事务时,其他计算机及其应用程序可能希望访问该数据或该数据的目标子集。在这种情况下,其他计算机可以使用从脚本语言开发的程序来查询所需数据, 对该数据进行读写,更新该数据,或将任何其他处理应用于该数据,经由如查询运算符的一个或多个运算符、经由各种常规查询语言。在这种情况下,数据量可能是很庞大的,并且用于消费该数据的应用程序变成是数据相当密集的。以紧凑的人类友好的文本格式来编写这些数据密集的应用程序迄今仍是一个挑战。在历史上,出于这一目的,发展了关系数据库以组织大量记录和字段,并将其用于这样的大规模数据收集,并且开发了诸如结构化查询语言(SQL)以及其他域专用语言等各种数据库查询语言,它们指令数据库管理软件代表查询客户机或应用程序从关系数据库或一组分布式数据库检索数据。然而,简言之,由于开发这些语言的特定目的和这些语言旨在在其中操作的上下文,这些语言未能在各域专用限制之间提供足够的通用性并且提升了句法复杂结构的重要性且降低了直观表达式的重要性。然而,为了通过构建对数据密集应用程序通用且易于使用的编程语言来提供对这一问题的解决方案,对该编程语言的真正使用不可避免地放弃了许多开发人员已经熟悉并且偏爱的复杂和域专用的句法结构。这是因为当今选择单种语言来进行开发暗示着使用并且只使用该语言的句法。进一步作为背景,在描述来自诸如系统管理、再保险、免税代码、棒球统计、专利申请等特定域的数据时,通常有该域专用的一组术语和语法规则。该组术语和语法规则被称为“语言”。编程语言也使其自己用对于该编程语言自身相当特别的术语和语法规则构建。 如软件技术领域的技术人员可认识到的,用FORTRAN编写程序涉及编写与用C++编写相同或类似程序所不同的源代码。像人类语言一样,在一种语言不具有另一语言的特定表达能力或该另一语言不具有该语言的特定表达能力的情况下,事实上无法在不同语言的程序之间进行转换。就此,用编程语言来描述域专用概念是既冗长又易出错的,这推动了 “域专用语言 (DSL) ”的开发,DSL很适于在其域内进行开发但不一定适于在其他域内进行开发。常规上, DSL分成两个类别外部和内部。外部DSL可被完全定制成一个域的术语和语法规则。内部 DSL使用主编程语言语法规则并随后在这些规则之内或之上开发词汇。外部DSL更简洁,但失去了主编程语言和相关联的工具的许多好处,因为它们在定义上是外部的。内部DSL保留了主语言的好处,但更冗长并且同样易于出错,因为结构是以主语法规则为依据的。另外,无论使用一语言的句法有多简洁和容易,具有不同背景、经历、文化等的不同开发人员可能在概念上不同地看待数据。作为两个不同的人如何可“自然地”或在概念上不同地看待数据的示例,考虑到美国人通常将人的名写在前面并将姓写在后面,但一些外国却相反,将姓写在前面。类似地,一些国家更喜欢日-月-年的排列,而美国喜欢月-日-年记法。因此,无论最终决定什么句法,都应该有适应在程序中查看并谈论数据的优选方式的灵活性。尽管宏展开可被用来将宏实例化成具体输出序列(在一些语言中得到支持),但宏如何在该语言中定义的句法由本机语言决定,并且不可按用户的希望来定制。附

图1概括性地示出针对这一问题的常规方法。在一典型的编译链(忽略许多细节)中,程序100用某一编程语言编写,编译器110对程序100进行编译,并且编译的结果是对象表示120。就此,程序100通常遵循单个句法。如果该句法不正确,则程序100可能不能正确编译。然而,为了在程序100中实现多个句法,一个常规解决方案是输入程序100 外部的单独文件130,该单独文件130指定编译器110实质上应如何替换程序100中的某些结构以使得对编译器而言它显得是单个句法。然而,程序100与其句法的定义分开具有一些内在问题。第一,如果规则130中的任一个改变或版本有变化,则程序100可能不再工作。第二,如果规则130由于网络中断、 删除、移动等变得不可访问或不可用,则程序100可能不再工作。因此,需要用于大规模数据处理语言的紧凑的编程语言,它在开发人员更喜欢使用各种句法的情况下并且以不具有在开发人员修改、删除、移动或忘记的情况下可能出现故障的外部依赖性的方式不限制开发人员必须使用的句法。上述背景信息以及当前编程语言的依赖性和对应系统仅仅旨在提供背景信息中的一些的概览和常规编程语言的问题,并且不旨在是穷尽性的。在审阅了以下描述之后,常规系统的其他问题和本文描述的各非限制性实施例的对应好处变得更加显而易见。概述此处提供了简化概述以帮助能够对以下更详细的描述和附图中的示例性、非限制性实施例的各方面有基本或大体的理解。然而,本概述并不旨在作为详尽的或穷尽的概观。 相反,本概述的唯一目的是以简化的形式来提出与一些示例性非限制性实施例相关的一些概念,作为以下各实施例的更为详细的描述的序言。在各实施例中提供了一种用于脚本语言的可扩展句法,该语言允许以紧凑的人类友好的文本格式来编写数据密集应用程序,并且该数据密集应用程序还是根据该数据密集应用程序内的自定义句法来编写的,使得程序的单个编译单元可以支持多个句法。在一个实施例中,脚本语言是诸如微软设计的“M”编程语言等很适于创作数据密集程序的声明性编程语言。向M提供了可扩展句法,该可扩展句法允许定义替换句法(例如内联)并随后将其用在程序中,以便适应用户定义的句法和其他预先存在的域专用语言。在一个实施例中,替换句法可以在程序中的预先指定的功能点处定义。这些和其他实施例将在下文中更详细地描述。附图简述参考附图来进一步描述各非限制性实施例,在附图中附图1示出编译器应用外部规则来转换程序的编程句法的常规系统;附图2是示出如本文的一个或多个实施例中描述的编程语言的可扩展句法的框图;附图3是示出具有本机句法的替换句法的内联定义的程序的框图,这两个句法都用在该程序内;附图4是根据一个或多个实施例的示出新句法的各预定义的插入点的框图;附图5是根据一个或多个实施例的示出嵌套在一新句法中的另一新句法的各方面的框图;附图6是根据一个或多个实施例的示出新句法在程序内的作用域确定的框图;附图7是根据一个或多个实施例的示出示例性非限制性编译过程的流程图;附图8是根据一个或多个实施例的示出用于生成目标代码的示例性非限制性过程的流程图;附图9是根据各实施例的代表性编程语言所定义的声明性模型的示例性过程链;附图10是与面向记录的执行模型相关联的类型系统的图示;附图11是根据本发明的一实施例的与基于约束的执行模型相关联的类型系统的非限制性图示;附图12是根据有序执行模型的数据存储的图示;附图13是根据次序无关的执行模型的数据存储的图示;附图14是表示其中可实现此处所描述的各实施例的示例性、非限制性联网环境的框图;以及附图15是表示其中可实现此处所描述的各实施例的一个或多个方面的示例性、 非限制性计算系统或操作环境的框图。详细描述概览如背景中讨论的,用于在编程语言中实现多个句法的常规系统尤其涉及用于通过编译器转换构造的纯外部规则和定义,然而,由于诸如在背景中讨论的那些原因等各种原因,使程序与其句法定义脱节并不好。部分地考虑先前尝试的限制,并部分地充分利用诸如微软开发的M编程语言(或为简明起见“M”)等声明性编程语言,本文描述的声明性编程语言的各非限制性实施例具有可扩展句法,其中该编程语言的句法可在程序本身内扩展。M是微软设计的很适于创作数据密集程序的编程语言。在本文描述的非限制性实施例中,可将代码直接开发成该语言的存储器内表示,或将代码从源代码转换成存储器内表示。在各非限制性实施例中,系统、应用、和程序可生成并自动确认遵循在程序内定义的多个句法的代码。M中间表示(MIR)是M模块的存储器内表示。iOR是面向数据的对象模型,并且使用与M编译单元的句法有很高程度对应性的对象初始化句法来设计以便于简单构造。IOR 中的类型仅包括表示M编译单元的各元素的属性,而没有固有行为。所有行为(类型检查、 名称解析、代码生成)是作为fflR外部的方法来实现的,并且接受MIR图来作为输入。就此,M编程语言(可在下文中找到关于它的更多细节)是很适于紧凑的且人类可理解的表示的声明性编程语言,并且有利地包括用于独立于诸如闪存、关系数据库、RAM、 外部驱动器、网络驱动器等底层存储机制来创建并修改数据密集应用程序的高效构造。“M”有时也被称为“D”编程语言,但为了一致起见,在本文中不使用对D的引用。M编程语言是作为本文阐述的相对于M源代码、M抽象句法树、M图结构等的各实施例的上下文来提供的,然而,为避免疑惑,应当理解,本发明不限于M编程语言作为本机语言。因而,可以明白,本文描述的各实施例可被应用于关于能够在程序本身内扩展其自己句法具有与M相同或相似能力的任何声明性编程语言。因此,在各非限制性实施例中,本发明提供用于诸如M编程语言等声明性数据脚本语言的可扩展句法,使得其他编程语言或用户定义的语言的其他句法可以适应在单个程序或编译单元内。就此,M的编程构造还可基于为编译器所接收到的给定源代码生成的一个或多个抽象句法树来高效地表示为半结构化图数据,并且有利的是,该源代码可以根据多个句法来指定。以下是可在M编程语言中将Person (人)定义成具有姓和名的类型、People (人们)如何可被定义成一个或更多个Person、以及People如何包括名为krena Williams的 Person的方式的示例。为避免疑惑,“M>>>”是光标表示,即脚本环境的人工产物。M >type Person {First :Text ;Last :Text ;}M >People :Person氺;M >People{ {First = " Serena",Last = 〃 Williams" }}结果,按照以下方式来声称People实际上请求枚举所定义的Person数据,从而造成 Josh Williams 的定义。
M > People {
{
First = "Serena", Last = "Williams"类似地,按照以下方式声称People. First实际上请求枚举所定义的Person数据的名(First),这造成Serena的定义。M >People. First{‘‘ Serena"}到此,只使用了 M语言的主域句法,但却是通过指定或导入以下关于Person的使用称为Contacts (联系人)的语言的新句法module Contacts { language Contacts {
@{Classification["String"]}tokenName = (’a’..’z' | ',.'Ζ')+; interleave Whitespace = " | V | '\n';
@{Classification["Keyword"]} token PersonKeyword 二 ”Person:";
syntax Person =
PersonKeyword flrst:Name last:Name => { First { first}, Last { last} }; syntax Main = p:Person* => People { valuesof(p) };
}
}则,以下新表达式是有效的,并且如可易于认识到的,比M编程语言对应物更直观,因为人类习惯了其中通过人的名并接着他们的姓来称呼他们而在中间没有其他任何句法的领域。因而,可如下用Contact语言来定义更多Person Contacts>>>Person :Tiger WoodsContacts>>>Person :ffayne GretzkyContacts>>>Person :Magic Johnson则,基于在主域中指定的Person和在Contacts语言域中指定的以上三个人,请求对People进行枚举的表达式(如以下)产生
权利要求
1.一种用于使用声明性编程语言来生成至少一个编程模块的方法,包括在计算设备的存储器中接收800声明性源代码的文本输入,包括在同一程序内接收根据所述声明性编程语言的本机句法指定的本机文本输入和根据与所述本机句法不同的句法指定的外语文本输入;在所述源代码内接收810所述不同句法的定义;以及编译750、820所述源代码,包括用与所述不同句法的定义相关联的规则来扩展所述本机句法的规则以形成一组经扩展的句法规则。
2.如权利要求1所述的方法,其特征在于,所述编译750、820包括将所述不同句法转换成遵循主编程语言的术语和语法规则的数据值。
3.如权利要求1所述的方法,其特征在于,在所述源代码内接收810所述不同句法的定义包括在所述源代码内接收一组嵌套句法的定义。
4.如权利要求1所述的方法,其特征在于,在所述源代码内接收810所述不同句法的定义包括在所述源代码内接收作用域被限于封闭的定义的不同句法的定义。
5.如权利要求1所述的方法,其特征在于,在所述源代码内接收810所述不同句法的定义包括在所述源代码内接收从程序功能观点看的一组预先固定的位置之一处的不同句法的定义。
6.如权利要求5所述的方法,其特征在于,在所述源代码内接收810所述不同句法的定义包括在所述源代码内接收顶层声明、模块构件声明或表达式处的不同句法的定义。
7.如权利要求1所述的方法,其特征在于,所述编译750、820包括根据第一遍来对所述源代码进行第一解析820以提取由所述不同句法的定义在所述源代码内所定义的新句法规则;以及根据至少附加的一遍来对所述源代码进行第二解析830,以根据经扩展的句法规则来提取所述文本输入。
8.如权利要求7所述的方法,其特征在于,还包括在第一解析之后生成730语义图结构,并且将在第二解析之后生成的抽象树结构归并740到该语义图结构中。
9.如权利要求7所述的方法,其特征在于,所述第一解析820包括扫描所述源代码并提取至少一个句法声明。
10.如权利要求9所述的方法,其特征在于,所述第一解析820包括扫描所述源代码并提取以关键词“syntax”开头的至少一个声明。
11.如权利要求7所述的方法,其特征在于,所述第二解析830包括忽略句法声明。
12.一种包括根据如权利要求1所述的方法至少部分地从声明性编程语言的源代码编译的计算机可执行指令的计算机可读介质。
13.一种基于声明性编程语言的计算机编程构造来生成的计算机程序产品,所述计算机程序产品是由一种方法生成的,所述方法包括接收700声明性源代码的文本输入,所述文本输入在表示该源代码的同一数据流内包括根据所述声明性编程语言的第一句法指定的第一文本输入、不同于所述第一句法的至少一个第二句法的至少一个定义、以及根据该至少一个第二句法指定的第二文本输入;以及编译750所述数据流的文本输入以形成所述计算机程序产品。
14.如权利要求13所述的计算机程序产品,其特征在于,所述接收700包括在所述声明性源代码的同一表达式中接收所述第一文本输入和所述至少一个第二句法的至少一个定义。
15.如权利要求13所述的计算机程序产品,其特征在于,所述接收700包括在所述声明性源代码的模块级声明处接收所述第一文本输入和所述至少一个第二句法的至少一个定义。
16.如权利要求13所述的计算机程序产品,其特征在于,所述编译750包括对所述数据流进行第一解析820以寻找所述第一句法的构造并标识所述至少一个第二句法的至少一个定义和所述至少一个第二句法的构造。
17.如权利要求16所述的计算机程序产品,其特征在于,所述编译750包括基于所标识的至少一个定义来对所述数据流进行第二解析830以寻找所述至少一个第二句法的构造。
18.—种编译器,包括用于接收声明性源代码910的文本输入的界面910、920,所述文本输入在同一编译单元内包括根据所述声明性编程语言的本机句法指定的第一文本输入、根据至少一个句法指定的第二文本输入、以及该至少一个句法的位于所述源代码内的可允许的预先确定的位置处的至少一个定义,该至少一个句法中的每一个都与所述本机句法不同;以及解析器920,所述解析器对第一设备输入进行第一解析710来形成主树结构并标识所述至少一个定义和对应的第二文本输入,并且随后基于所述至少一个定义来对所述第二文本输入进行解析740并将对所述第二文本输入的解析的输出归并到所述主树结构中。
19.如权利要求18所述的编译器,其特征在于,所述解析器920在对所述第一文本输入进行第一解析之后形成语义图结构并将抽象树结构归并到所述语义图结构,所述抽象树结构是在对所述第二文本输入进行解析之后作为输出而生成的。
20.如权利要求18所述的编译器,其特征在于,所述解析器920扫描所述声明性源代码的文本输入并提取包括一组嵌套句法的定义的至少一个句法声明。
全文摘要
本发明涉及一种用于脚本语言的可扩展句法,该语言允许以紧凑的人类友好的文本格式来编写数据密集应用程序,并且该数据密集应用程序还是根据该数据密集应用程序内的自定义的句法来编写的,使得程序的单个编译单元能够支持多个句法。向M提供了可扩展句法,该可扩展句法允许内联地定义替换句法并随后将其用在程序中,以便适应用户定义的句法和其他预先存在的域专用语言。在一个实施例中,替换句法可以在程序中的预先指定的功能点处定义。
文档编号G06F9/04GK102171654SQ200980139972
公开日2011年8月31日 申请日期2009年9月30日 优先权日2008年10月6日
发明者B·H·洛夫林, D·E·兰沃西, D·F·伯克斯, G·M·德拉-利贝拉, J·威廉姆斯 申请人:微软公司

最新回复(0)