專利名稱:基于動態(tài)集合屬性的計算機編程語言方法
技術領域:
本發(fā)明涉及(例如,通過編譯或解釋)將輸入程序自動翻譯成計算機可執(zhí)行的輸 出表示。背景動態(tài)集合是用于計算機編程的、在運行時可具有可變的元素數(shù)目的數(shù)據(jù)元素。盡 管動態(tài)集合被廣泛地使用,但是目前它們會導致顯著的編程復雜度。其原因可以結合對在 面向對象設置中實現(xiàn)動態(tài)集合的簡要描述來更好地領會。典型情況下,此類實現(xiàn)包括一組 接口規(guī)程,后者操縱被選擇來實現(xiàn)該集合的潛藏數(shù)據(jù)結構。這些接口規(guī)程通常是訪問或 者改變該集合的潛藏數(shù)據(jù)的唯一途徑,因此該組接口規(guī)程典型情況下被稱為該集合的“接 口”。集合可以是由應用定義的類型(ADT)的一部分,并且在這類情形中,對ADT的實例的 操作依賴于作為ADT接口的一部分提供的集合接口。對集合的接口的人工編碼是相對困難且容易出錯的編程。實現(xiàn)對集合的簡單操作 往往要求復雜的接口代碼以用對復雜的潛藏數(shù)據(jù)結構的個體動作的形式來表達頂層集合 操作。另一困難在于疏漏對集合可能處于的所有狀態(tài)的考慮很容易將微妙的錯誤引入程序 中。例如,如果集合B旨在成為集合A的克隆,那么容易明白與A有關的添加和刪除也應當 對B進行。然而,這并不足以使B成為A的克隆。還必需確保當B被創(chuàng)建時,在代碼中提供 A的所有可能的狀態(tài)以初始化B。如果B是在A之前創(chuàng)建的,那么會出現(xiàn)進一步的復雜情況。 提供此類接口時固有的復雜性目前是驅動編程語言的進一步演進的因素之一。例如,由C++ 標準模板庫提供的集合模板本質上使用C++語言的每個特征,并且Java和C#語言最近也 已擴展成提供對類屬的支持以便于集合的實現(xiàn)。在一些境況中,可以用常規(guī)方法來降低應對動態(tài)集合的復雜性。例如,一些語言提 供實為動態(tài)集合的數(shù)據(jù)類型(例如,列表、可變長度數(shù)組、等等)。在此類情形中,涉及這些 數(shù)據(jù)類型的操作由程序員編碼起來要比用以上辦法更簡單。例如,如果A和B是作為語言 類型提供的可變長度的浮點數(shù)組,那么程序語句A+B可以使翻譯器自動生成在恰適的數(shù)組 索引范圍上執(zhí)行所暗指的逐元素加法的代碼。這顯著減少了程序員的負擔。 然而,此類基于類型的集合不是針對以上所描述的困難的完全案。其主要原因在 于,已發(fā)現(xiàn)動態(tài)集合的相當高程度的設計和實現(xiàn)靈活性在實踐中是高度合乎需要的。多種 多樣的動態(tài)集合數(shù)據(jù)結構各自具有其優(yōu)點和缺點,并且每個此類數(shù)據(jù)結構典型情況下還具 有多種多樣的實現(xiàn),其中沒有一種對于所有情形而言都是最優(yōu)的。因此,迄今還不可能設 計出實用(即,可理解的輸入代碼、高效率的輸出代碼、和合理的翻譯器復雜度)的、籠統(tǒng) 地提供動態(tài)集合類型的通用編程語言。取而代之的是,如在像LISP之類的語言中那樣,典 型情況下由該語言提供一個(或者至多幾個)動態(tài)集合類型(例如,對于LISP而言是列 表)。對于能容易地映射到由語言提供的動態(tài)集合類型的問題而言,此類語言可以是非常有 效的。然而,對于并不能容易地映射到由語言提供的動態(tài)集合類型的問題而言,此類語言往 往性能不良。因此,現(xiàn)在對動態(tài)集合的處置典型情況下是根據(jù)以下兩種辦法之一來執(zhí)行的1)一般辦法(例如,面向對象編程中的接口),其提供了實踐中所需要的多樣性和靈活性,但 是招致接口編碼很復雜的缺點;以及2)專用辦法(例如,LISP、HaSkell等),其提供了對一 些種類的動態(tài)集合的簡化的基于類型的處置,但是可能已降低了重要的實用應用的性能。相應地,在本領域中提供比以上所描述的對接口的人工編碼顯著簡單而不會顯著 降低性能的用于處置動態(tài)集合的一般辦法將是一大進步。概述 根據(jù)本發(fā)明的諸實施例,通過由程序員提供對動態(tài)集合的集體特性的指定來達成 對動態(tài)集合的簡化處置。對集體特性的此類指定的本質和效用可以通過重新訪問常規(guī)的面 向對象編程中的集合接口的主題來更好地領會。與此類接口有關的困難中有很大一部分可 以歸因于常規(guī)的集合接口對于翻譯器而言完全不透明這一事實。盡管集合很有可能是對具 有定義明確的語義特性的已知數(shù)據(jù)結構的實現(xiàn),但是翻譯器所能看到的一切僅僅是數(shù)據(jù)結 構以及應對這些數(shù)據(jù)結構的一組規(guī)程。典型情況下,翻譯器無法從原始輸入代碼演繹出這 些語義特性,即使在集合的語義特性是從這些數(shù)據(jù)結構和規(guī)程得出的情況下亦是如此。因 此,翻譯器通常不能提供任何比類型檢查更實質性的檢錯。通過允許程序員指定動態(tài)集合的集體特性,根據(jù)本發(fā)明的諸實施例,翻譯器就能 夠檢查與所指定的特性不一致的代碼并生成翻譯時錯誤。更強大地,對動態(tài)集合的集體特 性的指定可被用來減少提供此類接口的編程負擔。例如,翻譯器可以提供可供程序員在編寫接口代碼時依賴的一組原語集合操作。 對集合的集體特性的指定允許翻譯器選擇對所指定的特性而言最恰適的一組原語操作。如 果給定的原語規(guī)程(例如,訪問器)的所有版本具有相同的編程接口,那么程序員不需要關 心這些原語規(guī)程的取決于指定的集體特性的實現(xiàn)細節(jié)。集合的集體特性異于該集合的從其成員的類型得出的類型-成員特性。更正式 地,集合的類型-成員特性是該集合的任何從其成員的類型(和類型限定符)得出的特性。 例如,如果集合G按類似于C++的術語而言是一組“ const int (常整數(shù))”,那么G中的元素 在初始化之后不可更改這一特性即為G的從其成員是用類型限定符“const (常數(shù))”聲明 而得出的成員_類型特性。G的其元素為int (整數(shù))這一特性也是G的類型-成員特性。集合的集體特性是該集合的1)涉及該集合本身的、且2)異于該集合的類型_成 員特性的任何指定特性。(如以上所考慮的)操作符適用性便是集體特性的一個示例。以 下詳細描述集體特性的其他示例。根據(jù)本發(fā)明的優(yōu)選實施例,具有指定的集體特性的動態(tài)集合是由應用定義的類型 的屬性,并且因此在本申請通篇中常被稱為動態(tài)集合屬性(DCA)或者為了簡明起見稱為 “屬性”。此處,“屬性”根據(jù)其在計算機科學中的標準含義之一被用作“較大結構的成員”。 然而,可能有在其中根據(jù)本發(fā)明的實施例的動態(tài)集合是全局的(即,不被包含在全局程序 范圍的任何子范圍中)的一些境況。為了便于闡明,此類動態(tài)集合在以其為成員的較大結 構是輸入程序的整體的意義下也被認為是“屬性”。為了更好地領會本發(fā)明,將本發(fā)明的實施例與用于處置動態(tài)集合的常規(guī)方法相比 較和對照會是有幫助的。如以上所描述的,常規(guī)的用于處置動態(tài)集合的一般辦法往往涉及 廣泛且困難的接口編程,例如,如在面向對象辦法中那樣。在本發(fā)明的實施例中,通過對集 體特性的指定、以及優(yōu)選地通過使用由翻譯器提供的取決于指定的集體特性的原語集合規(guī)程,通性得以保持并且接口處的簡單性得以改善。例如,指定的集體特性可以是潛藏數(shù)據(jù)結 構(例如,對于列表而言是單鏈的或雙鏈的)。如果指定了是單鏈的,那么翻譯器提供基于 單鏈列表數(shù)據(jù)結構的一組原語規(guī)程。如果程序員指定了是雙鏈的,那么所提供的一組原語 規(guī)程基于雙鏈列表數(shù)據(jù)結構。本發(fā)明的諸實施例的這個方面可被認為提供了一般化的原語 集合接口,并且重要的是應注意將由翻譯器供應的原語規(guī)程的數(shù)目不會過大。目前,由翻譯 器提供的具有四個規(guī)程(訪問器、轉變器、刪除、以及迭代器實例化)的原語集合接口看來 對于通用編程而言是充分的。
另一種用于應對動態(tài)集合的常規(guī)辦法是為一些種類的動態(tài)集合提供語言類型但 不為其他種類提供。因此,往往會喪失通性。與之對比,在本發(fā)明的實施例中,通過提供有 充分表達力的一組集體特性以涵蓋有實踐意義的境況來保持通性。
重要地且令人驚訝地,已發(fā)現(xiàn)集體特性往往在其對翻譯器實現(xiàn)的作用的意義上是 正交的或者幾乎正交的。在本上下文中,正交性可由簡單的假想示例來解釋。假設有10個 集體特性,并且每個集體特性可以具有二值之一。那么有21°種相異的可能的特性組合。如 果集體特性對翻譯器實現(xiàn)的作用是完全正交的,那么翻譯器將需要包括大約10個代碼塊, 每個特性一塊。如果集體特性對翻譯器實現(xiàn)的作用是完全不正交的,那么在翻譯器中將需 要約21°= IOM個代碼塊,每種特異的特性組合一塊。近正交性將描述在其中用以計及相 異的集體特性之間的交互的額外代碼塊的數(shù)目相對較小的境況。
已在實踐本發(fā)明的實施例中觀察到的此正交性或近正交性是有意義的,因為如果 集體特性交互不具有此令人滿意的特征,那么要為對通性具有充分表達力的一組集體特性 提供對于實際使用而言充分簡單的翻譯器看來將是不可能的。
在本發(fā)明的一個實施例中,提供了一種用于自動地將輸入代碼翻譯成計算機可執(zhí) 行的輸出程序表示的方法。此方法的第一步驟是提供輸入源程序,其中該輸入源程序是以 提供動態(tài)集合屬性(DCA)的語言來表達的。動態(tài)集合屬性是能夠在運行時具有可變的被索 引成員數(shù)目的數(shù)據(jù)元素。
DCA具有由這些DCA的被索引成員的類型決定的成員-類型特性,并且該語言進一 步提供對這些DCA的異于成員-類型特性的集體特性的指定,正如以上所描述的那樣。輸 入源程序包括具有指定的集體特性的一個或更多個DCA實例,并且還包括涉及具有指定的 集體特性的這些DCA實例的一個或更多個表達式。集體特性可以藉由與特定DCA有關的語 句和/或藉由依賴由要在沒有任何超馳的顯式指定的情況下使用的語言所提供的默認集 體特性來顯式地指定。為簡單化,對DCA的“集體特性的指定”被理解為包括對集體特性的 默認和/或顯式指定。
此方法的第二步驟是根據(jù)這些指定的集體特性來自動地將此類表達式翻譯成相 應的計算機可執(zhí)行表達式表示。這些表達式表示被包括在作為輸出提供的計算機可執(zhí)行的 輸出程序表示中。
如以上所指示的,優(yōu)選地,輸入源程序中的DCA實例中的一個或更多個DCA實例是 由應用定義的類型的屬性,并且由此是可實例化范圍的組件??捎煞g器自動地為此類由 應用定義的類型提供輔助類型和操作符。
可以指定各種各樣的集體特性。此類集體特性包括但并不限于索引指定、索引唯 一性、索引管理模式、默認索引值、侵入性、排序、數(shù)據(jù)結構實現(xiàn)、訪問失敗時的行為、屬性改變時的迭代器行為、更新時的冪等性、實例化、事務性、并發(fā)安全性、刪除時的異常、在最后 外部引用時的刪除、與類型-范圍語義的關系、與其他屬性的約束關系、以及對狀態(tài)變化的 反應。以下更詳細地描述這些集體特性。
優(yōu)選地,這些表達式表示包括對一個或更多個原語DCA規(guī)程的調(diào)用,諸如訪問器、 轉變器、刪除規(guī)程、以及迭代器實例化規(guī)程。優(yōu)選地,原語訪問器是冪零的、無異常、且事務 性的。優(yōu)選地,原語轉變器是冪等的且事務性的,并且當且僅當所嘗試的改變失敗時才拋出異常。
如以上的表達式表示的生成可以藉由符合集體特性的關系來進行。此類關系可以 提供根據(jù)指定的集體特性來管控這些表達式表示的模板。
在一些情形中,與具有指定的集體特性的DCA有關的表達式是以聲明性語義(例 如,指定約束)來給出的。
在本發(fā)明的優(yōu)選實施例中,具有指定的集體特性的DCA可以從其他具有指定的集 體特性的DCA來派生。此機制可以支持創(chuàng)建依賴于其他DCA的虛DCA以實際上提供個體數(shù) 據(jù)成員的存儲。更簡單地,可以按此方式來提供DCA的別名和/或代理。
本發(fā)明的一些實施例的重要應用在于提供回調(diào)接口以便簡化實現(xiàn)收聽者模式。在 此類境況中,采用具有對其自己的狀態(tài)的變化有反應的集體特性的DCA。
具有指定的集體特性的DCA在其范圍內(nèi)可包括子類型和/或子DCA的聲明。此類 聲明具有各種應用,包括收聽者模式的實現(xiàn)。
本發(fā)明的實施例提供了若干關鍵優(yōu)點
1.作為由應用定義的類型的邏輯數(shù)據(jù)成員的、具有最小限度的人工指定(很大程 度上是藉由對集體特性的指定)的動態(tài)集合屬性能夠減少開發(fā)和測試時間。與屬性相關聯(lián) 的集體特性允許程序員將屬性專門化以匹配各種各樣的應用要求。
2.包含屬性的表達式和語句作為整體能由翻譯器自動地處置,由此消除了對用于 集合的操作進行的人工指定的控制流,這減少了開發(fā)時間并改善了軟件清楚性。
3.能夠在屬性聲明的上下文中支持聲明性語句和表達式,從而減少維護與集合有 關的狀態(tài)不變量所需要的軟件。
詳細描述
在本發(fā)明的優(yōu)選實施例中,編程語言提供“動態(tài)集合屬性”構造作為由應用定義的 類型的構成數(shù)據(jù)元素。動態(tài)集合屬性是由名稱、類型、索引以及由諸如排序、最大大小等集 體特性來指定的。它指明支持對所指定的類型的零個或更多個成員維護和引用的計算機構 造,每個成員由指定的屬性名稱和指定索引類型的索引值來指明。該屬性支持用于添加和 移除成員以及訪問現(xiàn)有成員的操作,包括在集合屬性中的所有成員上進行迭代、和修改現(xiàn) 有成員。它是包含該動態(tài)集合屬性的類型的實例的邏輯數(shù)據(jù)元素。
A.動態(tài)集合屬性指定
在本發(fā)明的一個實施例中,動態(tài)集合屬性可以由示例1中所解說的句法來指定。
-----------------------------------------------------------------------
type T {
Typename attrName[indexName]{
‘property1 = valuel ;6
~property2 = value2 ;operator+ ;…}…}
示例1 動態(tài)集合屬性指定-----------------------------------------------------------------------此示例在括起的類型范圍T內(nèi)聲明了名稱為“ attrName ”且類型為Typename 的由“indexName”索引的動態(tài)集合屬性,其中如所指定的那樣設置了特性propertyl和 property2等。還提供了對操作符“ + ”的支持。此處,indexName可以命名由Typename標 識的類型的字段,以處置索引字段在成員類型中的情形。替換地,indexName可以命名類型, 在此情形中,索引字段是由集合屬性實現(xiàn)的此類型的單獨字段。例如,應用軟件中的Experiment (實驗)類型可以具有定義在該類型的范圍內(nèi)的 集合屬性“浮點值”,如示例2中那樣。-----------------------------------------------------------------------type Experiment {float sample[Date]{~ ordered = bylndex ;operator+ ;…}…}示例2 集合屬性指定-----------------------------------------------------------------------此處,動態(tài)集合屬性“sample (樣本)”可以存儲可變數(shù)目個浮點值,每個浮點值由 Date(日期)類型的實例來表示。進而,該屬性具有按在索引類型上定義的排序來進行排序 的特性。那么,當翻譯器遇到以下語句-----------------------------------------------------------------------experimentO- > sample+ = 3. 0 ;示例3:典型語句-----------------------------------------------------------------------且其中“experimentO”是屬Experiment類型,則該翻譯器基于此屬性表示集合、 這些成員屬類型“浮點”、并且該集合支持操作符“ + ”的翻譯器知識來將此解釋為意味著向 “sample”屬性的每個成員加上值3。類似地,語句-----------------------------------------------------------------------experimentTotal- > sample+ = experimentl- > sample ;
示例4:典型語句-----------------------------------------------------------------------基于認識到各自均是支持操作符“ + ”的動態(tài)集合屬性而被翻譯成將 experimentl- > sample集合中的每個值力口至experimentTotal- > sample中的相應條目。另外,當遇到以下語句時-----------------------------------------------------------------------experimentO- > sample% = 3. 0 ;-----------------------------------------------------------------------翻譯器生成出錯消息,因為在此屬性或此屬性的類型上不支持模運算。舉另一示例而言,文件系統(tǒng)軟件中的DireCt0ry(目錄)類型可以具有定義在該類 型范圍內(nèi)的動態(tài)特性屬性“subdirectory (子目錄)”,如示例5中那樣。-----------------------------------------------------------------------Directory subdirectory[name]{、parent = dir ;— ordered = unordered ;、instantiating = true ;…}示例5 集合屬性指定-----------------------------------------------------------------------此處,該示例被指定為具有在每個子目錄中具有稱為“dir”的指向包含該子目錄 的那個目錄的后向指針字段的特性。該示例還被指定成是無序的和實例化的。在另一實施 例中,使翻譯器推斷subdirectory []是從其聲明為類型Directory而非Directory Ptr 來實例化的是可行的。更具體地,此聲明可被理解為指示此屬性在其轉變器中實例化 Directory實例,并且由此該轉變器將Directory的這組構造器參數(shù)取為其參數(shù)。(在此辦 法中,指定Directory :Ptr作為類型將意味著它是非實例化的,從而轉變器僅接受鍵以及 指向現(xiàn)有Directory實例的指針,或者如果鍵被存儲在Directory對象中則僅接受指針)。在一實施例中,對于可指定的特性中的每個特性均有特性關鍵字,類似于以上 “、arent”、“、rdered”等的示例。每個非顯式指定的特性被設置成默認值。具體而言,有 可被設置成特定的集合模板實現(xiàn)名稱的“ — dataStructure”特性。如果未被設置,那么該特 性默認為匹配于諸如ordered(有序)之類的其他特性的標準集合模板。使用此句法,編程語言就能指定動態(tài)集合屬性的各種各樣的變體。因此,該語言的 翻譯器具有動態(tài)集合屬性語義的完備知識以使其能夠實現(xiàn)涉及這些屬性以及實現(xiàn)對相關 聯(lián)的數(shù)據(jù)結構的原語操作的數(shù)據(jù)成員和規(guī)程的表達式。使用此知識,涉及動態(tài)集合屬性的高效率代碼實現(xiàn)表達式的生成被分成i)生成 實現(xiàn)對屬性的原語操作的規(guī)程,以及ii)生成對涉及屬性的、部分地使用對這些原語操作 規(guī)程的調(diào)用的表達式求值的祈使代碼。為簡明起見,我們在以下使用術語“屬性”來替代動態(tài)集合屬性。類似地,術語“屬性編程語言”和“屬性程序”應被理解為分別指本發(fā)明的基于動態(tài)集合屬性的語言、以及用此語言編寫的程序。下一章節(jié)描述這些原語操作及其語義。
B.屬性原語操作
對屬性的原語操作被標識為
i)訪問器
ii)轉變器
iii)刪除
iv)迭代器實例化
它們各自均優(yōu)選地由單獨的生成規(guī)程來實現(xiàn)。
屬性的訪問器規(guī)程取單個索引值為參數(shù)并返回該屬性的對應于此索引值的成員。 與諸如單體值或在其中訪問僅需要在指定偏移處從存儲器讀取的數(shù)組之類的固定大小的 數(shù)據(jù)成員形成對比,此規(guī)程可能需要對諸如紅黑樹之類的數(shù)據(jù)結構進行從頭到尾的巡航或 者從索引值計算散列值并在散列表中進行搜索。
轉變器規(guī)程將成員條目設置成對應于由其參數(shù)指定的形式,從而如果該屬性具有 實例化特性則創(chuàng)建成員對象。與在其中改變條目僅僅是在指定偏移處進行寫操作的固定大 小的數(shù)據(jù)成員形成對比,此規(guī)程可能需要實例化新對象、將該對象鏈接到復雜數(shù)據(jù)結構,并 且需要承擔以上的訪問操作的復雜性來確定該條目是否已經(jīng)存在。
刪除規(guī)程取索引值為參數(shù)并將該條目從該屬性中移除。與在其中沒有刪除能力的 固定大小的數(shù)據(jù)成員形成對比,此規(guī)程可能需要將對象從復雜數(shù)據(jù)結構解鏈接并且釋放該 對象,并且需要承擔訪問操作的復雜性以在這些動作之前定位到指定的條目。
迭代器實例化規(guī)程返回允許順序地引用屬性的個體成員的迭代器對象,默認初始 引用集合的首個成員或者指示空。對迭代器對象的遞增操作符使其引用該集合的下一成 員,或者如果沒有下一成員則提供空指示。
迭代器還提供對其當前正在引用的成員對象(若有)的索引值的訪問。與諸如單 個值或是由小整數(shù)指示的數(shù)組之類的固定大小的數(shù)據(jù)成員形成對比,屬性的索引類型可能 大且復雜,諸如可變長度字符串便是如此,并且屬性的成員數(shù)目與索引類型的可能值相比 可能很小,所以通過從某個初始值開始遞增索引值的方式在成員上進行迭代可能是不可行 的。
這些原語操作、或者實質上等效于這些原語操作的規(guī)程是必需的,因為涉及屬性 的表達式和語句可能引用或修改屬性的個體成員,要求移除成員或者要求對屬性的每個成 員執(zhí)行操作。通過簡單地遞增索引值來實現(xiàn)后者是不可行的,因為其可能具有如上那樣無 界的廣度。
這些原語操作是充分的,因為i)對特定成員或所有成員的狀態(tài)的訪問得到訪問 器和迭代器的支持,其中迭代器允許通過跳過不匹配子集準則的成員來訪問子集;ii)修 改屬性的狀態(tài)的其他操作可以通過讀取成員值、對成員值執(zhí)行單獨操作、并且用新值來寫 該成員值的方式實現(xiàn)。在需要在集合上進行迭代的操作的情形中,可以為集合中的每個成 員執(zhí)行此處理序列。
在一實施例中,翻譯器自動地生成與其在源輸入程序中遇到的對每個屬性的每個 原語操作相對應的規(guī)程。在迭代器實例化規(guī)程的情形中,翻譯器還生成支持相關聯(lián)的屬性 所要求的操作的迭代器對象類型。在屬性定義中指定附加操作,諸如示例2中指定的“ + ”9運算之類的情形中,翻譯器還生成執(zhí)行該操作的規(guī)程。在稍后章節(jié)中進一步描述這些規(guī)程 的生成。C.動態(tài)集合屬性表達式和語句當翻譯器遇到對引用屬性的表達式或語句的指定時,翻譯器生成每操作符有單獨 表達式節(jié)點的內(nèi)部表示,其中此節(jié)點使用本領域中公知的用于翻譯器的表達式和語句解析 技術來指明構成其操作數(shù)及其結果的屬性。例如,示例4的語句生成對應于“+ =”運算的 單個表達式節(jié)點,將“experimentl-> sample”指明為操作數(shù)并且將“experimentTotal-> sample”指明為結果位置。更復雜的表達式產(chǎn)生與已知的表達式樹類似的“表達式樹”,其 區(qū)別僅在于操作數(shù)可以是屬性或常規(guī)變量。處理序列隨后認識到此操作需要在由“experimentTotal- > sample”指明的屬性 的所有成員上進行迭代,并且由此生成以下各項的內(nèi)部表示i)調(diào)用迭代器實例化規(guī)程, )使用此迭代器的迭代循環(huán),以及iii)對由該迭代器標識出的每個成員執(zhí)行“+ =”運算。 因此,示例4的語句按類似于C++表示的內(nèi)部表示可被指明為 -----------------------------------------------------------------------for (Samplelterator i = experimentl- > samplelter () ;i ;++i) {experimentTotal- > samplelnc (i. index (),氺i);}示例6 語句的類似于C++的內(nèi)部表示-----------------------------------------------------------------------在此表示中,對“samplelter”的調(diào)用調(diào)起迭代器實例化規(guī)程,對“i. index"的調(diào) 用返回由該迭代器引用的成員的當前索引值,“*i”返回由迭代器“i”當前引用的成員的值, 并且“samplelnc”對應于對“experimentTotal- > sample”的指定成員的遞增運算。隨后使用編譯領域中已知的現(xiàn)有技術來將此內(nèi)部表示翻譯成可執(zhí)行代碼,只要 “ Samp 1 e Iterator ”類型、“ samp lelter"規(guī)程和“ samp 1 e ”訪問器規(guī)程被恰適地定義,那么在 給定示例6中的表示是正確的C++的前提下,這種翻譯是可行的。在優(yōu)選實施例中,翻譯器檢查在語句或表達式中指定的屬性相對于操作符而言是 否被允許。例如,在示例4的語句中,翻譯器檢查與“experimentTotal- > sample”屬性相 關聯(lián)的索引類型與“experimentl-〉sample”的索引類型是否兼容,對每個屬性的值類型 也類似地進行檢查。按此思路,將示例5的屬性“subdirectory”賦給示例2的“sample” 屬性將是錯誤的,因為索引類型和屬性類型不兼容。翻譯器還檢查結果屬性是否直接支持所指定的操作符,即以上情形中的“ + ”。例 如,如果“sample”屬性是在沒有指定“操作符+”特性的情況下定義的,那么翻譯器會將示 例4的語句翻譯成示例7中的類似于C++的表示。-----------------------------------------------------------------------for (Samplelterator i = experimentl- > samplelter () ;i ;++i) {float tmp = experimentalTotal- > sample(i. index());experimentTotal- > samplels (i. index (),tmp+氺i);} 示例7 語句的類似于C++的內(nèi)部表示[2]
-----------------------------------------------------------------------
此處,規(guī)程“samplels”指明用于此屬性的轉變器規(guī)程。在示例7中,遞增動作是由 訪問結果屬性的由索引指定的成員的當前值、藉由單獨的常規(guī)加法運算來遞增該當前值、 并且將結果寫回到結果屬性的此相同的由索引指定的成員的處理序列來執(zhí)行的。
作為另一示例,當翻譯器遇到示例3中指定的輸入源行時,該翻譯器如示例8中那 樣生成類似于C++形式的內(nèi)部表示。
-----------------------------------------------------------------------
for (Samplelterator i = experimentO- > samplelter () ;i ;++i) {
i- > inc(3. 0);
}
示例8 語句的類似于C++的內(nèi)部表示
-----------------------------------------------------------------------
即,與sample屬性相關聯(lián)的迭代器被用來訪問該集合中的每個成員,從而遞增每 個成員的值。此實現(xiàn)利用了示例2中為該屬性所指定的對“ + ”操作符支持的指定,該指定 提供了對在示例8中使用的迭代器的“ inc ”成員函數(shù)。
在沒有針對此屬性的“ + ”操作符指定的情況下,將使用單獨的加法運算而不是依 賴由屬性實現(xiàn)提供的功能性來將示例3表達式翻譯為示例9中那樣。
-----------------------------------------------------------------------
for (Samplelterator i = experimentO- > samplelter() ;i ;++i){
i- > valuels (i- > value () +3. 0);
}
示例9 語句的類似于C++的內(nèi)部表示
----------------------------------------------------------------------
因此,如在一些實施例中所規(guī)定的那樣,當預期屬性會以充分的頻率被遞增從而 使得有理由對此遞增進行顯式規(guī)程支持時,或者如果需要自動生成的原子遞增,那么用+ 操作符來指定該屬性。相同的情況適用于其他操作符。
以上所提及的檢查和變換是由編譯領域中已知的技術通過擴展成考慮與屬性相 關聯(lián)的附加特性來實現(xiàn)的。例如,檢查兩個屬性的索引類型之間的類型兼容性與檢查常規(guī) 語言的表達式中的類型兼容性相類似,但是常規(guī)語言不允許指明因應用而異的索引類型, 所以此檢查不會發(fā)生。
在特定實施例中,翻譯器為常見的語句和表達式定義了專門的表達式節(jié)點,并為 每個此類表達式節(jié)點提供可執(zhí)行代碼模板。此可執(zhí)行代碼模板按示例6和7中的類似于C++ 的表示的路線來指示對作用于屬性的此操作符的內(nèi)部表示,區(qū)別僅僅在于將屬性和類型的 名稱指定為變量。翻譯器處理隨后將屬性和類型名稱變量綁定到在此語句或表達式中指定 的屬性的名稱和這些屬性對應的類型。
會出現(xiàn)屬性表達式的數(shù)種常見模式。例如,如果表達式將另一集合屬性賦給此集 合,那么該表達式生成用于在賦值集合上迭代的祈使代碼,使用來自此集合的每個成員以 將相應的成員加至被賦值集合,調(diào)起集合轉變器規(guī)程來達成此目的。不僅如此,該表達式生 成用于刪除被賦值集合中未出現(xiàn)在賦值集合中的每個成員的代碼,為每個此類成員的被賦值屬性調(diào)起刪除規(guī)程。在一種情形中,被賦值屬性的類型與賦值屬性的類型相同,因此賦值 屬性中的值被簡單地賦給被賦值屬性中的相應成員。在另一種情形中,被賦值屬性具有實 例化特性并且賦值屬性是包含構造被賦值屬性的成員所需要的參數(shù)的值。在這種情形中, 翻譯器生成用于為賦值屬性中的每個成員實例化被賦值屬性中的成員的代碼。一般而言,翻譯器生成與表達式中的操作加上被引用屬性的特性對應的代碼,在 基于所有這些考慮沒有合法解釋時指示錯誤。在一實施例中,語言提供將其他屬性的形式的表達式指定為屬性定義的一部分的 手段,從而聲明正被定義的屬性與這些其他屬性之間的關系。因為此表達式是在屬性的聲 明性上下文中指定的,所以該表達式指定給定的關系必須成立,而不是指定要執(zhí)行的具體 動作,即,此表達式為聲明性語義。這被稱為約束。這些語義與對作為表達式的一部分的操 作符的常規(guī)祈使指定形成對比,后者僅簡單地指定要執(zhí)行的計算步驟。在一個實施例中,可 以在屬性定義的主體中指定聲明性關系,如示例10中所解說的那樣。-----------------------------------------------------------------------ClientReactor csm[name]{= client ;}示例10 聲明性關系-----------------------------------------------------------------------此處,“client”在先前已被定義為屬性。操作符“=”指定csm集合屬性“等 于” “client”集合。然而,因為翻譯器具有csm屬性和“client”集合兩者的詳細知識,所 以翻譯器在這些集合不直接兼容時能夠推斷出此關系的有意義的語義。具體而言,在此示 例中,ClientReactor類型是對作為“client”集合的類型的Client類型的“收聽者”對象。 在此情景中,該語句被解釋成意味著csm應當具有對應于“client”中的每個實例的反應器 實例,而不是包含與“client”完全相同類型的成員。有了此指定,只要client和csm屬性 已在軟件的相同翻譯單元中被聲明,翻譯器就能夠在用于“client”的轉變器規(guī)程插入在有 新的client成員被創(chuàng)建時實例化ClientReactor的代碼并在用于client的刪除規(guī)程中插 入在client被刪除時刪除相應的ClientReactor的代碼。如果client屬性是在分開的翻 譯單元中聲明的,那么該實現(xiàn)可以使用允許在client成員的創(chuàng)建和刪除之際調(diào)起與這些 動作對應的代碼的觸發(fā)機制。D.屬性翻譯 在一實施例中,當翻譯器讀取輸入源程序中的屬性指定時,翻譯器在抽象句法樹 中創(chuàng)建記錄其名稱、類型、索引和其他特性的定義屬性節(jié)點。還記錄每個顯式指定的特性 和約束。不顯式指定的特性作為其相應的默認值被記錄。例如,如果排序特性未被指定, 那么該排序特性可默認被設置成無序。還為在屬性上受支持的每個原語操作創(chuàng)建單獨的 屬性操作符節(jié)點并將每個此類操作符節(jié)點與使用操作符表達式節(jié)點的首個屬性節(jié)點聯(lián)系 起來,如以上針對表達式所描述的那樣。例如,與用于屬性“sample”的轉變器原語規(guī)程對 應的屬性操作符節(jié)點被創(chuàng)建成具有名稱“samplels”并由對應于賦值操作符的表達式節(jié)點 與“sample”的屬性節(jié)點聯(lián)系起來。類似地,與用于屬性“sample”的刪除原語規(guī)程對應的 屬性操作符節(jié)點被創(chuàng)建成具有名稱“sampleDel”并由對應于刪除操作符的表達式節(jié)點與“sample”的屬性節(jié)點聯(lián)系起來。還可以生成與屬性的條目類型對應的類型節(jié)點,并且此類 型節(jié)點中有輔助屬性,如以下更全面地解說的那樣。
在后續(xù)處理中,翻譯器隨后從包括集合的名稱、類型和特性的屬性節(jié)點信息生成 所要求的數(shù)據(jù)成員的聲明的內(nèi)部表示。翻譯器進一步為每個屬性操作符節(jié)點生成對該屬性 的相應原語規(guī)程的簽名的內(nèi)部表示。翻譯器隨后基于該表達式節(jié)點或是將屬性操作符節(jié)點 連接至基屬性節(jié)點的那些節(jié)點、以及(在有副作用的情形中)還可能基于將基屬性節(jié)點與 其他屬性聯(lián)系起來的表達式節(jié)點來生成此規(guī)程的實現(xiàn)。因此,實現(xiàn)的生成可以由基屬性的 特性、正被實現(xiàn)的屬性操作符的特性與將這兩者連接起來的表達式節(jié)點的特性的組合來管 控,由此來處置屬性原語規(guī)程實現(xiàn)的多樣性。
翻譯器進一步包括一組集合模板,每個集合模板指定以集合中的成員的類型和由 該集合使用的索引類型的形式來參數(shù)化的數(shù)據(jù)結構的實現(xiàn)。每個此類集合模板具有涉及動 態(tài)集合屬性特性的一組已知特性。例如,實現(xiàn)所謂的紅黑樹數(shù)據(jù)結構的一個集合模板可以 基于索引類型來確保排序,而實現(xiàn)散列表的另一集合模板可以是無序的。
在一實施例中,翻譯器以類似于C++的表示的形式生成屬性的內(nèi)部表示,從而將 原語規(guī)程作為與包含該屬性的類型對應的類的成員函數(shù)來提供。例如,示例2的“sample” 屬性可以如示例11中那樣以類似于C++的指定的形式來內(nèi)部地表示。
-----------------------------------------------------------------------
class Experiment {
…0168]0169]0170]0171]0172]0173]0174]0175]0176]0177]0178]0179]0180] 0181] 0182]0183]0184]0185]0186] 0187]class Samp1eEntrypublie BaseEntry{Date index_ ; float value_ ; Samp1eEntry*1eft_ ; Samp1eEntry氺right_ ;SampIeEntry氺parent—;};typedef RedBlackTree<SampleEntry, Date>SampIeMap ; float sample(Date d)const{return se ? se_ > value_:0. 0 ;typedef SampleMap:: Iterator SampleIterator ; SampleIterator samplelter()const{return sample—· iterator () ;} void samplels(Date d,float f){if ( ! se) {se = new SampleEntry(d,f); sample—· newMember(se);0188] }0189]else se_ > value_ = f ;0190]}0191]void sampIeInc(Date d,float inc){0192]SampleEntry^se = sample_[d];0193]if( ! se) {0194]se = new SampleEntry(d, inc);0195]sample_. newMember (se);0196]}0197]else se- > value_+ = inc ;0198]}0199]SampleMap sample_ ;0200]…
}
示例11 :屬性的類似于C++的內(nèi)部表示
-----------------------------------------------------------------------
從此示例中的開頭起考慮此表示中的元素。第一,定義了嵌套類SampleEntry, 如由翻譯器生成的那樣。需要這個類是因為該集合為非侵入性的并且集合模板僅直接支 持侵入性集合。這些侵入性集合是如下的集合數(shù)據(jù)結構實現(xiàn)所要求的輔助數(shù)據(jù)成員也被 要求在集合成員本身中。因此,SampleEntry類包括用于存儲索引的數(shù)據(jù)成員、在以上稱 為“valued’的用于存儲條目的實際值的數(shù)據(jù)成員、以及用于支持集合實現(xiàn)的數(shù)據(jù)成員,即 left、right和parent。這些輔助數(shù)據(jù)成員在名稱和類型上是基于所選擇的集合模板的已 知要求來選擇的,在本例中所選擇的集合模板是RedBlackTree。即,此集合模板實現(xiàn)假定任 何直接成員類型具有名為index_、left_、right_*parent_的數(shù)據(jù)成員。該集合模板實現(xiàn) 還假定直接成員類型是指向由該集合模板的首個參數(shù)指定的類型的指針并且indeX_的類 型與該集合模板的第二類型參數(shù)的類型相同。
第二,typedef語句將“SampleMap”定義為此集合模板的具有恰適的成員類型和 索引類型(即,SampleEntry和Date)的類型實例化的名稱。該集合模板是基于該屬性被 指定為按其索引排序而被選擇的。即,在此實施例中,該集合模板是用于有序動態(tài)集合屬性 的默認集合模板。此聲明是允許在示例11的接近末尾處與所選擇的集合模板的名稱無關 地聲明數(shù)據(jù)成員實例“sample^’的便利手段。
第三,稱為“sample”的成員函數(shù)按其Date類型的參數(shù)值來查找SampleMap實例 中的條目,如果找到該條目則返回此條目的“value”數(shù)據(jù)成員的值,否則返回默認值0. 0。 這使用了在紅黑樹集合模板中定義的索引操作符,即操作符[]。此成員函數(shù)被用來訪問該 集合中由索引值指定的值。在此特定的C++表示中,成員函數(shù)可以是內(nèi)聯(lián)的。S卩,與規(guī)程實 現(xiàn)對應的可執(zhí)行代碼是在對特定屬性成員的訪問點處生成的,而不是在分開位置中以從此 訪問點調(diào)用結果得到的規(guī)程的方式來生成的。
第四,下一 “typedef”將SampleI terator定義為集合模板的Sample實例化的 Iterator類型的名稱。“Samplelterator”成員函數(shù)被定義成返回此類型的實例,其支持遍14及該屬性中所有條目的迭代。此處,集合模板定義支持在記錄在紅黑樹中的成員上的迭代 的迭代器類型。第五,“samplels”成員函數(shù)是相應的轉變器原語規(guī)程,其由對應于該規(guī)程的屬性操作符節(jié)點和從此節(jié)點映射到屬性節(jié)點的表達式賦值操作符來生成。最后,“samlelnc”成員函數(shù)支持對sample集合中的指定條目進行遞增,所生成的 原語操作規(guī)程對應于定義在該屬性上的“ + ”操作符。屬性的定義可包括對要用作其實現(xiàn)的一部分的“模板”的指定。例如,如果“模板” 特性被指定為AVL樹,則使用名為AVLTree的集合模板而不是紅黑樹集合模板。 在優(yōu)選實施例中,每個集合模板實現(xiàn)要由翻譯器使用的共用接口,包括值數(shù)據(jù)成 員的名稱、索引數(shù)據(jù)成員的名稱、迭代器類型的名稱等。僅正被實現(xiàn)的實際數(shù)據(jù)結構有所不 同。在這種情形中,應用能夠注冊新的集合模板并按名稱來指定此模板,并且翻譯器可以著 手使用此模板而無需對翻譯器進行因應用而異的修改。作為另一示例,當翻譯器讀取如示例5中那樣的屬性指定時,翻譯器認識到此屬 性正在指定實例化的侵入性集合。因此,翻譯器生成示例12中指定的形式的內(nèi)部表示。-----------------------------------------------------------------------class Directory {…Directory氺next_ ;Directory氺dir_ ;String index () const {return name_ ;}}typedef HashTable<Directory, Name>SubdirectoryMap ;Directory^subdirectory(Name name)const{return subdirectory_[name];}Directory^subdirectoryIs(Name name){Directory氺d = subdirectory_[name];if( ! d) {d = new Directory (name, this);}return d ;}示例12 實例化的侵入性屬性-----------------------------------------------------------------------此示例解說了源于與先前示例的差異的數(shù)個方面。第一,作為侵入性集合, HashTable (散列表)集合模板所要求的“next (下一個),,數(shù)據(jù)成員被插入到Directory 類型的實現(xiàn)中。類似地,“dir_”數(shù)據(jù)成員被插入此Directory類中以支持“parent”特 性。而且,“ index"成員函數(shù)提供對名稱的訪問以便使用“ index”數(shù)據(jù)成員名稱,正如由 HashTable集合模板所期望的那樣。
對SubdirectoryMap的typedef指定條目類型是Directory類,因為此集合是侵 入性的。即,該成員類型與條目類型相同。類似地,“subdirectory”訪問器函數(shù)直接返回 由HashTable索引操作符(C++中的操作符[])返回的條目。
最后,“subdirectoryls”轉變器在有必要的情況下在給定其構造器參數(shù)的前提下 實例化新的成員,這些構造器參數(shù)在本例中僅是它的“名稱”加上作為“this”來傳遞的指 回父目錄的后向指針,即,C++形式的當前對象。此參數(shù)被存儲在所實例化的Directory實 例的“dir_”數(shù)據(jù)成員中,由此提供“parent”約束所要求的后向指針。
隨后使用本領域中已知的在各種C和C++編譯器和解釋器中實現(xiàn)的技術來將結果 得到的在邏輯上等效于以上所描述的類似于C++表示的內(nèi)部表示翻譯成可執(zhí)行代碼的形 式。
使用如上的這種向中間形式的映射,集合的大量有關的集體特性就能由翻譯器以 有界且合理的復雜性來實現(xiàn)。對一些集體特性的考慮如下
索引指定索引可被指定為成員類型的屬性(在這種情形中,此屬性決定索引的 類型)或者在非侵入性集合的情形中被指定為類型。指定大且可能無界廣度的索引類型即 指定了具有邏輯上無界數(shù)目個條目的屬性。如果集合被定義為按索引來排序,那么在此索 引類型上定義的排序則決定集合的次序。
索引的諸如唯一性之類的其他特性可以由布爾特性來指示,并且(在允許非唯一 性時)僅簡單地實現(xiàn)對數(shù)據(jù)結構或集合模板的選取,以及在要求唯一性時實現(xiàn)唯一性檢查 的添加。類似地,被自動管理的鍵可由特性指明,從而使翻譯器分配新的鍵值而不是預期其 作為參數(shù)。
默認鍵值可以由布爾特性來支持,該布爾特性使翻譯器例如在迭代器的實例化時 提供默認值。
侵入性/非侵入性該區(qū)別可由屬性的類型是被指定為指針類型還是實際的對 象類型來指定。進一步,認識到每個屬性具有條目類型以及接口類型,該接口類型是為該 屬性指定的類型并且是由該屬性邏輯存儲的實例的類型。如果是非侵入性的,那么翻譯器 生成充當此條目類型的類型。所生成的此類型遵循相對簡單的模式,因為該類型包含存儲 條目類型的值的數(shù)據(jù)成員加上支持集合所要求的任何數(shù)據(jù)成員,包括索引數(shù)據(jù)成員和任何 "next (下一個)”指針數(shù)據(jù)成員。如果集合是侵入性的,那么翻譯器將條目類型指明為與接 口類型相同并將這些額外的數(shù)據(jù)成員插入在此接口類型中。
排序排序的指明改變默認集合模板(并且由此改變實現(xiàn)數(shù)據(jù)結構)以達成合意 排序。模板與共用接口的聯(lián)用意味著內(nèi)部表示僅在模板的標識中發(fā)生變化,而不在內(nèi)部表 示的其他元素中發(fā)生變化。
數(shù)據(jù)結構選擇將數(shù)據(jù)結構實現(xiàn)指定為集合模板和為特定屬性指定集合模板連同 由每個此類模板提供的統(tǒng)一接口的能力允許在不改變或復雜化翻譯器本身的情況下指定 任意性數(shù)據(jù)結構。
冪等性翻譯器在嘗試添加條目作為新成員之前生成對具有指定鍵的成員的檢 查,從而如果該成員已經(jīng)存在則使此操作立即完成,由此提供冪等性。否則,如果要求索引 鍵是唯一性的,那么翻譯器可拋出異常。
訪問失敗語義布爾特性可以指示屬性實現(xiàn)在指定成員不存在時應當拋出異常還是返回默認值。翻譯器僅簡單地修改所生成的代碼以拋出異?;蛘呱苫诖颂匦缘哪J值。迭代器語義迭代器語義的兩個主要可能性為1)在迭代器被實例化時(藉由單 獨的集合類型)來創(chuàng)建該集合的快照并且在該快照上進行迭代,以及2)在集合本身上迭代 并采用由集合模板提供的(以下描述的)集合版本號來標識該集合在迭代中發(fā)生變化的境 況。迭代可被定義成在檢測到此類變化時繼續(xù)進行、重試、或者拋出異常。事務性/并發(fā)性翻譯器可以通過向由集合模板定義的操作添加在調(diào)用周圍額外 生成的代碼的方式來處置這些特性。對于并發(fā)性而言,集合模板可以提供以集合的版本的 形式來指定的原子插入操作,該原子插入操作在版本已發(fā)生變化的情況下會失敗。具體地, 可以通過以下方式來實現(xiàn)讀操作i)保存集合版本號,ii)執(zhí)行由集合模板提供的查找操作,iii)檢查版本號iv)如果版本號已發(fā)生變化,則重試該操作。更新可被執(zhí)行為i)創(chuàng)建新的候選成員對象ii)獲得版本號iii)調(diào)用由集合模板提供的插入操作,使該操作返回指向要更新的位置的一組指 針以完成該操作,以及iv)如果版本號尚未變化,則(使用諸如(雙重)比較和交換之類的適宜的非阻塞 原語來)原子地執(zhí)行此更新。因此,翻譯器能夠取決于目標環(huán)境在原語操作規(guī)程中插入所要求的同步代碼。這 些特性還可以通過為每個合意行為提供專門的集合模板的方式來實現(xiàn),其中翻譯器基于指 定的特性來選擇正確的一個模板。最后,對屬性的約束或是將屬性的角色指定為封閉范圍 類型的一部分的特性被記錄在屬性的內(nèi)部表示中,并且這些約束或特性對所生成的可執(zhí) 行代碼導致相對于其他特性而言相對正交的修改。具體而言,屬性可被指定為類型的有效 “值”,從而導致該類型表現(xiàn)為此集合的實例。例如,Directoty的集合類型可如在示例13中 那樣來指定-----------------------------------------------------------------------type MyDirectoryCollection{Directory value[name]{、isValueAttr = true ;}}示例13 集合類型指定-----------------------------------------------------------------------典型情況下,這種本質的集合類型包含單個集合屬性,但是可以提供附加屬性,包 括提供關于值集合的額外信息的那些屬性。此值特性指定與值屬性的語義和特性的組合允 許翻譯器推斷并利用集合類型的特性。具體而言,翻譯器可以從屬性的類型的語義和特性以及以上的屬性語義來推斷集合或單體屬性的語義和特性。在常規(guī)語言中,翻譯器可以按 類似的方式來從變量的類型推斷特性。然而,在本發(fā)明中,如上文那樣,更廣泛的語義和特 性被提供給類型,從而這些語義和特性在對此類型的屬性的聲明中可用,由此向翻譯器提 供等級高得多的元信息。例如,翻譯器在具有關于每個層次的類型、索引和特性以及它們被 如何表示的完全知識的情況下能夠知道屬性是集合的集合。
在優(yōu)選實施例中,諸如“ + ”之類的操作符在范圍類型中按對其屬性中的每個屬性 的相應操作符來定義。因為翻譯器知道對這些屬性中的每個屬性可用的操作符,所以如果 這些屬性支持此操作符,則翻譯器能自動地生成對應于關于該類型的操作符定義的代碼, 并且如果指定的操作符不被支持,則生成出錯消息。例如,在一個實施例中,如示例14中那 樣用“ + ”操作符來指定對類型MatisticsArray的加法的支持。
-----------------------------------------------------------------------
type StatisticArray{
Count value[Id] {
、isValueAttr = true ;
‘ i sArray = true ;
}
operator+ ;
}
示例14 類型操作符指定
-----------------------------------------------------------------------
翻譯器可以推斷出作用于作為集合類型的StatisticArray的+被定義為對值集合的每個成員的逐成員加法(+ =)并且進一步推斷出如果值屬性支持加性轉變器(例如, valuelnc (inc))或者Count數(shù)據(jù)類型支持該加法操作符或者Count的表示類型支持該加法 操作符,則這種每成員的加法受到支持。在后一種情形中,可能需要將當前值轉換成諸如內(nèi) 建類型之類的某種基類型,執(zhí)行加法并且隨后使用用于Count類型的構造器來將結果轉換 回Count類型。在任何情形中,可供翻譯器使用的關于每個屬性和作為此類屬性的聚集的 類型連同對操作符的常規(guī)逐成員定義的元信息允許操作符的自動生成。不僅如此,操作符 的自動生成確保這些語義是遞歸地由每個階段處的潛藏類型提供的。
這些相同的技術可被用來指定對固定大小的常規(guī)數(shù)據(jù)成員也有用的特性,包括 常數(shù)、可轉變性、內(nèi)聯(lián)、靜態(tài)、別名、引用計數(shù)、操作符適用性、構造器參數(shù)、在更新時觸發(fā)等。 這些特性與以上那些特性組合以允許翻譯器從用于所生成的代碼的相對較小數(shù)目的“元模 板”生成實現(xiàn)具有所有要求的特性的屬性的代碼。我們使用術語“元模板”來計及一般化代 碼模板的一部分基于這些特性被插入、移除和組合這一事實。具體而言,這些特性可以由屬 性節(jié)點、屬性操作符節(jié)點和表達式節(jié)點上的標志的組合來內(nèi)部地指示。
在優(yōu)選實施例中,屬性可被指定為對其集合中的對象有反應,這意味著在該屬性 的范圍類型中定義有由該集合中的對象的變化觸發(fā)的一個或更多個規(guī)程。在這種情形中, 翻譯器生成向被添加至集合屬性的每個對象中的觸發(fā)機制注冊該一個或更多個規(guī)程的代 碼,并且在對象從集合中被移除時將這些規(guī)程從該對象中移除。
在優(yōu)選實施例中,觸發(fā)對象類型定義輔助嵌套類型Notifiee,后者定義用于觸發(fā)器規(guī)程的回調(diào)接口。翻譯器隨后生成反應屬性的條目類型作為此回調(diào)接口的派生類型,從 而超馳在此接口中定義的回調(diào)函數(shù)以便在回調(diào)時執(zhí)行所指定的規(guī)程。當添加了屬性的新成 員時,為回調(diào)實例化并初始化該條目類型的實例。當成員被刪除時,為回調(diào)解除注冊并解除 分配此條目實例。因此,翻譯器能夠生成反應器屬性,這些反應器屬性調(diào)起所觸發(fā)的作用于 其屬性(集合)的成員的規(guī)程。E. 一般化屬性語義在一個實施例中,讀或訪問屬性的操作總是冪零的(即,不對該屬性起作用)。還 可以通過將此操作定義成為索引類型的每個合法值包含成員的方式來將此操作定義成從 不會失敗或者拋出異常,盡管其中一些合法值是默認值。例如,如果所提名的條目尚未以其 他方式被設置,那么子目錄集合就返回默認空值。相應地,轉變器被定義成冪等(在調(diào)用相 同的操作兩次具有與調(diào)用一次相同的效果的意義下)和事務性的——即要么成功地將指定 的條目設置成新值要么拋出異常并將集合留在其原始狀態(tài)。在優(yōu)選實施例中,這些統(tǒng)一的語義簡化了為對集合的操作生成代碼所要求的翻譯 器實現(xiàn),因為所有屬性都具有共同的一組基本語義。翻譯器可以較大復雜度的代價來支持 較小的一組不同語義,但是經(jīng)驗已表明各種各樣的程序能夠用這些語義來工作。尚沒有真 正要求不同語義的應用。特定的訪問器語義通過排除副作用狀態(tài)變化和異常來使開銷最小 化。在許多情形中,應用需要檢查在任何情形中由訪問器返回的對象或值,所以檢查默認值 不會增加開銷。不僅如此,當需要時,訪問器的調(diào)用器可以將結果存儲在受限制類型中,該 受限制類型在被用默認值來寫時拋出異常,由此在“沒有找到”時提供異常,即使在此功能 并沒有得到集合本身支持的情況下亦是如此。例如,在一個實施例中,語句Directory:ValidPtr sd = d_ > subdirectory(" foo");將返回空指針,該空指針將使ValidPtr類型在被賦值為該空指針時因為空值而 拋出異常。 轉變器語義可以通過在添加成員之前檢查所提名的成員是否已經(jīng)存在、并且如果 存在則跳過此添加的方式來提供。不僅如此,在給定將成員添加至集合可能需要諸如存儲 器之類的額外資源的前提下,轉變器必須能夠失敗,所以轉變器必須具有拋出異常的選項。 事務性語義要求在轉變器執(zhí)行期間的異常將屬性返回到轉變器執(zhí)行之前的狀態(tài)。這些事務 性語義是重要的,因為在失敗的情形中,轉變器不能作出前向行進,所以回到稍早前定義明 確的狀態(tài)要優(yōu)于聽任對象留在某個任意性狀態(tài)中。以下描述這些語義的附加優(yōu)點。這些語義還充分地限制了屬性語義以允許收聽者模式的普適(即,與類型無關 的)實現(xiàn),收聽者模式在本文中被稱為“通知”。具體地,其他軟件對象可以注冊成在屬性 被修改時被回調(diào),其中該回調(diào)提供對已被修改的屬性的指示。為了提供此便利性,翻譯器有 效地在屬性轉變器規(guī)程中插入代碼以在注冊列表上進行迭代,從而回調(diào)每個注冊的軟件對 象。翻譯器還生成將由此回調(diào)機制使用的接口。例如,在一個實施例中,對示例3中的屬性 的回調(diào)函數(shù)簽名(按C++語義)將是void onSubdirectory(Name);即,為該屬性命名的 以“on”字符串為前綴并取索引類型作為單個參數(shù)的函數(shù)。每個注冊的對象實現(xiàn)此類規(guī)程, 從而在此回調(diào)規(guī)程作為改變“subdirectory”屬性的一部分被調(diào)起時采取所要求的局部行 動。因為對收聽者模式的這種支持可以從屬性指定來機械地確定的,所以翻譯器能夠自動 地生成此模式所要求的所有支持,從而使程序員免受這種負擔。不僅如此,因為屬性的狀態(tài)是對回調(diào)客戶機可見的唯一方面,所以在回調(diào)中簡單地指示已發(fā)生變化的屬性以及(若是 集合)成員的鍵總是充分的。被調(diào)起的規(guī)程可以隨后通過使用訪問器原語操作規(guī)程來使用 此信息來訪問經(jīng)修改的成員??偟膩碚f,本發(fā)明的動態(tài)集合屬性的受限制的指定接口和語 義允許機械的手段(并且由此允許翻譯器)來為每個對象生成回調(diào)機制,從而使程序員免 受這種負擔。此機制的一種用途是實現(xiàn)反應屬性,如稍早所描述的那樣。
屬性指定和語義允許翻譯器自動地生成如網(wǎng)絡傳輸所要求的將屬性實例變換成 串行表示以及將串行表示變換成屬性實例的軟件。具體地,將集合的單個成員串行化需要 將索引鍵值和成員值本身串行化,或者在實例化屬性的情形中需要將構造器參數(shù)串行化。 這提供了用于反串行化的足夠信息并簡單地在接收端上將成員添加至對應的屬性。不僅如 此,由于屬性的冪等語義,因而相同鍵/成員的重復傳輸并不具有不良作用,而僅是簡單地 確保了發(fā)送方與接收方之間的狀態(tài)收斂。相應地,對整個屬性的傳輸僅是簡單地需要對集 合中所有成員的傳輸。對成員對象的串行化和反串行化是基于每個類型實際上是聚集屬性 來遞歸地處置的,如稍后所描述的那樣。
在一個實施例中,編程語言的類型被分成值類型和間接類型,S卩,可以有指針或間 接引用指向的類型。間接類型可以具有為每個這種類定義的輔助指針類型。用于間接類型 T的指針類型的一種句法為T: :Ptr。繼續(xù)討論以上將Directory作為間接類型的示例,用 于Directory的指針類型為Directory: :Ptr。(在一個實施例中,此指針類型實現(xiàn)所謂的 智能指針引用計數(shù),從而允許在所有引用均被移除時自動地刪除對象,以便消除容易出錯 的對象人工刪除的需要。)
F.屬性特性的類別
屬性的特性可被分成以下三種類別
1.聲明特性
2.輔助特征
3.實現(xiàn)完善
聲明特性涵蓋屬性對其他軟件模塊的接口的諸方面,諸如該屬性是否是可轉變的 屬性,該屬性是否將是對封閉范圍的構造器自變量、以及該屬性的迭代器是否按次序提供 訪問成員。輔助特征包括該屬性是否在更新時提供通知、要與集合聯(lián)用的默認值、等等。實 現(xiàn)完善特性包括訪問代碼是否應當是內(nèi)聯(lián)的,實現(xiàn)是否應當支持并發(fā)的訪問,實現(xiàn)是否應 當是侵入性的、以及要供實現(xiàn)使用的數(shù)據(jù)結構。
對這些特性的關鍵認識在于此類特性的數(shù)目限于相對較小的數(shù)目??紤]第一種類 別,在給定僅類型、名稱和索引被指定、并且在編程時已出現(xiàn)的概念的數(shù)目有界、諸如易變、 恒定、各種類別的指針及類似概念的前提下,關于聲明的方面的數(shù)目是有限的。類似地,這 對于其他兩種類別而言也成立。另外,這些特性中的大多數(shù)特性在其對實現(xiàn)的影響方面在 很大程度上是正交的,所以翻譯器復雜度并不會按特性的數(shù)目而成倍地增長。例如,具有父 指針這一特性與在更新時通知的機制無關,而在更新時通知的機制與該屬性是否可轉變無 關。不僅如此,一些特性組合不被允許。例如,控制所使用的指針的類型的特性僅適用于非 值類型屬性。因此,已用支持不到32個特性的翻譯器開發(fā)出實際的應用軟件,并且翻譯器 復雜度相對較低,這在很大程度上反映出與這些特性在本質上的無關性。
在一個實施例中,翻譯器具有定義明確的接口以支持開發(fā)和納入可被添加至該翻譯器的擴展模塊。在一種情形中,此類模塊可以處置表示的生成,即將屬性變換成諸如狀態(tài) 的網(wǎng)絡表示之類的特定表示以及從該特定表示變換成該屬性的詳情。因此,可以由翻譯器 通過將新模塊寫到實現(xiàn)新表示的此接口的方式來支持該新表示。此結構類似于用于將特定 的目標處理器架構專有的代碼生成模塊與翻譯器的其余部分分開來的常規(guī)翻譯器辦法,從 而允許用簡單地添加新的代碼生成模塊的方式來重定向翻譯器。在優(yōu)選實施例中,除了支 持多種表示的能力之外,屬性編程語音的翻譯器具有類似的結構以支持重定向到不同的目 標語言/構架。結果,可以實現(xiàn)提供很廣范圍的屬性接口、實現(xiàn)和表示而同時具有實用的復雜度 并且不要求因新數(shù)據(jù)結構或表示要求而變化的翻譯器。G.固定大小的屬性在一個實施例中,在屬性定義中省去索引的指定指示了單體屬性,S卩,在集合中恰 好包含一個成員的屬性(因此不需要索引)。在許多應用中,單體可能是常見的情形。然 而,單體集合可作為對一般化的動態(tài)集合屬性的限制和簡化。例如,示例14指示可以由省 去索引指定的屬性聲明來指示單體屬性。-----------------------------------------------------------------------Count accesses{^notifyOnUpdate = true ;…}示例14 單體屬性指定-----------------------------------------------------------------------不僅如此,相同的屬性語義提供單體屬性是簡單直接的,從而將它們限于單個成 員。類似地,諸如“enum”之類的具有較小固定范圍的索引類型可以指示具有較小固定數(shù)目 個成員的屬性,即,數(shù)組。H.類型生成在一實施例中,類型被指定為屬性的聚集,集合和單體兩者均可,如示例15中 針對Directory類型所解說的那樣。類型名稱之后的可任選的標識符(在本例中即為 Fwk: :Entity)標識此類型所繼承的基類型。繼承在將類型定義為被指定為基類型的那個類 型的派生類型或者子類型時具有與常規(guī)的面向對象的語言的語義類似的語義。然而,使用 C++術語來說,該類型還繼承了基類型的屬性,而不是繼承了常規(guī)的數(shù)據(jù)成員和成員函數(shù)。-----------------------------------------------------------------------type Directory FwkEntity{Directory subdirectory[name]{、parent = dir ;^notifyOnUpdate = true ;}Count accesses {^notifyOnUpdate = tr ue ;}
}示例15 類型指定 -----------------------------------------------------------------------作為聚集屬性,該類型向翻譯器提供其語義作為其屬性及其基類型(若有)的語 義的聚集。例如,將類型的實例串行化是以串行化該類型的每個屬性的形式來實現(xiàn)的。類 似地,用于類型的構造器參數(shù)對應于具有被指明為構造器參數(shù)這一特性的屬性的序列。另 夕卜,與對象的通知接口是與關于其通知屬性中的每個通知屬性的通知接口的聚集對應的類 型。在一個實施例,翻譯器自動地生成稱為Notifiee的對應于此聚集通知接口的輔助(且 嵌套的)類型,如示例16中針對Directory類型所解說的那樣。
-----------------------------------------------------------------------
type Directory FwkEntity{type Notifiee FwkPtrInterface{onSubdirectory[name];onCount ;}…}示例16:通知接口-----------------------------------------------------------------------因此,要求來自Directory的通知的模塊可以定義從以上的 Directory Notifiee類型派生的類型并定義與onSubdirectory和onCount中的每一者相 關聯(lián)的動作以在這些屬性被更新時處置回調(diào)通知。該模塊還可以通過定義類型Directory 的被指定為有反應的屬性來達成此功能性。I.輔助類型和操作符生成基于給定類型及其屬性的特性來為該類型生成輔助類型和操作符會是恰適的。具 體而言,翻譯器可以從類型的基類型推斷出該類型的類別。例如,如果類型不具有基類型或 者其基類型是值類型,那么該類型就是值類型。如果類型是從間接類型派生出來的,那么該 類型就是間接類型。在一個實施例中,翻譯器提供了例如命名為Fwk: PtrInterface的根 基間接類型,如在示例16中被指定為Notifee的基類型那樣。翻譯器可以隨后推斷為值類型和間接類型的輔助指針類型(例如, Directory: :Ptr)生成相同和不相同的操作符的需要。不僅如此,在將具有寫訪問的指針與 僅允許讀訪問的指針(用C++術語來說即non-const和const)區(qū)分開來的實施例中,翻譯 器可以生成只讀指針類型以及讀寫指針類型。而且,在此情形中,翻譯器可以生成const和 non-const Notifiee接口以容適需要對通知對象的只讀訪問或讀寫訪問的模塊。另外,實 施例可以支持要求非空值的指針類型,該指針類型在一個實施例中被稱為ValidPtr。翻譯 器可以推斷并生成所有這些指針和notifiee類型,其可任選地由隨這些屬性和類型指定 的特性來管制,這些能力允許翻譯器提供指明對訪問和操作的精細粒度控制和指定而不使程序 員承受負擔的類型。例如,程序員可以通過使用ValidPtrConst輔助類型來指定對對象的非空只讀訪問,從而依賴翻譯器自動生成此指針類型。J.派生的屬性在一實施例中,屬性可被指定為基于另一現(xiàn)有屬性來定義,如示例17中所解說的}示例17 派生集合屬性指定
那樣。
-------------------------------------------------------------
type ContentDirectory Directory{
Rights distribution rights ;
Corporation copyrightHolder ;
}
ContentDirectory contentSubdirectory[name] = subdirectory{
…
-----------------------------------------------------------------------
^ ift ^ M ψ, " contentSubdirectory,, 以 $ 歹ij 5 的 $ M it “ subdirectory,, 屬性的形式來定義的?!癱ontentSubdirectory,,允許實例化如由“subdirectory,,定 義的相同的基集合屬性中的派生目錄類型“ContentDirectory”的實例。具體而言,由 “contentSubdirectory”屬性創(chuàng)建的每個實例還表現(xiàn)為是“subdirectory”屬性中的成員。 派生的類型屬性限于使用其指定的基屬性的類型的派生類型。例如,如果沒有在示例17 中從 Directory 派生出 “ContentDirectory”,那么將 “contentSubdirectory” 定義成是從 “subdirectory”派生的將是錯誤。派生的屬性也可以是值集合,包括指向派生類型的指針, 只要它們遵守派生類型規(guī)則即可。
在派生屬性的類型與基屬性的類型相同的簡單情形中,派生屬性是僅簡單地為實 際屬性提供替換名稱的別名。
如果派生屬性是以相對于基屬性而言的派生類型范圍中定義的,那么派生屬性可 以用與基屬性相同的名稱來指定。在這種情形中,派生屬性超馳基屬性行為。
在另一種情形中,派生屬性可以代表基屬性的子字段或范圍,如在示例18中所指 示的那樣。
-----------------------------------------------------------------------
U8 opcode = instruction
;
示例18 子字段別名屬性
-----------------------------------------------------------------------
此處,屬性opcode被定義為由“ instruction”屬性的首8位形成的子字段。在此簡 單的情形中,該范圍標識恰好一個成員,由此定義從基屬性派生出的單體屬性。更一般地, 派生屬性可以代表實為另一集合的成員的以某個匹配準則的形式來定義的子集的集合。
派生屬性還可以代表基屬性的投射,從而給出基屬性的每個成員中的屬性的子集 或者甚至基屬性的某種變換。
-----------------------------------------------------------------------
type ContentDirectoryDesc{
Rights distribution rights ;Corporation copyrightHolder ;}ContentDirectoryDesc contentDirDesc[name] = contentSubdirectory ;示例19 投射別名屬性-----------------------------------------------------------------------在示例19中,為來自content Subdirectory集合中的相應對象的屬性中的每個屬 性初始化ContentDirectoryDesc的每個實例。在優(yōu)選實施例中,當派生集合被訪問并且不 需要單獨存儲時,此派生屬性便實例化這些值實例。類似地,為此派生集合調(diào)用轉變器會更 新基屬性成員的相應字段。最后,可以用兩個或更多個基屬性的形式來將屬性定義為是這些基屬性的成員的 并集,如示例20中所解說的那樣。此處,"vehicle (交通工具),,屬性是從car (汽車)、 truck (卡車)和boat (船)作為這些集合的并集派生的-----------------------------------------------------------------------type Fleet {Car car [name];Truck truck[name];Boad boat [name];Vehicle vehicle[name] = car I truck I boat ;}示例20:并集派生屬性-----------------------------------------------------------------------在這種情形中,要求派生屬性是這些基屬性共同的基類型,并且要求每個集合支 持類型兼容的鍵。在一實施例中,并集派生屬性完全依賴于這些基屬性的存儲。此處,“ Il ” 操作符被用來指定并集。因此,訪問器查找這些基屬性中的每個基屬性里的鍵以定位到指定的成員。類似 地,用于此派生屬性的迭代器按順序跨每個基屬性進行處理,從而提供其作為正常屬性的 行為。并集中的兩個基屬性中的成員具有相同鍵的情形可以通過在訪問該鍵時僅提供第一 個成員或者通過返回并集中匹配該鍵的所有成員的方式來處置。該選擇由派生屬性的唯一 性鍵集體特性來決定。一般而言,實施例可以提供用于以其他屬性的形式來定義屬性的數(shù)個操作符。派 生屬性在看上去存在的集合卻僅以其他基屬性的形式存在的意義上提供所謂的“虛擬集
I=I O在這些情形中的每種情形中,派生屬性是在其實現(xiàn)是基于基屬性的實現(xiàn)的意義上 使用由這些基屬性使用的存儲和規(guī)程中的一些來派生的。然而,屬性可被定義成為由并集 派生的屬性提供單獨的存儲實現(xiàn),如在示例21中那樣,與示例10中所提供的結構類似。-----------------------------------------------------------------------Vehicle vehicle [name] {= car || truck || boat ;
}
示例21 具有由并集指定的成員的屬性
------------------------------------
在這種情形中,被添加至基本屬性的每個成員使指向新成員的指針被添加至派生 出的集合,此舉類似于刪除。這遵循于屬性的“ {. . . } ”范圍內(nèi)的構造指定該屬性的特性的 模型,包括該屬性與其他屬性的關系,而非指定該屬性的基本定義,如在派生出的屬性情況 下出現(xiàn)的那樣。
K.擴展屬性上下文
在一實施例中,翻譯器支持在屬性上下文內(nèi)對類型和屬性的指定。
…
}
示例22 對類型和屬性的屬性上下文指定
-----------------------------------------------------------------------
在示例22中,為非侵入性集合屬性“remoteDir”定義了類型“CorruptedState”。 而且,定義了此類型的屬性“corruptec^tate”。翻譯器將屬性上下文內(nèi)對類型定義的 聲明解釋為在自動地為此屬性定義的條目類型的范圍內(nèi)定義此類型。翻譯器將另一屬 性上下文內(nèi)對屬性的聲明解釋為在此另一屬性的條目類型中定義屬性(例如,此處, corruptedState是在remotDir的范圍內(nèi)定義的屬性)。在一實施例中,每個此類屬性被實 現(xiàn)為對在非侵入性集合實現(xiàn)中使用的每成員的條目結構的擴展。
可以使這些屬性和類型對反應性屬性的回調(diào)規(guī)程以及對其他規(guī)程可用,這是通過 對該屬性的將該屬性作為這些條目對象的侵入性集合來對待的特殊實現(xiàn)接口來實現(xiàn)的。
L.自省支持
在一實施例中,翻譯器可以生成對每個屬性的可執(zhí)行描述,所以在程序執(zhí)行期間 此信息可供查詢。這支持所謂的“自省”,其常常有助于從諸如PERL或Python之類的單獨 的解釋性編程語言環(huán)境來接口。具體而言,翻譯器生成將屬性的原語操作規(guī)程耦合在一起 的自省信息,由此知道這些規(guī)程與給定的屬性相關聯(lián)。與之對比,不具有屬性的語言中的自 省機制不能指示哪些規(guī)程與給定的集合相關聯(lián)。
在一實施例中,翻譯器可以將高層次指定翻譯成一個或更多個選定的輸出表示, 其可包括常規(guī)的編程表示(諸如C++),而且還包括文本描述以及可能還有硬件描述語言指 定。在前一種情形中,翻譯器還可以改為生成機器語言指令以實現(xiàn)指定的程序。在后一種 情形中,翻譯器可以對輸入施加因輸出而異的限制以使輸入能夠以諸如硬件描述語言之類 的受限輸出表示來實現(xiàn)。在此約束內(nèi),翻譯器能夠從相同的輸入指定生成多種輸出實現(xiàn),諸
Directory::Ptr remoteDir[name]{ type CorruptedState{ U32 errors ;ErrorDesc errorDesc[Integer];CorruptedState corruptedState ;如C++和Verilog兩者。此相同的結構可被用來自動地生成映射到持久的存儲表示的軟件。S卩,串行化去 往存儲格式,而反串行化來自該存儲格式。在一實施例中,基于屬性的語言包括指定在其中可以使用諸如“while”循環(huán)、 “for”循環(huán)和“if. . . then. . . else”之類的常規(guī)祈使語言構造的一個或更多個祈使上下文的 能力。在此類祈使上下文中,屬性之間的操作符具有常規(guī)的祈使語義。然而,將屬性指定為 操作數(shù)或者結果的操作符是相對于這些屬性語義和特性來解釋的。因此,例如,在祈使上下 文中,語句-----------------------------------------------------------------------csm = clientDir:client ;
示例23:祈使語句-----------------------------------------------------------------------將類似于針對示例10所描述的語句,但是作為計算的步驟來執(zhí)行。以此方式,由 常規(guī)的祈使編程提供的控制在基于屬性的語言中是可用的,然而,該屬性的表達能力還可 以藉由擴展操作符語義來擴增祈使上下文的能力。歸納起來,以由程序員定義的集體特性作為編程語言構造的動態(tài)集合屬性提供了 顯著改善的編程能力、靈活性和簡單性。DCA可以在類型定義上下文和祈使上下文(作為局 部變量)兩者中顯式地且直接地指定。以此方式來表示成員對象的集合允許語言的翻譯器 自動地生成可執(zhí)行實現(xiàn),該可執(zhí)行實現(xiàn)處置訪問并維護正確地封裝在對象的范圍中的集合 的復雜任務。此構造還允許翻譯器從屬性形式的表達式的指定推斷出復雜的實現(xiàn)處理,而 無論是在聲明性(約束)上下文中還是在祈使上下文中。所指定的與集合屬性相關聯(lián)的接 口和語義進一步允許翻譯器自動地推斷并生成實現(xiàn)諸如工廠模式、收聽者模式和迭代器模 式之類的各種常見設計模式的代碼。指定與屬性相關聯(lián)的特性的能力允許可定制性滿足每 個個體應用程序的需要。通過提供對數(shù)據(jù)結構實現(xiàn)的定義實現(xiàn)接口作為模板,翻譯器就能 作為其屬性的特性之一來支持對任何可用的數(shù)據(jù)結構實現(xiàn)的選擇。通過知道每個屬性的實 現(xiàn),翻譯器就能進一步提供自動的代碼生成以處置并發(fā)訪問以及分布式操作。因此,如以上 所描述的動態(tài)集合屬性顯著減輕了與支持對集合的編程相關聯(lián)的問題,而同時避免了語言 和翻譯器實現(xiàn)中無界的復雜度。
權利要求
1.一種自動地將輸入代碼翻譯成計算機可執(zhí)行輸出程序表示的方法,所述方法包括 提供輸入源程序,其中所述輸入源程序是以提供動態(tài)集合屬性(DCA)的語言來表達的,并且其中所述動態(tài)集合屬性是能夠在運行時具有可變數(shù)目的被索引成員的數(shù)據(jù)元素;其中所述DCA具有由所述DCA的所述被索引成員的類型決定的成員-類型特性,并且 其中所述語言進一步提供對所述DCA的異于所述成員-類型特性的集體特性的指定;其中所述輸入源程序包括具有指定的集體特性的一個或更多個DCA實例,并且包括涉 及所述一個或更多個DCA實例的一個或更多個表達式;根據(jù)所述指定的集體特性來自動地將所述表達式翻譯成相應的計算機可執(zhí)行表達式 表不;將所述表達式表示包括在所述計算機可執(zhí)行輸出程序表示中;以及 提供所述計算機可執(zhí)行輸出程序表示作為輸出。
2.如權利要求1所述的方法,其特征在于,所述DCA實例中的一個或更多個DCA實例是 由應用定義的類型的屬性,并且由此是可實例化范圍的組件。
3.如權利要求2所述的方法,其特征在于,為所述由應用定義的類型自動地提供了一 個或更多個輔助類型和操作符。
4.如權利要求1所述的方法,其特征在于,所述集體特性包括選自下組的一個或更多 個特性索引指定、索引唯一性、索引管理模式、默認索引值、侵入性、排序、數(shù)據(jù)結構實現(xiàn)、 訪問失敗時的行為、屬性改變時的迭代器行為、更新時的冪等性、實例化、事務性、并發(fā)安全 性、刪除時的異常、在最后外部引用時的刪除、與類型-范圍語義的關系、與其他屬性的約 束關系、以及對狀態(tài)變化的反應。
5.如權利要求1所述的方法,其特征在于,所述表達式表示包括對選自下組的一個或 更多個原語DCA規(guī)程的調(diào)用訪問器、轉變器、刪除規(guī)程、和迭代器實例化規(guī)程。
6.如權利要求5所述的方法,其特征在于,所述訪問器是冪零的、無異常的、且事務性的。
7.如權利要求5所述的方法,其特征在于,所述轉變器是冪等的且事務性的,并且其中 當且僅當所嘗試的改變失敗時所述轉變器才拋出異常。
8.如權利要求1所述的方法,其特征在于,進一步包括根據(jù)所述集體特性來將所述表 達式中的一個或更多個表達式中的每個表達式映射到一個或更多個符合集體特性的關系, 其中所述關系中的每個關系提供管控所述表達式表示的模板。
9.如權利要求1所述的方法,其特征在于,所述表達式中的一個或更多個表達式具有 聲明性語義。
10.如權利要求1所述的方法,其特征在于,所述具有指定的集體特性的DCA實例中的 一個或更多個DCA實例是從具有指定的集體特性的一個或更多個其他DCA派生的。
11.如權利要求1所述的方法,其特征在于,所述具有指定的集體特性的DCA實例中的 一個或更多個DCA實例提供用于收聽者模式的普適實現(xiàn)的回調(diào)接口。
12.如權利要求1所述的方法,其特征在于,所述具有指定的集體特性的DCA實例中的 一個或更多個DCA實例包括對一個或更多個子類型和/或子DCA的范圍內(nèi)聲明。
全文摘要
通過由程序員提供對動態(tài)集合的集體特性的指定來達成對運行時具有可變數(shù)目個元素的動態(tài)集合的簡化處置。此類集體特性異于該集合的從其成員的類型和類型限定符得出的類型-成員特性。優(yōu)選地,此類動態(tài)集合是由應用定義的類型的屬性(即,成員)。
文檔編號G06F9/45GK102037446SQ200980118903
公開日2011年4月27日 申請日期2009年5月15日 優(yōu)先權日2008年5月21日
發(fā)明者D·R·謝里登 申請人:奧普塔姆軟件股份有限公司