我在Sebesta book中讀到,編譯器花費大部分時間來處理源代碼。因此,與語法分析器不同,優化詞法分析器是必需的。編譯器在解析過程中大部分時間花在哪裏?
如果這是真的,爲什麼詞法分析階段比語法分析一般需要很多時間?
我的意思是通過語法分析推導過程。
我在Sebesta book中讀到,編譯器花費大部分時間來處理源代碼。因此,與語法分析器不同,優化詞法分析器是必需的。編譯器在解析過程中大部分時間花在哪裏?
如果這是真的,爲什麼詞法分析階段比語法分析一般需要很多時間?
我的意思是通過語法分析推導過程。
首先,我不認爲它確實是真的:在很多編譯器中,大部分時間並不花在Lexing源代碼上。例如,在C++編譯器(例如g ++)中,大部分時間都花在語義分析上,特別是在重載解析中(試圖找出要執行的隱式模板實例)。另外,在C和C++中,大多數時間通常用於優化(創建單個函數或整個翻譯單元的圖形表示,然後在這些圖表上運行長算法)。
當比較詞法和語法分析時,詞法分析確實可能更昂貴。這是因爲兩者都使用狀態機,即每個元素有固定數量的動作,但詞法分析(字符)中元素的數量要多於語法分析(令牌)中的元素數量。
我完全不確定,但也可能相關的是,還存在更多種字符值,這些字符值存在易變的標記類型(例如,與例如僅100個標記類型相比,2^16個可能的字符值)。 – ChrisW 2009-07-09 01:02:30
詞法分析是將源代碼中的所有字符都轉換爲令牌的過程。例如
foreach (x in o)
由字符讀取字符 - 「F」,「O」等
詞法分析器必須確定的關鍵字被人看見(「的foreach」,而不是「對」等)
在句法分析發生的時候,程序代碼「只是」一系列的標記。也就是說,我同意上面的答案,詞法分析不一定是最耗時的過程,只是它有最大的合作空間。
這實際上取決於你在抽出和解析之間畫線的位置。我傾向於對令牌的含義非常有限,因此我的解析器花費了大量的時間進行解析,而不是因爲它們更快,而不是因爲它們更快。
它當然以前是lexing昂貴的情況。部分原因是有限的內存和多個文件操作來讀取程序位。現在內存以GB來衡量,這不再是一個問題,出於同樣的原因可以做更多的工作,所以優化更重要。當然,優化是否有很大幫助是另一個問題。
爲什麼不優化兩者? – bbqchickenrobot 2009-07-09 00:56:06