TWI463404B - 編譯系統以及編譯方法 - Google Patents
編譯系統以及編譯方法 Download PDFInfo
- Publication number
- TWI463404B TWI463404B TW101128640A TW101128640A TWI463404B TW I463404 B TWI463404 B TW I463404B TW 101128640 A TW101128640 A TW 101128640A TW 101128640 A TW101128640 A TW 101128640A TW I463404 B TWI463404 B TW I463404B
- Authority
- TW
- Taiwan
- Prior art keywords
- code
- compiler
- compiling
- library
- optimization
- Prior art date
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/37—Compiler construction; Parser generation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Description
本發明係相關於編譯(compilation)與軟體程式的最佳化(optimization),尤指對一程式碼庫(code base)進行離線靜態分析,來重建一編譯器,使其特別適用於該程式碼庫的方法。如此,可以讓此程式碼庫的一些資訊可以在編譯過程中,早點被採用。好處是可以改善最佳化的效果,降低編譯所需的時間,也可以減少軟體開發所需的時間。
編譯器是電腦程式的一種,可以將高階程式語言所寫的原始碼,轉換成另一種低階程式語言,最終目的是產生一電腦可執行的程式。這裡的低階程式語言一般指的是組合語言或是機械碼。在轉換高階程式語言的過程中,編譯器會判定原始碼語法上的正確性,產生目的碼的有效執行時間組織(efficient run-time organization),並且依據連接器或是組合語言的規定,將輸出的檔案格式化。
軟體程式的編譯大致上是先將軟體的每個原始碼檔案,或是依據原始碼格式所寫的每個物件,個別地經過一編譯器,來編譯成許多個處理器可執行的原生(native)檔案或是機械碼(machine code)檔案。這些原生或是機械碼檔案接著將由一連結器處理,一起合併組合成為一完整的可執行程式。一個編譯器可以執行以下所有的或是部分的動作:語彙分析(lexical analysis)、前置處理(preprocessing)、語法分析(parsing)、語意分析(semantic analysis)、程式碼產生(code generation)、以及程式碼最佳化(code optimization)。
調整編譯器的輸出以最小化或最大化所產生之可執行程式的一些屬性,其所需要的程序,一般稱為程式碼最佳化。最常見的
一些程式碼最佳化的目的,舉例來說,是將執行程式所需的時間最短化,或是將執行程式所要占用的記憶體量最小化。編譯器最佳化(compiler optimization)通常是以一連串的最佳化轉換(optimizing transformation)來實現。每個最佳化轉換其實都是一種演算法(algorithm),可以將一個程式轉換成語意上等同且佔用比較少資源的另一個程式。
一種將可執行程式最佳化的習知作法,是讓編譯器對當下編譯的單一目的檔,在編譯的過程中,施行所有的最佳化轉換。舉例來說,一些編譯器所執行的最佳化操作包含有,基礎類別結合(base binding)、函數複製(function cloning)、以及部份求值(partial evaluation)。
然而,以上所述的方法,每個目的碼檔案都是個別地被編譯器編譯而產生,所以都會碰到無法全域地知道整個程式狀況的問題。這也意味著,許多在編譯過程中執行的最佳化轉換操作,其實是需要一些在連結許多個目的碼檔案時才能夠獲悉的資訊。因此,儘管一編譯器可以仰賴某一部分特別片段資訊來執行一最佳化轉換操作,此編譯器無法得知並利用整個程式的總體特性(舉例來說,操作碼的分布情形、指令序列出現的頻繁程度等),來達到真正的最佳化。
連結時間最佳化(link-timeoptimization),其施行的時機在於當程式的總體特性為已知,在連結操作時,對被編譯之程式進行處理的一種習知程式最佳化方案。因為連結的主要目的是要連結並合併所有的目的碼檔案,以成為一單一可執行檔案,所以此時可以得知整個程式的總體特性。連結時間最佳化可以對新連結成的檔案,進行各式各樣的最佳化處理。連結時間最佳化也可牽涉到重新編譯整個程式,只不過,這樣的方式將會消耗大量的運算處理。
另一種已知的最佳化方案稱為跨程序最佳化
(interprocedural optimization,IPO),其亦有能力分析整個程式。IPO採用一些傳統的最佳化技巧,像是”行內化”(inline)程序、跨程序死碼刪除(interprocedural dead code elimination)、跨程序常數傳遞(constant propagation)、程序重組(procedure reordering)等等技巧,來嘗試降低或是刪除掉重複出現的運算、改善記憶體的使用、並簡化迴圈步驟。IPO的動作可以在編譯過程中的任何一個階段進行,也可以當作連結時間最佳化的一部分。
以上這些最佳化方案,都無法同時兼顧到1)快速的編譯時間與連結時間;以及2)較積極的程式總體最佳化。
在此所揭示的技術提供了對一程式碼庫(code base)進行離線靜態分析的技術,來建立專為那程式碼庫所特製的一編譯器以及一些工具。先前技術中的最佳化方案往往因為缺乏該程式碼庫的總體資訊,所以無法有效地發揮效能。如果採用比較積極的最佳化方案,習知技術也會遭受過長的編譯時間的問題。本發明在此所揭示的技術,可以讓此程式碼庫的一些總體資訊可以在編譯過程中,早點被採用,以便讓最佳化比較可能有更好的結果。舉例來說,可以在暫存器配置之前,就先找出一些共用的子序列,這樣,子序列才可能可以再利用;否則,因為這些共用子序列使用了不同的暫存器,將會被認為是不同的子序列。當先前技術已經到了極限時,本發明所提供的技術可能可以更進一步地縮小所產生的目的碼檔案大小。
舉例來說,編譯器編譯當下程式碼庫的建構過程中,編譯器內的工具鏈(tools chain)會產生許多訊息,而靜態自動分析依據這些資訊,來找出當下程式碼庫中,一些可以重複使用的碼樣式(pattern)。以通用公共授權條款(GNU)的編譯器套件(GNU
compiler collection)為例,靜態自動分析先找出一些共用序列,然後產生組合源碼(assembler source code)、區間程式碼樣式(peephole pattern)、以及C語言支援源碼,其中,組合源碼將給予庫存函數(library functions)所使用,區間程式碼樣式將會用來偵測應用程式碼中的子序列(subsequence code)。靜態自動分析程式收集這些資訊,來建構一些特製化的編譯組件。這些特製化編譯組件可以用來重建既有的編譯器與編譯程式庫。
此外,靜態自動分析程式也收集函數呼叫行的位置與出現次數之相關資料,以及一些在之後編譯過程中可能可以用來協助判定的一些程式架構資訊。
在之後的編譯過程中,這個特製的編譯器,可供找出共用序列的出現位置,針對這些共用序列發出對應的程式庫呼叫,並且運用既有的最佳化動作,來持續地最佳化編譯程式庫呼叫中的程式碼檔案。
這種在編譯過程中找出可重複使用的碼樣式之方法,對於整個編譯與連結時間上,僅僅會增加一點點的時間成本;但是,這方法卻可以讓碼樣式的比對,能夠脫離暫存器配置所可能產生的限制。當下程式庫碼的基礎架構,可以用來做碼樣式之辨認,以及更進一步的最佳化。
本發明提供了對一程式碼庫(code base)進行離線靜態分析的技術,可以讓此程式碼庫的總體資訊提早在編譯過程中被採用,以改善最佳化的結果。離線靜態分析可以產生一些特製化編譯組件,以便用來重建編譯器。這樣,隨著時間的演進,就可以得到專為此程式碼庫所特製的一編譯器。此編譯器在每次建構完成後,都會得到比較好的最佳化效果,而且也能繼續保持有效率的編碼時間。當然的,重新建構與產出此編譯器的流程,需要定期
地、週期性地執行,如此,才能夠隨著此程式碼庫的改變或演變,有機會來定期地更新此程式碼庫的總體資訊。
第1圖顯示習知一編譯程序100的流程圖。編譯一個軟體程式時,傳統上是讓軟體程式的每個原始碼檔案110,或是每個用原始碼格式所撰寫的物件,個別地經過編譯器120編譯成相對應的一個處理器可執行的原生或是機械碼檔案,也就是一個目的碼檔案130。接著,連結器150可以運用連結時間最佳化160,來接手處理這些目的碼檔案130與140,把他們連結在一起以成為一可執行程式170。然而,這樣傳統的編譯器並無法宏觀地知道或是運用整體程式的全域特性(global property),因為每個目的碼檔案都是個別地被編譯器編譯而產生。儘管連結器能夠看到整個程式在編譯後的全域特性,要運用這樣全域特性來最佳化程式碼的話,可能需要重新編譯,讓最佳化動作變得非常多且複雜。
第2圖顯示依據本發明所實施的一編譯程序流程200,其中有採用整體程式分析的編譯程序以及對編譯器重新建構。整體程式分析用來產生一的特製的編譯器,特別適用於當下的穩定程式庫碼。而這個編譯器可以當作下一次程式碼開發程序循環中所使用的最佳化編譯器。
在每一次程式碼開發程序循環中,最佳化編譯器220編譯原始碼檔案210,而且最佳化編譯器220也會收集關於原始碼檔案的一些可以在之後用來最佳化目的碼檔案的資訊,像是語意、結構、流程等等資訊。編譯器產生編譯後的目的碼檔案280,也產生了對應目的碼檔案280的,被編譯後編碼的中介表示230。中介表示230是原本的原始碼檔案的一種編譯結果,只是其所使用的程式語言與適用的硬體,跟原本的原始碼檔案所使用的不一樣。
在本發明的一實施例中,中介表示230使用的程式語言是GCC暫存器轉換語言(Register Transfer Language,RTL)。以GCC RTL實現較高階程式語言指令時,GCC RTL詳細說明了所需要的操作、
暫存器之間的通訊以及相關步驟發生的時間點。這種以RTL表示,經由整個程式庫碼編譯後所產生的中介表示,將會作為整個程式之靜態分析240的輸入。在其他實施例中,中介表示所採用的程式語言,將會視原始碼檔案的程式語言,以及所要特製之編譯器的需求而決定。
整體碼庫的全部程式之靜態分析240是在編譯器具有全域視野的時候執行。這個自動化分析從中介表示230中找出一些共用序列(common code sequences),決定用來代表每個共用序列的”辭庫”,或是一組最有效率的組合,以使整個程式的大小最佳化。全部程式之靜態分析240接著產生組合源碼(assembler source code)以及程式碼轉換規則(code transformation specifications)。組合源碼用在特製函數程式庫250中,以運用共用子序列。程式碼轉換規則是以特製化編譯組件260的形式所構成。特製函數程式庫250跟編譯組件260中都有程式序列的外顯資訊(explicit knowledge)。這些外顯資訊係為被預期存在於程式碼庫中。特製函數程式庫250會用來擴增連結器程式庫(linker libraries)。之後,在下次的編譯循環,當連結器285連結編譯後之目的碼檔案280時來產生一完整的可執行程式290時,連結器285將使用這更新過的連結器程式庫。
特製化編譯組件260具有區間程式碼轉換規則(peephole code)以及指令樣式(instruction patterns)。這些特製化編譯組件260係用來重建特製化的編譯器(步驟270),使此最佳化編譯器220可以立即的辨識出、並置換程式碼庫中所出現的共用子序列。所以,在之後對於程式碼庫之原始碼檔案210的編譯循環過程中,此被重建之特製化編譯器220係被當作最佳化的編譯器對程式碼庫中的原始碼檔案210進行編譯。
第3圖為整個程式之靜態分析240的流程圖,用來產生特製化編譯組件。語法分析器(parser)310會將編譯器的中介表示230重整,以符合之後可以運用的一種格式。共用子序列320可以採
用既有的演算法來辨識出來,以便縮小容納整個可執行程式所需要的記憶體大小。舉例來說,演算法可以採用S.Liao and Kurt Keutzler在1998年所發表的"Code Density Optimization for Embedded DSP Processors Using Data Compression Techniques”。另外,子序列庫程序(subsequence library routines)以及具有呼叫那些程序的程式內文,也可用一樣的技術辨識出來。如此,就可以產生由共用子序列320所構成的集合或是”辭庫”,而且以中介表示的程式語言來表示。因為這個過程只有在要重新建構特製化編譯器的當下才會執行,所以可以採用比較積極,甚至比較耗時的最佳化技巧,來找出最理想辭庫。
如同"Code Density Optimization for Embedded DSP Processors Using Data Compression Techniques”中所提及的,選擇最理想辭庫這樣的問題,可以視為集合涵蓋程度之問題(set cover problem)的一種。儘管這樣的問題之前已經有在程式壓縮的文獻中採用線性規劃放鬆模型(linear programming relaxation)來解決,也可能可以用其他比較耗損處理器時間的方法,來找出最理想辭庫。
本發明之實施例可以採用基因演算法(Genetic algorithm)的技巧,來找出最理想的辭庫。舉例來說,Wen-Chih Huang,Cheng-Yan Kao and Jorn-Tzong Horng所發表的"A Genetic Algorithm Approach for Set Covering Problems"。對一些程式庫碼而言,本發明之一實施例也可以採用分支界定法(branch-and-bound)的技巧,來作為找出最理想辭庫的一種解法。
對於每一個共用子序列,實現這共用子序列的組合語言碼被產生出來,然後放置在子序列庫(subsequence library)330中。這子序列庫(subsequence library)330之後會加到連結器所使用的連結器程式庫(linker libraries)中,用來擴增連結器程式庫(linker libraries)。程式碼轉換規則(code transformation specifications)與編譯程式庫請求(library call)也產生出來。
程式碼轉換規則(code transformation specifications)340指出在甚麼樣的條件下,程式樣式符合了共用子序列的樣式。編譯程式庫請求則是用來取代共用子序列。
任何出現在連結器程式庫(linker libraries)中,但是最後可能因為程式庫碼的變更等原因,而沒有被用到的子序列,將在連結時間(link time)終了時,用一般的連結器函數刪除(linker function elimination)方法,從連結器程式庫中移除。
程式碼轉換規則有兩個主要部分:樣式部分(pattern component)以及取代樣式部分(replacement pattern component)。「樣式部分」是參數化後的片段中介表示碼,與部分程式碼的中介表示表示碼相匹配(match)。當碰到樣式毋須完全吻合的情況(舉例來說,在指令中對於暫存器的選擇是否相同),則沒有吻合的部分以語意等同的「中介表示匹配表示」取代。「取代樣式部分」也是參數化後的片段中介表示,其詳細描述用來取代上述符合樣式匹配條件的程式碼的指令;每當樣式毋須完全吻合的情況發生於程式碼庫被編譯的過程中,此「取代樣式部分」則被使用。參數化的用意在於,在取代的過程中,使得程式碼中符合該「匹配表示」的元件在替換的程式碼中被提及。
以下顯示以簡化之RTL表示的程式碼轉換樣式之一個例子。
(define_peephole2;;樣式:匹配一個’shift’指令,接著一個’add’指令。
;;取代:以一個函數呼叫連結器程式庫來取代。
[ (set (match_dup 0) (call "generated_function_shift_add" (match_dup 0) (match_dup 1) (match_dup 2)) ])只要把這樣的規則加入本發明實施例之特製化的編譯器,當這編譯器找到了一個平移指令(shift)接著一加法指令(add),而這加法指令把平移指令的結果加上某個值,那麼,編譯器將會認定樣式匹配條件成立,相關的指令會被替代掉。
在取代轉換發生時的中介表示碼大致跟程式碼轉換樣式類似,只是其中的"match_operand"與"match_dup"的條件敘述式會以暫存器中真正的運算元(operand)來替代。舉例來說,以下為某一轉換:(set (reg:SI r4) (ashift (reg:SI r3) (const_int 2 [0x2]))) (set (reg:SI r4) (plus (reg:SI r4) (reg:SI r5)))這些程式指令將轉換成(set (reg:SI r4) (call "generated_function_shift_add" (reg:SI r4) (reg:SI r3) (reg:SI r5)))
在一般正常編譯程序將中介表示轉換成組合語言之後,如果其中有辨認出共用子程序可以用來當作樣式,子序列庫(subsequence library)就會被產生出來。所產生的子序列庫中,每一個被辨認的共用子程序可以配置於一個自己的段落,以使得連結器函數刪除方法可以移除掉沒有被使用的子序列。子序列庫
的使用可以透過編譯器的一些設定編譯的選項來控制,啟用編譯器的樣式辨認,並用子序列庫來擴增連結器程式庫。多個子序列庫可以組合在一起來擴增一個官方發表之程式庫工具(a tools release),每一個子序列庫可以透過一個旗標(flag)來控制。
在本發明的另一個實施例中,程式碼庫中,函數呼叫行(function call site)的訊息可以用來預測某一個函數在編譯的過程中可能被呼叫了幾次。這樣的訊息可以用來決定是否把那函數”行內化”(inline);也就是編譯時把那函數直接展開來,不傳遞主控權。在先前技術中,在一函數被呼叫一次,且這函數有效的範圍(或稱為可視範圍)侷限於單一個編譯單元時,這函數會被行內化。最佳化編譯器220行內化(或是展開)這個函數,而不保留它為獨立函數的決定,是因為行內化後,將會增加執行的效能,且不會增加整個程式碼長度大小。但是,先前技術一般並沒有辦法對有效範圍達全域之函數來進行行內化,因為編譯並沒有整個程式碼庫中,所有函數呼叫行的資訊。
本發明的一實施例所揭示的技術,可以移除這先前技術的限制。舉例來說,如果整體程式之靜態分析240所得到的先驗知識(a-priori knowledge)指出,某一個可以被其他編譯單元所呼叫的全域函數,碰巧在整個程式碼庫中只被呼叫一次,那就可以決定來行內化此全域函數,而不會增加編譯後整個程式碼長度大小。因此,適當地使用從整個程式碼庫所得到先驗知識,就可以使最佳化編譯器220有機會去行內化這些函數,此部分先前技術會忽略不做。
在本發明的另一個實施例中,從整個程式碼庫所得到的先驗知識,可以用來加速編譯流程。最佳化編譯器220一般會依序執行許多最佳化動作(optimization passes)。一般來說,每個最佳化動作是先分析當下的程式碼;然後依據分析的結果,對當下程式碼做適當的轉換。在整個程式之靜態分析240的過程中,所輸出的中介表示可以包含有最佳化編譯器220所執行的每個最佳化動
作之歷史記錄,而包含此歷史記錄的輸出可以用來分析是否每個最佳化動作對於當下的程式碼庫具有影響。分析的結果可以收錄在特製化編譯組件260中,以便在編譯器之重建過程時,提供一種快速模式,其使得沒有效果的一些最佳化動作被省略而不執行。
運用最佳化編譯器220所輸出的中介表示中的歷史記錄,可以找出一個函數的中介表示在經歷每一個最佳化動作之前與之後的變化,來判定最佳化動作是否具有影響。最佳化動作效果檢查350就是執行這判別動作。如果某一個最佳化動作沒有影響,就在一最佳化動作表列上做個記號。快速模式管理程序360可以使用這個最佳化動作表列,對每個最佳化動作達到一看管功能。舉例來說,在快速模式時,看管功能可以使預計為沒有影響的最佳化動作被直接跳過而不執行。這樣的看管功能可以收納在特製化編譯組件260中,然後在後續重建編譯器時,也放在特製之最佳化編譯器中。
第4圖顯示編譯器重建的流程圖。程式碼轉換規則(transformation specification)340收錄在特製化編譯組件260中,作為特製之最佳化編譯器重建程序270的輸入。程式碼轉換規則340、快速模式管理程序360、手寫程式碼轉換規則(hand-written code transformation)410、以及指令集架構敘述(instruction set architecture description,ISA)420都經由GCC安裝工具(GCC build system)中的機械語法分析器(machine description parser)430處理,來產生以C語言表達之客製化編譯組件440。接著,客製化編譯組件440跟手寫之編譯器原始碼450一起被編譯、連結,以重建最佳化編譯器(步驟270)。最佳化編譯器重建(步驟270)後,可以在之後的編譯程序中使用,作為最佳化編譯器220,以便最佳化所產生的執行檔。因為特製之最佳化編譯器220已經預先知道整個程式碼庫的外顯資訊,而且使用特製函數程式庫250,就可以直接找到正確的程式碼,所以,特製之最佳化編譯器220的執行速度,將會比執行內部程序最佳化
(interprocedural optimisation)或連結時間最佳化(link time optimisation)來的快速。
以上所述僅為本發明之較佳實施例,凡依本發明申請專利範圍所做之均等變化與修飾,皆應屬本發明之涵蓋範圍。
100‧‧‧編譯程序
110‧‧‧原始碼檔案
120‧‧‧編譯器
130
140‧‧‧目的碼檔案
150‧‧‧連結器
160‧‧‧連結時間最佳化
170‧‧‧可執行程式
200‧‧‧編譯程序流程
210‧‧‧原始碼檔案
220‧‧‧最佳化編譯器
230‧‧‧中介表示
240‧‧‧靜態分析
250‧‧‧特製函數程式庫
260‧‧‧特製化編譯組件
270‧‧‧最佳化編譯器重建程序
280‧‧‧目的碼檔案
285‧‧‧連結器
290‧‧‧可執行程式
310‧‧‧語法分析器
320‧‧‧共用子序列
330‧‧‧子序列庫
340‧‧‧程式碼轉換規則
350‧‧‧最佳化動作效果檢查
360‧‧‧快速模式管理程序
410‧‧‧手寫程式碼轉換規則
420‧‧‧指令集架構敘述
430‧‧‧機械語法分析器
440‧‧‧客製化編譯組件
450‧‧‧手寫之編譯器原始碼
第1圖顯示習知一編譯程序的流程圖。
第2圖顯示依據本發明所實施的一編譯程序流程圖。
第3圖為整個程式之靜態分析的流程圖。
第4圖顯示編譯器重建的流程圖。
200‧‧‧編譯程序流程
210‧‧‧原始碼檔案
220‧‧‧最佳化編譯器
230‧‧‧中介表示
240‧‧‧靜態分析
250‧‧‧特製函數程式庫
260‧‧‧特製化編譯組件
270‧‧‧最佳化編譯器重建程序
280‧‧‧目的碼檔案
285‧‧‧連結器
290‧‧‧可執行程式
Claims (20)
- 一種編譯系統,用以編譯在一程式碼庫(code base)中的一原始碼檔案,該編譯系統包含有:一最佳化編譯器,為該程式碼庫而特製,編譯該原始碼檔案,以輸出複數個目的碼檔案以及據以產生一中介表示;以及一程式分析器,用以分析該中介表示,以獲得並儲存該程式碼庫的複數個特性以用於該程式碼庫的一後續編譯程序中。
- 如申請專利範圍第1項所述之編譯系統,其中,該程式碼庫的該等特性包含有關於複數個共用子序列的資訊,該等共用子序列係於該程式碼庫中出現了許多次。
- 如申請專利範圍第2項所述之編譯系統,另包含有:一連結器,將該等目的碼檔案連結,而產生一可執行程式,且該連結器包含有複數個連結器程式庫。
- 如申請專利範圍第3項所述之編譯系統,其中,由該程式分析器所產生有關於該等共用子序列的該資訊另用以產生一特製化函數程式庫(specialized library),其實行該等共用子序列,以及,於該後續編譯程序中,該連結器採用該特製化函數程式庫以及該 等連結器程式庫,以連結該等目的碼檔案。
- 如申請專利範圍第4項所述之編譯系統,另包含有由該程式分析器所產生的複數個特製化編譯組件,用來找出該原始碼檔案中的該等共用子序列,其中,該等特製化編譯組件被用來更新該最佳化編譯器,以便於該程式碼庫的該後續編譯程序中使用。
- 如申請專利範圍第1項所述之編譯系統,其中,該程式碼庫的該等特性包含有關於複數個最佳化動作的歷史記錄,該歷史記錄被該程式分析器所分析供決定每一個最佳化動作是否對該程式碼庫中的複數個函數中的任何一個具有影響。
- 如申請專利範圍第6項所述之編譯系統,其中,依據每一個最佳化動作是否對該程式碼庫中的至少一個函數具有影響,該最佳化編譯器決定是否跳過任何一個最佳化動作。
- 如申請專利範圍第1項所述之編譯系統,其中,該等特性包含有複數個函數呼叫行所在位置的資訊,該等函數呼叫行呼叫該程式庫碼中數個函數的至少其中之一。
- 如申請專利範圍第8項所述之編譯系統,其中,在該最佳化編譯器編譯該程式碼庫中的該等函數時,該最佳化編譯器使用該複 數個函數呼叫行所在位置的該資訊,來決定是否將至少一函數採用行內化方式編譯。
- 一種編譯方法,用以編譯在一程式碼庫中的一原始碼檔案,該編譯方法包含有:利用為該程式碼庫而特製之一最佳化編譯器,來編譯該原始碼檔案,並據以產生一中介表示;以及分析該中介表示,以獲得並儲存該程式碼庫的複數個特性以用於該程式碼庫的一後續編譯程序。
- 如申請專利範圍第10項所述之編譯方法,另包含有:從該等特性中獲得複數筆可重複使用之資源;以及以該等可重複使用之資源,在一後續編譯程序中,最佳化被編譯後產生之一目的碼。
- 如申請專利範圍第11項所述之編譯方法,另包含有:依據該等可重複使用之資源,重建該最佳化編譯器,以用於該後續編譯程序。
- 如申請專利範圍第11項所述之編譯方法,其中,該等可重複使用之資源包含有關於複數個共用子序列的資訊,該等共用子序列係於該程式碼庫中被發現了許多次。
- 如申請專利範圍第13項所述之編譯方法,其中,該最佳化步驟包含有:找出該程式碼庫中的該等共用子序列;以及最佳化被編譯後產生之該目的碼的大小。
- 如申請專利範圍第13項所述之編譯方法,另包含有:從編譯該原始碼檔案之過程中,輸出複數個目的碼檔案;以及連結該等目的碼檔案,以產生一可執行程式。
- 如申請專利範圍第15項所述之編譯方法,其中,該連結步驟另包含有:採用一特製化函數程式庫以及一連結器程式庫,來連結該等目的碼檔案;其中,該特製化函數程式庫採用該等共用子序列。
- 如申請專利範圍第10項所述之編譯方法,另包含有:產生關於複數個最佳化動作的歷史記錄;以及分析該歷史記錄,來決定每一個最佳化動作是否對該程式碼庫中的複數個函數中的任何一個具有影響。
- 如申請專利範圍第17項所述之編譯方法,另包含有: 依據該分析步驟之結果,決定是否跳過該等最佳化動作中的任何一個。
- 如申請專利範圍第10項所述之編譯方法,其中,該等特性包含有複數個函數呼叫行所在位置的資訊,該等函數呼叫行呼叫該程式碼庫中複數個函數的至少其中之一。
- 如申請專利範圍第19項所述之編譯方法,另包含有:在該最佳化編譯器編譯該程式碼庫中的該等函數時,使用該複數個函數呼叫行所在位置的該資訊來決定是否將至少一函數以行內化方式編譯。
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
EP12176842.8A EP2687981B1 (en) | 2012-07-18 | 2012-07-18 | Automated compiler specialisation for global optimisation |
Publications (2)
Publication Number | Publication Date |
---|---|
TW201405424A TW201405424A (zh) | 2014-02-01 |
TWI463404B true TWI463404B (zh) | 2014-12-01 |
Family
ID=46545274
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
TW101128640A TWI463404B (zh) | 2012-07-18 | 2012-08-08 | 編譯系統以及編譯方法 |
Country Status (4)
Country | Link |
---|---|
US (1) | US9552193B2 (zh) |
EP (1) | EP2687981B1 (zh) |
CN (1) | CN103577241B (zh) |
TW (1) | TWI463404B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
TWI696948B (zh) * | 2018-05-30 | 2020-06-21 | 臺灣發展軟體科技股份有限公司 | 編譯器最佳化方法 |
Families Citing this family (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103984558A (zh) * | 2014-05-30 | 2014-08-13 | 深圳市中兴移动通信有限公司 | 一种Web项目的自动构建装置及方法 |
US9569335B1 (en) * | 2015-10-07 | 2017-02-14 | Sap Se | Exploiting software compiler outputs for release-independent remote code vulnerability analysis |
US9727317B2 (en) | 2015-11-04 | 2017-08-08 | International Business Machines Corporation | Optimized compilation using an auto-tuned compiler as a service |
US10061571B2 (en) * | 2015-11-16 | 2018-08-28 | Qualcomm Innovation Center, Inc. | System and method for link time optimization |
US10133559B2 (en) * | 2016-06-03 | 2018-11-20 | International Business Machines Corporation | Generating executable files through compiler optimization |
JP2018041373A (ja) * | 2016-09-09 | 2018-03-15 | オムロン株式会社 | 実行可能プログラム作成装置、実行可能プログラム作成方法、および、実行可能プログラム作成プログラム |
CN110119274A (zh) * | 2018-02-05 | 2019-08-13 | 北京智明星通科技股份有限公司 | 一种数据编译的方法、装置以及电子终端、计算机可读存储介质 |
US10664251B2 (en) | 2018-10-05 | 2020-05-26 | International Business Machines Corporation | Analytics driven compiler |
US10956137B2 (en) | 2019-06-10 | 2021-03-23 | International Business Machines Corporation | Compiling source code using source code transformations selected using benchmark data |
WO2021021126A1 (en) | 2019-07-30 | 2021-02-04 | Hewlett-Packard Development Company, L.P. | Hash map of executable control blocks |
US11238138B1 (en) * | 2019-11-08 | 2022-02-01 | BlueOwl, LLC | Systems and methods to facilitate authorization key obfuscation validation |
US11442845B2 (en) * | 2020-12-07 | 2022-09-13 | Diffblue Ltd | Systems and methods for automatic test generation |
US11847435B2 (en) * | 2021-12-20 | 2023-12-19 | International Business Machines Corporation | Feedback-directed pass pipeline optimization in static compilation |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6823507B1 (en) * | 2000-06-06 | 2004-11-23 | International Business Machines Corporation | Detection of memory-related errors in computer programs |
US7356802B2 (en) * | 2003-09-29 | 2008-04-08 | International Business Machines Corporation | Automatic customization of classes |
US20080120493A1 (en) * | 2006-11-17 | 2008-05-22 | Samsung Electronics Co., Ltd. | Profiler for optimizing processor architecture and application |
TWI306215B (en) * | 2005-04-29 | 2009-02-11 | Ind Tech Res Inst | Method and corresponding apparatus for compiling high-level languages into specific processor architectures |
US20100146494A1 (en) * | 2008-12-10 | 2010-06-10 | International Business Machines Corporation | Compiler generator |
US7844957B2 (en) * | 2005-08-19 | 2010-11-30 | Sybase, Inc. | Development system with methodology providing optimized message parsing and handling |
US20120089962A1 (en) * | 2010-10-08 | 2012-04-12 | International Business Machines Corporation | Unchanged Object Management |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CA2081475C (en) * | 1991-02-27 | 1998-05-05 | Robert Neil Faiman Jr. | Multilanguage optimizing compiler using templates in multiple pass code generation |
US5999734A (en) * | 1997-10-21 | 1999-12-07 | Ftl Systems, Inc. | Compiler-oriented apparatus for parallel compilation, simulation and execution of computer programs and hardware models |
US6308320B1 (en) * | 1999-01-15 | 2001-10-23 | Hewlett-Packard Company | Method and apparatus for incremental selective compilation of intermediate code files during computer system compilation and linking |
US6983459B1 (en) * | 1999-04-06 | 2006-01-03 | International Business Machines Corporation | Incorporating register pressure into an inlining compiler |
US20050125783A1 (en) * | 2003-12-09 | 2005-06-09 | Texas Instruments Incorporated | Program optimization with intermediate code |
JP4652680B2 (ja) * | 2003-12-22 | 2011-03-16 | パナソニック株式会社 | コンパイル方法および装置、ならびにコンパイラ |
US8910113B2 (en) * | 2009-09-22 | 2014-12-09 | Adobe Systems Incorporated | Methods and systems for visual code refactoring |
-
2012
- 2012-07-18 EP EP12176842.8A patent/EP2687981B1/en not_active Not-in-force
- 2012-08-08 TW TW101128640A patent/TWI463404B/zh not_active IP Right Cessation
- 2012-08-28 US US13/596,538 patent/US9552193B2/en not_active Expired - Fee Related
- 2012-09-14 CN CN201210342636.5A patent/CN103577241B/zh not_active Expired - Fee Related
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6823507B1 (en) * | 2000-06-06 | 2004-11-23 | International Business Machines Corporation | Detection of memory-related errors in computer programs |
US7356802B2 (en) * | 2003-09-29 | 2008-04-08 | International Business Machines Corporation | Automatic customization of classes |
TWI306215B (en) * | 2005-04-29 | 2009-02-11 | Ind Tech Res Inst | Method and corresponding apparatus for compiling high-level languages into specific processor architectures |
US7844957B2 (en) * | 2005-08-19 | 2010-11-30 | Sybase, Inc. | Development system with methodology providing optimized message parsing and handling |
US20080120493A1 (en) * | 2006-11-17 | 2008-05-22 | Samsung Electronics Co., Ltd. | Profiler for optimizing processor architecture and application |
US20100146494A1 (en) * | 2008-12-10 | 2010-06-10 | International Business Machines Corporation | Compiler generator |
US20120089962A1 (en) * | 2010-10-08 | 2012-04-12 | International Business Machines Corporation | Unchanged Object Management |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
TWI696948B (zh) * | 2018-05-30 | 2020-06-21 | 臺灣發展軟體科技股份有限公司 | 編譯器最佳化方法 |
Also Published As
Publication number | Publication date |
---|---|
CN103577241B (zh) | 2017-05-17 |
EP2687981B1 (en) | 2017-12-27 |
US20140026127A1 (en) | 2014-01-23 |
TW201405424A (zh) | 2014-02-01 |
US9552193B2 (en) | 2017-01-24 |
CN103577241A (zh) | 2014-02-12 |
EP2687981A1 (en) | 2014-01-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
TWI463404B (zh) | 編譯系統以及編譯方法 | |
Ye et al. | Scalehls: A new scalable high-level synthesis framework on multi-level intermediate representation | |
Quinlan et al. | The ROSE source-to-source compiler infrastructure | |
US20170242671A1 (en) | Semantically sensitive code region hash calculation for programming languages | |
Porpodas et al. | PSLP: Padded SLP automatic vectorization | |
US20110119660A1 (en) | Program conversion apparatus and program conversion method | |
US11928447B2 (en) | Configuration management through information and code injection at compile time | |
JP6141365B2 (ja) | 逐次コンピュータプログラムコードを並列処理する方法及びシステム | |
Hundt et al. | Mao—An extensible micro-architectural optimizer | |
US9851959B2 (en) | Semantically sensitive code region fingerprint calculation for programming languages | |
EP3244306B1 (en) | A computer-implemented method for allowing modification of a region of original code | |
US20100083237A1 (en) | Reducing trace overheads by modifying trace operations | |
WO2013079006A1 (en) | Systems and Methods for Customizing Optimization/Transformation/ Processing Strategies | |
Kumar et al. | Rejuvenating C++ programs through demacrofication | |
Wang et al. | Odin: on-demand instrumentation with on-the-fly recompilation | |
US10013244B2 (en) | Apparatus and method to compile a variadic template function | |
JP2008276735A (ja) | プログラムコード変換装置及びプログラムコード変換方法 | |
KR20090011974A (ko) | 컴파일 대상 파일 추출 방법 | |
US7487496B2 (en) | Computer program functional partitioning method for heterogeneous multi-processing systems | |
Jimborean et al. | Online dynamic dependence analysis for speculative polyhedral parallelization | |
US20170344351A1 (en) | Information processing apparatus, compiling management method, and recording medium | |
Larsen et al. | Compiler driven code comments and refactoring | |
Haine et al. | Exploring and evaluating array layout restructuring for SIMDization | |
US20040045018A1 (en) | Using address space bridge in postoptimizer to route indirect calls at runtime | |
Taneja | Improving Compiler Construction Using Formal Methods |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
MM4A | Annulment or lapse of patent due to non-payment of fees |