- 特別針對C和C++,默認情況下使用了多少通道?
- 這個數字是否根據所使用的優化級別而變化? (它應該)
- 它可以直接更改嗎?
我在http://gcc.gnu.org/搜索此信息,但使用site:http://gcc.gnu.org/
搜索沒有產生任何東西。gcc使用了多少遍代碼?
有關此任何文檔的任何指針也會有所幫助。
通過通我指傳過來的源代碼只而不是多程通過定義建議Wikipedia的原始表示。
我在http://gcc.gnu.org/搜索此信息,但使用site:http://gcc.gnu.org/
搜索沒有產生任何東西。gcc使用了多少遍代碼?
有關此任何文檔的任何指針也會有所幫助。
通過通我指傳過來的源代碼只而不是多程通過定義建議Wikipedia的原始表示。
從我的編譯器設計類中有人告訴我,gcc做了一個單獨的傳遞,而像Visual Studio(默認)使用的其他編譯器使用兩個傳遞。這就是爲什麼如果你正在循環使用它們,你必須在C++中前向聲明類。
Class A {
B* b;
}
Class B {
A* a;
}
C#和其他語言不需要這樣做,因爲第一遍構建引用和第二遍編譯。
但我再次不是編譯器的專家。
前向聲明是該語言的一個屬性,與gcc無關。它可能與K&R的原始C編譯器的實現有關。 – 2010-06-24 17:07:52
這與獨立翻譯單元和鏈接的概念更相關。可以說,這是一個單獨的編譯器通行證,但不是GCC通行證。 – MSalters 2010-06-25 09:23:35
你的意思是通過了源代碼?就一次。這就是所謂的「標記化」或「詞法分析」階段,或者更廣泛地說,是「解析」階段。
你的意思是階段在編譯器中?有幾個。 「通行證」一詞實際上更像是一箇舊的彙編器概念,而不是現在的編譯器概念,即使這樣,它也只能粗略地使用。術語「通過」沒有單一的定義。
編譯器分解爲「階段」。閱讀任何編譯器教科書的介紹。它將解釋階段(大概有十幾個邏輯階段),GCC非常忠實地遵循教科書模型。有些階段通常組合成一個「通行證」,其他階段則是單獨的「通行證」。
的通概念真的不是在討論編譯器爲階段概念方面有用。
http://en.wikipedia.org/wiki/One-pass_compiler http://en.wikipedia.org/wiki/Multi-pass_compiler – 2010-06-24 17:14:22
正好一個。如果說「代碼」是指程序源代碼的原始文本表示,我認爲任何現代編譯器都不能對源代碼進行一次以上的傳遞。單次傳遞的重點是將源代碼轉換爲內部表示形式,以供進一步分析。該內部表示不再需要具有任何線性結構和/或不再需要僅限於順序處理,這意味着「通過」它的概念不再適用。
如果這個答案不能滿足你,你應該提供一個更精確的解釋,說明你定義的「通過」源代碼。
by pass我的意思是隻傳遞「程序源代碼的原始文本表示」。雙通編譯器可能做的第一步是查找語法錯誤並收集有用的信息,使其能夠更好地使用第二遍「編譯」。 – Lazer 2010-06-24 17:21:10
Lazer,一個好的編譯器在第一遍中收集了很多有用的信息,第二遍沒有添加任何東西。畢竟,文本沒有改變,那麼第二遍是什麼讓第一次找不到? – MSalters 2010-06-25 09:22:01
@Nathan Adams:這完全是錯誤的。 C語言不需要原型。 C++語言允許在類的一開始定義的內聯函數體內使用類的完整聲明。所以,「展望」的概念顯然存在於C++中,這就是通常所說的「多遍編譯」。從這個角度來看C++是「一次通過」的說法顯然是不正確的。 – AnT 2014-01-04 19:06:12
Passes and Files of the Compiler可能是最接近你在找什麼。
我從來沒有聽說過通過多次在文字表述(如果算上預處理器作爲一個合格除外)編譯器的。即使編譯器通過文件進行多次通信,文件也包含一箇中間表示(序列化的AST +符號表)。在另一方面
彙編常規做了兩(或更多)經過的源代碼。他們的預處理器經常允許一次完成特定的事情,允許玩一些或多或少的骯髒技巧。
你多遍的定義似乎是舊的,從那裏整個節目源(的表現),只是不適合可用內存的時代所產生。現在這些時間已經過去了,我不知道現在的多通道(舊定義)編譯器。
在德語維基百科條目編譯器,兩者的定義給出:http://de.wikipedia.org/wiki/Compiler
多通編譯
北diesem Compilertyp wird德Quellcode在mehreren Schritten在書房 Zielcodeübersetzt。在書房 Anfangszeiten DES Compilerbaus wurde 德Übersetzungsprozesshauptsächlich deshalb在mehrereDurchläufezerlegt, 韋爾死Kapazität德電腦經常 nicht ausreichte,嗯書房vollständigen 編譯UND DAS祖übersetzende PROGRAMM gleichzeitig IM Hauptspeicher 祖halten。 Heutzutage dient EIN 多遍編譯器VOR allem大足, VorwärtsreferenzenUNDaufzulösen(Deklaration EINES Bezeichners NACH dessen erster Verwendung)aufwendige Optimierungendurchzuführen。
也許我太偏見了,但我的理解是,來自英文wikipedia通常更有用。謝謝。 – 2017-07-08 08:58:32
@IskanderSharipov我完全同意。不幸的是,我發現在英文維基百科中沒有相應的條目。一個名爲「multi-pass compiler」的人被這個問題的作者解僱了,因爲它包含了比原始源代碼更多的其他表示。 – 2017-07-09 14:50:16
在gcc中,基本上有兩種類型的pass,即:gimple,rtl。在gcc 4.6.2中,唯一傳遞總數爲207.是給定程序的傳遞總數取決於優化級別。這些通行證中的一些更多一次。如果有人想要通過這些通行證,請通過gcc源代碼中的pass.c文件。路徑在GCC 4.6.2 passes.c:GCC源 - > GCC - > passes.c
是的,你可以通過添加您的通行證在GCC動態插件改變的遍數。
您將通過刪除很多答案來觸發自動郵局。 – Will 2012-08-13 10:36:10
正如其他上面所指出的,現代編譯器做只有一個解析階段單程和使用的內部表示(通常樹木或其他內存圖狀的數據結構)在稍後階段然後多者。
具體地說GCC使用這種方法。請參閱:https://gcc.gnu.org/onlinedocs/gccint/Parsing-pass.html#Parsing-pass
+1,但它讓我想知道爲什麼會有任何理由將代碼傳遞兩次以上。一個用於預處理器,另一個用於將代碼加載到抽象語法樹中以供進一步分析。 – 2010-06-24 16:40:54
我同意,應該沒有必要通過兩次以上。一次用於預處理器,一次用於編譯器。不過,我懷疑編譯器可能會不止一次地通過語法樹! – 2010-06-24 16:44:34
@Justin Ethier一旦它達到AST或其他一些中間表示形式,代碼就不會再「傳遞」了嗎?(這個問題在這方面似乎有點不清楚):-) – 2010-06-24 16:44:38