国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      編譯方法、編譯裝置及編譯程序的制作方法

      文檔序號:6447279閱讀:166來源:國知局
      專利名稱:編譯方法、編譯裝置及編譯程序的制作方法
      技術(shù)領(lǐng)域
      本發(fā)明涉及一種編譯方法,特別涉及將由以C++語言為代表的面向?qū)ο笳Z言描述的源程序轉(zhuǎn)換為目標程序的編譯方法。
      背景技術(shù)
      近年來,在軟件開發(fā)方面,程序規(guī)模逐漸大規(guī)?;?,與此同時,維護性、再利用性高的面向?qū)ο笳Z言(Object-oriented 1anguage)正在受到關(guān)注。有代表性的面向?qū)ο笳Z言可以列舉出C++語言。C++語言是對作為移植性優(yōu)異的高級語言的C語言進行形式擴展,以便以面向?qū)ο蟮姆绞阶匀坏剡M行描述的語言。在C++語言中,能在程序中定義函數(shù),在必要的位置調(diào)用該函數(shù),從而執(zhí)行由函數(shù)定義的處理。給函數(shù)賦予自變量時,賦予自變量的方法有“值傳遞”和“引用傳遞(指針傳遞)”。
      在現(xiàn)有的C++語言中,給函數(shù)賦予自變量時,在生成所賦予的自變量的副本之后,該副本存儲在存儲器中。值傳遞時,在傳遞的對象作為自變量全部被復制之后,副本存儲在存儲器中。例如,在對象為分類目標時,首先執(zhí)行生成該分類目標的副本的處理,然后所生成的分類目標存儲在存儲器中。另一方面,在引用傳遞時,對象是指針值(目標的地址值),因此該指針值被復制并存儲在存儲器中。
      根據(jù)Scott Meyers著、吉川邦夫譯“Effective C++修訂第2版”,ASUKI,1998年5月1日,22項“與值傳遞相比,若使用引用傳遞”(以下,稱為相關(guān)文獻。),則值傳遞中的分類目標的副本,有可能暗中引起許多復制構(gòu)造程序的調(diào)用,因此能成為編譯結(jié)果的代碼量增加的原因。另外,一般來講,與值傳遞相比,使用引用傳遞(passby reference/リフアレンス渡し)時代碼生成效率高。因此,重要的是程序員盡可能有意識地使用引用傳遞來進行編程。
      但是,相關(guān)文獻所記載的內(nèi)容,明確指出程序員應該從頭到尾有意識地使用引用傳遞來進行編程,這無非是強迫程序員進行考慮了代碼生成率的編程。
      另外,使用引用傳遞時,有可能引起別名使用問題(為了對相同的目標使用多個名字,存在無意識地改變目標的狀態(tài)的危險性的問題)。這樣,存在程序中容易混入程序錯誤(bug)的問題。

      發(fā)明內(nèi)容
      本發(fā)明是鑒于這樣的課題而做出的,目的在于提供一種編譯方法,程序員沒有必要有意識地使用引用傳遞進行編程,即使是使用值傳遞進行編程時,代碼生成率也很高。
      本發(fā)明所涉及的編譯方法,是將用高級語言描述的源程序轉(zhuǎn)換為目標代碼的編譯方法,包括以下步驟中間代碼生成步驟,由源程序生成中間代碼;優(yōu)化步驟,在沒有有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有該值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將自變量的值傳遞轉(zhuǎn)換為引用傳遞,由此優(yōu)化上述中間代碼;以及目標代碼轉(zhuǎn)換步驟,將優(yōu)化了的上述中間代碼轉(zhuǎn)換為目標代碼。
      根據(jù)該方法,即使程序員用值傳遞編寫程序,也能轉(zhuǎn)換為引用傳遞的程序。因此,程序員沒有必要有意識地使用引用傳遞進行編程。這樣,對于程序員,不用強迫進行考慮代碼生成率的編程,并且程序中也難以混入錯誤。
      優(yōu)選上述優(yōu)化步驟,在沒有有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有該值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將調(diào)用具有上述值傳遞自變量的函數(shù)的函數(shù)轉(zhuǎn)換為調(diào)用具有引用傳遞自變量的函數(shù)的函數(shù),由此優(yōu)化上述中間代碼。另外,上述優(yōu)化步驟包括值傳遞自變量更新信息抽取子步驟,從上述中間代碼中抽取值傳遞自變量更新信息,該值傳遞自變量更新信息至少包括具有值傳遞自變量的函數(shù)、直接調(diào)用具有該值傳遞自變量的函數(shù)的函數(shù)、有可能間接調(diào)用具有該值傳遞自變量的函數(shù)的函數(shù)、具有該值傳遞自變量的函數(shù)的值傳遞自變量、以及表示該值傳遞自變量在具有值傳遞自變量的函數(shù)的定義內(nèi)是否已被更新的更新判斷信息;以及轉(zhuǎn)換子步驟,根據(jù)上述值傳遞自變量更新信息,在沒有有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有該值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)轉(zhuǎn)換為調(diào)用具有引用傳遞自變量的函數(shù)的函數(shù)。
      另外,優(yōu)選在上述轉(zhuǎn)換子步驟中,在沒有強制地使調(diào)用具有上述值傳遞自變量的函數(shù)的函數(shù)轉(zhuǎn)換為調(diào)用具有引用傳遞自變量的函數(shù)的函數(shù)的指定的情況下,根據(jù)上述值傳遞自變量更新信息,在沒有有可能間接調(diào)用具有上述值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將直接調(diào)用具有上述值傳遞自變量的函數(shù)的函數(shù)轉(zhuǎn)換為直接調(diào)用具有引用傳遞自變量的函數(shù)的函數(shù)。
      根據(jù)該方法,具有值傳遞自變量的函數(shù),在定義內(nèi)未更新自變量時,能刪除作為冗余的函數(shù)調(diào)用側(cè)的副本生成代碼。因此,能生成高效的代碼。
      另外,優(yōu)選在上述轉(zhuǎn)換子步驟中,在有強制地使調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)轉(zhuǎn)換為調(diào)用具有引用傳遞自變量的函數(shù)的函數(shù)的指定的情況下,對于有該指定的具有值傳遞自變量的函數(shù),根據(jù)上述值傳遞自變量更新信息,將直接地調(diào)用具有上述值傳遞自變量的函數(shù)的函數(shù)和有可能間接調(diào)用具有上述值傳遞自變量的函數(shù)的函數(shù),分別轉(zhuǎn)換為直接調(diào)用具有引用傳遞自變量的函數(shù)的函數(shù)和有可能間接調(diào)用具有引用傳遞自變量的函數(shù)的函數(shù)。
      根據(jù)該方法,具有值傳遞自變量的函數(shù)在定義內(nèi)更新了自變量的情況下,也能刪除作為冗余的函數(shù)調(diào)用側(cè)的副本生成代碼,能生成高效的代碼。
      更優(yōu)選上述優(yōu)化步驟,在沒有有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有該值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將基于具有值傳遞自變量的函數(shù)的值傳遞而進行的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞,由此優(yōu)化上述中間代碼。并且,上述優(yōu)化步驟包括值傳遞自變量更新信息抽取子步驟,從上述中間代碼中抽取值傳遞自變量更新信息,該值傳遞自變量更新信息至少包括具有值傳遞自變量的函數(shù)、直接調(diào)用具有該值傳遞自變量的函數(shù)的函數(shù)、有可能間接調(diào)用具有該值傳遞自變量的函數(shù)的函數(shù)、具有該值傳遞自變量的函數(shù)的值傳遞自變量、以及表示該值傳遞自變量在具有值傳遞自變量的函數(shù)的定義內(nèi)是否已被更新的更新判斷信息;以及轉(zhuǎn)換子步驟,根據(jù)上述值傳遞自變量更新信息,在沒有有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有該值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將基于具有值傳遞自變量的函數(shù)的值傳遞而進行的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞。
      更優(yōu)選在上述轉(zhuǎn)換子步驟中,在沒有強制地使基于具有值傳遞自變量的函數(shù)的值傳遞而進行的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞的指定的情況下,根據(jù)上述值傳遞自變量更新信息,在沒有有可能間接調(diào)用具有上述值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將基于具有上述值傳遞自變量的函數(shù)的值傳遞而進行的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞。
      根據(jù)該方法,在具有值傳遞自變量的函數(shù)在定義內(nèi)未更新自變量的情況下,對具有值傳遞自變量的函數(shù)定義中的自變量的存取成為與具有引用傳遞自變量的函數(shù)定義同樣的存取,因此能生成高效的代碼。
      更優(yōu)選在上述轉(zhuǎn)換子步驟中,在有強制地使基于具有值傳遞自變量的函數(shù)的值傳遞而進行的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞的指定的情況下,對于有該指定的具有值傳遞自變量的函數(shù),根據(jù)上述值傳遞自變量更新信息,將基于具有上述值傳遞自變量的函數(shù)的值傳遞而進行的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞,如果上述值傳遞自變量在函數(shù)定義內(nèi)已被更新,則在上述中間代碼中在值實際被更新的部分之前,從已轉(zhuǎn)換的引用傳遞自變量中引用自變量值來生成其副本,并將該副本設定為引用目的地。
      根據(jù)該方法,在具有值傳遞自變量的函數(shù)在定義內(nèi)未更新自變量的情況下,在對具有值傳遞自變量的函數(shù)定義中的自變量的存取成為與具有引用傳遞的函數(shù)定義同樣的存取。
      另外,本發(fā)明不僅能實現(xiàn)具有這樣的特征的步驟的編譯方法,而且能實現(xiàn)以該編譯方法所包含的特征的步驟為單元的編譯裝置,還能實現(xiàn)使該編譯方法所包含的特征的步驟使計算機執(zhí)行的編譯程序。并且,不言而喻,這樣的編譯程序能通過光盤只讀存儲器(CD-ROM)等記錄介質(zhì)和應特網(wǎng)等傳輸介質(zhì)進行傳遞。
      根據(jù)本發(fā)明的編譯方法,程序員沒有必要有意識地使用引用傳遞進行編程。
      并且,即使在使用了值傳遞的情況下,也能生成代碼量小的目標代碼。
      另外,即使在用戶在高級語言程序內(nèi)使用直接描述匯編語言的語法(匯編語言語法等),用在通過將調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)轉(zhuǎn)換為調(diào)用具有引用傳遞自變量的函數(shù)的函數(shù)來優(yōu)化中間代碼的步驟,以及通過將基于具有值傳遞自變量的函數(shù)的值傳遞而進行的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞來優(yōu)化中間代碼的步驟中的任意一個步驟中所依據(jù)的匯編程序代碼描述源程序的情況下,也能得到同樣的效果。


      本發(fā)明的上述和其它目的、優(yōu)點及特征,將從根據(jù)附圖所描述的本發(fā)明的具體實施方式
      中得以明確。
      圖1是執(zhí)行本發(fā)明的實施方式所涉及的編譯程序的編譯裝置的外觀圖。
      圖2是表示圖1所示的編譯裝置的硬件結(jié)構(gòu)的框圖。
      圖3是由本發(fā)明的實施方式所涉及的編譯程序執(zhí)行的處理的流程圖。
      圖4是用于說明值傳遞自變量更新信息存儲單元中所存儲的值傳遞自變量更新信息的內(nèi)容的圖。
      圖5是詳細表示值傳遞自變量更新信息抽取處理的流程圖。
      圖6是包含有可能間接調(diào)用值傳遞函數(shù)的函數(shù)的源程序的一個例子的圖。
      圖7A~圖7C是表示對于源程序的值傳遞自變量更新信息的一個例子的圖,該源程序包含有可能間接調(diào)用值傳遞函數(shù)的函數(shù)。
      圖8是詳細表示值傳遞函數(shù)調(diào)用引用傳遞轉(zhuǎn)換處理的流程圖。
      圖9是詳細表示值傳遞函數(shù)定義引用傳遞轉(zhuǎn)換處理的流程圖。
      圖10A是表示在具體例1中所使用的程序存儲單元中存儲的頭文件的一個例子的圖。
      圖10B是表示在具體例1中所使用的程序存儲單元中存儲的源程序的一個例子的圖。
      圖11是表示在具體例1中對自變量進行值傳遞的情況下的棧構(gòu)架的一個例子的圖。
      圖12是表示用現(xiàn)有的方法對圖10A及圖10B所示的文件進行編譯的情況下的匯編程序代碼的一個例子的圖。
      圖13是表示具體例1中的值傳遞自變量更新信息的一個例子的圖。
      圖14是在具體例1及具體例2中將自變量轉(zhuǎn)換為引用傳遞后的棧構(gòu)架的一個例子的圖。
      圖15是表示在具體例1及具體例2中將自變量轉(zhuǎn)換為引用傳遞后的匯編程序代碼的一個例子的圖。
      圖16A是表示在具體例2中所使用的程序存儲單元中存儲的頭文件的一個例子的圖。
      圖16B是表示在具體例2中所使用的程序存儲單元中存儲的源程序的一個例子的圖。
      圖17是表示在具體例2中對自變量進行引用傳遞時的棧構(gòu)架的一個例子的圖。
      圖18是表示用現(xiàn)有的方法對圖16A及圖16B所示的文件進行編譯后的匯編程序代碼的一個例子的圖。
      圖19是表示具體例2中的值傳遞自變量更新信息的一個例子的圖。
      圖20A是表示在具體例3所使用的程序存儲單元中存儲的頭文件的一個例子的圖。
      圖20B是表示在具體例3所使用的程序存儲單元中存儲的源程序的一個例子的圖。
      圖21是表示用現(xiàn)有的方法對圖20A及圖20B所示的文件進行編譯后的匯編程序代碼的一個例子的圖。
      圖22是表示具體例3中的值傳遞自變量更新信息的一個例子的圖。
      圖23是表示在具體例3中,在值傳遞自變量在函數(shù)定義內(nèi)已被更新的情況下,強制轉(zhuǎn)換為引用傳遞時的棧構(gòu)架的一個例子的圖。
      圖24是表示在具體例3中,在值傳遞自變量在函數(shù)定義內(nèi)已被更新的情況下,強制轉(zhuǎn)換為引用傳遞時的匯編程序代碼的一個例子的圖。
      具體實施例方式
      以下,參照附圖對本發(fā)明的實施方式所涉及的編譯程序進行說明。
      圖1是執(zhí)行本發(fā)明的實施方式所涉及的編譯裝置的外觀圖。編譯裝置22包括計算機34、監(jiān)視器32、鍵盤36、鼠標38、以及CD-ROM裝置40。
      計算機34是執(zhí)行編譯程序等程序的處理裝置。監(jiān)視器32是用于顯示處理結(jié)果的顯示裝置。鍵盤36和鼠標38分別是連接在計算機34上,用于對計算機34輸入指示等的輸入裝置。CD-ROM裝置40是用于讀入記錄在CD-ROM42中的編譯程序等程序的裝置。
      圖2是表示編譯裝置22的硬件結(jié)構(gòu)的框圖。構(gòu)成編譯裝置22的計算機34包括CPU(中央處理器)44、ROM(只讀存儲器)46、RAM(隨機存儲器)48、硬盤50、通信調(diào)制解調(diào)器52、以及總線54。
      CPU44是執(zhí)行編譯程序等各種程序的處理單元。ROM46是存儲各種程序和各種數(shù)據(jù)的存儲單元。RAM48是暫時存儲由CPU44執(zhí)行的程序和該程序執(zhí)行時所生成的數(shù)據(jù)的存儲器。硬盤50是存儲各種程序和各種數(shù)據(jù)的存儲裝置,包括存儲頭文件和源程序的程序存儲單元56、存儲后述的值傳遞自變量更新信息的值傳遞自變量更新信息存儲單元58、以及存儲目標程序的生成代碼存儲單元60。通信調(diào)制解調(diào)器52是用于經(jīng)應特網(wǎng)等網(wǎng)絡下載程序的裝置。總線54是用于將計算機34的各處理單元連接的信號線。
      圖3是由編譯程序執(zhí)行的處理的流程圖。
      編譯程序讀入在程序存儲單元56中存儲的頭文件和源程序(S1)。編譯程序分析讀入的源程序的語法,進行符號表的生成和語法樹的生成等(S2)。接著,編譯程序根據(jù)所生成的語法樹,生成中間代碼(S3)。之后,編譯程序?qū)λ傻闹虚g代碼實施各種優(yōu)化(S4)。另外,編譯程序給優(yōu)化后的中間代碼所包含的所有變量分配寄存器和存儲器等硬件資源(S5),將分配了資源的中間代碼轉(zhuǎn)換為目標代碼,并將目標程序輸出到生成代碼存儲單元60(S6)。
      優(yōu)化處理(S4)包括值傳遞自變量更新信息抽取處理(S11)、值傳遞函數(shù)調(diào)用引用傳遞轉(zhuǎn)換處理(S12)、值傳遞函數(shù)定義引用傳遞轉(zhuǎn)換處理(S13)、以及其它的優(yōu)化處理(S14)。
      值傳遞自變量更新信息抽取處理(S11)是根據(jù)中間代碼對“具有值傳遞自變量的函數(shù)”、“直接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)”、“有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)”、“值傳遞自變量”、以及表示值傳遞自變量在函數(shù)定義內(nèi)是否已被更新的“更新判斷信息”進行抽取的處理。
      在值傳遞函數(shù)調(diào)用引用傳遞轉(zhuǎn)換處理(S12)中,根據(jù)在值傳遞自變量更新信息抽取處理(S11)中抽取出的信息,判斷是否能將基于值傳遞函數(shù)的調(diào)用轉(zhuǎn)換為基于引用傳遞函數(shù)的調(diào)用。在該處理(S12)中,根據(jù)判斷結(jié)果,將基于值傳遞函數(shù)的調(diào)用轉(zhuǎn)換為基于引用傳遞函數(shù)的調(diào)用。
      在值傳遞函數(shù)定義引用傳遞轉(zhuǎn)換處理(S13)中,根據(jù)在值傳遞自變量更新信息抽取處理(S11)中抽取出的信息,判斷是否能將基于值傳遞函數(shù)的值而進行的自變量接收傳遞轉(zhuǎn)換為基于引用的自變量接收傳遞。在該處理(S13)中,根據(jù)判斷結(jié)果,將基于值傳遞函數(shù)的值的自變量接收傳遞轉(zhuǎn)換為基于引用的自變量接收傳遞。
      對于值傳遞自變量更新信息抽取處理(S11)、值傳遞函數(shù)調(diào)用引用傳遞轉(zhuǎn)換處理(S12)、以及值傳遞函數(shù)定義引用傳遞轉(zhuǎn)換處理(S13)將在后面詳細說明。
      值傳遞函數(shù)調(diào)用引用傳遞轉(zhuǎn)換處理(S12)和值傳遞函數(shù)定義引用傳遞轉(zhuǎn)換處理(S13)不依賴于順序,哪一個先進行都可以。
      其它的優(yōu)化處理(S14)是普通的優(yōu)化處理,不是本發(fā)明的要點,因此省略其說明。
      圖4是用于說明值傳遞自變量更新信息存儲單元58中所存儲的值傳遞自變量更新信息62的內(nèi)容的圖。值傳遞自變量更新信息62中包括“具有值傳遞自變量的函數(shù)”、“直接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)”、“有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)”、“值傳遞自變量”、“更新判斷信息”、以及“引用傳遞轉(zhuǎn)換判斷信息”。它們的詳細說明將在后面的處理中進行適當說明。
      關(guān)于源程序輸入處理(S1)、語法分析處理(S2)、中間代碼生成處理(S3)、其它的優(yōu)化處理(S14)、資源分配處理(S5)、以及目標輸出處理(S6),是與現(xiàn)有的處理相同的處理,不是本發(fā)明的重點。因此省略詳細的說明。
      以下依次說明作為本發(fā)明的重點的值傳遞自變量更新信息抽取處理(S11)、值傳遞函數(shù)調(diào)用引用傳遞轉(zhuǎn)換處理(S12)、以及值傳遞函數(shù)定義引用傳遞轉(zhuǎn)換處理(S13)。
      圖5是詳細表示值傳遞自變量更新信息抽取處理(S11)的流程圖。
      編譯程序從現(xiàn)存編譯對象的中間代碼中抽取全部的函數(shù)說明、定義(S21)。此時的編譯對象可以是對單一的翻譯單位(單一的源程序)的編譯,也可以是對多個翻譯單位(多個源程序)的編譯。
      編譯程序從已抽取的函數(shù)說明、定義中抽取“具有值傳遞自變量的函數(shù)”,并記錄在值傳遞自變量更新信息62中(S22)。接著,抽取直接調(diào)用(是使用了函數(shù)名等的調(diào)用,在編譯時能唯一地確定調(diào)用哪個函數(shù))值傳遞自變量更新信息62中所記錄的各值傳遞函數(shù)的函數(shù),并記錄在值傳遞自變量更新信息62中(S23)。同樣,編譯程序抽取有可能間接調(diào)用(是使用了至函數(shù)的指針等的調(diào)用,在編譯時不能唯一地確定調(diào)用哪個函數(shù))值傳遞自變量更新信息62中所記錄的各值傳遞函數(shù)的函數(shù),并記錄在值傳遞自變量更新信息62中(S24)。
      圖6是源程序的一個例子的圖,該源程序包含有可能間接調(diào)用值傳遞函數(shù)的函數(shù)。在函數(shù)funcl的定義中,存在結(jié)構(gòu)A的具有值傳遞自變量的函數(shù)的間接調(diào)用p(x)。在該函數(shù)調(diào)用p(x)中,不能唯一地特定實際調(diào)用結(jié)構(gòu)A的具有值傳遞自變量的函數(shù)func2、func3和func4中的哪一個。因此,如圖7A~圖7B所示,在函數(shù)func2、func3和func4的各值傳遞自變量更新信息62中,funcl被記錄為有可能間接調(diào)用值傳遞函數(shù)的函數(shù)。
      接著,編譯程序?qū)σ延涗浀母髦祩鬟f函數(shù)的各值傳遞自變量連續(xù)地進行以下的處理(S25)。編譯程序判斷值傳遞自變量是否有可能在函數(shù)定義內(nèi)已被更新(S26)。如果沒有可能被更新(S26為否),則編譯程序?qū)ⅰ爸祩鬟f自變量未被更新”的更新判斷信息記錄在值傳遞自變量更新信息62中(S27)。如果有可能被更新(S26為是),則編譯程序?qū)ⅰ爸祩鬟f自變量已被更新”的更新判斷信息記錄在值傳遞自變量更新信息62中(S28)。
      通過實施以上的處理,抽取現(xiàn)存編譯對象中的值傳遞自變量更新信息62的“具有值傳遞自變量的函數(shù)”、“直接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)”、“有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)”、“值傳遞自變量”和“更新判斷信息”。
      接著,詳細地對值傳遞函數(shù)調(diào)用引用傳遞轉(zhuǎn)換處理(S12)進行說明。圖8是詳細表示值傳遞函數(shù)調(diào)用引用傳遞轉(zhuǎn)換處理(S12)的則編譯程序判斷為引用傳遞轉(zhuǎn)換不可能,并將判斷結(jié)果記錄在值傳遞自變量更新信息62的“引用傳遞轉(zhuǎn)換判斷信息”中(S38)。如果值傳遞自變量未被更新(S36為否),則編譯程序判斷為引用傳遞轉(zhuǎn)換可能,并將判斷結(jié)果記錄在值傳遞自變量更新信息62的“引用傳遞轉(zhuǎn)換判斷信息”中(S37)。
      接著,對于具有被判斷為引用傳遞轉(zhuǎn)換可能的自變量的函數(shù)的各直接調(diào)用函數(shù)執(zhí)行循環(huán)處(S39)。在循環(huán)處理(S39)中,將基于值傳遞自變量的調(diào)用轉(zhuǎn)換為基于引用傳遞的調(diào)用(S40)。
      另一方面,在進行強制的轉(zhuǎn)換時(S31為是),對于登錄的值傳遞自變量更新信息62的全部值傳遞自變量,將是引用傳遞轉(zhuǎn)換可能的信息記錄在“引用傳遞轉(zhuǎn)換判斷信息”中,并將基于值傳遞自變量的調(diào)用轉(zhuǎn)換為基于引用傳遞的調(diào)用(S41、S42、S43、S44、S45)。
      通過實施以上的處理,能將基于成為轉(zhuǎn)換候補的值傳遞自變量的調(diào)用轉(zhuǎn)換為基于引用傳遞的調(diào)用。
      接著,詳細說明值傳遞函數(shù)定義引用傳遞轉(zhuǎn)換處理(S13)。圖9是詳細表示值傳遞函數(shù)定義引用傳遞轉(zhuǎn)換處理(S13)的流程圖。在圖9所示的處理中,用于求出值傳遞自變量62的“引用傳遞轉(zhuǎn)換判斷信息”的處理(S51、S53、S52、S54、S55、S56、S57、S58、S61、S62、S63),是與圖8所示的處(S31、S33、S32、S34、S35、S36、S37、S38、S41、S42、S43)相同的處理,因此省略說明。它們是將值傳遞是否有可能轉(zhuǎn)換成引用傳遞記錄在值傳遞自變量更新信息62中的處理。它們是相同的處理的原因是在編譯程序的優(yōu)化處理(S4)中,先進行值傳遞函數(shù)調(diào)用引用傳遞轉(zhuǎn)換處理(S12)和值傳遞函數(shù)定義引用傳遞轉(zhuǎn)換處理(S13)中的哪一個都沒有關(guān)系。因此,在某一個已被實施,值傳遞自變量更新信息62的“值傳遞轉(zhuǎn)換判斷信息”已被記錄的情況下,省略判斷是否有可能轉(zhuǎn)換為它們的引用傳遞并進行記錄的處理也沒有關(guān)系。流程圖。
      首先,編譯程序進行是否將值傳遞的函數(shù)強制轉(zhuǎn)換為引用傳遞的函數(shù)的判斷(S31)。在此,是否強制轉(zhuǎn)換,是根據(jù)命令行選項和編譯指示等用戶的指示、在編譯程序內(nèi)部另外進行的優(yōu)化評價結(jié)果(模擬了目標程序后的概要信息等)進行判斷的。在想要減少代碼量時,強制轉(zhuǎn)換成引用傳遞。
      在不進行強制的轉(zhuǎn)換時(S31為否),對于已登錄的各值傳遞自變量更新信息62,編譯程序反復進行以下的循環(huán)處理(S32)。編譯程序調(diào)查正著眼處理的值傳遞自變量更新信息62中所包含的“直接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)”和“有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)”是否已由asm文等匯編程序描述轉(zhuǎn)換為基于引用傳遞的調(diào)用(S33)。在已轉(zhuǎn)換為基于引用傳遞的調(diào)用的情況下(S33為是),編譯程序著眼處理下一個值傳遞自變量更新信息62,并反復進行循環(huán)處理(S32)。
      如果未由匯編程序描述轉(zhuǎn)換為基于引用傳遞的調(diào)用(S33為否),則編譯程序判斷是否有可能間接調(diào)用正著眼處理的“具有值傳遞自變量的函數(shù)”(S34)。即,編譯程序檢查函數(shù)名是否已記入值傳遞自變量更新信息62的“有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)”的欄中(S34)。
      在存在“有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)”的情況下(S34為是),正著眼處理的“具有值傳遞自變量的函數(shù)”將不成為引用傳遞轉(zhuǎn)換的對象。因此,編譯程序?qū)⒁韵乱粋€值傳遞自變量更新信息62為新的處理對象。
      在不存在“有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)”的情況下(S34為否),編譯程序?qū)Ω鳌爸祩鬟f自變量”執(zhí)行循環(huán)處理(S35)。在循環(huán)處理(S35)中,編譯程序進行值傳遞自變量是否已被更新的判斷處理(S36)。如果值傳遞自變量已被更新(S36為是),
      在不強制轉(zhuǎn)換為引用傳遞的情況下(S51為否),在將值傳遞是否有可能轉(zhuǎn)換為引用傳遞的判斷結(jié)果記錄在值傳遞自變量更新信息62的“值傳遞轉(zhuǎn)換判斷信息”中后,對于具有判斷為引用傳遞轉(zhuǎn)換可能的自變量的函數(shù),進行循環(huán)處理(S59)。在循環(huán)處理(S59)中,將基于值傳遞自變量的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞(S60)。
      另一方面,在進行強制的轉(zhuǎn)換的情況下(S51為是),在將值傳遞是否有可能轉(zhuǎn)換為引用傳遞的判斷結(jié)果記錄在值傳遞自變量更新信息62的“值傳遞轉(zhuǎn)換判斷信息”中后,對于具有判斷為引用傳遞轉(zhuǎn)換可能的自變量的函數(shù),進行循環(huán)處理(S64)。在循環(huán)處理(S64)中,將基于值傳遞自變量的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞(S65)。接著,對轉(zhuǎn)換后的引用傳遞自變量進行循環(huán)處理(S66)。在循環(huán)處理(S66)中,由“更新判斷信息”調(diào)查值傳遞自變量在函數(shù)定義內(nèi)是否已被更新的判斷結(jié)果(S67)。如果值傳遞自變量已被更新(S67為是),則在中間代碼中,實際上在值被更新的部分之前,從轉(zhuǎn)換了的引用傳遞自變量中引用自變量值,并生成其副本,進而再將該副本再設定為引用目的地(S68)。由于本來是基于值傳遞的自變量接收傳遞,因此不允許在調(diào)用源中反映出對函數(shù)調(diào)用目的地的自變量的更新,但是,轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞的結(jié)果是為了防止更新結(jié)果反映在調(diào)用源中而進行上述處理。即,在對自變量進行更新的情況下,變成為使在現(xiàn)有函數(shù)調(diào)用源中生成的自變量副本生成在函數(shù)調(diào)用目的地中。
      這樣,如果在調(diào)用一側(cè)建立臨時變量,則每次調(diào)用都必須建立臨時變量,如果在被調(diào)用一側(cè)建立臨時變量,則建立臨時變量的代碼可以集中在一個位置。這樣,能減少代碼量。
      通過實施以上的處理,能將基于成為轉(zhuǎn)換候補的值傳遞自變量的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞。
      對于實施了優(yōu)化處理(S4)的中間代碼,通過進行資源分配處理(S5)和目標程序輸出處理(S6),能削減最終生成的目標程序的目標代碼的量,其中,上述優(yōu)化處理(S4)包括以上那樣的值傳遞更新信息抽取處理(S11)、值傳遞函數(shù)調(diào)用引用傳遞轉(zhuǎn)換處理(S12)和值傳遞函數(shù)定義引用傳遞轉(zhuǎn)換處理(S13)、以及其它的優(yōu)化處理(S14)。
      以下,參照具體例來更詳細地對將值傳遞自變量的函數(shù)轉(zhuǎn)換為引用傳遞自變量的函數(shù)的優(yōu)化處理。
      (具體例1)圖10A是表示存儲在程序存儲單元56中的頭文件的一個例子的圖,圖10B是表示存儲在程序存儲單元56中的源程序的一個例子的圖。以下,對輸入了該頭文件和源程序的情況下的編譯程序的動作進行說明。
      在圖10A所示的頭文件“struct.h”中描述了結(jié)構(gòu)A的定義。在圖10B所示的源文件“progl.cc”中描述了頭文件“struct.h”的讀入處理、值傳遞自變量函數(shù)“void f(A obj)”的定義、調(diào)用函數(shù)f的函數(shù)“void g(void)”、以及函數(shù)“void h(void)”的定義。
      首先,表示基于現(xiàn)有的方法的具體例。函數(shù)f是“具有值傳遞自變量的函數(shù)”,因此在由函數(shù)g和函數(shù)h調(diào)用函數(shù)f時,自變量的接收傳遞成為基于值傳遞的方法。
      圖11表示由函數(shù)g調(diào)用函數(shù)f時的棧構(gòu)架的一個例子。在圖10B所示的函數(shù)g的定義中,以局部自變量x為值傳遞自變量來調(diào)用函數(shù)f。此時的棧構(gòu)架如圖11所示,從確保了局部變量的區(qū)域(函數(shù)g執(zhí)行時的SP(堆棧指針的值)+16~SP+24)中將自變量值的副本存儲在確保實自變量的區(qū)域(函數(shù)g執(zhí)行時的SP+4~SP+12)。如果執(zhí)行轉(zhuǎn)移到函數(shù)f,則對自變量的存取通過對確保偽自變量的區(qū)域(函數(shù)f執(zhí)行時的SP+16~SP+24)進行存取來實現(xiàn)。
      圖12示出了用現(xiàn)有的方法實施的情況下的、表示函數(shù)f和函數(shù)g的定義的匯編程序代碼。如函數(shù)f的定義所示,偽自變量obj.x、obj.y、obj.z的值分別從棧構(gòu)架的SP+16、SP+20、SP+24開始進行讀入。另外,如函數(shù)g的定義所示,在進行函數(shù)f的調(diào)用之前,從局部變量區(qū)域(SP+16~SP+24)向?qū)嵶宰兞繀^(qū)域(SP+4~SP+12)實施值的復制。
      接著,示出本實施方式的實施例。首先,實施值傳遞自變量更新信息抽取處理(S11)時,抽取圖13(a)所示的值傳遞自變量更新信息62。即,作為“具有值傳遞自變量的函數(shù)”抽取void f(A obj)的信息,作為“直接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)”抽取voidg(void)、void h(void)的信息,抽取“有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)”不存在的信息,在函數(shù)f中成為值傳遞對象的“值傳遞自變量”抽取第1自變量A obj的信息,在函數(shù)定義內(nèi)自變量的更新抽取未進行的信息。
      接著,實施值傳遞函數(shù)調(diào)用引用傳遞轉(zhuǎn)換處理(S12),函數(shù)f的值傳遞自變量“A obj”在函數(shù)定義內(nèi)進行了引用,但是未進行更新,因此與是否進行強制的引用傳遞的判斷處理(S31)的結(jié)果無關(guān),如圖13(b)所示,第1自變量的“引用傳遞轉(zhuǎn)換判斷信息”被記錄為“可能”。這樣,值傳遞函數(shù)調(diào)用被轉(zhuǎn)換為引用傳遞函數(shù)調(diào)用。
      與實施值傳遞函數(shù)定義引用傳遞轉(zhuǎn)換處理(S13)的情況相同,與是否進行強制的引用傳遞的判斷處理(S51)的結(jié)果無關(guān),結(jié)果記錄為引用傳遞轉(zhuǎn)換可能,因此基于函數(shù)f的自變量接收傳遞被轉(zhuǎn)換為基于引用傳遞的函數(shù)接收傳遞。
      圖14示出了將值傳遞自變量轉(zhuǎn)換為引用傳遞自變量后的棧構(gòu)架的一個例子的圖。對于實自變量區(qū)域(函數(shù)g執(zhí)行時的SP+4),不是轉(zhuǎn)換為自變量值,而是轉(zhuǎn)換為對自變量的引用(即,地址)。因此削減了堆棧的使用區(qū)域。
      圖15示出了將值傳遞自變量轉(zhuǎn)換為引用傳遞自變量后的表示函數(shù)f、函數(shù)g的定義的匯編程序代碼。如函數(shù)f的定義所示,偽自變量不是自變量值本身,而被視為傳遞了對自變量值的引用(即,地址),因此對偽自變量的存取經(jīng)由存儲在偽自變量區(qū)域(函數(shù)f執(zhí)行時的SP+16)中的自變量地址來進行。另外,如函數(shù)g的定義所示,在實自變量區(qū)域(函數(shù)g執(zhí)行時的SP+4)中設定了局部變量目標的起始地址(函數(shù)g執(zhí)行時的SP+8的地址值)。這樣轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞方法,因此沒有必要如示出了現(xiàn)有方法中的具體例的圖12那樣,進行自變量值的復制。這樣,能削減代碼量。
      (具體例2)圖16A表示存儲在程序存儲單元56中的頭文件的一個例子,圖16B表示存儲在程序存儲單元56中的源程序的一個例子。以下,說明輸入了該頭文件和源程序的情況下的編譯程序的動作。
      在圖16A所示的頭文件“class.h”中描述了class A的定義。在class A中定義了數(shù)字變量x、y和z,缺省構(gòu)造程序A(void),復制構(gòu)造程序A(A &amp;obj)、以及數(shù)字函數(shù)get_x、get_y、get_z、set_x、set_y和set_z。圖16B所示的源程序“progr2.cc”中描述了頭文件“class.h”的讀入處理、值傳遞自變量函數(shù)“void f(Aobj)”的定義、調(diào)用函數(shù)f的函數(shù)“void g(void)”和函數(shù)“voidh(void)”的定義。
      首先示出現(xiàn)有方法的具體例。與具體例1一樣,函數(shù)f是“具有引用傳遞自變量的函數(shù)”,因此由函數(shù)g和函數(shù)h調(diào)用函數(shù)f時,自變量的接收傳遞成為基于值傳遞的方法。圖17中表示由函數(shù)g調(diào)用函數(shù)f時的棧構(gòu)架例。在圖10B的函數(shù)g的定義中,將局部自變量x作為值傳遞自變量來調(diào)用函數(shù)f。局部自變量x在class A中被定義為復制構(gòu)造程序(class.h的A (A &amp;obj)),因此在基于值傳遞的自變量接收傳遞時,隱含進行基于復制構(gòu)造程序調(diào)用的臨時變量(temp.x、temp.y和temp.z)的生成。此時的棧構(gòu)架如圖17所示。即,從確保了局部變量的區(qū)域(函數(shù)g執(zhí)行時的SP+28~SP+36)中由復制構(gòu)造程序調(diào)用生成的值,存儲在存儲臨時變量的區(qū)域(函數(shù)g執(zhí)行時的SP+16~SP+24)中。之后,臨時變量(自變量值)的副本被存儲在確保實自變量的區(qū)域(函數(shù)g執(zhí)行時的SP+4~SP+12)中。如果執(zhí)行轉(zhuǎn)移到函數(shù)f,則對自變量的存取能通過對確保偽自變量的區(qū)域的存取來實現(xiàn)。
      圖18表示用現(xiàn)有的方法實施的情況下的、表示函數(shù)f、函數(shù)g的匯編程序代碼。如函數(shù)f的定義所示,偽自變量obj.x、obj.y、obj.z分別從棧構(gòu)架的SP+16、SP+20、SP+24開始進行讀入。另外,如函數(shù)g的定義所示,在函數(shù)f的調(diào)用之前,進行復制構(gòu)造程序調(diào)用,將由復制構(gòu)造程序調(diào)用而生成的值存儲在臨時變量區(qū)域之后,從臨時變量區(qū)域(SP+16~SP+24)向?qū)嵶宰兞繀^(qū)域(SP+4~SP+12)實施值的復制。
      接著,表示本實施方式的具體例。首先,實施值傳遞自變量更新信息抽取處理(S11)時,抽取圖19(a)所示的值傳遞自變量更新信息62。即,作為“具有值傳遞自變量的函數(shù)”抽取void f(Aobj)的信息,作為“直接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)”抽取void g(void)、void h(void)的信息,“有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)”抽取不存在的信息,在函數(shù)f中成為值傳遞對象的“值傳遞自變量”抽取第1自變量A obj的信息,在函數(shù)定義內(nèi)自變量的更新抽取未進行的信息。
      接著,實施值傳遞函數(shù)調(diào)用引用傳遞轉(zhuǎn)換處理(S12),函數(shù)f的值傳遞自變量“A obj”在函數(shù)定義內(nèi)被引用,但是未進行更新,因此與是否進行強制的引用傳遞的判斷處理(S31)的結(jié)果無關(guān),如圖19(b)所示,第1自變量的“引用傳遞轉(zhuǎn)換判斷信息”被記錄為“可能”。這樣,值傳遞函數(shù)調(diào)用被轉(zhuǎn)換為引用傳遞函數(shù)調(diào)用。
      與實施值傳遞函數(shù)定義引用傳遞轉(zhuǎn)換處理(S13)的情況一樣,與是否進行強制的引用傳遞的判斷處理(S51)的結(jié)果無關(guān),結(jié)果記錄為引用傳遞可能,因此基于函數(shù)f的值傳遞的自變量接收傳遞被轉(zhuǎn)換為基于引用傳遞的函數(shù)傳遞。
      由于已將基于值傳遞的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的接收傳遞,因此棧構(gòu)架與具體例1相同,如圖14所示。
      圖16A和圖16B的程序例所示的class A與圖10A所示的結(jié)構(gòu)A和數(shù)據(jù)結(jié)構(gòu)相等。另外,圖19(b)的值傳遞自變量更新信息62也與圖13(b)相等,因此表示函數(shù)f、函數(shù)g的定義的匯編程序代碼與具體例1相同,如圖15所示。這樣轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞方法,因此沒有必要如圖18所示的現(xiàn)有的方法中的匯編程序代碼那樣,進行基于復制構(gòu)造程序的自變量值的副本生成和復制值向?qū)嵶宰兞繀^(qū)域的存儲處理。因此能削減代碼量。
      (具體例3)圖20A表示存儲在程序存儲單元56中的頭文件的一個例子,圖20B表示存儲在程序存儲單元56中的源程序的一個例子。以下,說明輸入了該頭文件和源程序的情況下的編譯程序的動作。
      圖20A所示的頭文件“struct.h”與圖10A所示的頭文件“struct.h”相同。另外,圖20B所示的源程序“prog3.cc”與圖10B所示的源程序“progl.cc”大致相同,但是在函數(shù)f的定義中,在更新自變量obj(“obj.x=b;”“obj.y=c;”“obj.z=a;”)方面不同。此時的棧構(gòu)架例與圖11相同。圖21表示用現(xiàn)有的方法實施的情況下的、表示函數(shù)f、函數(shù)g的定義匯編程序代碼。與圖12大致相同,但是在函數(shù)f的定義中,追加了更新自變量obj的處理。
      接著,表示本實施方式的具體例。首先,實施值傳遞自變量更新信息抽取處理(S11)時,抽取圖22(a)所示的值傳遞自變量更新信息62。即,作為“具有值傳遞自變量的函數(shù)”抽取void f(Aobj)的信息,作為“直接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)”抽取void g(void)、void h(void)的信息,“有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)”抽取不存在的信息,在函數(shù)f中成為值傳遞對象的“值傳遞自變量”抽取第1自變量A obj的信息,在函數(shù)定義內(nèi)自變量的更新抽取已進行的信息。
      接著,實施值傳遞函數(shù)調(diào)用引用傳遞轉(zhuǎn)換處理(S12)時,函數(shù)f的值傳遞自變量“A obj”在函數(shù)定義內(nèi)進行了更新,因此在強制的引用傳遞的判斷(S31)中未進行強制轉(zhuǎn)換的情況下,如圖22(b)所示,第1自變量的“引用傳遞轉(zhuǎn)換判斷信息”被記錄為“不可能”,不進行轉(zhuǎn)換。另一方面,在進行強制轉(zhuǎn)換的情況下,如圖22(c)所示,第1自變量的“引用傳遞轉(zhuǎn)換判斷信息”被記錄為“可能”,值傳遞函數(shù)調(diào)用被轉(zhuǎn)換為引用傳遞函數(shù)調(diào)用。
      與實施值傳遞函數(shù)定義引用傳遞轉(zhuǎn)換處理(S13)的情況一樣,在不進行強制的引用傳遞的情況下(S51為否),“引用傳遞轉(zhuǎn)換判斷信息”被記錄為“不可能”,不進行轉(zhuǎn)換。另一方面,在進行強制轉(zhuǎn)換的情況下(S51為是),向引用傳遞的轉(zhuǎn)換被記錄為“可能”,基于函數(shù)f的自變量接收傳遞被轉(zhuǎn)換為基于引用傳遞的函數(shù)接收傳遞。另外,由于存在值傳遞的更新,因此圖9的S68的處理被實施,在更新處理前,由轉(zhuǎn)換了的引用傳遞自變量引用自變量值生成副本,該副本被設定為引用目的地。
      圖23表示在值傳遞自變量在函數(shù)定義內(nèi)已被更新的情況下,強制轉(zhuǎn)換為引用傳遞時的棧構(gòu)架例。在現(xiàn)有的方法的具體例中,在函數(shù)調(diào)用源中生成自變量值的副本,因此如圖17所示,在函數(shù)調(diào)用源(即函數(shù)g的存取區(qū)域)中確保了副本,與此相對,在本發(fā)明中,在函數(shù)調(diào)用目的地中生成自變量值的副本,因此如圖23所示,在函數(shù)調(diào)用目的地(即,函數(shù)f的存取區(qū)域)確保了副本。
      圖24表示在值傳遞自變量已被強制轉(zhuǎn)換為引用傳遞自變量的情況下的、表示函數(shù)f、函數(shù)g的定義的匯編程序代碼。在作為基于現(xiàn)有方法的具體例的圖12中,在函數(shù)g的定義中和函數(shù)h的定義中,都生成自變量值的副本,并進行了自變量接收傳遞,與此相對,在本發(fā)明中,如圖24所示,在函數(shù)g和函數(shù)h中實施對自變量值的由使用了地址的引用進行的自變量接收傳遞,在函數(shù)f的定義中生成自變量值的副本并設定為自變量值,這樣,通過將自變量值的副本從調(diào)用源的函數(shù)移動至調(diào)用目的地的函數(shù),雖然在值傳遞的函數(shù)調(diào)用產(chǎn)生時,必須生成自變量值的副本,但是能集中為值傳遞函數(shù)調(diào)用目的地的一次的副本生成。因此,能削減代碼量。函數(shù)調(diào)用次數(shù)越多該效果越高。
      如以上說明那樣,根據(jù)本實施方式,將值傳遞自變量的函數(shù)和調(diào)用該函數(shù)的函數(shù)轉(zhuǎn)換為引用傳遞自變量的函數(shù)和調(diào)用該函數(shù)的函數(shù)。因此,沒有必要將自變量復制到棧構(gòu)架中,能減小目標程序的代碼量。
      以上說明了本發(fā)明的實施方式所涉及的編譯程序,但是本發(fā)明并不限于該實施方式。
      例如,在上述的實施方式中,列舉了使用棧構(gòu)架的自變量傳遞的具體例,但是根據(jù)編譯環(huán)境,也可以使用使用了寄存器等的自變量傳遞。
      工業(yè)上的可利用性本發(fā)明的編譯方法可以應用于便攜式電話和PDA(personalDigital Assistant)等需要代碼量小的目標代碼的嵌入式設備用的編譯方法等。
      權(quán)利要求
      1.一種編譯方法,將用高級語言描述的源程序轉(zhuǎn)換為目標代碼,其特征在于,包括以下步驟中間代碼生成步驟,由源程序生成中間代碼;優(yōu)化步驟,在沒有有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有該值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將自變量的值傳遞轉(zhuǎn)換為引用傳遞,由此優(yōu)化上述中間代碼;以及目標代碼轉(zhuǎn)換步驟,將優(yōu)化了的上述中間代碼轉(zhuǎn)換為目標代碼。
      2.如權(quán)利要求1所述的編譯方法,其特征在于上述優(yōu)化步驟,在沒有有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有該值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將調(diào)用具有上述值傳遞自變量的函數(shù)的函數(shù)轉(zhuǎn)換為調(diào)用具有引用傳遞自變量的函數(shù)的函數(shù),由此優(yōu)化上述中間代碼。
      3.如權(quán)利要求2所述的編譯方法,其特征在于還包括通過將基于具有值傳遞自變量的函數(shù)的值傳遞而進行的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞,由此優(yōu)化上述中間代碼的步驟。
      4.如權(quán)利要求2所述的編譯方法,其特征在于,上述優(yōu)化步驟包括值傳遞自變量更新信息抽取子步驟,從上述中間代碼中抽取值傳遞自變量更新信息,該值傳遞自變量更新信息至少包括具有值傳遞自變量的函數(shù)、直接調(diào)用具有該值傳遞自變量的函數(shù)的函數(shù)、有可能間接調(diào)用具有該值傳遞自變量的函數(shù)的函數(shù)、具有該值傳遞自變量的函數(shù)的值傳遞自變量、以及表示該值傳遞自變量在具有值傳遞自變量的函數(shù)的定義內(nèi)是否已被更新的更新判斷信息;以及轉(zhuǎn)換子步驟,根據(jù)上述值傳遞自變量更新信息,在沒有有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有該值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)轉(zhuǎn)換為調(diào)用具有引用傳遞自變量的函數(shù)的函數(shù)。
      5.如權(quán)利要求4所述的編譯方法,其特征在于在上述轉(zhuǎn)換子步驟中,在沒有強制地使調(diào)用具有上述值傳遞自變量的函數(shù)的函數(shù)轉(zhuǎn)換為調(diào)用具有引用傳遞自變量的函數(shù)的函數(shù)的指定的情況下,根據(jù)上述值傳遞自變量更新信息,在沒有有可能間接調(diào)用具有上述值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將直接調(diào)用具有上述值傳遞自變量的函數(shù)的函數(shù)轉(zhuǎn)換為直接調(diào)用具有引用傳遞自變量的函數(shù)的函數(shù)。
      6.如權(quán)利要求4所述的編譯方法,其特征在于在上述轉(zhuǎn)換子步驟中,在有強制地使調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)轉(zhuǎn)換為調(diào)用具有引用傳遞自變量的函數(shù)的函數(shù)的指定的情況下,對于有該指定的具有值傳遞自變量的函數(shù),根據(jù)上述值傳遞自變量更新信息,將直接地調(diào)用具有上述值傳遞自變量的函數(shù)的函數(shù)和有可能間接調(diào)用具有上述值傳遞自變量的函數(shù)的函數(shù),分別轉(zhuǎn)換為直接調(diào)用具有引用傳遞自變量的函數(shù)的函數(shù)和有可能間接調(diào)用具有引用傳遞自變量的函數(shù)的函數(shù)。
      7.如權(quán)利要求1所述的編譯方法,其特征在于上述優(yōu)化步驟,在沒有有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將基于具有值傳遞自變量的函數(shù)的值傳遞而進行的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞,由此優(yōu)化上述中間代碼。
      8.如權(quán)利要求7所述的編譯方法,其特征在于,上述優(yōu)化步驟包括值傳遞自變量更新信息抽取子步驟,從上述中間代碼中抽取值傳遞自變量更新信息,該值傳遞自變量更新信息至少包括具有值傳遞自變量的函數(shù)、直接調(diào)用具有該值傳遞自變量的函數(shù)的函數(shù)、有可能間接調(diào)用具有該值傳遞自變量的函數(shù)的函數(shù)、具有該值傳遞自變量的函數(shù)的值傳遞自變量、以及表示該值傳遞自變量在具有值傳遞自變量的函數(shù)的定義內(nèi)是否已被更新的更新判斷信息;以及轉(zhuǎn)換子步驟,根據(jù)上述值傳遞自變量更新信息,在沒有有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有該值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將基于具有值傳遞自變量的函數(shù)的值傳遞而進行的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞。
      9.如權(quán)利要求8所述的編譯方法,其特征在于在上述轉(zhuǎn)換子步驟中,在沒有強制地使基于具有值傳遞自變量的函數(shù)的值傳遞而進行的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞的指定的情況下,根據(jù)上述值傳遞自變量更新信息,在沒有有可能間接調(diào)用具有上述值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將基于具有上述值傳遞自變量的函數(shù)的值傳遞而進行的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞。
      10.如權(quán)利要求8所述的編譯方法,其特征在于在上述轉(zhuǎn)換子步驟中,在有強制地使基于具有值傳遞自變量的函數(shù)的值傳遞而進行的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞的指定的情況下,對于有該指定的具有值傳遞自變量的函數(shù),根據(jù)上述值傳遞自變量更新信息,將基于具有上述值傳遞自變量的函數(shù)的值傳遞而進行的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞,如果上述值傳遞自變量在函數(shù)定義內(nèi)已被更新,則在上述中間代碼中在值實際被更新的部分之前,從已轉(zhuǎn)換的引用傳遞自變量中引用自變量值來生成其副本(copy),并將該副本設定為引用目的地。
      11.一種編譯程序,其特征在于,用于使計算機執(zhí)行以下步驟中間代碼生成步驟,由用高級語言描述的源程序生成中間代碼;優(yōu)化步驟,在沒有有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有該值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將自變量的值傳遞轉(zhuǎn)換為引用傳遞,由此優(yōu)化上述中間代碼;以及目標代碼轉(zhuǎn)換步驟,將優(yōu)化了的上述中間代碼轉(zhuǎn)換為目標代碼。
      12.一種記錄介質(zhì),可由計算機讀取,其特征在于,記錄了用于使計算機執(zhí)行以下步驟的編譯程序中間代碼生成步驟,由用高級語言描述的源程序生成中間代碼;優(yōu)化步驟,在沒有有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有該值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將自變量的值傳遞轉(zhuǎn)換為引用傳遞,由此優(yōu)化上述中間代碼;以及目標代碼轉(zhuǎn)換步驟,將優(yōu)化了的上述中間代碼轉(zhuǎn)換為目標代碼。
      13.一種編譯裝置,將用高級語言描述的源程序轉(zhuǎn)換為目標代碼,其特征在于,包括中間代碼生成單元,由源程序生成中間代碼;優(yōu)化單元,在沒有有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有該值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將自變量的值傳遞轉(zhuǎn)換為引用傳遞,由此優(yōu)化上述中間代碼;以及目標代碼轉(zhuǎn)換單元,將優(yōu)化了的上述中間代碼轉(zhuǎn)換為目標代碼。
      14.如權(quán)利要求13所述的編譯裝置,其特征在于上述優(yōu)化單元,在沒有有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有該值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將調(diào)用具有上述值傳遞自變量的函數(shù)的函數(shù)轉(zhuǎn)換為調(diào)用具有引用傳遞自變量的函數(shù)的函數(shù),由此優(yōu)化上述中間代碼。
      15.如權(quán)利要求14所述的編譯裝置,其特征在于還包括通過將基于具有值傳遞自變量的函數(shù)的值傳遞而進行的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞,由此優(yōu)化上述中間代碼的單元。
      16.如權(quán)利要求14所述的編譯裝置,其特征在于,上述優(yōu)化單元包括值傳遞自變量更新信息抽取單元,從上述中間代碼中抽取值傳遞自變量更新信息,該值傳遞自變量更新信息至少包括具有值傳遞自變量的函數(shù)、直接調(diào)用具有該值傳遞自變量的函數(shù)的函數(shù)、有可能間接調(diào)用具有該值傳遞自變量的函數(shù)的函數(shù)、具有該值傳遞自變量的函數(shù)的值傳遞自變量、以及表示該值傳遞自變量在具有值傳遞自變量的函數(shù)的定義內(nèi)是否已被更新的更新判斷信息;以及轉(zhuǎn)換單元,根據(jù)上述值傳遞自變量更新信息,在沒有有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有該值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)轉(zhuǎn)換為調(diào)用具有引用傳遞自變量的函數(shù)的函數(shù)。
      17.如權(quán)利要求16所述的編譯裝置,其特征在于上述轉(zhuǎn)換單元,在沒有強制地使調(diào)用具有上述值傳遞自變量的函數(shù)的函數(shù)轉(zhuǎn)換為調(diào)用具有引用傳遞自變量的函數(shù)的函數(shù)的指定的情況下,根據(jù)上述值傳遞自變量更新信息,在沒有有可能間接調(diào)用具有上述值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將直接調(diào)用具有上述值傳遞自變量的函數(shù)的函數(shù)轉(zhuǎn)換為直接調(diào)用具有引用傳遞自變量的函數(shù)的函數(shù)。
      18.如權(quán)利要求16所述的編譯裝置,其特征在于上述轉(zhuǎn)換單元,在有強制地使調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)轉(zhuǎn)換為調(diào)用具有引用傳遞自變量的函數(shù)的函數(shù)的指定的情況下,對于有該指定的具有值傳遞自變量的函數(shù),根據(jù)上述值傳遞自變量更新信息,將直接地調(diào)用具有上述值傳遞自變量的函數(shù)的函數(shù)和有可能間接調(diào)用具有上述值傳遞自變量的函數(shù)的函數(shù),分別轉(zhuǎn)換為直接調(diào)用具有引用傳遞自變量的函數(shù)的函數(shù)和有可能間接調(diào)用具有引用傳遞自變量的函數(shù)的函數(shù)。
      19.如權(quán)利要求13所述的編譯裝置,其特征在于上述優(yōu)化單元,在沒有有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將基于具有值傳遞自變量的函數(shù)的值傳遞而進行的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞,由此優(yōu)化上述中間代碼。
      20.如權(quán)利要求19所述的編譯裝置,其特征在于,上述優(yōu)化單元包括值傳遞自變量更新信息抽取單元,從上述中間代碼中抽取值傳遞自變量更新信息,該值傳遞自變量更新信息至少包括具有值傳遞自變量的函數(shù)、直接調(diào)用具有該值傳遞自變量的函數(shù)的函數(shù)、有可能間接調(diào)用具有該值傳遞自變量的函數(shù)的函數(shù)、具有該值傳遞自變量的函數(shù)的值傳遞自變量、以及表示該值傳遞自變量在具有值傳遞自變量的函數(shù)的定義內(nèi)是否已被更新的更新判斷信息;以及轉(zhuǎn)換單元,根據(jù)上述值傳遞自變量更新信息,在沒有有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有該值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將基于具有值傳遞自變量的函數(shù)的值傳遞而進行的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞。
      21.如權(quán)利要求20所述的編譯裝置,其特征在于上述轉(zhuǎn)換單元,在沒有強制地使基于具有值傳遞自變量的函數(shù)的值傳遞而進行的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞的指定的情況下,根據(jù)上述值傳遞自變量更新信息,在沒有有可能間接調(diào)用具有上述值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將基于具有上述值傳遞自變量的函數(shù)的值傳遞而進行的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞。
      22.如權(quán)利要求20所述的編譯裝置,其特征在于上述轉(zhuǎn)換單元,在有強制地使基于具有值傳遞自變量的函數(shù)的值傳遞而進行的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞的指定的情況下,對于有該指定的具有值傳遞自變量的函數(shù),根據(jù)上述值傳遞自變量更新信息,將基于具有上述值傳遞自變量的函數(shù)的值傳遞而進行的自變量接收傳遞轉(zhuǎn)換為基于引用傳遞的自變量接收傳遞,如果上述值傳遞自變量在函數(shù)定義內(nèi)已被更新,則在上述中間代碼中在值實際被更新的部分之前,從已轉(zhuǎn)換的引用傳遞自變量中引用自變量值來生成其副本,并將該副本設定為引用目的地。
      全文摘要
      本發(fā)明提供一種編譯方法、編譯裝置及編譯程序。該編譯方法是一種程序員沒有必要有意識地使用引用傳遞來進行編程,即使在使用了值傳遞的情況下代碼生成效率也很高的編譯方法,包括中間代碼生成步驟,由源程序生成中間代碼;優(yōu)化步驟,在沒有可能間接調(diào)用具有值傳遞自變量的函數(shù)的函數(shù)、并且上述值傳遞自變量在具有該值傳遞自變量的函數(shù)的定義內(nèi)未被更新的情況下,將調(diào)用具有上述值傳遞自變量的函數(shù)的函數(shù)轉(zhuǎn)換為調(diào)用具有引用傳遞自變量的函數(shù)的函數(shù),由此優(yōu)化上述中間代碼;以及目標代碼轉(zhuǎn)換步驟,將優(yōu)化了的上述中間代碼轉(zhuǎn)換為目標代碼。
      文檔編號G06F9/45GK1637708SQ200410103729
      公開日2005年7月13日 申請日期2004年12月22日 優(yōu)先權(quán)日2003年12月22日
      發(fā)明者淺尾忍 申請人:松下電器產(chǎn)業(yè)株式會社
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1