專利名稱::用于聲明性數(shù)據(jù)腳本語言的類型系統(tǒng)的制作方法
技術領域:
:本主題公開內(nèi)容一般地涉及用于聲明性數(shù)據(jù)腳本語言的有表現(xiàn)力的、緊湊的且靈活的類型系統(tǒng)。背景作為一般的背景,腳本語言是控制軟件系統(tǒng)、應用程序和程序的編程語言。腳本常常被不同于“程序”對待,它獨立于其他應用程序而執(zhí)行。另外,腳本可以不同于應用程序的“核心代碼”,它可以用不同的語言來寫成。腳本可以由開發(fā)者或其他程序以源格式或目標格式來編寫,它覆蓋了在人類友好或機器友好或均不友好的方面的全部范圍。當最終用戶可訪問時,腳本允許應用程序的行為適應用戶的需要。還可以從源代碼解釋腳本,或被“半編譯”成字節(jié)碼或被解釋的另一機器友好的格式。腳本語言還可以被嵌入在它們與之關聯(lián)的應用程序中。對于進一步的背景,類型系統(tǒng)定義編程語言如何將值和表達式分類成類型、它可以如何操縱那些類型和它們?nèi)绾谓换?。類型將值或一組值標識為具有成特定的含義或目的,盡管諸如抽象類型和函數(shù)類型等的一些類型可以不被表示成執(zhí)行的程序中的值。類型系統(tǒng)在各語言之間顯著地不同,例如,連同其他種類的差異一起,類型系統(tǒng)可以隨它們的編譯時語法和運行時操作實現(xiàn)而不同。對于如何使用各類型的示例,編譯器可以使用靜態(tài)類型的值來優(yōu)化存儲以及用于對該值的操作的算法選擇。在許多C編譯器中,例如,根據(jù)單精度浮點數(shù)的公認的標準,以32位來表示標稱(nominal)類型化的“浮點”數(shù)據(jù)類型。C因而對那些值使用浮點專用的操作,例如,浮點加、乘等等。另外,類型約束條件的深度以及它們的評估的方式可以影響語言的類型化。在一些情況中,開發(fā)者即人類創(chuàng)建定義源代碼的文本,編譯器將該語言翻譯成一種或多種機器友好的格式以供給定的平臺執(zhí)行目標代碼。在其他情況中,應用程序或機器本身可以生成代碼以供跨越數(shù)據(jù)存儲執(zhí)行,在代碼生成時不涉及人類。在任一種情況中,期望保持語言緊湊但也高度有表現(xiàn)力的和合乎邏輯的高效的、合乎邏輯的且有表現(xiàn)力的類型系統(tǒng),以使得可以連同高效的存儲表示一起生成高效的和結構緊湊的數(shù)據(jù)密集的應用程序。然而,常規(guī)的編程語言的類型系統(tǒng)對于大規(guī)模數(shù)據(jù)處理和消費的復雜性來說不是足夠通用和足夠靈活的。簡而言之,當涉及大量的數(shù)據(jù)時,類型系統(tǒng)的任何復雜性或靈活性的缺乏以及所關聯(lián)的低效率會按指數(shù)或不成比例地放大。因此,當大量的數(shù)據(jù)被存儲在數(shù)據(jù)庫中時,例如當一組服務器計算機在長時間段內(nèi)收集大量數(shù)據(jù)的記錄或事務時,開發(fā)者、其他計算機、其他應用程序等等可能希望經(jīng)由一個或多個腳本訪問數(shù)據(jù)或數(shù)據(jù)的有針對性的子集。編程類型構造這樣的腳本的效率和所得到的數(shù)據(jù)結構的可被表示的得到的簡單性變成重要的目標,尤其是在這樣的腳本針對巨量的數(shù)據(jù)而操作時。舉例來說,可能希望經(jīng)由一個或多個方法、腳本或程序查詢一些數(shù)據(jù)的某個子集、讀取或寫入數(shù)據(jù)、更新數(shù)據(jù)或對數(shù)據(jù)應用任何其他處理。給定計算領域中的數(shù)據(jù)值的多樣性,豐富地和高效地表達類型的能力可以顯著地改善數(shù)據(jù)密集的應用程序和程序的所得到的性能。因而存在對帶有解決用于大規(guī)模數(shù)據(jù)處理系統(tǒng)的當前類型系統(tǒng)的這些和其他不足的類型系統(tǒng)的編程語言的長期需求。上面所描述的編程語言的當前類型系統(tǒng)的背景信息和不足僅僅旨在提供常規(guī)系統(tǒng)的背景信息和問題中的一些的一般概覽,且不旨在是詳盡的。常規(guī)系統(tǒng)的其他問題和在此描述的各種非限制性實施例的相應益處可以在查看下列描述后變得進一步明顯。概述在此提供簡化的概述以便幫助允許對在更詳細的描述和附圖中出現(xiàn)的示例性的、非限制性的實施例的各種方面的基本理解或一般理解。然而,本
發(fā)明內(nèi)容不旨在作為廣泛概覽或詳盡概覽。相反,本
發(fā)明內(nèi)容的唯一目的是作為后續(xù)各個實施例的更詳細的描述的序言而以簡化形式呈現(xiàn)與一些示例性非限制性實施例相關的一些概念。提供高效的、合乎邏輯的且有表現(xiàn)力的類型系統(tǒng)的各個實施例,以便用于靈活地定義聲明性編程語言的類型,使得可以生成高效的且結構上緊湊的數(shù)據(jù)密集的應用程序。在一個非限制性方面中,該類型系統(tǒng)支持精化(refinement)類型和類型成員表達式的組合。連同其他非限制性的方面一起,與包括所有有效值作為成員的頂端類型(toptype)組合,各類型可以被表示成其他類型的交和/或并。因而,可以為在真實世界數(shù)據(jù)的大規(guī)模集合中存在的全部數(shù)據(jù)類型高效地表示類型。下面更詳細地描述這些和其他實施例。附圖簡述參考附圖進一步描述各種非限制性的實施例,附圖中圖1是用于聲明性編程語言和相關結構的編譯過程鏈的框圖;圖2是闡釋在此描述的一個或多個實施例中的類型系統(tǒng)的示例性方面的第一框圖;圖3是闡釋在此描述的一個或多個實施例中的類型系統(tǒng)的示例性方面的第二框圖;圖4是闡釋在此描述的一個或多個實施例中的類型系統(tǒng)的示例性方面的第三框圖;圖5是闡釋能夠實現(xiàn)兩個或更多個類型的交的類型系統(tǒng)的框圖;圖6是闡釋能夠聯(lián)結兩個或更多類型或執(zhí)行兩個或更多類型的并操作的類型系統(tǒng)的框圖;圖7是闡釋具有對空類型來說可否定(negatable)的頂端類型的類型系統(tǒng)的框圖;圖8是闡釋按照一實施例用于根據(jù)包括支持類型精化和類型成員的類型系統(tǒng)的聲明性編程模型來定義聲明性代碼的過程的流程圖;圖9是根據(jù)一實施例用于根據(jù)具有復雜類型系統(tǒng)的聲明性編程模型來執(zhí)行聲明性代碼的計算系統(tǒng)的框圖;圖10是闡釋根據(jù)一實施例用于由計算設備的至少一個處理器執(zhí)行聲明性代碼的過程的流程圖;圖11是用于由實施例封裝的聲明性模型的示例性過程鏈;圖12是與面向記錄的執(zhí)行模型相關聯(lián)的類型系統(tǒng)的闡釋;圖13是按照一實施例與基于約束的執(zhí)行模型相關聯(lián)的類型系統(tǒng)的非限制性闡釋;圖14是根據(jù)經(jīng)排序的執(zhí)行模型的數(shù)據(jù)存儲的闡釋;圖15是根據(jù)次序無關的執(zhí)行模型的數(shù)據(jù)存儲的非限制性的闡釋;圖16是表示其中可以實現(xiàn)在此描述的各個實施例的示例性非限制性網(wǎng)絡化環(huán)境的框圖;以及圖17是表示其中可以實現(xiàn)在此描述的各個實施例的一個或多個方面的示例性非限制性的計算系統(tǒng)或操作環(huán)境的框圖。詳細描述概覽如背景中所討論,常規(guī)類型系統(tǒng)具有限制所得到的程序的可表達性且限制所得到的存儲結構和算法處理的效率的某些復雜性和不靈活性等。當大規(guī)模執(zhí)行例如結合大規(guī)模數(shù)據(jù)存儲和處理系統(tǒng)執(zhí)行時,尤其感受到常規(guī)系統(tǒng)的這樣的不足。D是由微軟設計的編程語言,它很適合于編寫數(shù)據(jù)密集的程序。D的類型化系統(tǒng)支持允許語言可表達性的協(xié)作的唯一特征的組合,語言可表達性包括但不限于表達程序的兩個或更多個不同類型的并和/或交的能力。舉例來說,在一個實施例中,該類型系統(tǒng)支持精化類型和類型成員表達式的組合。該類型系統(tǒng)還包括包含所有有效值作為成員的頂端類型。作為用于在此相對于聲明性編程模型和語言的上述類型系統(tǒng)陳述的各個實施例的上下文而提供D編程語言。然而,應明白,在此描述的各個實施例可以被應用到關于其編程構件和其他定義特性具有與D相同的或相似的能力的任何聲明性編程語言。在這一點上,常常希望用聲明性編程語言編寫源代碼,聲明性編程語言常常被認為是命令性編程語言的對應物。不像命令性編程語言,聲明性編程語言允許用戶寫下他們想要從他們的數(shù)據(jù)得到什么且不必指定針對給定的技術或平臺如何滿足那些希望。因而,在此預期一個或多個實施例中陳述的包括類型系統(tǒng)的任何聲明性語言,而不只是以D編程語言為基礎的各實施例,盡管D是示例性偽代碼和概念闡釋的合適的源。在這一點上,在下面給出關于D編程語言的更多細節(jié),D編程語言是很適合于緊湊的且人類可理解的表示的聲明性編程語言,且有利地包括用于創(chuàng)建和修改數(shù)據(jù)密集的應用程序的有效構件,而獨立于無論是閃存、關系數(shù)據(jù)庫、RAM、外部驅動器、網(wǎng)絡驅動器等等的底層存儲機制,“D”有時還被稱為“M”編程語言,盡管出于一致性,在此不使用對M的引用。D包括用于編寫聲明性源代碼的高效的和緊湊的語法,包括具有準許將該語言用于例如數(shù)據(jù)密集的應用程序的性能的類型系統(tǒng)。更具體地,在此所描述的類型系統(tǒng)允許使用有表現(xiàn)力的類型系統(tǒng)來靜態(tài)地驗證數(shù)據(jù)密集的應用程序。在這一點上,在一個實施例中,將“頂端”類型(在D中寫成Any(任何))、精化類型(其中類型可以由任意的布爾表達式限定)組合起來,并將類型測試表達式包括在精化表達式語言中。用于數(shù)據(jù)腳本語言的類型系統(tǒng)下面陳述關于用于數(shù)據(jù)腳本語言的類型系統(tǒng)的各實施例的另外的細節(jié),但是首先在圖1中闡釋關于根據(jù)D編譯鏈可表示和使用D程序的不同方式的某種上下文。舉例來說,源代碼100可以直接由開發(fā)者或機器撰寫。源代碼100可以由D編譯器110編譯,D編譯器Iio包括例如用于分析源代碼100的D語法分析程序120和用于形成D句法樹的D句法樹組件130,然后可以分析D句法樹并將其變換成D圖結構140。D圖結構140可以由開發(fā)者直接生成,且還可由應用程序生成,并以緊湊方式表示。D圖結構140可以被解開成樹130并回退到源代碼100,且根據(jù)諸如SQL數(shù)據(jù)庫查詢、企業(yè)數(shù)據(jù)管理(EDM)、電子表格應用程序、圖形應用程序等的各種域專用的使用150(即可以存儲和分析數(shù)據(jù)的任何地方),D圖結構140可以被編譯或半編譯成與數(shù)據(jù)密集的應用程序結合的目標代碼。諸如D編程語言等的類型化語言是指該語言的變量可以假設的值域是有界的概念。這樣的值域的上界被稱為類型。類型系統(tǒng)是記住變量的類型且一般地記住程序中的所有表達式的類型的類型化語言的組件。可以在“D”中指定和檢查的各類型不被常規(guī)系統(tǒng)所允許,且下面更詳細地描述這樣的類型。如所提到的,在各種非限制性的實施例中,本發(fā)明提供用于數(shù)據(jù)腳本語言的類型系統(tǒng),該類型系統(tǒng)組合精化類型和精化語言的類型測試表達式,以便允許簡單但豐富的類型語言。在一個實施例中,支持頂端類型,頂端類型與精化類型和精化語言的類型測試表達式的組合得到該類型語言的進一步的表達性。使用此有表現(xiàn)力的類型系統(tǒng),可以靜態(tài)地驗證數(shù)據(jù)密集的應用程序。如圖2的框圖中所示出,在一個實施例中,諸如D編程語言等的聲明性編程語言包括形成程序的部分的各種編程構件200。系統(tǒng)、應用程序、服務可以指定這樣的構件200或針對(諸)數(shù)據(jù)存儲260作為D程序而執(zhí)行它們,以便取得數(shù)據(jù)密集的結果。在一個非限制性的方面中,編程構件200下的編程模型的類型系統(tǒng)250包括對各精化類型210的組合和在精化類型210的表達式內(nèi)的類型成員評估220的支持。在這一點上,各精化類型的組合和對在精化類型表達式內(nèi)的類型成員評估的支持不受常規(guī)系統(tǒng)支持。如圖3的框圖中所示出,除了類型系統(tǒng)250的能力之外,類型系統(tǒng)350還可以包括包含所有有效值330的頂端類型。換句話說,頂端類型是在具有頂端類型的編程模型中出現(xiàn)的任何類型中最少受約束的類型。如圖4的框圖中所示出,可選地,除了其他能力之外,類型系統(tǒng)450還可以包括對作為類型的值420以及作為值的類型410的支持。“D”中的類型包括諸如整數(shù)、文本和邏輯等的典型原始類型、以及被寫成f(意指類型T的值的集合)的集合類型、以及被寫成{11:T1,...,1η:Τη}(意指帶有分別為類型Tl,...,Tn的字段11,...,In的實體)的實體或記錄類型。在上面所描述的用于數(shù)據(jù)腳本語言的類型系統(tǒng)的一種實現(xiàn)中,類型系統(tǒng)支持被寫成Any的“頂端”類型。所有有效的D值是此“最少受約束”類型的值。另外,支持精化類型,精化類型可以被寫成{值TIe},其中值是標識符,T是類型且e是布爾值表達式,例如,用于精化類型的“D”語法簡單地是“Twheree(當e為真時的Τ)”。這樣的類型的值是其布爾表達式e等于真的類型T的有效“D”值。例如,值42是類型{χ=Integer(整數(shù))|x>41}的成員,這是因為值42是類型整數(shù)且由于42確實大于41而滿足測試χ>41。對于其它示例,值43也是此類型的成員,但40不是。另外,類型系統(tǒng)支持精化的布爾值表達式。支持“與”、“或”、“非”、“暗示”的布爾表達式形式,且另外該類型系統(tǒng)包括寫成“einT(Τ中e)”的表達式的類型成員測試或類型測試。該類型測試表達式的操作行為是對表達式e求值并判斷所得到的值是否在類型T的值的集中。在這一點上,將類型系統(tǒng)的上面的特征組合在一起得到用于定義類型的一些強大的和優(yōu)雅的表達式。例如,圖5闡釋第一非限制性益處,該益處是可以以單個緊湊的表達式定義類型520,該表達式是兩者均由基于約束的或結構類型化定義的第一類型500和第二類型510的交。類型S和T的交類型可以被表達為如下{x:Any|xinT&&xinS(χ任何|Τ中的χ與S中的χ的交)}圖6闡釋另一非限制性益處,即,類型620可以以單個緊湊的表達式來定義,該表達式是兩者均由基于約束的或結構類型化定義的第一類型500和第二類型510的并。類型S和T的并類型可以被表達為如下{x=Any|xinT||xinS(χ任何|T中的χ與S中的χ的并)}帶有頂端類型或頂級類型的類型系統(tǒng)的另一非限制性益處是空類型還可以被表達,如圖7中所示。通過否定頂端類型“Any”,可以表達是沒有有效類型的集合的空類型720。在D中,空類型可以被表達為如下{x=Any|false(χ任何|假)}為進一步理解,可以使用判斷的集合來在數(shù)學上描述類型系統(tǒng)。判斷是下列形式ΓΚ7其中J是某種斷言,其自由變量在Γ中聲明。上下文Γ是形式為0,xl:Tl,...,Χη:Τη的不同變量及其類型的經(jīng)排序列表。(空上下文0有時消失。)類型系統(tǒng)的主判斷形式是斷言在上下文Γ中表達式e具有類型T的類型化判斷,例如,在Γ中定義e的自由變量。這可以被聲明為如下Γ卜eT斷言e:T(即表達式e具有類型T的斷言)是關系。換句話說,給定的表達式可以被說成是具有許多類型。如果存在類型T使得ΓμeT,則表達式e被說成是在上下文r被適當類型化??梢酝ㄟ^給出基于被假定為有效的其他判斷來定義某些判斷的有效性的一組類型規(guī)則來指定(正式的)類型系統(tǒng)。另一判斷形式是斷言類型S是另一類型T的子類型的子類型化判斷,且其被寫成如下。Γ卜S<:T“D”編程語言的類型系統(tǒng)可以通過給出定義這樣的判斷的一組類型規(guī)則來正式指定。例如,判斷類型測試表達式是否適當類型化是由下列類型規(guī)則定義的。Γl·e··S廠卜eInT·Logical換句話說,如果表達式是某種類型S,則在上下文Γ中表達式einT被適當類型化(且是類型Logical(邏輯))。另一規(guī)則允許引入子類型化。權利要求1.一種用于根據(jù)包括支持類型精化和類型成員的類型系統(tǒng)的聲明性編程模型定義聲明性代碼的方法,包括接收800聲明性編程語言的至少一個編程構件的規(guī)定,包括接收810通過指定對于其來說布爾表達式為真的值來定義至少一個類型的類型精化構件的規(guī)定,以及在所述類型精化構件內(nèi)接收判斷求值表達式所得到的一個或多個值是否所指示的類型的成員的類型成員測試構件的規(guī)定;以及基于所述至少一個編程構件的所述規(guī)定生成830代碼的機器可讀的表示。2.如權利要求1所述的方法,其特征在于,所述編程構件的所述規(guī)定的接收800包括接收在所述類型精化構件中指定的至少兩個類型的交的規(guī)定。3.如權利要求1所述的方法,其特征在于,所述編程構件的所述規(guī)定的接收800包括接收所述類型精化構件中指定的至少兩個類型的并的規(guī)定。4.如權利要求1所述的方法,其特征在于,所述編程構件的所述規(guī)定的接收800包括接收所述類型精化構件中指定的至少兩個類型的并和至少兩個類型的交的規(guī)定。5.如權利要求1所述的方法,其特征在于,所述至少一個編程構件的所述規(guī)定的接收800包括接收820頂端類型的規(guī)定,所有類型滿足所述頂端類型的條件。6.如權利要求1所述的方法,其特征在于,所述接收800包括接收具有句法“Any”820的編程構件。7.如權利要求1所述的方法,其特征在于,所述至少一個編程構件的所述規(guī)定的接收800包括接收空類型的規(guī)定,沒有表達式滿足所述空類型的條件。8.如權利要求1所述的方法,其特征在于,所述空類型的所述規(guī)定的接收800包括接收頂端類型在邏輯上被否定的規(guī)定,所述頂端類型是所有表達式所屬于的類型。9.一個計算機系統(tǒng),包括至少一個計算機可讀模塊930,包括表示根據(jù)實現(xiàn)支持基于約束的類型精化和類型成員的類型系統(tǒng)的聲明性編程模型的聲明性代碼的計算機可執(zhí)行指令,所述至少一個計算機可讀模塊包括編程構件,所述編程構件包括通過相對于表示所有類型的不受限頂級類型形成類型來定義所述類型的所述類型系統(tǒng)的精化類型,且其中所述編程構件的所述精化類型包括類型測試構件,所述類型測試構件針對所指示的類型的成員測試表達式的求值;以及包括數(shù)據(jù)的至少一個數(shù)據(jù)存儲950,關于所述數(shù)據(jù)至少一個計算機可執(zhí)行指令執(zhí)行以便基于所述聲明性代碼的所述編程構件執(zhí)行所述數(shù)據(jù)的訪問、修改、過濾、變換、版本化或處理中的至少之一。10.如權利要求9所述的系統(tǒng),類型檢查模塊940對所述至少一個計算機可讀模塊的至少一個類型求值,以便基于定義所述編程構件的類型化的有效性的至少一個規(guī)則判斷錯誤。11.如權利要求9所述的系統(tǒng),其特征在于,所述類型檢查模塊940通過增加所述聲明性代碼的所述表示來輸出被包括在所述至少一個計算機可讀模塊中的類型檢查信息。12.如權利要求9所述的系統(tǒng),其特征在于,各類型具有值,且各值具有類型。13.如權利要求9所述的系統(tǒng),其特征在于,所述編程構件包括所述類型精化構件中指定的至少兩個類型的交的規(guī)定。14.如權利要求9所述的系統(tǒng),其特征在于,所述編程構件包括所述類型精化構件中指定的至少兩個類型的并的規(guī)定。15.如權利要求9所述的系統(tǒng),其特征在于,所述編程構件包括所述類型精化構件中指定的至少兩個類型的并和至少兩個類型的交的規(guī)定。16.如權利要求9所述的系統(tǒng),其特征在于,所述編程構件包括頂級類型的規(guī)定,對于所述頂級類型,所有有效類型是成員。17.一種用于由計算設備的至少一個處理器執(zhí)行聲明性代碼的方法,包括對于所述計算設備的執(zhí)行,接收1000根據(jù)類型化系統(tǒng)指定的聲明性程序,所述類型化系統(tǒng)在所述聲明性程序的編程構件內(nèi)支持通過精化的類型化、類型成員的求值和所述聲明性程序的所有有效值是其成員的頂端類型;以及根據(jù)與所述類型化系統(tǒng)相關聯(lián)的一組類型化規(guī)則以及判斷來對所述聲明性程序中表示的所述類型進行類型檢查1020。18.如權利要求17所述的方法,其特征在于,所述接收1000所述聲明性程序包括接收根據(jù)支持具有值的類型和具有類型的值的類型化系統(tǒng)的聲明性程序。19.如權利要求17所述的方法,其特征在于,所述接收1000所述聲明性程序包括接收作為表示所述聲明性程序的至少兩個類型的交的交類型的類型的定義。20.如權利要求17所述的方法,其特征在于,所述接收1000所述聲明性程序包括接收作為表示所述聲明性程序的至少兩個類型的并的并類型的類型的定義。全文摘要提供用于靈活地定義聲明性編程語言的各類型的高效的、合乎邏輯的和有表現(xiàn)力的類型系統(tǒng),以使得可以生成高效的且結構上緊湊的數(shù)據(jù)密集的應用程序。該類型系統(tǒng)支持精化類型和類型成員表達式的組合,并支持包含所有有效值作為成員的頂端類型。借助于該類型系統(tǒng),各類型可以被表達成其他類型的交和/或并。因而,可以為真實世界數(shù)據(jù)存儲中存在的全部數(shù)據(jù)類型高效地表示類型。文檔編號G06F17/00GK102171681SQ200980140409公開日2011年8月31日申請日期2009年9月30日優(yōu)先權日2008年10月3日發(fā)明者A·D·高登,B·H·洛夫林,D·E·蘭沃西,D·F·伯克斯,G·柏曼,J·C·施利梅爾,J·D·多蒂申請人:微軟公司