多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > 程序設計基石與實踐系列之寫一個C語言編譯器

程序設計基石與實踐系列之寫一個C語言編譯器

來源:程序員人生   發布時間:2016-03-01 08:18:33 閱讀次數:2437次

動手編寫1個編譯器,學習1下較為底層的編程方式,是1種學習計算機究竟是如何工作的非常有效方法。

編譯器通常被看做是10分復雜的工程。事實上,編寫1個產品級的編譯器也確切是1個龐大的任務。但是寫1個小巧可用的編譯器卻不是這么困難。

秘訣就是首先去找到1個最小的可用工程,然后把你想要的特性添加進去。這個方法也是Abdulaziz Ghuloum在他那篇著名的論文“1種構造編譯器的捷徑”里所提到的辦法。不過這個辦法確切可行。你只需要依照這篇論文中的第1步來操作,就能夠得到1個真正可用的編譯器!固然,它只能編譯程序語言中的非常小的子集,但是它確切是1個真實可用的編譯器。你可以隨便的擴大這個編譯器,然后從中學到更多更深的知識。

遭到這篇文章的鼓舞,我就寫了1個C編譯器。從某種意義上來講這比寫1個scheme的編譯器要困難1些(由于你必須去解析C那復雜的語法),但是在某些方面又很便利(你不需要去處理運行時類型)。要寫這樣1個編譯器,你只需要從你那個可用的最小的編譯器開始。

對我寫的編譯器來講,我把它叫 babyc,我選了這段代碼來作為我需要運行的第1個程序:

int main() { return 2; }

沒有變量,沒有函數調用,沒有額外的依賴,乃至連if語句,循環語句都沒有,1切看起來是那末簡單。

我們首先需要解析這段代碼。我們將使用 Flex 和 Bison 來做到這點。這里有怎樣用的例子可以參考,幸虧我們的語法是如此簡單,下面就是詞法分析器:

"{" { return {; } "}" { return }; } "(" { return (; } ")" { return ); } ";" { return ;; } [0⑼]+ { return NUMBER; } "return" { return RETURN; } "int" { return TYPE; } "main" { return IDENTIFIER; }

這里是語法分析器:

function: TYPE IDENTIFIER ( ) { expression } ; expression: RETURN NUMBER ; ;

終究,我們需要生成1些匯編代碼。我們將使用32位的X86匯編,由于它非常的通用而且可以很容易的運行在你的機器上。這里有X86匯編的相干網站。

下面就是我們需要生成的匯編代碼:

.text .global _start # Tell the loader we want to start at _start. _start: movl $2,%ebx # The argument to our system call. movl $1,%eax # The system call number of sys_exit is 1. int $0x80 # Send an interrupt

然后加上上面的詞法語法分析代碼,把這段匯編代碼寫進1個文件里。恭喜你!你已是1個編譯器的編寫者了!

Babyc 就是這樣誕生的,你可以在這里看到它最開始的模樣。

固然,如果匯編代碼沒辦法運行也是枉然。讓我們來用編譯器生成我們所希望的真實的匯編代碼。

# Heres the file we want to compile. $ cat return_two.c #include int main() { return 2; } # Run the compiler with this file. $ ./babyc return_two.c Written out.s. # Check the output looks sensible. $ cat out.s .text .global _start _start: movl $2, %ebx movl $1, %eax int $0x80

非常棒!接著讓我們來真實的運行1下編譯以后代碼來確保它能得到我們所想的結果。

# Assemble the file. We explicitly assemble as 32-bit # to avoid confusion on x86_64 machines. $ as out.s -o out.o -⑶2 # Link the file, again specifying 32-bit. $ ld -m elf_i386 -s -o out out.o # Run it! $ ./out # What was the return code? $ echo $? 2 # Woohoo!

我們踏出了第1步,接下去怎樣做就全看你了。你可以依照那篇文章所指點的全部做1遍,然后制作1個更加復雜的編譯器。你需要去寫1個更加精致的語法樹來生成匯編代碼。接下去的幾步分別是:(1)允許返回任意的值(比如,return 3; 1些可履行代碼);(2)添加對“非”的支持(比如,return ~1; 1些可履行代碼)。每個額外的特性都可以教你關于C語言的更多知識,編譯器究竟是怎樣履行的,和世界上其他編寫編譯器的人是如何想的。

這是構建 babyc 的方法。Babyc 現在已具有了if語句,循環,變量和最基礎的數據結構。歡迎你來check out它的代碼,但是我希望看完我的文章你能夠自己動手寫1個。

不要懼怕底層的1些事情。這是1個非常奇妙的世界。


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 91国色| 欧美成人在线视频 | 欧美一级日韩一级亚洲一级 | 爽a中文字幕一区 | 亚洲福利专区 | 日本免费乱人伦在线观看 | 第一精品福利 | 国产精品不卡高清在线观看 | 中文字幕第一页国产 | 午夜视频在线观看网站 | 欧美v日韩v亚洲v最新 | 秋霞一级特黄真人毛片 | 久久精品视 | 国产不卡高清在线观看视频 | 99视频精品全部在线播放 | 波多野结衣不卡 | 欧美天堂久久 | 偷拍自拍校园春色 | 自拍 欧美| 性欧美18xx| 免费网站在线观看国产v片 免费网站在线看 | free性欧美高清vide0s | 欧美黄色片一级 | 精品三级内地国产在线观看 | 欧美日韩免费看 | 亚洲天堂网址 | 免费网站成人亚洲 | 精品国产免费人成在线观看 | 欧美一区二区视频 | 一本大道香蕉大无线视频 | 手机看片国产免费 | 国产精品99久久久 | 涩涩视频www在线观看入口 | 国产高清成人吃奶成免费视频 | 日韩一级a毛片欧美区 | 一区二区三区在线视频播放 | www.在线观看视频 | 国产成人精品aaaa视频一区 | 亚洲精品一区二 | 成年人在线视频免费观看 | 久久国产精品久久国产片 |