專利名稱:調(diào)試優(yōu)化代碼的方法和設(shè)備的制作方法
技術(shù)領(lǐng)域:
本發(fā)明一般涉及用來改進(jìn)軟件應(yīng)用性能的方法和設(shè)備。更確切地說,本發(fā)明涉及為調(diào)試系統(tǒng)提供足夠信息以有效地調(diào)試已優(yōu)化代碼的方法和設(shè)備。
在努力提高與計(jì)算機(jī)程序的執(zhí)行有關(guān)的效率方面,許多計(jì)算機(jī)程序已經(jīng)“優(yōu)化”。優(yōu)化計(jì)算機(jī)程序一般用來清除計(jì)算機(jī)代碼中那些基本不用的部分。而且,優(yōu)化計(jì)算機(jī)程序可以重構(gòu)計(jì)算操作使得整個(gè)計(jì)算更有效地執(zhí)行,從而消耗更少的計(jì)算機(jī)資源。
優(yōu)化器用來有效轉(zhuǎn)換計(jì)算機(jī)程序,例如,將用諸如C++,F(xiàn)ORTRAN或Java字節(jié)代碼的程序語言編寫的計(jì)算機(jī)程序轉(zhuǎn)換成更快的程序。更快的或優(yōu)化的程序一般包括與原來的或轉(zhuǎn)換前的計(jì)算機(jī)程序?qū)嵸|(zhì)完全一樣可見的行為。特別地,優(yōu)化程序包括與它相關(guān)源程序一樣的數(shù)學(xué)行為。然而,優(yōu)化程序一般用較少計(jì)算重建同樣數(shù)學(xué)行為。
典型地,優(yōu)化器包括寄存器分配器和內(nèi)核優(yōu)化器。本領(lǐng)域的技術(shù)人員可以理解,寄存器分配器將計(jì)算從存儲器空間移到寄存器空間,同時(shí)內(nèi)核優(yōu)化器完成與優(yōu)化程序有關(guān)的數(shù)學(xué)計(jì)算。在生成優(yōu)化程序的過程中,優(yōu)化器清除不用代碼。例如,那些與在源程序中循環(huán)外不用的變量有關(guān)的代碼一般都被清除。這些變量可包括但不限于在循環(huán)中用作索引的計(jì)數(shù)器變量。
當(dāng)優(yōu)化器轉(zhuǎn)換計(jì)算機(jī)程序時(shí),優(yōu)化器時(shí)常生成計(jì)算機(jī)程序的內(nèi)部表示。然后該內(nèi)部表示可用來生成與計(jì)算機(jī)程序的計(jì)算碼的機(jī)器碼。
圖1是轉(zhuǎn)換計(jì)算機(jī)程序成優(yōu)化計(jì)算機(jī)程序的優(yōu)化器的框圖表示。計(jì)算機(jī)程序104,它可用任何合適的計(jì)算機(jī)程序語言編寫,提供給優(yōu)化器110。如圖所示,計(jì)算機(jī)程序104包括“for”循環(huán)106,循環(huán)中包括變量“i”。
優(yōu)化器110,它有效地作為一個(gè)編譯器,包括內(nèi)部表示生成器114和機(jī)器碼生成器118。內(nèi)部表示生成器114將計(jì)算機(jī)程序104當(dāng)作輸入,產(chǎn)生計(jì)算機(jī)程序104的內(nèi)部表示122。內(nèi)部表示生成器114典型地刪除不用代碼,如象變量“i”的索引變量,以便內(nèi)部表示112不引用這些不用代碼。
提供內(nèi)部表示112作為輸入給機(jī)器碼生成器118,機(jī)器碼生成器118生成機(jī)器碼126,如已轉(zhuǎn)換的計(jì)算機(jī)程序104計(jì)算碼。由于內(nèi)部表示112不包括對不用代碼的引用,可以理解機(jī)器碼126也不包括對這些不用代碼的引用。由于清除了這些不用代碼,機(jī)器碼126比它包括不用代碼時(shí)可以更有效率地執(zhí)行。
當(dāng)機(jī)器碼將被調(diào)試時(shí),代表已轉(zhuǎn)換或已優(yōu)化版本的計(jì)算機(jī)程序104的機(jī)器碼126一般是用調(diào)試器來訪問的。當(dāng)由于各種各樣不同的原因機(jī)器碼被調(diào)試的同時(shí),為了確定在優(yōu)化碼中明顯的錯(cuò)誤,優(yōu)化碼經(jīng)常被調(diào)試。調(diào)試也可出現(xiàn)來確定與該代碼有關(guān)的內(nèi)部狀態(tài),這對本領(lǐng)域的技術(shù)人員是能理解的。圖2是描述與優(yōu)化程序和調(diào)試已優(yōu)化程序有關(guān)的步驟的過程流程圖。優(yōu)化和調(diào)試程序的過程200開始于步驟202,在該步驟優(yōu)化器獲得包括不用值或變量的程序碼。一旦獲得程序碼,在步驟204生成程序碼的內(nèi)部表示。生成程序碼的內(nèi)部表示一般必須刪除那些不用值的引用,象前面討論的一樣。
程序碼的內(nèi)部表示產(chǎn)生以后,在步驟206從內(nèi)部表示生成機(jī)器碼。然后調(diào)試器在步驟208訪問機(jī)器碼。并從機(jī)器碼獲得可用的調(diào)試信息。一般地,調(diào)試信息包括位于機(jī)器碼中不同點(diǎn)的狀態(tài)信息。這樣的調(diào)試信息由“解優(yōu)化”已優(yōu)化碼來生成的。當(dāng)不用碼,如死亡變量,從已優(yōu)化程序中刪除時(shí),那些不用碼一般不可以在調(diào)試過程中重新獲得。因?yàn)槿绱?,調(diào)試碼和優(yōu)化碼之間的準(zhǔn)確關(guān)系要么可能不能獲得,要么不正確,這一點(diǎn)對于本領(lǐng)域的技術(shù)人員是可以理解的。換句話說,獲得的調(diào)試信息可能是不準(zhǔn)確的。一旦獲得調(diào)試信息,優(yōu)化碼和調(diào)試已優(yōu)化碼的過程完成。
在有虛擬機(jī)的環(huán)境中,如由加州Palo Alto的太陽微系統(tǒng)公司開發(fā)的JavaTM虛擬機(jī),希望轉(zhuǎn)換優(yōu)化碼為解釋碼。為了準(zhǔn)確的將優(yōu)化碼返回成解釋碼,有效的JavaTM虛擬機(jī)狀態(tài)一般為所有變量所需要。在屬于某些狀態(tài)的代碼在優(yōu)化過程中可能已刪除的事件中,不是所有狀態(tài)是可用的。當(dāng)這樣的狀態(tài)不可用時(shí),轉(zhuǎn)換成解釋碼一般可能根本不發(fā)生,或可能不準(zhǔn)確。轉(zhuǎn)換中的不準(zhǔn)確可能對整個(gè)計(jì)算環(huán)境實(shí)質(zhì)上導(dǎo)致不正確的結(jié)果。
因此,希望從優(yōu)化碼中獲得調(diào)試信息的有效方法。也就是,所需要的是一個(gè)方法和設(shè)備,它能激活與在調(diào)試或優(yōu)化過程中有效獲得的不用值的相關(guān)狀態(tài)。
本發(fā)明涉及為了調(diào)試已優(yōu)化計(jì)算機(jī)程序碼,提供調(diào)試器的狀態(tài)信息的實(shí)際上的全集而不顯著影響系統(tǒng)性能。根據(jù)本發(fā)明的一個(gè)方面,獲得與程序碼相關(guān)的信息的方法包括增加代碼段至程序碼中,該代碼段包括計(jì)算后不再有效使用的表示,即“調(diào)試碼”。在代碼段的附近選擇“斷點(diǎn)”,并且從程序碼中產(chǎn)生機(jī)器碼。最后,方法包括將斷點(diǎn)處的指令替換為用來引發(fā)調(diào)試碼執(zhí)行的分支指令。通過執(zhí)行調(diào)試碼,使得在已優(yōu)化機(jī)器碼中一般將被清除的狀態(tài)對調(diào)試器或解優(yōu)化器是可用的,從而激活將被準(zhǔn)確調(diào)試或解優(yōu)化的機(jī)器碼。
根據(jù)本發(fā)明的另一方面,獲得與程序碼相關(guān)的信息的計(jì)算機(jī)實(shí)現(xiàn)的方法可包括增加對與程序碼有關(guān)的子程序,即“調(diào)試碼”,的調(diào)用。調(diào)用子程序包括包括多個(gè)參數(shù),其中至少一個(gè)參數(shù)對應(yīng)與計(jì)算有關(guān)的表示的引用。對于程序碼和子程序,該表示實(shí)際上不使用。計(jì)算機(jī)實(shí)現(xiàn)的方法也包括用實(shí)際轉(zhuǎn)換子程序調(diào)用為調(diào)試碼,生成與程序碼有關(guān)的機(jī)器碼。
在本發(fā)明的另一個(gè)方面,調(diào)試優(yōu)化碼的方法包括生成較高級的程序表示,它包括帶相關(guān)計(jì)數(shù)器值和調(diào)試碼段的循環(huán)部分。該方法還包括通過轉(zhuǎn)換較高級程序表示為包括與調(diào)試碼和斷點(diǎn)有關(guān)部分的較低級碼的方法而優(yōu)化較高級程序表示。斷點(diǎn)處的指令用使引發(fā)與斷點(diǎn)有關(guān)的部分執(zhí)行的分支指令來替換。最后,調(diào)試碼被執(zhí)行,從而提供與計(jì)數(shù)器值相關(guān)的信息。
閱讀以下詳細(xì)說明和研究附圖后,本發(fā)明的這些和那些優(yōu)點(diǎn)是明顯的。
參照下面結(jié)合附圖的說明,可以最佳理解本發(fā)明,其中圖1是轉(zhuǎn)換計(jì)算機(jī)程序?yàn)閮?yōu)化計(jì)算機(jī)程序的優(yōu)化器的框圖表示。
圖2是描述與優(yōu)化程序和調(diào)試已優(yōu)化程序有關(guān)的步驟的過程流程圖。
圖3a是依照本發(fā)明的實(shí)施例,轉(zhuǎn)換帶斷點(diǎn)碼的計(jì)算機(jī)程序?yàn)閹帱c(diǎn)碼的已優(yōu)化計(jì)算機(jī)程序的優(yōu)化器的框圖表示。
圖3b是依照本發(fā)明的實(shí)施例,有包括斷點(diǎn)指令的機(jī)器碼320的圖3a的優(yōu)化器310的框圖表示。
圖4是依照本發(fā)明的實(shí)施例,描述與優(yōu)化和調(diào)試帶調(diào)試碼的計(jì)算機(jī)程序相關(guān)的步驟的過程流程圖。
圖5是適合實(shí)現(xiàn)本發(fā)明的通用計(jì)算機(jī)系統(tǒng)的框圖表示。
圖6是圖5的計(jì)算機(jī)系統(tǒng)支持的并且適合實(shí)現(xiàn)本發(fā)明的虛擬機(jī)的框圖表示。
有時(shí),希望或必須調(diào)試優(yōu)化碼。一般地,編譯器不支持優(yōu)化碼的調(diào)試。當(dāng)代碼被優(yōu)化,那些在源代碼中原來可得到的信息可能被毀壞。例如,死亡變量可能被清除。因此,當(dāng)試圖調(diào)試優(yōu)化碼時(shí),一般不可能取得與死亡變量有關(guān)的信息。因此,獲得的調(diào)試信息可能不是準(zhǔn)確的。不準(zhǔn)確調(diào)試信息經(jīng)常使得很難跟蹤源代碼中的問題,也很難將優(yōu)化碼轉(zhuǎn)換回源代碼。
在如加州Palo Alto太陽微系統(tǒng)公司開發(fā)的JavaTM虛擬機(jī)的虛擬機(jī)的環(huán)境中,可能希望轉(zhuǎn)換已優(yōu)化碼為解釋碼。例如,很少使用的已優(yōu)化碼可以轉(zhuǎn)換成解釋碼來更好分配系統(tǒng)資源。為了執(zhí)行從優(yōu)化碼至解釋碼的轉(zhuǎn)換,有效的JavaTM虛擬機(jī)狀態(tài)一般為所有變量所需要。在與某些狀態(tài)有關(guān)的變量在優(yōu)化過程中可能已經(jīng)被刪除的事件中,不是所有狀態(tài)都是有用的。當(dāng)狀態(tài)不可用時(shí),轉(zhuǎn)換為解釋碼可能導(dǎo)致錯(cuò)誤的發(fā)生。轉(zhuǎn)換中的不準(zhǔn)確對整個(gè)計(jì)算環(huán)境可能導(dǎo)致實(shí)際問題。
包括如屬于死亡變量或不用值的信息的調(diào)試信息作為計(jì)算機(jī)程序的執(zhí)行語義學(xué)的一部分,同時(shí)也轉(zhuǎn)換調(diào)試信息,容許優(yōu)化器轉(zhuǎn)換計(jì)算機(jī)程序?yàn)樗淖罴涯芰?。盡管在優(yōu)化計(jì)算機(jī)程序的過程中轉(zhuǎn)換調(diào)試信息可能排除某些優(yōu)化,從而影響計(jì)算機(jī)程序的整體優(yōu)化性,可實(shí)現(xiàn)改進(jìn)的調(diào)試。特別地,準(zhǔn)確調(diào)試計(jì)算機(jī)程序所需的程序碼是優(yōu)化的,且寄存器與計(jì)算機(jī)程序的剩余部分一起被分配。這樣,計(jì)算機(jī)程序的優(yōu)化級相對是高的且仍顧及調(diào)試。
為了包括調(diào)試信息作為計(jì)算機(jī)程序執(zhí)行語義學(xué)的一部分,調(diào)試碼可以包括在計(jì)算機(jī)程序中。調(diào)試碼有效提供必要信息來通知運(yùn)行時(shí)間系統(tǒng),如定位象狀態(tài)值的值的調(diào)試器,并且約束了將清除不用值和在調(diào)試時(shí)可能需要的死亡變量的優(yōu)化。
圖3a是依照本發(fā)明的實(shí)施例,轉(zhuǎn)換帶斷點(diǎn)碼的計(jì)算機(jī)程序?yàn)閹帱c(diǎn)碼的已優(yōu)化計(jì)算機(jī)程序的優(yōu)化器的框圖表示。計(jì)算機(jī)程序302或源代碼,它可能用任何合適的計(jì)算機(jī)程序語言編寫,包括代碼段304。如圖所示,代碼段304是一個(gè)“for”循環(huán),該循環(huán)包括索引變量“i”,“i”是一個(gè)不用值或“死亡”變量。就是說,索引變量“i”一般不在“for”循環(huán)外使用。應(yīng)當(dāng)注意到,盡管代碼段304是作為“for”循環(huán)示出,但代碼段304可包括任何合適的循環(huán)。
在描述的實(shí)施例中,調(diào)試代碼306一般插入到“for”循環(huán)中,從而生成稍稍修改的計(jì)算機(jī)程序302′。盡管調(diào)試碼306可能大大不同,調(diào)試碼306通常是調(diào)試器調(diào)用,它將索引變量“i”作為參數(shù)作出調(diào)用。斷點(diǎn)碼306的布置用來標(biāo)識潛在斷點(diǎn)指令的位置。例如,調(diào)試碼306實(shí)際上可能放在計(jì)算機(jī)程序302′的任何地方,在這里需要與計(jì)算機(jī)程序302′有關(guān)的所有變量狀態(tài)的知識。調(diào)試碼306一般用來參照映射指向包含所要狀態(tài)的地點(diǎn)的斷點(diǎn)指針的表。
提供計(jì)算機(jī)程序302′給優(yōu)化器310,或更特別地內(nèi)部表示生成器312。優(yōu)化器310和調(diào)試器(未示出)一般作為編譯器的一部分被包括在內(nèi)。在所述的實(shí)施例中,內(nèi)部表示生成器312用來生成計(jì)算機(jī)程序302′的JavaTM表示314。然而,可以理解,其它合適的表示可用另外實(shí)施例中的內(nèi)部表示生成器312產(chǎn)生。表示314包括調(diào)試碼306的表示316。由于調(diào)試碼306的表示包含在表示314中,與不用值“i”有關(guān)的狀態(tài)信息出現(xiàn)在表示314中。
表示314作為輸入提供給為優(yōu)化器310的一部分的機(jī)器碼生成器318。由機(jī)器碼生成器生成的機(jī)器碼320包括與調(diào)試碼306有關(guān)的調(diào)試碼322。機(jī)器碼320也包括主體324,該主體包括與“for”循環(huán)304有關(guān)的代碼。調(diào)試碼322用來運(yùn)行以響應(yīng)斷點(diǎn),該斷點(diǎn)有效中止與“for”循環(huán)304有關(guān)代碼執(zhí)行。
調(diào)試器可以修改機(jī)器代碼320或更特別地,主體324,這樣到達(dá)調(diào)試碼322。當(dāng)調(diào)試碼322到達(dá)時(shí),可以獲得與不用值“i”有關(guān)的狀態(tài)信息。在JavaTM環(huán)境中,與不用值“i”有關(guān)的狀態(tài)信息可以用在解優(yōu)化過程中,在該過程將已優(yōu)化碼如已編譯碼,轉(zhuǎn)換成解釋碼。圖3b是依照本發(fā)明的實(shí)施例,有包括斷點(diǎn)的機(jī)器碼320的圖3a的優(yōu)化器310的框圖表示。分支指令360在與“for”循環(huán)304有關(guān)的主體324中要么替換要么覆蓋裝載指令。分支指令360使得程序邏輯跳到調(diào)試碼322,這里在執(zhí)行調(diào)試器或解優(yōu)化器的過程中可以獲得屬于不用值“i”的狀態(tài)信息。
一般地,諸如優(yōu)化器310的優(yōu)化器實(shí)質(zhì)上尊重與程序302有關(guān)的所有定義和使用,同時(shí)清除不用碼,這對于本領(lǐng)域的技術(shù)人員是可以理解的。增加調(diào)試碼306來容許獲得屬于不用值的狀態(tài)信息,可能減慢機(jī)器碼320的執(zhí)行,而且結(jié)果是對程序302的優(yōu)化的妥協(xié)。然而,已經(jīng)注意到,斷點(diǎn)一般并不顯著減慢機(jī)器碼320的執(zhí)行。換句話說,增加斷點(diǎn)至程序碼中極大提高了與程序碼有關(guān)的調(diào)試和解優(yōu)化能力,而不顯著犧牲程序碼的表現(xiàn)。
圖4是依照本發(fā)明的實(shí)施例,描述與優(yōu)化和調(diào)試帶調(diào)試碼的計(jì)算機(jī)程序相關(guān)的步驟的過程流程圖。優(yōu)化和調(diào)試計(jì)算機(jī)程序的過程450在步驟452開始,在該步驟獲得計(jì)算機(jī)程序或程序碼包括調(diào)試碼,以及不用值。在步驟454生成程序代碼的內(nèi)部表示。應(yīng)該理解,由于斷點(diǎn)碼包括在程序碼中的事實(shí),不能有效的清除不用值的同時(shí),內(nèi)部表示一般包括對于程序碼已簡化的計(jì)算。
在步驟454生成內(nèi)部表示后,在步驟458選擇斷點(diǎn)。在所述的實(shí)施例中,斷點(diǎn)的選擇涉及到確定諸如與不用值有關(guān)的內(nèi)部表示中的代碼段。一旦斷點(diǎn)被選擇,那么在步驟460,指向程序的調(diào)試碼,或更特別的,程序的內(nèi)部表示被插入。調(diào)試碼一般根據(jù)被選擇的斷點(diǎn)被插入。
對于本領(lǐng)域的技術(shù)人員可理解,在步驟458中斷點(diǎn)的選擇和在步驟460中調(diào)試碼的插入可以重復(fù)直到所有斷點(diǎn)的潛在位置已經(jīng)處理。換句話說,步驟458和步驟460可以是循環(huán)的一個(gè)部分,它容許所有的潛在斷點(diǎn)被選擇以便調(diào)試碼可以根據(jù)每個(gè)潛在斷點(diǎn)被插入。
一旦在步驟460插入調(diào)試碼,在步驟462實(shí)際上使用任何合適的方法包括調(diào)試碼的程序被優(yōu)化。程序優(yōu)化后,在步驟456從內(nèi)部表示產(chǎn)生機(jī)器碼。產(chǎn)生的機(jī)器碼有效地是在步驟452中獲得的源程序代碼的已優(yōu)化版本。一旦產(chǎn)生,機(jī)器碼就可以被調(diào)試器或解優(yōu)化器訪問。
在步驟466,程序碼被運(yùn)行或被執(zhí)行,如在步驟464生成的機(jī)器碼被執(zhí)行。在運(yùn)行程序的過程中,在步驟468作出決定,考慮程序是否需要調(diào)試。這樣的一個(gè)決定可以根據(jù)不同情況的變化而定。例如,決定可以至少部分根據(jù)對特殊應(yīng)用是否需要調(diào)試信息。
在步驟468,如果決定程序不需要調(diào)試,那么在步驟466程序繼續(xù)運(yùn)行。本領(lǐng)域的技術(shù)人員可以理解,程序可以繼續(xù)運(yùn)行直到終止。否則,如果在步驟468的決定是程序需要調(diào)試,那么在步驟470,斷點(diǎn)處的指令被的分支指令覆蓋。舉例來說,循環(huán)中的裝載指令可以用分支指令替換,該分支指令,參照圖3b的描述,可能是這樣一個(gè)指令,它指示程序流跳到包括調(diào)試碼的機(jī)器碼的部分。本領(lǐng)域的技術(shù)人員可以理解,分支指令可以是傳統(tǒng)的分支指令,如“jump”指令。否則,分支指令可以是斷點(diǎn)指令,捕獲指令,或?qū)嶋H上可以是用來直接改變程序流向的任何其它指令。
指令被覆蓋后,在步驟472從機(jī)器碼獲得調(diào)試信息。在JavaTM環(huán)境中,調(diào)試信息可包括與諸如在JavaTM虛擬機(jī)的虛擬機(jī)有關(guān)的狀態(tài)。一旦獲得調(diào)試信息,優(yōu)化代碼和調(diào)試已優(yōu)化代碼的過程完成。
圖5描述了適合首先本發(fā)明的典型的通用計(jì)算機(jī)系統(tǒng)。計(jì)算機(jī)系統(tǒng)1030包括任何數(shù)目的處理器1032(也指中央處理單元,或CPU),它連接到存儲器設(shè)備,存儲器設(shè)備包括主存儲設(shè)備1034(典型地是隨機(jī)存取存儲器,或RAM)和主存儲設(shè)備1036(典型地是只讀存儲器,或ROM)。
計(jì)算機(jī)系統(tǒng)1030或更特別地CPU 1032,可用來支持虛擬機(jī),這一點(diǎn)本領(lǐng)域的技術(shù)人員可以理解。在計(jì)算機(jī)系統(tǒng)1030上支持的虛擬機(jī)的實(shí)例將參照圖6描述如下。技術(shù)上眾所周知,ROM表現(xiàn)為單向地傳送數(shù)據(jù)和指令給CPU 1032,而RAM一般用來以雙向方式傳送數(shù)據(jù)和指令。CPU 1032一般可包括任何數(shù)目的處理器。主存儲設(shè)備1034和1036都可包括任意合適的計(jì)算機(jī)可讀的媒體。二級存儲設(shè)備介質(zhì)1038,一般為海量存儲設(shè)備,也是雙向連接到CPU 1032并且提供額外的數(shù)據(jù)存儲能力。海量存儲器存儲設(shè)備1038是計(jì)算機(jī)可讀的介質(zhì),它可用來保存程序,包括計(jì)算機(jī)代碼,數(shù)據(jù)諸如此類。一般地,海量存儲器存儲設(shè)備1038是一存儲介質(zhì),例如硬盤或磁帶,磁帶一般比主存儲介質(zhì)1034,1036慢。海量存儲器存儲設(shè)備1038可采取磁或紙帶閱讀器或一些其它周知的設(shè)備的形式??梢岳斫?,保留在海量存儲器存儲設(shè)備1038中的信息,在適當(dāng)?shù)那樾蜗?,可以象虛擬內(nèi)存一樣作為RAM 1036的一部分合并為標(biāo)準(zhǔn)形式。特殊的主存儲設(shè)備1034,如CD-ROM也可雙向傳遞數(shù)據(jù)給CPU 1032。
CPU 1032也可連接至有關(guān)或多個(gè)輸入/輸出設(shè)備1040,它可包括但不限于諸如視頻監(jiān)視器,軌跡球,鼠標(biāo),鍵盤,麥克風(fēng),觸摸式顯示器,傳感卡閱讀器,磁或紙帶閱讀器,書寫板,書寫筆,聲音或手寫識別器,或其它眾所周知的輸入設(shè)備,當(dāng)然例如其它計(jì)算機(jī)。最后,CPU 1032可以用在1012一般示出的網(wǎng)絡(luò)連接方法,選擇地連接至計(jì)算機(jī)或電訊網(wǎng)絡(luò),如局域網(wǎng),因特網(wǎng)或企業(yè)內(nèi)部互聯(lián)網(wǎng)。用這樣的網(wǎng)絡(luò)連接,預(yù)期CPU 1032在執(zhí)行上面描述的方法步驟的過程中,可能接收來自網(wǎng)絡(luò)的信息,或可能輸出信息給網(wǎng)絡(luò)。這樣的信息,常常表現(xiàn)為用CPU 1032執(zhí)行的序列指令,可以從網(wǎng)絡(luò)中接收到或輸出到網(wǎng)絡(luò)中,例如,用具體表現(xiàn)為載波的計(jì)算機(jī)數(shù)據(jù)信號的形式。上面描述的設(shè)備和材料對于計(jì)算機(jī)硬件和軟件方面的技術(shù)人員是熟悉的。
如前所述,虛擬機(jī)可在計(jì)算機(jī)系統(tǒng)上執(zhí)行。圖6是圖5中的計(jì)算機(jī)系統(tǒng)支持的并且適合實(shí)現(xiàn)本發(fā)明的虛擬機(jī)的框圖表示。當(dāng)執(zhí)行如由加州Palo Alto的太陽微系統(tǒng)公司開發(fā)的JavaTM程序語言編寫的計(jì)算機(jī)程序的計(jì)算機(jī)程序時(shí),源代碼1110在編譯時(shí)間環(huán)境1105中提供給編譯器1120。編譯器1120翻譯源代碼1110為字節(jié)代碼1130。一般地,源代碼1110在軟件開發(fā)者生成源代碼的時(shí)候翻譯成字節(jié)代碼1130。
字節(jié)代碼1130一般可以重新生成,下載或通過諸如圖5的網(wǎng)絡(luò)1012的網(wǎng)絡(luò)發(fā)布,或保存在諸如圖5的主存儲1034的存儲設(shè)備中。在所述的實(shí)施例中,字節(jié)代碼1130與平臺獨(dú)立。就是說,字節(jié)代碼1130實(shí)際上可以在運(yùn)行合適的虛擬機(jī)1140的任何計(jì)算機(jī)系統(tǒng)上執(zhí)行。例如,在JavaTM環(huán)境中,字節(jié)代碼1130可以在運(yùn)行JavaTM虛擬機(jī)的計(jì)算機(jī)系統(tǒng)上執(zhí)行。
字節(jié)代碼1130提供給包括虛擬機(jī)1140的運(yùn)行環(huán)境1135。運(yùn)行環(huán)境1135一般可以用諸如圖5的CPU 1032的處理器執(zhí)行。虛擬機(jī)1140包括編譯器1142,解釋器1144和運(yùn)行時(shí)間系統(tǒng)1146。字節(jié)代碼1130一般可要么提供編譯器1142,要么給解釋器1144。
當(dāng)字節(jié)代碼1130提供給編譯器1142時(shí),包括在字節(jié)代碼1130中的方法編譯成機(jī)器指令,如上所述。另一方面,當(dāng)字節(jié)代碼1130提供給解釋器1144時(shí),字節(jié)代碼1130在某時(shí)候被讀到解釋器1144一個(gè)字節(jié)代碼。由于每個(gè)字節(jié)被讀到解釋器1144,解釋器1144然后執(zhí)行每個(gè)字節(jié)代碼定義的操作。一般地,解釋器1144處理字節(jié)代碼1130,并且實(shí)際上連續(xù)地執(zhí)行與字節(jié)代碼1130有關(guān)的操作。
當(dāng)從操作系統(tǒng)1160調(diào)用方法時(shí),如果判斷該方法將作為已解釋的方法來調(diào)用,運(yùn)行時(shí)間系統(tǒng)1146可以從解釋器1144獲得該方法。另一方面,如果判斷該方法將作為已編譯方法來調(diào)用,運(yùn)行時(shí)間系統(tǒng)1146激活編譯器1142。然后編譯器1142從字節(jié)代碼1130生成機(jī)器碼,并且執(zhí)行機(jī)器語言指令。一般地,當(dāng)虛擬機(jī)1140終止時(shí),機(jī)器語言指令被放棄。
盡管只描述了本發(fā)明的幾個(gè)實(shí)施例,應(yīng)該理解到,本發(fā)明可以以許多其它的特定形式具體化,而不偏離本發(fā)明的精神和范疇。舉例來說,涉及使用運(yùn)行調(diào)試器或解優(yōu)化器的步驟可能被重新調(diào)用,刪除和增加。而且,在一些實(shí)施例中,與生成包括斷點(diǎn)的程序有關(guān)的步驟可以修改。一般地,涉及本發(fā)明的步驟可以被重新調(diào)用,刪除或增加,而不偏離本發(fā)明的精神和范疇。
使用調(diào)試碼和斷點(diǎn)一般已描述與JavaTM環(huán)境有關(guān)。然而,在一些實(shí)施例中,環(huán)境可能不一定是JavaTM環(huán)境。舉例來說,在使用JavaTM虛擬機(jī)的地方,實(shí)際上任何合適的虛擬機(jī)可以實(shí)現(xiàn)。
而且,當(dāng)斷點(diǎn)已被描述置與循環(huán)中的某處的同時(shí),應(yīng)該理解為斷點(diǎn)可以置于需要潛在斷點(diǎn)的計(jì)算機(jī)程序中任何地方。就是說,斷點(diǎn)可插在計(jì)算機(jī)程序中的任何地方,這里它可能潛在地必須獲得全部可用的值。因此,本實(shí)例看作為解釋性的而不是限制性的,并且本發(fā)明不限于這里給出的細(xì)節(jié),但在附加的權(quán)利要求書的范疇內(nèi)可以作出修改。
權(quán)利要求
1.一種獲得與程序代碼有關(guān)的信息的計(jì)算機(jī)實(shí)現(xiàn)的方法,該計(jì)算機(jī)實(shí)現(xiàn)的方法包括增加代碼段給程序代碼,代碼段包括與計(jì)算有關(guān)的表示,表示用于實(shí)質(zhì)上不被處理;增加調(diào)試代碼在代碼段的附近;產(chǎn)生與程序代碼有關(guān)的機(jī)器代碼,機(jī)器代碼包括斷點(diǎn),斷點(diǎn)與調(diào)試代碼有關(guān);以及用分支指令替換斷點(diǎn)處的指令,分支指令用于引發(fā)調(diào)試代碼執(zhí)行,其中當(dāng)調(diào)試代碼執(zhí)行時(shí),獲得與表示有關(guān)的信息。
2.如權(quán)利要求1中所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其中增加調(diào)試代碼到代碼段的附近包括將調(diào)試代碼集合到代碼段中。
3.如權(quán)利要求1和2中所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其中代碼段與程序循環(huán)有關(guān)。
4.如權(quán)利要求3中所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其中增加調(diào)試代碼到代碼段的附近包括將調(diào)試代碼集合到程序循環(huán)中。
5.如權(quán)利要求2和4中所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其中調(diào)試代碼包括調(diào)用用于調(diào)試程序代碼的調(diào)試函數(shù)的代碼。
6.如權(quán)利要求2,4和5之一所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其中調(diào)試代碼包括調(diào)用用于解優(yōu)化程序代碼的解優(yōu)化函數(shù)的代碼。
7.如上述權(quán)利要求中任一個(gè)的計(jì)算機(jī)實(shí)現(xiàn)的方法,還包括轉(zhuǎn)換程序代碼為內(nèi)部表示,其中生成與程序代碼有關(guān)的機(jī)器代碼包括從內(nèi)部表示生成機(jī)器代碼。
8.如權(quán)利要求7中所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其中生成與程序代碼有關(guān)的機(jī)器代碼包括生成與表示有關(guān)的機(jī)器代碼。
9.如權(quán)利要求7和8之一中所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,還包括執(zhí)行調(diào)試代碼,其中執(zhí)行調(diào)試代碼用于提供與表示有關(guān)的信息。
10.如權(quán)利要求9中所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其中調(diào)試代碼用調(diào)試器和解優(yōu)化器之一來執(zhí)行。
11.一種獲得與程序代碼有關(guān)的信息的計(jì)算機(jī)設(shè)備,該計(jì)算機(jī)設(shè)備包括用于增加代碼段至程序代碼的編程接口,代碼段包括與計(jì)算有關(guān)的表示,表示用于實(shí)際上不被處理,編程接口還用于增加調(diào)試代碼到代碼段的附近;用于生成與程序代碼有關(guān)的機(jī)器代碼的機(jī)器代碼生成器,機(jī)器代碼包括斷點(diǎn),斷點(diǎn)與調(diào)試代碼有關(guān),其中機(jī)器代碼還包括位于斷點(diǎn)位置的指令;以及用于將指令替換為分支指令的解編譯器,其中分支指令用于引發(fā)調(diào)試代碼執(zhí)行
12.如權(quán)利要求11的計(jì)算機(jī)設(shè)備,其中用于增加調(diào)試代碼到代碼段的附近的編程接口還用于將調(diào)試代碼集合到代碼段中。
13.如權(quán)利要求11和12之一的計(jì)算機(jī)設(shè)備,其中代碼段與程序循環(huán)有關(guān),用于調(diào)試在代碼段附近的代碼的編程接口還包括用于集合調(diào)試代碼至程序循環(huán)中。
14.如權(quán)利要求11-13中的任意一個(gè)的計(jì)算機(jī)設(shè)備,還包括用于轉(zhuǎn)換程序代碼為內(nèi)部表示的代碼轉(zhuǎn)換器,其中機(jī)器代碼生成器用于從內(nèi)部表示生成機(jī)器代碼。
15.如權(quán)利要求14的計(jì)算機(jī)設(shè)備,還包括用于執(zhí)行調(diào)試代碼的調(diào)試器,其中執(zhí)行調(diào)試代碼用于提供與表示有關(guān)的信息。
16.如權(quán)利要求14和15中的一個(gè)的計(jì)算機(jī)設(shè)備,還包括用于執(zhí)行調(diào)試代碼的解優(yōu)化器,其中執(zhí)行調(diào)試代碼用于提供與程序表示有關(guān)的信息。
17.一種獲得與特殊指令集有關(guān)的信息的計(jì)算機(jī)程序產(chǎn)品,該計(jì)算機(jī)程序產(chǎn)品包括包括與計(jì)算有關(guān)的表示相關(guān)的計(jì)算機(jī)代碼,表示用于實(shí)際上不被處理,其中計(jì)算機(jī)代碼包括調(diào)試代碼;生成與包括表示和調(diào)試代碼的計(jì)算機(jī)代碼有關(guān)的機(jī)器代碼的計(jì)算機(jī)代碼,機(jī)器代碼包括斷點(diǎn),斷點(diǎn)與調(diào)試代碼有關(guān),其中機(jī)器代碼還包括指令;用分支指令替換指令的計(jì)算機(jī)代碼,分支指令用于引發(fā)調(diào)試代碼執(zhí)行,其中引發(fā)調(diào)試代碼執(zhí)行提供與表示有關(guān)的信息;以及保存程序代碼的計(jì)算機(jī)可讀介質(zhì)。
18.如權(quán)利要求17的計(jì)算機(jī)程序產(chǎn)品,其中計(jì)算機(jī)可讀介質(zhì)為從組中選擇的一種,組包含用載波具體化的數(shù)據(jù)信號,CD-ROM,硬盤,軟盤,磁帶驅(qū)動器和閃存。
19.一種獲得與程序代碼有關(guān)的信息的計(jì)算機(jī)實(shí)現(xiàn)的方法,該計(jì)算機(jī)實(shí)現(xiàn)的方法包括增加對子程序的調(diào)用,子程序與程序代碼有關(guān),子程序的調(diào)用包括多個(gè)參數(shù),其中多個(gè)參數(shù)中的至少一個(gè)對應(yīng)于與計(jì)算有關(guān)的表示,表示相對于程序代碼和子程序不被使用;以及生成與程序代碼有關(guān)的機(jī)器代碼,其中生成機(jī)器代碼包括實(shí)際上轉(zhuǎn)換子程序的調(diào)用為調(diào)試代碼。
20.一種調(diào)試已優(yōu)化代碼的計(jì)算機(jī)實(shí)現(xiàn)的方法,該計(jì)算機(jī)實(shí)現(xiàn)的方法包括生成較高級的程序表示,較高級的程序表示包括循環(huán)部分,循環(huán)部分有相關(guān)的計(jì)數(shù)器值,其中循環(huán)部分包括斷點(diǎn)代碼段;優(yōu)化較高級的程序表示,其中優(yōu)化較高級的程序表示包括轉(zhuǎn)換較高級的程序表示為較低級代碼,較低級代碼包括與調(diào)試代碼和指令有關(guān)的部分;用分支指令替換指令,分支指令用于引發(fā)與調(diào)試代碼部分有關(guān)的執(zhí)行;以及執(zhí)行分支指令,其中執(zhí)行分支指令引發(fā)與調(diào)試代碼部分有關(guān)的執(zhí)行并且提供與計(jì)數(shù)器值有關(guān)的信息。
全文摘要
為了調(diào)試已優(yōu)化程序代碼,披露了實(shí)際上提供狀態(tài)信息的全集給調(diào)試器的方法和工具,而不顯著影響系統(tǒng)表現(xiàn)。根據(jù)本發(fā)明的一個(gè)特性,獲得與程序代碼有關(guān)的方法包括增加代碼段至程序代碼中,代碼段包括計(jì)算后不能有效使用的表示。調(diào)試代碼加到代碼段的附近,并且從程序代碼生成機(jī)器代碼。機(jī)器代碼包括與調(diào)試代碼有關(guān)的斷點(diǎn),并且包括斷點(diǎn)處的指令。最后,該方法包括用分支指令替換斷點(diǎn)處的指令,分支指令用來引發(fā)調(diào)試代碼執(zhí)行。
文檔編號G06F11/28GK1271896SQ00107018
公開日2000年11月1日 申請日期2000年4月24日 優(yōu)先權(quán)日1999年4月23日
發(fā)明者小C·N·克利克, C·A·維克, M·H·帕萊茨尼 申請人:太陽微系統(tǒng)有限公司