太阳城集团

  • / 24
  • 下载费用:30 金币  

扩展开发环境.pdf

摘要
申请专利号:

CN201380068712.0

申请日:

2013.12.27

公开号:

CN105164641A

公开日:

2015.12.16

当前法律状态:

授权

有效性:

有权

法律详情: 授权|||实质审查的生效IPC(主分类):G06F 9/45申请日:20131227|||公开
IPC分类号: G06F9/45 主分类号: G06F9/45
申请人: 微软技术许可有限责任公司
发明人: F·A·玛每瑞; M·C·范宁
地址: 美国华盛顿州
优先权: 13/732,073 2012.12.31 US
专利代理机构: 上海专利商标事务所有限公司31100 代理人: 顾嘉运
PDF完整版下载: PDF下载
法律状态
申请(专利)号:

CN201380068712.0

授权太阳城集团号:

||||||

法律状态太阳城集团日:

太阳城集团2019.03.08|||2016.01.13|||2015.12.16

法律状态类型:

授权|||实质审查的生效|||公开

摘要

本文描述了用于扩展软件开发工具的行为的概念和技术。软件开发工具可访问并消费扩展以将该软件开发工具配置成以扩展模式执行操作。在一个示例中,扩展可基于输入源代码来扩展编译器。在一个配置中,编译器扩展可以向编译器提供特定编程语言的各种源代码元素的一个或多个运行时语义。编译器可访问扩展列表以确定编译器是否将要以扩展模式对特定源代码元素或逻辑单元执行编译操作。

权利要求书

权利要求书
1.  一种用于执行源代码开发操作的方法,所述方法包括:
接收包括包含至少一个逻辑单元的源代码的输入文件;
接收对所述至少一个逻辑单元执行开发操作的指令;
响应于接收到对所述至少一个逻辑单元执行所述开发操作的指令,确定扩展是否将被消费以用于所述开发操作;以及
如果所述扩展将被消费以用于所述开发操作,则
检索所述扩展;
通过消费所述扩展来变为扩展模式;以及
以所述扩展模式对所述至少一个逻辑单元执行所述开发操作。

2.  如权利要求1所述的方法,其特征在于,所述开发操作是预处理、词法分析、句法分析、语义分析、指令调度、代码生成、链接、汇编、解释和JIT编译中的一个或多个。

3.  如权利要求1所述的方法,其特征在于,确定所述扩展是否将被消费以用于所述开发操作包括接收指定将在所述扩展模式中对其进行操作的一个或多个逻辑单元的扩展输入。

4.  如权利要求1所述的方法,其特征在于,确定所述扩展是否将被消费以用于所述开发操作包括以下动作中的一个或多个:
在扩展文件中检查所述扩展;
通过基于与输入相关联的名称或标识符计算扩展文件名来查找所述扩展;以及
检查与编译单元内联的元数据。

5.  一种计算机,包括:
处理器;以及
与所述处理器通信的计算机可读存储介质,所述计算机可读存储介质包括 其上存储的计算机可执行指令,所述计算机可执行指令在由所述处理器执行时使所述处理器:
接收包括将被编译的至少一个逻辑单元的输入文件;
接收对所述至少一个逻辑单元执行编译操作的指令;
响应于接收到执行所述编译操作的指令,确定是否将在所述至少一个逻辑单元将被编译时为所述至少一个逻辑单元执行扩展;以及
如果将为所述逻辑单元执行所述扩展,则
检索针对所述至少一个逻辑单元的扩展;以及
在对所述至少一个逻辑单元执行所述编译操作之前执行所述扩展;以及
使用所述扩展来对所述至少一个逻辑单元执行所述编译操作。

6.  如权利要求5所述的计算机,其特征在于,所述逻辑单元包括以下各项中的一个或多个:对函数的定义或使用、类、方法、变量、宏、作用域、模板、过程、闭包、类型、指示、源文件本身或库。

7.  如权利要求5所述的计算机,其特征在于,所述至少一个逻辑单元是针对库或系统的传统版本的源代码,而输出是能对所述库或所述系统的新版本进行操作的计算机程序。

8.  如权利要求5所述的计算机,其特征在于,所述用于确定是否将在所述至少一个逻辑单元将被编译时为所述至少一个逻辑单元执行所述扩展的计算机可执行指令包括在由所述处理器执行时使所述处理器执行以下操作的计算机可执行指令:接收指定将被扩展的一个或多个可扩展逻辑单元的扩展输入或者在扩展文件中检查针对所述至少一个逻辑单元的扩展。

9.  如权利要求5所述的计算机,其特征在于,针对所述至少一个逻辑单元的所述扩展包括迫使对逻辑单元的引用引用功能等同体。

10.  一种包括其上存储的计算机可执行指令的计算机可读存储介质,所 述计算机可执行指令在由计算机执行时使所述计算机:
接收将从第二编程语言编译成第一编程语言的输入文件,所述输入文件包括用所述第二编程语言的多个逻辑单元;
接收对所述输入文件中的所述多个逻辑单元执行代码生成的指令;
响应于执行代码生成的所述指令,分析所述多个逻辑单元中的第一逻辑单元;
确定扩展是否与所述多个逻辑单元中的所述第一逻辑单元相关联;
如果扩展与所述多个逻辑单元中的所述第一逻辑单元相关联,则
执行与所述第一逻辑单元相关联的所述扩展;
如果扩展不与所述多个逻辑单元中的所述第一逻辑单元相关联,则
访问库,
在不执行所述扩展的情况下将所述第一逻辑单元编译成经编译的第一逻辑单元,以及
将所述经编译的第一逻辑单元输出到用所述第一编程语言的输出文件。

说明书

说明书扩展开发环境
背景
为了开发用于执行计算任务的软件应用,软件开发者通常为软件应用编写概括该软件应用的功能的源代码。存在对开发者可用的各种类型的语言,这取决于软件应用的特定用途、其中将执行软件应用的计算环境和/或软件开发者的个人偏好。例如,语言可以是其中通常在编译时确定变量类型的静态类型化编程语言。在另一示例中,语言可以是在运行时确定变量类型的动态类型化编程语言。
一旦软件开发者编写源代码,如果其中将要执行源代码的环境需要可执行代码,则使用编译器来将源代码编译成可执行代码(或者取决于系统环境而能在执行时被解释)。编译器用于将源代码转换成可以直接在计算机系统上执行的机器代码。计算环境执行可执行代码以实现源代码的功能。连同将源代码编译成可执行代码,常规编译器还可通过输出调试太阳城集团来帮助软件开发者。软件开发者可使用调试太阳城集团来修复源代码中的潜在问题,当在运行时期间执行可执行代码时,这些潜在问题可能导致故障。
本文所做出的本公开正是太阳城集团这些和其他考虑事项而提出的。
概述
本文描述了用于扩展开发环境的概念和技术。开发工具可消费扩展以修改开发工具针对所描绘的源代码元素的行为。在一些实施例中,开发工具可消费扩展以便在各种过程中使用扩展行为,这些过程包括但不限于预处理、词法分析、句法分析、静态分析、指令调度、代码生成、链接、汇编、解释和JIT编译。例如,在扩展编译器的行为时,扩展可由编译器在包括但不限于句法分析、语义分析、代码生成和代码优化的编译过程的各个阶段期间消费。在一个配置中,当在编译器开发环境内使用时,编译器扩展可以向编译器提供特定编程语言的各种源代码元素的一个或多个运行时语义。在一些配置中,可以在诸如但 不限于静态分析器、解释器、编译器、链接器、汇编器和模拟器的各种编程操作中使用扩展。
应当理解,上述主题可被实现为计算机控制的装置、计算机进程、计算系统或诸如计算机可读存储介质等制品。通过阅读下面的详细描述并审阅相关联的附图,这些及各种其他特征将变得显而易见。
提供本概述是为了以精简的形式介绍将在以下详细描述中进一步描述的一些概念。本概述并不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在将本概述用来限制所要求保护的主题的范围。此外,所要求保护的主题不限于解决在本公开的任一部分中所提及的任何或所有缺点的实现。
附图简述
图1是可被用来实现本文公开的各实施例的说明性操作环境的系统图。
图2是执行可被用来实现本文公开的各实施例的编译器的说明性编译环境的系统图。
图3是示出根据一些实施例的其中根据扩展来处理源代码的逻辑单元的编译环境的功能框图。
图4是示出根据一些实施例的将传统源代码变换成用于经更新的操作环境的可执行代码的功能框图。
图5是示出根据一些实施例的用于扩展软件开发工具的示例性方法的框图。
图6是示出能够实现本文中所呈现的实施例的各方面的计算系统的说明性计算机硬件和软件体系结构的计算机体系结构图。
详细描述
以下详细描述涉及扩展软件开发工具的行为。在各配置中,向软件开发工具提供扩展。软件开发工具消费扩展。扩展将软件开发工具针对所描绘的操作的行为从默认模式改为扩展模式。在一些示例中,软件开发工具可出于各种原因在扩展模式中使用,这些原因的示例在下文中更详细地描述。
尽管在结合计算机系统上的操作系统和应用程序的执行而执行的程序模 块的一般上下文中提出了本文描述的主题,但是本领域技术人员将认识到,其他实现可以结合其他类型的程序模块来执行。一般而言,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、组件、数据结构和其他类型的结构。此外,本领域技术人员将明白,可以利用其他计算机系统配置来实施本文描述的主题,这些计算机系统配置包括手持式设备、多处理器系统、基于微处理器的或可编程消费电子产品、小型计算机、大型计算机等等。
在以下详细描述中,参考了构成详细描述的一部分并作为说明示出了各具体实施方式或示例的附图。现在参考附图(全部若干附图中相同的标号表示相同的元素),将提出用于扩展源代码开发环境的计算系统、计算机可读存储介质和计算机实现的方法以及其他方面。
现在参考图1,将描述用于文本呈现的各实施例的源代码开发环境100的各方面。图1所示的源代码开发环境100包括计算设备102。在一些实施例中,计算设备102可包括台式计算机、膝上型计算机、笔记本计算机、超便携计算机、上网本计算机或其它类型的计算设备。操作系统104在计算设备102上执行。操作系统104是用于控制计算设备102处的各种功能的可执行程序。
计算设备102可执行软件开发工具106。软件开发工具106可包括程序或工具,诸如但不限于静态分析器、解释器、编译器、链接器、汇编器和模拟器。软件开发工具106可接收包括编程语言中所表达的源代码的输入文件108。软件开发工具106可接收对输入文件108中的源代码执行各种开发操作的命令或指令。
应当明白,本文描述的概念和技术不限于任何特定类型的编程语言。例如,输入文件108中的源代码编程文件类型可使用静态类型化编程语言、动态类型化编程语言或其它类型来表达。静态类型化编程语言的示例包括但不限于C、Fortran、Java和Pascal。动态类型化编程语言的示例包括但不限于JavaScript、Perl、Lisp和VBScript。其他类型包括强和弱类型、安全和不安全类型、相交类型、联合类型、鸭子类型和依赖类型。应当明白,本文描述的概念和技术不限于任何特定类型。还应明白,本文描述的概念和技术不限于作为一种特定类型的编程语言,因为一些编程语言可用作或可被认为是各种类型。
在一些配置中,开发操作可以是不产生输出的对输入文件108中的源代码 的操作。在其他配置中,开发操作可生成在图1中被示为开发工具输出110的输出。例如,如果软件开发工具106是编译器且操作是代码生成,则开发工具输出110可包括可执行代码中所表达的一个或多个输出逻辑单元。如此处所使用的,“逻辑单元”包括一起形成逻辑结合整体的一组代码块或语句。逻辑单元可以是源代码元素或者可包括形成逻辑结合整体的一个或多个源代码元素。开发工具输出110还可包括但不限于可查看消息、查询、输入文件108的一个或多个分量的重写,等等。本文描述的概念和技术不限于任何特定输出。
在某些情况下,软件开发工具106可能不被配置成或不具有以下能力:理解软件开发工具106正对其执行开发操作的输入文件108中的源代码元素的行为。如此处所使用的,“源代码元素”包括但不限于对函数的定义或使用、类、方法、变量、宏、模板、过程、闭包、类型、源代码文件本身或所引用的库。可以存在软件开发工具106无法识别或理解源代码元素的行为的各种原因。
例如,如果源代码元素的行为将在运行时期间被决定,则软件开发工具106无法理解该元素的行为。逻辑单元可包括软件开发工具106未被配置来识别的函数。在其他情况下,软件开发工具106可被配置成对源代码元素执行不安全、过期或由于某种原因而不合需要的操作。在其他情况下,源代码元素或逻辑单元可包括妨碍软件开发工具106识别的误拼写。在编译器环境中的另一示例中,编译器无法在编译时理解各种函数的实际运行时语义。应明白,这些和其他示例仅仅是示例性的。本文描述的概念和技术不限于软件开发工具106的任何特定限制、故障或不合需要的行为。
为了修改软件开发工具106的行为,软件开发工具106可被配置成访问和消费扩展112,扩展112在执行各种开发操作时扩展(或修改)软件开发工具106的行为。在扩展模式中操作的软件开发工具106在图1中被示为软件开发工具(经扩展的)106A。如此处所使用的,“扩展”意指软件开发工具106消费扩展112以扩大、增加和/或更改源开发工具106的能力。通过扩展软件开发工具106的能力,软件开发工具106可被配置成(作为示例而非限制)执行它先前无法执行的操作。在其他配置中,软件开发工具106可被扩展为软件开发工具(经扩展的)106A,以便对源代码元素执行经修改的操作,而不是以非扩展模式执行默认操作。在一些示例中,软件开发工具106A可被扩展为软件 开发工具(经扩展的)106A,以便在以默认或非扩展模式执行操作之外还以扩展模式执行操作。例如,扩展模式可包括不在默认模式中执行的对源代码元素的附加操作。
图2是示出其中软件开发工具106是编译器206的编译环境200的功能框图。如上所述,本文描述的概念和技术不限于任何特定开发环境。本文所包含的各种说明和描述仅仅出于描述目的而使用编译器环境,且不表示将当前所公开的主题仅仅限于编译器环境的意图。为了执行编译操作,编译器206可以在其编程内具有执行编译操作所必需的组件。
在一些配置中,编译器206可包括内部库214,该内部库214在一些配置中可以是可由编译器206消费以执行各种编译操作的程序或可执行代码的集合。在一些配置中,编译器206可访问第三方库,诸如外部库216。在一些配置中,外部库216可以是未被包括在内部库214中的可由编译器206消费以执行各种编译操作的程序或可执行代码的集合(或编译器206的源代码)。如此处所使用的,“库”包括可由诸如编译器206等软件开发工具消费的二进制形式的代码。内部库214和外部库216在图1中仅仅出于说明目的而被示为单个库,并且不反映将本公开限于单个库的意图。内部库214或外部库216可包括可以从源程序消费的程序代码的函数、宏、类模板(取决于特定编译器和可执行代码)和其他单元。
如上所述,为了处置特定编译时操作,编译器206可在其代码内具有编程,可访问内部库214和/或可访问外部库216。例如,编译器206可接收对程序段(I)执行语义分析的指令:
inti;
printf(“%s\n”,i);(I)。
在一些配置中,编译器206可使用编译器206的各个组件来对程序段(I)执行语义分析。在其他配置中,编译器206可以在编译程序段(I)时访问内部库214或外部库216(或两者)。
尽管常规编译器可能能够对程序段(I)执行语义分析(或其他编译时操作),但在运行时期间可能由于各种编译时状况而出现错误。如果源代码元素的行为是在运行时期间用动态类型化编程语言来决定的,则在源代码的特性在 编译时期间未被静态描述的情况下可能出现错误。作为示例,以下JavaScript代码包括可由包括内部库214和/或外部库216在内的各种库提供的被称为“DefineNamespace”的函数:
DefineNamespace(‘Utilities.File’,{open:function(name){/*代码*/}});
varfile=Utilities.File.open(‘a.txt’);
名称“Utilities.File”通常直到运行时才被指定,此时执行DefineNamespace。上述对代码执行语义分析的编译器可能不知道该代码在运行时是否正确地执行。为了降低常规上通过编译时分析要求,但在运行时期间导致程序不正确地运行的函数引入错误的概率,编译器206可访问可以向该编译器206提供各种逻辑单元的运行时语义的扩展112A-112N,以使得编译器206能够在编译时期间理解逻辑单元(扩展112A-112N之后被统称为和/或通称为“扩展112”)。在各种配置中,向编译器206提供运行时语义可帮助编译器206确认与逻辑单元相关联的参数。
扩展112可由各种源创建和/或从各种源提供给编译器206。例如,扩展112可以是被提供给开发者的用于特定操作环境的软件开发套件的一部分。在另一示例中,扩展112可由一个或多个开发者生成以供其他开发者使用。在另一示例中,开发者可以在内部库214、外部库216或其他第三方库上创作扩展112。在另一示例中,扩展112可以是内部库214和/或外部库216的一部分。
编译器206可以在编译时期间消费扩展112以便对源代码元素和/或逻辑单元执行编译操作。在上述第一示例中,编译器206可被配置成检测“printf”函数是将根据扩展112来处理的函数。在该配置中,编译器206可消费扩展112以便以扩展模式执行编译操作,而不是消费内部库214中的可执行代码以便以默认或非扩展模式执行编译操作。在上述第二示例中,通过消费扩展112,编译器206可被配置成在运行时期间理解“DefineNamespace”函数行为并且在一个示例中通过创建合适对象来在编译时期间模仿(或模拟)该行为。
扩展112还可以向编译器206提供识别源代码中的特定错误的能力,这些特定错误可能在运行时期间导致错误或者可能妨碍编译操作完成。例如,如果开发者编写函数“DefineNamespace”的源代码但以错误方式编写该函数,则编译器206可消费扩展112以创建各种对象并确定该函数将在被执行时生成错 误。例如,开发者可编写其中单词“open”被误拼写为“oopen”的代码段:
DefineNamespace(‘Utilities.File’,{open:function(name){/*代码*/}});
varfile=Utilities.File.oopen(‘a.txt’).
编译器206可消费扩展112以便对上述代码段执行成功的语义分析。例如,编译器206可消费扩展112以便通过用静态地处理上述代码段的一个或多个结果填充符号表来以扩展模式执行操作。在创建静态处理的一个或多个结果后,编译器206可检测到第二行可由于“open”的误拼写而导致运行时错误。在该示例中,如果编译操作是代码生成操作,则编译器206可以在消费扩展112后以扩展模式行动并生成可操作的可执行代码。在不以扩展模式操作的情况下,编译器206可以在非扩展模式中使用默认行为来生成不可操作代码。一些其他示例在下文中提供。
传统上,静态分析已经与静态语言相关联。例如,考虑以下C代码:
longaNumber;
voidSomeFunction(inti){/*函数体*/}
voidSomeOtherFunction(){
XomeFunction();
aNumber="hello";
}
在以上示例中,编译器206可标记2个语义问题:名称“XomeFunction”不存在;以及aNumber被赋值“string”(在技术上是指向字符数组的指针)。常规C编译器能这样做的原因是因为C是静态语言。在静态语言中,所有语言构造的名称和类型在编译时期间都是已知的。甚至对于静态语言而言,特定检查通常直到运行时才能被执行-即使所有元素的名称和类型在编译时期间都是已知的。例如,考虑以下C函数:
date_tcreate_date(unsignedcharday,unsignedcharmonth,shortintyear){
/*实现*/
}
该函数被认为是静态的。该函数本身、所有其参数及其类型以及其返回类型在编译时期间全都是已知的。然而,特定种类的错误在运行时期间仍然可能 发生。考虑以上代码的消费者的以下示例:
date_tdate1=create_date(29,02,2012);/*有效日期,2012是闰年*/
date_tdate2=create_date(29,02,2010);/*无效日期,2010不是闰年*/
以上对create_date函数的两个调用被认为是有效的;该函数存在,自变量的数量是正确的,自变量的类型是正确的,所提供的值在针对类型的期望范围内,且消费者的期望返回类型匹配该函数所声明的一个返回类型。然而,这些日期中只有一个是有效的。构造date1将会工作,但date2不会。create_date函数针对date2的行为取决于如何实现该函数。例如,可能抛出运行时异常,可能返回表示错误的特殊实例date_t,和/或可能创建包含无效数据的有效实例date_t。
如上所示,甚至对静态语言而言,也存在传统上在运行时期间执行的特定种类的检查。测试软件可以是易出错且昂贵的。理想地,应在编译时或构建时期间捕捉到尽可能多的错误。如果create_date函数被构建在编译器中或者是该语言的标准库的一部分,则该编译器可执行检查以提出太阳城集团以上date2的错误。标准库是随编译器提供的预构建库的集合。因此,编译器可被编程为知道该标准库。
然而,如果以上create_date函数不是标准库的一部分,则编译器无法执行该函数专用的任何检查。如果开发团队想要执行该函数专用的检查,则必须出于这样的目的而编写或消费附加工具。这些工具可以对:源代码;目标代码;调试符号表;或者上述各项的组合进行操作。
这些工具可以是:独立库;为语义分析器(诸如FxCop、Lint等工具)编写的规则;其他;或上述各项的组合。但是,这些工具可具有若干缺陷。例如,它们可能需要被加入(即,开发者将需要为其代码库中的每一个编译位置打开工具/规则/等等)。由于这些工具不是编译器的一部分,因此它们丢失与该编译器的同步(例如,这些工具可能在新版本的编译器改变例如目标文件的布局的情况下中断)。在其他情况下,这些工具经常需要重复编译器中的功能(例如,解析、语义分析等)以提供有意义的分析。
为了扩展编译器206的行为和/或功能,可实现插件模型。在以上示例中,考虑create_date函数的导入声明被改变为看似以下:
extension("date.dll")
date_tcreate_date(unsignedcharday,unsignedcharmonth,shortintyear){
/*实现*/
}
在以上示例中,date.dll是包含对编译器的一个或多个插件(即,编译器扩展)的库。具体而言,它可包括将扩展编译器的语义分析的插件,如下:

通过运行与对create_date的调用的语义分析相关联的扩展112(即,插件),编译器206可执行原本在编译时期间是不可能的检查。
在一些配置中,对于语义分析阶段,这可具有胜于上述外部工具的以下优点。检查可以相对“廉价”-工具链接其他程序、构造模型等的成本被节省。检查可由编译器206执行-无需加入,它就在那儿,只要使用编译器206。不存在与编译器206重复的功能。并且,扩展112未丢失与编译器206的同步。
在以上示例中,C语言句法已经用可用于指定扩展112的关键字来扩充。替代实现包括但不限于:包含扩展的文件需要使用语言句法来显式声明;将源元素映射到扩展的外部文件;源代码中的格式化良好的评论(源代码注释);源属性;以及其他。其他示例包括但不限于:编译器可查找具有与包含引用的文件相同的文件前缀的DLL(例如,对于date.h、date.c或date.obj,编译器将查找date.dll);编译器可查找具有相同的基名的脚本(例如,date.lua或date.js);系统中注册的类型库(例如,COM),其中类型库被指定;系统中注册的类型库(例如,COM),其中类型库是隐式的;以及扩展可位于与引用(例如,date.h、date.c或date.obj)相同的单元中。应理解,本文描述的概念和技术不限于上述实现。
继续以上示例,到DLL的完整路径尚未被指定。替代实现包括但不限于:扩展112路径可以是显式的;扩展112路径可以是隐式的,其中编译器可搜索当前工作目录、源文件目录、预定义目录、预定义系统文件夹;扩展112路径可以是隐式的,且搜索路径由用户相对于命令行选项显式提供,命令行选项具有将按序搜索的目录的列表或者要搜索(例如,通过使用#pragma指示)的目录的源中列表;或者扩展112路径可以是系统中的全局设置,诸如系统注册表或环境变量。另一实现可以经由web服务跨网络动态地获取扩展112。这些概念和技术不限于在此明确描述的实现,因为可使用其他实现并且其他实现被认为在本公开的范围内。
在以上示例中,已经为扩展112提供具有二进制码的单独DLL。替代实现包括但不限于:可使用脚本语言(诸如JavaScript、Lua等);扩展112可以是编写为源程序的一部分的函数本身;或者扩展112可以是源程序中的评论。这些概念和技术不限于在此明确描述的实现,因为可使用其他实现并且其他实现被认为在本公开的范围内。
在以上示例中,扩展DLL中的入口点的名称尚未被提供。替代实现包括 但不限于:具有与引用构造相同的名称的函数,其中使用过载来消除针相同构造的不同扩展的歧义;具有与引用构造相同的名称的函数,其中使用相同的词缀来消除对相同构造的不同扩展的歧义;需要提供入口点的显式名称;扩展函数的v表中的偏移;或者导出函数的导出索引。这些概念和技术不限于在此明确描述的实现,因为可使用其他实现并且其他实现被认为在本公开的范围内。
在以上示例中,隐式名称匹配是区分大小写的。替代实现包括但不限于:大小写敏感;大小写不敏感;或者特定大写规则(例如,太阳城集团词缀等)。这些概念和技术不限于在此明确描述的实现,因为可使用其他实现并且其他实现被认为在本公开的范围内。
在以上示例中,已扩展编译器206行为以用于语义分析期间的函数调用。可以在语义分析期间扩展的替代源构造包括但不限于:对过载操作符的调用;函数引用;类型实例化;变量引用;变量赋值;或者指针解引用。这些概念和技术不限于在此明确描述的实现,因为可使用其他实现并且其他实现被认为在本公开的范围内。
以上示例提出太阳城集团被传递给函数的特定值的错误。对扩展112可用的其他动作包括但不限于:添加、修改或删除符号表中的符号;对输入文档的句法树进行操作;提出错误和警告;改变错误和警告的抑制状态;创建、修改和删除源元素,诸如类型、枚举、常量值、宏或命名空间;或者执行文件操作。这些概念和技术不限于在此明确描述的实现,因为可使用其他实现并且其他实现被认为在本公开的范围内。
以上示例示出了与库一起提供的扩展。这不是创作和分发扩展的唯一方式。创作和分发扩展的其他方式包括但不限于:与库本身一起分发的对库的扩展,诸如与编译器一起分发的标准库扩展;由与对标准库的扩展不同的厂商开发的扩展;或者由库的消费者开发的用于强制实施由团队架构师定义的特定用途或帮助迁移至库的新版本的扩展。
以上示例未示出对扩展的许可。一些许可可以包括但不限于:与库相同的许可;以使用扩展112的许可为条件的使用库的许可;开源许可;闭源但免费使用的许可;或者专用的付费许可。以上示例也未示出在扩展112未被找到或具有错误的情况下的编译器206行为。一些方法可以包括但不限于:提出错误; 提出警告;记录故障日志并继续;记录故障日志并中止;不做任何事并忽略故障;提供用于指定做什么的源中指示;或者提供用于指定做什么以及扩展声明的机制。
以上示例示出了静态语言的编译器可如何使用扩展。扩展也可用于动态语言。考虑以下JavaScript示例:
WinJS.Namespace.define("Utilities.File",{
open:function(name){
/*实现*/
}
});
varf=Utilities.File.open("foo.txt");
在以上示例中,对库函数(WinJS.Namespace.define)的调用将创建名称Utilities.File.open。在动态类型语言中,名称创建直到运行时才发生。静态地,以上示例不包含名称Utilities.File.open。Utilities.File仅仅是被传递至函数的字符串。传统上,由于用动态语言(诸如JavaScript)编写的程序能够在运行时期间创建和删除名称(如以上示例中),因此用于此类语言的静态分析器无法提出太阳城集团不存在的名称的问题。扩展可用于提高对动态程序的语义分析的质量。在以上示例中,扩展可被提供给WinJS.Namespace.define函数,该扩展执行以下步骤:检查第一参数;如果它不是字符串,则退出扩展;解析字符串参数;和/或在不存在必需符号的情况下创建所有必需符号。
通过对WinJS.Namespace.define的调用运行上述扩展112,静态分析器可具有将在运行时期间创建的名称的知识。上述语义分析器然后将能够标记违例。例如,考虑与先前程序类似但具有打字错误的以下程序:
WinJS.Namespace.define("Utilities.File",{
open:function(name){
/*实现*/
}
});
varf=Utilities.File.oopen("foo.txt");
语义分析器可被配置成标记打字错误,因为所请求的名称(“oopen”)无法在符号表中找到。编译器206可被触发以便在使用各种机制来编译输入文件108中的源代码时访问扩展112。例如,编译器206可被配置成在对输入文件108中的源代码的每一个逻辑单元执行编译操作时检查扩展112。在另一配置中,编译器206可被配置成基于包括指定要执行的逻辑单元的扩展输入的编译时指令集来访问扩展112。例如,编译器206可以在编译时被指示只用扩展112来处理所指定或预定的逻辑单元。将根据扩展112来处理的预定的逻辑单元或源代码元素可被存储编译器206可访问的列表中。应理解,其他逻辑单元或源代码元素可使用扩展112来处理。本文公开的概念和技术不限于任何特定元素或逻辑单元。
用于检索和消费扩展112的其他触发事件可包括但不限于:将扩展112与诸如‘foo’等任何标识符的出现相关联。例如,在常规JS运行时中,先前是合法的一些关键字可能不再合法(因为它们已被保留以供在该语言中使用)。本文描述的概念和技术可实现用于一致地重写这些标识符以使其与所保留的关键字一致/不再冲突的算法。另一触发事件可以是扩展112已经与对特定函数或例程的调用点相关联。在遇到致力于特定/唯一标识的符号(函数、属性、特定变量)的调用点时,调用扩展。扩展可能更改/重写或甚至移除调用点。或者,扩展可能仅仅检查调用点以创建自身可用于附加诊断/代码发出等的一些存储器内太阳城集团。命名空间构造示例落在该场景中。对于此,对在运行时产生存储器内类的API的调用点可能无法以任何方式修改。相反,可以为将在运行时产生的类型/成员创建符号,以使得对这些类型/成员的后续引用可以在代码中验证。
另一触发事件可以是将扩展112与特定类的构造相关联。例如,当出现任何‘newFoo()’时,调用扩展112。该实现还可用于顺便访问(dropin)替代类或者由于依赖于被禁止的类型的尝试而停止编译。其他触发事件可以是将扩展112与对特定库/二进制码/外部引用的引用相关联。例如,如果程序链接到不安全的库的已作废版本v1,则扩展112的各种配置可更改编译以迫使该程序链接到经更新/更安全的版本。在一个示例中,用于逻辑单元的扩展112可迫使对逻辑单元的引用引用功能等同体。又一触发事件可以是将扩展112与抽象句法树节点种类相关联。附加配置可以是将扩展112与词法令牌种类相关联。
编译器206还可被配置成检索和消费针对未被显式指定而是被隐式指定的源代码元素或逻辑单元。例如,编译器206可被配置成消费针对具有与源代码中的其他逻辑单元或源代码元素相同的名称的逻辑单元或源代码元素的扩展112。在另一示例中,编译器206可被配置成消费针对具有相同拼写但不管任何大写差异的逻辑单元或源代码元素的扩展112。在另一示例中,可提供针对具有常见的误拼写名称的逻辑单元或源代码元素的扩展112。在该示例中,编译器206可被配置成消费对应于误拼写的逻辑单元或源代码元素的扩展112。扩展112可被配置成纠正误拼写。在另一配置中,扩展112可以与实现特定接口的每一类型相关联。在另一配置中,扩展112可以与扩展那特定基类型的所有类型相关联。
图3是示出其中根据扩展112来处理源代码的逻辑单元的编译环境300的框图。在图3中,编译器206可访问内部库214、外部库216和扩展112。输入文件108A包括具有逻辑单元302A-302C的源代码。输入文件108B包括具有逻辑单元302D-302N(之后统称为和/或通称为“逻辑单元302”)的源代码。应理解,本文描述的概念和技术不限于任何输入文件108配置,因为各种配置可包括一个输入,而其他配置可包括多个输入文件,诸如输入文件108A和输入文件108B。
编译器206可被配置成确定编译器206是否将在扩展模式中对逻辑单元302中的特定逻辑单元进行操作。应理解,编译器206可被配置成使用诸如本文描述的那些触发机制之类的各种触发机制来检查扩展。例如,编译器206可通过以下操作来确定扩展112是否将被消费以用于开发操作:在扩展文件中检查扩展,通过基于与输入相关联的名称或标识符计算扩展文件名来查找扩展,检查与编译单元内联的元数据,查找具有与包含引用的文件相同的文件前缀的DLL,以及查找具有相同的基名的脚本。编译器206可接收对输入文件108A和输入文件108B执行编译操作的指令。响应于接收到该指令,编译器206可以对逻辑单元302执行编译操作。
在一个配置中,编译器206可以对逻辑单元302执行编译操作以便在开发工具输出110中创建可执行代码(代码生成),这些可执行代码在图3中被示为逻辑单元304A-304N(之后被统称为和/或通称为“逻辑单元304”)。应理 解,开发工具输出110中的逻辑单元304可包括不直接以1:1关系对应于输入文件中的逻辑单元302的逻辑单元。例如,在代码生成编译操作期间,逻辑单元304可以从一个或多个逻辑单元302中生成或者可由编译器206生成为与逻辑单元302中的任何特定逻辑单元都无关的逻辑单元。
编译器206可被配置成检测到将通过消费扩展112来编译逻辑单元302D。如上所述,扩展112可以在诸如但不限于句法分析、语义分析、优化和代码生成等各种编译操作期间消费。在图3所示的配置中,编译器206可开始对逻辑单元302D的代码生成操作。编译器206消费扩展112中的扩展(代码生成)112A以便以扩展模式对逻辑单元302D执行代码生成操作。编译器206可生成被示为开发工具输出110的逻辑单元304中的逻辑单元(经扩展的)204D的输出逻辑单元。应理解,为逻辑单元(经扩展的)304B指定“扩展”意味着该逻辑单元已经在编译器206消费扩展(代码生成)112A之后使用扩展编译器模式来生成。
如果执行另一编译器操作,则编译器206可被配置成基于该操作来使用其他扩展。例如,扩展(语义)112B可由编译器206在对逻辑单元302D的语义分析操作期间消费。在另一示例中,扩展(优化)112C可由编译器206在对逻辑单元302D的优化操作期间消费。在另一示例中,扩展(句法)112D可由编译器206在对逻辑单元302D的句法分析操作期间消费。
应理解,本文描述的概念和技术不限于编译器206的任何特定操作。还应理解,不一定消费针对源代码文件中的所有逻辑单元或源代码元素的扩展。例如,扩展可能由编译器206针对诸如逻辑单元302D等源代码元素消费以用于特定编译操作,且不在其他编译操作中消费。此外,如上所述,应理解,编译器206可被配置成消费针对除了函数之外的源代码元素或逻辑单元的扩展。作为示例而非限制,编译器206可被配置成消费针对函数、类、方法或变量或其他元素的扩展。本文公开的概念和技术不限于任何特定逻辑单元或源代码元素的扩展的执行。
本文描述的概念和技术的各实施例可给予开发者太阳城集团编写源代码的一定程度的灵活性。一些示例在上文中描述。本文描述的概念和技术的实现的附加示例是将传统编程语言(或传统版本)变换成编程语言的经更新版本、不同的 编程语言或已消费库的经更新版本。如此处所使用的,“传统”意指已经被另一源代码或编程语言替代的源代码或编程语言。例如,传统源代码可以是早于源代码的当前使用版本的源代码版本。在另一示例中,传统源代码可以是用早于当前使用的编程语言的编程语言的源代码。在另一示例中,输入可以是针对库或系统的传统版本的源代码,而输出可以是可以对库或系统的新版本进行操作的计算机程序。
图4是示出使用本文描述的各种概念和技术来将传统代码变换成供在经更新系统中使用的代码的功能框图。传统代码输入文件108包括传统代码输入文件108中所包括的逻辑单元402A-402N(之后统称为和/或通称为“逻辑单元402”)。逻辑单元402形成传统程序的源代码的至少一部分。如果开发者希望在诸如新环境之类的经更新系统中使用逻辑单元402,则开发者可能被要求修改传统单元402的各部分以使得传统单元402可以在新环境中执行。
在图4所示的配置中,如果编译器206在代码生成操作期间使用外部库216,则在该代码生成操作完成时生成的逻辑单元在新环境中可能不正确地或不按所需要的那样运行。这可能出于各种原因而发生。例如,逻辑单元402可包括不在执行开发工具输出110中的可包括传统代码的可执行代码的环境中使用的逻辑单元。在另一示例中,逻辑单元402可包括具有在执行开发工具输出110的环境中不再使用的变量的函数。
为了向开发者提供在编译器206编译逻辑单元402时更新逻辑单元402的能力,扩展112可包括扩展(传统)112E。扩展(传统)112E可由编译器206消费以扩展编译器206的行为。在一个配置中,扩展(传统)112E可由编译器206在生成用编程语言的第一版本编写的代码的代码生成操作期间消费以兼容该编程语言的第二版本。例如,传统扩展112E可由编译器206消费以为逻辑单元404A-404N(之后统称为和/或通称为“逻辑单元404”)中的逻辑单元(经扩展的逻辑单元404B)生成可包括与新环境兼容的源代码逻辑单元的可执行代码。应理解,对于扩展(传统)112E相关联的术语“传统”的使用在该配置中意味着该扩展时是与库、源代码元素、环境等的传统版本相关联的活动(或当前使用的)扩展。
现在转向图5,提供了根据说明性实施例的扩展软件开发工具106的各方 面。应该理解,不一定按任何特定次序来呈现此处公开的方法的操作,并且用替换次序来执行部分或全部操作是可能的且可构想的。为了易于描述和说明,按所示次序来呈现各操作。可以添加、省略和/或同时执行操作,而不脱离所附权利要求书的范围。
还应当理解,所示方法可在任何太阳城集团结束且不必完整地执行。所述方法的部分或全部操作和/或基本上等价的操作可以通过执行计算机存储介质上所包括的计算机可读指令来执行,如本文所定义的。如在说明书和权利要求书中使用的术语“计算机可读指令”及其变型,在本文是用来广泛地包括例程、应用、应用模块、程序模块、程序、组件、数据结构、算法等等。计算机可读指令可以在各种系统配置上实现,包括单处理器或多处理器系统、小型计算机、大型计算机、个人计算机、手持式计算设备、基于微处理器的可编程消费电子产品、其组合等等。
因此,应该理解,本文所述的逻辑操作被实现为:(1)一系列计算机实现的动作或运行于计算系统上的程序模块;和/或(2)计算系统内的互连的机器逻辑电路或电路模块。该实现是取决于计算系统的性能及其他要求的选择问题。因此,此处描述的逻辑操作被不同地称为状态、操作、结构设备、动作或模块。这些操作、结构设备、动作和模块可以用软件、固件、专用数字逻辑及其任何组合来实现。各方法的操作在下文中被描述为至少部分地由软件开发工具106、编译器206、内部库214、外部库216、扩展112或其组合来实现。
转向图5,方法500开始于操作502并继续至操作504,其中软件开发工具106接收执行开发操作的指令。如上所述,开发操作可包括但不限于预处理、词法分析、句法分析、静态分析、指令调度、代码生成、链接、汇编、解释、模拟和JIT编译。
从操作504,方法500继续至操作506,其中软件开发工具106确定扩展112是否对该操作可用。如上所述,该操作可以是对各种源代码元素或逻辑单元的各种操作。例如,软件开发工具106可接收为特定逻辑单元生成代码的指令。软件开发工具106可确定扩展是否可用于为该特定逻辑单元生成代码。如果没有扩展对该操作可用,则方法500继续至操作508,其中软件开发工具106以默认(或非扩展)模式执行该操作。方法500然后在操作510处结束。
如果扩展对该操作可用,则方法500继续至操作512,其中软件开发工具106访问扩展112。软件开发工具106可以从各种源访问扩展112。例如,扩展112可以是包括由第三方开发者提供的可执行代码的单独文件。在另一示例中,扩展112可被加载到软件开发工具106的内部库214中。
从操作512,方法500继续至操作514,其中软件开发工具106消费扩展112。通过消费扩展,软件开发工具106被配置成以扩展模式而非默认或任何其他模式执行操作。应理解,扩展112不限于对源代码元素或逻辑单元执行的操作。例如,扩展112可将软件开发工具106配置成对外部库216、内部库214或软件开发工具106执行操作。本文描述的概念和技术不限于对输入文件的操作。
从操作514,方法500继续至操作516,其中软件开发工具106以扩展模式执行操作。软件开发工具(经扩展的)106A的扩展模式可取决于软件开发工具106的特定配置来启动或撤消。例如,开发者可能想要软件开发工具106在一个太阳城集团段期间以默认模式操作,而在其他太阳城集团段中以扩展模式(106A)操作。例如,系统可能在程序调用特定应用编程接口时经历安全问题。扩展112可以变得可供软件开发工具106消费以使得软件开发工具106生成导致该程序调用安全API的代码。当安全问题结束时,软件开发工具106可被重新编程为生成必要的代码。由此,在该示例中,扩展112是临时的。方法500然后在操作510处结束。
图6示出了能够执行本文描述的软件组件以提供本文描述的概念和技术的设备的说明性计算机体系结构600。由此,图6所示的计算机体系结构600示出服务器计算机、移动电话、PDA、智能电话、台式计算机、上网本计算机、平板计算机、和/或膝上型计算机的体系结构。计算机体系结构600可用于执行本文所呈现的软件组件的任何方面。
图6所示的计算机体系结构600包括中央处理单元602(“CPU”)、包括随机存取存储器606(“RAM”)和只读存储器(“ROM”)608在内的系统存储器604、以及将存储器604耦合至CPU602的系统总线610。基本输入/输出系统被存储在ROM608中,该系统包含帮助诸如在启动期间在计算机体系结构600中的元件之间传输太阳城集团的基本例程。计算机体系结构600还包括用于存储 来自图1的操作系统104以及一个或多个应用程序或文件的大容量存储设备612,这些应用程序或文件包括但不限于软件开发工具106、内部库214和扩展112。
大容量存储设备612通过连接至总线610的大容量存储控制器(未示出)连接至CPU602。大容量存储设备612及其相关联的计算机可读介质为计算机体系结构600提供非易失性存储。虽然对此处包含的计算机可读介质的描述引用了诸如硬盘或CD-ROM驱动器之类的大容量存储设备,但是本领域的技术人员应该明白,计算机可读介质可以是可由计算机体系结构600访问的任何可用计算机存储介质或通信介质。
通信介质包括诸如载波或其它传输机制等已调制数据信号中的计算机可读指令、数据结构、程序模块或其它数据,且包含任何传递介质。术语“已调制数据信号”指的是其一个或多个特征以在信号中编码太阳城集团的方式被更改或设定的信号。作为示例而非限制,通信介质包括诸如有线网络或直接线连接之类的有线介质,以及诸如声学、RF、红外及其他无线介质之类的无线介质。上述的任意组合也应包括在计算机可读介质的范围之内。
作为示例而非限制,计算机存储介质可包括以用于存储诸如计算机可读指令、数据结构、程序模块或其它数据等太阳城集团的任何方法或技术实现的易失性和非易失性、可移动和不可移动介质。例如,计算机介质包括但不限于,RAM、ROM、EPROM、EEPROM、闪存或其他固态存储器技术、CD-ROM、数字多功能盘(“DVD”)、HD-DVD、蓝光(BLU-RAY)或其他光学存储、磁带盒、磁带、磁盘存储或其他磁性存储设备、或能用于存储所需太阳城集团且可以由计算机体系结构600访问的任何其他介质。为了声明的目的,短语“计算机存储介质”及其变型不包括波或信号本身和/或通信介质。
根据各实施例,计算机体系结构600可以使用通过诸如网络620之类的网络到远程计算机的逻辑连接来在联网环境中操作。计算机体系结构600可以通过连接至总线610的网络接口单元616来连接到网络620。应当理解,网络接口单元616还可以被用来连接到其他类型的网络和远程计算机系统。计算机体系结构600也可包括输入/输出控制器618,该输入/输出控制器618用于接收和处理来自多个其他设备(包括键盘、鼠标或电子指示笔)的输入。类似地, 输入/输出控制器618可以向显示屏、打印机或其他类型的输出设备提供输出。
应当理解,本文所描述的软件组件在被加载到CPU602中并被执行时可以将CPU602和总体计算机体系结构600从通用计算系统变换成为被定制为促进本文提出的功能的专用计算系统。CPU602可以用任意数量的晶体管或其他分立的电路元件(它们可以分别地或共同地呈现任意数量的状态)构建。更具体而言,CPU602可以响应于包含在本文所公开的软件模块中的可执行指令而作为有限状态机来操作。这些计算机可执行指令可以通过指定CPU602如何在各状态之间转换来变换CPU602,由此变换了构成CPU602的晶体管或其它分立硬件元件。
对本文所提出的软件模块的编码也可变换本文所提出的计算机可读介质的物理结构。在本说明书的不同实现中,物理结构的具体变换可取决于各种因素。这样的因素的示例可以包括,但不仅限于:用于实现计算机可读介质的技术、计算机可读介质被表征为主存储器还是辅存储器等等。例如,如果计算机可读介质被实现为基于半导体的存储器,则本文所公开的软件可以通过变换半导体存储器的物理状态而在计算机可读介质上编码。例如,软件可以变换构成半导体存储器的晶体管、电容器或其它分立电路元件的状态。软件还可变换这些组件的物理状态以在其上存储数据。
作为另一示例,本文所公开的计算机可读介质可以使用磁或光技术来实现。在这些实现中,本文所提出的软件可以在磁或光介质中编码了软件时变换所述磁或光介质的物理状态。这些变换可以包括改变给定磁性介质内的特定位置的磁性。这些变换还可以包括改变给定光学介质内的特定位置的物理特征或特性,以改变这些位置的光学特性。在没有偏离本说明书的范围和精神的情况下,物理介质的其他变换也是可以的,前面提供的示例只是为了便于此描述。
鉴于以上内容,应当理解,在计算机体系结构600中发生许多类型的物理变换以便存储并执行本文所提出的软件组件。还应当理解,计算机体系结构600可以包括其它类型的计算设备,包括:手持式计算机、嵌入式计算机系统、个人数字助理、以及本领域技术人员已知的其它类型的计算设备。还可以构想的是,计算机体系结构600可以不包括图6所示的全部组件,可以包括未在图6中明确示出的其它组件,或者可利用以某种方式不同于图6所示的体系结构。
基于上述内容,应当意识到,本文已经公开了用于扩展软件开发工具的行为的概念和技术。虽然用计算机结构特征、方法和变换动作、特定计算机器、以及计算机可读介质专用的语言描述了本文中所描述的主题,但是应当理解,所附权利要求书中所定义的本发明不必限于本文中所描述的具体特征、动作、或介质。相反,这些具体特征、动作以及介质是作为实现权利要求的示例形式而公开的。
以上所述的主题仅作为说明提供,并且不应被解释为限制。可对本文中所描述的主题作出各种修改和改变,而不必遵循示出和描述的示例实施例和应用且不背离所附权利要求书中所阐述的本发明的真正精神和范围。

关 键 词:
扩展 开发 环境
  专利查询网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
太阳城集团本文
本文标题:扩展开发环境.pdf
链接地址:http://zh228.com/p-6409614.html
太阳城集团我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服客服 - 联系我们

copyright@ 2017-2018 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备17046363号-1 
 


收起
展开
葡京赌场|welcome document.write ('');