為什麼這麼多人喜歡寫編譯器?

時間 2021-05-11 13:03:58

1樓:知語言

今天我把TCC編譯器全部漢化了。其實漢化編譯器也挺有意思的。

#匯入 "zhi.h"

#如果是_原始檔

# 匯入 "libzhi.c"

#結束如果

#匯入 "zhitools.c"

#匯入 "help.c"

整數型主函式(整數型引數數量, 字元型 **引數陣列)

知心狀態機 *狀態機, *s1; /*s1不能換成其他名稱,對其他檔案有依賴*/

整數型返回值, 編譯指令, n = 0, t = 0, 完成;

無符號開始_時間 = 0;

常量字元型 *原始檔;

整數型引數數量0;

字元型 **引數陣列0;

FILE *開啟的檔案流 = stdout;/*FILE在stdio.h裡的結構體;stdout,在stdio.h裡的巨集擴充套件,*/

redo:

引數數量0 = 引數數量, 引數陣列0 = 引數陣列;

狀態機 = s1 = 初始化狀態機();

編譯指令 = 解析命令列引數(狀態機, &引數數量0, &引數陣列0, 1);

如果 (n == 0) 判斷 (!完成 && (狀態機->輸出_型別 != ZHI_OUTPUT_OBJ || 狀態機->選項_可重定位目標檔案));

如果 (狀態機->執行_測試)

t = 0;

否則如果 (狀態機->輸出_型別 == ZHI_OUTPUT_PREPROCESS)

否則如果 (0 == 返回值)

如果 (狀態機->輸出_型別 == ZHI_OUTPUT_MEMORY)

#如果已定義 ZHI_是_本機

返回值 = ZHI_執行(狀態機, 引數數量0, 引數陣列0);//執行指令碼執行的這句

#結束如果

否則如果 (!狀態機->輸出檔案)

狀態機->輸出檔案 = 預設_輸出檔案獲取副檔名(狀態機, 原始檔);

如果 (輸出可執行檔案或庫檔案或目標檔案(狀態機, 狀態機->輸出檔案))//編譯原始檔執行這句

返回值 = 1;

否則如果 (狀態機->生成_依賴)

生成_makedeps(狀態機, 狀態機->輸出檔案, 狀態機->依賴_輸出檔案);

如果 (狀態機->顯示_編譯統計 && 完成 && !(t | 返回值))

顯示編譯統計資訊(狀態機, 獲取時鐘毫秒數() - 開始_時間);

釋放狀態機(狀態機);

如果 (!完成)

去向 redo; /* 用-c編譯更多檔案 */

如果 (t)

去向 redo; /* 使用-dt -run執行更多測試 */

如果 (開啟的檔案流 && 開啟的檔案流 != stdout)

fclose(開啟的檔案流);

返回返回值;

漢化後取個自己的名字:知心編譯器,自己用著方便。

2樓:Frank

說句實話吧,單純學計算機的人,如果想寫編譯器,那麼思維是很受限制的,如果是個學機械的,或者學生物的,那麼我們寫編譯器可就不是單純為了解析C語言到機器碼。我要做的是將類C或類B的語言轉化為執行任何事情的指令。哈哈,這個B裝的過大了,哈哈,其實就是指令碼直譯器,嘿嘿

3樓:

有趣,涉及底層。

以及嘗試在學OI過程中進行一些摸魚行為。(比如研究C++標準、研究編譯原理、試著寫微型作業系統核心【抄的MINIX】、亂寫點直譯器什麼的【基本都沒有深入,我水平太低了,捂臉】

4樓:Javen

先輩早就告訴我們了,沒有銀彈,不同的場景不同的語言的威力大相徑庭,選擇合適的而已,沒有合適的就造乙個,所以看起來人們都在忙著造語言,要打破這個魔咒,其中一條路就是搞出強人工智慧實現自動編碼,乾死發出這些問題的人。

5樓:

因為真的很有意思。而且這個是乙個很好的學習工具。

寫了之後你會發現原來編譯器,是乙個字元乙個字元去吃來解析檔案的,關鍵字最後都解析成了列舉的token。解析表示式裡面還要解析表示式裡面的表示式,解析表示式裡面的表示式還要分別解析左右的表示式,解析左表示式裡面還要解析裡面的表示式,解析右表示式還有解析操作符加解析右表示式裡面的表示式,是不是很繞。老實說遞迴裡面套函式函式裡面又有遞迴,大家也都知道遞迴的維護性有多差,所以寫的時候,腦子都會打結。

但是人吶,往往喜歡找虐,況且在編譯成功的那一秒比喝濃縮十倍的死肥宅快樂水還爽。

6樓:Jason5Lee

因為現在還沒有乙個程式語言有真正舒服的DSL機制。

擼DSL最舒服的應該是Lisp的巨集,但是你們又討厭括號。

像Scala、Haskell、Kotlin那些,設計出的DSL多多少少不是很順。

再加上你很難說服乙個不會某個語言的人用那個語言的設計的DSL。比如我用Scala設計乙個DSL給別人用,通常都會得到「我學不會Scala「的回答。就算我跟他說」我這個DSL不需要會Scala,你照著文件寫就好了「,多半他還是不願意用。

所以沒辦法,就只能設計新的帶DSL性質的程式語言。

然後你設計了新的程式語言就當然要寫編譯器或直譯器了。

雖然很多人討厭DSL,但是這個需求不會消失。人們偷懶的心理總是想著學乙個「能在我這個領域使用的,而沒有多餘的東西」語言。比如SQL,就只提供資料操作,學起來肯定舒服。

7樓:

因為寫編譯器是初學程式設計的人最容易想到的專案(坑)。

99%發現寫不出來以後,也就老實了。

0.9%的人寫出來個toy,裝波逼或者也就老實了。

0.1%的人發現了其中的樂趣,成為了大神。

8樓:放浪者

Compiler的工作是cs領域裡在enginnering方面最複雜也最有發揮空間的,相對於os這種主要是coding量大的的東西,compiler在frontend parsing的時候可以靈活設計各種資料結構和演算法來處理,在backend optimizing的時候又會用到其他領域包括os都很少用到的graph等東西,可以說是engineering最有挑戰性的領域(而且不像distributed computing那樣要很多機器大部分時間花在機器配置和同步等無聊事情上,可以專注於乙個乙個演算法問題解決)。

國內本科現在怎麼樣我不清楚,但是從學生和師資水平可以判斷大部分能寫個簡單parser就到頭了,可能大多還談不上稍微複雜的語義分析和資料結構以及backend optimization, 所以對compiler有點神話(我感覺的,也許不對)。相對來說,我在美國上學的學校雖然很一般,但是compiler課也是完成乙個包括支援function/struct和所有c支援的data type以及部分bakckend optimization後直到生成mips asm code的完整mini c compiler. 乙個完整的mini comoiler的實現能讓人充分認識到其難度和挑戰,但不至於過度神話。

9樓:冒泡

分兩種情況:

1 寫現有語言的編譯器,或許是為了作業,或許是為了鍛鍊自己,或許真的因為現有編譯器的一些缺陷

2 設計自己的語言,只能自己寫了,這樣問題就是,為啥要設計新語言,原因一般就是對老語言不爽嘛

10樓:徐波

因為寫遊戲要資源

寫伺服器看不見

編譯器無需任何依賴, 難度還夠一直啃下去

還不斷的可以show出很多有意思的東西

你說為啥不寫?

11樓:

形象點說:

如果說程式設計是我們可以接觸到的最接近魔法師的技能,那麼寫編譯器設計語言大概就是允許你用超階的魔法創造世界,扮演上帝。

就是這樣~

12樓:

我擅自闖入,強答一下。

我剛寫了個有很多BUG的C編譯器,前端自創的,後端用的LLVM,感覺挺有意思。我用C語言很多年了,大學第一門程式語言是 C,工作後也主要是用 C 語言。這次做編譯器的經歷,讓我發現 C 的更多特性和語法規則,對 C 語言的理解更加完備。

再吐槽一下 C11,作為標準,我覺得它應該更規範一些。

你看,寫完乙個編譯器,我都能吐槽標準了。

為什麼這麼多人喜歡去酒吧?

夜店網 酒吧賣的不是酒,賣的是氛圍和社交。最直接的比喻就是你在星巴克喝咖啡和在家自己磨咖啡喝一樣,去星巴克喝咖啡就是為了那個氛圍去的,咖啡其實沒有啥出眾的。酒吧也是乙個道理,酒吧主要的是人氣,是社交,是氛圍,而不是單獨的買酒喝,酒在夜店裡面可以形容是道具,來讓自己不那麼尷尬。 松暗406 1 因為別...

為什麼這麼多人不喜歡滿清?

暴躁的猴子 客觀講,就是被人耍了當槍使。看看國外,那些資本主義國家階級矛盾如此尖銳,但是為啥國家依然穩定?答案很簡單,因為被剝削階級根本團結不起來,大家忙著性別對立 地域歧視 膚色歧視 宗教對立 因為吃不吃肉對立 因為選不選懂王對立 因為買不買槍對立 誰還有空去跟剝削階級叫板?996是啥?滿清才是你...

為什麼這麼多人喜歡大秦帝國?

閒士四日 我大概是在念大學的時候接觸到大秦帝國,當時還是沒有修訂的版本,只出到第3部。我覺得他主要是對於老秦人的描述,喚起了我們對於赳赳老秦共赴國難的共情。 一律 只看過書,沒看電視劇集。因為和正史的枯燥不一樣,帶有一點玄幻色彩和命定之意,覺著跌宕起伏,引人入勝。這是一部有趣的文學作品。 許巍 嚴肅...