深度并行的源代碼編譯的制作方法
【專利說明】深度并行的源代碼編譯
[0001]背景
[0002]編譯器被用于在計算設備上執(zhí)行之前,將以更高級的編程語言編寫的源代碼轉(zhuǎn)換成更低級的語言。例如,可編譯使用X++編程語言編寫的源代碼以創(chuàng)建可在一個或多個計算設備上執(zhí)行的可執(zhí)行程序。編譯器可執(zhí)行不同的操作,包括詞匯分析、語義分析、代碼生成等。編譯少量源代碼通??焖俚貓?zhí)行,而編譯大量源代碼可花費相當多的時間。
[0003]概述
[0004]提供本概述以便以簡化的形式介紹以下在詳細描述中進一步描述的一些概念。該概述不旨在標識所要求保護的主題的關鍵特征或基本特征,也不旨在被用來幫助確定所要求保護的主題的范圍。
[0005]使用包括與程序結(jié)構(gòu)相關的信息的編程語言的源代碼來生成抽象句法樹(AST)。例如,編譯器前端(例如,解析器)可分析源代碼,確定源代碼所定義的類型/類中的每一種類型/類,并且生成AST。AST的生成可并行地執(zhí)行。隨著它們在編譯過程期間經(jīng)過流水線,所生成的AST被細化以包括進一步的語義信息。這些類型/類被分割成形成匯編件的模塊。所使用的多個不同模塊可被配置和/或被自動地確定。例如,可為每一類型創(chuàng)建一模塊,可為預定數(shù)量的類型創(chuàng)建一模塊等等。在編譯過程的不同階段期間,每一模塊可被并行地編譯。由于不同的模塊被(例如,并行地)編譯,因此來自不同模塊的信息被寫入存儲庫??赏ㄟ^不同的編譯過程來訪問存儲庫。在流經(jīng)編譯流水線之后,經(jīng)豐富的AST中的每一個AST都用于代碼生成,其中它們被變換成目標語言(例如,可在硬件上執(zhí)行的代碼流)。然后,這些模塊中的每一個模塊內(nèi)的可執(zhí)行代碼被存儲為匯編件的一部分。還可并行地執(zhí)行代碼的存儲。分配不同的編譯線程以使其在多個處理器(例如,兩個、四個、八個、高達多個處理器是可用的)上運行。通常,源代碼的編譯速度由可用硬件資源確定。
[0006]附圖簡述
[0007]圖1示出了用于深度并行的源代碼編譯的系統(tǒng);
[0008]圖2示出了用于并行地編譯源代碼的流水線;
[0009]圖3示出了來自編譯過程的示例性階段的示例;
[0010]圖4解說了在編譯階段內(nèi)的不同階段使用并行計算的編譯過程;
[0011]圖5解說了使用深度并行的源代碼編譯的示例性在線系統(tǒng);以及
[0012]圖6、7A、7B和8、以及相關聯(lián)的描述提供了對其中可實踐本發(fā)明的實施例的各種操作環(huán)境的討論。
[0013]詳細描述
[0014]現(xiàn)在參考各附圖,其中相似的附圖標記表示相似的元件,將針對元件描述各個實施例,將描述各個實施例。
[0015]圖1示出了用于深度并行的源代碼編譯的系統(tǒng)。
[0016]如所示,系統(tǒng)100包括編譯管理器26、編譯器110、編譯流水線120、抽象句法樹(AST) 130、源代碼140、模塊150、可執(zhí)行代碼160、存儲庫170、以及包括一個或多個處理器(例如,處理器1-N)的計算設備115。
[0017]通常,編譯管理器26被配置成并行地編譯源代碼。例如,代替串行地編譯源代碼,基于類型/類定義將源代碼分割成用于編譯的多個不同線程。編譯管理器26訪問源代碼140以供編譯器110編譯。
[0018]源代碼140是以編程語言編寫的的源代碼,該源代碼被編譯成可在一個或多個計算設備上執(zhí)行的可執(zhí)行代碼??墒褂靡环N或多種編程語言(C、C++、C#、X++、VISUAL BASIC、VISUAL BASIC.NET)來編寫源代碼140。根據(jù)一個實施例,源代碼140以.NET編譯語言(諸如X++代碼)編寫,該.NET編譯語言與C#和/或其他.NET編譯語言具有相似性。
[0019]編譯器110被配置成使用在編譯流水線120中定義的不同階段/途徑來編譯源代碼140??墒褂貌煌姆椒▉砼渲镁幾g器110。根據(jù)實施例,編譯器110被配置成編譯源代碼140以創(chuàng)建MICROSOFT.NET應用。可使用一個或多個編譯器。例如,可將不同的編譯器與使用不同編程語言編寫的每一源代碼文件相關聯(lián)。
[0020]編譯管理器26訪問源代碼140 (—個或多個文件)并在編譯流水線120中的解析階段期間,編譯器110生成抽象句法樹(AST)。AST包括與程序的結(jié)構(gòu)相關的信息。例如,解析器可訪問源代碼140、分析源代碼140、確定源代碼140的結(jié)構(gòu)并且生成AST。隨著解析器識別源代碼中的語言構(gòu)造,它建立包括作為它們表示的源代碼偽像(例如,X++偽像)的抽象的節(jié)點的AST??刹⑿械貓?zhí)行AST的生成。
[0021]隨著它們在編譯過程期間經(jīng)過流水線120,所生成的AST被細化以包括進一步的語義信息。流水線120可包括掛接(hook)到流水線中的任意數(shù)量的途徑。然后,流水線將順序地經(jīng)過這些途徑。每一途徑可按需提取信息和/或修改將進入下一途徑的代碼(例如,AST)。該上下文中的途徑是通過應用某一規(guī)則或者通過修改該規(guī)則對源代碼采取行動的實體。第一途徑是讀取源代碼、解析該源代碼且產(chǎn)生后續(xù)途徑對其操作的抽象句法樹(AST)的解析器。
[0022]在生成AST時確定的類型被分割成形成匯編件的模塊??膳渲盟褂玫牟煌K的數(shù)量。例如,可為每一類型配置一模塊,可為預定數(shù)量的類型配置一模塊等等。在編譯過程的不同階段期間,每一模塊可并行地編譯。
[0023]由于不同的模塊被(例如,并行地)編譯,因此來自不同模塊的編譯器的信息(例如,編譯器元數(shù)據(jù))可被寫入存儲庫,諸如存儲庫170 (例如,數(shù)據(jù)庫)。編譯器元數(shù)據(jù)可被寫入文件和/或存儲器位置。在源代碼的編譯過程的不同階段期間的并行計算期間,可通過不同的線程訪問存儲庫。
[0024]在流經(jīng)編譯流水線之后,經(jīng)豐富的AST中的每一個AST被用于代碼生成,其中它們被變換成目標語言(例如,可在硬件上執(zhí)行的代碼流)。然后,可執(zhí)行代碼被存儲為匯編件160的一部分。代碼的存儲也可并行地執(zhí)行。
[0025]如所示系統(tǒng)100包括各自包含一個或多個處理器(例如,處理器1-N)的計算設備115。編譯管理器26可管理不同編譯線程并將其分配到可用處理器。通常,源代碼的編譯速度由可用硬件資源(例如,多個可用處理器(1-N))確定。編譯管理器26可以是代碼開發(fā)系統(tǒng)和/或其他系統(tǒng)/服務的一部分。以下提供更多的細節(jié)。
[0026]圖2示出了用于并行地編譯源代碼的流水線。如所示,圖2包括源代碼文件205、解析器210、AST 215、分割器20、N個途徑230、以及存儲240。
[0027]解析器210訪問源代碼205 ( 一個或多個文件)并生成抽象句法樹(AST)。AST包括與程序結(jié)構(gòu)相關的信息。例如,解析器210可以是分析源代碼205、確定所定義的類型中的每一種類型、并且生成相應的AST的自下而上(bottom up)的解析器。AST的生成可并行地執(zhí)行。例如,可創(chuàng)建處理器以并行地解析每一源代碼文件。
[0028]在生成AST 215之后,分割器220將所確定的類型/類分割成各自可獨立且并行地處理的不同模塊??膳渲煤?或自動地確定所使用的不同模塊的數(shù)量(例如,使用與可用處理資源相關的信息)。一種或多種類型/類可與一模塊相關聯(lián)。源代碼205可定義大量類型/類(例如,10,000、20,000、30,000、…),而其他源代碼205可定義較小數(shù)量的類(例如,10、20、100)。所選擇的模塊的數(shù)量可取決于各種因素/條件(例如,可用過程、所確定類型的數(shù)量、可用存儲器、…)。根據(jù)實施例,這些類型由分割器220基于類型名進行分害J。例如,具有相同的前X個字母的類型被分割成相同的模塊。類名可被散列并且使用散列來分割??苫跇俗R符、類型等分割類。通常,將名稱唯一地映射到模塊的任何方法可用于在模塊之間分割這些類型。
[0029]流水線230可包括取決于編譯過程的每一不同編譯線程的任意數(shù)量的途徑。流水線內(nèi)的每一