專利名稱:適配演進的計算機軟件產品的制作方法
技術領域:
本發明涉及一種使計算機程序產品自動適配于環境的方法、自動適配的計算機程序產品,和用于制造所述自動適配的計算機程序產品的方法。
本發明基于優先權申請,歐洲專利05106615.7,在此將其引入作為參考。
背景技術:
在早期計算的原始設置中,程序復雜度很小,以至于一個人的思想就能完全包括整個程序的活動,直到最小的細節。現在,盡管計算機的能力已經以持續的幾何級數增加,然而人的能力卻沒有進展。為了從技術進步中獲益,必須開發并使用更抽象的概念工具和編程語言。
盡管單個程序員可以做出很大貢獻,然而復雜度級別已經遠遠超出一個人可以構思整個程序的范圍,這個程序能夠充分利用現有計算機。因此開發交換、協作、積累、構造的方法以精心制作復雜的程序非常重要;這是軟件工程的領域。
在2001年10月中期,IBM發布了聲明,指出管理當今計算系統的困難超過了單個軟件環境的管理。將幾個異構環境集成到公司范圍的(corporate-wide)計算系統中的需要、以及超過公司邊界而將其擴展到互聯網的需要,引入了新的復雜度級別。計算系統的復雜度似乎接近人的能力的限制,然而朝向增加的互連通性和集成的步伐,毫不減弱地快速前進。
在2003年1月IEE Computer Society發表的Jeffrey O.Kephart和David M.Chess的論文“The Vision of Autonomic Computing”中,建議創建根據管理者目標管理自身的系統。如新的細胞在生物系統中建立自身一樣不費力地集成新的組件。自動計算系統的本質是自管理,其意圖是從系統操作和維護的細節中解放系統管理者,并為用戶提供以最高性能運行的機器。如它們的生物學的同名物,在面對改變組件、工作量、要求和額外條件時,以及在面對無意或惡意的硬件或軟件故障時,自動系統將維護并調節它們的操作。
自動系統可以持續監控它自己的使用,并且檢查組件升級。如果它認為升級的公開性能(advertised feature)是值得的,則系統將安裝它們,如果必要就重新配置自身,并且運行回歸測試,以確保一切正常。當它檢測到錯誤時,系統將回到較舊的版本,同時其自動問題確定算法試圖隔離錯誤源。作者引用了自管理的四個方面表1
例如在普遍計算中發現的多個應用情景具有一個共同方面軟件將面臨持續改變的執行環境。為了保證無縫服務,協議、結構和應用必須能夠適配于在例如網絡、系統配置、可用資源、變化的策略中的改變。換言之,適配必須是任何移動軟件系統的關鍵性能。
通過用于使計算機程序產品自動適配于環境的方法,解決了自動計算的顯示(vision)以及去除后天的功能和結構需求的問題。
計算機程序通常包括可執行部分和數據部分,所述使計算機程序產品自動適配于環境的方法包括以下步驟針對環境配置計算機程序產品,并且在該環境中執行軟件,其中在程序內部觀測執行的效果(effect),即行為本身,即可執行部分;利用軟件分析被觀測效果的相互關系,并基于規則修改可執行部分以減小不期望的效果。
通過一種自動適配于環境的計算機程序產品而達到所述目的,所述計算機程序產品包括可執行部分和數據部分,所述計算機程序產品包括針對環境配置計算機程序產品以在該環境中執行該計算機程序產品的配置裝置,其中所述計算機程序產品包括觀測裝置,其用于觀測執行的效果,即可執行部分的行為;推斷裝置,其用于利用所述計算機程序產品來分析被觀測效果的相互關系;以及重新構造裝置,其用于基于規則修改可執行部分以減小不期望的效果。
通過一種制造這種自動適配的計算機程序產品的方法而達到所述目的,所述方法包括以下步驟通過集成用于觀測執行的效果(即可執行部分的行為)的觀測裝置,來配置(furnishing)所述可執行部分;通過用于利用軟件分析觀測效果的相互關系的推斷裝置,來配置所述可執行部分;以及通過用于基于規則而修改可執行部分以減小不期望的效果的重新構造裝置,來配置所述可執行部分。
換言之,建議用這樣的設計來替換通常的靜態軟件設計通過應用程序轉換技術、解釋器、抽象(虛擬)機、編譯技術、智能代理技術和高階編程來允許演進的需求,其中該靜態軟件設計不適合例如每天改變的環境中的普遍計算。例如代理(個體、自主服務,即獨立的軟件片段)的適配、修改和重新構造,使其能夠在演進(改變)的需求的環境中運行。應當指出,在本上下文中,配置和適配以及修改這些詞語變為同義詞。
發明內容
基本思想是變形(morphing)能力,這是指動態修改其運行時間的能力。變形(或演進)是一種實際效果,其中個體(實例、代理)的集合涉及執行特定的任務,訓練它們自己來增強它們解決任務的能力。
本發明也是一種優選地作為計算機軟件而被實現的制造方法,以及一種具有系統結構的計算機軟件產品,其中組件或部分被看作是自組織的獨立實體,該實體重新構造通過內部觀測的外部交互所激勵的自身。因此,計算機軟件產品包括可觀測且演進的組件用于觀測行為并改變自己。
這具有這樣的優勢產品是自演進的軟件。所述制造方法實現了改進的有效快速的原型化(prototyping)。產品本身能夠動態適配于改變的環境和需求。這導致針對必要適配和修改的開發工作的減少,并且提高了開發速度。所述技術允許創建自修復的軟件。通常的開發過程被簡化并且變得更具交互性和迭代性。最后一項要點是,動態演進的軟件組件將加速軟件和聯網技術,例如作為語義網絡的基礎,這是因為在代理團體中存在遺漏的技術,即除了對特定功能性的請求的刪除之外,該功能性到請求實體的實際轉移。本發明也適于自動減小軟件熵,這產生了改進的軟件設計。以變形環境和計算資源為代價,通過應用本發明可以達到所有所述及許多其它優勢。
下面將通過比較傳統應用的技術和根據本發明的方法來實現本發明的目的,以及它們的應用在根據本發明的計算機軟件產品中導致怎樣的結果。
圖1概略地示出了根據現有技術和根據本發明的制造方法;圖2示出了迭代制造過程的不同階段的工作;圖3概略地示出了根據本發明的計算機軟件產品的粗結構;圖4概略地示出了說明根據本發明方法的粗結構的組件的協作;
圖5概略地示出了演進歷史。
具體實施例方式
通常計算機軟件產品包括兩個部分用于存儲并呈現信息的數據部分,和執行功能狀態。在通常的編程語言中,這些例如呈現為變量值。目前,數據部分通常是基于數據類型、對象以及甚至是數據庫,該數據庫能夠使對象持續。更高級的程序語言以及特別是非命令式語言,如ProLog或LISP,模糊了這兩部分的隔離。然而,在有助于存儲狀態的部分(即特定的程序配置)和有助于被評估(執行的另一個術語)時改變這些狀態的部分之間進行區分幾乎是可能的,參見例如任何種類的正式語義描述,如可操作語義、邏輯語義或甚至是聲明語義。
例如代碼轉換,以及高階編程或自修改代碼的任何應用,在這個定義中是例外的情況,所述轉換似乎是可執行部分,并且所述代碼是數據部分,盡管代碼是可執行的。所述部分的定義具有這樣的上下文部分實際上被執行,即從可操作語義角度來說能夠改變(抽象的)機器配置。模型在下面被簡化并且被理解為操作,能夠改變機器狀態的代碼部分,數據部分。簡單來說操作導致在狀態變化時變得明顯的動作。
自修改代碼稱為軟件片段,它通過在進行時重寫自身來達到它的目的。目前,這普遍被認為非常有害且嚴峻的,但是它通常是編程者工具箱中一種極佳的手段。
圖1在左邊示出了示例性迭代軟件創建過程。其開始于初始規劃1,接著是需求分析2和設計3,即或多或少將所需功能性轉換為體系結構描述。可以在4實現結果,即就編程環境再形成所述結果,這導致可以在5對照需求而被測試的實現,即對照預期功能性。最終在6分析并評估差異,其導致額外的需求。另一個循環開始。最終,當如此完成需求的覆蓋時,在7部署軟件產品,即針對可以被看作是從創建階段P1向可操作階段P2轉變的操作來分配該軟件產品。
在如問題陳述中所指出的可操作階段P2中,通常出現其它需求,而另外幾個需求消失。假設軟件產品自身能夠建立其它迭代以適配于改變的需求,過程繼續進行到另一個需求分析8,然后是重新設計9,以及重新實現10。可以在11針對測試和度量來執行這個重新實現,并且如果在覆蓋額外需求時成功進行了修改,則最終在12進行評估。顯然,所述過程也是迭代的,這產生了演進的軟件產品。所述重新實現是軟件產品的版本,并且為了實現演進跟蹤并反向追蹤演進,使重新實現持續是優選的,即凍結中間部署13。
構建軟件的任何過程的中心是程序編碼。為了增強這些過程,將程序員從所有重復且概念上冗余的動作中解放出來,以使程序員可以專注于編程的本質,即關注沒有被解決的問題。
讀取、轉換或寫其它程序的編程領域的理論,包括概念函數式編程、宏編程,自然地出現在軟件開發鏈中,其中它扮演了很重要的角色,它僅是編譯器、解釋器、調試器的形式。然而,元編程(meta-programming)從未被集成到開發過程中,并且獲得其角色的感知(即軟件內部的可觀測屬性)是這個領域中的一個進步。
添加(編程)對象的正交持續(orthogonal persistence)是另一個進步。開發凍結13強制所述正交持續,其中該正交持續是一種其中對象持續直到不再被需要的屬性,利用動態優化代碼的自動一致性管理的程序二進制碼的編譯和管理,利用結構驅動的用戶連接的用戶接口驅動的編程,利用隱式自動分發的顯式人工聯網。
可操作階段需要元編程。元編程是操縱程序的活動性,其反過來操縱程序。所述階段也需要反映(reflection)。反映是系統充分認識自己的能力,從而動態元編程它們自己的行為、使它們自己適配于改變的環境、并將程序員和管理員從當前需要人工完成的許多任務中解放出來。
反映允許系統結構的動態擴展、如果沒有反映,則必須重新構造新的系統,并且例如每次結構改變時重新啟動。
在技術的級別,以上內容都意味著服務的中斷、服務的不可靠、服務的拒絕和進展的未知;但是在社會心理的級別,反映的缺乏也意味著人們必須進行不可逆轉的靜態結構選擇,并且不考慮結構改變。反映是一種技術優勢,但是也是一種社會心理的需求,其允許通過演進概念結構而不管歷史選擇的個體進展,以及通過統一用戶情況而不管個體和非共享背景的多樣性的團體進展。
實際挑戰是構建這樣的系統可以一致地調整單獨開發的性能,其中每個性能關于其它性能而處理計算的不同方面。如LISP的高級編程語言能夠表達邏輯推理(包括商數)和計算反映二者,即能夠指定、實現并任意檢驗分離軟件組件之間復雜的后天關系。
圖3示出了粗結構,其能夠解決元編程和反映。作為通常開發的軟件產品,假設程序P由觀測器O來觀測,這由程序P和觀測器O之間的箭頭表示。觀測器具有一種對執行程序時所發生事情的警覺或感知。只要觀測匹配于元編程規則,就從觀測器O觸發效應器E以重新構造程序P。這個通用結構和通用協作實現了自修改代碼的顯示。
圖4精煉了所述結構。程序P包括可執行部分EX,其被配置(intrumented)用于由構成觀測器O一部分的測量組件ME所執行的測量。例如通過比較識別器RE處的重構試探法(re-factoring heuristics)和所述測量,來評估該測量。當指示重構時,觸發作為效應器E一部分的重構部件,來重新構造例如代碼CO,可以從該代碼得出新的可執行部分。重構部件可以記錄它的動作,并且使得舊的和新的版次(revision)持續,其是由版次管理部件RM來管理的。
下面示例性地概述了如何配置LISP程序P以示出觀測器O的可行性。所述技術的創新在于僅在可觀測軟件屬性上限制了觀測器,并且沒有試圖觀測軟件如何適合于軟件環境。
將所述技術轉換到如邏輯編程的另一編程范例十分直觀,以例如使用以謂語構建的“再斷言”來重新構造邏輯程序并通過添加合適的約束變量給ProLog中的謂語來配置從句。在代表面向對象的編程范例的Smalltalk中,配置(instrumentation)可以被集成到開發環境或對象元類中。
在LISP中,定義操作符適于配置LISP代碼,例如通過觀測作為軟件屬性的數據部分,其在所述例子中是LISP變量的觀測。
表10
DEFVAR類具有對變量的示例屬性建模的幾個槽(slot),以及修改這些標記的幾個方法,即維護所述描述對象的一致性。
表11
通過宏defvar*增強編程環境,其在定義變量時創建描述對象。
典型地,變量的一致重命名,關于是否正確初始化變量的檢測,或變量的使用,是難于處理的。這個相當原始的觀測器能夠應付所述困難,并且允許例如通過(morph-var-statistic‘x’value)來探索(explore)變量的初始值。
觀測器DEFVAR類是能夠存儲變量屬性的數據結構,所述屬性例如它們的位置、它們的使用、值-通常是所有內在的可觀測屬性,甚至是變量之間的關系。
當定義變量時通過配置觀測器的宏defvar*來擴展語言本身。觀測在通過下一個代碼引用(excerpt)所示例性示出的函數之間的關系是很困難的。
為了實現動態、適配的軟件系統,擴展編程語言來支持反映;這稱作感知。其包括對行為的動態修改的支持,即自修改代碼,或易變的元對象協議。LISP中的宏似乎是進行上述操作的適當工具。
DEFUN類對defun所定義的函數進行建模。DEFUN類的實例“知道”其依據語法的形式(名稱、簽名、主體...),其文件位置。此外,觸發所述函數的函數名稱,和由該函數觸發的函數名稱,作為關系的例子。任何時候用宏defun*定義函數,所述類的實例被創建并被插入類-變量函數列表的協議。在程序開發期間,所述類的實例獲取關于它們自己的知識,并提供信息給“感知“層,以支持關于當前程序結構的推理。以下作為例子而說明了應用。
表12
感知類對函數的觀測屬性進行建模,即角色,與其它部分的關系,和軟件中的角色,例如調用方、被調用方和調用數目等。為了探索所述觀測器的能力,建議在LISP執行環境中測試所述代碼。
表13
這說明可以配置程序以測量可觀測的執行事件,并且基于編程環境內的測量,動態推導在程序部分之間的可觀測(相互)關系,例如調用方函數、被調用方函數、調用的數量、變量的使用等。顯然,在上述例子中,最好使用FIB的可存儲版本,這是因為對于所有調用,耗用的時間似乎更短,即(fib 19)0.125s,(fib 30)23.72s。
本發明的下一部分是能夠控制代碼修改的觀測器O的功能性。
表14
顯然,存在這樣的實例其具有gensym#<DEFUN-CLASS 206A1B84>,它承載了如由上述檢查所說明的編程邏輯。其可以被命令以改變代碼為存儲版本。
表15
結果是現在當前版本的通常評估和存儲版本之間的時差為0s。
編程語言上的每個FAQ包括代碼改進建議的較大集合;存在許多關于代碼優化和構建技術的書籍,例如參見在1993年8月的Lisp users andVendors conference出版的Peter Norvig和Kent Pitman的“Tutorial onGood LISP programming Style”中好的和不好的編程例子;這可以從http//www.iiia.csic.es/~puyol/TAPIA/transpas/Norvig-luv-slides.pdf下載。
函數預留代碼修改的例子例如是動態編程,即為了重新使用而存儲函數結果。這需要多數情況下是統一的軟件的數據部分適配。這意味著要存儲的結果應當滿足以下所有標準函數的返回值不應該從調用到調用改變,函數不應具有副作用,并且函數不應使用易變的自變量(argument)。顯然,存儲每次調用時都會改變的函數是無用的。同樣,不存儲具有故意副作用的函數是重要的(以某種方式更新狀態的函數-這是可觀測的屬性,并且可以由上述觀測器技術來統計地檢測),這是因為針對后續調用不會重復副作用。存儲具有易變自變量的函數是危險的,這是由于相同原因,即存儲易變的類在散列表中是危險的。如果利用自變量調用存儲函數一次,使自變量對象轉變,則第二次調用函數,存儲器可能將其看作是緩存命中(cache hit)并且不重新計算所述值。簡言之,可能返回錯誤值。不幸的是,判斷代碼是否可以受益于存儲的唯一方式是對它進行概要(profile),即,令觀測器確定函數是否可以存儲。
通常(如上所示的)稱作存儲的這個技術,允許“記住”先前調用的函數,如果利用與先前執行完全相同的自變量而進行調用則返回先前計算的值(而不是重新計算)。“自動”存儲是指現有函數可以被轉換為存儲函數,而無需針對函數自身進行代碼中的任何改變。如果計算在程序執行的各個點上被重復,則這可以導致巨大的加速,同時仍對代碼的用戶保留一定程度的透明。至少存在四種存儲的基本應用。函數調用內的重復下面所說明的這個情況是當單個例程超過需要地調用一些子例程時(或遞歸地調用其本身)時,這導致額外的計算。通過存儲,利用動態編程的效應,這些結果立即被返回用于后續的調用。實際上,所述第一種情況可以被認為是用于自動動態編程的工具,但是無需以正確的順序構建子片段(sub-piece)。這通常會將指數算法的時間縮減至多項式或甚至線性時間。給定足夠的考慮,這可以通過以下操作而無需自動存儲便利(facility)地被解決以適當順序構建子片段,或維護專用本地數據結構以保留結果。自動進行所述操作的優勢在于如果已經測試了簡單算法則需要較少的調試和測試,本發明允許運行時來回地改變,這更加透明,并且簡單容易地使用。時間上的重復第二種情況針對時間上重復的、但是從程序中的離散位置的函數的調用,或甚至當用戶在交互式程序中重復地取消(revoke)時。這通常通過常數因子而產生了加速,但是所述因子可能較大。無需自動存儲便利,僅有的可選方案是維護專用全局數據結構,這需要測試和調試,以及針對最多與存儲一樣有效的事情的許多額外工作。離線(off-line)運行第三種情況是當函數太復雜,以致于執行離線計算并為稍后的會話保留結果需要一定的付出(pay-off)。自動存儲便利提供了簡單透明的方法來保留結果,并且在稍后的會話中將所述結果自動關聯于函數。定時和概要最后的情況是當在傳統的性能概要和優化中將存儲用作工具時。觀測器可以提供某種度量(metering)系統,并且這可以用于主要測試實例。通過使用存儲時間或利用存儲,用戶可以存儲正討論的例程,然后多次運行相同的測試實例。如果相同的測試實例在第二存儲運行期間運行僅快了5%,則這表明正討論的例程中沒有存儲會在測試實例的性能中產生多于5%的差異,并且這可能不是開始優化工作的位置。
存儲僅對于作為真函數(true function)的例程有意義,而不是過程。即,輸出必須完全由輸入所確定,并且全局變量上不存在內在相關性,或其它副作用。如果存儲函數返回稍后被破壞地修改的值,則隨后期望初始值的調用替代地得到被修改值。例如,一種用于在列表上執行破壞操作(nconc,指定位置上的setf,sort等)的憑經驗規則(rule of thumb)是,僅當列表是最近被構造(cons)時才是安全的即,你可以保證為你提供列表的函數已經構建了它,并且因此它不與別處使用的列表共享結構。然而,如果構建列表的函數被存儲,則不再重新構造所述列表,并且破壞操作可能導致發生問題。存儲使用EQUAL來比較當前自變量列表與以前的列表。如果自變量列表包含一些條目,其中僅EQUALP可以識別兩個不同對象具有相同的內部值,則可能產生不適當的重復。SAVE-MEMO-TABLE代碼取決于具有READ可以再次解釋的對象的打印表示。這對于列表、符號、數字和字符串是正確的,但是對于數組、散列表、CLOS實例等是不正確的。在一些所述情況下,可以定義客戶打印函數,但是通常在可以在要保存到磁盤的存儲函數中的值類型(輸入或輸出)上有所限制。
默認地使用EQUAL,通過在自變量列表上進行準確匹配來執行存儲。類似地,當自變量是浮點數時一個人可以具有違反直覺的結果,例如忘記2不等于2.0,1.234567不等于1.23456等,即使你的函數可能等同地對待它們。在多數情況下,存儲是時間和存儲器的折衷。在極端情況下,其中頻繁重復的函數生成了較大的結構,存儲可能實際上節省了存儲空間(沒有無用信息),但是在大多數情況下,犧牲空間以獲得速度。應當仔細評估這些折衷,這通過使用觀測器來了解函數實際重復的頻率,WITH-MEMORIZATION和MEMORIZED-TIME(針對存儲和未存儲版本二者報告時間和空間)。幸運地,所有這些屬性都是可觀測的,例如通過簡單地模擬存儲和未存儲的函數的測試實例集合。可以在例如Proceedings of the Sixth International Symposium on Artificial Intelligence中Marty Hall和James Mayfield的“Improving Performance of AISoftware”中找到有關存儲的其它細節。
然而,將存儲包裝(memorizing wrapper)應用于現有代碼十分容易,并且重要的是,這正如去除包裝一樣容易。這意味著以下簡單的優化策略(半)自動地選擇作為存儲候選的函數。添加存儲包裝到函數。觀察函數(和整個系統)的行為。如果性能提升很小或沒有性能提升,則去除存儲包裝。用新的(存儲)代碼(真正變形)來替代函數。理想地,由于僅可以確定添加是值得的,因此可以分析自動添加存儲對整個系統的影響。一些方法即使本身計算上很復雜,也可能沒有受益于被存儲,例如簡單地由于從來不超過一次地利用相同自變量調用所述方法。
通過應用所述技術,觀測器例如可以觸發所述宏的應用,如果存在許多重復計算的、復雜的、例如時間上復雜的函數調用。不像在上述代碼片段中,執行能夠動態適配自身以記住函數調用,不僅是統一的,即針對所有調用,而是取決于實際執行。
例如,假設如貨幣轉換的簡單應用,假設還有兩個不同的用戶配置,第一配置是商店中價格的重復轉換。由于重復而存儲所述價格集合以及所述轉換。第二配置可能是旅行者的偶爾使用。在所述配置中,不太可能發生重復。因此幾乎沒有要存儲的。針對更復雜的轉換,例如速度識別器或用戶接口的任何反應行為,類似的自變量支持不同使用配置的使用。通常,重復的輸入序列可以通過應用所述方法來被存儲,并且大大增加反應和處理速度。
另一個功能上不等同的十分簡單的重構策略是動態代碼減少。只要觀測器識別到在很長的操作時間內沒有調用方法,則可以移除這個操作的代碼。結果是所述代碼修改產生了更小的代碼大小,以及更短的啟動時間,代價是只要偶爾使用函數就要進行版次反向跟蹤。動態識別并消除無用代碼。應當指出,在創建階段P1不能執行所述優化,這是因為針對任何執行,代碼是無用的還是有效的是個不確定問題。
在實際應用情景中,軟件清除未使用的組件,例如可以移除字處理器中長期未使用的專用格式化組件,而不會影響有效(實際使用)的功能性。
例如在William F.Opdyke的論文“Refactoring Object-orientedFrameworks”中,可以找到具有針對程序轉換的自動應用和應用的指示的、保守的重構策略的較大集合。
硬編碼的行為將為表達為高級目的的行為讓步,例如“最大化這個有用(utility)函數”,或“發現著名的消息轉換服務”。元素之中的硬布線(Hardwired)連接將為逐漸不直接的元素合作方的規范讓步-從物理地址的規范到名稱的規范,以及最終到函數的規范,其中合作方的身份僅在被需要時才被解決。硬布線關系將發展成通過協商建立的靈活關系。元素將無需人工干預地自動處理新的故障模式,例如提供商違反合同。
根據本發明的方法非常適用于面向服務的體系結構概念,例如web和grid服務或軟件代理。通過將自主元素看作代理并且將自主系統看作多代理系統,應當清楚,面向代理的體系結構概念是非常重要的,這是因為可以交換功能性而不僅是調用或交互。在部署之后,在面向對象的環境中的典型的高度調用的web服務或對象可以例如有利地被自動集成或聚集。為了知道服務更新,可以增強觀測器以檢測集成代碼和外部服務之間的功能分歧;優選地是靜態的并且與實際使用同時進行。
自主元素具有復雜的生命周期,持續地進行多個活動線程,并且持續感知并響應它們所處的環境。與它們環境的自主、前攝及有意圖的交互可以引導開發者,例如通過觀察軟件的兩個部分之間的特定關系,并且利用它們的優點和缺點來自動建議重新構造的可選方案。
一旦檢測到故障,可以遍及軟件的所有實例來分配所述知識,并且通過代碼修改來阻塞功能性。在必要的情況下,這種自主軟件可以甚至請求作者進行更新或修補。
統計模型可以支持觀測器的元編程知識,例如識別情景的上下文中哪些修改是有用的。通常,編程規則本身變得透明,這是計算機科學的新的方面。重新構造或高階編程,即將函數用作值的能力,即作為其它函數的自變量的函數以及可以是其它函數的返回值的函數,很少被應用并且相當理論化。這個類型的編程大多用于功能性編程,但是其在“規律的”面向對象的編程中也非常有用,并且它在應用本發明時通過工程方法以自然的方式被支持時也非常有用。
綜上所述,主要特征是充分深思熟慮的體系結構。圍繞這個深思熟慮的結構而構建的顯著特征將包括功能性抽象的統一、基于來自能力所控制的明確協商的公理的正式證明的安全性、高階函數、紋理細密的構成、分布式聯網、正交持續的存儲、容錯計算、版本感知、動態代碼重新生成、封裝的高級模型,這優選地利用高度執行的動態編譯集合。
具有演進的需求的每天改變的環境中普遍存在的計算,是一項技術挑戰。應付它的已知技術是程序轉換、解釋和抽象(虛擬)機、編譯技術、智能代理技術、演進的及動態的代數,以及高階編程語言。
技術上來說,適配演進(改變)的環境的第一技術之一,是操作系統和無用信息收集器中的存儲調度程序。它們使操作環境適配于靜態程序資源的需要。
盡管發生程序演進,然而程序資源本身至今都被看作是靜態固定的。開發階段和執行階段之間存在嚴格的距離。
即時(just in time)編譯器技術和高階編程語言環境,允許動態編譯和優化。如LISP和ProLog的高級環境甚至支持執行時的代碼修改。直到現在還不知道支持代碼變形的控制實例。(系統的變形能力是指動態修改其運行時間的能力)。
代數概念“演進代數”(EA,Evolving Algebra)提供針對本發明的必要語義學基礎。可以如下說明EA論點可以通過合造的EA來在每個算法的自然抽象級別上模擬所述算法。演進代數方法的主要目的是提供簡潔且可執行的算法的正式規范。
改變環境將在以后發生。已經知道結果損壞的參考或鏈接、遺漏資源、不相容等等。由于多種變型,應用到當前系統中的靜態代碼產生了(在徹底的(完全的)需求覆蓋的情況下)巨大的不易處理的軟件包。當兩個軟件片段之間的交互接口改變時,所述軟件丟失。由于相當靜態的軟件世界,當前方法可以應付改變的需求,但是其遠不是理想的巧妙解決方案。
另外的解決方案是這樣的系統其中組件或部分被看作是自組織的單獨實體,其重新構造由外部交互所激勵的本身。系統包括可觀測且演進的組件以改變自身。系統的一個重要部分是通過標識其上實現程序演進的“編程構建塊”來定義可執行的語義。
建議的技術實現了可以“學習”的算法,并且通過比較它的動作的結果與要達到的目的而改變它的行為。算法是一個程序,其可以被寫成一組步驟,用于從給定輸入產生指定的輸出。所建議的反饋控制是一種過程,機器或系統的輸出或行為通過該過程來改變其操作,以持續減少輸出和目標值之差。變形軟件個體,即基于結構動態修改其運行時間的能力(或就代理通信系統而言,代理的責任),是定義軟件系統的框架,所述軟件系統能夠在解釋的程序語言的級別上自修改并重新產生。
抽象地說,自修改系統包括觀測器實例、演進歷史和當前圖像(image),其中觀測器能夠檢查動態方面,如運行的、歷史的軟件部分之間的交互,即如版次或版本的演進快照(snap shot)的收集,并且圖像是(現行)運行時間。所述系統中的計算導致可觀測的事件并觸發了圖像的修改。
為了說明所述方法的動態,下面描述了一組使用實例。假設對象系統環境包含用于持續的對象歷史的面向對象的數據庫基本管理系統,即凍結實例,以及圖像內的現行實例。對象,即如變量、方法、類、實例、關系、消息、聚集等,具有屬性。觀測器檢測到當執行更新這些屬性時所發生的特定事件所導致的結果。所述系統也包括到外界的接口,其中(可觀測的)與系統邊界的交互發生,并且將變得可觀測-激勵了反應行為。
進一步假設類的對象實例的系統,其包括類和實例變量、具有選擇、判決、迭代、遞歸(方法調用)和其它通常的面向對象的構造的類方法和實例方法。持續在可操作狀態更新屬性的觀測器觀測這些構造中的每一個,所述屬性例如通過變量屬性而被說明該變量屬性例如是訪問數目、訪問實例、或更新(修改)數目等。
事件(存儲于屬性中)的模式可以觸發修改,如將對于所有實例通用的實例變量遷移到類變量中,或將全局變量遷移到實例或類變量中,或交換類(包含相關性)之間的槽等。
由于分布式(復雜)系統的組件中甚至較小的結構改變會導致不可預見的系統行為,因此建議逐步增長的小的改進。演進歷史可以用來以自動方式執行衰退測試,以增加對程序轉換歷史正確性的信心。
存在一組探索法的改進,例如丟棄幾乎不使用的代碼段,或聚集類或對象關系。此外,存在從編譯技術所知的多組(保守的)程序轉換。在(探索法)修改之前,環境可能凍結圖像的演進狀態以實現后向跟蹤。
所述技術能夠在個體中累積執行知識,所述個體如組件、實例或代理。例如,如果僅代理B經常使用(在運行時刻)代理A的特定行為,則代理A決定通過添加涉及的方法以及方案(類)到代理B,來將所述行為移至代理B。反之亦然,代理C可能需要代理A的第一能力,而代理B需要代理A的第二能力。觀測器從統計觀測識別情況,并且觸發A劃分為A1和A2;在該劃分之后,這些部分被融入代理B和C中。
圖5中示出了所述情景,示出了軟件S1、S2的演進歷史H。軟件S1、S2被示為多邊形的三角形,其中三角形是軟件的模型組件C、C’。多邊形可以被看作是軟件的邊界。歷史開始于初始演進軟件S1,除了其它組件C,該軟件S1包括改進組件IC。假設可觀測的屬性是三角形的協調性,其中區域是一種針對組件的某種(可測量的)復雜度的測量,如耗用時間。在軟件S2的演進版本中,三角形似乎更為諧調,即組件被變形為一種改進的配置/分布/安排。
本發明實現了方法(函數)行為的優化和重組織的智能且自動的應用,如存儲器(通用緩存包裝)。它們的先決條件是不應當從調用到調用改變方法的返回值并且所述方法不應具有副作用。所述方法不應采用易變的自變量。有效的緩存包裝大大地增強了反應性。另一個重組織是(動態)部分評估。部分評估創建了通用程序的專用版本。專用程序可能更有效并且比通用版本運行更快。令P是程序,其采用兩個輸入D1和D2。通常,在一個步驟中評估P對(D1,D2)的應用用輸入(D1,D2)評估P以產生結果res。然而,可選地,它可以根據Curry-Howard(柯里-霍華德)同構在兩個步驟中被評估首先用輸入D1部分評估P,其產生新的程序R,即P的參數化版本。然后,用輸入D2評估R以產生結果。程序R是P的專用版本(針對第一輸入的特定值D1),并且稱為剩余(residual)程序。產生R的過程稱為部分評估,或程序專用化。部分評估的一個優勢在于執行速度專用程序R通常相比通用程序P更快,另一個優勢在于接口效率和聚集的簡化。
實現變形代理,必須使用支持動態的面向對象的編程的編程語言,其通過提供強大的元對象協議而包括在運行時間改變程序(類)和結構的能力。動態的面向對象的編程是一種軟件開發技術,其實現了在開發期間且在部署之后調整應用而無需訪問源代碼。建議的環境因此包括動態對象(運行時間改變=演進)、對象持續(存儲/檢索對象結構和方法=版本化)、(交互的)代碼操縱(逐漸增加的change-eval/compile-run循環),建議了元對象協議(關于對象的反映/推理)。
對照程序合成(從描述產生程序的宏步驟),本發明處理“代碼演進的環境”的兩級結構(通過演進增強程序的微步驟)。第1級稱作“環境”,其負責觀測個體(程序構造)、微改變的個體(程序轉換),度量行為(統計以及探索法)、學習新規則、更新規則、對象庫(=知識)更新或推斷(例如編程)源更新(具有產生的評論)事件、知識庫等。
第2層稱作“目標程序”(要開發的軟件的當前版本)。所述目標具有如包、類、實例等的組件,下至每個程序構造,其中每個所述構造具有環境中的“模型”。所述模型以及修改、觀測規則,使得環境能夠建議演進步驟。下面是概念/方法/條件的列表,其導致(半自動)程序修改。
如果系統判定可以通過更有效地重新構造參與個體(實例、代理)的知識來改進任務性能,則個體本身可以執行重新構造。
由于分布式(復雜)系統的組件中小的結構改變會導致不可預見的系統行為,建議了逐漸增加的小的改進。
自主程序操縱的概念大規模地(in the large)允許全面影響程序的操縱,而不僅是本地上在一個模塊中。兩個大規模的例子是模塊間重命名和重組織。為了找到引導重組織已知(靜態)軟件的應用的使用的標準,建議了度量。所述度量可以基于詞匯隱匿和測量過度可見性的原理。存在越大的過度可見性,即沒有使用的可見項越多,度量值就越小。發展靜態軟件度量的數量以增加軟件質量。這些度量用作較差結構的項目部分的好的指示符。
權利要求
1.一種用于使計算機程序自動適配于環境的方法,所述計算機程序產品包括可執行部分和數據部分,所述方法包括以下步驟針對環境配置所述計算機程序產品,并且在該環境中執行軟件,其中,所述方法還包括以下步驟觀測執行的效果,即度量所述可執行部分的行為;利用所述軟件分析被觀測效果的相互關系;并且基于規則修改可執行部分以減小如低效或故障的不期望的被觀測效果。
2.根據權利要求1的方法,還包括配置和改變管理,即代碼部分持續的修改或狀態。
3.根據權利要求1的方法,其中,所述被觀測效果是無用代碼的檢測,并且所述修改包括被標識無用代碼的消除。
4.根據權利要求1的方法,其中,所述被觀測效果是兩個部分之間緊密關系的檢測,并且所述修改包括將所述兩個部分重新構造在一起,例如將交互對象置于相同組件中、聚集外來調用方法、將變量置于合適的范圍中等。
5.根據權利要求1的方法,其中,所述被觀測效果是重復行為,并且所述修改包括添加對該重復行為的存儲。
6.根據權利要求1的方法,其中,所述被觀測效果是部分評估,并且所述修改包括柯里-霍華德態射的應用,即針對每個x存在更有效的f_x,其中f(x,y)=f_x(y)。
7.根據權利要求1的方法,其中,當執行所述軟件時,執行所述觀測、分析和適配,其中優選地在背景中執行所述適配。
8.根據權利要求2的方法,其中,關于不期望的效果和功能等價,將先前版本與當前版本進行比較。
9.一種自動適配于環境的計算機程序產品,所述計算機程序產品包括可執行部分和數據部分,所述計算機程序產品包括配置裝置,該配置裝置用于針對環境而配置所述計算機程序產品,以在該環境中執行該計算機程序產品,其中,所述計算機程序產品包括觀測裝置,其用于觀測所述執行的效果,即所述可執行部分的行為;推斷裝置,其用于利用所述計算機程序產品來分析被觀測效果的相互關系;以及重新構造裝置,其基于規則修改可執行部分以減小如低效或故障的不期望的效果。
10.根據權利要求9的計算機程序產品,還包括實現根據權利要求1到7中任一個的方法的編程裝置。
11.一種用于制造根據權利要求9的自動適配的計算機程序產品的方法,其中,所述方法包括以下步驟通過集成觀測裝置來配置所述可執行部分,其中該觀測裝置用于觀測所述可執行部分的執行效果,即行為;通過用于利用所述軟件分析被觀測效果的相互關系的推斷裝置來配置所述可執行部分;并且通過用于基于規則修改可執行部分以減小不期望的效果的重新構造裝置來配置所述可執行部分。
12.根據權利要求11的方法,其中,將所述觀測、分析和/或適配通知給開發者。
全文摘要
本發明涉及一種用于使計算機程序產品自動適配于環境的方法,所述計算機程序產品包括可執行部分和數據部分,所述方法包括以下步驟針對環境配置所述計算機程序產品,并在該環境中執行軟件。此外,所述方法包括以下步驟觀測可執行部分的執行效果(即度量行為);利用軟件分析被觀測效果的相互關系;并且基于規則修改可執行部分以減小如低效或故障的不期望的觀測效果。本發明也涉及自動適配的計算機程序產品,以及用于制造所述自動適配的計算機程序產品的方法。
文檔編號G06F9/44GK1900907SQ20061010144
公開日2007年1月24日 申請日期2006年7月13日 優先權日2005年7月19日
發明者M·W·霍赫, H·勒斯勒爾, P·薩博 申請人:阿爾卡特公司