專利名稱:用于將在多線程上工作的程序的程序代碼變換為鎖沖突少的程序代碼的方法及其計(jì)算機(jī) ...的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及用于將在多線程上工作的程序的程序代碼變換為鎖沖突少的程序代碼的方法及其計(jì)算機(jī)程序和計(jì)算機(jī)系統(tǒng)。
背景技術(shù):
近幾年,在處理器設(shè)計(jì)中,正在轉(zhuǎn)向?qū)⒍鄠€(gè)CPU核封入一個(gè)中央運(yùn)算處理裝置(下面稱CPU :central Processing Unit)的內(nèi)部的所謂多核。多核被認(rèn)為是在外部有一個(gè) CPU,但在內(nèi)部有兩個(gè)CPU。通過(guò)多核,在主要進(jìn)行并行處理的環(huán)境下,能夠提高CPU核整體的處理能力,實(shí)現(xiàn)系統(tǒng)性能提高。多核使處理器能夠同時(shí)執(zhí)行的硬件線程數(shù)量飛躍增加。例如,SUN (商標(biāo))Niagara〗(商標(biāo))能夠在一個(gè)CPU上執(zhí)行64個(gè)線程。在能夠同時(shí)執(zhí)行多個(gè)線程的處理器上執(zhí)行以往的程序的情況下,由于鎖沖突引起的處理器的性能降低成為問(wèn)題。在此,所謂鎖沖突是在某一線程為了進(jìn)入需要排他執(zhí)行的臨界區(qū)而獲得鎖的情況下,在其他線程中在上述鎖解除之前不執(zhí)行下一步驟的狀態(tài)。典型而言,不執(zhí)行下一步驟的線程成為自旋環(huán)(spin loop)或休眠(sl^p)狀態(tài)。發(fā)生鎖沖突的原因多種多樣。例如,考慮從隊(duì)列取出數(shù)據(jù)的處理在多個(gè)線程頻繁執(zhí)行的程序的情況。此外,考慮在上述程序的程序代碼中,在用于記載需要排他執(zhí)行的處理的同步塊中記載有關(guān)于上述取出處理的語(yǔ)句。在執(zhí)行時(shí),上述程序每次調(diào)出上述取出處理時(shí)都獲得鎖。因此,頻繁地發(fā)生鎖沖突。所以,由于頻繁地發(fā)生的鎖沖突,可能引起系統(tǒng)性能上的問(wèn)題。在SUN(商標(biāo))BUG DateBase中報(bào)告了在能夠執(zhí)行32個(gè)硬件線程的計(jì)算機(jī)系統(tǒng)中, 與上述程序代碼相似的構(gòu)造的程序代碼的程序成為系統(tǒng)性能上的瓶頸(http://bugS. sun. com/bugdatabase/view_bug. do ? bug_id = 6525425)。通過(guò)該報(bào)告,具有上述類似構(gòu)造的程序代碼的 SUN JDK1. 5. 013 的 java. lang. ref. RereferenceQueue 類中確認(rèn)了上述問(wèn)題。上述類的方法即與上述取出處理對(duì)應(yīng)的pollO方法在SUNJDK1. 5. 014中修正。在該修正中,在polio方法的安裝中,在關(guān)于獲得鎖的處理的語(yǔ)句之前插入關(guān)于判斷隊(duì)列是否為空并在判斷為空時(shí)退出方法的處理的語(yǔ)句。下述非專利文獻(xiàn)1記載向程序代碼附加marked bit,利用該附加的marked bit 和compareAndSwap (CAQ命令,由此程序代碼能夠變形為同時(shí)并行性(concurrency)高的程序代碼。在下述非專利文獻(xiàn)1中,手動(dòng)進(jìn)行上述marked bit的附加。非專利文獻(xiàn)1 Martin Vechev, Eran Yahav, Deriving Linearizable Fine-Grained Concurrent Objects,PLDI,08,ACM 978-1-59593-860-2/08/06,2008 年 6 月 7 日 13 日
發(fā)明內(nèi)容
每次發(fā)生由鎖沖突引起的性能降低的問(wèn)題時(shí),需要確定其原因,通過(guò)人工修正程序代碼的作業(yè)。但是,從現(xiàn)有的程序代碼的量考慮,該作業(yè)需要大量工作負(fù)荷所以不可能接近。因此,需要自動(dòng)確定上述問(wèn)題將要發(fā)生的位置,自動(dòng)修正該位置的方法。本發(fā)明提供將在多線程上工作程序的程序代碼變換為鎖沖突少的程序代碼的方法。該方法使計(jì)算機(jī)系統(tǒng)執(zhí)行下述步驟。所述步驟包括檢索步驟,向存儲(chǔ)器內(nèi)讀出上述程序代碼,從該讀出的程序代碼檢索在同步塊內(nèi)且向?qū)υ撏綁K沒(méi)有副作用的路徑分支的第一條件句,沒(méi)有上述副作用是指基于上述同步塊內(nèi)的語(yǔ)句處理中的值無(wú)法由上述同步塊外的語(yǔ)句參照;復(fù)制步驟,向上述同步塊外復(fù)制由上述檢索出的第一條件句分支的沒(méi)有副作用的路徑;追加步驟,與上述復(fù)制相應(yīng)地在上述程序代碼內(nèi)追加第二條件句,上述第二條件句是向上述復(fù)制的沒(méi)有副作用的路徑分支的條件句。通過(guò)上述方法,在向沒(méi)有副作用的路徑分支時(shí),不執(zhí)行同步塊內(nèi)的第一條件句。因此,鎖沖突減少。上述方法特別在有一個(gè)條件句兩個(gè)分支的情況下有效。在本發(fā)明的一個(gè)實(shí)施方式中,上述第一條件句包含第一條件式。該第一條件式定義為基于第一變量的讀出、常量或這些的組合選擇路徑。所述第一變量不是僅調(diào)用包含所述第一條件句的子例程的例程中為有效范圍的變量。本發(fā)明的一個(gè)實(shí)施方式中,上述第二條件句包含基于用于存儲(chǔ)上述第一條件式的結(jié)果的變量根據(jù)上述第一條件式的結(jié)果選擇路徑的第二條件式。本發(fā)明的一個(gè)實(shí)施方式中,上述檢索的步驟包含從上述讀出的程序代碼進(jìn)一步檢索更新句的步驟,上述更新句在上述同步塊內(nèi)且更新上述第一變量,上述追加的步驟包括如下步驟向從緊接上述檢索出的更新句之后到上述同步塊結(jié)束句為止之間,還追加包含用于存儲(chǔ)上述第一條件式的結(jié)果的變量和向該變量代入的上述第一條件式的結(jié)果的語(yǔ)句。在本發(fā)明的一個(gè)實(shí)施方式中,上述檢索步驟包括如下步驟從上述讀出的程序代碼和其他程序代碼的至少一個(gè)進(jìn)一步檢索更新句,上述更新句在與上述同步塊同步的其他同步塊內(nèi)且更新上述第一變量,上述追加的步驟包括如下步驟向從緊接上述檢索出的更新句之后到上述同步塊結(jié)束句為止之間,還追加包含用于存儲(chǔ)上述第一條件式的結(jié)果的變量和向該相同變量代入的上述第一條件式的結(jié)果的語(yǔ)句。在本發(fā)明的一個(gè)實(shí)施方式中,上述追加步驟包括如下步驟在用于存儲(chǔ)上述第一條件式的結(jié)果的變量首次被參照的語(yǔ)句之前,還追加初始化變量的語(yǔ)句,該變量用于使用上述第二條件句執(zhí)行包含上述同步塊的路徑的值或使用上述第一條件式的結(jié)果存儲(chǔ)上述第一條件式的結(jié)果。在本發(fā)明的一個(gè)實(shí)施方式中,上述副作用是不容易取消執(zhí)行結(jié)果的處理。在本發(fā)明的一個(gè)實(shí)施方式中,上述副作用是執(zhí)行線程間的同步的處理、向?qū)嵗兞看胫档奶幚?、向類變量代入值的處理、?zhí)行輸入輸出的處理、調(diào)用本地代碼的處理或向表示排列要素的位置的編號(hào)代入值的處理。在本發(fā)明的一個(gè)實(shí)施方式中,在上述第一條件式的數(shù)量為2以上的情況下,上述2 以上的第一條件式的結(jié)果通過(guò)上述2以上的第一條件式的組合求出。
在本發(fā)明的一個(gè)實(shí)施方式中,在通過(guò)上述第一條件式選擇的路徑的數(shù)量為3條以上的情況下,用于存儲(chǔ)上述第一條件式的結(jié)果的變量與上述3條以上的路徑中沒(méi)有副作用的路徑分別對(duì)應(yīng)。在本發(fā)明的一個(gè)實(shí)施方式中,用于存儲(chǔ)上述第一條件式的結(jié)果的變量是保證原子性的數(shù)據(jù)型的變量。在本發(fā)明的一個(gè)實(shí)施方式中,上述檢索步驟包括如下步驟從上述程序代碼和其他程序代碼的至少一個(gè)進(jìn)一步檢索與上述同步塊同步的其他同步塊,隨著上述檢索的結(jié)束,執(zhí)行上述復(fù)制步驟。在本發(fā)明的一個(gè)實(shí)施方式中,上述檢索步驟包括如下步驟還檢索包含于上述程序代碼和其他程序代碼的至少一個(gè)且從上述同步塊外的語(yǔ)句參照上述第一變量的語(yǔ)句,隨著上述檢索的結(jié)束,執(zhí)行上述復(fù)制步驟。在本發(fā)明的一個(gè)實(shí)施方式中,在上述同步塊內(nèi)包含啟動(dòng)線程的語(yǔ)句的情況下,上述檢索步驟包括如下步驟還從包含于上述程序代碼和其他程序代碼的至少一個(gè)且記載上述線程的安裝的語(yǔ)句檢索與上述同步塊內(nèi)的語(yǔ)句同步地執(zhí)行的語(yǔ)句,上述方法還使計(jì)算機(jī)系統(tǒng)執(zhí)行如下步驟根據(jù)檢索上述同步地執(zhí)行的語(yǔ)句,將包含啟動(dòng)上述線程的語(yǔ)句判定為具有副作用的路徑。在本發(fā)明的一個(gè)實(shí)施方式中,在上述同步塊內(nèi)包含啟動(dòng)線程的語(yǔ)句的情況下,上述檢索步驟還包括如下步驟要求用戶判斷包含啟動(dòng)上述線程的語(yǔ)句的路徑是否是沒(méi)有副作用的路徑。在本發(fā)明的一個(gè)實(shí)施方式中,在用于確定執(zhí)行上述同步塊的線程的執(zhí)行順序的變量在上述同步塊內(nèi)定義的情況下,上述檢索步驟包括如下步驟從上述同步塊外進(jìn)一步檢索包含于上述程序代碼和其他程序代碼的至少一個(gè)且參照上述使用的變量的語(yǔ)句,上述方法還使計(jì)算機(jī)系統(tǒng)執(zhí)行如下步驟根據(jù)檢索參照上述使用的變量的語(yǔ)句, 將包含上述使用的變量的路徑判定為具有副作用的路徑。在本發(fā)明的一個(gè)實(shí)施方式中,在用于確定執(zhí)行上述同步塊的線程的執(zhí)行順序的變量在上述同步塊內(nèi)定義的情況下,上述檢索步驟還包括如下步驟要求用戶判斷包含上述使用的語(yǔ)句的路徑是否是沒(méi)有副作用的路徑。在本發(fā)明的一個(gè)實(shí)施方式中,上述追加步驟包括如下步驟向上述讀出的程序代碼還追加聲明用于存儲(chǔ)上述第一條件式的結(jié)果的變量的語(yǔ)句,在共有變量包含于上述程序代碼和其他程序代碼的至少一個(gè)且從上述同步塊外的語(yǔ)句被訪問(wèn)的情況下,上述聲明包含抑制與存儲(chǔ)器的訪問(wèn)順序有關(guān)的最優(yōu)化的指定和保證原子性的指定,上述共有變量包含于沒(méi)有上述副作用的路徑,且能夠從多個(gè)線程被訪問(wèn),在不進(jìn)行上述訪問(wèn)的情況下,上述聲明包含保證原子性的指定。在本發(fā)明的一個(gè)實(shí)施方式中,上述檢索步驟還包括如下步驟允許用戶判斷是否具有與上述同步塊同步的其他同步塊。而且,上述方法使計(jì)算機(jī)系統(tǒng)在上述允許步驟之后執(zhí)行上述復(fù)制步驟。在本發(fā)明的一個(gè)實(shí)施方式中,上述檢索步驟還包括如下步驟允許用戶判斷是否具有參照上述第一變量的語(yǔ)句。而且,上述方法使計(jì)算機(jī)系統(tǒng)在上述允許步驟之后執(zhí)行上述復(fù)制步驟。在本發(fā)明的一個(gè)實(shí)施方式中,在包含于上述第二條件式的變量為指定了抑制與存儲(chǔ)器的訪問(wèn)順序有關(guān)的最優(yōu)化的變量的情況下,在還追加代入上述第一條件式的結(jié)果的語(yǔ)句的步驟中,在緊接上述同步塊的結(jié)束語(yǔ)句之前,追加代入上述第一條件式的結(jié)果的語(yǔ)句。本發(fā)明還提供將多線程上工作的程序的程序代碼變換為鎖沖突少的程序代碼的方法。該方法使計(jì)算機(jī)系統(tǒng)執(zhí)行如下步驟。該步驟包括檢索步驟,向存儲(chǔ)器內(nèi)讀出上述程序代碼,從該讀出的程序代碼檢索在同步塊內(nèi)且向?qū)υ撏綁K沒(méi)有副作用的路徑分支的第一條件句,沒(méi)有上述副作用是指基于上述同步塊內(nèi)的語(yǔ)句處理中的值無(wú)法由上述同步塊外的語(yǔ)句參照;復(fù)制步驟,向上述同步塊外復(fù)制通過(guò)上述檢索出的第一條件句分支的沒(méi)有副作用的路徑;追加步驟,與上述復(fù)制相應(yīng)地,在上述程序代碼內(nèi)追加第二條件句,上述第二條件句是向上述復(fù)制的沒(méi)有副作用的路徑分支的條件句,上述第一條件句包含第一條件式,該第一條件式基于實(shí)例變量或類變量的讀出、 常量或這些的組合,在向沒(méi)有副作用的路徑分支的情況下定義為其結(jié)果變?yōu)閠rue,另一方面,在向具有副作用的路徑分支的情況下定義為其結(jié)果變?yōu)閒alse,上述第二條件句包含第二條件式,該第二條件式基于用于存儲(chǔ)上述第一條件式的結(jié)果的boolean型的變量,定義為根據(jù)上述第一條件式的結(jié)果選擇路徑。本發(fā)明還提供使計(jì)算機(jī)執(zhí)行上述方法的任一種所述的方法的各步驟。本發(fā)明還提供將在多線程上工作的程序的程序代碼變換為鎖沖突少的程序代碼的計(jì)算機(jī)系統(tǒng)。該計(jì)算機(jī)系統(tǒng)包括檢索部,向存儲(chǔ)器內(nèi)讀出上述程序代碼,從該讀出的程序代碼檢索在同步塊內(nèi)且向沒(méi)有對(duì)該同步塊的副作用的路徑分支的第一條件句,沒(méi)有上述副作用是指基于上述同步塊內(nèi)的語(yǔ)句處理中的值無(wú)法由上述同步塊外的語(yǔ)句參照;復(fù)制部,向上述同步塊外復(fù)制通過(guò)上述檢索出的第一條件句分支的沒(méi)有副作用的路徑;追加部,與上述復(fù)制相應(yīng)地,在上述程序代碼內(nèi)追加第二條件句,上述第二條件句是向上述復(fù)制的沒(méi)有副作用的路徑分支的條件句。在本發(fā)明的一個(gè)實(shí)施方式中,上述檢索部,從上述讀出的程序代碼進(jìn)一步檢索更新句,上述更新句在上述同步塊內(nèi)且更新上述第一變量,上述追加部,向從緊接上述檢索出的更新句之后到上述同步塊結(jié)束句為止之間, 還追加包含用于存儲(chǔ)上述第一條件式的結(jié)果的變量和向該變量代入的上述第一條件式的結(jié)果的語(yǔ)句。在本發(fā)明的一個(gè)實(shí)施方式中,上述檢索部,從上述讀出的程序代碼和其他程序代碼的至少一個(gè)進(jìn)一步檢索更新句,上述更新句在與上述同步塊同步的其他同步塊內(nèi)且更新上述第一變量,上述追加部,向從緊接上述檢索出的更新句之后到上述同步塊結(jié)束句為止之間,還追加包含用于存儲(chǔ)上述第一條件式的結(jié)果的變量和向該變量代入的上述第一條件式的結(jié)果的語(yǔ)句。
在本發(fā)明的一個(gè)實(shí)施方式中,上述追加部,在用于存儲(chǔ)上述第一條件式的結(jié)果的變量首次被參照的語(yǔ)句之前,還追加初始化變量的語(yǔ)句,該變量用于使用上述第二條件句執(zhí)行包含上述同步塊的路徑的值或使用上述第一條件式的結(jié)果存儲(chǔ)上述第一條件式的結(jié)^ ο在本發(fā)明的一個(gè)實(shí)施方式中,上述檢索部,從上述程序代碼和其他程序代碼的至少一個(gè)進(jìn)一步檢索與上述同步塊同步的其他同步塊,在本發(fā)明的一個(gè)實(shí)施方式中,上述檢索部,還檢索包含于上述程序代碼和其他程序代碼的至少一個(gè)且從上述同步塊外的語(yǔ)句參照上述第一變量的語(yǔ)句,在本發(fā)明的一個(gè)實(shí)施方式中,在上述同步塊內(nèi)包含啟動(dòng)線程的語(yǔ)句的情況下,上述檢索部,還從包含于上述程序代碼和其他程序代碼的至少一個(gè)且記載上述線程的安裝的語(yǔ)句檢索與上述同步塊內(nèi)的語(yǔ)句同步地執(zhí)行的語(yǔ)句,上述計(jì)算機(jī)系統(tǒng)還包括判定部,該判定部根據(jù)檢索上述同步地執(zhí)行的語(yǔ)句,將包含啟動(dòng)上述線程的語(yǔ)句判定為具有副作用的路徑。在本發(fā)明的一個(gè)實(shí)施方式中,在上述同步塊內(nèi)包含啟動(dòng)線程的語(yǔ)句的情況下,上述檢索部還包括判斷部,該判斷部允許用戶判斷包含啟動(dòng)上述線程的語(yǔ)句的路徑是否為沒(méi)有副作用的路徑。在本發(fā)明的一個(gè)實(shí)施方式中,在用于確定執(zhí)行上述同步塊的線程的執(zhí)行順序的變量在上述同步塊內(nèi)定義的情況下,上述檢索部,從上述同步塊外進(jìn)一步檢索包含于上述程序代碼和其他程序代碼的至少一個(gè)且參照上述使用的變量的語(yǔ)句,上述計(jì)算機(jī)系統(tǒng)還包括判定部,該判定部根據(jù)檢索參照上述使用的變量的語(yǔ)句, 將包含啟動(dòng)上述使用的變量的路徑判定為具有副作用的路徑。在本發(fā)明的一個(gè)實(shí)施方式中,在用于確定執(zhí)行上述同步塊的線程的執(zhí)行順序的變量在上述同步塊內(nèi)定義的情況下,上述檢索還包括判斷部,該判斷部允許用戶判斷包含上述使用的變量的路徑是否為沒(méi)有副作用的路徑。在本發(fā)明的一個(gè)實(shí)施方式中,上述追加部,向上述讀出的程序代碼還追加聲明用于存儲(chǔ)上述第一條件式的結(jié)果的變量的語(yǔ)句,在共有變量包含于上述程序代碼和上述其他程序代碼的至少一個(gè)且從上述同步塊外的語(yǔ)句被訪問(wèn)的情況下,上述聲明包含抑制與存儲(chǔ)器的訪問(wèn)順序有關(guān)的最優(yōu)化的指定和保證原子性的指定,上述共有變量包含于沒(méi)有上述副作用的路徑,且能夠從多個(gè)線程被訪問(wèn),在不進(jìn)行上述訪問(wèn)的情況下,上述聲明包含保證原子性的指定。在本發(fā)明的一個(gè)實(shí)施方式中,上述檢索部還包括判斷部,該判斷部允許用戶判斷是否具有與上述同步塊同步的其他同步塊。在本發(fā)明的一個(gè)實(shí)施方式中,上述檢索步驟還包括判斷部,該判斷部允許用戶判斷是否具有參照上述第一變量的語(yǔ)句。根據(jù)本發(fā)明的實(shí)施方式,從同步塊中的第一路徑中自動(dòng)發(fā)現(xiàn)雖然沒(méi)有獲得鎖但能夠執(zhí)行的第二路徑。而且,該發(fā)現(xiàn)的第二路徑和用于不獲得鎖而執(zhí)行第二路徑的條件句追加到程序代碼中的上述第一路徑之外。通過(guò)上述追加,程序代碼執(zhí)行時(shí)的鎖沖突時(shí)間減少, 能夠防止多線程上的CPU效率的降低。
圖1示出本發(fā)明實(shí)施方式中的、表示用于變換程序代碼的系統(tǒng)具有的功能的功能框圖。圖2示出本發(fā)明實(shí)施方式中的、圖1所示的變換之前的程序代碼的例。圖3示出本發(fā)明實(shí)施方式中的、在圖1所示的變換程序中執(zhí)行的處理步驟中取得變換所需的信息的處理步驟的例。圖4示出本發(fā)明實(shí)施方式中的、在圖1所示的變換程序中執(zhí)行的處理步驟中進(jìn)行變換的處理步驟的例。圖5示出本發(fā)明實(shí)施方式中的、圖4所示的步驟317的處理的詳細(xì)情況。圖6示出本發(fā)明實(shí)施方式中的、用于具體說(shuō)明圖3 圖5所示的各步驟的工作所使用的輸入數(shù)據(jù)CL。圖7示出本發(fā)明實(shí)施方式中的、圖4所示的步驟316的處理被執(zhí)行后的方法 dequeue () 0圖8示出本發(fā)明實(shí)施方式中的、對(duì)圖6執(zhí)行圖3 圖5所示的步驟的處理后的輸入數(shù)據(jù)(變換后的程序代碼)。圖9示出本發(fā)明實(shí)施方式中的、用于具體說(shuō)明圖3 圖5所示的各步驟的工作所使用的輸入數(shù)據(jù)CL。圖10示出本發(fā)明實(shí)施方式中的、圖4所示的步驟316的處理被執(zhí)行后的方法 dequeue () 0圖11示出本發(fā)明實(shí)施方式中的、對(duì)圖9執(zhí)行圖3 圖5所示的各步驟的處理的輸入數(shù)據(jù)(變換后的程序代碼)。圖12示出本發(fā)明實(shí)施方式中的、由第一條件句選擇的路徑為三條以上的情況下的、圖3 圖5所示的各步驟的處理被執(zhí)行前的程序代碼的一部分和被執(zhí)行后的程序代碼的一部分。圖13示出本發(fā)明實(shí)施方式中的、圖1的系統(tǒng)具有的計(jì)算機(jī)硬件的框圖。
具體實(shí)施例方式在本發(fā)明的實(shí)施方式中,“在多線程上工作的程序的程序代碼”是指生成多個(gè)被稱為線程的處理單位,按每個(gè)該生成的線程分配CPU時(shí)間,由此能夠并行地進(jìn)行多個(gè)處理的程序的源代碼。該源代碼例如使用Java(商標(biāo))語(yǔ)言或C++語(yǔ)言記述。在本發(fā)明的實(shí)施方式中,“鎖”是指當(dāng)在一個(gè)線程執(zhí)行處理時(shí)在其他線程不執(zhí)行上述處理本身和與上述處理相關(guān)的處理。例如,在第一線程開(kāi)始上述鎖的對(duì)象的處理的情況下,在第二線程不執(zhí)行上述處理或與上述處理有關(guān)的處理。上述第二線程中的上述處理或與上述處理有關(guān)的處理等待直到上述第一線程中的處理結(jié)束,在上述結(jié)束后可以執(zhí)行。在本發(fā)明的實(shí)施方式中,“鎖沖突”是指以下?tīng)顟B(tài)由于在一個(gè)線程執(zhí)行的處理為鎖的對(duì)象,在其他線程執(zhí)行的上述處理自身以及與上述處理有關(guān)的處理等待執(zhí)行直到在上述第一線程執(zhí)行的處理結(jié)束。此外,“鎖沖突少”表示鎖沖突發(fā)生的頻度少以及由鎖沖突引起的上述執(zhí)行等待的時(shí)間短。使用本發(fā)明的實(shí)施方式變換的程序代碼與變換前的程序代碼相比,鎖沖突變少。在本發(fā)明的實(shí)施方式中,“同步塊”是記載有作為上述鎖的對(duì)象的處理的程序代碼上的語(yǔ)句。該程序代碼上的語(yǔ)句由同步塊的開(kāi)始句、同步塊的結(jié)束句以及由上述開(kāi)始句和結(jié)束句包圍的語(yǔ)句構(gòu)成。同步塊的開(kāi)始句在上述程序代碼由例如Java(商標(biāo))語(yǔ)言記載的情況下,例如為記載synchronized聲明的語(yǔ)句或記載由synchronized修飾符修飾的方法名的語(yǔ)句。同樣地,在上述程序代碼通過(guò)例如Java (商標(biāo))語(yǔ)言記載的情況下,同步塊的結(jié)束句為表示上述開(kāi)始句的結(jié)束位置的“} ”。子例程的調(diào)用包含于由上述開(kāi)始句和結(jié)束句包圍的語(yǔ)句(即同步塊內(nèi))的情況下,記載該子例程的安裝的語(yǔ)句可以包含于上述同步塊內(nèi)。為了在記載該子例程的安裝的語(yǔ)句中包含其他子例程的調(diào)用,子例程的調(diào)用成為階層狀的情況下,記載所有子例程的安裝語(yǔ)句可以進(jìn)一步包含于上述同步塊。在此,子例程例如是方法。在本發(fā)明的實(shí)施方式中,“與同步塊同步的其他同步塊”是例如通過(guò)作為鎖的對(duì)象的處理被訪問(wèn)的變量通用或指定的鎖對(duì)象通用的同步塊。在此,鎖對(duì)象是在Java(商標(biāo)) 語(yǔ)言的synchronized聲明中指定的變量。例如,在聲明第一同步塊的synchronized聲明中指定鎖對(duì)象lock且在聲明第二同步塊的synchronized聲明中指定鎖對(duì)象lock的情況下,第二同步塊是與第一同步塊同步的其他同步塊。此外,在第一同步塊是方法且聲明第二同步塊的synchronized聲明中指定表示上述方法的this的情況下,第二同步塊是與第一同步塊同步的其他同步塊。在本發(fā)明的實(shí)施方式中,“對(duì)同步塊的副作用”是基于同步塊內(nèi)的語(yǔ)句的處理(處理A)的結(jié)果能夠由基于同步塊外的語(yǔ)句的處理(處理B)參照的處理A。對(duì)同步塊的副作用還是不容易取消處理結(jié)果的處理。對(duì)同步塊的副作用是例如記載在同步塊內(nèi)的其他同步塊內(nèi)的處理、向?qū)嵗兞看胫档奶幚?、向類變量代入值的處理、?zhí)行輸入輸出的處理、調(diào)用本地代碼中包含的處理的處理、或向表示排列要素的位置的編號(hào)代入值的處理,但不限定于這些。上述副作用通過(guò)例如用戶在列表中登記關(guān)于上述處理的語(yǔ)句,計(jì)算機(jī)系統(tǒng)參照在該列表中登記的語(yǔ)句進(jìn)行判斷。上述輸入輸出,例如是向畫(huà)面、文件或網(wǎng)絡(luò)的輸入輸出,但不限于這些。此外,上述本地代碼是由機(jī)器語(yǔ)言記載的程序。本地代碼例如是匯編完成的程序。包含于本地代碼的處理例如由 Java Native Interface(JNI)調(diào)用。在本實(shí)施方式中,“沒(méi)有對(duì)同步塊的副作用”是基于同步塊內(nèi)的語(yǔ)句的處理中的值無(wú)法由上述同步塊外的語(yǔ)句參照。沒(méi)有副作用是指不是引起副作用的處理,例如不是記載在同步塊內(nèi)的其他同步塊內(nèi)的處理、向?qū)嵗兞看胫档奶幚怼⑾蝾愖兞看胫档奶幚?、?zhí)行輸入輸出的處理、調(diào)用本地代碼中包含的處理的處理、或向表示排列要素的位置的編號(hào)代入值的處理的任何一種。在本實(shí)施方式中,“路徑”是與在程序執(zhí)行時(shí)執(zhí)行的處理對(duì)應(yīng)的程序代碼上的一系列語(yǔ)句。該語(yǔ)句可以是0。在本發(fā)明的實(shí)施方式中,“對(duì)同步塊沒(méi)有副作用的路徑”是與在程序執(zhí)行時(shí)對(duì)上述同步塊沒(méi)有副作用的處理對(duì)應(yīng)的上述一系列語(yǔ)句。在本發(fā)明的實(shí)施方式中,“條件句”是在程序中用于實(shí)現(xiàn)處理的分支的記載在程序代碼上的語(yǔ)句。條件句包括條件式。條件句也可以包含表示選擇的路徑的范圍的記號(hào)。程序代碼例如由Java(商標(biāo))記載的情況下,上述記號(hào)是例如“ {”和“} ”。條件句根據(jù)條件式的結(jié)果選擇執(zhí)行的路徑。程序代碼例如由Java (商標(biāo))記載的情況下,條件句例如是if語(yǔ)句或switch語(yǔ)句。在本發(fā)明的實(shí)施方式中,“條件句”是用于選擇路徑使用的式子。條件式包含變量、 常量以及運(yùn)算符的至少一個(gè)。條件句例如為if語(yǔ)句的語(yǔ)句“if (X == 0) {y = 1 ;} ”的情況下,條件式為“(X = = 0) ”。此外,條件句例如為switch語(yǔ)句或select case語(yǔ)句的情況下,將與兩句相關(guān)的case的值和存儲(chǔ)該值的變量進(jìn)行比較的式子作為條件式。條件句例如為 switch 語(yǔ)句(switch(χ) {case 1 :y = 1 ;break ;})的情況下,條件式為“ (x == 1),,。對(duì)于一個(gè)條件句,條件式的數(shù)量不一定是一個(gè)。(1)條件句例如為if語(yǔ)句的語(yǔ)句"if(x == 0) {y = 0 ;}else if (χ == 1) {y = 1 ;}else {y = 2},,的情況下,"(χ = =0)”、“(χ== 1)”以及“其他”的至少一個(gè)可以為條件式。此外,可以組合從多個(gè)條件式例如“(χ == 0) ”、“ (χ== 1) ”以及“其他”選擇的兩個(gè)以上作為新的條件式。在此,所謂組合是將上述條件式之間例如進(jìn)行邏輯運(yùn)算。(2)條件句例如為switch語(yǔ)句
(switch ( χ) { case 1: y=l; break; case 2: y=2; break;
default: y=3; break; })的情況下,“(χ== 1)”、“(χ ==2)”以及“其他”的至少一個(gè)可以為條件式。此外,可以組合從多個(gè)條件式例如“(X == 1) ”、“ (χ ==2),,以及“其他”選擇的兩個(gè)以上作為新的條件式。在本發(fā)明的實(shí)施方式中,“第一變量”是用于使第一條件式選擇路徑的一個(gè)變量。 “第一變量”例如至多是一個(gè)變量。程序代碼例如由Java語(yǔ)言記載的情況下,第一變量是一個(gè)實(shí)例變量或一個(gè)類變量。在本發(fā)明的實(shí)施方式中,“第一條件式的結(jié)果”是通過(guò)第一條件式或多個(gè)第一條件式的組合表示的值。(1)條件句例如是if語(yǔ)句的情況下,第一條件式的結(jié)果例如用真或假表示。上述真或假可以用與記載程序代碼的語(yǔ)言的上述條件式的方式相配合的值表達(dá),或可以用用戶確定的值表達(dá)。例如,可以將表示真的值設(shè)為true,表示假的值設(shè)為false,或者表示真的值設(shè)為0,表示假的值設(shè)為-1。上述表示真或假的值是true或false的情況下,用于存儲(chǔ)第一條件式的結(jié)果變量例如是boolean型。上述表示真或假的值是0或-1的情況下,用于存儲(chǔ)第一條件式的結(jié)果變量例如是支持負(fù)值的數(shù)值型。此外,if語(yǔ)句包含例如elseif語(yǔ)句所以在上述if語(yǔ)句中具有多個(gè)第一條件式的情況下,第一條件式的結(jié)果可以組合通過(guò)多個(gè)第一條件式表示的值求出。上述組合是例如對(duì)表示條件式的值之間進(jìn)行邏輯運(yùn)算。(2)條件句例如是switch語(yǔ)句的情況下,第一條件式的結(jié)果例如通過(guò)表示在 switch語(yǔ)句中指定的變量是case句指定的值的值(以下為示值)或與該示值對(duì)應(yīng)的值表示。上述示值例如可以是由上述case句指定的值。上述對(duì)應(yīng)的值例如是用戶確定的值。用戶在上述對(duì)應(yīng)的值例如使用連續(xù)編號(hào)。將上述示值作為第一條件式的結(jié)果的情況下,用于存儲(chǔ)第一條件式的結(jié)果的變量是例如與上述指定的變量相同的數(shù)據(jù)型。此外,第一條件式的結(jié)果可以組合多個(gè)上述示值或多個(gè)上述對(duì)應(yīng)的值求出。上述組合是例如根據(jù)上述示值或上述對(duì)應(yīng)的值所取的范圍進(jìn)行分組。在本發(fā)明的實(shí)施方式中,“保證原子性的數(shù)據(jù)型變量”是通過(guò)一次操作執(zhí)行向存儲(chǔ)器讀入變量的數(shù)據(jù)型的變量,是根據(jù)記載程序代碼的語(yǔ)言的方式保證該執(zhí)行的數(shù)據(jù)型變量。上述語(yǔ)言例如為Java (商標(biāo))語(yǔ)言且上述程序代碼在32位以上的OS上執(zhí)行的情況下,例如boolean型、byte型、short型、int型或float型為保證原子性的數(shù)據(jù)型。在本發(fā)明的實(shí)施方式中,“其他程序代碼”是從變換前的程序代碼鏈接的程序代碼。在此,鏈接是指例如調(diào)用或共有變量,但不限于此。此外,其他程序代碼是通過(guò)本發(fā)明的實(shí)施方式能夠解析的程序代碼。其他程序代碼是例如源代碼或字節(jié)碼。在本發(fā)明的實(shí)施方式中,“抑制與存儲(chǔ)器的訪問(wèn)順序有關(guān)的最優(yōu)化”是匯編變換前的程序代碼時(shí),不通過(guò)匯編進(jìn)行與存儲(chǔ)器的訪問(wèn)順序有關(guān)的最優(yōu)化。例如在變換前的程序代碼用Java(商標(biāo))記載的語(yǔ)言的情況下,抑制最優(yōu)化的指定用修飾符volatile修飾變量。下面按照
本發(fā)明的實(shí)施方式。本實(shí)施方式用于說(shuō)明本發(fā)明的優(yōu)選方式, 可以理解為沒(méi)有意圖將本發(fā)明的范圍限定于此處所示例。此外,下面的附圖中,只要不是特別說(shuō)明,相同的標(biāo)號(hào)表示相同的對(duì)象。圖1示出本發(fā)明實(shí)施方式中的表示用于變換程序代碼的系統(tǒng)具有的功能的功能框圖。計(jì)算機(jī)系統(tǒng)(101)包括存儲(chǔ)器(102)、檢索部(103)、復(fù)制部(104)、追加部 (105)、判定部(106)以及判斷部(107)。此外,存儲(chǔ)部(108)可以包含于計(jì)算機(jī)系統(tǒng)(101), 或包含于其他系統(tǒng)。計(jì)算機(jī)系統(tǒng)(101)從存儲(chǔ)部(108)向存儲(chǔ)器內(nèi)(102)讀出變換前的程序代碼
(109)。在此,計(jì)算機(jī)系統(tǒng)(101)可以從存儲(chǔ)部(108)向存儲(chǔ)器內(nèi)(10 讀出其他程序代碼
(110)。檢索部(103)檢索向上述存儲(chǔ)器讀出的程序代碼(109)以及任意其他程序代碼 (110)。通過(guò)該檢索,檢索部(10 檢索在同步塊內(nèi)的第一條件句、更新句、與同步塊同步的其他同步塊、參照來(lái)自同步塊外的語(yǔ)句的第一變量的語(yǔ)句、記載與啟動(dòng)線程的同步塊內(nèi)的語(yǔ)句同步地執(zhí)行的其他線程的安裝的語(yǔ)句、或參照用于確定線程的執(zhí)行順序的變量的語(yǔ)句。檢索部(103)包括判斷部(107)。
判斷部(107)在用于上述檢索的信息不充分的情況下,允許用戶輸入該信息。判斷部(107)還為了進(jìn)一步限定上述檢索的條件允許用戶輸入該條件。判定部(106)從檢索部(10 接收檢索結(jié)果。判定部(106)根據(jù)上述檢索結(jié)果判定程序代碼(109)中的沒(méi)有副作用的路徑。復(fù)制部(104)將上述判定的沒(méi)有副作用的路徑復(fù)制到程序代碼(109)的同步塊外。追加部(10 將向上述復(fù)制的沒(méi)有副作用的路徑分支的第二條件句追加到向上述存儲(chǔ)器讀出的程序代碼(109)。追加部(10 還將包含用于存儲(chǔ)第一條件式的結(jié)果的變量和代入該變量的上述第一條件式的結(jié)果的語(yǔ)句、初始化該變量的語(yǔ)句或聲明該變量的語(yǔ)句追加到向上述存儲(chǔ)器讀出的程序代碼(109)。圖2示出本發(fā)明的實(shí)施方式中的圖1所示的變換前的程序代碼。程序代碼(200)是變換前的程序代碼。下面以該程序代碼(200)為例說(shuō)明說(shuō)明書(shū)中記載的各用語(yǔ)。與“類”對(duì)應(yīng)的語(yǔ)句是滿足格式“class類名{類的安裝}”的語(yǔ)句。因此,在變換前的程序代碼O00)中與“類”對(duì)應(yīng)的語(yǔ)句是類WQ01A)以及類W201B)。與“方法”對(duì)應(yīng)的語(yǔ)句是滿足格式“返回值方法名(參數(shù)型參數(shù)名)方法的安裝},, 的語(yǔ)句。因此,在變換前的程序代碼O00)中與“方法”對(duì)應(yīng)的語(yǔ)句是方法enqUeUe(WW) (202A)以及dequeue ()(202B)。此外,在方法內(nèi)記載的語(yǔ)句中包含其他的方法調(diào)用的情況下,記載該其他的方法的安裝的語(yǔ)句也作為在上述同步方法內(nèi)記載的語(yǔ)句處理。與“同步塊”對(duì)應(yīng)的語(yǔ)句例如是進(jìn)行了 synchronized塊的聲明的語(yǔ)句或指定了 synchronized修飾符的方法。因此,在變換前的程序代碼Q00)中與“同步塊”對(duì)應(yīng)的語(yǔ)句是第一同步塊(203A)、第二同步塊Q03B)以及第三同步塊O03C)?!巴綁K的鎖對(duì)象”是例如通過(guò)上述synchronized塊的聲明或指定了上述 synchronized修飾符的方法的參數(shù)指定的變量。因此,第一同步塊Q03A)的鎖對(duì)象是 w(204A)o第二同步塊Q03B)的鎖對(duì)象是lOcH204B)。第三同步塊Q03C)的鎖對(duì)象是 lock(204C)。此外,記載在同步塊內(nèi)的語(yǔ)句中包含方法調(diào)用的情況下,記載該方法的安裝的語(yǔ)句也作為記載在上述同步塊內(nèi)的語(yǔ)句處理。與“條件句”對(duì)應(yīng)的語(yǔ)句是例如“IF”語(yǔ)句、“SWITCH”語(yǔ)句或記載有“三元運(yùn)算子” 的語(yǔ)句。因此,在變換前的程序代碼(200)中與“條件句”對(duì)應(yīng)的語(yǔ)句是第一條件句(205A)、 第二條件句(205B)、第三條件句Q05C)以及第四條件句O05D)?!皸l件式”是包含于條件分支句用于選擇執(zhí)行路徑的式子。因此,第一條件句 (205A)的條件式是w. val = = nulK206A)。第二條件句O05B)的條件式是head = = null(206B)o第三條件句(205C)的條件式是head ! = null(206C)o第四條件句(205D) 的條件式是 w. next == w (206D)。在執(zhí)行了程序代碼000)的情況下,與“路徑”對(duì)應(yīng)的語(yǔ)句是存在處理的可能性的語(yǔ)句。例如,方法enqueue (Ww) (202A)被執(zhí)行結(jié)束之前的路徑是路徑(207A),以及方法 dequeue () (202B)被執(zhí)行結(jié)束之前的路徑是路徑O07B)。此外,條件句被執(zhí)行結(jié)束之前的路徑是從開(kāi)始各自的分支處理的語(yǔ)句到結(jié)束各自的分支處理的語(yǔ)句。(1)對(duì)于第一條件句Q05A),在從方法enqueue (Ww) (202A)退出的處理(208A和 208B)的下一語(yǔ)句中結(jié)束各自的分支的處理。因此,第一條件句O05A)被執(zhí)行結(jié)束之前的路徑是在條件式O06A)成立時(shí)執(zhí)行的路徑Q09A)以及在條件式Q06A)不成立時(shí)執(zhí)行的路徑(209B)。(2)第二條件句(205B)具有與 “ if (head == null) {w. next = w ;} else {w. next =head ;}”相同的意思。因此,在將w或head代入w. next的處理的下一語(yǔ)句中結(jié)束各自的分支的處理。因此,第二條件句O05B)被執(zhí)行結(jié)束之前的路徑是在條件式O06B)成立時(shí)執(zhí)行的路徑(w. next = w;)以及在條件式Q06B)不成立時(shí)執(zhí)行的路徑(w. next = head ;)。⑶對(duì)于第三條件句(205C),在從方法dequeue () (202B)退出的處理(208C和 208D)的下一語(yǔ)句結(jié)束各自的分支的處理。因此,第三條件句O05C)被執(zhí)行結(jié)束之前的路徑是在條件式O06C)成立時(shí)執(zhí)行的路徑Q09C)以及在條件式Q06C)不成立時(shí)執(zhí)行的路徑(209D)。(4)第四條件句 Q05D)具有與“if (w. next = = w) {head = null ;} else {head = w. next ;}”相同的意思。因此,在將null或w. next代入head的處理的下一語(yǔ)句中結(jié)束各自的分支的處理。因此,第四條件句O05D)被執(zhí)行結(jié)束之前的路徑是在條件式O06D) 成立時(shí)執(zhí)行的路徑(head = null ;)以及在條件式Q06D)不成立時(shí)執(zhí)行的路徑(head = w. next ;) ο“第一變量”是用于判斷分支的變量。因此,第一條件句O05A)的第一變量是 w. val(210A)o第二條件句(205B)的第一變量是headQlOB)。第三條件句(205C)的第一變量是heacK210C)。第四條件句(205D)的第一變量是w. next Q10D)?!案戮洹笔前鲜龅谝蛔兞康耐綁K內(nèi)的語(yǔ)句,是更新上述第一變量的語(yǔ)句。更新w.vaK210A)的更新句不包含于包含w. val O10A)的第一同步塊Q03A)。更新 head(210B)的更新句是更新句QllB)。更新headQlOC)的更新句是更新句QllC)。更新 w. next(210D)的更新句是更新句QllD)。圖3 圖5示出本發(fā)明實(shí)施方式的圖1所示的變換程序中執(zhí)行的處理步驟的例子。下面以變換前的程序代碼是用Java(商標(biāo))語(yǔ)言記載的程序代碼的情況為例進(jìn)行說(shuō)明。計(jì)算機(jī)系統(tǒng)(101)將變換前的程序代碼(下面稱為CL)設(shè)為輸入數(shù)據(jù)。計(jì)算機(jī)系統(tǒng)除了該CL之外,還可以將從上述CL鏈接的其他程序代碼(下面稱為其他CL)作為輸入數(shù)據(jù)。在此,輸入數(shù)據(jù)是能夠從上述變換程序參照的數(shù)據(jù)。圖3是本發(fā)明實(shí)施方式的圖1所示的變換程序中執(zhí)行的處理步驟中取得變換所需的信息的處理步驟的例子。步驟301是上述變換處理的開(kāi)始。在步驟301中,計(jì)算機(jī)系統(tǒng)將上述輸入數(shù)據(jù)例如讀入存儲(chǔ)器。隨著該讀入結(jié)束,該處理進(jìn)入步驟302。在步驟302中,計(jì)算機(jī)系統(tǒng)準(zhǔn)備用于存儲(chǔ)用于上述變換的信息的變量i、集合變量 M、集合變量S以及集合變量C。變量i是存儲(chǔ)用于識(shí)別在下述步驟315中聲明的變量(下面為第二變量)的變量。變量i例如使用向上述第二變量分配的連續(xù)編號(hào)。也可以不準(zhǔn)備變量。在不準(zhǔn)備變量i的情況下,計(jì)算機(jī)系統(tǒng)在每次聲明第二變量時(shí)對(duì)第二變量標(biāo)注能夠唯一識(shí)別的變量名。上述能夠唯一識(shí)別的變量名可以例如由用戶確定,也可以不重復(fù)地隨機(jī)確定。集合變量是用于集合具有不同意思的數(shù)據(jù)進(jìn)行處理的組。集合變量例如用排列或構(gòu)造體表示。集合變量M按上述每個(gè)方法存儲(chǔ)關(guān)于執(zhí)行上述CL時(shí)處理能夠到達(dá)的方法的信息的集合變量。上述方法的信息,是能夠從程序代碼確定記載對(duì)應(yīng)的方法的安裝的語(yǔ)句即可。 關(guān)于上述方法的信息例如是記載方法的安裝的語(yǔ)句的開(kāi)始位置、記載方法的安裝的語(yǔ)句的結(jié)束位置或者記載方法的安裝的語(yǔ)句,但不限于這些。集合變量S按上述每個(gè)同步塊設(shè)定關(guān)于分別執(zhí)行上述方法時(shí)處理能夠到達(dá)的同步塊的信息的集合變量。關(guān)于上述同步塊的信息是同步塊的鎖對(duì)象(下面為S的第一信息)、同步塊的程序代碼上的開(kāi)始結(jié)束位置(下面為S的第二信息)以及同步塊內(nèi)的語(yǔ)句 (下面為S的第三信息)。集合變量C是按每個(gè)上述執(zhí)行路徑設(shè)定關(guān)于包含于各上述同步塊的滿足預(yù)定條件的執(zhí)行路徑的信息的集合變量。關(guān)于上述執(zhí)行路徑的信息,是與上述執(zhí)行路徑對(duì)應(yīng)的上述同步塊的鎖對(duì)象(下面為C的第一信息)、與上述執(zhí)行路徑對(duì)應(yīng)的上述同步塊的程序代碼上的開(kāi)始結(jié)束位置(下面為C的第二信息)以及能夠從程序代碼確定的上述執(zhí)行路徑的信息(下面為C的第三信息)。上述C的第三信息例如是執(zhí)行路徑的開(kāi)始位置、執(zhí)行路徑的結(jié)束位置、或記載執(zhí)行路徑的語(yǔ)句,但不限于此。計(jì)算機(jī)系統(tǒng)在變量i、集合變量S和集合變量C的上述準(zhǔn)備中向該變量i、該集合變量S和該集合變量C設(shè)定初始值。上述初始值例如是表示空的值。計(jì)算機(jī)系統(tǒng)例如設(shè)定 0或1作為變量i的初始值。此外,集合變量S和C例如是包含數(shù)值型變量和文字型變量的構(gòu)造體的情況下,計(jì)算機(jī)系統(tǒng)例如向數(shù)值型變量的初始值設(shè)定0,向文字型變量的初始值設(shè)定NULL作為集合變量S和C的初始值。計(jì)算機(jī)系統(tǒng)還在集合變量M的上述準(zhǔn)備中向上述集合變量M設(shè)定關(guān)于上述方法的信息。計(jì)算機(jī)系統(tǒng)檢索包含于CL的方法,將關(guān)于檢索出的方法的信息設(shè)定到集合變量M。 在上述檢索中,可以預(yù)先由用戶指定設(shè)為對(duì)象的方法,可以檢索包含于CL的所有方法。通過(guò)執(zhí)行包含于CL的方法能夠到達(dá)的方法例如可以從上述其他CL檢索。此外,可以代替上述檢索,由用戶向集合變量M設(shè)定關(guān)于上述方法的信息。隨著上述準(zhǔn)備結(jié)束,該處理進(jìn)入步驟303。步驟303中,表示關(guān)于集合變量M的反復(fù)開(kāi)始。步驟303中,計(jì)算機(jī)系統(tǒng)從集合變量M取出一件關(guān)于方法的信息(下面為m)。隨著該取出結(jié)束,該處理進(jìn)入步驟304。在步驟304中,計(jì)算機(jī)系統(tǒng)向集合變量S設(shè)定數(shù)據(jù)。計(jì)算機(jī)系統(tǒng)檢索與上述取出的m對(duì)應(yīng)的方法被執(zhí)行時(shí)處理能夠到達(dá)的同步塊。 在上述方法自身是同步塊的情況下,上述方法自身也成為被檢索的同步塊。CL例如是 Java(商標(biāo))記載的程序代碼的情況下,計(jì)算機(jī)系統(tǒng)例如從上述CL檢索“synchronized”。 在與m對(duì)應(yīng)的方法由“synchronized”修飾的情況下,上述修飾的“synchronized”也還是被檢索的 “synchronized,,。
計(jì)算機(jī)系統(tǒng)從該檢索出的同步塊取得關(guān)于上述檢索的同步塊各自的、鎖對(duì)象(S 的第一信息)、程序代碼上的開(kāi)始結(jié)束位置(S的第二信息)以及同步塊內(nèi)的語(yǔ)句(S的第三信息),按每個(gè)同步塊向集合變量S設(shè)定該取得的S的第一 第三信息作為一組信息。關(guān)于在檢索的同步塊中已經(jīng)檢索而設(shè)定了信息的同步塊,不需要進(jìn)行上述設(shè)定。隨著結(jié)束上述設(shè)定,該處理進(jìn)入步驟305。步驟305表示關(guān)于集合變量M的反復(fù)的結(jié)束。在所有m取出完成的情況下,該處理進(jìn)入步驟306。在存在未取出的m的情況下, 該處理返回步驟303。步驟306表示關(guān)于集合變量S的反復(fù)的開(kāi)始。步驟306中,計(jì)算機(jī)系統(tǒng)從集合變量S取出一件關(guān)于同步塊的上述一組信息(下面為s)。隨著該取出結(jié)束,該處理進(jìn)入步驟307。在步驟307中,計(jì)算機(jī)系統(tǒng)判定在向與上述取出的s對(duì)應(yīng)的集合變量S設(shè)定的同步塊內(nèi)的語(yǔ)句(下面為s的第三信息)中是否包含沒(méi)有發(fā)生副作用的路徑。該判定在包含于同步塊內(nèi)的語(yǔ)句(s的第三信息)路徑且關(guān)于各執(zhí)行的路由的路徑(下面為執(zhí)行路徑) 的全部中執(zhí)行。在該判定中,計(jì)算機(jī)系統(tǒng)例如判定引起記載在下述副作用列表的副作用的原因是否包含于上述執(zhí)行路徑。副作用列表例如預(yù)先由用戶制作。用戶預(yù)先將引起副作用的原因例如方法或變量登記到副作用列表。方法例如是關(guān)于I/O的方法或JOT的方法。變量例如是實(shí)例變量或類變量。計(jì)算機(jī)系統(tǒng)在上述判定中,在上述執(zhí)行路徑中例如發(fā)現(xiàn)了向上述方法或變量寫(xiě)入的情況下,將上述執(zhí)行路徑判定為發(fā)生副作用的路徑,在沒(méi)有發(fā)現(xiàn)的情況下,將上述執(zhí)行路徑判定為沒(méi)有發(fā)生副作用的路徑。上述登記可以自動(dòng)地通過(guò)計(jì)算機(jī)系統(tǒng)執(zhí)行。計(jì)算機(jī)系統(tǒng)例如在步驟302中從上述CL或上述其他CL的至少一個(gè)取得引起副作用的原因,將該取得的引起副作用的原因登記到副作用列表。此外,計(jì)算機(jī)系統(tǒng)通過(guò)調(diào)查包含于執(zhí)行路徑的變量的種類能夠執(zhí)行上述判定。計(jì)算機(jī)系統(tǒng)例如通過(guò)調(diào)查上述變量的聲明記載在上述CL的何處或上述變量的范圍設(shè)定在CL 上的哪個(gè)范圍,能夠執(zhí)行上述判定。在上述執(zhí)行路徑中存在沒(méi)有發(fā)生副作用的路徑的情況下,該處理進(jìn)入步驟308。在上述執(zhí)行路徑全部是發(fā)生副作用路徑的情況下,該處理進(jìn)入步驟310。在步驟308中,計(jì)算機(jī)系統(tǒng)判定不發(fā)生上述副作用的執(zhí)行路徑和用于執(zhí)行該執(zhí)行路徑的條件句是否滿足以下條件。上述條件是上述執(zhí)行路徑包含實(shí)例變量或類變量的至多一個(gè)的讀出,上述條件句評(píng)價(jià)該讀出和常量。在滿足條件的條件句存在即使一個(gè)的情況下,該處理進(jìn)入步驟309。在滿足條件的條件句不存在的情況下,該處理進(jìn)入步驟310。在步驟309中,計(jì)算機(jī)系統(tǒng)關(guān)于通過(guò)滿足上述條件的條件句執(zhí)行的各路徑,分別將作為上述S的第一信息的鎖對(duì)象(C的第一信息)、作為上述S的第二信息的程序代碼上的開(kāi)始結(jié)束位置(C的第二信息)、以及能夠從程序代碼確定通過(guò)滿足上述條件的條件句執(zhí)行的執(zhí)行路徑的信息(C的第三信息)向集合變量C設(shè)定作為一組信息。隨著上述設(shè)定的結(jié)束,該處理進(jìn)入步驟310。在所有s取出完成的情況下,該處理進(jìn)入步驟311。在存在未取出的s的情況下,該處理返回步驟306。圖4示出本發(fā)明實(shí)施方式中的、圖1所示變換程序中執(zhí)行的處理步驟中進(jìn)行變換的處理步驟的例子。步驟311示出關(guān)于集合變量C的反復(fù)的開(kāi)始。在步驟311中,計(jì)算機(jī)系統(tǒng)從集合變量C取出一件關(guān)于執(zhí)行路徑的上述一組信息 (下面為c)。計(jì)算機(jī)系統(tǒng)從關(guān)于通過(guò)程序代碼早執(zhí)行的執(zhí)行路徑的信息起依次進(jìn)行上述取出。隨著該取出結(jié)束,該處理進(jìn)入步驟312。在步驟312中,計(jì)算機(jī)系統(tǒng)判定向與上述取出的c對(duì)應(yīng)的集合變量C設(shè)定的鎖對(duì)象(下面為c的第一信息)是否僅在CL內(nèi)使用。在該判定中,例如在CL用Java(商標(biāo)) 語(yǔ)言記載的情況下,檢查在鎖對(duì)象(c的第一信息)的定義使用private修飾符或在上述其他CL中不包含使用上述鎖對(duì)象(c的第一信息)的記載。通過(guò)該檢查,在鎖對(duì)象(c的第一信息)的定義使用了 private修飾符或在上述其他CL中不包含使用上述鎖對(duì)象(c的第一信息)的記載的情況下,計(jì)算機(jī)系統(tǒng)判定鎖對(duì)象(c的第一信息)僅在CL內(nèi)使用。在此,例如,由于沒(méi)有給予上述其他CL作為輸入數(shù)據(jù)或提供上述其他CL作為二進(jìn)制數(shù)據(jù)使得源代碼的記載不明的理由,存在無(wú)法執(zhí)行上述檢查的情況。在無(wú)法執(zhí)行上述檢查的情況下,計(jì)算機(jī)系統(tǒng)例如可以判定為鎖對(duì)象(c的第一信息)不是僅在CL內(nèi)使用。此外,計(jì)算機(jī)系統(tǒng)例如可以使監(jiān)控器顯示用于進(jìn)行上述判定的信息,使用戶進(jìn)行上述判定。在僅在CL內(nèi)使用的情況下,該處理進(jìn)入步驟314。在CL外也使用的情況下,該處理進(jìn)入步驟313。步驟313中,計(jì)算機(jī)系統(tǒng)判定執(zhí)行與上述c對(duì)應(yīng)的集合變量C的第三信息(下面為c的第三信息)所對(duì)應(yīng)的路徑的條件句中包含的所有變量是否僅在CL內(nèi)定義。該判定中檢查在上述其他CL中不包含上述參照的變量的定義。通過(guò)該檢查,在上述其他CL中不包含上述參照的變量的定義的情況下,計(jì)算機(jī)系統(tǒng)判定為參照的變量?jī)H在CL內(nèi)定義。在此, 例如,由于沒(méi)有給予上述其他CL作為輸入數(shù)據(jù)或提供上述其他CL作為二進(jìn)制數(shù)據(jù)使得源代碼的記載不明的理由,存在上述檢查無(wú)法執(zhí)行的情況。在無(wú)法執(zhí)行上述檢測(cè)的情況下,計(jì)算機(jī)系統(tǒng)例如可以判定為上述參照的變量不是僅在CL內(nèi)定義。此外,計(jì)算機(jī)系統(tǒng)例如可以使監(jiān)控器顯示用于進(jìn)行上述判定的信息,使用戶進(jìn)行上述判定。在僅在CL內(nèi)定義上述參照的變量的情況下,該處理進(jìn)入步驟314。在并非僅在CL內(nèi)定義上述參照的變量的情況下,該處理進(jìn)入步驟318。在步驟314中,計(jì)算機(jī)系統(tǒng)向CL內(nèi)追加聲明變量(下面為第二變量)的語(yǔ)句。上述追加的情況下,根據(jù)記述CL的程序語(yǔ)言的規(guī)格而不同。第二變量的聲明是保證原子性的數(shù)據(jù)型、能夠指定靜態(tài)的而且抑制最優(yōu)化的數(shù)據(jù)型的第二變量的聲明。在此,保證原子性根據(jù)語(yǔ)言規(guī)格保證用一次操作執(zhí)行向存儲(chǔ)器讀入變量。如果是Java(商標(biāo))語(yǔ)言,例如boolean 型、byte型、short型、int型或float型是大小在32位以下的數(shù)據(jù)型,是例如在32位以上的CPU上執(zhí)行用上述Java (商標(biāo))語(yǔ)言記載的程序的情況下,保證用一次操作執(zhí)行向存儲(chǔ)器讀入變量的數(shù)據(jù)型。靜態(tài)的是指在CL內(nèi)僅具有一個(gè)實(shí)體。例如,在Java(商標(biāo))語(yǔ)言的情況下,變量是靜態(tài)可以用修飾符static指定。此外,抑制最優(yōu)化是指例如抑制在匯編中程序代碼進(jìn)行與存儲(chǔ)器的訪問(wèn)順序有關(guān)的最優(yōu)化。例如,在Java(商標(biāo))語(yǔ)言的情況下,抑制變量的最優(yōu)化可以用修飾符volatile指定。通過(guò)導(dǎo)入volatile聲明,保證存儲(chǔ)器命令和向同步塊外變更的可視性。
第二變量的變量名只要是不與其他變量重復(fù)的名字,可以是任意名字。該名字例如可以通過(guò)包含變量i識(shí)別。CL如果是用作為第二變量能夠使用排列的語(yǔ)言記載的程序代碼,則上述名字可以是將變量i作為添標(biāo)的排列。在上述第二變量的聲明中,聲明第二變量是靜態(tài)變量。此外,從向S設(shè)定了信息的同步塊內(nèi)的語(yǔ)句以外訪問(wèn)與上述c的第三信息對(duì)應(yīng)的路徑中包含的共有變量的情況下,在上述第二變量聲明中,還聲明上述第二變量是抑制最優(yōu)化的對(duì)象的變量。在此,共有變量是具有從多個(gè)線程訪問(wèn)的可能性的變量。在記述CL的程序語(yǔ)言是Java(商標(biāo))語(yǔ)言的情況下,上述共有變量是實(shí)例變量和類變量。上述訪問(wèn)通過(guò)詳查例如CL或上述其他CL求出。在此,例如,由于沒(méi)有給予上述其他CL作為輸入數(shù)據(jù)或提供上述其他CL作為二進(jìn)制數(shù)據(jù)使得源代碼的記載不明的理由,存在無(wú)法執(zhí)行上述詳查的情況。在無(wú)法執(zhí)行上述詳查的情況下, 計(jì)算機(jī)系統(tǒng)可以從同步塊的外側(cè)訪問(wèn)共有變量。此外,計(jì)算機(jī)系統(tǒng)例如可以在監(jiān)控器顯示使用戶判斷是否從同步塊的外側(cè)訪問(wèn)共有變量的信息,使用戶進(jìn)行上述判斷。隨著上述追加結(jié)束,該處理進(jìn)入步驟315。在步驟315中,計(jì)算機(jī)系統(tǒng)從執(zhí)行與上述c的第三信息對(duì)應(yīng)的執(zhí)行路徑的條件句制作語(yǔ)句。上述制作的語(yǔ)句在用于執(zhí)行上述執(zhí)行路徑的條件成立時(shí)和條件不成立時(shí)分別將不同的值代入上述第二變量的語(yǔ)句。例如,上述第二變量是boolean型的變量bl,上述條件句的條件式是(χ != null)的情況下,上述制作的語(yǔ)句可以設(shè)為“bl = (χ !=皿11); ”。在其他例子中,上述第二變量是int型的變量il,上述條件句的條件式是(y ==0)的情況下,上述制作的語(yǔ)句例如可以設(shè)為 “if(y == 0) {il = 0 ;} else {il = = 1 ;};,,。此外,上述條件句例如是分支為三條以上的路徑的條件句“if (χ == 0) {if (y = =0) {χ++ ;y-} else {c2++ ;}}else {cl++ ;} (cl和c2都是局部變量)”的情況下,上述制作的語(yǔ)句例如可以設(shè)為“b = (χ ! == 0) ?! (y ! = = 0) ? 2:0 ; ”。在此,代入變量b的值表示從不具有副作用的路徑中選擇哪一個(gè)。在上述例中,制作b為1的情況下選擇執(zhí)行 "cl++ ;,,的路徑,b為2的情況下選擇執(zhí)行“c2++ ;,,的路徑的語(yǔ)句。然后計(jì)算機(jī)系統(tǒng)在上述條件式中包含實(shí)例變量的情況下,從上述第二變量的聲明刪除為上述靜態(tài)變量的聲明。例如在Java(商標(biāo))語(yǔ)言的情況下,上述刪除是刪除修飾符 static。隨著結(jié)束上述刪除,該處理進(jìn)入步驟316。在步驟316中,計(jì)算機(jī)系統(tǒng)將與上述c的第三信息對(duì)應(yīng)的路徑復(fù)制到緊接用上述c 的第二信息表示的CL上的同步塊的開(kāi)始位置之前。然后計(jì)算機(jī)系統(tǒng)在上述第二變量的值為成立值的情況下開(kāi)始從上述追加的執(zhí)行路徑的處理,另一方面在上述第二變量的值是不成立值的情況下將開(kāi)始從上述同步塊的處理的條件句追加到CL上。上述條件句的終端,在值為成立值的情況和值為不成立值的情況下都在緊接用上述c的第二信息表示的CL上的同步塊的結(jié)束位置之后。隨著結(jié)束上述條件句的追加,該處理進(jìn)入步驟317。在步驟317中,計(jì)算機(jī)系統(tǒng)執(zhí)行關(guān)于與上述c的第三信息對(duì)應(yīng)的執(zhí)行路徑有關(guān)的同步塊的處理。關(guān)于該處理,將在下述圖5中詳細(xì)描述。關(guān)于上述同步塊的處理,可以向CL 追加新的語(yǔ)句。此外,關(guān)于上述同步塊的處理中,可以刪除在步驟314和316中向CL追加的語(yǔ)句。隨著關(guān)于上述同步塊的處理結(jié)束,該處理進(jìn)入步驟318。步驟318表示關(guān)于集合變量C的反復(fù)的結(jié)束。在所有c完成取出的情況下,該處理進(jìn)入步驟319。存在沒(méi)有取出的c的情況下, 該處理返回步驟311。在步驟319中,計(jì)算機(jī)系統(tǒng)關(guān)于第二變量,在聲明上述第二變量的語(yǔ)句與上述第二變量對(duì)應(yīng)的上述步驟314和316向CL追加的語(yǔ)句或與上述第二變量對(duì)應(yīng)的同步塊的語(yǔ)句且最早執(zhí)行的語(yǔ)句之間,追加向上述第二變量設(shè)定初始值的語(yǔ)句。設(shè)定上述初始值的語(yǔ)句是在步驟315中生成的語(yǔ)句。在此,上述初始值可以是上述不成立值。上述語(yǔ)句的追加對(duì)定義的所有第二變量執(zhí)行。隨著上述追加的結(jié)束,該處理進(jìn)入步驟320。步驟320是上述變換處理的結(jié)束。圖5示出本發(fā)明實(shí)施方式的圖4所示的步驟317的處理的詳細(xì)情況。步驟321示出步驟317的處理的開(kāi)始。步驟322中,計(jì)算機(jī)系統(tǒng)從集合變量S取出一件關(guān)于方法的信息(s)。隨著該取出結(jié)束,該處理進(jìn)入步驟323。在步驟323中,計(jì)算機(jī)系統(tǒng)判定上述c的第一信息即鎖對(duì)象和上述s的第一信息即鎖對(duì)象是否相同。在相同的情況下,該處理進(jìn)入步驟324。在不同的情況下,該處理進(jìn)入步驟幻9。在步驟324中,計(jì)算機(jī)系統(tǒng)判定由上述s的第三信息表示的同步塊中是否包含更新在步驟315中制作的語(yǔ)句中包含的變量的語(yǔ)句。在包含上述更新的語(yǔ)句的情況下,該處理進(jìn)入步驟325。在不包含上述更新的語(yǔ)句的情況下,該處理進(jìn)入步驟329。在步驟325中,計(jì)算機(jī)系統(tǒng)判定在由上述s的第三信息表示的同步塊中是否包含啟動(dòng)使用上述c的第一信息即鎖對(duì)象取得鎖的線程的語(yǔ)句。該判定通過(guò)計(jì)算機(jī)系統(tǒng)詳查上述同步塊執(zhí)行。在上述詳查中,存在發(fā)現(xiàn)使上述鎖對(duì)象在上述同步塊內(nèi)使用的語(yǔ)句(下面為第一語(yǔ)句)的情況。上述第一語(yǔ)句例如是將上述鎖對(duì)象作為參數(shù)的方法。在發(fā)現(xiàn)了上述第一語(yǔ)句的情況下,計(jì)算機(jī)系統(tǒng)例如詳查上述其他CL,求出通過(guò)上述第一語(yǔ)句執(zhí)行的執(zhí)行路徑。計(jì)算機(jī)系統(tǒng)通過(guò)詳查上述求出的執(zhí)行路徑,能夠發(fā)現(xiàn)啟動(dòng)線程的語(yǔ)句。通過(guò)上述詳查沒(méi)有發(fā)現(xiàn)啟動(dòng)上述線程的語(yǔ)句的情況下,該處理進(jìn)入步驟326。在發(fā)現(xiàn)了的情況下,該處理進(jìn)入步驟328。在此,例如由于沒(méi)有給予上述其他CL作為輸入數(shù)據(jù)或提供上述其他CL作為二進(jìn)制使得源代碼記載不明的理由,存在無(wú)法執(zhí)行上述詳查的情況。在無(wú)法執(zhí)行上述詳查的情況下,計(jì)算機(jī)系統(tǒng)可以判定為啟動(dòng)上述線程的語(yǔ)句包含于與上述c的第三信息對(duì)應(yīng)的執(zhí)行路徑。此外,計(jì)算機(jī)系統(tǒng)例如在監(jiān)控器顯示輸入是否包含啟動(dòng)上述線程的語(yǔ)句的信息,使用戶進(jìn)行上述判定。在步驟326中,計(jì)算機(jī)系統(tǒng)判定與上述s的第三信息對(duì)應(yīng)的同步塊內(nèi)定義的變量是否在上述同步塊外參照且用于線程間的執(zhí)行排序。該判定通過(guò)計(jì)算機(jī)系統(tǒng)詳查上述程序代碼執(zhí)行。通過(guò)上述詳查,在沒(méi)有發(fā)現(xiàn)上述變量的情況下,該處理進(jìn)入步驟327。在發(fā)現(xiàn)了的情況下,該處理進(jìn)入步驟328。在此,例如,由于沒(méi)有給予上述其他CL作為輸入數(shù)據(jù)或提供上述其他CL作為二進(jìn)制使得源代碼記載不明的理由,存在無(wú)法執(zhí)行上述詳查的情況。在無(wú)法執(zhí)行上述詳查的情況下,計(jì)算機(jī)系統(tǒng)可以判定為上述變量包含于與上述c的第三信息對(duì)應(yīng)的執(zhí)行路徑。此外, 計(jì)算機(jī)系統(tǒng)例如在監(jiān)控器顯示輸入是否包含上述變量的信息,使用戶進(jìn)行上述判定。在步驟327中,計(jì)算機(jī)系統(tǒng)向CL追加在步驟315中制作的語(yǔ)句。在此,第二變量為指定了抑制變量的最優(yōu)化的變量的情況下,上述追加對(duì)與s對(duì)應(yīng)的同步塊執(zhí)行。此外,上述追加的CL上的位置在緊接用于從與上述s對(duì)應(yīng)的同步塊退出的語(yǔ)句之前。第二變量為沒(méi)有指定抑制變量的最優(yōu)化的變量的情況下,上述追加的CL上的位置為在上述步驟3M發(fā)現(xiàn)的上述更新的語(yǔ)句之后,在退出與上述s對(duì)應(yīng)的同步塊的處理之
、r -刖。隨著上述追加結(jié)束,該處理進(jìn)入步驟329。在步驟328中,計(jì)算機(jī)系統(tǒng)在步驟314和316中刪除向CL追加的語(yǔ)句。隨著上述刪除結(jié)束,關(guān)于步驟322的反復(fù)結(jié)束,該處理進(jìn)入步驟330。步驟3 表示關(guān)于集合變量S的反復(fù)的結(jié)束。在所有s取出完成的情況下,計(jì)算機(jī)系統(tǒng)使變量i遞增。隨著該遞增結(jié)束,該處進(jìn)入步驟330。在存在未取出的s的情況下,該處理返回步驟322。步驟330表示步驟317的處理的結(jié)束。在下述圖6 圖8以及圖9 圖11中示出圖3 圖5的各步驟的工作的具體例。圖6示出本發(fā)明的實(shí)施方式中的、用于具體說(shuō)明圖3 圖5所示的各步驟的工作的輸入數(shù)據(jù)CL。圖6 圖8所示的例子表示步驟325和步驟326中向用戶進(jìn)行詢問(wèn)的情況。計(jì)算機(jī)系統(tǒng)將輸入數(shù)據(jù)001)作為輸入數(shù)據(jù)CL啟動(dòng)變換程序。在步驟302中,計(jì)算機(jī)系統(tǒng)向變量設(shè)定以下的值。集合變量 M= {void enqueue (Ww) public W dequeue ()}變量i = 1集合變量S = { Φ }集合變量C= {φ}隨著上述設(shè)定結(jié)束,該處理進(jìn)入步驟303。步驟303 步驟305的反復(fù)中,計(jì)算機(jī)系統(tǒng)對(duì)m = "Boolean enqueue (Ww),,以及 m = "public W dequeue ()”各自執(zhí)行步驟304。通過(guò)該執(zhí)行,向集合變量S保存
S={
<w、(S01,S08)、(S02,S03,S04,S05,S06,S07>(以下為 sl), 〈lock、(S03,S07)、(S04,S05,S06>(WTSs2),
〈lock、(T01,T09)、(T02,T03,T04,T05,T06,T07,T08>0^TSs3) }隨著上述保存結(jié)束,該處理進(jìn)入步驟306。在步驟306 步驟310的反復(fù)中,計(jì)算機(jī)系統(tǒng)對(duì)包含于上述集合變量S的sl s3執(zhí)行步驟307 步驟309。該執(zhí)行的結(jié)果是,向集合變量C保存C = {〈lock、(SOI, S09)、T02, T07, T08> (以下為 c),}在此,在包含S03的路徑上具有同步的副作用。此外,在包含S04行和T05行的路徑上存在向?qū)嵗兞看氲母弊饔谩R虼?,包含S03行、S04行和T05行的路徑不滿足步驟 307的條件。因此,包含S03行、S04行和T05行的路徑在步驟309中不保存在集合變量C。 此外,例如,在S02行,參照從w的方法的參數(shù)提供的局部變量。因此,S02行不滿足步驟308 的條件。因此,S02行在步驟309不保存在集合變量C。然后,該處理進(jìn)入步驟311。在步驟311 步驟318的反復(fù)中,計(jì)算機(jī)系統(tǒng)對(duì)包含于上述集合變量C的c執(zhí)行步驟312 317。在步驟312和步驟313中,執(zhí)行關(guān)于上述c的判定。在此,包含于c的“l(fā)ock”是用private聲明的變量,是無(wú)法從CL外參照的變量。因此,c滿足步驟312和步驟313的條件,所以該處理進(jìn)入步驟314。在步驟314中,計(jì)算機(jī)系統(tǒng)向CL追加聲明變量的語(yǔ)句。在此,共有變量head僅在 si內(nèi)被訪問(wèn)。因此,計(jì)算機(jī)系統(tǒng)向CL追加實(shí)例變量的聲明“private static boolean bl”。在步驟315中,計(jì)算機(jī)系統(tǒng)使用T02行的條件句(head ! = null),生成“bl = (head ! null)”的語(yǔ)句。此外,head是實(shí)例變量,所以計(jì)算機(jī)系統(tǒng)從在步驟314追加的聲 BJ "private static boolean bl,,.[JB “static,,。在步驟316中,計(jì)算機(jī)系統(tǒng)在TOl行之前生成T02行、T07行以及T08行。此外, 計(jì)算機(jī)系統(tǒng)用“ (bl) ”置換包含于c的條件句。計(jì)算機(jī)系統(tǒng)是T02行的then節(jié)向具有副作用的路徑的分支,所以將上述then節(jié)與向同步塊的代碼相連。圖7示出本發(fā)明實(shí)施方式的圖4所示的步驟316的處理被執(zhí)行后的方法 dequeue ()。通過(guò)步驟316的處理,向CL的方法dequeue ()追加語(yǔ)句(412)。在上述步驟316中,隨著執(zhí)行上述追加,該處理進(jìn)入步驟317。在步驟317中,計(jì)算機(jī)系統(tǒng)執(zhí)行步驟322 步驟329的反復(fù)。在步驟322 步驟3 的反復(fù)中,計(jì)算機(jī)系統(tǒng)對(duì)包含于上述集合變量S的si s3 各自執(zhí)行步驟323 步驟328。滿足步驟322的條件的si s3是〈lock、(S03, S07)、(S04, S05, S06) > (s2)以及〈lock、(T01, T09)、(T02, T03, T04, T05, T06, T07, T08) > (s3)在步驟323中,計(jì)算機(jī)系統(tǒng)調(diào)查在關(guān)于滿足上述步驟322的條件的s2或s3的路徑是否存在至少一個(gè)向b0的代入語(yǔ)句的右邊參照的變量的代入。在s2或s3中,檢索進(jìn)行向head代入的處理。上述檢索的結(jié)果是,s2或s3滿足步驟323的條件。在步驟324中,計(jì)算機(jī)系統(tǒng)關(guān)于由上述s2或s3表示的同步塊,生成新的線程,檢查生成的線程是否將獲得與由上述s2或s3表示的同步塊相同的鎖對(duì)象。通過(guò)該檢查,發(fā)現(xiàn)在由s2表示的同步塊的S06行包含以LO為參數(shù)調(diào)用方法bar (lock)的處理。在此,在輸入僅為CL的情況下,安裝上述方法bar (lock)的程序的程序代碼不明。因此,計(jì)算機(jī)系統(tǒng)使用戶判定是否將進(jìn)行上述獲得。計(jì)算機(jī)系統(tǒng)例如在監(jiān)控器顯示“foo. bar (lock)啟動(dòng)線禾呈,關(guān)于 lock 是否調(diào)出 synchronized block 或 synchronized method,,, 對(duì)用戶進(jìn)行詢問(wèn)。用戶回答“否”的情況下,該處理進(jìn)入步驟326,用戶回答“是”的情況下, 該處理進(jìn)入步驟328。步驟326中,計(jì)算機(jī)系統(tǒng)檢查由s2或s3表示的同步塊內(nèi)定義的變量是否在同步塊外參照且用于決定至少兩個(gè)線程間的執(zhí)行順序。在此,S06行的共有變量lock存在從foo.baHlock)退出從其他線程被訪問(wèn)的可能性。因此,計(jì)算機(jī)系統(tǒng)例如在監(jiān)控器顯示 “l(fā)ock是否用于決定與其他線程決定執(zhí)行順序? ”,對(duì)用戶進(jìn)行詢問(wèn)。用戶回答“否”的情況下,該處理進(jìn)入步驟327,用戶回答“是”的情況下,該處理進(jìn)入步驟328,退出上述反復(fù)。在步驟327中,計(jì)算機(jī)系統(tǒng)決定追加在步驟315中生成的語(yǔ)句“bl = (head != null) ”的位置。bl沒(méi)有進(jìn)行volatile聲明,所以計(jì)算機(jī)系統(tǒng)將上述生成的語(yǔ)句追加到更新head的語(yǔ)句之后。該追加的場(chǎng)所例如關(guān)于s2是在S06行之后,關(guān)于s3是在T06行之前和T08行之前。隨著上述步驟322 步驟329的反復(fù)結(jié)束,該處理進(jìn)入步驟319。在步驟319中,計(jì)算機(jī)系統(tǒng)向在步驟314中追加的聲明追加“bl = (head != null); ”。隨著上述追加,該處理結(jié)束。圖8示出對(duì)圖6執(zhí)行圖3 圖5所示的步驟的處理后的輸入數(shù)據(jù)(下面為變換后的程序代碼(421))。通過(guò)圖3 圖5的步驟的處理,向變換后的程序代碼(421)追加語(yǔ)句(422)。變換后的程序代碼021)在head為null的情況下,bl成為false。因此,變換后的程序代碼G21)被執(zhí)行,head為null時(shí)調(diào)用dequeue ()方法時(shí),該處理不會(huì)突入同步塊而返回null。因此,解決所沖突的問(wèn)題。圖9示出本發(fā)明實(shí)施方式的用于具體說(shuō)明圖3 圖5所示的各步驟的工作的輸入數(shù)據(jù)CL。圖9 圖11所示的例子是在上述CL之外存在其他CL (未圖示),在步驟325和步驟326中不向用戶進(jìn)行詢問(wèn)的情況的例子。計(jì)算機(jī)程序?qū)⑤斎霐?shù)據(jù)(501)作為輸入CL,啟動(dòng)變換程序。在步驟302中,計(jì)算機(jī)系統(tǒng)向變量設(shè)定以下的值。集合變量 M= {Boolean enqueue (W w) public W dequeue ()}變量 i = 1集合變量S= {φ}集合變量C= {φ}隨著上述設(shè)定結(jié)束,該處理進(jìn)入步驟303。步驟303 步驟305的反復(fù)中,計(jì)算機(jī)系統(tǒng)對(duì)m = "boolean enqueue (Ww),,以及 m = "public W dequeue (),,各自執(zhí)行步驟304。通過(guò)該執(zhí)行,向集合變量S保存S={
<w、(S01,S08)、(S02,S03,S04,S05,S06,S07>(以下為 sl), 〈lock、(S03,S07)、(S04,S05,S06>(WTSs2), < lock, (T01,T09)、(T02,T03,T04,T05,T06,T07,T08>0^TSs3)
}隨著上述保存結(jié)束,該處理進(jìn)入步驟306。在步驟306 步驟310的反復(fù)中,計(jì)算機(jī)系統(tǒng)對(duì)包含于上述集合變量S的sl s3 分別執(zhí)行步驟307 步驟309。該執(zhí)行的結(jié)果是,向集合變量C保存C = {〈lock、(SOI, S09)、T02, T07, T08> (以下為 c),}在此,在包含S03的路徑上具有同步的副作用。此外,在包含S04行和T05行的路徑上存在向?qū)嵗兞看氲母弊饔?。因此,包含S03行、S04行和T05行的路徑不滿足步驟 307的條件。因此,包含S03行、S04行和T05行的路徑在步驟309中不保存在集合變量C。 此外,例如,在S02行,參照從w的方法的參數(shù)提供的局部變量。因此,S02行不滿足步驟308 的條件。因此,S02行在步驟309不保存在集合變量C。然后,該處理進(jìn)入步驟311。在步驟311 步驟318的反復(fù)中,計(jì)算機(jī)系統(tǒng)對(duì)包含于上述集合變量C的c執(zhí)行步驟312 317。在步驟312和步驟313中,執(zhí)行關(guān)于上述c的判定。在此,包含于c的“l(fā)ock”是用private聲明的變量,是無(wú)法從CL外參照的變量。因此,c滿足步驟312和步驟313的條件,所以該處理進(jìn)入步驟314。在步驟314中,計(jì)算機(jī)系統(tǒng)向CL追加聲明變量的語(yǔ)句。在此,共有變量head僅在 sl內(nèi)被訪問(wèn)。因此,計(jì)算機(jī)系統(tǒng)向CL追加實(shí)例變量的聲明“private static boolean bl”。在步驟315中,計(jì)算機(jī)系統(tǒng)使用T02行的條件句(head ! = null),生成“bl = (head ! null)”的語(yǔ)句。此外,head是實(shí)例變量,所以計(jì)算機(jī)系統(tǒng)從在步驟314追加的聲 BJ "private static boolean bl,,.[JB “static,,。在步驟316中,計(jì)算機(jī)系統(tǒng)在TOl行之前生成T02行、T07行以及T08行。此外, 計(jì)算機(jī)系統(tǒng)用“ (bl) ”置換包含于c的條件句。計(jì)算機(jī)系統(tǒng)是T02行的then節(jié)向具有副作用的路徑的分支,所以將上述then節(jié)與向同步塊的代碼相連。圖10示出本發(fā)明實(shí)施方式中的、執(zhí)行圖4所示的步驟316的處理后的方法 dequeue ()。通過(guò)步驟316的處理,向CL的方法dequeue ()追加語(yǔ)句(512)。在上述步驟316中,隨著執(zhí)行上述追加,該處理進(jìn)入步驟317。在步驟317中,計(jì)算機(jī)系統(tǒng)執(zhí)行步驟322 步驟329的反復(fù)。在步驟322 步驟3 的反復(fù)中,計(jì)算機(jī)系統(tǒng)對(duì)包含于上述集合變量S的sl s3 各自執(zhí)行步驟323 步驟328。滿足步驟322的條件的sl s3是
〈lock、(S03, S07)、(S04, S05, S06) > (s2)以及〈lock、(T01, T09)、(T02, T03, T04, T05, T06, T07, T08) > (s3)在步驟323中,計(jì)算機(jī)系統(tǒng)調(diào)查在關(guān)于滿足上述步驟322的條件的s2或s3的路徑是否存在至少一個(gè)向b0的代入語(yǔ)句的右邊參照的變量的代入。在s2或s3中,檢索進(jìn)行向head代入的處理。上述檢索的結(jié)果是,s2或s3滿足步驟323的條件。在步驟324中,計(jì)算機(jī)系統(tǒng)關(guān)于由上述s2或s3表示的同步塊,生成新的線程,檢查生成的線程是否將獲得與由上述s2或s3表示的同步塊相同的鎖對(duì)象。在由s2或s3表示的同步塊中不包含生成新線程的語(yǔ)句。因此,計(jì)算機(jī)系統(tǒng)在該檢查中判斷為不獲得與由上述s2或s3表示的同步塊相同的鎖對(duì)象。根據(jù)不進(jìn)行該獲得,該處理進(jìn)入步驟326。步驟326中,計(jì)算機(jī)系統(tǒng)檢查由s2或s3表示的同步塊內(nèi)定義的變量是否在同步塊外參照且用于決定至少兩個(gè)線程間的執(zhí)行順序。在此,共有變量lock進(jìn)行private聲明, 所以不從CL外訪問(wèn)。此外,共有變量lock在CL內(nèi)僅在同步塊內(nèi)被訪問(wèn)。因此,計(jì)算機(jī)系統(tǒng)在該檢查中判斷為共有變量lock不用于決定執(zhí)行順序。根據(jù)該不用于,該處理進(jìn)入步驟 327。在步驟327中,計(jì)算機(jī)系統(tǒng)決定追加在步驟315中生成的語(yǔ)句“bl = (head != null) ”的位置。bl沒(méi)有進(jìn)行volatile聲明,所以計(jì)算機(jī)系統(tǒng)將上述生成的語(yǔ)句追加到更新head的語(yǔ)句之后。該追加的場(chǎng)所例如關(guān)于s2是在S06行之后,關(guān)于s3是在T06行之前和T08行之前。隨著上述步驟322 步驟329的反復(fù)結(jié)束,該處理進(jìn)入步驟319。在步驟319中,計(jì)算機(jī)系統(tǒng)向在步驟314中追加的聲明追加“bl = (head != null); ”。 隨著上述追加,該處理結(jié)束。圖11示出本發(fā)明實(shí)施方式中的、對(duì)圖9執(zhí)行圖3 圖5所示的步驟的處理后的輸入數(shù)據(jù)(下面為變換后的程序代碼(521))。通過(guò)圖3 圖5的步驟的處理,向變換后的程序代碼(521)追加語(yǔ)句(522)。變換后的程序代碼(521)在head為null的情況下,bl成為false。因此,執(zhí)行變換后的程序代碼001),head為null時(shí)調(diào)用dequeue ()方法時(shí),該處理不會(huì)突入同步塊而返回null。因此,解決所沖突的問(wèn)題。圖12示出本發(fā)明的實(shí)施方式中的、通過(guò)第一條件式選擇的路徑為三條以上時(shí)的、 執(zhí)行圖3 圖5所示的各步驟的處理前的程序代碼的一部分以及執(zhí)行后的程序代碼的一部分。程序代碼(601)的同步塊包含兩個(gè)第一條件式“ (x==0) ”和“(y == 0) ”。此外,通過(guò)上述兩個(gè)第一條件式選擇三條路徑(602 604)。在此,在cl和c2為局部變量的情況下,路徑(60 和路徑(604)是沒(méi)有副作用的路徑。路徑(60 包含更新與第一變量對(duì)應(yīng)的χ和y的兩個(gè)變量,所以是具有副作用的路徑。程序代碼(611)示出對(duì)程序代碼(601)執(zhí)行圖3 圖5所示的各步驟的處理的結(jié)^ ο程序代碼(611)中向程序代碼(601)的同步塊追加聲明第二變量的聲明句(612)、 第二條件句(613)以及步驟315中制作的語(yǔ)句(614)。
在上述各步驟的處理中,向第二變量準(zhǔn)備可以取表示從沒(méi)有副作用的路徑(603 和604)中選擇哪一路徑的值的變量。因此,向程序代碼(611)追加聲明作為選擇路徑(603) 的值可以取2,作為表示路徑(604)的值可以取1的變量b的聲明句(612)。此外,向程序代碼(611)追加第二條件句(613),作為根據(jù)上述第二變量執(zhí)行沒(méi)有副作用的路徑(603和 604)的條件句。向程序代碼(611)還在緊接更新第一變量即χ和y的更新句之后追加在求變量b 的值的語(yǔ)句即步驟315中制作的語(yǔ)句(614)。根據(jù)本發(fā)明的實(shí)施方式,通過(guò)執(zhí)行圖3 圖5的各步驟,能夠解決java. lang. ref. ReferenceQueue中的鎖沖突的問(wèn)題。圖13示出本發(fā)明的實(shí)施方式中的、圖1的系統(tǒng)具有的計(jì)算機(jī)硬件的框圖。本發(fā)明的實(shí)施方式的計(jì)算機(jī)系統(tǒng)(701)包括CPU(702)和主存儲(chǔ)器(703),這些連接于路徑(704)。優(yōu)選,CPU(702)基于32位或64位的系統(tǒng)結(jié)構(gòu),例如可以使用英特爾公司的Xeon (商標(biāo))系列,Core (商標(biāo))系列、Atom (商標(biāo))系列,Pentium (商標(biāo))系列, Celeron (商標(biāo))系列,AMD公司的Phenom (商標(biāo))系列、Althlon (商標(biāo))系列、Turion (商標(biāo))系列或kmpron (商標(biāo))等。在路徑(704)上經(jīng)由顯示器控制器(70 連接有IXD監(jiān)控器等顯示器(706)。顯示器(706)用于為了計(jì)算機(jī)系統(tǒng)的管理將經(jīng)由通信線連接于網(wǎng)絡(luò)的計(jì)算機(jī)系統(tǒng)有關(guān)的信息和在該計(jì)算機(jī)系統(tǒng)上工作中的軟件有關(guān)的信息在適當(dāng)?shù)膱D形界面顯示。在路徑(704)上還經(jīng)由IDE或SATE控制器(707)連接有硬盤(pán)或硅盤(pán)(708)和 CD-ROM、DVD 驅(qū)動(dòng)器或 Blu-ray 驅(qū)動(dòng)器(709)。在硬盤(pán)(708)中以可下載的方式在主存儲(chǔ)器(70 存儲(chǔ)有操作系統(tǒng)、提供J2EE等 Java(商標(biāo))處理環(huán)境的程序、其他程序以及數(shù)據(jù)。CD-ROM、DVD驅(qū)動(dòng)器或Blu_ray驅(qū)動(dòng)器(709)根據(jù)需要用于從CD-ROM、DVD或 Blu-ray盤(pán)向硬盤(pán)追加導(dǎo)入程序。在路徑(704)上還經(jīng)由鍵盤(pán)鼠標(biāo)控制器(710)連接有鍵盤(pán)(711)和鼠標(biāo)(712)。通信接口(714)例如按照以太網(wǎng)協(xié)議。通信接口(714)經(jīng)由通信控制器(713)連接于路徑(704),發(fā)揮物理連接計(jì)算機(jī)系統(tǒng)和通信線(715)的作用,對(duì)計(jì)算機(jī)系統(tǒng)的操作系統(tǒng)的通信功能的TCP/IP通信協(xié)議提供網(wǎng)絡(luò)接口層。通信線可以是有線LAN環(huán)境、或者例如基于IEEE802. lla/b/g/n等無(wú)線LAN連接規(guī)格的無(wú)線LAN環(huán)境。
權(quán)利要求
1.一種將在多線程上工作的程序的程序代碼變換為鎖沖突少的程序代碼的方法,上述方法包括檢索步驟,向存儲(chǔ)器內(nèi)讀出上述程序代碼,從該讀出的程序代碼檢索在同步塊內(nèi)且向?qū)υ撏綁K沒(méi)有副作用的路徑分支的第一條件句,沒(méi)有上述副作用是指基于上述同步塊內(nèi)的語(yǔ)句處理中的值無(wú)法由上述同步塊外的語(yǔ)句參照;復(fù)制步驟,向上述同步塊外復(fù)制通過(guò)上述檢索出的第一條件句分支的沒(méi)有副作用的路徑;追加步驟,與上述復(fù)制相應(yīng)地在上述程序代碼內(nèi)追加第二條件句,上述第二條件句是向上述復(fù)制的沒(méi)有副作用的路徑分支的條件句。
2.根據(jù)權(quán)利要求1所述的方法,其中,上述第一條件句包含第一條件式,該第一條件式定義為基于第一變量的讀出、常量或這些的組合選擇路徑,所述第一變量不是僅調(diào)用包含所述第一條件句的子例程的例程中為有效范圍的變量。
3.根據(jù)權(quán)利要求2所述的方法,其中,上述第二條件句包含第二條件式,該第二條件式基于用于存儲(chǔ)上述第一條件式的結(jié)果的變量,根據(jù)上述第一條件式的結(jié)果選擇路徑。
4.根據(jù)權(quán)利要求3所述的方法,其中,上述檢索步驟包含從上述讀出的程序代碼進(jìn)一步檢索更新句的步驟,上述更新句在上述同步塊內(nèi)且更新上述第一變量,上述追加步驟包括如下步驟向從緊接上述檢索出的更新句之后到上述同步塊結(jié)束句為止之間,還追加包含用于存儲(chǔ)上述第一條件式的結(jié)果的變量和向該變量代入的上述第一條件式的結(jié)果的語(yǔ)句。
5.根據(jù)權(quán)利要求3所述的方法,其中,上述檢索步驟包括如下步驟從上述讀出的程序代碼和其他程序代碼的至少一個(gè)進(jìn)一步檢索更新句,上述更新句在與上述同步塊同步的其他同步塊內(nèi)且更新上述第一變量,上述追加步驟包括如下步驟向從緊接上述檢索出的更新句之后到上述同步塊結(jié)束句為止之間,還追加包含用于存儲(chǔ)上述第一條件式的結(jié)果的變量和向該變量代入的上述第一條件式的結(jié)果的語(yǔ)句。
6.根據(jù)權(quán)利要求3所述的方法,其中,上述追加步驟包括如下步驟在用于存儲(chǔ)上述第一條件式的結(jié)果的變量首次被參照的語(yǔ)句之前,還追加初始化變量的語(yǔ)句,該變量用于使用上述第二條件句執(zhí)行包含上述同步塊的路徑的值或使用上述第一條件式的結(jié)果存儲(chǔ)上述第一條件式的結(jié)果。
7.根據(jù)權(quán)利要求2所述的方法,其中,在上述第一條件式的數(shù)量為2以上的情況下,上述2以上的第一條件式的結(jié)果通過(guò)上述2以上的第一條件式的組合求出。
8.根據(jù)權(quán)利要求3所述的方法,其中,在通過(guò)上述第一條件式選擇的路徑的數(shù)量為3條以上的情況下,用于存儲(chǔ)上述第一條件式的結(jié)果的變量與上述3條以上的路徑中沒(méi)有副作用的路徑分別對(duì)應(yīng)。
9.根據(jù)權(quán)利要求3所述的方法,其中,用于存儲(chǔ)上述第一條件式的結(jié)果的變量是保證原子性的數(shù)據(jù)型的變量。
10.根據(jù)權(quán)利要求1所述的方法,其中,上述檢索步驟包括如下步驟從上述程序代碼和其他程序代碼的至少一個(gè)進(jìn)一步檢索與上述同步塊同步的其他同步塊,隨著上述檢索的結(jié)束,執(zhí)行上述復(fù)制步驟。
11.根據(jù)權(quán)利要求2所述的方法,其中,上述檢索步驟包括如下步驟還檢索包含于上述程序代碼和其他程序代碼的至少一個(gè)且從上述同步塊外的語(yǔ)句參照上述第一變量的語(yǔ)句, 隨著上述檢索的結(jié)束,執(zhí)行上述復(fù)制步驟。
12.根據(jù)權(quán)利要求1所述的方法,其中, 在上述同步塊內(nèi)包含啟動(dòng)線程的語(yǔ)句的情況下,上述檢索步驟包括如下步驟從包含于上述程序代碼和其他程序代碼的至少一個(gè)且記載上述線程的安裝的語(yǔ)句,進(jìn)一步檢索與上述同步塊內(nèi)的語(yǔ)句同步地執(zhí)行的語(yǔ)句,還包括如下步驟根據(jù)檢索上述同步地執(zhí)行的語(yǔ)句,將包含啟動(dòng)上述線程的語(yǔ)句判定為具有副作用的路徑。
13.根據(jù)權(quán)利要求1所述的方法,其中, 在上述同步塊內(nèi)包含啟動(dòng)線程的語(yǔ)句的情況下,上述檢索步驟還包括如下步驟要求用戶判斷包含啟動(dòng)上述線程的語(yǔ)句的路徑是否為沒(méi)有副作用的路徑。
14.根據(jù)權(quán)利要求1所述的方法,其中,在用于確定執(zhí)行上述同步塊的線程的執(zhí)行順序的變量在上述同步塊內(nèi)定義的情況下, 上述檢索步驟包括如下步驟從上述同步塊外進(jìn)一步檢索包含于上述程序代碼和其他程序代碼的至少一個(gè)且參照上述使用的變量的語(yǔ)句,上述方法還包括如下步驟根據(jù)檢索參照上述使用的變量的語(yǔ)句,將包含上述使用的變量的路徑判定為具有副作用的路徑。
15.根據(jù)權(quán)利要求1所述的方法,其中,在用于確定執(zhí)行上述同步塊的線程的執(zhí)行順序的變量在上述同步塊內(nèi)定義的情況下, 上述檢索步驟還包括如下步驟要求用戶判斷包含所述使用的變量的路徑是否為沒(méi)有副作用的路徑。
16.根據(jù)權(quán)利要求3所述的方法,其中,上述追加步驟包括如下步驟向上述讀出的程序代碼還追加聲明用于存儲(chǔ)上述第一條件式的結(jié)果的變量的語(yǔ)句,在共有變量包含于上述程序代碼和上述其他程序代碼的至少一個(gè)且從上述同步塊外的語(yǔ)句被訪問(wèn)的情況下,上述聲明包含抑制與存儲(chǔ)器的訪問(wèn)順序有關(guān)的最優(yōu)化的指定和保證原子性的指定,上述共有變量包含于沒(méi)有上述副作用的路徑,且能夠從多個(gè)線程被訪問(wèn), 在不進(jìn)行上述訪問(wèn)的情況下,上述聲明包含保證原子性的指定。
17.根據(jù)權(quán)利要求1所述的方法,其中,上述檢索步驟還包括如下步驟允許用戶判斷是否具有與上述同步塊同步的其他同步塊,在上述允許步驟之后,執(zhí)行上述復(fù)制步驟。
18.根據(jù)權(quán)利要求2所述的方法,其中,上述檢索步驟還包括如下步驟允許用戶判斷是否具有參照上述第一變量的語(yǔ)句, 在上述允許步驟之后執(zhí)行上述復(fù)制步驟。
19.一種計(jì)算機(jī)系統(tǒng),將在多線程上工作的程序的程序代碼變換為鎖沖突少的程序代碼,上述計(jì)算機(jī)系統(tǒng)包括檢索部,向存儲(chǔ)器內(nèi)讀出上述程序代碼,從該讀出的程序代碼檢索在同步塊內(nèi)且向?qū)υ撏綁K沒(méi)有副作用的路徑分支的第一條件句,沒(méi)有上述副作用是指基于上述同步塊內(nèi)的語(yǔ)句處理中的值無(wú)法由上述同步塊外的語(yǔ)句參照;復(fù)制部,向上述同步塊外復(fù)制通過(guò)上述檢索出的第一條件句分支的沒(méi)有副作用的路徑;追加部,與上述復(fù)制相應(yīng)地在上述程序代碼內(nèi)追加第二條件句,上述第二條件句是向上述復(fù)制出的沒(méi)有副作用的路徑分支的條件句。
20.一種將多線程上工作的程序的程序代碼變換為鎖沖突少的程序代碼的方法,該方法包括檢索步驟,向存儲(chǔ)器內(nèi)讀出上述程序代碼,從該讀出的程序代碼檢索在同步塊內(nèi)且向?qū)υ撏綁K沒(méi)有副作用的路徑分支的第一條件句,沒(méi)有上述副作用是指基于上述同步塊內(nèi)的語(yǔ)句處理中的值無(wú)法由上述同步塊外的語(yǔ)句參照;復(fù)制步驟,向上述同步塊外復(fù)制通過(guò)上述檢索出的第一條件句分支的沒(méi)有副作用的路徑;追加步驟,與上述復(fù)制相應(yīng)地在上述程序代碼內(nèi)追加第二條件句,上述第二條件句是向上述復(fù)制的沒(méi)有副作用的路徑分支的條件句,上述第一條件句包含第一條件式,該第一條件式基于實(shí)例變量或類變量的讀出、常量或這些的組合,在向沒(méi)有副作用的路徑分支的情況下定義為其結(jié)果變?yōu)閠rue,另一方面,在向具有副作用的路徑分支的情況下定義為其結(jié)果變?yōu)閒alse,上述第二條件句包含第二條件式,該第二條件式基于用于存儲(chǔ)上述第一條件式的結(jié)果的boolean型的變量,定義為根據(jù)上述第一條件式的結(jié)果選擇路徑。
21.一種計(jì)算機(jī)程序,使計(jì)算機(jī)執(zhí)行根據(jù)權(quán)利要求1 18任一項(xiàng)所述的方法的各步驟。
全文摘要
需要自動(dòng)確定將要發(fā)生由鎖沖突引起的性能下降的問(wèn)題的位置,自動(dòng)修正該位置的方法。本發(fā)明提供將在多線程上工作的程序的程序代碼變換為鎖沖突少的程序代碼的方法。該方法包括檢索步驟,向存儲(chǔ)器內(nèi)讀出上述程序代碼,從該讀出的程序代碼檢索在同步塊內(nèi)且向?qū)υ撏綁K沒(méi)有副作用的路徑分支的第一條件句;復(fù)制步驟,向上述同步塊外復(fù)制通過(guò)上述檢索出的第一條件句分支的沒(méi)有副作用的路徑;追加步驟,與上述復(fù)制相應(yīng)地向上述程序代碼內(nèi)追加第二條件句,上述第二條件句是向上述復(fù)制的沒(méi)有副作用的路徑分支的條件句。
文檔編號(hào)G06F9/52GK102292709SQ201080005431
公開(kāi)日2011年12月21日 申請(qǐng)日期2010年4月22日 優(yōu)先權(quán)日2009年4月28日
發(fā)明者石崎一明 申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司