随想录(lcc编译器)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

 

    lcc编译器是一款开源编译器,和我们之前谈过的ucc差不多。一开始的时候,这款编译器是用来进行教学使用的,但是后来越来越多的人开始了解它、使用它,并且将这款编译器用到实际项目当中。当前一般的用法就是利用lcc将c文件转变成asm汇编文件,这种使用方法是最常见的。如果我们自己开发的程序是单片机软件、或者是其他不需要linux平台运行的单机软件,使用lcc还是很方便的。

 

    当然,不管是ucc还是lcc,一开始这两个编译器还是gcc编译的,后续其实就可以自己编译自己了。

 

1、代码地址

https://github.com/drh/lcc

 

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)
{
        if(a == 0)
                return 0;
        else
                return iterate(a-1) +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一样。甚至可以对其进行改造,用来做代码越界测试、性能分析测试、安全保护测试,都是大有裨益的。

 

你可能感兴趣的:(随想录(lcc编译器))