大坡3D软件开发

关注3D软件技术

用户操作
[即时聊天] [发私信] [加为好友]
蔡军生ID:caimouse
1234573次访问,排名17好友254人,关注者406
C++,3D,VC++软件开发,写技术文章,操作系统开发
caimouse的文章
原创 602 篇
翻译 0 篇
转载 41 篇
评论 940 篇
蔡军生的公告

点击这里给我发消息

MSN: caimouse1976 at sina.com

最近评论
xavierye:发现另外一个源码分析blog,可以和楼主的一起看:
http://www.cnblogs.com/duguguiyu/archive/2008/10/02/1303095.html
xavierye:发现另外一个源码分析blog:
http://www.cnblogs.com/duguguiyu/archive/2008/10/02/1303095.html
shada:前面两个混帐,没资格评论开源。
用着盗版的Word写文章批评开源的人真不少。
shada:前面两个混帐,没资格评论开源。
用着盗版的Word写文章批评开源的人大有人在。
andylrj:Google的浏览器真差劲!!!体验一把真心说出,要做的事还很多,终于明白微软的IE为什么要做这么庞大了,做小确实不行!
文章分类
收藏
相册
3D引擎
第二人生
谷歌浏览器
开发板
历史回忆
常用连接
人生历程
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
2007年06月

原创 LCC编译器的源程序分析(47)计算需要使用栈大小

计算栈的大小,是通过后端接口的代码来完成计算的。栈的大小,主要就是局部变量、临时变量、调用参数和返回值等使用的字节大小,如果变量可以放到寄存器,就不需加到栈的大小里。阅读全文>

发表于 @ 2007年06月28日 22:55:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(46)计算需要使用栈大小

从目标代码里,可以看到下面一行: #009 sub esp, 16 在这行里是保留栈的大小,值为16。但16个字节是怎么样计算出来的呢?下面就来分析LCC的代码,看它是怎么样计算的。阅读全文>

发表于 @ 2007年06月27日 21:56:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(45)函数代码入口和出口的代码生成

由于C语言可以动态地分配局部变量,因此它的运行环境都是基于栈式的分配来实现的,所以在函数的入口就会生成一段分配栈的代码阅读全文>

发表于 @ 2007年06月23日 21:17:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(44)函数名称的代码生成

当把所有的源程序生成DAG表示后,就进入了编译器的最后处理阶段,LCC是把DAG生成汇编的目标代码。在这一阶段,编译器为源程序定义和使用的变量选择存储单元,并把中间指令翻译成完成相同任务的汇编代码指令序列。在代码生成里,需要处理的问题是存储管理、指令选择、寄存器分配、计算次序等等。阅读全文>

发表于 @ 2007年06月22日 21:42:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(43)赋值表达式的有向无环图

由于INDIR树与ADDRL树的类型相同,所以已经转换为ADDRL树,直接对ADDRL树进行进访问了,下面就是在函数listnodes里处理赋值表达式的ADDRL树阅读全文>

发表于 @ 2007年06月21日 23:08:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(42)赋值表达式的有向无环图

上一次说到赋值表达式转换为有向无环图的函数listnodes,下面继续来分析这个函数代码。 当赋值树处理时,就运行下面的分支来处理:阅读全文>

发表于 @ 2007年06月20日 23:13:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(41)赋值表达式的有向无环图

前面已经介绍怎么样把赋值表达式变换到树的中间表示,接着下来编译器要做的事情就是怎么样把树变换成有向无环图。也许你会问为什么要把树变换成有向无环图,而不是直接生成最终代码呢?其实,学习过数据结构就很清楚有向无环图的应用,编译器里就是利用有向无环图的特性来进行局部代码优化的,最主要的优化就是删除公共表达式。下面就来分析LCC从树到有向无环图的实现代码。阅读全文>

发表于 @ 2007年06月19日 23:55:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(40)赋值表达式树

前面分析了表达式的语法,也分析了语句的语法,但它们最终的目的就是生成合适的中间表示,在LCC里是采用树作为中间表示的。 现在就来分析语句生成什么样的树表示,下面的语句是来自例子里,如下: int nTest1 = 1; 这个语句是声明了一个局部变量nTest1,并且给nTest1赋值为1。LCC编译器要把它变换到分析树的表示,这样才利于后面的分析和使用。它的分析树如下: 左子树=右子树阅读全文>

发表于 @ 2007年06月18日 22:26:00|评论(loading...)|编辑

原创 在VC2005里使用STLPORT

听说STLPORT的性能不错,心动不如行,立即就上网下载STLPORT下来使用,先到下面的网址下载源程序: http://nchc.dl.sourceforge.net/sourceforge/stlport/STLport-5.1.3.zip 这个压缩包不是很大,才1.6M,很轻松地就下载完成了。阅读全文>

发表于 @ 2007年06月18日 13:56:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(39)goto语句

在现代设计的程序里,很少再用到goto语句了。虽然使用goto语句是比较高效,但它使程序也会得非常难懂,非常难维护,比较容易出错,所以很少使用goto语句的。goto语句为无条件跳转语句,它的一般形式为: goto 标号;阅读全文>

发表于 @ 2007年06月17日 11:23:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(38)return语句

在实现中,程序其实就是处理数据,然后输出处理过的结果,在C语句里最直接的方式就是函数的返回值。比如求两个数据的最大值,就可以通过函数返回值来返回最大值。而函数的返回值是通过函数中的return语句获得的。return语句后面是一个表达式,需要调用表达式函数来处理。阅读全文>

发表于 @ 2007年06月16日 20:07:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(37)default语句

default语句是使用在switch语句的复合语句里,它是所有其它分支不能处理时的分支处理。在LCC里是如下处理的: 阅读全文>

发表于 @ 2007年06月15日 21:28:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(36)case语句

case语句是使用在switch语句之中,它实现了选择一个分支执行。当表达式的值与case后面的常量表达式的值相等时,就执行此case语句后面的语句。LCC处理这个语句的代码如下:阅读全文>

发表于 @ 2007年06月14日 21:35:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(35)switch语句

switch语句是多分支选择语句,主要方便多个选择的情况使用,当然也可以使用if语句来实现,但嵌套的if语句过多会使用程序的可读性降低。阅读全文>

发表于 @ 2007年06月13日 19:04:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(34)continue语句

continue语句的作用是跳过循环体中后面尚未执行的语句,接着进行下一次是否执行循环的判断。比如下面的例子: while(表达式1) { … if(表达式2) continue; … }阅读全文>

发表于 @ 2007年06月12日 21:20:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(33)break语句

break语句可以使用流程跳出switch语句的分支选择,当然它还可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。但它不能用于循环语句和switch语句之外的其它语句中。 比如下面的例子: for(;;) { if( a++ > 100) break; } 阅读全文>

发表于 @ 2007年06月11日 21:55:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(32)for循环语句

C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况。因此,这个语句的使用频率是最高的,当然它的处理情况比上面两种循环要复杂一些。它的形式如下: for(表达式1;表达式2;表达式3) 语句1 它的执行过程是先求解表达式1的值,然后再计算表达式2的值。如果其值为真,就执行语句1,然后再执行表达式3。如果其值为假,就直接跳出循环不再执行语句1和表达式3。如果在C++里还会有作用域的范围不同样的。阅读全文>

发表于 @ 2007年06月10日 14:12:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(31)do while循环语句

do—while语句是实现“直到型”循环结构。一般形式如下: do { 语句1 }while(表达式)阅读全文>

发表于 @ 2007年06月09日 23:43:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(30)while循环语句

while语句的语义是这样定义的: while(表达式) 语句1 当表达式为非0值时执行while语句中的内嵌语句1。其特点就是先判断表达式的值,然后再执行语句。LCC是通过下面的代码来处理这个语句的:阅读全文>

发表于 @ 2007年06月08日 22:08:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(29)if条件语句

if语句是用来判定所给定的条件是否满足,根据判定的结果决定执行给出来的两种操作之一。if语句有下面三种形式: 1. if(表达式)语句 2. if(表达式)语句1 else 语句2 3. if(表达式1)语句1 else if(表达式2)语句2 else if(表达式3)语句3 else 语句4 那么LCC又是怎么样处理if语句的呢?阅读全文>

发表于 @ 2007年06月07日 21:39:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(28)函数表达式语句

前面已经介绍了很多表达式,但还没有介绍函数表达式语句,那么在LCC里是怎么样处理函数调用,也就是函数表达式的呢?现在就来分析函数表达式的代码,函数调用是使用非常多的,因此分析这里的代码,需要非常仔细地查看。阅读全文>

发表于 @ 2007年06月06日 21:45:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(27)基本语句

由前面的例子可以知道,C函数里包含数据定义部分和执行部分,执行部分就是由语句组成。计算机最基本的动作就是具备条件判断,这也是计算机具有这么大魔力的原因。而这些条件判断是通过语句来实现的阅读全文>

发表于 @ 2007年06月05日 21:25:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(26)逗号表达式

逗号表达式是优先级最低的表达式。像下面的例子: 1+2,2+3; a = (a,b,c); 还有在for语句中的使用: for(int a=3,b=4; a < 10; a++,b++) { } 要处理上面这些逗号表达式,在LCC里就需调用表达式处理函数expr,它的代码如下:阅读全文>

发表于 @ 2007年06月04日 21:18:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(25)赋值表达式

C语言是非常强大的,可以连续赋值的操作。将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且可以以表达式的形式出现在其它语句中,这是C语言灵活性的一种表现。 变量 赋值运算符 表达式阅读全文>

发表于 @ 2007年06月03日 18:11:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(24)条件表达式

C语言里条件表达式语句如下: 表达式1 ?表达式2 :表达式3 条件运算符要求有三个操作对象,称为三元运算符,它是C语言中唯一的一个三目运算符。比如计算两个值的最大值,就可以写成下面这样: int nMax = a > b ? a:b;阅读全文>

发表于 @ 2007年06月03日 18:10:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(23)一元运算表达式

前面分析了基本表达式,主要由常量和变量ID组成。接着下来,就需要分析优先级比较高的一元运算表达式了,主要由第1级和第2级运算符组成的运算,一般只需要一个操作数就可以运算的表达式。阅读全文>

发表于 @ 2007年06月03日 18:09:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(22)基本表达式

表达式是C编译器里最重要的一部份,由于表达式的使用是无所不在,任何的计算都需要使用到表达式运算。这次就带你去分析一下LCC编译器处理表达式的代码。 比如在例子里: int nTest1 = 1; int nTest2 = 2; 赋值语句的右边是一个表达式,阅读全文>

发表于 @ 2007年06月02日 20:57:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(21)局部变量的声明

局部变量的处理是比较特别,它是复杂语句里面声明,作用域也只限于复合语句里。阅读全文>

发表于 @ 2007年06月02日 20:55:00|评论(loading...)|编辑

原创 LCC编译器的源程序分析(20)复合语句

在C语言里,有一种语句叫做复合语句。它是由{ }把一些语句括起来的,如下面的例子: { y = x + 1; z = y + 2; } 在LCC里处理这样的复合语句的函数是compound,它在上面函数定义函数funcdefn是这样调用的:阅读全文>

发表于 @ 2007年06月01日 00:11:00|评论(loading...)|编辑

Csdn Blog version 3.1a
Copyright © 蔡军生