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