CN101233488B - 通过编译器来编译程序的方法和设备 - Google Patents

通过编译器来编译程序的方法和设备 Download PDF

Info

Publication number
CN101233488B
CN101233488B CN2006800277696A CN200680027769A CN101233488B CN 101233488 B CN101233488 B CN 101233488B CN 2006800277696 A CN2006800277696 A CN 2006800277696A CN 200680027769 A CN200680027769 A CN 200680027769A CN 101233488 B CN101233488 B CN 101233488B
Authority
CN
China
Prior art keywords
expression
expression formula
compiler
data structure
semantic
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.)
Active
Application number
CN2006800277696A
Other languages
English (en)
Other versions
CN101233488A (zh
Inventor
H·J·M·梅杰
A·赫杰斯伯格
M·J·沃伦
D·C·库尔卡尼
L·伯洛格纳斯
P·A·豪拉姆
G·S·凯茨泽伯格
D·布克斯
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Technology Licensing LLC
Original Assignee
Microsoft Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Microsoft Corp filed Critical Microsoft Corp
Publication of CN101233488A publication Critical patent/CN101233488A/zh
Application granted granted Critical
Publication of CN101233488B publication Critical patent/CN101233488B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/47Retargetable compilers
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/427Parsing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/436Semantic checking

Abstract

一种支持将所选语义对象表示成数据对象的语言的编译器。数据对象可通过多种方式用来扩展编程语言的能力。数据对象可被传递给应用程序并用于创建该应用程序的可执行指令。这样,以编译器的本机语言编写的指令可用于控制接受使用与编译器本机语言不一致的语言的程序的应用程序。编译器的句法检查和变量绑定能力可用于要由与编译器生成的对象代码分开的应用程序执行的那些指令。表示为数据对象的语义对象可基于包含在源代码中的表达操作来选择,或者可以基于隐式类型转换来选择。

Description

通过编译器来编译程序的方法和设备
发明背景
在某些情况下,期望将计算机程序指令作为数据对象对待。例如,当计算机程序员编写从另一应用程序访问数据的计算机程序时,便出现这种需要。例如,以C编程语言编写程序的程序员可能期望访问回答以SQL编程语言编写的查询的数据库。为了从C程序查询数据库,C程序员可将SQL命令作为串插入到C程序中。C编译器并不将这些串转换成可执行代码。相反,C编译器将这些串按照程序员的输入而逐字存储。
在C程序执行时,这些串将被传递到数据库的应用程序编程接口(API)。API可以编译或解释串,并向数据库提供适当命令以对数据库执行期望的访问。
如果在源代码文件中显式引用代码,则诸如Lisp/Scheme、MetaML和Template-Haskel的语言的编译器也会创建表示源代码文件中代码的数据对象。
发明内容
本发明涉及将源代码文件中的内部语义对象表示成数据对象的编译器。在许多情况下,语义对象会是以源代码形式构成程序指令的表达式。一方面,本发明涉及根据由编译器所使用的句法来处理内部语义对象以便将数据对象创建为外部语义数据结构。可通过多种方式之一来使用数据对象。数据对象可表示要由应用程序执行的表达式或函数,并且可被提供给该应用程序以使该应用程序执行该函数或表达式。另一方面,本发明涉及自动选择内部语义对象以便表示成数据对象。编译器可从内部语义对象创建将要作为参数传递给一方法的外部语义数据结构,从而执行隐式类型转换,该方法被构造成基于该方法接收到的自变量类型来接收表示源代码的数据对象。
根据本发明的一方面,提供了一种用于通过编译器来编译具有以所述编译器的本机语言编写的多个内部语义对象的本机语言程序的方法,所述方法包括:a)根据所述本机语言的句法处理多个内部语义对象中的第一内部语义对象,以创建表示所述第一内部语义对象的外部语义数据结构,以及,所述外部语义数据结构以如下方式来存储:该外部语义数据结构能被访问以便在所述编译器外进行处理。
根据本发明的另一方面,提供了一种准备通过具有带有自变量的方法的应用程序编程接口来访问应用程序的程序的方法,所述自变量具有与此相关联的类型,所述程序具有对所述方法的调用,所述调用具有与其相关联的参数,所述方法包括基于所述自变量的类型自动和选择性地创建表示所述参数的外部语义数据结构,其中,与所述调用相关联的参数包括源代码形式的计算机程序指令。
根据本发明的再一方面,提供了一种用于处理具有多个表达式的程序的设备,其中所述表达式是以编译器操作所用的源代码语言编写的,所述设备包括:用于通过对所述多个表达式中的一表达式执行至少一个编译器操作来将所述表达式转换成一数据结构的第一装置;用于用于接收所述数据结构并从所述数据结构产生至少一个指令的第二装置;用于接收所述至少一个指令并执行由所述至少一个指令指定的操作的第三装置。
上述概述并非由所附权利要求书限定的本发明的限制。
附图简述
附图不旨在按比例绘制。在附图中,不同附图中示出的每个相同或近似相同的组件由相同的附图标记表示。为了清楚起见,并未在每个附图中都标出了各个组件。在附图中:
图1是表示可以使用编译器的应用程序环境的简图;
图2A和2B是表示可由图1的编译器处理的代码段的简图;
图3A和3B是可用于表示图2A和图2B的程序段中的表达式的数据对象的简图;
图4是图1的编译器可操作的进程的流程图;
图5A和5B是表示可实现API的一部分的代码段的简图;
图5C是表示可调用图5A或图5B中示出的API所定义的方法的代码段的简图。
具体实施方式
已经意识到,可通过提供可从其编译的源代码中的语义对象选择性创建数据对象的编译器来使计算机语言更加灵活。通过使用从正被编译的源代码的内部语义对象到包含该语义对象的句法数据表示的数据对象的编译时(compile-time)隐式类型转换来创建数据对象。可对诸如标签、表达式、委托、方法、类、语句块或任何其它源代码指令单元或分组的任何期望形式的内部语义对象创建数据对象。在以下描述中,计算机程序指令,尤其是表达式被用作内部语义对象的示例。
隐式类型转换可被视为允许程序员从给定编译时类型T获取(运行时)System.Type实例的(T)构造类型一般化。然而,可以通过任何合适方式从内部语义对象创建数据对象。
这种编译器能够简化对访问其它应用程序的应用程序的开放。当语义对象是旨在由用不同于编译器的本机语言的编程语言回答指令的一应用程序执行的计算机程序指令时,访问该应用程序的代码可以以与该程序其余部分相同的源代码语言编写。此外,隐式类型转换避免了程序员显式引用代码表达式的需要。
通过这种编译器,计算机程序员能够用编译器的本机语言编写控制对一应用程序的访问的指令。因为这些指令是以其本机语言编写的,编译器可对这些指令进行处理而不是简单地将它们作为串存储起来,这提供了诸如允许编译器在编译时检测句法错误的优点。此外,编译器可执行否则由程序员手动进行的名字绑定和变量捕捉。结果,表示编译器外部可用的计算机程序指令的数据对象可反映其主机语言的语义,并且可例如包括已被解析的变量名、已被校验的类型或者已根据主机语言的语义被插入的转换。重要的是该处理可在编译时进行,因此减少了在执行被简单地处理成串的代码的情况下在运行时可能发生的错误。
作为可以使用这种编译器的系统的示例,图1以简化框图形式示出应用程序环境100。应用程序环境100可在运行
Figure GSB00000538969500031
操作系统的台式计算机上创建。然而,具体应用程序环境并非是对本发明的限制。可以使用任何合适的操作系统。
此外,可以使用任何合适的硬件来创建应用程序环境100。可使用一个或多个任何合适类型的计算机来主存应用程序环境100,且这些计算机可被配置成单机或网络化配置。
Figure GSB00000538969500032
操作系统下,可在应用程序环境中执行多个应用程序。在所示实施方式中,应用程序环境100执行包括编译器110和数据库应用程序150的应用程序。通常,每个应用程序可包含一组存储在计算机可读介质上的计算机可执行指令。应用程序环境100可执行这些指令以执行该应用程序的功能。
编译器110在源代码112上操作。源代码112可包含定义由一个或多个程序员使用应用程序环境100开发的程序的多个语义对象。源代码112可通过任何便捷方式来创建并可以存储在与应用程序环境100相关联的计算机可读介质上。例如,人类程序员可通过在键盘(未示出)上键入文字并将其存储在与应用程序环境100相关联的文件中来创建源代码112。
源代码112中的语义对象可在人类用户的开发下定义所需应用程序。在所示实施方式中,源代码112定义了管理存储、检索和以其它方式访问由数据库应用程序150维护的数据的应用程序。然而,由源代码112实现的具体应用程序并非对本发明的限制,且源代码112可以表示为任何所需应用程序准备的程序。
编译器110在源代码112中包含的语义对象上操作。如同在传统编译器中一样,编译器110可将源代码112中的语义对象转换成存储为对象代码120的计算机可执行指令。与源代码112类似,对象代码120可存储在与应用程序环境100相关联的计算机可读介质中。然而,对象代码120可通过任何合适的方式存储在任何适当位置中。
在本示例中,对象代码120形成在应用程序环境100内执行的计算机应用程序。然而,执行对象代码120的位置不对本发明构成限制。对象代码120可在执行编译器110的同一计算机上执行。或者,对象代码120可以在与执行编译器110的计算机联网的计算机上执行。作为可能变型的另一示例,对象代码120可被记录在可移动介质上并且分发到未与执行编译器110的计算机连接的多个计算机。
除了创建对象代码120之外,编译器110还创建表示源代码文件112中包含的语义对象的一个或多个数据对象。在所示实施方式中,表示为数据对象的语义对象是以编译器110操作所用的源代码语言(本文中称为编译器的“本机语言”)编写的表达式。可在源代码文件112中出现的表达式示例包括二元表达式、一元表达式、三元表达式、常数表达式、字段访问表达式、属性访问表达式、方法调用表达式、对象初始化程序表达式、对象创建表达式、集合和数组初始化程序表达式、数组创建表达式、强制转换表达式、参数引用表达式、lambda表达式、语义树表达式的调用、自由变量捕捉表达式或外部变量捕捉表达式。
虽然数据对象可在编译器100外部使用,但是编译器110在从内部语义对象创建这些数据对象时可应用其本机语言的句法规则。例如,编译器可执行一个或多个操作,包括:类型校验、名字绑定、变量捕捉、重载决策(overload resolution)、错误校验或传统上由编译器在编译程序时创建内部使用的语义对象的表示时所执行的其它处理步骤。可在具有包含表示应用到内部语义对象的这些编译器操作中一个或多个的结果的数据的字段的数据结构中存储数据对象。这种结构可称为语义数据结构。
在应用程序环境100中,由编译器110创建来表示内部语义对象的数据对象中的一些可在编译器110外部使用。在图1的示例中,向API 140提供数据对象,用于控制数据库150执行由内部语义对象指定的操作。
因此,与其中旨在控制分开的应用程序的源代码指令被“引用”并作为串或其它文字形式传递给该应用程序的现有技术不同,提供了表示源代码指令的外部语义数据结构。在所示实施方式中,内部语义对象是表达式,而外部语义数据结构是表达式树130。表达式树130可作为数据结构存储在与应用程序环境100相关联的计算机可读介质中。在所示实施方式中,表达式树130存储在执行对象代码120的计算机可以访问的计算机可读介质上。
每个表达式树可以以通用形式存储。以通用形式存储表达式树允许表达式树在多种上下文中使用,因为它们很容易对其所应用的任何特定上下文来定制。
作为形成对象代码的进程的一部分,编译器通常形成表达式或其它语义对象的内部通用表示。在所示实施方式中,表达式树130可以如本领域公知地由编译器内部用来在被处理时表示表达式的形式。然而,在所述实施方式中,与现有编译器不同,表示所选语义对象的数据结构以如下方式来存储:它们可被访问以在编译器内进行处理或者被访问以在编译器外进行处理。
在所示实施方式中,表达式树130可用于控制数据库应用程序150来执行由源代码112中的指令指定的操作。向API 140提供表示来自源代码112的指令的表达式树。在本示例中,API 140是数据库应用程序150的应用程序编程接口。
API 140将表达式树130中包含的表达式的通用表示转换成可由诸如数据库应用程序150执行的格式下的指令。如上所述,已知编译器包含作为形成可执行代码过程中的中间步骤的创建表达式的表示的部分。已知编译器包含将表达式的通用表示转变为可由数据库应用程序150执行的形式的可执行代码的第二部分。因此API140模仿已知编译器将代码编译成可由数据库应用程序150执行的格式的这部分的功能。作为特定示例,其中数据库应用程序150回答SQL查询,可使用或是已知或是以后开发的在SQL编译器中用来将表达式的通用表示转换成可由数据库应用程序执行的代码的技术来实现API 140。
在一实施方式中,源代码112的语义对象中只有所选子集被表示成外部数据结构。编译器110可被构造成识别源代码112中指示特定语义对象应被表示成外部数据对象的构造。除了使用这些语义对象来生成对象代码120之外或者作为替代,这些语义对象可被表示成外部数据结构。
在图1所示的实施方式中,被选择以表示成外部数据结构的语义对象是作为应用程序要执行的指令的那些语义对象。编译器110支持标识要以外部语义数据结构表示的语义对象的构造。图2A-2B示出源代码112中可控制编译器110生成期望数据结构的指令句法。图2A示出源代码112中包含源代码形式的指令序列的一部分。指令210、212和214示出编译器110对待这些指令的不同方式。
指令210是委托R的声明。委托R可用于引用函数。委托R可以例如实现为指向函数的指针。在所述实施方式中,编译器110可对委托R分配存储空间,但是无需对委托R生成对象代码。
指令212是函数f的声明。在本示例中,函数f接收整数类型的自变量并返回布尔类型的值。所返回的值取决于自变量x的值是否大于10。编译器110创建执行处理该自变量并计算返回值所必需的操作的对象代码。当在计算机程序的其它位置调用函数f时执行该代码。
相反,指令214表示表达式的声明。指令214以关键词“Expression(表达式)”开始,向编译器110表明要创建表示表达式的自变量的外部数据结构。在本示例中,表达式的自变量指定执行与函数f相同操作的函数e。然而,编译器110在处理指令214时创建外部数据结构,而不是在处理指令212时创建对象代码。
图2B示出其中一指令指示应该创建数据对象的替换情况。图2B示出定义了变量y和z的指令220和222。编译器110可通过对变量y和z的每一个分配存储器位置并向对象代码120添加计算机可执行指令以将这些位置初始化成所述值来处理指令220和222。
指令224以关键词“Expression(表达式)”开始,表明指令224定义了应从其创建数据对象的表达式。在本示例中,待由数据对象表示的表达式产生指示该表达式的自变量x是否大于变量y和z的值的乘积的布尔值。
复杂性出现在准备表示指令224中包含的表达式的外部数据结构的过程中。该表达式在该表达式外定义并且不作为运行时自变量提供的变量上操作,这些变量被称为“自由变量”或“外部变量”。这些变量的值可在程序的执行过程中变化。因此,在所述实施方式中,表示指令224中表达式的数据对象在创建时并未加载有这些变量的值。相反,该数据对象被创建成包括对允许获得变量y和z的当前值的信息的引用。类似的问题在表达式引用另一表达式的情况下也会出现。对第二表达式的适当引用必需包括在表示第一表达式的数据结构中。实现从一个表达式到另一个的引用的一种方法是在外部语义数据结构中包括一种引用另一外部语义数据结构的机制。
可在数据结构中包括访问变量y和z的值所需信息的任何合适表示。例如,可使用称为“funcletting(函数小程序)”的进程。Funcletting涉及捕捉自由变量或代码内的子表达式作为数据对象。表示自由变量或子表达式的信息的底层表示可具有任何合适的形式。作为特定示例,该数据对象可包含存储这些值的存储器位置的地址。存储器地址可以是绝对存储器地址或者可以是栈框或其它数据结构中的偏移量。作为如何指示自由变量或外部变量的值的另一示例,可以使用指向返回变量值的函数的指针。
funcletting的使用并不限于提供访问如图2B所示的整数变量的方法。可对其它类型的变量进行引用。
通过提供指示在执行表达式时从何处能够获得该表达式中使用的变量值的信息,表示该表达式的数据结构易于被转换成在执行时进行所需操作的可执行指令。可执行所需操作而不管向可执行指令的转换是在编译时、运行时还是某些中间时间执行的。此外,可执行所需操作而不管何时执行从数据对象生成的对象代码。
现在参照图3A,示出用于存储源代码112中的语义对象的数据对象310的表示。数据对象310可在任何适当计算机可读介质中实现并且可具有适于表示语义对象的任何形式。在本示例中,语义对象是在源代码112中定义的表达式,且数据对象被组织成表达式树。表达式树包括多个字段,每个字段包含评估该表达式时有用的信息。表达式树在本领域中是公知的,且编译器110可通过任何合适的方式从源代码112中的表达式来创建表达式树。
在本示例中,使用多个字段来表示表达式树,包括数据字段312和314以及操作字段316。数据字段312和314可存储数据,操作字段316可存储要对字段312和314中的数据进行的操作的指示。
数据对象310包括另一数据字段318和另一操作字段320。操作字段320可存储要对字段318中的数据进行的操作的指示以及由操作字段316指示的操作的结果。此外,数据对象310包括322处的结果字段。结果字段322可指定要存储评估由数据对象310表示的表达式的结果的位置。
如图3A所示的表示表达式树的数据对象310是数据对象的一个示例。可以使用任何合适形式的数据对象。例如,可以包含附加字段,但为简单起见并未示出。例如,可以使用任何数量的数据字段和操作字段。此外,数据对象可包括指示数据字段的数量或者操作字段的数量的字段,或者以其它方式帮助表示表达式的字段。
参照图3B,示出第二数据对象350。与数据对象310类似,数据对象350包括指定数据的诸如354和358的字段以及指定要对该数据进行的操作的诸如356和360的字段。类似的数据对象350包括指定何处存储结果的结果字段360。数据对象350与数据对象310的不同之处在于它包括引用字段352。在本示例中,引用字段352包括指示可在何处获得用于执行由操作字段356指示的操作的数据。引用字段352可包含直接或间接存储器地址或者允许获得数据的其它指示符。例如,引用字段352可包含检索适当数据的函数的地址。
图3A和3B提供外部数据结构的实现示例。语义表达式树的任何合适表示都可用于表示表达式。更一般地,其它数据结构可用于表示表达式或其它内部语义对象。
图4示出编译器110可用于将源代码112转换成对象代码120和诸如表达式树130(图1)的外部语义数据结构的进程。该进程在框410开始。在框410,编译器解析源代码112以标识表达式。解析源代码是编译器中的已知操作。框410处的处理可如在常规编译器中一样进行,无论该编译器是现已公知的还是以后开发的。
一旦从源代码112解析出表达式,则对该表达式的处理在框412进行。在框412,编译器检查表达式的句法。句法检查也是编译器的已知功能,且框412中的处理可如在常规编译器中一样执行,无论该编译器是现在已知的还是以后开发的。句法检查涉及将在框410标识的表达式与用编译器处理的语言定义所允许的表达式的一组规则进行比较。例如,如果编译器110处理以C编程语言的变体编写的源代码,则在框412应用的句法规则可以是扩充有定义基于源代码中的表达式的数据对象的创建或使用的规则的C编程语言的传统规则。例如,常规句法规则可用定义允许使用如指令214或224中所用的“Expression(表达式)”标识符的句法的规则来扩充。其它常规句法规则可以以修改形式使用以反映通过将表达式表示成数据对象而变得可能的附加处理能力。
在所述实施方式中,在框412处的句法检查应用于源代码112中的所有指令,包括旨在转换成最终传递给应用程序用于执行的数据对象的那些指令。这样,开发来由诸如数据库应用程序150的应用程序执行的源代码中错误可在编译时检测到。在编译时检测错误通常是合乎需要的,因为这可避免运行时错误。
如果在框412处执行的句法检查标识出句法错误,则进程进行到在进程框414处指示的错误处理例程。错误处理例程可执行任何所需动作,诸如将句法错误通知给编译器110的人类用户,将错误记入日志,自动校正该句法错误或者从正在处理的源代码中移除带有句法错误的表达式。
跟随句法检查,处理进行到框413。在框413,生成表达式的中间表示。生成源代码表达式的中间表示是编译器的已知功能。中间表示通常用于便于对编译中的程序进行的各种处理步骤,诸如移除冗余表达式以及对变量和其它程序对象确定存储器要求。许多在编译器中使用的中间表示是公知的。可以使用任何合适的中间表示。在本示例中,中间表示包括描述源代码中表达式的表达式树。在本示例中,为了表示表达式而形成的外部语义数据结构可与由编译器110形成的那些表达式的中间表示相同。然而,外部语义数据结构与编译器内部使用的中间表示可以不同。
进程进行到判定框416。在判定框416,对在框410标识的表达式是否表示需要对其保留外部语义数据结构的表达式进行检查。如上相关于图2A和2B所述,外部语义数据结构而非对象代码是为使用指示符“Expression”而提供的。更一般地,在源代码中存在指示应该生成数据对象的显式操作或者将要外部使用该数据对象的隐式指示时,对任何语义对象保留数据对象。
如果要对表达式提供外部数据对象,则处理进行到况418。在框418,存储包含表达式的中间表示的数据对象。在图4的示例中,数据对象中的每个是存储表达式树的数据结构。然而,取决于被处理的表达式或其它语义对象的具体类型,可以使用任何合适形式的数据对象。
然后,处理进行到框430。在判定框430,对源代码中是否存在更多的表达式进行检查。存在更多表达式时,处理返回框410,对下一表达式进行解析。然后处理使用所标识的表达式继续进行。相反,如果源代码中没有剩余其它表达式,则图4的进程结束。
如果判定框416确定应在所标识的表达式被处理时从中生成代码,则处理进行到判定框420。在判定框420,对所标识的表达式是否使用被表示为数据对象的表达式而使得不存在实现该表达式的可执行代码进行检查。
当表达式引用只有数据对象作为先前表达式的标识可用的该先前表达式时,处理进行到框422。在框422,对表示先前表达式的数据对象进行处理以从该数据对象生成对象代码。之后,处理进行到框424,其中对正被处理的表达式生成对象代码。所生成的对象代码包括直接从正被处理的表达式生成的对象代码以及从表示先前表达式的数据对象生成的对象代码。
相反,当正被处理的表达式不引用未生成可执行代码的另一表达式时,处理进行到框424。在框424,对该表达式生成数据代码。
从诸如数据对象的表达式中间表示生成数据代码是编译器的已知功能。可使用常规编译器中所用的技术在框422和424处生成对象代码,无论该编译器是现在已知的还是以后开发的。
一旦对一个表达式生成对象代码,处理进行到判定框430。在判定框430,对源代码112中是否存在更多的表达式进行检查。存在更多表达式时,处理返回到框410以便进一步处理。不存在其它表达式时,进程结束。
图4示出编译器110可操作的一个进程。编译器110可实现其它处理步骤,包括由常规编译器使用的处理步骤。此外,图4所示的处理步骤的执行顺序是示例性的。这些处理步骤可以按照任何合适顺序实现。例如,可在处理表达式之前对整个源代码文件进行解析。此外,某些进程步骤可并行实现。
图2A和2B表示包含在源代码112中标识应被表示为外部数据结构的语义对象的显式操作。除此之外或作为替代,编译器110可使用其它方法来标识应由外部数据结构表示的那些语义对象。在某些实施方式中,期望使用隐式类型转换来标识表示为外部语义数据结构的语义对象。图5A、5B和5C示出使用隐式类型转换的好处。
图5A示出可实现API一部分的代码段512。在该示例中代码段512可以是API 140(图1)。代码段512中的指令520定义了其中定义API 140的方法的类。
代码段512包括定义被称为“Where(何处)”的方法的指令522。在指令522处定义的方法具有自变量524。自变量524具有与其相关联的类型。在图5A的示例中,自变量524具有与其相关联的“Func(函数)”类型。当调用指令522中定义的方法“Where”时,应该收到“Func”类型的参数。这种参数可例如作为委托被传递。
在代码段512中定义的方法包括主体526。在主体526执行时,对方法主体526中的自变量524的引用造成由编译器110准备的对应于其委托已作为参数被传递的函数的对象代码的执行。
图5B示出可向API的方法传递自变量的替换形式。在本示例中,在未实现委托类型的自变量中定义一方法。在图5B所示的代码自变量542中,指令550定义了其中定义API的方法的类。与指令522类似,指令552定义了称为“Where”的方法。在指令552处定义的方法也采用自变量。在图5B的示例中,自变量554使用“Expression”构造。使用该构造指示当被调用时应向由指令552定义的方法传递外部语义数据结构形式的自变量。
在指令552定义的方法包括方法主体556。在主体556执行时,在方法主体556中引用自变量554的情况下,访问作为参数传递的外部语义数据结构。方法主体556可例如使用该数据结构来生成访问数据库150的指令。
图5A和5B示出开发API的程序员可指定方法可接收指示将由API执行的操作的参数的不同机制。在每种情形中,准备源代码程序112的API的用户可使用编译器110的本机语言指定期望的操作序列。在一种情形中,这些指令可由编译器110转换成可执行对象代码,而在另一种情形中这些源代码指令可被转换成将由API 140转换成数据库150的命令的数据结构。确保API中的每个方法接收适当类型的参数的一种方法是要求API的用户使用类型与代码调用的方法的自变量匹配的参数编写调用API中方法的任何程序。然而,为了避免需要开发源代码112的程序员理解API 140的每个方法如何处理源代码112中的指令,编译器110使用隐式类型转换。
图5C示出当使用隐式类型转换时可包含在源代码112中的代码段552。代码段552包括对方法“Where”进行调用的指令560。如图5C所示,在指令560调用的方法包括作为参数传递给“where”方法的表达式562。在图5C中,对于编译器110是应该将表达式562视为编译成对象代码还是转换成外部语义数据对象的表达式,不提供表达指示。因此,编写调用该方法的程序的用户可通过任何所需方式指定该表达式。但是,编译器110可依赖于隐式类型转换来以适当格式表示表达式562。编译器110可分析所调用方法要求的自变量类型并将表达式562转换成适当类型。例如,如果在指令569处调用的方法是在指令522中(图5A)定义的形式,则编译器110可将表达式562转换成对象代码并将提供给该对象代码的委托作为在指令560处调用的方法的参数。或者,在指令560处调用的方法被定义成具有指令552(图5B)所示的形式,编译器110可从由该方法收到的自变量类型来识别表达式562应被转换成外部语义数据结构。然后该外部语义数据结构被传递给指令560处调用的方法。
通过提供隐式类型转换,向生成源代码112的程序员提供显著的灵活性。因为编译器110选择适当的表达式来表示成传递给API 140的外部语义数据结构,所以,程序员无需知道API 140的每个方法的自变量的具体表示并且不用显式引用要作为数据对象传递的那些表示。
因此,描述了本发明至少一个实施方式的若干方面,但应该意识到,本领域技术人员可易于作出各种更改、修改和改进。
例如,描述了对其中参数被标识为具有在表达式外指定的类型的表达式形成的数据对象包括该参数的通用表示。数据对象的参数可在数据对象中一般地表示,即使该参数的类型信息是可用的。此外,语义对象中除了其参数类型之外的其它方面可在数据对象中一般地表示,其中从上下文获得的具体信息用于从数据对象生成可执行代码。
而且表达式用作可表示为数据对象的语义对象的示例。诸如方法或类型的任何所需语义对象可被表示为数据对象。
这种更改、修改和改进旨在作为本公开的一部分,并且落在本发明的精神和范围内。因此,以上描述和附图仅作为示例。本发明的上述实施方式可通过许多方式来实现。例如,实施方式可用硬件、软件或其组合来实现。当用软件实现时,软件代码可在任何合适处理器或处理器集合上执行,无论处理器设置在单个计算机中还是分布在多个计算机上。
而且,本文所阐述的各种方法和进程可被编码成在使用各种操作系统或平台中任一种的一个或多个处理器上执行的软件。此外,这种软件可用多种合适编程语言和/或常规编程或脚本工具编写,并且还可被编译成可执行机器语言代码。
在这方面,本发明可具体化成编码有一个或多个程序的计算机可读介质(或多个计算机可读介质)(例如计算机存储器、一个或多个软盘、压缩盘、光盘、磁带等),当这些程序在一个或多个计算机或其它处理器上执行时,执行实现上述本发明的各种实施方式的方法。计算机可读介质或多个介质可以是可传递的,使得其上存储的单个程序或多个程序可被加载到一个或多个不同计算机或其它处理器上以实现上述本发明的不同方面。
术语“程序”或“软件”在本文中以一般意义使用,指代可用于对计算机或其它处理器编程以实现上述本发明的各方面的任何类型的计算机代码或计算机可执行指令集。此外,应该意识到,根据本实施方式的一个方面,当执行时实现本发明的方法的一个或多个计算机程序无需驻留在单个计算机或处理器上,而可以模块形式分布在许多不同计算机或处理器上以实现本发明的不同方面。
计算机可执行指令可以有由一个或多个计算机或其它设备执行的诸如程序模块的许多形式。一般而言,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等。通常,在不同实施方式中,程序模块的功能性可按需组合或分布。
在上述实施方式中,描述了“对象代码”。该数据也旨在以一般意义使用,指代经编译的代码。该术语可涵盖可执行文件、包含DLL或编译器输出的其它表示的文件。
此外,术语“编译器”也旨在一般意义,且生成“对象代码”的时间并非旨在作为对本发明的限制。例如,术语编译器可涵盖有时称为“运行时(JIT)编译器”或解释器的应用程序。
此外,术语“文件”也以一般意义使用,指代逻辑上相关的数据。该术语不旨在限于操作系统对数据的任何特定组织或者在存储介质上的任何物理放置。
本发明的诸方面可单独、组合使用,或者在以上描述的实施方式中未具体说明的各种配置中使用,因此并未将其应用局限于以上说明书中阐述或附图中示出的组件的细节和配置。例如,在一实施方式中描述的方面可与其它实施方式中描述的方面以任何方式组合。
权利要求中使用诸如“第一”、“第二”、“第三”等序词来修饰权利要求元素,其本身并不意味着任何优先级、先后次序或一个权利要求元素在另一个之前的次序或者执行方法的动作的时间次序,而是只用作将具有特定名字的一个权利要求同具有相同名字(但使用序词)的另一元素区分开以区分权利要求元素。
而且,本文所使用的措词和术语是出于描述目的并且不应视为限制。本文中对“包括”、“包含”或“具有”、“含有”、“涉及”及其变体的使用旨在涵盖之后所列举的项目及其等效方案以及附加项目。

Claims (18)

1.一种用于通过编译器来编译具有以所述编译器的本机语言编写的多个内部语义对象的本机语言程序的方法,所述方法包括:
a)根据所述本机语言的句法处理多个内部语义对象中的第一内部语义对象,以创建表示所述第一内部语义对象的外部语义数据结构,
以及,所述外部语义数据结构以如下方式来存储:该外部语义数据结构能被访问以便在所述编译器外进行处理。
2.如权利要求1所述的方法,其特征在于,所述内部语义对象包括源代码形式的至少一个计算机程序指令。
3.如权利要求1所述的方法,其特征在于,所述内部语义对象包括委托。
4.如权利要求1所述的方法,其特征在于,所述内部语义对象包括语句块。
5.如权利要求1所述的方法,其特征在于,所述方法还包括:
b)基于隐式类型转换从所述多个内部语义对象选择所述内部语义对象。
6.如权利要求1所述的方法,其特征在于,所述方法还包括:
b)基于所述程序中标识所选内部语义对象的显式操作从所述多个内部语义对象选择所述内部语义对象。
7.如权利要求6所述的方法,其特征在于,所述方法还包括创建在所述程序中对多种表达式类型中的每一个展示一表达式的外部语义数据结构,所述多个表达式类型包括二元表达式、一元表达式、三元表达式、常数表达式、字段访问表达式、属性访问表达式、方法调用表达式、对象初始化程序表达式、对象创建表达式、集合和数组初始化程序表达式、数组创建表达式、强制转换表达式、参数引用表达式、lambda表达式、自由变量捕捉表达式或外部变量捕捉表达式。
8.如权利要求1所述的方法,其特征在于,所述外部语义数据结构由语义表达式树表示。
9.如权利要求1所述的方法,其特征在于,第一外部语义数据结构包含对第二外部语义数据结构的引用。
10.如权利要求1所述的方法,其特征在于,所述外部语义数据结构捕捉对自由变量或外部变量的引用。
11.一种准备通过具有带有自变量的方法的应用程序编程接口来访问应用程序的程序的方法,所述自变量具有与此相关联的类型,所述程序具有对所述方法的调用,所述调用具有与其相关联的参数,所述方法包括基于所述自变量的类型自动和选择性地创建表示所述参数的外部语义数据结构,
其中,与所述调用相关联的参数包括源代码形式的计算机程序指令。
12.如权利要求11所述的方法,其特征在于,还包括在运行时使用所述外部语义数据结构来生成所述应用程序的至少一个指令。
13.如权利要求12所述的方法,其特征在于,使用所述外部语义数据结构来生成至少一个指令的动作由所述应用程序编程接口来执行。
14.如权利要求11所述的方法,其特征在于,所述源代码是用具有句法的语言的,且创建表示所述调用自变量的外部语义数据结构包括根据所述句法绑定所述调用自变量中使用的变量名。
15.如权利要求11所示的方法,其特征在于,所述源代码是用具有句法的语言的,且创建表示所述调用自变量的外部语义数据结构包括对所述调用自变量中的计算机程序指令检查句法错误。
16.一种用于处理具有多个表达式的程序的设备,其中所述表达式是以编译器操作所用的源代码语言编写的,所述设备包括:
a)用于通过对所述多个表达式中的一表达式执行至少一个编译器操作来将所述表达式转换成一数据结构的第一装置;
b)用于用于接收所述数据结构并从所述数据结构产生至少一个指令的第二装置;
c)用于接收所述至少一个指令并执行由所述至少一个指令指定的操作的第三装置。
17.如权利要求16所述的设备,其特征在于,所述应用程序包括数据库。
18.如权利要求16所示的设备,其特征在于,所述第一装置进一步包括用于从所述多个表达式中第二表达式生成第二数据结构的部分以及用于从所述第二数据结构生成对象代码的装置。
CN2006800277696A 2005-07-29 2006-06-21 通过编译器来编译程序的方法和设备 Active CN101233488B (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US11/193,721 US7992140B2 (en) 2005-07-29 2005-07-29 Compiler supporting programs as data objects
US11/193,721 2005-07-29
PCT/US2006/024419 WO2007018771A2 (en) 2005-07-29 2006-06-21 Compiler supporting programs as data objects

Publications (2)

Publication Number Publication Date
CN101233488A CN101233488A (zh) 2008-07-30
CN101233488B true CN101233488B (zh) 2012-07-04

Family

ID=37695828

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2006800277696A Active CN101233488B (zh) 2005-07-29 2006-06-21 通过编译器来编译程序的方法和设备

Country Status (5)

Country Link
US (2) US7992140B2 (zh)
EP (1) EP1913471A4 (zh)
JP (1) JP2009503677A (zh)
CN (1) CN101233488B (zh)
WO (1) WO2007018771A2 (zh)

Families Citing this family (48)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20070027905A1 (en) * 2005-07-29 2007-02-01 Microsoft Corporation Intelligent SQL generation for persistent object retrieval
US7992140B2 (en) * 2005-07-29 2011-08-02 Microsoft Corporation Compiler supporting programs as data objects
US7685567B2 (en) * 2005-07-29 2010-03-23 Microsoft Corporation Architecture that extends types using extension methods
US20070027849A1 (en) * 2005-07-29 2007-02-01 Microsoft Corporation Integrating query-related operators in a programming language
US7702686B2 (en) * 2005-07-29 2010-04-20 Microsoft Corporation Retrieving and persisting objects from/to relational databases
US9009660B1 (en) * 2005-11-29 2015-04-14 Tilera Corporation Programming in a multiprocessor environment
US8112739B2 (en) * 2005-12-01 2012-02-07 Cypress Semiconductor Corporation Data driven transfer functions
US8176468B2 (en) * 2005-12-01 2012-05-08 Cypress Semiconductor Corporation Multivariable transfer functions
US9128727B2 (en) * 2006-08-09 2015-09-08 Microsoft Technology Licensing, Llc Generation of managed assemblies for networks
US8843906B1 (en) * 2006-10-16 2014-09-23 The Mathworks, Inc. Inferring data types from compiler call site
US8347266B2 (en) * 2007-12-10 2013-01-01 Microsoft Corporation Declarative object identity
US20090227921A1 (en) 2008-03-04 2009-09-10 Tyco Healthcare Group Lp Bendable sole for compression foot cuff
US20090271765A1 (en) * 2008-04-29 2009-10-29 Microsoft Corporation Consumer and producer specific semantics of shared object protocols
US8316357B2 (en) * 2008-09-03 2012-11-20 Microsoft Corporation Type descriptor management for frozen objects
US8881121B2 (en) * 2009-02-18 2014-11-04 International Business Machines Corporation Processing an object-oriented query to retrieve data from a data source
US8799877B2 (en) * 2009-03-27 2014-08-05 Optumsoft, Inc. Interpreter-based program language translator using embedded interpreter types and variables
US10089119B2 (en) 2009-12-18 2018-10-02 Microsoft Technology Licensing, Llc API namespace virtualization
US8739118B2 (en) 2010-04-08 2014-05-27 Microsoft Corporation Pragmatic mapping specification, compilation and validation
US20110276950A1 (en) * 2010-05-05 2011-11-10 Microsoft Corporation Name binding extensibility for typed programming language
US8776094B2 (en) 2011-08-11 2014-07-08 Microsoft Corporation Runtime system
US8695021B2 (en) 2011-08-31 2014-04-08 Microsoft Corporation Projecting native application programming interfaces of an operating system into other programming languages
US8997070B2 (en) * 2011-12-15 2015-03-31 Sap Se Extension mechanism for scripting language compiler
JP5818695B2 (ja) * 2012-01-04 2015-11-18 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation コード変換方法、プログラム及びシステム
US9195442B2 (en) * 2012-07-10 2015-11-24 Oracle International Corporation System and method for compiling lambda expression in a programming language environment
KR101893796B1 (ko) * 2012-08-16 2018-10-04 삼성전자주식회사 동적 데이터 구성을 위한 방법 및 장치
US9652207B2 (en) 2013-03-13 2017-05-16 Microsoft Technology Licensing, Llc. Static type checking across module universes
US9639335B2 (en) 2013-03-13 2017-05-02 Microsoft Technology Licensing, Llc. Contextual typing
US9563412B2 (en) * 2013-03-13 2017-02-07 Microsoft Technology Licensing, Llc. Statically extensible types
CN103500160B (zh) * 2013-10-18 2016-07-06 大连理工大学 一种基于滑动语义串匹配的句法分析方法
KR101629068B1 (ko) * 2013-12-10 2016-06-21 건국대학교 산학협력단 프로그램 언어 변환 장치 및 프로그램 언어 변환 장치를 구비하는 검증 장치
US9910680B2 (en) * 2014-04-22 2018-03-06 Oracle International Corporation Decomposing a generic class into layers
US9740464B2 (en) * 2014-05-30 2017-08-22 Apple Inc. Unified intermediate representation
US10346941B2 (en) 2014-05-30 2019-07-09 Apple Inc. System and method for unified application programming interface and model
US10430169B2 (en) 2014-05-30 2019-10-01 Apple Inc. Language, function library, and compiler for graphical and non-graphical computation on a graphical processor unit
US10635504B2 (en) 2014-10-16 2020-04-28 Microsoft Technology Licensing, Llc API versioning independent of product releases
US9557917B2 (en) * 2014-11-10 2017-01-31 International Business Machines Corporation Conditional stack frame allocation
US9864518B2 (en) 2014-11-10 2018-01-09 International Business Machines Corporation Assigning home memory addresses to function call parameters
US9317266B1 (en) * 2014-11-12 2016-04-19 Bank Of America Corporation Leveraging legacy applications for use with modern applications
US9875087B2 (en) * 2015-04-10 2018-01-23 Oracle International Corporation Declarative program engine for large-scale program analysis
US10567517B2 (en) * 2015-06-05 2020-02-18 Apple Inc. Web resource load blocking API
US10621152B2 (en) * 2015-12-02 2020-04-14 Speedment, Inc. Methods and systems for mapping object oriented/functional languages to database languages
CN108920133B (zh) * 2018-06-14 2021-06-18 北京三快在线科技有限公司 跨语言编程方法、装置、电子设备及存储介质
US10942710B1 (en) * 2019-09-24 2021-03-09 Rockwell Automation Technologies, Inc. Industrial automation domain-specific language programming paradigm
CN113296748B (zh) * 2020-02-21 2022-07-26 上海莉莉丝科技股份有限公司 数据对象与数据库的映射方法、系统、服务器及计算机可读存储介质
US11573775B2 (en) 2020-06-17 2023-02-07 Bank Of America Corporation Software code converter for resolving redundancy during code development
US11347500B2 (en) 2020-06-17 2022-05-31 Bank Of America Corporation Software code converter for resolving conflicts during code development
US11782685B2 (en) 2020-06-17 2023-10-10 Bank Of America Corporation Software code vectorization converter
CN113011978B (zh) * 2021-03-10 2023-05-26 河南大学 基于可认证数据结构的区块链语义分析的方法

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6574673B1 (en) * 1997-10-31 2003-06-03 Oracle Corporation Data type mapping for external callouts

Family Cites Families (26)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5339419A (en) * 1990-06-25 1994-08-16 Hewlett-Packard Company ANDF compiler using the HPcode-plus compiler intermediate language
US6067413A (en) * 1996-06-13 2000-05-23 Instantations, Inc. Data representation for mixed-language program development
US6378126B2 (en) * 1998-09-29 2002-04-23 International Business Machines Corporation Compilation of embedded language statements in a source code program
US6405368B1 (en) * 1999-04-16 2002-06-11 Brian Freyburger Method for separate compilation of templates
US6484313B1 (en) * 1999-06-30 2002-11-19 Microsoft Corporation Compiling and persisting of intermediate language code
US6836883B1 (en) * 2000-06-21 2004-12-28 Microsoft Corporation Method and system for compiling multiple languages
US6999956B2 (en) * 2000-11-16 2006-02-14 Ward Mullins Dynamic object-driven database manipulation and mapping system
US7152223B1 (en) * 2001-06-04 2006-12-19 Microsoft Corporation Methods and systems for compiling and interpreting one or more associations between declarations and implementations in a language neutral fashion
US6789254B2 (en) * 2001-06-21 2004-09-07 International Business Machines Corp. Java classes comprising an application program interface for platform integration derived from a common codebase
US7454746B2 (en) * 2001-07-24 2008-11-18 The Mathworks, Inc. Function call translation
US7228540B2 (en) * 2002-05-14 2007-06-05 Microsoft Corporation Preparation for software on demand system
US7441237B2 (en) * 2003-03-25 2008-10-21 Microsoft Corporation System and method for extending a compiler through a composer
US7219338B2 (en) * 2003-03-25 2007-05-15 Microsoft Corporation Multi-language compilation
US7681184B1 (en) * 2004-05-24 2010-03-16 Borland Software Corporation System and methodology for cross language type system compatibility
US7631011B2 (en) 2005-07-29 2009-12-08 Microsoft Corporation Code generation patterns
US7702686B2 (en) 2005-07-29 2010-04-20 Microsoft Corporation Retrieving and persisting objects from/to relational databases
US7743066B2 (en) 2005-07-29 2010-06-22 Microsoft Corporation Anonymous types for statically typed queries
US7409636B2 (en) 2005-07-29 2008-08-05 Microsoft Corporation Lightweight application program interface (API) for extensible markup language (XML)
US20070044083A1 (en) 2005-07-29 2007-02-22 Microsoft Corporation Lambda expressions
US7694274B2 (en) * 2005-07-29 2010-04-06 Microsoft Corporation Dynamically typed unsafe variance
US20070028222A1 (en) 2005-07-29 2007-02-01 Microsoft Corporation Free/outer variable capture
US7818719B2 (en) 2005-07-29 2010-10-19 Microsoft Corporation Extending expression-based syntax for creating object instances
US20070027905A1 (en) 2005-07-29 2007-02-01 Microsoft Corporation Intelligent SQL generation for persistent object retrieval
US20070027849A1 (en) 2005-07-29 2007-02-01 Microsoft Corporation Integrating query-related operators in a programming language
US7685567B2 (en) 2005-07-29 2010-03-23 Microsoft Corporation Architecture that extends types using extension methods
US7992140B2 (en) * 2005-07-29 2011-08-02 Microsoft Corporation Compiler supporting programs as data objects

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6574673B1 (en) * 1997-10-31 2003-06-03 Oracle Corporation Data type mapping for external callouts

Also Published As

Publication number Publication date
WO2007018771A2 (en) 2007-02-15
EP1913471A2 (en) 2008-04-23
WO2007018771A3 (en) 2007-06-07
JP2009503677A (ja) 2009-01-29
EP1913471A4 (en) 2009-05-13
US20070028223A1 (en) 2007-02-01
US7992140B2 (en) 2011-08-02
US8458678B2 (en) 2013-06-04
US20110246973A1 (en) 2011-10-06
CN101233488A (zh) 2008-07-30

Similar Documents

Publication Publication Date Title
CN101233488B (zh) 通过编译器来编译程序的方法和设备
JP4841118B2 (ja) ソフトウェア開発インフラストラクチャ
US6286134B1 (en) Instruction selection in a multi-platform environment
US7490320B2 (en) Method and apparatus for transforming Java Native Interface function calls into simpler operations during just-in-time compilation
US8527946B2 (en) Declarative object identity using relation types
EP1639461A2 (en) An extensible type system for representing and checking consistency of program components during the process of compilation
US7346901B2 (en) Efficient generic code in a dynamic execution environment
US7685581B2 (en) Type system for representing and checking consistency of heterogeneous program components during the process of compilation
Brachthäuser et al. Effect handlers for the masses
US7086044B2 (en) Method, article of manufacture and apparatus for performing automatic intermodule call linkage optimization
Svenningsson et al. Combining deep and shallow embedding of domain-specific languages
Fritzson et al. Towards Modelica 4 meta-programming and language modeling with MetaModelica 2.0
Doolin et al. JLAPACK–compiling LAPACK Fortran to Java
WO2007027366A1 (en) Nullable and late binding
Campbell et al. Introduction to compiler construction in a Java world
Sah et al. An introduction to the Rush language
EP1046985A2 (en) File portability techniques
Dijkstra et al. The structure of the essential haskell compiler, or coping with compiler complexity
Ægidius Mogensen Scopes, Functions, and Parameter Passing
McNeil et al. PL/I program efficiency
Solis Illustrated C# 2008
Zocca Staged compilation of tensor expressions
Šefl Translating Lambda Calculus into C++ Templates
Solis Illustrated C# 2005
Sampson et al. Generics in Small Doses: Nanopass Compilation with Haskell

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
ASS Succession or assignment of patent right

Owner name: MICROSOFT TECHNOLOGY LICENSING LLC

Free format text: FORMER OWNER: MICROSOFT CORP.

Effective date: 20150508

C41 Transfer of patent application or patent right or utility model
TR01 Transfer of patent right

Effective date of registration: 20150508

Address after: Washington State

Patentee after: Micro soft technique license Co., Ltd

Address before: Washington State

Patentee before: Microsoft Corp.