lcc编译器

转载 2013年12月05日 21:31:00

LCC,全称为"Local C Compiler"或"Little C Compiler",是一个小型自由的ANSI C编译器,源代码开放,由Chris Fraser和David Hanson设计开发。

源代码和文档

  lcc编译器的源代码可在 ftp.cs.princeton.edu (128.112.152.13) 服务器的pub/lcc目录下免费获得。关于lcc设计和实现最权威的书籍当属两位开发者合著的的经典<<A Retargetable C Compiler: Design and Implementation>> ,中文译本叫《可变目标C编译器——设计与实现》.

lcc设计

  对于lcc来说,并没有一个独立的设计阶段。lcc刚开始只是针对C语言的一个子集的编译器,所以其最初的设计目标非常有限,仅定位于针对一般的编译器实现、特别是代码生成的教学的需要。即使后来lcc演化成了适于实用的C编译器,这一设计目标仍然没有大的改变。
  lcc比大多数其他ANSI C编译器更小、更快。尽管有时在编译器设计时会忽视编译的速度,但快速仍是广为欣赏的特点,用户经常把速度作为他们使用lcc的原因之一。快速编译本身并不是设计的目标,它是追求简单、特别是注意编译器中严重影响速度的组成部分的实现的自然结果。lcc的词法分析和指令选择都特别快,对整个系统的速度贡献最大。
  lcc能够生成相当高效的目标代码,它以产生好的本地代码为设计目标,而其他优化编译器所具有的全局优化,不在lcc的设计目标之中。大多数现代编译器,特别是CPU供应商开发的编译器,必须采取尽可能的优化措施,以期在性能测试中突出他们的机器。这些编译器很复杂,一般需要数十人组成的小组进行开发。尽管这些高度优化的C编译器在启用优化选项时,产生的代码比lcc产生的代码更高效,但数百名使用lcc作为日常主要C编译器的开发者发现,对大多数应用来说,lcc产生的代码已经足够快了,同时,由于lcc的本身速速非常快,也帮助他们节约了许多时间。另外,系统开发者如果需要对lcc进行修改,则会发现lcc很容易理解。
  lcc的前端大约有9000行代码,每种与目标相关的代码生成器有700行代码,还有约1000行与目标无关的后端代码被所有的代码生成器共享。

  除个别例外,lcc的前端一般使用成熟的编译技术。lcc的词法分析器和递归下降分析器都是通过手工编写的(注:词法分析器另一个方法是通过LEX工具自动生成)。后端是lcc最令人感兴趣的模块,原因之一就是体现了它旨在提高可变目标能力的设计选择。第一,后端使用了代码生成器lburg,该产生器可以根据紧缩规范产生代码生成程序。第二,只要可能,一些明显依赖于目标机器的函数尽可能被移到前端实现。

为什么学习编译原理?

     其实编译原理的很多技术可以应用在其他地方,这里就不想展开了。学就是了。这么牛的一门技术如果学成也可以炫耀一下:),编译原理无疑是大本软件课程中最难的一门课。所以很多人也就仅仅停留在了解,即便有学过原理的也不想或无力搞出一个真实的编译器来,但。。。动手是最关键的也是学技术的最好的方法。

为什么选择lcc而不是gcc?

       我想这个问题还是比较好回答的:

lcc 是ANSI C编译器,是标准C编译器,仅仅支持标准规定的语法,所以规模很小。而gcc则是标准C的超集,它不仅能编译标准C而且做了很多扩展,因此gcc的代码量是非常惊人的,GCC早在1999年就由原来的GNU C COMPILER(GNU C编译器) 进化为GNU COMPILER COLLECTION(GNU 编译器家族),能编译C,C++,Pascal,Fortran,Ada,Object C等等,而且是目前支持平台最多的编译器,可以说只要稍微有点用途的平台都有相应的gcc版本,gcc产生的代码也是非常高效的,因为它的优化器相当出色。目前gcc最新版本是4.3.2,仅仅是C部分的代码量就有将近150万行!仅仅是想搞清源代码的架构都要数周甚至数月,更不要说阅读完毕了。而lcc的最新版本4.2却仅有近4万行的代码,这是比较小的,效率高的话大概几天就能看完。对初学者来说,gcc无疑是一个噩梦,初学者只需了解标准C就够了。学好lcc是比较快的,相对而言,gcc的代码是比较晦涩的。有个遗憾是lcc没有优化器。

C编译器LCC-win32的使用介绍

LCC-Win32介绍  目录  * 简介  * 编译器的安装  * Lcc-Win32的一些基本概念  * 写个小程序!  * 使用工程管理  * 第一个Windows程序  * 程序生成向导  *...
  • wnfc0729
  • wnfc0729
  • 2006年04月12日 17:07
  • 1005

lcc源代码详解之介绍

LCC,全称为"Local C Compiler"或"Little C Compiler",是一个小型自由的ANSI C编译器,源代码开放,由Chris Fraser和David Hanson设计开发...
  • b2b160
  • b2b160
  • 2009年03月26日 11:08
  • 3308

LCC编译器的源程序分析(64)符号表的结构注释

符号表是用来保存每个符号信息的,因为编译器分析源程序的过程会生成很多符号的属性,后端根据这些属性来生成合适的指令和代码的格式。 #001 //符号表结构.#002 //#003 //蔡军生 2007/...
  • caimouse
  • caimouse
  • 2007年08月10日 21:32
  • 3693

LCC编译器的源程序分析(2)LCC编译器的预处理

上面已经介绍了C编译器的目标,其实在实现这个目标之前,是经历了很多阶段处理的,其中第一个阶段的处理,就是预处理。预处理的任务是做什么呢?在LCC里预处理主要是把所有包含的头文件和源程序生成一个中间文件...
  • caimouse
  • caimouse
  • 2007年05月12日 21:37
  • 6843

LCC编译器的源程序分析(9)声明分析

 在语法分析里,最主要的组成部份是声明分析,并且这是C语言编译器最复杂的组成部分。由于任何变量都需要声明,那么怎么样知道这个变量声明是合法的呢?现在带着这个问题去分下面的代码。为了理解代码的工作,先来...
  • caimouse
  • caimouse
  • 2007年05月19日 23:26
  • 3390

LCC编译器的源程序分析(68)内存分配链表

LCC采用大块内存的方法,那它分配内存也是比较特殊的,它的源程序如下:#001 //大块内存结构。#002 struct block#003 {#004     struct block *next;...
  • caimouse
  • caimouse
  • 2007年08月26日 11:35
  • 3936

LCC编译器的源程序分析(66)DAG树分析例子

前面已经介绍创建分析树,下面就来详细地说明一个例子,看看到底生成什么样的分析树,C源程序如下:#005  int nTest1 = 1;#006  int nTest2 = 2;#007  int n...
  • caimouse
  • caimouse
  • 2007年08月13日 22:47
  • 4568

LCC编译器的源程序分析(4)(5)

 /*********************************** *作者:蔡军生  *出处:http://blog.csdn.net/caimouse/ ******************...
  • zheng80037
  • zheng80037
  • 2007年05月23日 12:58
  • 622

lcc源代码解析之types.c

最近好TM的忙啊,坑爹教练让每天五点钟起床去练车,平均每天至少有四个设备启动,运行中异常重启的问题报过来,我也是醉了。 今天终于有点时间继续写blog了,废话不多说,代码上。 今天解析lcc中的一...
  • jinnlxl
  • jinnlxl
  • 2014年12月18日 20:51
  • 743

lcc源代码解析之sym.c

lcc是一款小巧的工业级编译器,代码精简,代码开源,相比gcc更适合编译器初学者阅读。 你可以在这里搞到代码:https://github.com/drh/lcc 但是,怎么说呢,这个代码防盗性较强,...
  • jinnlxl
  • jinnlxl
  • 2014年11月30日 00:08
  • 781
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:lcc编译器
举报原因:
原因补充:

(最多只允许输入30个字)