日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > php教程 > 程序設(shè)計基石與實踐系列之寫一個C語言編譯器

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

來源:程序員人生   發(fā)布時間:2016-03-01 08:18:33 閱讀次數(shù):2445次

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

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

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

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

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

int main() { return 2; }

沒有變量,沒有函數(shù)調(diào)用,沒有額外的依賴,乃至連if語句,循環(huán)語句都沒有,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匯編的相干網(wǎng)站。

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

.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下編譯以后代碼來確保它能得到我們所想的結(jié)果。

# 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個更加復(fù)雜的編譯器。你需要去寫1個更加精致的語法樹來生成匯編代碼。接下去的幾步分別是:(1)允許返回任意的值(比如,return 3; 1些可履行代碼);(2)添加對“非”的支持(比如,return ~1; 1些可履行代碼)。每個額外的特性都可以教你關(guān)于C語言的更多知識,編譯器究竟是怎樣履行的,和世界上其他編寫編譯器的人是如何想的。

這是構(gòu)建 babyc 的方法。Babyc 現(xiàn)在已具有了if語句,循環(huán),變量和最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)。歡迎你來check out它的代碼,但是我希望看完我的文章你能夠自己動手寫1個。

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


生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产精品一区二区在线 | 欧美一区免费 | 久久精品一区 | 久久不卡 | 日本伊人网 | 国产区网址| 牛牛视频在线 | 日本一二区不卡 | av高清在线 | 亚洲精品国产综合区久久久久久久 | 国产精品麻豆一区二区 | 黄色一级片在线免费观看 | 91在线播放观看 | 美女福利视频网站 | 欧美ⅹxxxxxx| 欧洲av免费 | 亚洲精品乱码久久久久久黑人 | 视频免费1区二区三区 | 精品在线一区二区三区 | 亚洲美女av网站 | 五月天激情婷婷 | 成人免费在线播放 | a三级黄色片| 日韩一区av | 精品91在线 | 午夜精品久久久久 | 亚洲视频在线观看 | 在线观看亚洲视频 | 日韩国产欧美一区二区 | 成人福利网 | 最新亚洲精品 | 国产成人精品午夜视频免费 | www.99精品 | 天天撸天天射 | 极品麻豆| 91久久国产综合久久蜜月精品 | www.久久精品 | 日韩午夜影院 | 免费人成在线观看网站 | 国产精品免费一区二区三区都可以 | 久久99精品久久久久久久久久久久 |