lcc編譯器是一款開源編譯器,和我們之前談過的ucc差不多。一開始的時候,這款編譯器是用來進行教學使用的,但是後來越來越多的人開始了解它、使用它,並且將這款編譯器用到實際專案當中。當前一般的用法就是利用lcc將c檔案轉變成asm彙編檔案,這種使用方法是最常見的。如果我們自己開發的程式是微控制器軟體、或者是其他不需要linux平台執行的單機軟體,使用lcc還是很方便的。
當然,不管是ucc還是lcc,一開始這兩個編譯器還是gcc編譯的,後續其實就可以自己編譯自己了。
1、**位址
2、編譯平台
ubuntu16.04
3、編譯方法
shell> unzip lcc-master.zip
shell> cd lcc-master
shell> mkdir output
shell> make builddir=./output hostfile=etc/linux.c all
4、生成的檔案
如果順利的話,我們會在output目錄下面看到這些執行檔案,
shell$ ls -l
total 1224
-rwxrwxr-x 1 fxx fxx 27640 10月 3 21:32 bprint
-rwxrwxr-x 1 fxx fxx 86488 10月 3 21:32 cpp
-rwxrwxr-x 1 fxx fxx 50960 10月 3 21:32 lburg
-rwxrwxr-x 1 fxx fxx 42984 10月 3 21:32 lcc
-rwxrwxr-x 1 fxx fxx 1034264 10月 3 21:32 rcc
5、各個檔案的作用
bprint主要是列印out檔案
cpp是對c檔案進行預處理,包括標頭檔案、巨集等等
lburg是自動生成cpu後端檔案,比如alpha.c、mips.c、x86.c、sparc.c、x86linux.c等等
lcc是驅動器,它負責將rcc生成的asm編譯成執行檔案,使用的工具是as、ld
rcc就是c編譯器
注意:這裡的cpp可以直接給其他的c編譯器使用,用來進行標頭檔案預處理,十分方便。
6、開始準備編譯,可以準備乙個簡單的檔案,比如hello.c
int iteratet(int a)
7、輸入編譯的命令
shell> cd output
shell> ./rcc -target=x86/linux hello.c -o hello.asm
8、開啟hello.asm檔案
.globl iteratet
.text
.align 16
.type iteratet,@function
iteratet:
pushl %ebp
pushl %ebx
pushl %esi
pushl %edi
movl %esp,%ebp
cmpl $0,20(%ebp)
jne .lc2
mov $0,%eax
jmp .lc1
.lc2:
movl 20(%ebp),%edi
subl $1,%edi
pushl %edi
call iterate
addl $4,%esp
movl %eax,%edi
movl 20(%ebp),%esi
leal (%esi,%edi),%eax
.lc1:
movl %ebp,%esp
popl %edi
popl %esi
popl %ebx
popl %ebp
ret.lf4:
.size iteratet,.lf4-iteratet
.ident "lcc: 4.2"
9、關於lcc的一本書
《a retargetable c compiler》
其他:
在讀書的時候,編譯器就是比較難學的一門課程。工業生產中常用的gcc**又太大了,不適合學習。因此像lcc這樣兼顧學習和工業質量的編譯器,其實是很難得。大家可以將它用在自己的工作或者實際產品當中,就像遊戲中常用的lua一樣。甚至可以對其進行改造,用來做**越界測試、效能分析測試、安全保護測試,都是大有裨益的。
隨想錄(c編譯器的實現)
無意中在github上發現乙個很有意思的專案,比如這裡它利用flex實現了字串的識別,利用bison實現了ast語法樹的構建,最後直接利用ast進行計算和識別。ast節點遍歷的時候,作者應該是根左右遍歷的,其實左右根遍歷或許更好一些。注意,語法解析的時候肯定是樹的結構,但是不一定是二叉樹。比如,它的...
隨想錄(編譯器是怎麼工作的)
其實,現在的編譯器早已經突破了原來的概念。比如說,編譯器最終的 不一定在實際機器上執行,可能是虛擬機器 編譯器編譯語言時不一定需要生成可執行檔案,能解釋就行 編譯器最好並行編譯 編譯器不一定很大,可能十幾個檔案就可以,比如說lua等等。不過,我們今天說的編譯器還是比較傳統的c編譯器,有興趣的同學可以...
隨想錄(編譯器是怎麼工作的)
其實,現在的編譯器早已經突破了原來的概念。比如說,編譯器最終的 不一定在實際機器上執行,可能是虛擬機器 編譯器編譯語言時不一定需要生成可執行檔案,能解釋就行 編譯器最好並行編譯 編譯器不一定很大,可能十幾個檔案就可以,比如說lua等等。不過,我們今天說的編譯器還是比較傳統的c編譯器,有興趣的同學可以...