CN102171654A - 具有可扩展句法的编程语言 - Google Patents
具有可扩展句法的编程语言 Download PDFInfo
- Publication number
- CN102171654A CN102171654A CN2009801399726A CN200980139972A CN102171654A CN 102171654 A CN102171654 A CN 102171654A CN 2009801399726 A CN2009801399726 A CN 2009801399726A CN 200980139972 A CN200980139972 A CN 200980139972A CN 102171654 A CN102171654 A CN 102171654A
- Authority
- CN
- China
- Prior art keywords
- sentence structure
- definition
- sentence
- source code
- type
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
Abstract
本发明涉及一种用于脚本语言的可扩展句法,该语言允许以紧凑的人类友好的文本格式来编写数据密集应用程序,并且该数据密集应用程序还是根据该数据密集应用程序内的自定义的句法来编写的,使得程序的单个编译单元能够支持多个句法。向M提供了可扩展句法,该可扩展句法允许内联地定义替换句法并随后将其用在程序中,以便适应用户定义的句法和其他预先存在的域专用语言。在一个实施例中,替换句法可以在程序中的预先指定的功能点处定义。
Description
技术领域
本发明一般涉及在编译单元内具有可扩展句法以适应程序内的其他所需句法的编程语言。
背景技术
作为背景,当大量数据被存储在数据库中时,如当一组服务器计算机收集很长时间段内的大量数据记录或事务时,其他计算机及其应用程序可能希望访问该数据或该数据的目标子集。在这种情况下,其他计算机可以使用从脚本语言开发的程序来查询所需数据,对该数据进行读写,更新该数据,或将任何其他处理应用于该数据,经由如查询运算符的一个或多个运算符、经由各种常规查询语言。在这种情况下,数据量可能是很庞大的,并且用于消费该数据的应用程序变成是数据相当密集的。以紧凑的人类友好的文本格式来编写这些数据密集的应用程序迄今仍是一个挑战。
在历史上,出于这一目的,发展了关系数据库以组织大量记录和字段,并将其用于这样的大规模数据收集,并且开发了诸如结构化查询语言(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模块的存储器内表示。MIR是面向数据的对象模型,并且使用与M编译单元的句法有很高程度对应性的对象初始化句法来设计以便于简单构造。MIR中的类型仅包括表示M编译单元的各元素的属性,而没有固有行为。所有行为(类型检查、名称解析、代码生成)是作为MIR外部的方法来实现的,并且接受MIR图来作为输入。
就此,M编程语言(可在下文中找到关于它的更多细节)是很适于紧凑的且人类可理解的表示的声明性编程语言,并且有利地包括用于独立于诸如闪存、关系数据库、RAM、外部驱动器、网络驱动器等底层存储机制来创建并修改数据密集应用程序的高效构造。“M”有时也被称为“D”编程语言,但为了一致起见,在本文中不使用对D的引用。
M编程语言是作为本文阐述的相对于M源代码、M抽象句法树、M图结构等的各实施例的上下文来提供的,然而,为避免疑惑,应当理解,本发明不限于M编程语言作为本机语言。因而,可以明白,本文描述的各实施例可被应用于关于能够在程序本身内扩展其自己句法具有与M相同或相似能力的任何声明性编程语言。
因此,在各非限制性实施例中,本发明提供用于诸如M编程语言等声明性数据脚本语言的可扩展句法,使得其他编程语言或用户定义的语言的其他句法可以适应在单个程序或编译单元内。就此,M的编程构造还可基于为编译器所接收到的给定源代码生成的一个或多个抽象句法树来高效地表示为半结构化图数据,并且有利的是,该源代码可以根据多个句法来指定。
以下是可在M编程语言中将Person(人)定义成具有姓和名的类型、People(人们)如何可被定义成一个或更多个Person、以及People如何包括名为Serena Williams的Person的方式的示例。为避免疑惑,“M>>>”是光标表示,即脚本环境的人工产物。
M>>>type Person{First:Text;Last:Text;}
M>>>People:Person*;
M>>>People{{First=″Serena″,Last=″Williams″}}
结果,按照以下方式来声称People实际上请求枚举所定义的Person数据,从而造成Josh Williams的定义。
类似地,按照以下方式声称People.First实际上请求枚举所定义的Person数据的名(First),这造成Serena的定义。
M>>>People.First
{
″Serena″
}
到此,只使用了M语言的主域句法,但却是通过指定或导入以下关于Person的使用称为Contacts(联系人)的语言的新句法:
则,以下新表达式是有效的,并且如可易于认识到的,比M编程语言对应物更直观,因为人类习惯了其中通过人的名并接着他们的姓来称呼他们而在中间没有其他任何句法的领域。因而,可如下用Contact语言来定义更多Person:
Contacts>>>Person:Tiger Woods
Contacts>>>Person:Wayne Gretzky
Contacts>>>Person:Magic Johnson
则,基于在主域中指定的Person和在Contacts语言域中指定的以上三个人,请求对People进行枚举的表达式(如以下)产生:
也可构造比People更复杂的表达式,如只请求具有超过7个字母的姓的那些People的表达式:
尽管以上示例是相对简单的示例,但可以看到允许不越出其他语言和规则的范围进行表示的语言的力量。各实施例将在以下更详细地描述。
用于数据脚本语言的可扩展句法
如上所述,在各非限制性实施例中,提供了用于诸如M编程语言(在此用作说明性目的,并且有时也被称为D编程语言)等声明性编程语言的可扩展句法,但各实施例不限于M语言。
在各实施例中,在该可扩展编程语言内,编程语言可以用来自特定一个或多个域的规则来扩展其自己的术语和语法规则,并且这些域可以是用户所定义的自定义域或预先存在的域。好处是通过在主程序本身中包括外语定义来将外部DSL(即,外语)的简洁性和正确性与主编程语言的特征和工具相组合。
因而,在主编程语言内提供了定义特定域(DSL)的术语和语法规则的能力。就此,主编程语言的术语和语法规则可被扩展,使得DSL可被用在声明该DSL新规则的同一文件中,这一文件可被编译成自包含的编译单元。在以下详细地示出的各实施例中,主编程语言根据统一的表示来提供来自DSL的数据,其中主编程语言能够将该数据与主源代码一起编译。
如附图2的一般示图所示,开发人员200可以根据具有可扩展句法的声明性编程语言来创建程序代码210。除用于代码210的编程语言所支持的本机句法212之外,用户可以用不同的句法214来定义语言或以其他方式指定另一预先存在的DSL。结果,可以生成根据紧凑的人类友好的表示并且在需要时也根据外部句法来指定的源代码220,从而在程序内提供大量的灵活性。因此,向主编程语言提供了自修改语法,以将该主语言的句法转向用户偏好的域或预先存在的DSL。
附图3示出假设程序300来说明这一概念。在一个文件300中,首先可能出现一些遵循本机句法的编程构造310。随后,可找到新句法的定义320。然后,可找到遵循新句法的编程构造330,其后又是使用本机语言的编程构造340。这些构造所出现的次序在M编程语言中并不特别重要,并且本机句法和新句法可以在程序本身内定义和使用是令人感兴趣的。不同的M程序可以使用其他句法,以此类推。
在一个非限制性实施例中,用于实现的机制包括两个阶段:
阶段1:解析所有文件并提取新句法规则,随后用这些规则来扩展主语言。
阶段2:再次解析所有文件以寻找域专用术语,随后以统一的数据表示——M语义图——来返回解析的结果。
在各实施例中,可以通过提供使得其他语言在主语言内的使用更可行的各种特征来使可扩展句法可管理。
例如,在附图4中示出的一个实施例中,用主编程语言编写的程序400包括供用户插入新句法440的预定义的可扩展性点,包括但不限于编译单元插入点410、模块构件或顶层声明插入点420以及用于表达式的插入点430。句法定义因而通过在主句法中出于插入目的而显式地指定的位置上对主句法作出贡献而被插入(slot into)主句法中。如上所述,示例包括:CompilationUnit(编译单元)、ModuleMemberDeclaration(模块构件声明)、以及Expression(表达式)。句法定义因而在有限的上下文中应用/使用,受它们对其作出贡献的主定义的语义类别的控制。
在附图5中示出的另一实施例中,程序500包括遵循本机句法510的编程构造510以及新句法的定义520。就此,新句法520本身经由嵌套句法530将其自己扩展到另一域中。这样,尽管示出了简单嵌套的关系,但用于扩展本机语言的句法的规则和句法的解析可以经由语言的任何分层关系来实现。则,根据指示两个(或更多个)不同的新语言的新/嵌套句法的规则540或根据主语言句法的规则550,各种构造540、550可以出现在程序500中。
因而,在句法定义构建在来自它们的主句法的可扩展定义上并且因而重新展示可扩展定义的情况下,或在句法定义本身具有显式地指定的可扩展性点的情况下,句法定义本身是可扩展的。示例是:如果自定义句法构建在Expression上,则因此可以接受对Expression作出贡献的扩展句法的嵌套使用。
句法定义的作用域还可以限于封闭的定义(例如,类型),使得对该封闭的定义的任何应用/使用都使得能够嵌套使用经扩展的句法。
type Point{x:Integer32;y:Integer32;}with syntax′(′x:Expression′,′y:Expression′)′=>{x,y};
Points:Point*;
Points{(1,2),(2,4),(3,8)}
在附图6中在概念上示出了这一点,其中具有用本机语言610编写的编程构造的程序600包括具有限定了作用域的定义的新句法,这意味着该新句法的作用域或范围在功能上被限于位置630而非位置640。例如,在以上示例中,新Point(点)语言可以与类型Point的值一起使用,然而,该新句法不能用于类型Coordinate(坐标)或任何其他构造。相反,该句法限于它为之扩展该句法的表达式(Expression)。
附图7是用于编译具有句法的多种语言定义和使用的程序的过程的图示。在700,指定具有带有多种语言句法的源代码的M文件。在710,相对于本机语言来第一次解析该程序,从而实际上记录外语构造要在何处收集其附加信息,首先构造并随后细化Mgraph(M图)。在不精确的情况下,可类似于包含外语词语的英文散文。可以首先阅读英文,并记录存在一些未知外语词语,并且随后一旦标识了这些外语词语,就可以使用包含在该散文中的其他位置的字典来稍后解析这些外语词语的意义。
在720,对程序中的所理解的或已知的构造进行简化形式的绑定和类型检查,在730其输出是一组结构抽象句法树(AST)。在740,标识该树的需要进行附加解析工作的未知部分,并且编译器基于语言规范和句法来对这些未知部分执行附加解析。这一步骤的输出同样是句法树,该句法树被归并到在730形成的主树中。一旦解析了所有外语构造(这些外语构造可被嵌套而需要对该树进行多遍解析来确定语法意义),结果是根据以下典型的编译步骤来编译的M语义图结构。
附图8是一个或多个实施例中的用于从源代码生成目标代码的代表性过程的流程图。在800和810,接收代码,该代码具有本机句法、至少一个不同句法、以及至少一个不同句法在该代码内的定义。在820,根据提取由至少一个不同句法的定义在源代码内所定义的新句法规则以扩展本机句法形成经扩展的句法,来解析代码。在830,根据至少附加的一遍来解析代码,以根据经扩展的句法规则来提取文本输入,从而在需要时深入研究嵌套句法。
作为以上概念的示例,考虑以下程序,其中行000-058构成用M编程语言编写的整个程序。
000//具有所引证的表达式的规则示例,没有宏并且没有域句法
在以上示例中,不存在域专用句法。行037-057定义数据结构并且行004-035定义数据值,这些值遵循这些结构。要注意的一点是方括号[]表示要作为表达式来进行解析和存储的表达式。
如上所述,以上程序不包含域专用句法。为易于比较,以下是用具有根据本文的一个或多个实施例的句法扩展的相同语言来编写的程序,其中行001-076定义整个程序。
在以上程序中,行054-075定义与第一示例相同的数据结构,并且行003-020定义域句法中的数据值。行021-050定义该域专用的术语和语法规则,它一致地使用术语“rule(规则)”。句法声明将该域专用的文本转换成该编程语言所需的确切结构。行052进而将域规则添加到该编程语言的规则中。具体而言,域规则扩展了该编程语言的声明规则。
在该示例中,编译器的第一阶段扫描文件并提取句法声明。每一句法声明以“syntax(句法)”开始并以“;”结束。忽略所有其他文本。一旦处理了这些句法声明并将其添加到解析器,就再次解析该文本并识别该文本的全部。在第二遍解析中,忽略句法声明并且域专用句法(例如“rule”、“ruleset(规则集合)”)被转换成遵循主编程语言的术语和语法规则的数据值。
在程序本身内使用另一语言的主编程语言的另一示例是以下模块(Module)M,首先使用外语A定义数据,随后定义语言A,并随后定义适用于该程序并且部分地基于语言A的一些类型。
语言(language)A是对CompilationUnit(编译单元)作出贡献的句法扩展的示例,并且大概不使用M句法类别中的(可能)除标量表达式之外的任一种。
示例性声明性编程语言
为避免疑惑,这一子节中提供的关于诸如M编程语言等声明性编程语言的附加上下文应被认为是非穷尽性的和非限制性的。以下阐述的伪码的特定示例代码段只是出于说明性和解释性的目的,并且不应被认为是对上面用各种细节描述的用于声明性编程语言的可扩展句法的各实施例的限制。
在附图9中,提供了用于诸如基于M编程语言的模型等声明性模型的示例性过程链。如图所示,过程链900可包括编译器920、打包组件930、同步组件940以及多个储存库950、952、……、954的耦合。在这样的实施例中,输入到编译器920的源代码910表示用诸如M编程语言等声明性编程语言创作的声明性执行模型。使用M编程语言,例如,源代码910所实现的执行模型有利地遵循基于约束的类型化(typing)(即结构类型化),和/或有利地实现次序无关(即无序)的执行模型来简化代码开发。
编译器920处理源代码910并且可以生成每一源代码的后处理定义。虽然其他系统执行编译下至命令性格式,但源代码的声明性格式在被转换时得到保留。打包组件930将处理后定义打包成镜像文件,如在M编程语言的情况下是M_Image文件,它们可安装到特定储存库950、952、……、954中。镜像文件包括必要元数据的定义和用于将多个经转换的人工产物及其声明性源模型存储在一起的可扩展存储。例如,打包组件930可以设置特定元数据属性并将声明性源定义与编译器输出人工产物一起作为各内容部分存储在镜像文件中。
使用M编程语言,打包组件930所使用的打包格式遵从ECMA开放打包约定(OPC)标准。本领域技术人员将容易理解,这一标准固有地提供像压缩、编组、签名等特征。这一标准还定义公共编程模型(API),它允许经由标准编程工具来操纵镜像文件。例如,在.NET框架中,API被定义在“System.IO.Packaging(系统输入输出打包)”名字空间中。
同步组件940是可被用来管理镜像文件的工具。例如,同步组件940可以将镜像文件当作输入并将它与一组引用的镜像文件进行链接。在这之间或之后,可以有通过提取打包的人工产物、对它们进行处理并在镜像文件中添加更多人工产物来在该同一镜像文件上操作的若干支持工具(像重写器、优化器等)。这些工具还可以操纵镜像文件的一些元数据以改变该镜像文件的状态,例如数字地签署镜像文件以确保它的完整性和安全性。
接着,部署实用程序部署该镜像文件并且安装工具将它安装到储存库950、952、……、954内的正在运行的执行环境中。一旦部署了镜像文件,则它可经受各种部署后任务,包括导出、发现、服务、版本化、卸载、以及更多。使用M编程语言,打包格式提供对所有这些操作的支持,同时仍然满足企业级的工业需求,如安全性、可扩展性、可伸缩性、以及性能。在一个实施例中,储存库950可以是关系数据库管理系统(RDBMS)的集合,然而可以容纳任何存储。
在一个实施例中,本文描述的方法可以用具有基于约束的类型系统的编程语言来操作。这样的基于约束的系统提供用传统的名义类型系统不可获得的功能。在附图10-11中,将在名义上类型化的执行系统与根据本发明的一实施例的基于约束的类型化的执行系统进行比较。如图所示,名义系统1000向每一值分配特定类型,而基于约束的系统1010中的各值可遵从无限数量的类型中的任一类型。
为了说明在名义上类型化的执行模型与根据本文描述的声明性编程语言(如D编程语言)的基于约束的类型化的模型之间的对比,用于每一模型的类型声明的示例性代码在下文中进行比较。
首先,对于在名义上类型化的执行模型,以下示例性C#代码是说明性的:
对于这一声明,存在严格的类型-值关系,其中即使A值和B值的各字段Bar和Foo的值是相同的,它们也被认为是不可比的。相反,对于基于约束的模型,以下示例性D代码(下文中更详细地讨论)说明了对象可如何遵从多个类型:
type A{Bar:Text;Foo:Integer;}
type B{Bar:Text;Foo:Integer;}
对于这一声明,类型-值关系更加灵活,因为遵从类型A的所有值也遵从B,反之亦然。此外,基于约束的模型中的类型可以在彼此的顶部上成层,这提供了有用于跨各种RDBMS进行编程的灵活性。确实,因为基于约束的模型中的类型一开始包括全域中的所有值,所以特定值遵从所有类型,其中该值不违反该类型的声明中所编纂的约束。该组值遵从声明类型T所定义的类型。其中值<128的文本因而包括不违反“Integer(整数)”约束或“值<128”约束的“全域中的所有值”。
因而,在一个实施例中,源代码的编程语言完全是包括诸如用M编程语言实现的上述基于约束的类型系统的声明性语言。
在另一实施例中,本文描述的方法还可用于具有次序无关(即无序)的执行模型的编程语言。与上述基于约束的执行模型类似,这样的次序无关的执行模型提供有用于跨各种RDBMS进行编程的灵活性。
在附图12-13中,出于说明性的目的,根据有序的执行模型的数据存储抽象与根据次序无关的执行模型的数据存储抽象进行比较。例如,附图12的数据存储抽象1200表示根据有序的执行模型创建的列表Foo,而附图13的数据抽象1210表示根据次序无关的执行模型创建的类似列表Foo。
如图所示,数据存储抽象1200和1210中的每一个包括一组三个Bar值(即,“1”、“2”和“3”)。然而,数据存储抽象1200需要这些Bar值以特定次序输入/列出,而数据存储抽象1210没有这样的要求。相反,数据存储抽象1210仅仅向每一Bar值分配一ID,其中输入/列出这些Bar值的次序对目标储存库而言是观察不到的。例如,数据存储抽象1210可从以下次序无关的代码得到:
f:Foo*={Bar=“1”};
f:Foo*={Bar=“2”};
f:Foo*={Bar=“3”};
然而,数据存储抽象1210还可从以下代码返回:
f:Foo*={Bar=“3”};
f:Foo*={Bar=“1”};
f:Foo*={Bar=“2”};
以上两代码中的每一个在功能上等效于以下代码:
f:Foo*={{Bar=“2”},{Bar=“3”},{Bar=“1”}};
与上述基于约束的类型化和无序的执行模型相兼容的示例性的声明性语言是M编程语言,有时为方便起见在本文中也称为“M”,它是由本发明的受让人开发的。然而,除M之外,可以理解,可以使用其他类似的声明性编程语言,并且本发明的效用不限于上述有向图结构的各实施例中的任何一个或多个所适用的任何单种编程语言。就此,在下文中提供关于M的一些附加上下文。
如上所述,M是用于与数据一起工作的声明性语言。M使用户使用既适于创作又适于阅读的方便文本句法来确定他们想要如何构造并查询他们的数据。在一个非限制性方面,M程序包括一个或多个源文件(形式上称为编译单元),其中源文件是Unicode字符的有序序列。源文件通常具有与文件系统中的文件的一对一对应关系,但这一对应关系不是必须的。为了得到最大可移植性,推荐使用UTF-8编码来对文件系统中的文件进行编码。
在概念上而言,M程序是使用以下四个步骤来编译的:1)词法分析,这将Unicode输入字符流转换成权标流(词法分析评估并执行预处理命令);2)句法分析,这将权标流转换成抽象句法树;3)语义分析,这解析抽象句法树中的所有符号,对结构进行类型检查并生成语义图;以及4)代码生成,这从语义图中生成用于某一目标运行时(例如,SQL、产生镜像)的可执行指令。另外的工具可以将镜像进行链接并将它们加载到运行时。
作为声明性语言,M不对如何存储或访问数据加以强制,也不对具体实现技术加以强制(与诸如XAML等域专用语言形成对比)。相反,M被设计成允许用户写下他们想要从他们的数据得到什么,而不必指定如何针对给定技术或平台来满足这些希望。换言之,M决不禁止各实现提供用于对在给定环境中如何表示并执行M构造进行控制的丰富的声明性或命令性支持,并且因此允许丰富的开发灵活性。
M构建在三个基本概念上:值、类型、以及范围(extent)。这三个概念可以如下定义:1)值是遵从M语言的规则的数据;2)类型描述一组值;以及3)范围向值提供动态存储。
一般而言,M将数据的类型化与该数据的存储/范围分开。给定类型可被用来描述来自多个范围的数据以及被用来描述计算的结果。这允许用户首先开始写下类型,并决定稍后将对应的值置于何处或在哪里计算该对应的值。
在确定将值置于何处的主题上,M语言不指定一实现如何将所声明的范围映射到诸如RDBMS等外部存储。然而,M被设计成使这样的实现成为可能并且与关系模型相兼容。
对于数据管理,M是不具有用于改变范围的内容的构造的功能语言,然而,M预测到范围的内容可以经由外部(对M而言)刺激而改变,并且可任选地,M可被修改以提供用于更新数据的声明性构造。
写下如何出于确认或分配的目的来对各值进行分类是合乎需要的。在M中,各个值是使用类型来分类的,其中M类型描述可接受的或遵从的(conformant)值的集合。此外,M类型被用来约束哪些值可出现在特定上下文中(例如,操作数、存储位置)。
除了极少可注意到的例外,M允许类型被用作集合。例如,“in”运算符可被用来测试一个值是否遵从给定类型,如:
1 in Number
″Hello,world″in Text
应当注意,内建类型的名称可在M语言中直接获得。然而,也可使用类型声明来引入类型的新名称。例如,以下类型声明引入类型名称“My Text(我的文本)”作为“Text”简单类型的同义词:
type[My Text]:Text;
在这一类型名称现在可用的情况下,以下代码可被写成:
″Hello,world″in[My Text]
尽管对已有类型引入自定义名称是有用的,但对底层类型应用谓词更加有用,如:
type SmallText:Text where value.Count<7;
在该示例中,可能的“Text”值的全域被限制为包含少于7个字符的值。因此,以下语句对于该类型定义为真:
″Terse″in SmallText
!(″Verbose″in SmallText)
类型声明包括:
type TinyText:SmallText where value.Count<6;
然而,在该示例中,这一声明等效于以下声明:
type TinyText:Text where value.Count<6;
注意,类型的名称存在,使得M声明或表达式可以引用它。可以向同一类型(例如,Text where value.Count<7(值计数少于7的文本))分配任何数量的名称,并且给定值要么遵从所有这些类型要么不遵从这些类型的任一个。例如,考虑以下示例:
type A:Number where value<100;
type B:Number where value<100:
给定两个类型定义,以下表达式:
1 in A
1 in B
两者求值都将为真。如果引入以下第三类型:
type C:Number where value>0;
则可以声称下式:
1 in C
M的一般原理是给定值能遵从任何数量的类型。这偏离了许多基于对象的系统的工作方式,在这些系统中,值在初始化时被绑定到特定类型并且是在定义该类型时指定的子类型的有限集的成员。
所讨论的另一类型相关的操作是类型归属运算符(:)。该类型归属运算符断言给定值遵从特定类型。
一般而言,在看到表达式中的值时,M基于对所应用的运算符/函数的所声明的结果类型而对该值的预期类型有一点概念。例如,逻辑“与”运算符(&&)的结果被声明为遵从类型“Logical(逻辑)”。
对给定值应用附加约束偶尔是有用的(或甚至是需要的)——通常是为了将该值用于具有不同要求的另一上下文。例如,考虑以下类型定义:
type SuperPositive:Number where value>5;
假定存在名为“CalcIt”的函数,它被声明为接受类型为“SuperPositive(超正数)”的值作为操作数,则在M中允许以下表达式是合乎需要的:
CalcIt(20)
CalcIt(42+99)
并且禁止以下表达式是合乎需要的:
CalcIt(-1)
CalcIt(4)
事实上,M对这四个示例做的正是想要做的事。这是因为这些表达式根据常数之上的内建运算符来表达它们的操作数。确定表达式的有效性所需的所有信息在遇到表达式的M源文本时易于以很少成本来获得。
然而,如果表达式利用动态数据源和/或用户定义的函数,则使用类型归属运算符来断言某一值将遵从给定类型。
为了理解类型归属运算符如何与各值一起工作,假定第二函数“GetVowelCount(获得元音计数)”,它被声明为接受类型为“Text”的操作数并返回指示该操作数中的元音的数量的类型为“Number”的值。
因为基于“GetVowelCount”的声明不知道其结果是否将大于5,所以以下表达式不是合法的M表达式:
CalcIt(GetVowelCount(someTextVariable))
表达式是不合法的,因为“GetVowelCount”所声明的结果类型(Number)包括不遵从“CalcIt”(SuperPositive)的所声明的操作数类型的值。这一表达式可被认为是错误地编写的。
然而,这一表达式可使用类型归属运算符而被重写成以下(合法)表达式:
CalcIt((GetVowelCount(someTextVariable):SuperPositive))
通过这一表达式,M被通知到以下信息:存在对“GetVowelCount”函数的足够理解而能知道将获得遵从类型“SuperPositive”的值。简言之,程序员告诉M他/她知道M在做什么。
然而,如果程序员不知道,例如如果程序员错误地判断了“GetVowelCount”函数如何工作,则特定求值可造成负数。因为“CalcIt”函数被声明为只接受遵从“SuperPositive”的值,所以该系统将确保传递给他的所有值大于5。为了确保从不违反这一约束,该系统可以注入在求值时可能失败的动态约束测试。在M源文本被首先处理(如CalcIt(-1)的情况)时,这一失败将不发生——相反,它将在对表达式实际进行求值时发生。
就此,各个M实现通常尝试在对M文档中的第一表达式进行求值之前报告任何约束违反。这被称为静态实施,并且各实现将像句法错误一样显示这一点。然而,一些约束可只对实况数据实施,并且因此需要动态实施。
就此,M使得用户易于写下他们的意图并将该负担置于M实现上以“使它工作”。可任选地,为了允许在不同的环境中使用特定M文档,具有完全特征的M实现可被配置成拒绝以下M文档:该M文档依赖于针对正确性的动态实施,以降低动态约束违反的执行和操作成本。
为了进一步提供关于M的背景,可以定义用于指定集合类型的类型构造函数。集合类型构造函数限制集合可包含的类型和元素的计数。所有集合类型是对内部类型“Collection(集合)“的限制,例如所有集合值遵从以下表达式:
{}in Collection
{1,false}in Collection
!(″Hello″in Collection)
最后示例示出集合类型不与简单类型相重叠。没有值既遵从集合类型又遵从简单类型。
集合类型构造函数指定元素的类型以及可接受的元素计数。元素计数通常是使用以下三个运算符之一来指定的:
T*-零个或更多个T
T+-一个或更多个Ts
T#m..n-m和n之间个T。
集合类型构造函数可以使用Kleene运算符或用普通写法写成对内部类型Collection的约束——即,以下类型声明描述同一集合的各值:
type SomeNumbers:Number+;
type TwoToFourNumbers:Number#2..4;
type ThreeNumbers:Number#3;
type FourOrMoreNumbers:Number#4..;
这些类型描述与以下普通写法定义相同的值集合:
与使用哪一形式来声明各类型无关,可以声称以下表达式:
集合类型构造函数与“where(其中)”运算符相组合,从而允许以下类型检查取得成功:
{1,2}in(Number where value<3)*where value.Count%2==0注意,内部的“where”运算符应用于集合的各元素,而外部“where”运算符应用于集合自身。
正与集合类型构造函数可被用来指定什么种类的集合在给定上下文中有效一样,可以使用实体类型对实体做相同的事。
就此,实体类型声明实体值集合的预期成员。实体类型的各成员可被声明为字段或计算得到的值。对字段的值进行存储;对计算得到的值的值进行计算。实体类型是对在M标准库中定义的Entity(实体)类型的约束。
以下是简单的实体类型:
type MyEntity:Language.Entity;
类型“MyEntity(我的实体)”没有声明任何字段。在M中,实体类型是开放的,因为遵从该类型的实体值可包含其名称没有在该类型中声明的字段。因此,以下类型测试:
{X=100,Y=200}in MyEntity
求值将为真,尽管“MyEntity”类型没有提到名为X和Y的字段。
实体类型可包含一个或多个字段声明。至少,字段声明声称预期字段的名称,例如:
type Point{X;Y;}
这一类型定义描述包含至少名为X和Y的字段而不管其他字段的值的实体的集合,这意味着以下类型测试求值为真:
{X=100,Y=200}in Point
{X=100,Y=200,Z=300}in Point//比预期更多的字段是OK的
!({X=100}in Point) //没有足够字段-不OK
{X=true,Y=″Hello,world″}in Point
最后示例示出“Point(点)”类型不约束X和Y字段的值,即允许任何值。将X和Y的值约束成数字值的新类型如下示出:
type NumericPoint{
X:Number;
Y:Number where value>0;
}
注意,类型归属句法被用来断言X和Y字段的值应当遵从类型“Number”。在这一点就位时,以下表达式求值为真:
{X=100,Y=200}in NumericPoint
{X=100,Y=200,Z=300}in NumericPoint
!({X=true,Y=″Hello,world″}in NumericPoint)
!({X=0,Y=0}in NumericPoint)
如在对简单类型的讨论中看到的,类型的名称存在,使得M声明和表达式可以引用它。这就是即使NumericPoint和Point的定义是无关的,以下类型测试也取得成功的原因:
{X=100,Y=200}in NumericPoint
{X=100,Y=200}in Point
M中的字段是持有各值的命名的存储单元。M允许开发人员初始化字段的值来作为实体初始化函数的一部分。然而,M不指定用于在字段的值被初始化之后改变该值的任何机制。在M中,假定对字段值的任何改变发生在M的作用域之外。
字段声明可以指示该字段存在默认值。具有默认值的字段声明不需要遵从的实体指定对应的字段(这样的字段声明有时被称为可任选字段)。例如,对于以下类型定义:
因为Z字段具有默认值,以下类型测试将成功:
{X=100,Y=200}in Point3d
此外,如果类型归属运算符被如下应用于该值:
({X=100,Y=200}:Point3d)
则,Z字段可被如下访问:
({X=100,Y=200}:Point3d).Z
在这种情况下,这一表达式将产生值-1。
在另一非限制性方面,如果字段声明不具有对应的默认值,则遵从的实体必须指定该字段的值。默认值通常是使用为“Point3d”的Z字段示出的显式句法来写下的。如果字段的类型是可空的(nullable)或者零-到-多集合,则存在隐含默认值,该默认值用于为了任选而将字段声明为空和为了集合而将字段声明为{}。
例如,考虑以下类型:
则,同样,以下类型测试将成功:
{X=100,Y=200}in PointND
并且使“PointND”归属于该值产生了这些默认值:
({X=100,Y=200}:PointND).Z==null
({X=100,Y=200}:PointND).BeyondZ=={}
选择使用零-到-1集合对显式默认值来对可任选字段进行建模通常是由风格决定的。
计算得到的值是其值被计算而非被存储的命名表达式。声明这样的计算得到的值的类型的示例是:
注意,与以分号结束的字段声明不同,计算得到的值声明以由括号包围起来的表达式结束。
与字段声明一样,计算得到的值声明可以省略类型归属,如这一示例:
在又一非限制性方面,在没有类型被显式地归属到计算得到的值时,M可以自动地基于底层表达式的所声明的结果类型来推断该类型。在该示例中,因为在表达式中使用的逻辑与运算符被声明为返回“Logical”,所以“InMagicQuadrant”计算得到的值也被归属以产生“Logical”值。
以上定义并使用的两个计算得到的值不需要任何附加信息就能计算它们的结果而非实体值本身。计算得到的值可任选地声明当在表达式中使用该计算得到的值时其实际值必须被指定的一列命名参数。以下是需要参数的计算得到的值的示例:
为了在表达式中使用这一计算得到的值,如下提供这两个参数的值:
({X=100,Y=200}:PointPlus).WithinBounds(50)
在计算“WithinBounds”的值时,M将值50绑定到符号半径内,这使得“WithinBounds”计算得到的值求值为假。
对于M要注意,字段的计算得到的值和默认值两者都是类型定义的一部分,而不是遵从该类型的值的一部分。例如,考虑这三个类型定义:
因为RichPoint和WeirdPoint只具有两个所需字段(X和Y),所以可以如下声称:
{X=1,Y=2}in RichPoint
{X=1,Y=2}in WeirdPoint
然而,“IsHigh”计算得到的值只在这两种类型之一被归属到实体值时才可用:
({X=1,Y=2}:RichPoint).IsHigh==true
({X=1,Y=2}:WeirdPoint).IsHigh==false
因为该计算得到的值完全是该类型的一部分而非值的一部分,所以在归属被如以下串链时:
(({X=1,Y=2}:RichPoint):WeirdPoint).IsHigh==false
则最外部归属确定调用哪一函数。
至于默认值如何工作,也是按照类似原理的。还要注意,默认值是类型的一部分而非实体值的一部分。因此,在编写以下表达式时:
({X=1,Y=2}:RichPoint).Z==-1
底层实体值仍然只包含两个字段值(分别是针对X和Y的1和2)。就此,在默认值与计算得到的值不同的情况下,归属被串链。例如,考虑以下表达式:
(({X=1,Y=2}:RichPoint):WeirdPoint).Z==-1因为首先应用“RichPoint”归属,所以所得实体具有名为Z、值为-1的字段;然而,没有向该值分配存储,即它是该值的类型解释的一部分。因此,在应用“WeirdPoint”归属时,它被应用于第一归属的结果,该结果确实具有名为Z的字段,使得值被用来指定Z的值。因而不需要“WeirdPoint”所指定的默认值。
与所有类型一样,可以使用“where”运算符将约束应用于一实体类型。考虑以下M类型定义:
type HighPoint{
X:Number;
Y:Number;
}where X<Y;
在该示例中,遵从类型“HighPoint”的所有值被保证具有小于Y值的X值。这意味着以下表达式:
{X=100,Y=200}in HighPoint
!({X=300,Y=200}in HighPoint)
两者求值都为真。
此外,对于以下类型定义:
第三类型“VisualPoint”命名了至少具有数字字段X、Y、Opacity以及DotSize的一组实体值。
因为通常需要将成员声明因子分解成可被合成的更小片段,所以M还提供对因子分解的显式句法支持。例如,“VisualPoint“类型定义可以使用以下句法来重写:
type VisualPoint:Point,Visual{
DotSize:Number;
}
为清楚起见,这是上文中使用约束表达式的普通写法定义的简略写法(shorthand)。此外,这一简略写法定义和普通写法定义两者都等效于以下更普通写法(longer-hand)定义:
同样,类型名称只是引用类型的方式——它们自身的值不记录用于描述它们的类型名称。
M还可以使用若干特征来扩展LINQ查询内涵,以使得创作简单的查询变得更简明。关键词“where”和“select”可用作二分中缀运算符。同样,索引器(indexer)被自动添加到强类型集合。如下所示,这些特征允许更紧凑地创建常见查询。
例如where作为中缀运算符,以下查询从所定义的“People”集合中提取30岁以下的人(people):
from p in People
where p.Age=30
select p
可以写出等效查询:
People where value.Age=30
“where”运算符采取左侧的集合以及右侧的布尔表达式。“where”运算符将关键词标识符值引入被绑定到该集合的每一成员的布尔表达式的作用域。所得集合包含该表达式为真的成员。由此,表达式:
Collection where Expression
等效于:
from value in Collection
where Expression
select value
M编译器在具有强类型元素的集合上添加索引器成员。对于集合“People”,例如,编译器可以添加“First(Text)”、“Last(Text)”以及“Age(Number)”的索引器。
因此,语句:
Collection.Field(Expression)
等效于:
from value in Collection
where Field==Expression
select value
“select”也可用作中缀运算符。对于以下简单查询:
from p in People
select p.First+p.Last
对该集合的每一成员计算“select”表达式并返回结果。使用中缀“select”,查询可被等效地写成:
People select value.First+value.Last
“select”运算符采取左侧的集合以及右侧的任意表达式。与“where”一样,“select”引入涉及该集合中的每一元素的关键词标识符。“select”运算符对该集合中的每一成员都映射该表达式并返回结果。又例如,语句:
Collection select Expression
等效于以下语句:
from value in Collection
select Expression
“select”运算符的平凡用途是提取单个字段:
People select value.First
编译器将访问器(accessor)添加到集合,使得单个字段可直接作为“People.First”和“People.Last”来提取。
为了编写合法的M文档,所有源文本都出现在模块定义的上下文中。模块对所定义的任何类型名称的顶层名字空间进行定义。模块还定义用于定义将存储实际值以及计算得到的值的范围的作用域。
以下是模块定义的简单示例:
在该示例中,该模块定义名为“Geometry.Point”的一个类型。这一类型描述点(point)值将看起来像什么,但不定义可存储这些值的任何位置。
这一示例还包括两个模块范围的字段(Points和Origin)模块范围的字段声明在句法中等于在实体类型中使用的那些。然而,一旦确定了范围,在实体类型中声明的字段仅仅命名可能的存储位置;相反,在模块范围声明的字段命名必须被一实现映射的实际存储位置,以加载并解释该模块。
另外,各模块可以通过使用导入命令来引用其他模块中的声明,以命名包含所引用的声明的模块。对于要由其他模块引用的声明,该声明被使用导出命令来显式地导出。
例如,考虑以下模块:
注意,只有“MyType1”和“MyExtent1”对其他模块可见,这使得“HerModule”的以下定义合法:
如该示例所示,各模块可具有循环依存关系。
M语言的类型被分成两个主要类别:本征类型和派生类型。本征类型是不能使用M语言构造来定义、而是整个在M语言规范中定义的类型。本征类型可以将至多一个本征类型命名为它的超类型来作为其规范的一部分。值是恰好一个本征类型的实例,并且遵从该一个本征类型的规范和其所有超类型。
派生类型是这样的类型:其定义是使用该语言中提供的类型构造函数在M源文本中构造的。派生类型被定义成对另一类型的约束,这创建显式子类型化(subtyping)关系。各值简单地依靠满足派生类型的约束来遵从任何数量的派生类型。值与派生类型之间没有预先附属关系——相反,遵从派生类型的约束的给定值可被随意解释成该类型。
M提供各种各样的选项来定义类型。返回一集合的任何表达式都可被用作类型。实体和集合的类型谓词是表达式并且适合这一形式。类型声明可以显式地枚举其成员或由其他类型组成。
另一区别处于在结构上类型化的语言(如M)与在名义上类型化的语言之间。M中的类型是一组值的规范。如果完全相同的值集合遵从两种类型,则这两种类型是相同的,而不管这些类型的名称如何。不需要对要使用的类型进行命名。在需要类型引用的任何地方,都允许类型表达式。M中的类型仅仅是返回集合的表达式。
各类型被认为是满足该类型谓词的所有值的集合。出于这一原因,对集合的任何操作可被应用于类型并且类型可以与任何其他集合值那样来用表达式进行操纵。
M提供值的两个主要形成手段:计算得到的值和所存储的值(又称字段)。计算得到的值和所存储的值可以与模块和实体声明一起发生并且由它们的容器来确定范围。计算得到的值是从对表达式进行求值来导出的,该表达式通常被定义为M源文本的一部分。相反,字段存储一个值并且该字段的内容可以随时间改变。
示例性联网和分布式环境
本领域普通技术人员可以明白,此处所描述的用于声明性编程模型的可扩展句法的各实施例可以结合任何计算机或其他客户机或服务器设备来实现,该任何计算机或其他客户机或服务器设备可作为计算机网络的一部分来部署或者被部署在分布式计算环境中,并且可以连接到任何种类的数据存储。就此,此处所描述的各实施例可以在具有任意数量的存储器或存储单元以及出现在任意数量的存储单元上的任意数量的应用程序和进程的任何计算机系统和环境中实现。这包括但不限于具有部署在具有远程或本地存储的网络环境或分布式计算环境中的服务器计算机和客户计算机的环境。
分布式计算通过计算设备和系统之间的通信交换提供了计算机资源和服务的共享。这些资源和服务包括信息的交换、对于诸如文件等对象的高速缓存存储和盘存储。这些资源和服务还包括多个处理单元之间的处理能力共享以便进行负载平衡、资源扩展、处理专门化,等等。分布式计算利用网络连接,从而允许客户机利用它们的集体力量来使整个企业受益。在这一点上,各种设备可具有应用、对象或资源,它们可以协作来执行本发明的各实施例中的任一个的一个或多个方面。
附图14提供了示例性的联网或分布式计算环境的示意图。该分布式计算环境包括计算对象1410、1412等以及计算对象或设备1420、1422、1424、1426、1428等,这些计算对象或设备可包括如由应用程序1430、1432、1434、1436、1438表示的程序、方法、数据存储、可编程逻辑等。可以理解,对象1410、1412等以及计算对象或设备1420、1422、1424、1426、1428等可包括不同的设备,诸如PDA、音频/视频设备、移动电话、MP3播放器、个人计算机、膝上型计算机等。
每一个对象1410、1412等以及计算对象或设备1420、1422、1424、1426、1428等可通过通信网络1440直接或间接与一个或多个其他对象1410、1412等以及计算对象或设备1420、1422、1424、1426、1428等进行通信。即使在附图14中被示为单个元件,但网络1440可包括向附图14的系统提供服务的其他计算对象或计算设备,和/或可表示未示出的多个互连网络。每一个对象1410、1412等或1420、1422、1424、1426、1428等还可包含诸如应用1430、1432、1434、1436、1438等应用,应用可利用API或适用于与根据本发明的各实施例来提供的用于声明性编程模型的有向图结构进行通信或适用于该用于声明性编程语言的可扩展句法的处理或实现的其他对象、软件、固件和/或硬件。
存在支持分布式计算环境的各种系统、组件和网络配置。例如,计算系统可以由有线或无线系统、本地网络或广泛分布的网络连接在一起。当前,许多网络被耦合至因特网,后者为广泛分布的计算提供了基础结构并包含许多不同的网络,但任何网络基础结构可用于变得与如各实施例中所描述的用于数据脚本语言的可扩展句法相关联的示例性通信。
因此,可以利用诸如客户机/服务器、对等、或混合体系结构等网络拓扑结构和网络基础结构的主机。“客户机”是使用与它无关的另一类或组的服务的一个类或组中的成员。客户机可以是进程,即大致上是请求由另一程序或进程提供的服务的一组指令或任务。客户机进程利用所请求的服务,而不必“知道”有关其他程序或服务本身的任何工作细节。
在客户机/服务器体系结构中,尤其在联网系统中,客户机通常是访问由例如服务器等另一计算机提供的共享的网络资源的计算机。在附图14的图示中,作为非限制性示例,计算机1420、1422、1424、1426、1428等可被认为是客户机而计算机1410、1412等可被认为是服务器,其中服务器1410、1412等提供数据服务,诸如从客户机计算机1420、1422、1424、1426、1428等接收数据、存储数据、处理数据、向客户机计算机1420、1422、1424、1426、1428发送数据等,但任何计算机都可取决于环境而被认为是客户机、服务器或两者。这些计算设备中的任一个可以处理数据、对数据进行编码、查询数据、或请求可指示如此处参考一个或多个实施例描述的可扩展句法的服务或任务。
服务器通常是可通过诸如因特网或无线网络基础架构等远程网络或本地网络访问的远程计算机系统。客户机进程可以在第一计算机系统中活动,而服务器进程可以在第二计算机系统中活动,它们通过通信介质彼此通信,从而提供分布式功能并允许多个客户机利用服务器的信息收集能力。按照用于数据脚本语言的可扩展句法来利用的任何软件对象可以单独提供或分布多个计算设备或对象上。
在其中通信网络/总线1440是因特网的网络环境中,服务器1410、1412等可以是客户机1420、1422、1424、1426、1428等通过诸如超文本传输协议(HTTP)等多种已知协议中的任一种与其通信的web服务器。服务器1410、1412等也可担当客户机1420、1422、1424、1426、1428等,这是分布式计算环境的特性。
示例性计算设备
如上所述,有利的是,此处所描述的技术可适用于其中期望开发并执行例如快速查询大量数据的数据密集应用程序的任何设备。从而,应当理解,构想了所有种类的手持式、便携式和其他计算设备和计算对象来用于各实施例,即,在设备可能期望扫描或处理巨大量的数据来得到快速且高效的结果的任何地方。因此,以下在附图15中描述的通用远程计算机只是计算设备的一个示例。
尽管并非所需,但各实施例可以部分地经由操作系统来实现,以供设备或对象的服务开发者使用,和/或被包括在用于执行此处所描述的各实施例的一个或多个功能方面的应用软件中。软件可以在由诸如客户机工作站、服务器或其他设备等一个或多个计算机执行的诸如程序模块等计算机可执行指令的通用上下文中描述。本领域的技术人员可以理解,计算机系统具有可用于传递数据的各种配置和协议,并因此没有特定配置或协议应被认为是限制性的。
因此,附图15示出了其中可实现各实施例的一个或多个方面的合适的计算系统环境1500的一个示例,尽管如上所述,计算系统环境1500仅为合适的计算环境的一个示例,并非对使用范围或功能提出任何限制。也不应该将计算环境1500解释为对示例性操作环境1500中示出的任一组件或其组合有任何依赖性或要求。
参考附图15,用于实现一个或多个实施例的示例性远程设备包括计算机1510形式的通用计算设备。计算机1510的各组件可包括但不限于,处理单元1520、系统存储器1530、以及将包括系统存储器在内的各系统组件耦合到处理单元1520的系统总线1522。
计算机1510通常包括各种计算机可读介质,并可以是可由计算机1510访问的任何可用介质。系统存储器1530可以包括诸如只读存储器(ROM)和/或随机存取存储器(RAM)等易失性和/或非易失性存储器形式的计算机存储介质。作为示例而非限制,存储器1530还可以包括操作系统、应用程序、其他程序模块、和程序数据。
用户可以通过输入设备1540向计算机1510输入命令和信息。监视器或其他类型的显示设备也经由接口,诸如输出接口1550连接至系统总线1522。除监视器之外,计算机还可以包括其他外围输出设备,如扬声器和打印机,它们可以通过输出接口1550连接。
计算机1510可使用至一个或多个远程计算机,诸如远程计算机1570的逻辑连接在网络化或分布式环境中操作。远程计算机1570可以是个人计算机、服务器、路由器、网络PC、对等设备或其他常见网络节点、或任何其他远程媒体消费或传输设备,并且可以包括上面关于计算机1510所描述的任何或全部元件。附图15所示的逻辑连接包括诸如局域网(LAN)或广域网(WAN)等的网络1572,但也可以包括其他网络/总线。这样的联网环境在家庭、办公室、企业范围计算机网络、内联网和因特网中是常见的。
如上所述,尽管结合各种计算设备和网络体系结构描述了各示例性实施例,但基本概念可被应用于其中需要开发并执行数据密集应用程序的任何网络系统和任何计算设备或系统。
而且,存在实现相同或相似功能的多种方法,例如适当的API、工具箱、驱动程序代码、操作系统、控件、独立或可下载软件对象等,它们使得应用和服务能够使用该高效的编码和查询技术。由此,本文的各实施例从API(或其他软件对象)的观点以及从提供用于数据脚本语言的可扩展句法或相对于该可扩展句法来运作的软件或硬件对象来构想。因此,此处描述的各实施例可以具有完全采用硬件、部分采用硬件并且部分采用软件、以及采用软件的方面。
在本文中使用的词语“示例性”意味着用作示例、范例或说明。为避免疑惑,本文公开的主题不受限于这样的示例。此外,本文描述为“示例性”的任何方面或设计不必解释成优于其他方面或设计或比其他方面或设计有利,它也不旨在排除本领域的普通技术人员所知的等效示例性结构和技术。而且,就术语“包括”、“具有”、“包含”和其他类似的词语在详细描述或权利要求书中的使用而言,为避免疑惑,这样的术语旨在以类似于术语“包括”作为开放的过渡词的方式解释而不排除任何附加或其他元素。
如上所述,此处所述的各种技术可结合硬件或软件,或在适当时以两者的组合来实现。如在此所使用的,术语“组件”、“系统”等同样指的是计算机相关实体,或者是硬件、硬件和软件的组合、软件或执行中的软件。例如,组件可以是,但不限于是,在处理器上运行的进程、处理器、对象、可执行码、执行的线程、程序和/或计算机。作为说明,运行在计算机上的应用程序和计算机本身都可以是计算机组件。一个或多个组件可以驻留在进程和/或执行的线程中,并且组件可以位于一个计算机内和/或分布在两个或更多计算机之间。
已经关于若干组件之间的交互描述了前述系统。应该理解,这样的系统和组件可以包括根据前述的各种置换和组合的那些组件或指定的子组件、指定的组件或子组件中的某一些、和/或另外的组件。子组件也可以被实现为通信耦合至其他组件而非被包括在父组件(分层)内的组件。另外,应注意到一个或多个组件可被组合成提供聚集功能的单个组件,或被分成若干单独的子组件,且诸如管理层等任何一个或多个中间层可被设置成通信耦合到这样的子组件以便提供集成功能。此处描述的任何组件也可以与在此未具体描述但本领域的技术人员公知的一个或多个其他组件交互。
考虑到以上描述的示例性系统,参考各附图的流程图将可以更好地理解依照所描述的主题实现的方法。尽管为了简洁起见,作为一系列框示出和描述了方法,但是,应该理解,所要求保护的主题不仅限于所描述的框的顺序,一些框可以按与此处所描绘和描述的不同的顺序进行和/或与其他框并发地进行。尽管经由流程图示出了非顺序或分支的流程,但可以理解,可实现达成相同或类似结果的各种其他分支、流程路径和框次序。此外,并非所有的所示出的方框都是实现下面所描述的方法所必需的。
除了此处所描述的各实施例之外,可以理解,可以使用其他相似的实施例或者可对所述实施例作出修改和添加以便执行对应的实施例的相同或等效的功能而不背离这些实施例。此外,多个处理芯片或多个设备可共享此处所描述的一个或多个功能的执行,并且类似地,存储可以跨多个设备实现。因此,本发明不应限于任何单个实施例,而是应该根据所附权利要求书的广度和范围来解释。
Claims (20)
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扫描所述声明性源代码的文本输入并提取包括一组嵌套句法的定义的至少一个句法声明。
Applications Claiming Priority (5)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US10322708P | 2008-10-06 | 2008-10-06 | |
US61/103,227 | 2008-10-06 | ||
US12/325,753 | 2008-12-01 | ||
US12/325,753 US20100088686A1 (en) | 2008-10-06 | 2008-12-01 | Programming language with extensible syntax |
PCT/US2009/059121 WO2010042372A2 (en) | 2008-10-06 | 2009-09-30 | Programming language with extensible syntax |
Publications (1)
Publication Number | Publication Date |
---|---|
CN102171654A true CN102171654A (zh) | 2011-08-31 |
Family
ID=42076831
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2009801399726A Pending CN102171654A (zh) | 2008-10-06 | 2009-09-30 | 具有可扩展句法的编程语言 |
Country Status (5)
Country | Link |
---|---|
US (1) | US20100088686A1 (zh) |
EP (1) | EP2350823A4 (zh) |
JP (1) | JP2012504826A (zh) |
CN (1) | CN102171654A (zh) |
WO (1) | WO2010042372A2 (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107003861A (zh) * | 2014-08-29 | 2017-08-01 | 华为技术有限公司 | 用于编译源代码的方法 |
WO2019071511A1 (en) * | 2017-10-12 | 2019-04-18 | Hewlett-Packard Development Company, L.P. | SYNTAX OF DIAGRAM |
CN110874529A (zh) * | 2018-08-31 | 2020-03-10 | 通用电气公司 | 用于属性链中的隐含图形模式的方法和系统 |
CN112394910A (zh) * | 2019-08-12 | 2021-02-23 | 拜椰特(上海)软件技术有限公司 | 计算机编程语言类型开新实例方法 |
Families Citing this family (28)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8863115B2 (en) * | 2008-03-20 | 2014-10-14 | Sap Ag | Execution of program code having language-level integration of program models |
US20100088685A1 (en) * | 2008-10-06 | 2010-04-08 | Microsoft Corporation | System and method for mapping a domain modeling language to a relational store |
US20110307904A1 (en) * | 2010-06-14 | 2011-12-15 | James Malnati | Method and apparatus for automation language extension |
US20120072886A1 (en) * | 2010-09-16 | 2012-03-22 | Starview Technology, Inc. | Domain specific language creation |
US20120143589A1 (en) * | 2010-12-07 | 2012-06-07 | Andrew Ward Beale | Multi-modal compiling apparatus and method for generating a hybrid codefile |
US9665348B1 (en) | 2011-06-07 | 2017-05-30 | The Mathworks, Inc. | Customizable, dual-format presentation of information about an object in an interactive programming enviornment |
US9092440B1 (en) * | 2011-09-15 | 2015-07-28 | Google Inc. | Generating a translation of operations for a data structure |
US9483279B2 (en) * | 2011-10-31 | 2016-11-01 | Oracle International Corporation | Mechanism for providing unified access to decentralized user assistance repositories |
US9195442B2 (en) | 2012-07-10 | 2015-11-24 | Oracle International Corporation | System and method for compiling lambda expression in a programming language environment |
GB2505218A (en) | 2012-08-23 | 2014-02-26 | Ibm | Logical contingency analysis for domain-specific languages |
JP5932707B2 (ja) * | 2013-04-18 | 2016-06-08 | 株式会社日立製作所 | 計算機、プログラム及びデータ生成方法 |
US9880820B2 (en) * | 2013-06-02 | 2018-01-30 | Microsoft Technology Licensing, Llc | Programming language with extensions using dynamic keywords |
US9799036B2 (en) | 2013-10-10 | 2017-10-24 | Elwha Llc | Devices, methods, and systems for managing representations of entities through use of privacy indicators |
US10102543B2 (en) | 2013-10-10 | 2018-10-16 | Elwha Llc | Methods, systems, and devices for handling inserted data into captured images |
US10346624B2 (en) | 2013-10-10 | 2019-07-09 | Elwha Llc | Methods, systems, and devices for obscuring entities depicted in captured images |
US20150104004A1 (en) | 2013-10-10 | 2015-04-16 | Elwha Llc | Methods, systems, and devices for delivering image data from captured images to devices |
US20150106627A1 (en) * | 2013-10-10 | 2015-04-16 | Elwha Llc | Devices, methods, and systems for analyzing captured image data and privacy data |
US10013564B2 (en) | 2013-10-10 | 2018-07-03 | Elwha Llc | Methods, systems, and devices for handling image capture devices and captured images |
US10185841B2 (en) | 2013-10-10 | 2019-01-22 | Elwha Llc | Devices, methods, and systems for managing representations of entities through use of privacy beacons |
CN104133421A (zh) * | 2014-08-01 | 2014-11-05 | 南京埃斯顿自动化股份有限公司 | 一种基于流程控制的运动控制代码解析方法 |
WO2016049379A1 (en) | 2014-09-25 | 2016-03-31 | Oracle International Corporation | System and method for supporting dynamic deployment of executable code in a distributed computing environment |
US9361075B2 (en) * | 2014-11-12 | 2016-06-07 | International Business Machines Corporation | Contraction aware parsing system for domain-specific languages |
US9696973B1 (en) * | 2016-02-24 | 2017-07-04 | Semmle Limited | Compilation cache with imports scanner |
US9990187B1 (en) * | 2017-01-27 | 2018-06-05 | Sas Institute Inc. | Analytic execution for automatic decision making |
US10628282B2 (en) * | 2018-06-28 | 2020-04-21 | International Business Machines Corporation | Generating semantic flow graphs representing computer programs |
CN109241484B (zh) * | 2018-09-06 | 2023-06-16 | 平安科技(深圳)有限公司 | 一种基于加密技术的网页数据的发送方法及设备 |
CN109358846B (zh) * | 2018-09-19 | 2019-09-27 | 深圳大学 | 一种基于c语言的语法扩展方法、装置及终端设备 |
CN113504909B (zh) * | 2021-06-30 | 2022-10-14 | 中汽数据(天津)有限公司 | 工业app异构组件数据交换方法及相关设备 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5742828A (en) * | 1994-08-03 | 1998-04-21 | Microsoft Corporation | Compiler and method for evaluation of foreign syntax expressions in source code |
US5768564A (en) * | 1994-10-07 | 1998-06-16 | Tandem Computers Incorporated | Method and apparatus for translating source code from one high-level computer language to another |
US20040261065A1 (en) * | 2000-06-21 | 2004-12-23 | Microsoft Corporation | Method and system for compiling multiple languages |
US20060101373A1 (en) * | 2004-10-25 | 2006-05-11 | Microsoft Corporation | Design-time system and method to enable programming assistance across languages and compilation boundaries |
Family Cites Families (22)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5590331A (en) * | 1994-12-23 | 1996-12-31 | Sun Microsystems, Inc. | Method and apparatus for generating platform-standard object files containing machine-independent code |
US5805895A (en) * | 1996-06-09 | 1998-09-08 | Motorola, Inc. | Method and apparatus for code translation optimization |
US6208345B1 (en) * | 1998-04-15 | 2001-03-27 | Adc Telecommunications, Inc. | Visual data integration system and method |
KR20010072477A (ko) * | 1998-08-13 | 2001-07-31 | 썬 마이크로시스템즈, 인코포레이티드 | 가상 머신 환경에서 네이티브 코드를 변환하고 실행하는방법 및 장치 |
US6324689B1 (en) * | 1998-09-30 | 2001-11-27 | Compaq Computer Corporation | Mechanism for re-writing an executable having mixed code and data |
EP1121655B1 (en) * | 1998-10-16 | 2006-07-12 | Computer Associates Think, Inc. | Accessing a hierarchical data store through an sql input |
US6343376B1 (en) * | 1998-10-22 | 2002-01-29 | Computer Computer Corporation | System and method for program verification and optimization |
US6282568B1 (en) * | 1998-12-04 | 2001-08-28 | Sun Microsystems, Inc. | Platform independent distributed management system for manipulating managed objects in a network |
JP3430252B2 (ja) * | 2000-01-24 | 2003-07-28 | 独立行政法人産業技術総合研究所 | ソースコード変換方法、ソースコード変換プログラムを記録した記録媒体及びソースコード変換装置 |
US20040158585A1 (en) * | 2003-02-06 | 2004-08-12 | Bea Systems, Inc. | System and method for manipulating enterprise application deployment descriptors |
US7685581B2 (en) * | 2003-06-27 | 2010-03-23 | Microsoft Corporation | Type system for representing and checking consistency of heterogeneous program components during the process of compilation |
US7305666B2 (en) * | 2003-07-23 | 2007-12-04 | Microsoft Corporation | Description language for an extensible compiler and tools infrastructure |
US7086041B2 (en) * | 2003-06-27 | 2006-08-01 | Microsoft Corporation | Extensible type system for representing and checking consistency of program components during the process of compilation |
US7707566B2 (en) * | 2003-06-26 | 2010-04-27 | Microsoft Corporation | Software development infrastructure |
US7577935B2 (en) * | 2004-02-14 | 2009-08-18 | Matthew T. Reynolds | Generative programming system and method employing focused grammars |
US7437709B2 (en) * | 2004-02-19 | 2008-10-14 | International Business Machines Corporation | Providing assistance for editing markup document based on inferred grammar |
US7707547B2 (en) * | 2005-03-11 | 2010-04-27 | Aptana, Inc. | System and method for creating target byte code |
US7844958B2 (en) * | 2005-03-11 | 2010-11-30 | Aptana, Inc. | System and method for creating target byte code |
EP1966691A2 (en) * | 2005-12-27 | 2008-09-10 | Vaakya Technologies Private Limited | Method and system for compiling a source code |
US7802240B2 (en) * | 2006-06-26 | 2010-09-21 | Oracle America, Inc. | Mechanism for compiling programs |
US7934207B2 (en) * | 2006-12-19 | 2011-04-26 | Microsoft Corporation | Data schemata in programming language contracts |
US8181167B2 (en) * | 2008-01-09 | 2012-05-15 | Kan Zhao | Method and system for presenting and analyzing software source code through intermediate representation |
-
2008
- 2008-12-01 US US12/325,753 patent/US20100088686A1/en not_active Abandoned
-
2009
- 2009-09-30 EP EP09819668A patent/EP2350823A4/en not_active Withdrawn
- 2009-09-30 JP JP2011530207A patent/JP2012504826A/ja not_active Withdrawn
- 2009-09-30 WO PCT/US2009/059121 patent/WO2010042372A2/en active Application Filing
- 2009-09-30 CN CN2009801399726A patent/CN102171654A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5742828A (en) * | 1994-08-03 | 1998-04-21 | Microsoft Corporation | Compiler and method for evaluation of foreign syntax expressions in source code |
US5768564A (en) * | 1994-10-07 | 1998-06-16 | Tandem Computers Incorporated | Method and apparatus for translating source code from one high-level computer language to another |
US20040261065A1 (en) * | 2000-06-21 | 2004-12-23 | Microsoft Corporation | Method and system for compiling multiple languages |
US20060101373A1 (en) * | 2004-10-25 | 2006-05-11 | Microsoft Corporation | Design-time system and method to enable programming assistance across languages and compilation boundaries |
Non-Patent Citations (1)
Title |
---|
WALTER BILOFSKY: "Syntax extension and the IMP72 programming language", 《PROCEEDINGS OF THE 2009 ACM SIGPLAN CONFERENCE ON PROGRAMMING LANGUAGE DESIGN AND IMPLEMENTATION》 * |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107003861A (zh) * | 2014-08-29 | 2017-08-01 | 华为技术有限公司 | 用于编译源代码的方法 |
US10365902B2 (en) | 2014-08-29 | 2019-07-30 | Huawei Technologies Co., Ltd. | Method for compiling a source code |
CN107003861B (zh) * | 2014-08-29 | 2020-07-24 | 华为技术有限公司 | 用于编译源代码的方法 |
WO2019071511A1 (en) * | 2017-10-12 | 2019-04-18 | Hewlett-Packard Development Company, L.P. | SYNTAX OF DIAGRAM |
CN110874529A (zh) * | 2018-08-31 | 2020-03-10 | 通用电气公司 | 用于属性链中的隐含图形模式的方法和系统 |
CN110874529B (zh) * | 2018-08-31 | 2023-10-13 | 通用电气公司 | 用于属性链中的隐含图形模式的方法和系统 |
CN112394910A (zh) * | 2019-08-12 | 2021-02-23 | 拜椰特(上海)软件技术有限公司 | 计算机编程语言类型开新实例方法 |
Also Published As
Publication number | Publication date |
---|---|
JP2012504826A (ja) | 2012-02-23 |
WO2010042372A3 (en) | 2010-07-08 |
EP2350823A4 (en) | 2012-05-02 |
WO2010042372A2 (en) | 2010-04-15 |
US20100088686A1 (en) | 2010-04-08 |
EP2350823A2 (en) | 2011-08-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102171654A (zh) | 具有可扩展句法的编程语言 | |
CN102171679B (zh) | 用于声明性编程语言的基于树的有向图编程结构 | |
Nentwich et al. | Flexible consistency checking | |
US8321833B2 (en) | Compact syntax for data scripting language | |
Mamas et al. | Towards portable source code representations using XML | |
Igamberdiev et al. | An integrated multi-level modeling approach for industrial-scale data interoperability | |
US9292586B2 (en) | System and method for synchronizing a repository with a declarative defintion | |
CN102171681A (zh) | 用于声明性数据脚本语言的类型系统 | |
Zolotas et al. | From requirements to source code: a Model-Driven Engineering approach for RESTful web services | |
McFadden et al. | Automating context-aware application development | |
Zhao et al. | Pattern-based design evolution using graph transformation | |
Youn et al. | Survey about ontology development tools for ontology-based knowledge management | |
US20100088283A1 (en) | System and method for managing database applications | |
Wille et al. | Identifying variability in object-oriented code using model-based code mining | |
Owolabi et al. | Development of an industry foundation classes assembly viewer | |
Milanović et al. | Sharing ocl constraints by using web rules | |
Ivkovic et al. | Towards automatic establishment of model dependencies using formal concept analysis | |
Gawade et al. | Constantine: configurable static analysis tool in Eclipse | |
Gradl et al. | Data integration for the arts and humanities: a language theoretical concept | |
Kronberger et al. | Gpdl: A framework-independent problem definition language for grammar-guided genetic programming | |
Waliszko | Knowledge representation and processing methods in Semantic Web | |
Zohri Yafi | A Syntactical Reverse Engineering Approach to Fourth Generation Programming Languages Using Formal Methods | |
Gröner et al. | Metamodelling and ontologies (∗) | |
Malohlava et al. | Interoperable domain‐specific languages families for code generation | |
Mezei et al. | Extending an OCL Compiler for Metamodeling and Model Transformation Systems: Unifying the Twofold Functionality |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C02 | Deemed withdrawal of patent application after publication (patent law 2001) | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20110831 |