隨想錄(lcc編譯器)

2021-09-27 13:59:28 字數 2225 閱讀 8602

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編譯器,有興趣的同學可以...