再一次親密接觸

2021-03-31 23:50:14 字數 1002 閱讀 6415

這個學期的編譯原理課程實驗,我要實現乙個小型的編譯器,至少要做到翻譯中間**為止,至於語法就簡單點行了。由於很多前輩一再強調c語言的重要性,以及編譯後的程式如何如何高效地執行。所以在寫這個編譯器時,我選擇了c,因為編譯器的執行效率要求還比較高,也順便鞏固鞏固c在我的記憶中的地位。

上次寫了個自下而上語法分析程式,但是那還是沒有進行詞法分析的,那裡我假設所有的終結符(terminate)都是單字元的,所以詞法分析就變成了直接從緩衝區取乙個字元。

今天下午終於開始動工構造我的詞法分析器了,這可是整個編譯器的基礎設施,如果詞法分析沒有實現好,或是執行的很低效(比如:讀取原始檔時頻繁的檔案i/o訪問)將會直接影響到整個編譯器的效能。所以構造詞法分析的關鍵就集中到了怎樣減少檔案訪問次數上,這馬上令人聯想到了緩衝技術。

在這裡我用的是buff pairs技術,即用乙個buff分成兩半,巧妙地將他們連成環,構建出乙個對使用者來說好像用不完的buff來。設計思想很簡單:如果當前指標讀到了另一半,就先從檔案載入到另一半再讀。當然裡面有幾個需要注意的問題,這裡就不提了,詳情可見龍書(《***pilers: principles, techniques, and tools》)89頁。這裡我要說的乙個問題是,由於要迴圈訪問同乙個buff,這就要求每次訪問陣列時最後要加乙個%buff_size以防止訪問越界。這個道理很簡單,可世上往往有很多事情是道理越簡單,結果卻越被人忽視了。我就有乙個地方忘記加了。結果控制台列印出來的結果可想而知了,出幾個正常的結果,突然中間冒出乙個亂碼,然後繼續正常,又亂。一開始我很鎮定,肉眼除錯,一行一行檢查**,除了越來越發現我的邏輯很嚴密外沒發現任何別的東西:)。最後抗不住了,借助vs端點除錯,立馬發現乙個陣列索引超出了buff_size了。加上%buff_size,立馬解決問題。

問題雖然解決了,但心中還是不平靜。為什麼c沒有提供陣列越界檢查?c#裡肯定會丟擲異常的,那排錯就簡單多了。馬上又一拍自己腦袋,c拿什麼來拋?根本沒有異常機制!c的高效就是因為其樸實,原始,沒有任何高階功能的修飾,所以這樣帶來的執行高效就要用開發周期的延長和高水平的程式設計師來換。

但願c長久,高手共嬋娟!呵呵。

再一次求助

編24點程式時遇到的問題 大佬好呀,python小白又來求助啦!這次的問題是在編24點時遇到的乙個問題 如何將使用者輸入的數字運算出結果?源 import random shuzi str one str random.randint 1,10 shuzi str two str random.ra...

第一次與獵頭「親密接觸」

一年一度換工作的高峰又到了,接到獵頭公司打來的 我們應該如何應對才顯出自己足夠專業?希望本文中分享的一些經驗能讓你在與 獵頭第一次親密接觸 時佔盡先機。首先,能接到獵頭公司打來的 無論何時都是好事!至少說明你有些東西被其它公司所留意。祝賀你!獵頭公司打給你的第乙個 一般是這樣的。獵頭顧問 是x先生 ...

第一次與獵頭「親密接觸」

一年一度換工作的高峰又到了,接到獵頭公司打來的 我們應該如何應對才顯出自己足夠專業?希望本文中分享的一些經驗能讓你在與 獵頭第一次親密接觸 時佔盡先機。首先,能接到獵頭公司打來的 無論何時都是好事!至少說明你有些東西被其它公司所留意。祝賀你!獵頭公司打給你的第乙個 一般是這樣的。獵頭顧問 是x先生 ...