用于类型化程序设计语言的名称绑定可扩展性的制作方法

文档序号:6424077阅读:83来源:国知局
专利名称:用于类型化程序设计语言的名称绑定可扩展性的制作方法
技术领域
本发明涉及计算机程序设计,尤其涉及用于类型化程序设计语言的名称绑定可扩展性。
背景技术
很多静态类型化语言的特点是提供数据的静态类型安全和动态性质之间的矛盾。 为了解决这一问题已经进行了很多尝试,其中代码生成器(设计时间和运行时)是最常见的方式。但是,代码生成器唯一的问题是需要外部工具运行来更新工件以便用户的集成开发环境(IDE)体验变为“当前的”。一般的问题是目前的很多编译器和语言定义不允许内部编译器流水线的用户化,这迫使代码生成器成为替代方案。

发明内容
以下提出简单的发明内容以便提供对此处描述的一些新颖的实施例的基本理解。 本发明内容不是大量的概述,并且不旨在标识关键/决定性的元素或描绘其范围。其唯一目的是以简化形式呈现某些概念作为之后呈现的更详细描述的序言。所公开的体系结构提供了插入(plug into)编译器(例如F#)和相关联的语言服务的方式。所述语言组件定义了允许任何组件连接入服务并且提供名称绑定和类型解析服务的标准插件(Plug-in)机制。所述编译器和语言服务利用了被定义为(例如以为了插入系统而必须实现的接口和类的形式)提供编译时间和设计时间扩展的协议。所述体系结构提供了定义用户化协议以与编译器的名称绑定机制交互的能力。这一协议的使用不仅使得编译成功,并且还提供诸如针对快速信息的名称查找和值查找这样的丰富的IDE服务。此外,还支持提供静态类型信息以满足类型化程序设计语言的需求的能力。为了实现前述和相关目的,此处结合以下描述和附图描述了某些说明性的方面。 这些方面仅指示可实现此处公开的原理的各种方式,且所有方面及其等价物均旨在包括在所要求保护的主题的范围内。当结合附图考虑以下详细描述时,其它优点和新颖的特征将是显而易见的。


图1示出依照所公开的体系结构,用于与内部编译流水线接口的系统。图2示出依照所公开的体系结构,与内部编译流水线交互的计算机实现的方法。图3示出图2中方法的进一步的方面。图4示出与内部编译流水线交互的另一种方法。图5示出图4中方法的进一步的方面。图6示出依照所公开的体系结构,执行用于与各种类型的编译流水线交互的可扩展接口的计算系统的框图。
具体实施例方式一般来说,编译器(编译组件)在编译流水线中具有三个不同的阶段(即过程) 语法分析(包括扫描和解析)、语义分析(包括程序验证、类型检查等)、以及代码生成。所述扫描和解析阶段指的是前端过程,而所述代码生成指的是后端过程。前端确定了程序的语法结构并且将该结构转化为存储器中的语法树。然后前端执行将语法树转化为注解的语义树以及将该注解的语义树转化为可执行程序(例如.exe文件、.dll文件等)的语义分析阶段。所述代码生成可以与目标程序(例如.NET构架、文字处理器、电子制表软件等)紧
也袖口。扫描器为解析器的输入标记化传入的程序设计语言文本,并且消除诸如注释的未定义语法。解析器保证源程序与语言定义的一致性,处理错误处理,创建程序语法的存储器中表示供代码生成器消耗,以及确定要使用的运行时间类型。在所公开的体系结构中,诸如在执行名称绑定的语义分析期间,提供允许用户访问一个或多个流水线服务的可扩展接口(插件)。在该过程的第一阶段,插入伪类型。编译器从可扩展接口使用的扩展处接收生成的伪类型。然后像任何其它类型(例如从诸如汇编语言或用户代码的具体的源)流经编译器一样,该生成的伪类型流经类型检查过程。由于伪类型不是真实的类型,体系结构清理在伪类型处理中留下的过程残余。例如,消除留在正在生成的程序中的调用和实例。可扩展接口的另一部分是向编译器内回调并且确定哪些通过扩展在编译器中结束的伪类型应该变成真实的类型。此外,对要被扩展创建的真实方法和代码替代的伪方法或其它代码作出请求。然后在编译过程中的合适阶段插入这些替代,并且编译器通过生成程序而结束。换句话说,可扩展协议一般是为了通过可扩展接口引入伪类型,使编译器执行其工作,并且接着消除在编译器结构中由伪类型剩下的残余。现在将参考附图,其中使用相同的标号来在全文中指示相同的元素。在以下描述中,出于解释的目的,阐明了众多具体细节以便提供对其彻底的理解。但是显然,所述新颖的实施例能够在没有这些具体细节的情况下实现。在其它情况中,用框图形式示出了熟知的结构和设备以便于帮助对其的描述。目的旨在涵盖落在所要求保护的主题的精神和范围之内的所有修改、等价物、以及替代物。图1示出依照所公开的体系结构,用于与内部编译流水线接口的系统100。系统 100包括类型化程序设计语言的编译组件102,该类型化的程序设计语言具有包括名称绑定服务108在内的服务106的内部编译流水线104 ;以及通过语言扩展112便于访问名称绑定服务108以在编译时间与类型交互的可扩展接口组件110。接口组件110和扩展组件112可以被使用作编辑器114的插件以作为集成开发环境(IDE)的一部分。编辑器114被设计为编辑诸如计算机程序等的源代码。编辑器114可以是单独的程序或被建立在IDE中。系统100还能够使用语言服务116。编辑器114 一般包括被设计为简化和加速源代码输入的特征。这些特征包括,但不局限于,语法强调、自动完成、括号匹配、参数帮助、函数列表、工具提示等。编辑器114还能够在程序员键入时执行语法检查,立即检测和向用户通知语法问题。在语言服务116的支持下,编辑器114还能够担当查找工具。例如,在一些已知的编辑器中,程序员可以键入函数名,并且响应于“,”(逗号)的输入,为该函数显示一列参数。但是应当理解,这一特征由语言服务提供,该语言服务与编译器一起紧密地工作以提供这一信息。这一可用于成员、参数、函数、和其它程序元素的特征一般仅可用于静态类型化的程序元素。依照所公开的体系结构的各方面,这一查找特征还可用于在外部数据源中存储的信息。可扩展接口组件110在编译流水线104中启用伪类型的静态绑定。可扩展接口组件110还能够编译运行时间中的某(些)点用真实类型取代伪类型。可以通过接口组件 110将这个(这些)点变成可访问的,这可以被公开或被变成公开可见的以便于用户插入扩展点以通过受控的方式扩展编译器。编译器扩展可以被集成在整个流水线的各个地方,并且还可以影响由扩展的编译组件102生成的可执行应用程序的运行时间行为。外部数据源可以是任何类型的静态或动态数据源。例如,外部数据源可以是包含有关具体域的数据的电子表格文件、包含有关具体域的数据的XML文件、SOL数据库的实例、web服务、或任何动态或静态外部文件。扩展点向编译组件102提供信息。通过读取这些外部数据源提取该信息。编译组件102和语言服务116接收由扩展点提供的信息,并且通过这一信息,编译组件102和语言服务116可以为用户提供丰富的IDE体验,该IDE体验等同于在编程时为防止静态类型而接收的IED体验。编译组件102可以是任何静态类型化的编译器,包括,但不局限于,F#和/或C#编译器。可扩展接口组件110还能够消除在运行时间中伪类型残余,其中该伪类型残余例如在伪类型的类型检查期间被创建。可扩展接口组件110进一步使语言服务116与编译时间扩展和设计时间扩展接触。编译组件102的操作不妨碍与可扩展接口组件110的合作。 可扩展接口组件110还能够通过语言扩展112进行名称查找,以及能够通过语言扩展112 进行值查找。语言扩展112还提供适用于类型化的程序设计语言的静态类型信息。更具体地,与可扩展接口组件102相关联的协议被定义为考虑到插件(可扩展接口组件110)以抽象值和类型。该插件然后被用于实现能够在名称绑定阶段期间为编译器 (编译组件10 解析类型和值的解析器方法。该类型和值被返回到编译器,编译器然后将这些类型和值映射到内部编译器数据结构,从而允许剩余的编译阶段正常执行。该协议还允许用户进行部分名称查找以提供全保真度的IDE体验。该协议定义了插件上的用于调用特定方法、性质、或获取值的方法。当用户已经嵌入通过主机解析的代码时,编译器释放出调用插件运行时间帮助器的代码以通过性质、方法或值检索出特定值。该插件负责实现这一操作,并且解析这一值。例如,与电子数据表相关的插件解析电子数据表DOM (文件对象模型),与XML (可扩展标记语言)相关的插件可以通过读取和解析XML来解析等。换句话说,由于此处公开的体系结构是通用的并且允许实现针对任何域的具体数据的插件,因此任何第三方可以提供插件以扩展编译器。此处包括了一组代表用于执行所公开的体系结构的新颖方面的示例性方法的流程图。为了解释简明的目的,尽管此处所示的一种或多种方法例如通过流程图的形式被显示和表述为一系列的动作,但是应当理解到所述方法不受到动作的顺序的限制,因为某些动作可以相应地以不同的顺序出现和/或与此处显示和描述的动作中的其它动作一起同时出现。例如,那些本领域的技术人员应当理解到方法可以替代地表示为诸如状态图的一系列互相关联的状态或事件。此外,新颖的实现并不需要方法所示的所有动作。
图2示出依照所公开的体系结构,与内部编译流水线交互的计算机实现的方法。 在200处,接收具有服务的内部编译流水线的类型化程序设计语言的编译组件。在202处, 通过可扩展接口提供内部编译流水线的接口。在204处,通过可扩展接口访问内部编译流水线的名称绑定服务。在206处,在编译时间通过名称绑定服务与类型交互。图3示出图2中方法的进一步的方面。在300处,通过可扩展接口为内部编译流水线的类型检查过程插入伪类型。在302处,伪类型在编译时间中交互时由真实类型取代。 在304处,实现在内部流水线的名称绑定阶段期间解析类型和值的解析器组件。在306处, 该类型和值被映射到内部编译数据结构以允许编译过程执行。在308处,通过可扩展接口启用部分的名称查找。图4示出与内部编译流水线交互的另一种方法。在400处,接收具有服务的内部编译流水线的类型化程序设计语言的编译组件。在402处,通过可扩展接口提供内部编译流水线的接口。在404处,通过可扩展接口访问内部编译流水线的名称绑定服务。在406 处,通过可扩展接口将伪类型和值插入编译流水线。在408处,伪类型在编译时间由真实类型取代。图5示出图4中方法的进一步的方面。在500处,在可扩展接口中实现在内部流水线的名称绑定阶段期间解析类型和值的解析器组件。在502处,该类型和值被映射到内部编译数据结构以允许编译过程执行。在504处,通过可扩展接口启用部分的名称查找和值查找。在506处,通过可扩展接口定义调用具体方法、性质中的至少一个或获取值的方法。如在本申请中所使用的,术语“组件”和“系统”旨在表示计算机相关的实体,其可以是硬件、软件和实体硬件的组合、软件、或者执行中的软件。例如,组件可以是,但不限于是,诸如处理器、芯片存储器、大容量存储器设备(例如光盘驱动器、固态驱动器、和/或磁性存储介质驱动器)、和计算机的实体组件,以及诸如在处理器上运行的进程、对象、可执行码、模块、执行的线程、和/或程序的软件组件。作为说明,运行在服务器上的应用程序和服务器都可以是组件。一个或多个组件可以驻留在进程和/或执行的线程中,并且组件可以位于一个计算机内和/或分布在两个或更多的计算机之间。在此使用词语“示例性”意指用作示例、实例或说明。在此被描述为“示例性”的任何方面或设计并不一定被解释为比其他方面或设计更好或有利。现在参考图6,图6示出依照所公开的体系结构,执行用于与各种类型编译流水线交互的可扩展接口的计算系统600的框图。为了为相应各方面提供额外的上下文,图6以及以下描述旨在提供各方面可实现的合适计算系统600的简要、一般表述。尽管以上描述是在可以在一个或多个计算机上运行的计算机可执行指令的一般上下文中,但是那些本领域的技术人员应当认识到还可以以其他程序模块的组合和/或作为硬件和软件的组合实现新颖的实施例。用于实现各方面的计算系统600包括具有处理单元604、诸如系统存储器606的计算机可读存储、以及系统总线608的计算机602。处理单元604可以是诸如单处理器、多处理器、单核单元、和多核单元等的各商用处理器中的任何一个。此外,那些本领域的技术人员应当理解到可以和其它计算机系统配置一起实现所述新颖的方法,该计算机系统配置包括微型计算机、大型计算机、以及个人计算机(例如台式计算机、膝上型计算机等)、手提式计算设备、基于微处理器的或可编程的用户电子设备等,其中每一个都可以在操作上和一个或多个相关设备耦合。系统存储器606可以包括诸如易失性的(VOL)存储器610 (例如随机存取存储器 (RAM))和非易失性的存储器(NON-VOL)612(例如R0M、EPR0M、EEPR0M等)的计算机可读存储(物理存储介质)。基本的输入/输出系统¢10 可以被存储在非易失性的存储器612 中,并且包括诸如在启动期间便于计算机602中组件之间的数据和信号通信的基本例程。 易失性的存储器610还可以包括用于高速缓存数据的诸如静态RAM的高速RAM。系统总线608为系统组件提供接口,该系统组件包括,但不局限于,系统存储器 606到处理单元604。系统总线608可以是能够进一步互联到存储总线(具有或没有存储控制器)以及外围总线(例如PCI、PCIe、AGP、LPC等)的若干类型总线结构中的任何一种, 并且可以使用各种商用总线系统结构中的任何一种。计算机602进一步包括机器可读存储子系统614和存储接口 616,以用于将存储子系统614接口到系统总线608和其它期望的计算机组件。例如,存储子系统614(物理存储介质)可以包括硬盘驱动器(HDD)、磁性软盘驱动器(FDD)、和/或光盘存储驱动器(例如⑶-ROM驱动器、DVD驱动器)中的一个或多个。例如,存储接口 616可以包括诸如EIDE、 ATA、SATA、以及IEEE1394等的接口技术。一个或多个程序和数据可以被存储在存储器子系统606、机器可读和可移动存储器子系统618 (例如快闪式存储器形式因素的技术)、和/或存储子系统614 (例如光学的、 磁性的、固态的)中,该存储子系统包括操作系统620、一个或多个应用程序622、其它程序模块624、以及程序数据626。例如,所述一个或多个应用程序622、其它程序模块624、以及程序数据6 可以包括图1中系统100的实体和组件,以及由图2-5的流程图表示的方法。一般地,程序包括执行特定任务或实现特定抽象数据类型的例程、方法、数据结构、其它软件组件等。例如,操作系统620、应用程序622、模块624、和/或数据6 的全部或部分可以被高速缓存在诸如易失性存储器610的存储器中。应当理解,所公开的体系结构能够用各种商用的操作系统或操作系统(例如作为虚拟机器)的组合来实现。存储子系统614和存储器子系统(606和618)当作用于数据、数据结构、计算机可执行指令等的易失性和非易失性存储的计算机可读介质。这些指令在由计算机或其它机器执行时,能够使得计算机或其它机器执行方法的一个或多个动作。可以将执行动作的指令存储在一个介质上,或者跨多个介质存储该指令,以便于指令在一个或多个计算机可读存储介质上共同地出现,而不管所有指令是否在同一介质上。计算机可读介质可以是能够被计算机602访问的任何可用介质,包括易失性的和非易失性的、内部的和/或外部的、可移动的或不可移动的介质。介质以任何合适的数字形式为计算机602供应数据的存储。本领域的技术人员应当理解,可以使用诸如zip驱动器、 磁带、快闪式存储器卡、闪存驱动器、卡带等的其它类型的计算机可读介质,以用于存储执行所公开的体系结构的新颖方法的计算机可执行指令。用户可以使用诸如键盘和鼠标等的外部的用户输入设备628与计算机602、程序和数据交互。其它外部的用户输入设备拟8可以包括话筒、IR(红外的)遥控器、控制杆、游戏控制器、照相机识别系统、手写笔、触摸屏、姿势系统(例如眼睛的动作、头部的动作等) 等等。用户可以使用诸如触摸板、话筒、键盘等的机载用户输入设备630与计算机602、程序和数据交互,例如其中计算机602是便携式计算机。这些和其它的输入设备通过输入/ 输出(I/O)设备接口 632经由系统总线608被连接到处理单元604,也可以通过诸如并行端口、IEEE 1394串行端口、游戏端口、USB端口JR接口等其它接口被连接。I/O设备接口 632还便于使用诸如打印机、音频设备、照相机设备等输出外设634,诸如声卡和/或机载音频处理能力。一个或多个图形接口 636(通常还被称为图形处理单元(GPU))在计算机602和外部显示器638 (例如IXD、等离子体)和/或机载显示器640 (例如便携式计算机)之间提供图形和视频信号。图形接口 636还可以被制造成计算机系统板的一部分。计算机602可以通过使用经由有线/无线通信子系统642到一个或多个网络和/ 或其它计算机的逻辑连接,而在网络环境(例如基于IP的)中操作。所述其它计算机可以包括工作站、服务器、路由器、个人计算机、基于微处理器的娱乐设备、对等设备、或其它通常的网络节点,并且一般包括相对于计算机602描述的元素的许多或全部。所述逻辑连接可以包括到局域网(LAN)、广域网(WAN)、热点等的有线/无线的连接性。LAN和WAN网络环境在办公室和公司里是常见的,并且便于诸如内部网的企业范围内的计算机网络,而所有的内部网络可以连接到诸如因特网的全球通信网络。当在网络环境中使用时,计算机602通过有线/无线通信子系统642 (例如网络接口适配器、机载收发器等)连接至网络以与有线/无线网络、有线/无线打印机、有线/无线输入设备644等通信。计算机602可以包括用于通过网络建立通信的调制解调器或其它装置。在网络环境中,与计算机602相关的程序和数据可以被存储在与分布式系统相关联的远程存储器/存储设备中。应当理解,示出的网络连接是示例性的,并且可以使用在计算机之间建立通信链路的其它手段。计算机602可以使用诸如IEEE 802. xx标准族的无线电技术与有线/无线设备或实体通信,诸如用例如打印机、扫描仪、台式计算机和/或便携式计算机、个人数字助理 (PDA)、通信卫星、与无线可检测标签相关联的任何仪器或位置(例如公用电话亭、报摊、洗手间)以及电话有效地布置在无线通信(例如IEEE 802. 11无线电调制技术)中的无线设备。这至少包括用于热点、WiMax、以及Bluetooth 无线技术的Wi-Fi (即无线保真)。因此,通信可以是像常规网络所用的预定义的结构或者简单的是至少两个设备之间的自组织通信。WiFi网络使用名为IEEE 802. llx(a、b、g等)的无线电技术来提供安全、可靠、快速的无线连接性。可以使用WiFi网络将计算机互相连接,连接至因特网、以及连接至有线网络(使用与IEEE 802. 3-相关的介质和功能)。上文所描述的包括所公开的体系结构的示例。当然,不可能描述组件和/或方法的每一可想象的组合,但是本领域的普通技术人员可以认识到,许多另外的组合和置换是可能的。因此,所述新颖的体系结构旨在包含落入所附权利要求书的精神和范围中的所有这样的改变、修改和变化。此外,就在说明书和权利要求书中使用术语“包括”而言,这一术语旨在以与术语“包含”用作权利要求书中的过渡词语所解释的类似的方式为包含性的。
8
权利要求
1.一种具有存储由处理器执行的可执行指令的计算机可读介质的计算机可实现系统 (100),包括编译组件(102),所述编译组件具有包含名称绑定服务在内的服务的内部编译流水线的类型化程序设计语言;以及可扩展接口组件(110),所述可扩展接口组件便于通过语言扩展访问名称绑定服务以便在编译时间与类型交互。
2.如权利要求1所述的系统,其特征在于,所述可扩展接口组件能够在编译流水线中进行伪类型的静态绑定。
3.如权利要求2所述的系统,其特征在于,所述可扩展接口组件能够在运行时间消除伪类型残余,所述残余在伪类型的类型检查期间创建。
4.如权利要求3所述的系统,其特征在于,所述可扩展接口组件能够在编译运行时间用真实类型取代伪类型。
5.如权利要求1所述的系统,其特征在于,所述可扩展接口组件进一步使语言服务与编译时间扩展和设计时间扩展接触。
6.如权利要求1所述的系统,其特征在于,所述编译组件的操作不妨碍与可扩展接口组件的合作。
7.如权利要求1所述的系统,其特征在于,所述可扩展接口组件能够通过语言扩展进行名称查找。
8.如权利要求1所述的系统,其特征在于,所述可扩展接口组件能够通过语言扩展进行值查找。
9.如权利要求1所述的系统,其特征在于,所述语言扩展提供适合于类型化的程序设计语言的静态类型信息。
10.一种由处理器执行的计算机可实现方法,包括接收具有服务的内部编译流水线的类型化程序设计语言的编译组件O00);通过可扩展接口连接到内部编译流水线O02);通过可扩展接口访问内部编译流水线的名称绑定服务O04);以及在编译时间通过名称绑定服务与类型交互006)。
11.如权利要求10所述的方法,其特征在于,还包括通过可扩展接口为内部编译流水线的类型检查过程插入伪类型。
12.如权利要求10所述的方法,其特征在于,还包括在编译时间的交互时用真实类型取代伪类型。
13.如权利要求10所述的方法,其特征在于,还包括在内部流水线的名称绑定阶段期间实现解析类型和值的解析器组件。
14.如权利要求13所述的方法,其特征在于,还包括将类型和值映射到内部编译数据结构以允许编译过程执行。
15.如权利要求10所述的方法,其特征在于,还包括通过可扩展接口进行部分的名称查找。
全文摘要
本发明涉及用于类型化程序设计语言的名称绑定可扩展性。提供插入编译器(例如F#)以及相关联的语言服务的方法的体系结构。所述语言组件定义允许任何组件插入服务的标准插件机制,并且提供名称绑定和类型解析服务。所述编译器和语言服务利用了被定义为(例如以为了插入系统必须实现的接口和类的形式)提供编译时间和设计时间扩展的协议。所述体系结构提供了定义用户化协议以与编译器的名称绑定机制交互的能力。这一协议的使用不仅使得编译成功,并且还提供诸如用于快速信息的名称查找和值查找等的丰富的IDE服务。此外,还支持提供静态类型信息以满足类型化的程序设计语言的需求的能力。
文档编号G06F9/45GK102236573SQ20111012277
公开日2011年11月9日 申请日期2011年5月4日 优先权日2010年5月5日
发明者D·西梅, J·A·费雪, L·J·霍本, T·Y·T·额 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1