CN101253477A - 可空和后期绑定 - Google Patents
可空和后期绑定 Download PDFInfo
- Publication number
- CN101253477A CN101253477A CNA2006800314731A CN200680031473A CN101253477A CN 101253477 A CN101253477 A CN 101253477A CN A2006800314731 A CNA2006800314731 A CN A2006800314731A CN 200680031473 A CN200680031473 A CN 200680031473A CN 101253477 A CN101253477 A CN 101253477A
- Authority
- CN
- China
- Prior art keywords
- sky
- type
- nullable
- computer implemented
- empty
- 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
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
提供了增强编程语言的系统和方法,而这是通过为包括引用和值类型T两者的静态类型引入除值层面之外在类型层面上的空统一来实现的。不加提及实际类型地引入一种添加一层可空性(以及移除该可空性)的操作符,从而以精确的方式指引重载。
Description
背景
随着编程方法和基础的发展,业已开发出各种应用编程接口(API)和编程架构来使得先前多变且相对不兼容的编程方法学得以标准化和统一。因此,现代编程经常涉及将各种API和架构与可重用库联用。这样的编程语言持续不断地发展以便于程序员写定并便于程序的高效率执行。
编译器和/或解释器承受着将高级逻辑翻译成可执行机器码的重担。一般而言,编译器和/或解释器是接收以源编程语言(例如,C、C#、Visual Basic、Java等)写定的程序并且将由此提供的逻辑转换成可由硬件设备执行的机器语言的组件。然而,该转换无需逐字进行。实际上,常规编译器和/或解释器分析源代码并且生成非常高效率的代码。例如,程序员写的代码阐述对人类而言直观且易于理解的操作逻辑流,但是这些代码就计算机执行而言通常效率低下。编译器和/或解释器能够标识出效率低下之处并且能通过消除不必要的操作和/或重新编排指令的执行而同时仍达成预期的结果从而在硬件层面改善程序性能。以此方式,程序员就能够创建强健且高效率的软件程序。
通常对于公共语言运行库(CLR)而言,数据类型可以是值类型(value type)或引用类型(reference type)。引用类型是存储在堆(heap)上并由存储在栈上或此堆内另一对象内的指针所引用的变量。值类型是直接存储在栈上的变量。因此,表示为引用类型的变量可以是未被初始化的(术语称为“空的(null)”),而表示为值类型的变量不可能不冒着不确定甚至灾难性结果之险就在未被初始化的条件下建立。换句话说,值类型因为总是有值而无法为空,并且也无法被表达为空。
例如,如果静态地已知
Dim X As Nullable(of Int)=Nothing(“Null”)
Dim Y As Nullable(of Int)=5
Dim Z=X+Y
Z具有Nullable(of Int)类型((整数的)可空)并且经由例如三值的、或空传播的逻辑而具有“无(nothing)”值。然而并且如将在下文中详述的,这就会在后期绑定中产生问题。
此外,在与诸如数据库语言(例如,SQL)之类的支持空的语言进行交互时,支持跨包括值类型在内的所有类型的可空性(nullability)是必须的。数据库语言能够利用空值来指示实际数据值未知或缺失。通过在通用编程语言内提供空支持,就可将支持空的语言和编程语言集成(例如,C#编程语言的代码可以读、写或解释数据库语言的可空字段)。先前以有许多不同策略试图解决置空(nullification)问题。这些策略的示例包括元组、变体、卷积指针操纵、以及装箱(boxing)。然而,这些策略的每一种都有一个或多个缺点。
例如,装箱是从值类型到类型对象或到由该值类型实现的任何接口类型的隐式转换。换句话说,值类型存在于栈上并且用引用获取指向堆的指针。对值作值装箱是分配一对象实例并且将该值拷贝至该新对象中。类似地,拆箱(unboxing)是从类型对象到值类型或从接口类型到实现该接口的值类型的显式转换。拆箱操作通常由以下动作组成:检验该对象实例以确保它是给定值类型的装箱值,并且将该值从此实例拷贝到值类型变量中。
现在考虑对一可空进行装箱的例子。通常,实现一可空的方式需要借助于具有布尔和值的结构。这是通过自动创建一个多元结构来完成,该多元结构包括用于下层值的元以及表示该下层值是否为空的布尔元(例如,为下层类型指示空或非空值的标志)。例如,如果声明该布尔元为假,则认为该下层类型为空,而如果该布尔元为真,则认为此下层值中所含的值是可空类型变量的值。
例如,“无”不具有值,和/或其值可被忽略。如前所解释的,可空类型的“5”可由一对布尔表示,其不为空且具有一“5”值。由此,用于表示可空的实现需要借助具有一布尔和一值的结构。此外,考虑对值“3”进行装箱的场景,在堆上能获得对该值3的引用。类似地,当对值“真,5”进行装箱时,直观地期望存在指向能够包含“真”和5的堆的指针。
然而,要装箱“无”和“假”,就会有不一致出现,因为当事实上起始点是“无”时,创建了对实物的引用。例如,已被引用的事物不表示引用类型的“无”。换句话说,起始点是空集,而产出则是包含该空集的集,这就表示了不正确的产出。
此外,在堆中,在装箱的项与整数之间可以做出区分,但在“无”和装箱的“无”之间也会产生差别,而这是不期望的。因此,如果期望对可空类型进行装箱(如果它为“真”并且具有一值),就能将其移除并以在其中装箱知晓可空性的方式来装箱。
现存的另一问题是没有痕迹表明先前存在的这些为可空,因为装箱的nullable(int.)的表示与装箱的int的表示相同。因此就无法在nullable(of T)与装箱的T之间做出区分。
换句话说,在从值类型经由装箱移至对象及其相反过程的情况下,无法为可空类型执行保真的逆转,并且区分性会丢失。这会给后期绑定带来问题。参考以下示例:
Dim A As Object=X
Dim B As object=Y-这样的赋值引起从可空到对象的装箱发生。
现在考虑Dim C=A+B的后期绑定的加法,A可以表示没有指针(无)而B可由装箱的5表示。然而,不知道A和B为可空。由此,Visual Basic(VB)后期绑定的加法将把无解释为零并且返回结果5代之以“无”,这就取决于是有前期绑定还是后期绑定而产生语义差异。这种不一致会导致问题的产生并且需要被最小化。换句话说,重载和编译器能够静态地将此三值或空传播逻辑作为在编译时已知的类型来解析——然而对于后期绑定和在运行时解析而言,是没有关于可空性的知识的。
因此,需要克服与常规系统和设备相关联的前述示例性缺陷。
概述
以下呈现了简化概述,以提供对权利要求主题的某些方面的基本理解。本概述不是广义的概览。它并不意指标识关键/重要元素也不意欲描绘权利要求主题的范围。这一概述的唯一目的是以一种简化的形式来介绍一些概念,作为稍后呈现的更为详细的描述的前序部分。
本发明提供了增强编程语言的系统和方法,这是通过为包括引用和值类型T两者的静态类型引入除值层面之外在类型层面上的空统一来实现的。不加提及实际类型地引入一种添加一层可空性(以及移除该可空性)的操作符,从而以精确的方式指引重载。
因此,可以为标识可空性的各种类型和表达式实现一种新的操作(例如,以问号“?”的形式)(并且符号“!”用于移除可空性)。例如,考虑类型T上的表达式E,则E?指示为T的可空。“E?”对表达式进行操作而“T?”对类型进行操作。由此,考虑示例Dim C=A?+B,这指示对象的可空+对象,其中编译器现在能够执行静态重载解析。换句话说,通过提供这样的操作符,程序员就能够改变静态类型,以使得重载解析以执行对象?+对象而非对象+对象的方式来起作用。由此,类型名T不需要被指定。此外,其能以还具有相反转换(例如被表达为“E!”)的开关形式提供。
在一相关方面,如果没有运行时支持可用(例如,对于诸如可空擦除之类的可空性),则编译器能够在T是引用类型的情况下跟踪可空性表示。如果T是作为值类型,则可以提供以下表示和类型规则:
正如所述的,如果T是引用类型,则编译器跟踪没有不同的运行时表示的Nullable(例如,经由元数据、特殊元数据等)。 由此它必须被擦除并且在运行时作出确定。
运行时类型由Tr表示且编译器维持其为可空,该类型被擦除成引用类型(As Nullable(of Tr)指示一可擦除表示并且未由实际类型构造符表示),并且该编译器在编译时跟踪其为可空。因此,没有用于值类型和引用类型的统一表示,并且编译器必须知道该情况,因为在没有运行时支持的情况下其是被硬连线到编译器中的。
在一相关方面,如果提供了运行时支持,其中通常在运行时可空类型的一个实例已知。则该实例类型具有如下形式:
S=Nullable(Of Nullable(Of……(Of T)),其中T≠Nullable(Of…)。其中存在多个可空,然后在某一点上存在一非可空的类型(例如,引用类型或值类型)。如果T是引用类型,则当创建类型S时,其可被表示为S=T。由此,Nullable(Of Nullable(Of Object))=Object,其中各个可空被移除。如果T是值类型,则S=Nullable(Of T),于是Nullable(Of Nullable(Of Int)=Nullable(Of Int)。于是,有了运行时支持,只要运行时试图实例化一可空类型,直至值类型的全部可空层就能够被擦除。例如,在即时(JIT)编译器/代码生成器上,当构造一实际类型时,所有的类型参数已知,因而能够无歧义地选择正确的表示。
如前所述,这就需要运行时支持,其中在运行时当该类型被实例化时,下层的执行机制知晓可空,并且能够提供空统一。应该理解存在静态类型Nullable(OfT),但是不存在如此的动态类型nullable of(T)。
此外,有了运行时支持,就可实现下列普适可空诱导函数(例如,用于联结和数据库):
Function F(of T)
(X As T)As T?
Return X?
End Function
为实现上述及相关成果,结合下列说明和附图,在此描述所要求保护的主题的某些示例性的方面。这些方面指可以实践示本主题的各种方法,这些方法均被规定为是在所要求保护主题的范围之内。结合附图一起考虑,从下面的详细描述可以明显看出本发明的其他优点和新颖特征。
附图说明
图1示出了经由其编程环境能够提供可空类型支持的空统一组件,其中不加提及实际类型就可添加和/或移除一层可空性。
图2示出了作为此空统一组件的一部分的操作符。
图3示出了带有支持可空统一的源程序的编程环境。
图4示出了Nullable(Of T)的两种不同表示,以指示有运行时支持可用以及无运行时支持可用。
图5示出了带有能够跟踪可空性表示的跟踪组件的编译器。
图6示出了可在数据库内为联结实现的函数,其中存在有运行时支持。
图7示出了根据本发明一方面的用于实现可空类型非运行时支持的方法。
图8示出了根据本发明一方面的用于实现可空类型运行时支持的方法。
图9是描绘用于实现本发明的可空性统一的编译器环境的框图。
图10示出了用于实现本发明各方面的示例性环境。
图11是可用于实现本发明的空统一的附加计算环境的示意性框图。
详细说明
现在参考附图描述本发明的各个方面,其中始终用相同的参考数字来指示相同的或相应的元素。然而应该了解,附图以及与其相关的详细描述并不旨在把所要求保护的主题限制为公开的特定形式。相反,其意图是覆盖落在所要求保护的主题的精神和范围内的所有修改、等效和替换的方案。
在此所用的术语“组件”、“系统”等等意指与计算机相关的实体,可以是硬件、硬件和软件的组合、软件或执行中的软件。例如,组件可以是但不限于是,在处理器上运行的进程、处理器、对象、可执行(程序)、执行的线程、程序和/或计算机。作为例示,运行在计算机上的应用程序和计算机本身都可以是计算机组件。一个或多个组件可以驻留在进程和/或执行的线程中,并且组件可以位于一个计算机内和/或分布在两个或更多的计算机之间。
在此使用词语“示例性的”意指用作例子、实例或例示。在此被描述为“示例性的”的任何方面或设计并不一定被解释为比其他方面或设计优先或有利。
此外,使用产生软件、固件、硬件或其任何组合的标准编程和/或工程技术,所公布的主题可以被实现为控制基于计算机或处理器的设备实现在此被所详述的方面的系统、方法、装置或产品。此处所用的术语计算机程序摂旨在包含可以从任何的计算机可读设备、载波或介质访问的计算机程序。例如,计算机可读介质可以包括但不限于磁存储设备(例如,硬盘、软磁、磁带等)、光盘(例如,光盘(CD)、数字通用盘(DVD)等)、智能卡和闪速存储器设备(例如,卡、棒)。另外应该明白,载波可以被用于携带计算机可读电子数据,例如那些被用于传送和接收电子邮件方面或被用于访问网络如因特网或局域网(LAN)的数据。当然,本领域的技术人员将会认识到,在不背离所要求保护的主题的范围或精神的前提下可以对这一配置进行许多修改。
首先转向图1,示出了包括空统一组件130的编程环境100,编程环境100经由该空统一组件130能够为编程语言提供可空类型支持,其中不加提及实际类型就能添加或移除可空性层,从而以精确的方式指引静态类型重载。
系统100包括能够在诸如C、C++、C#、Pascal、Python、Ruby、Visual Basic、Java等的编程语言的上下文中声明的一个或多个数据结构。这些该数据结构通常可由诸如整数、浮点、布尔之类的下层类型组成,并且通过将一类型修改符与该下层类型相关联就能将其声明为可空类型。空统一组件130能够启用Nullable(Of T)作为用于值类型110和引用类型120两者的静态类型,这将在下文详细描述。通常,值类型110描述被表示为存储在栈上的比特序列的值。类似地,引用类型120可存在于堆上并且提供指针。空统一组件130可以提供不加提及实际类型地引入的添加一层可空性(以及移除该可空性)的操作符,从而以精确的方式指引静态类型重载。一般而言,重载是在同一范围内向一给定函数名提供一个以上的定义的实践。留待编译器来基于其被调用时所带的自变量来拣选该函数或操作符的合适版本。
图2示出了作为空统一组件210一部分的操作符215。操作符215能利用诸如“?”的符号作为类型修改符来向编译器230指示该下层类型要被视为可空类型。应该理解也可利用其他各种符号作为此类型修改符。
因此,可以为标识可空性的各种类型和表达式实现一种新的操作(例如,以问号“?”的形式)。例如,考虑类型T上的表达式E,则E?指示为T的可空。由此,考虑示例Dim C=A?+B,这能指示对象的可空+对象,其中编译器230现在能够执行静态重载解析。换句话说,通过提供这样的操作符,程序员就能够改变静态类型,以使得重载解析着手执行对象?+对象,而非对象+对象。由此,类型名T不需要被指定。此外,此修改符能以还具有诸如表达为“!”的相反转换的开关形式来提供。
图3示出了带有支持可空统一的源程序310的编程环境300。这样就能够提供不加提及实际类型地引入的添加一层可空性(以及移除该可空性)的操作符,从而以精确的方式指引重载。该层可空性能启用Nullable(Of T)作为用于值类型和引用类型两者的静态类型。系统300包括可由集成开发环境(IDE)开发、设计或编辑的源程序310。IDE可与诸如开发人员工作室应用程序之类的更为精密的编程站相关联,或者与诸如代码文本编辑器之类的更为基础的工具相关联。编译器320根据周知的编译技术并考虑此可空操作符来处理该源代码来为计算机生成可执行代码330。
图4示出了Nullable(Of T)的两种不同表示410和420,以指示有运行时支持可用以及无运行时支持可用。当没有运行时支持可用时,若T是引用类型,则编译器能够跟踪可空性表示。如果T是值类型,则可以提供以下表示:
(其中,如果T是值类型,则“?”的表示为Nullable。)
正如所述的,如果T是引用类型,则编译器跟踪不具有不同运行时表示的Nullable(例如,经由元数据、特殊元数据等)。
如果
则运行时类型为Tr且编译器维持其为可空,并且该类型被擦除成引用类型(As Nullable(of Tr)指示一可擦除表示),并且该编译器在编译时跟踪其为可空。因此,没有用于值类型和引用类型的统一表示,并且编译器必须知道该情况,因为在没有运行时支持的情况下其是硬连线到编译器中的。图5示出了带有跟踪组件510的编译器500。如上所解释的,如果T是引用类型并且在没有运行时支持可用时,跟踪组件510能够跟踪可空性表示。
在一相关方面,如果提供了运行时支持,其中通常在运行时可空类型的一个实例已知,则该实例类型具有如下形式
S=Nullable(Of Nullable(Of……(Of T)),其中T≠Nullable(Of…)。
其中存在多个可空,然后在某一点上存在一非可空的类型(例如,引用类型或值类型)。如果T是引用类型,则当创建类型S时,其可被表示为S=T。由此,Nullable(Of Nullable(Of Object))=Object,其中各个可空被移除。如果T是值类型,则S=Nullable(Of T),于是Nullable(Of Nullable(Of Int)=Nullable(Of Int)。
如前所述,这需要运行时支持,其中在运行时当该类型被实例化之时,下层的执行机制知晓可空,并且能够支持空统一。应该理解存在静态类型Nullable(OfT),但是不存在这样的动态类型nullable of(T)。
图6示出了可在数据库内为联结实现的函数,其中存在有运行时支持。这对于表达具有如下签名的数据库查询运算(例如,外部联结)而言将是可取的:
OuterJoin(Of S,T)(Source As Pair(Of Collection(Of S),Collection(Of T)))
As Collection(Of Pair(Of Nullable(S),Nullable(T)))
其中,它能够在编程语言中被映射成引用类型。此处的原型示例是串类型。没有引用类型上的Nullable(可空),一般而言是无法在常规串与可空串之间做出区分的。
图7示出了根据本发明一方面的用于实现可空类型非运行时支持的流程图700。虽然在此将该示例性方法示出并描述为代表各个事件和/或动作的一系列框,但是本发明不受这些框示出的排序所限制。例如,根据本发明,除了在此示出的排序之外,某些动作或事件可以按不同的次序发生和/或与其他动作或事件并发地发生。此外,不是所有示出的框、事件或动作都是实施根据本发明的方法所必要的。此外,将会认识到根据本发明的该示例性方法和其他方法可以与在此示出并描述的方法关联地实现,也可与未示出或描述的其他方法和装置关联地实现。最初在720处,做出有关类型的判定,并且如果这是一引用类型,则方法行进至740。在740处,编译器跟踪与该引用类型相关联的可空性,以在750处指定编译时的可空性。作为替代,如果在720处的判定指示值类型,则方法行进至730。在730处,可以提供 以及 的表示。
图8示出了根据本发明一方面的用于实现可空类型运行时支持的流程图800。最初在820,提供具有S=Nullable(Of Nullable(Of……(Of T))形式的可空类型实例,其中T≠Nullable(Of...),并且其中存在多个可空,然后在某一点上存在非可空的类型(例如,引用类型或值类型)。随后在830处,做出有关T的类型的判定。在850处,如果确定T是引用类型,则当创建类型S时,其可被表示为S=T。由此,Nullable(Of Nullable(Of Object))=Object,其中各个可空被移除。作为替代,在840处如果T是值类型,则S=Nullable(Of T),于是Nullable(Of Nullable(Of Int)=Nullable(Of Int)。
图9是描绘可被用于实现本发明的可空性统一的编译器环境900的框图。编译器环境900包括编译器910,而编译器910进而包括映射组件914、前端组件920、转换器组件930、后端组件940、差错校验器组件950、符号表960、语法分析树970和状态980。编译器910接受源代码作为输入并且能够产生执行代码作为输出。输入可以包括但不限于在此描述的程序性的表达式。此编译器环境的各组件和模块间的关系示出了数据的主要流向。出于简明的考虑没有示出其他的组件和关系。取决于实现,各组件可被添加、省略、拆分成多个模块,与其他模块和/或其他模块的配置相结合。
编译器910可以接受具有与处理元素序列的源代码的文件作为输入。源代码可以包括各种表达式和关联函数、方法和/或其他程序性构造。编译器910可以协同用于分析构造以及生成或诸如代码的一个或多个组件来对源代码进行处理。
前端组件920读取源代码并对其执行词法分析。实质上,前端组件920读取源代码写成的字符(例如,文字数字)序列并将其翻译成指示常量、标识符、操作符号、关键字、和标点的句法元素或标记。
转换器组件930将标记语法分析为中间表示。例如,转换器组件930能够检查句法并将标记分组为表达式或其他的句法结构,后者进而接合成语句树。概念地,这些树形成语法分析树970。此外并且在适当情况下,转换器模块930可以将各条目放入符号表930中,符号表930将在源代码中使用的符号名和类型信息连同相关特性一起列出。
状态980可用于跟踪编译器910在处理接收到或检索到的源代码并形成语法分析树970时的进度。例如,不同的状态值指示编译器910是在类定义或函数的开始、刚声明了类成员、还是已经完成一表达式。随着编译器的前进,它持续更新状态980。编译器910可部分地或者完全地将状态980曝露给外界实体,该外界实体则能向编译器910提供输入。
基于源代码内的构造或其他信号(或者以其他方式识别出此机会),转换器组件930或另一组件可注入对应于促进高效率及正确执行的代码。编码在转换器组件930或其他组件中的规则指示为能实现期望的功能性并识别要注入代码的位置或要实行其他操作的位置所必须完成的动作。注入的代码通常包括在一个或多个位置处添加的语句、元数据、或其他元素,但是该术语也可以包括改变、删除、或以其他方式修改现有的源代码。注入的代码可以作为一个或多个模板或以某些其他形式来存储。此外,应该认识到可以发生符号表的操众以及语法分析树的转化。
基于符号表960和语法分析树970,后端组件940能够将中间表示翻译成输出代码。后端组件940将中间表示转换成可在目标处理器中或由其执行的指令,转换成对变量的存储器分配,等等。输出代码可以由真实的处理器执行,但是也能提供可由虚拟处理器执行的输出代码。
此外,前端组件920和后端组件940能够执行另外的功能,诸如代码优化,并且能够将描述的操作作为单个阶段或在多个阶段中执行。编译器910诸组件的各个其他方面在本质上是常规的,并且可由执行等效功能的组件代替。另外,在源代码处理过程中的各个阶段,差错校验器组件950可以检验差错,诸如词法结构中的差错、句法差错、甚至是语义差错。一旦检测到差错,校验器组件950就暂停编译并生成指示此差错的消息。
为给所公开的主题的各方面提供上下文,图10和11以及下列讨论旨在提供可以在其中实现所公开主题的各方面的合适的计算环境的简要、概括的描述。尽管前面已经在运行在一个或多个计算机上的计算机程序的计算机可执行指令的一般上下文中描述了本发明,然而本领域内的技术人员将认识到,本发明也可以和其他程序模块结合实现。一般地,程序模块包括执行特定任务和/或实现特定抽象数据类型的例程、程序、对象、数据结构等等。而且,本领域内的技术人员将会理解,本发明的方法可以与其他计算机系统配置一起实施,包括单处理器或多处理器计算机系统、小型计算设备、大型计算机以及个人计算机、手持式计算设备(例如,个人数字助理(PDA)、电话、手表等)、基于微处理器的或可编程的消费性或工业电子产品等等。也可以在分布式计算环境中实践所例示的方面,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。然而,若非全部也有部分本发明的方面可以在独立计算机上实现。在分布式计算环境中,程序模块可被置于本地或远程的存储器设备中。
参考图10,用来实施本发明各个方面的示例性环境1010包括计算机1012。计算机1012包括处理器单元1014,系统存储器1016,以及系统总线1018。系统总线1018把包括但不限于系统存储器1016的系统部件连接到处理单元1014。处理单元1014可以是各种可用处理器中的任意一种。双微处理器和其它多处理器结构也可用作处理单元1014。
系统总线1018可以是几种类型的总线结构中的任意一种,包括存储器总线或存储器控制器,外围总线或外部总线,和/或利用下述可用总线结构中的任意一种的本地总线,包括但不限于,11位总线,工业标准结构(ISA),微通道结构(MCA),扩展工业标准结构(EISA),智能化驱动器电子接口(IDE),VESA本地总线(VLB),外围部件互连(PCI),通用串行总线(USB),高级图形端口(AGP),个人计算机内存卡国际联合会总线(PCMCIA),以及小型计算机系统接口(SCSI)。
系统存储器1016包括易失性存储器1020以及非易失性存储器1022。基本输入/输出系统(BIOS)包含诸如在启动期间在计算机1012的元件之间传送信息的基本例程,其存储在非易失性存储器1022中。作为例子而不是限制,非易失性存储器1022可以包括只读存储器(ROM),可编程ROM(PROM),电可编程ROM(EPROM),电可擦除ROM(EEPROM),或者闪存。易失性存储器1020包括用作外部高速缓存的随机存取存储器(RAM)。作为例子而不是限制,RAM可以是很多形式,诸如同步RAM(SRAM),动态RAM(DRAM),同步DRAM(SDRAM),双速SDRAM(DDR SDRAM),增强型SDRAM(ESDRAM),同步链接DRAM(SLDRAM),以及直接存储器总线RAM(DRRAM)。
计算机1012还包括可移动/不可移动,易失性/非易失性计算机存储介质。例如,图10示出了磁盘存储器1024。磁盘存储器1024包括但不限于诸如磁盘驱动器、软盘驱动器、磁带驱动器、Jaz驱动器、Zip驱动器、LS-100驱动器、闪存卡、或者内存条之类的设备。此外,磁盘存储器1024可以包括独立的或者与其它存储介质结合的存储介质,包括但不限于诸如加密盘ROM驱动器(CD-ROM)、可记录CD驱动器(CD-R驱动器)、可重写CD驱动器(CD-RW驱动器)或者数字视频盘ROM驱动器(DVD-ROM)这样的光盘驱动器。为了便于把磁盘存储装置1024连接到系统总线1018,通常把可移动或不可移动的接口用作诸如接口1026。
应该明白,图10描述了在合适的操作环境1010中描述的基础计算机资源和用户之间起到中间人作用的软件。这些软件包括操作系统1028。存储在磁盘存储器1028上的操作系统1024,在运行时控制并分配计算机系统1012的资源。系统应用程序1030通过存储在系统内存1028或磁盘存储器1032中的程序模块1034和程序数据1016,利用操作系统1024对资源进行管理。应该明白,在此描述的各个组件可以用各种操作系统或操作系统的组合来实施。
用户通过输入装置1036把命令或信息输入到计算机1012中。输入装置1036包括但不限于诸如光标、轨迹球、指示笔、触摸板、键盘、麦克风、操纵杆、游戏手柄、卫星反射器、扫描仪、TV调谐卡、数码相机、数字摄像机、网页照相机等等。这些以及其它输入装置通过系统总线1018经由接口端口1038连至处理单元1014。接口端口1038包括,例如串行端口、并行端口、游戏端口、以及通用串行总线(USB)。输出装置1040利用和输入装置1036相同类型的端口。因此,例如,USB端口可以用来向计算机1012提供输入,以及把来自计算机1012的信息输出到输出装置1040。输出适配器1042是用来举例说明除了输出装置1040之外还有些象监视器、扬声器、以及打印机这样的输出装置需要专用适配器。输出适配器1042包括,作为例子而不是限制,视频和声频卡,其在输出装置1040和系统总线1018之间提供了连接装置。应该注意到,其它装置和/或系统提供了诸如远程计算机1044这样的输入和输出能力。
计算机1012可以利用到诸如远程计算机1044这样的一个或多个远程计算机的逻辑连接在联网的环境中操作。远程计算机1044可以是个人计算机、服务器、路由器、网络PC、工作站、基于电器的微处理器,同等装置或者其它普通网络节点等,通常包括所描述的有关于计算机1012中的很多或者全部元件。为了简明,只举例说明了远程计算机1046的存储器存储设备1044。远程计算机1044经由网络接口1048被逻辑地连接到计算机1012然后经由通信连接1050被物理连接。网络接口1048包括诸如局域网(LAN)和广域网(WAN)这样的通信网络。LAN技术包括光纤分布式数据接口(FDDI)、铜线分布式数据接口、以太网/IEEE 802.3、令牌环/IEEE 802.3等。WAN技术包括但不限于,点对点链接,象综合业务数字网(ISDN)和其各种变形这样的线路交换网,分组交换网,以及数字用户专线(DSL)。
通信连接1050指的是把网络接口1048连接到总线1018的硬件/软件。虽然为了清楚地举例说明,通信连接1050显示在计算机1012的内部,但其也可以在计算机1012的外部。连接到网络接口1048所需要的硬件/软件包括,仅为了举例说明,内部和外部技术,诸如调制解调器包括常规电话级别的调制解调器、电缆调制解调器以及DSL调制解调器、ISDN适配器、以太网卡。
图11是用于实现本发明空统一的示例计算环境100的示意性框图。系统1100包括一个或多个客户端1110。(诸)客户端1110可以是硬件和/或软件(例如,线程、进程、计算设备)。系统1100也包括一个或多个服务器1130。(诸)服务器1130可以是硬件和/或软件(例如,线程、进程、计算设备)。服务器1130可以容纳各线程以通过例如利用在此描述的各组件执行转换。在客户端1110和服务器1130之间的一种可能的通信能够以适合在两个或多个计算机进程之间传输的数据分组的形式进行。系统1100包括可以用来使(诸)客户端1110和(诸)服务器1130之间通信更容易的通信框架1150。(诸)客户端1110工作时被连接到一个或多个可以用来存储(诸)客户端1110的本地信息的客户端数据存储1160。同样地,(诸)服务器1130工作时被连接到一个或多个可以用来存储(诸)服务器1140的本地信息的服务器存储1130。
以上描述的内容包括各个示例性方面。当然,出于描绘这些方面的目的而描述每一个可以想到的组件或方法的组合是不可能的,但本领域内的普通技术人员应该认识到,许多进一步的组合和排列都是可能的。因此,在此描述的各方面旨在包括所有这些属于所附权利要求书的精神和范围内的改变、修改和变动。此外,至于术语“包括”可在详细说明书或权利要求书中使用,该术语与术语“包含”在权利要求中用作过渡词时所被解释的那样的方式相类似,也可以是包括性的。
Claims (20)
1.一种计算机实现的系统,包括下列计算机可执行组件:
针对引用和值两者的静态类型的用于指定可空性的空统一组件;以及不加提及类型地添加或移除一层可空性的操作符。
2.如权利要求1所述的计算机实现的系统,其特征在于,所述操作符利用符号“?”来标识可空性,并用符号“!”来指示可空性的移除。
3.如权利要求1所述的计算机实现的系统,其特征在于,还包括不提供运行时支持时跟踪引用类型的可空性表示的编译器。
4.如权利要求3所述的计算机实现的系统,其特征在于,可空是经由元数据和特殊元数据来跟踪的。
5.如权利要求3所述的计算机实现的系统,其特征在于,对于值类型,类型规则由 表示。
6.如权利要求3所述的计算机实现的系统,其特征在于,对于值类型,类型规则由 表示。
7.如权利要求1所述的计算机实现的系统,其特征在于,还包括指示关于可空的实例类型的运行时支持。
8.如权利要求7所述的计算机实现的系统,其特征在于,所述实例类型具有S=Nullable(Of Nullable(Of……(Of T))的形式,其中T≠Nullable(Of…)。
9.如权利要求8所述的计算机实现的系统,其特征在于,如果T是引用类型则S=T,而当T是值类型时S=Nullable(Of T)。
10.如权利要求9所述的计算机实现的系统,其特征在于,当可空被移除时,Nullable(Of Nullable(Of Object))=Object。
11.一种计算机实现的方法,包括下列计算机可执行动作:
引入用于引用类型和值类型两者的空统一,以及
不加提及类型地添加或者移除一层可空性之一。
12.如权利要求11所述的计算机实现的方法,其特征在于,还包括经由“?”符号指定可空性并经由“!”符号指定可空性的移除。
13.如权利要求11所述的计算机实现的方法,其特征在于,还包括在不提供运行时支持时经由编译器跟踪可空性表示。
14.如权利要求13所述的计算机实现的方法,其特征在于,还包括在T是值类型时表示
15.如权利要求11所述的计算机实现的方法,其特征在于,还包括提供对可空类型的运行时支持。
16.如权利要求15所述的计算机实现的方法,其特征在于,还包括以S=Nullable(Of Nullable(Of……(Of T))的形式提供实例类型,其中T≠Nullable(Of…),并且当T是引用类型时将Nullable(….OfT)坍缩为T。
17.如权利要求16所述的方法,其特征在于,还包括当T是值类型时,将Nullable(….OfT)坍缩为Nullable(Of T)。
18.如权利要求17所述的计算机实现的方法,其特征在于,还包括移除嵌套的可空以获取非可空的类型。
19.如权利要求17所述的计算机实现的方法,其特征在于,还包括实现如下形式的普适可空诱导函数:
Function F(of T)
(X As T)As T?
Return X?
End Function。
20.一种计算机实现的系统,包括下列计算机可执行组件:
用于统一引用和值两者的静态类型的可空性的装置;
用于不加提及类型地添加或者移除一层可空性的装置;以及
用于坍缩多层可空性的装置。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US11/215,178 | 2005-08-30 | ||
US11/215,178 US7716656B2 (en) | 2005-08-30 | 2005-08-30 | Nullable and late binding |
Publications (1)
Publication Number | Publication Date |
---|---|
CN101253477A true CN101253477A (zh) | 2008-08-27 |
Family
ID=37805596
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNA2006800314731A Pending CN101253477A (zh) | 2005-08-30 | 2006-08-04 | 可空和后期绑定 |
Country Status (4)
Country | Link |
---|---|
US (1) | US7716656B2 (zh) |
KR (1) | KR20080038306A (zh) |
CN (1) | CN101253477A (zh) |
WO (1) | WO2007027366A1 (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7647580B2 (en) * | 2004-09-07 | 2010-01-12 | Microsoft Corporation | General programming language support for nullable types |
US7711746B2 (en) * | 2005-12-17 | 2010-05-04 | International Business Machines Corporation | System and method for deploying an SQL procedure |
US8255883B2 (en) * | 2007-04-20 | 2012-08-28 | Microsoft Corporation | Translating late bound LINQ expressions into database queries |
US8037039B2 (en) * | 2007-04-20 | 2011-10-11 | Microsoft Corporation | Runtime class database operation |
US8171453B2 (en) * | 2007-05-21 | 2012-05-01 | Microsoft Corporation | Explicit delimitation of semantic scope |
US8296730B2 (en) * | 2008-03-12 | 2012-10-23 | Microsoft Corporation | Using extension methods to extend COM objects |
US8201155B2 (en) * | 2009-01-09 | 2012-06-12 | Microsoft Corporation | Handling multiple definition of types |
US11269874B2 (en) * | 2020-03-19 | 2022-03-08 | Oracle International Corporation | Two-valued logic primitives for SQL query processing |
Family Cites Families (22)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5590324A (en) | 1995-02-07 | 1996-12-31 | International Business Machines Corporation | Optimization of SQL queries using universal quantifiers, set intersection, and max/min aggregation in the presence of nullable columns |
US6094664A (en) | 1997-05-30 | 2000-07-25 | Sun Microsystems | Method and apparatus for optimizing the null pointer exception in an object-oriented programming environment with statically typed variables |
US5864840A (en) * | 1997-06-30 | 1999-01-26 | International Business Machines Corporation | Evaluation of existential and universal subquery in a relational database management system for increased efficiency |
US6321374B1 (en) | 1997-11-07 | 2001-11-20 | International Business Machines Corporation | Application-independent generator to generate a database transaction manager in heterogeneous information systems |
US6405363B1 (en) | 1998-03-11 | 2002-06-11 | International Business Machines Corporation | Class casting support for run-time extensible items in an object oriented framework |
US6272488B1 (en) | 1998-04-01 | 2001-08-07 | International Business Machines Corporation | Managing results of federated searches across heterogeneous datastores with a federated collection object |
US6385769B1 (en) | 1999-02-03 | 2002-05-07 | International Business Machines Corporation | Text based object oriented program code with a visual program builder and parser support for predetermined and not predetermined formats |
US6996557B1 (en) * | 2000-02-15 | 2006-02-07 | International Business Machines Corporation | Method of optimizing SQL queries where a predicate matches nullable operands |
US6735587B2 (en) | 2000-07-28 | 2004-05-11 | International Business Machines Corporation | Maintaining pre-computed aggregate views incrementally in the presence of non-minimal changes |
US20040046787A1 (en) | 2001-06-01 | 2004-03-11 | Attachmate Corporation | System and method for screen connector design, configuration, and runtime access |
US6654760B2 (en) | 2001-06-04 | 2003-11-25 | Hewlett-Packard Development Company, L.P. | System and method of providing a cache-efficient, hybrid, compressed digital tree with wide dynamic ranges and simple interface requiring no configuration or tuning |
US20030135788A1 (en) | 2002-01-11 | 2003-07-17 | Raj Prakash | Profile feedback assisted null check removal |
US7082455B2 (en) | 2002-04-23 | 2006-07-25 | International Business Machines Corporation | Method and apparatus of parameter passing of structured data for stored procedures in a content management system |
US20040107227A1 (en) | 2002-12-03 | 2004-06-03 | International Business Machines Corporation | Method for efficient implementation of dynamic lock-free data structures with safe memory reclamation |
US7389498B2 (en) | 2003-03-25 | 2008-06-17 | Microsoft Corporation | Core object-oriented type system for semi-structured data |
US7318075B2 (en) | 2004-02-06 | 2008-01-08 | Microsoft Corporation | Enhanced tabular data stream protocol |
US6976029B2 (en) | 2004-02-10 | 2005-12-13 | Microsoft Corporation | System and method for providing user defined types in a database system |
US20060015528A1 (en) | 2004-07-14 | 2006-01-19 | Microsoft Corporation | Generic representation of optional values |
US7647580B2 (en) | 2004-09-07 | 2010-01-12 | Microsoft Corporation | General programming language support for nullable types |
US7926027B2 (en) | 2004-10-19 | 2011-04-12 | Microsoft Corporation | Binding to business objects and web services |
US7711740B2 (en) | 2004-10-19 | 2010-05-04 | Microsoft Corporation | Data access layer design and code generation |
US7882317B2 (en) | 2004-12-06 | 2011-02-01 | Microsoft Corporation | Process isolation using protection domains |
-
2005
- 2005-08-30 US US11/215,178 patent/US7716656B2/en not_active Expired - Fee Related
-
2006
- 2006-08-04 KR KR1020087001564A patent/KR20080038306A/ko not_active Application Discontinuation
- 2006-08-04 CN CNA2006800314731A patent/CN101253477A/zh active Pending
- 2006-08-04 WO PCT/US2006/030589 patent/WO2007027366A1/en active Application Filing
Also Published As
Publication number | Publication date |
---|---|
WO2007027366A1 (en) | 2007-03-08 |
KR20080038306A (ko) | 2008-05-06 |
US7716656B2 (en) | 2010-05-11 |
US20070050380A1 (en) | 2007-03-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101253478A (zh) | 类型推理和类型导向的后期绑定 | |
CN108885545B (zh) | 用于实时数据流编程语言的工具和方法 | |
CN108388425B (zh) | 一种基于lstm自动补全代码的方法 | |
CN101253477A (zh) | 可空和后期绑定 | |
CN111736840A (zh) | 小程序应用的编译方法、运行方法、存储介质及电子设备 | |
EP1693751A2 (en) | Relationship modeling | |
US8296735B2 (en) | Inter-procedural analysis of computer programs | |
CN105446725B (zh) | 用于模型驱动开发的方法和系统 | |
US20210232630A1 (en) | Methods and systems for creating networks | |
CN101253476A (zh) | 句法程序语言翻译 | |
CN107273109B (zh) | 对源代码建模的方法和系统以及使用数据模型的方法 | |
US9201761B1 (en) | Debugging data format conversion | |
CN108027721A (zh) | 用于使用控件来配置通用程序的技术 | |
US20140298290A1 (en) | Identification of code changes using language syntax and changeset data | |
US20110054654A1 (en) | Creating Genetic Devices | |
CN116406459A (zh) | 一种代码处理方法、装置、设备及介质 | |
Naujokat et al. | Domain-specific code generator modeling: a case study for multi-faceted concurrent systems | |
US11500619B1 (en) | Indexing and accessing source code snippets contained in documents | |
US20150121337A1 (en) | Regular expression support in instrumentation languages using kernel-mode executable code | |
CN113377342B (zh) | 一种项目构建方法、装置、电子设备及存储介质 | |
Alizadehsani et al. | Modern integrated development environment (ides) | |
CN111898762B (zh) | 深度学习模型目录创建 | |
CN113946324A (zh) | 一种展示高通量测序数据结果的交互式可视化报告系统 | |
CN114385155A (zh) | vue项目可视化工具生成方法、装置、设备及存储介质 | |
CN112596737A (zh) | 一种函数调用关系的扫描方法、系统、设备及存储介质 |
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 |
Open date: 20080827 |