CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

3D图形编程语言--GPLD:设计与实现

楼主dayangxi2002()2005-08-01 14:33:52 在 C/C++ / C++ 语言 提问

前言  
  本书主要内容分两部分。前面一部分主要讲GPLD编译器的设计与实现,同时也介绍了相关工具LEX与YACC在windows平台上的使用。由于本书关注与具体实现编译器时会出现的问题以及相应的解决办法,因此在编译理论方面涉及不多,只是在必须要相关理论才能理解相应内容时才会提到,因此本书以实践为主。而后面一部分主要是讲述相应的GPLD的设计与实现。由于编译器的设计中,有些地方尽管很难,但其相关理论和研究很多,而且已经形成了一个标准,故还是有章可寻的,但虚拟机的设计与实现就不那么容易了,相关理论较之前者就少得多,而且没有形成一定的标准。  
   
  在讲GPLD编译器的具体设计与实现前,详细讲了编译器设计中需要的重要工具:LEX与YACC并附有相应的实列。  
   
  尽管不是我们每个人都要自己设计编译器,但编译器设计中的相关工具和技术在实践中有很大用处。实现一个基于真实机器的编译器的确很难,其牵涉到操作系统接口,编译器本身以及具体硬件平台特性相关的知识,但针对具体领域设计一个小的语言在实际中却是很平常的事,如游戏中的脚本语言系统。本书就这方面做了一个尝试,设计了一个针对3D图形学的编译器。当我们设计这种小语言的时候,由于不针对具体硬件平台,因此编译器的设计与实现难度就减少了不少。但同时为了让编译器产生的目标代码能运行,我们就必须自己实现其运行环境即虚拟机。而这个在理论上尽管没有编译原理复杂,但其实现的时候绝对不轻松,主要是相关理论不如编译器的   构造多,而且最主要的是没有形成一定的标准,更不用说相关的工具了。  
   
  关于编译器和虚拟机的书国内出一个一本《虚拟机的设计与实现:C/C++实现》,但其作者实现编译器时都是采用手工实现前期的分析工作,而这个在真正实现的时候不是那么必要的,特别是我们想提高生产效率的时候,因此本书实现编译器是采用的标准工具LEX与YACC。GPLD设计的最初目标就是为了减轻图形学编程的复杂,使其能用于快速建立3D图形模型。  
   
  关于编译原理相关的教材已经很多了,不管是国内还是国外,关于讲虚拟机的就很少了。至于讲一门语言的编译器的设计与实现,极其相应的虚拟机的设计与实现的,目前更是少。  
  因此我在这个方面做了一些尝试,希望本书所讲的一些东西能给读者的学习和工作带来便利。  
  ......  
   
  第一章   概论  
  概述  
  本章的内容是一些介绍性的东西,主要介绍什么是GPLD以及环境的搭建部分。  
  1.1什么是GPLD  
  GPLD是Graphics   Programming   Language   of   3D的简称,即是一种面向图形编程的编程语言,但目前还处在起步阶段。我最初设计它的根本原因,就是为了简化图形编程。下面是其一个实列程序:  
  ……  
  int   main(void)  
  {  
  float   earthR   =   0.3;//地球半径  
  float   theta1   =   0.0;//地球相对太阳公转角度  
  float   theta2   =   4;//地球自转角度  
  ……  
  //太阳,地球和月亮的球体  
  sphere   sun,   earth,   moon;  
  //设置背景纹理及相应的转动速度  
  textureb   "data/background.bmp",   0.2;  
  //设置与光照相关的一些参数  
  lighton   0;//打开光源0  
  ……  
  //为太阳,地球和月亮做相应的大小调节  
  ……  
  //分别为太阳,地球和月亮绑定相应的文理  
  texture   sun,   "data/sun.bmp";  
  texture   earth,   "data/earth.bmp";  
  texture   moon,   "data/moon.bmp";  
  //模拟太阳系中太阳,地球和月亮的运动  
  while(1){  
  //地球绕太阳公转  
  move   earth,   (earthR*cos(theta1),   0,   earthR*sin(theta1));  
  //改变地球公转角度  
  theta1   =   theta1   +   0.1;  
  rotate   earth,   theta2;  
   
  //月球绕地球公转  
  move   moon,   (earthR*cos(theta1)+moonR*cos(theta3+0.8),   0,    
                          earthR*sin(theta1)+moonR*sin(theta3+0.8));  
  //改变月球的公转角度  
  theta3   =   theta3   +   0.3;  
  rotate   moon,   theta4;    
   
  //以下为太阳,地球和月球的自转  
  rotate   sun,   theta5;  
  }  
  }  
  其经过GPLD编译器编译,运行效果如下:  
  <   这里为运行时截图   >  
   
  即效果为产生一个地月系的运行结果。  
  如上示,GPLD的语法类似C,但图形元素如球体等为其内建元素并有与此相关的操作指令。  
  关于GPLD的原始由来及相关一些历史信息见本书末尾。  
  ......  
   
   
  可惜这里不能上传东西,要不就把书和源代码上传上来了  
  要的可以联系我:dayangxi--2002@163.com  
   
  问题点数:50、回复次数:13Top

1 楼dayangxi2002()回复于 2005-08-01 14:35:18 得分 50

第八章   其它主题  
  概述  
  本章的内容不是讲GPLD虚拟机或编译器的设计与实现的,而是讲GPLD诞生前后的一些事以及一些其它主题方面的内容。权且当作我对其产生的历史性回顾以及开发过程中的点点滴滴。  
  8.1   GPLD的诞生  
  由于我们这学期同时开了编译原理和图形学方面的课,而我最初只对前者感兴趣,所以我前期图形学的课基本没有上,因为不感兴趣所以不想学。但同时编译原理的课我也基本没上,因为感兴趣,所以我想自己学,这样速度会快一些而且这种方式更适合我自己,幸运的是我的编译原理老师(岳建辉)很开明,他知道和不但没有反对或者阻挠,而是给了我大量的支持,在学的过程中遇到了我不能解决的问题,去问他时他也很耐心细致的给我讲解。  
   
  在最初学的时候,学了词法分析一章,自己用C手工写了个C语言的词法分析器。感觉这个还不是很难。后来学了语法分析的时候,也用C手工写了个表达式的求值的程序,而以前我也写过,不过那时是依靠堆栈来完成的,实现起来很麻烦而且功能不是很强大。自此,我开始重新审视编译原理这门课了,发觉其不仅在理论上很重要,而且在实际中有很大用途。而且开始景仰外国那些写编译器的人了。后来我开始学LEX与YACC,每次学习的时候,都会为其强大功能以及其与C语言的无缝衔接所折服。随着学习的深入,我打算自己写个编译器的想法越来越强烈。  
   
  于是到网上找了相关资料,看了那些资料后,更加有信心了。因为借助LEX与YACC的强大功能,我可以实现。于是我打算以脚本语言编译系统为目标实现一个,当时计划的时间是一个月。其实这个过程中还有个小插曲,本来我是想先写个正则表达式解析器,等哪个做完后再来着手写编译器。但由于其固有的难度,而且相关资料太少就放弃了。  
   
  后来我去上编译原理的课,主要是想问下老师如果我打算实现一个脚本语言需要注意什么问题以及看他有没有什么好的建议给我,但那次课打消了我的积极性,不是因为老师,而是因为一个人(付核伟)。  
   
  我门就在课堂是讨论,我给他说了我的想法,他说那样意义不大。他的意思总结起来有几点。首先,就算你实现了一个功能很强大的脚本语言,但你是在linux下实现,没人会用,除非你只是为了练手。因为我之前一直是在linux平台下工作的,实现时肯定是基于该平台。再者,脚本语言分那么多中,你没有明确到底要做针对什么的脚本语言。  
   
  其实后者我之前还真的没有想过。后来他建议我在linux下作个反汇编的东西,但后来我们又讨论到linux平台下遍地都是源代码,这个东西也没有什么实际价值。这里要补充一点的是,关于付核伟本人,在我们学院他要算比较强的人之一,对内核驱动和编程很熟悉,曾经写了个USB驱动,可以将他自己的游戏手柄当键盘用,而且写了两个版本,分别对应linux和windows。我们私交很好,因此对于他的意见我还是会认真考虑的。  
   
  就因为这件事后,写个脚本语言的念头打消了。后来我们图形学那们课要求用OpenGL做一个地月系的程序(GPLD的实列程序就是个地月系)。于是我开始看OpenGL的程序,但慢慢的,我就觉得其编程都是固定的框架而且当要绘制的东西比较复杂时比较烦琐,更进一步其要绘制的图形都是事先静态指定的,特别是后者让我非常不自在。于是我开始寻找一种可以简化OpenGL编程而且能动态指定所需要绘制的东西的一种方法。  
   
  于是在某月某天某顿饭的途中,突然想到我为什么不自己设计个语言,其有我喜欢的C语言的功能而又能象操作内建元素类型一样操作图形元素象三角形什么的,那不是很美好。为了庆祝我这个比较有意思的想法,我又去打了一份平时觉得贵不怎么吃的好菜。于是那一天剩下的时间我全花在打游戏看电影上了,因为我知道后面的日子我将会有事情做了而且估计会比较累。这正如古代犯人行刑前要吃个什么断头鸡一样。  
   
  于是第二天我就开始在网上找相关资料,然后可惜的是OpenGL的资料倒是找了不少,我真正想要的资料没有找到,那时还没有GPLD这个名字。而且我要真正做之前,一个问题是一定要解决的,那就是如何绕过OpenGL固定指定其要绘制的图形的限制。而关于这点我一直没有想到比较好的解决办法,我想可能是我对OpenGL还不熟悉导致的,于是我决定去向我的图形学老师(刘东权,Dong.C   Liu)求教。在和他的讨论中我发现其为OpenGL编程固有的特点,只有采取特殊的办法才可以绕过。于是我灵光一现,用一个命令队列将各种图形绘制命令保存起来,然后显示的时候其实就是依次执行里面的各种命令。  
   
  至此,思路已经开始渐渐清晰起来。在此,我不得不提及对GPLD的诞生有重要影响的一个人,刘东权老师,其后很多关键问题的解决都是在和他的讨论中得出的而且其也给了我很多建设性的建议,他是一个很好的老师。  
   
  于是这个最核心的问题的解决思路有了,下面就是准备开始具体做了。但我很快就遇到了问题,主要是三个方面的:1。LEX与YACC是与C高度耦合的,其能不能与C++配合使用呢。2。由于我要实现的东西其内核很多是关于图形学的,而我对此不了解。(早知道就去好好上图形学的课了)。3。windows编程我不熟悉,唯一稍微会点的就是VC而且也只编过控制台的程序。  
   
  关于第2点我觉得问题不大至少在初期而且在后期就算遇到相关问题后我可以求教与Mr。刘。而关于第3点主要是当时由于我的windows系统有点问题,GLUT库不能正常工作,只能用原始的OpenGL函数,而且我手里有一本OpenGL的书也是用的原始OpenGL函数加window   APIs来完成的,由于前期主要是编译器的设计与实现,而尽管windows编程虽然我不熟悉,但我查阅相关资料就可以解决,因此主要矛盾集中在第1点,即找一个windows下的LEX与YACC工具,而且最好能支持C++,而关于后者我是没有信心的。  
   
  目标明确后就是行动了。找工具倒没费什么工夫,很快就找到了,也就是我们本书所用的Parser   Generator。然而刚开始用的时候老是出问题,到网上也找不到使用Parser   Generator的相关资料。没有办法,就只有硬着头皮啃其自带的帮助文档,才发现其要进行很多设置在使用前尤其是第一次使用的时候。因此忙了两天我才把环境搭好了,用Parser   Generator产生的C++代码能通过VC编译运行了,我知道最难的开头部分我已经在不知不觉中度过了。搞完这个后我休息了一天。  
   
  之后就是实现其原始版本,这个大概花了四五天时间,当第一个原始测试版本成功运行时,我知道已经走过了前面最黑暗的阶段了,后续的工作也有了可以改善的基础了,为此高兴了很久,当然为了庆祝第一个原始版本的成功,我又堕落了一天(其实堕落真的很快乐)。  
   
  而且更重要的是,我正式为我的这个小project命名为GPLD,其原始意义为:Graphics   Programming   Language   by   Dayangxi。其中dayangxi为我的网名,当然其现在的意义也变为:Graphics   Programming   Language   of   3D了,主要是我认为应该将眼光放远一点,为了GPLD后续的发展,一定要有个好名字,因为中国有句古话叫做:名不正,言不顺。如下就是GPLD最原始的版本:  
  main   BEGIN  
  TRIANGLE   a    
  SHOW   a  
  main   END  
   
  其当时的版本号为0.0.2,当时可以说是GPLD的史前时代,没有控制流,不支持数学表达式和数学函数调用,不支持注释和空白行等等,反正一切程序设计语言应该有的都还没有。而且其当时还没有编译器和虚拟机的概念,文件分析模块和执行模块是绞在一起的,这样一直发展到0.1.8,直到那时,我才把文件分析模块和指令执行模块分开,各自发展为后来的GPLD编译器和GPLD虚拟机。并重新命名为GPLD编译器0.0.2和GPLD虚拟机0.0.2,所以这里的版本号与原始的0.0.2版本好是有很大不同的。现在虚拟机和编译器也发展到了0.0.8了。  
   
  Top

2 楼dayangxi2002()回复于 2005-08-01 14:36:08 得分 0

作为对这段回顾的结束,我们来看几个历史版本的实列,0.1.0版本如下:  
  #simlpe   example   of   GPLD   0.1.0   by   dayangxi    
  #date   :   2005/05/18  
   
  main   BEGIN  
  TRIANGLE   a   #creat   a   triagle    
  SHOW   a           #show   it  
  main   END  
   
  0.1.2版本如下:  
  #simlpe   test   example   of   GPLD   0.1.2   by   dayangxi    
  #date   :   2005/05/19  
   
  main   BEGIN  
  TRIANGLE   a   #creat   a   triagle    
  SHOW   a           #show   it  
  MOVE   a,   (1.8,   1.8,   0.0)  
  COLOR   a,   RED  
  MOVE   a,   (0.0,   -1.8,   0.0)  
  COLOR   a,   GREEN  
  MOVE   a,   (-1.8,   0.0,   0.5)  
  main   END  
   
  其中下面的版本为虚拟机和编译器分开后的,而且语法格式和成分相比以前有了很大的改进,0.0.4版本如下:  
  //simple   test   example   of   GPLD   Compiler(0.0.4)  
  //for   GPLD   0.1.6   by   dayangxi   date   :   2005/06/05  
   
  int   main(void)  
  {  
  float   a   =   0,   b   =1;  
  triangle   c;  
   
  if(a   <   b   ||   a   >   b   ||   a   ==   b){  
  break;  
  move   c,   (tan(a),   cos(1),   tan(b));  
  }else   if(!a){  
  continue;  
  a   =   10;  
  color   c,   RED;  
  }  
  }  
  到这里GPLD的发展可以说是有了里程杯的进步,具备的一种程序设计语言一些最基本的东西控制流结构。当然时间也过去快一个月了,如注释所见。  
   
  接下来的一个月,我没有继续做了,主要是在准备期末考试,而且学院内部发生了一些事使得我也没心情做了。在准备考试的一段时间基本没干什么事,说是准备考试,其实也没怎么准备,反正知道最后就是那么一会事,能及格就可以了,而关于这点我对自己比较有信心。  
   
  这样就到了7月份,才又继续接着以前的做。由于没有了考试,学院发生的一些事也看开了,所以接下来的GPLD的开发就比较快了,如下是0.1.8的版本:  
  //simple   test   example   of   GPLD   Compiler(0.0.4   E)  
  //for   GPLD   0.1.8   and   GPLD   runEngine   (0.0.4   E)  
  //by   dayangxi   date   :   2005/07/17  
   
  int   main(void)  
  {  
  ……  
  //太阳,地球和月亮的球体  
  sphere   sun,   earth,   moon;  
  ……  
  textureb   "data/background.bmp",   0.2;  
   
  ……  
  //模拟太阳系中太阳,地球和月亮的运动  
  while(1){  
  ……  
  }  
  }  
  也就是我们最后的实列GPLD程序,而此时编译器和虚拟机也都发展到了0.0.4。GPLD编译器和虚拟机0.0.6版本主要是改一些内部发现的BUG,至于GPLD的语法什么的没有改变。  
  最大的改变要算版本0.0.8了,虽然GPLD的语法还是没有怎么改变,但编译器和虚拟机内部改动很大,尤其是虚拟机部分,因为我将其体系结构做了更改以适应多线程,尽管现在看来没什么必要,但希望以后会有用。我们本书所讲的就是基于版本0.0.8。  
   
  这就是GPLD诞生前后发生的一些事,也算是我对其的一个历史回顾。  
  8.2   GPLD的未来  
  关于GPLD的明天会怎么样,我不知道。我最初打算设计它的目的是简化3D图形编程。因此其最好的归宿就是发展为一个用于快速建立3D图形模型的程序,尽管要到那一天还有很长一段路。  
   
  其发展到目前,但靠我个人的力量是很难让其有很大的发展的,毕竟我还是一个学生,有很多学生要做的事,而且最主要的我马上就要准备考研了(我成绩一般,因此不能保研,因此要进行郁闷无比的考研准备),没有那么多空闲时间来继续发展和完善GPLD了。也是基于这个目的,我才写这本书的,将其内部实现公布出来,除了作为大家参考和学习用之外,最主要的是让感兴趣的人都可以按照自己的想法和爱好来扩充和完善GPLD,这样如果最后把大家为此做的努力综合在一起,那GPLD的明天还是比较让人期待的。  
   
  尽管最开始的路是我走出来的,但还是希望靠大家的力量不断发展和壮大,也只有这样其才有可能生存下去并进一步的走向实用,正所谓越是个人的就越是大家的。  
   
  因此,如果你对GPLD进行了扩充和改善,希望能把你的成果公布出来,如果可能并发一份相关资料给我,我将感激不禁。  
   
  再丑也是自己的孩子,因此不管怎么样,我还是很关心GPLD的后续发展并希望其在大家的支持下不断发展张大,但谁知道最后的结果呢?  
  ......  
   
  附录E:   作者&指导老师简介  
  作者简介:  
  杨希(dayangxi),1983年出生,四川大学软件学院02级本科。感兴趣的方向:计算机网络,操作系统及编译原理等底层相关的东西。使用的开发语言:C和C++,平台为Linux平台。主要经历为,大三上学期在科银京成成都研发中心实习,在公司资深技术员工带领下协助移植uCLinux操作系统及一些网络应用软件。下学期前段时间在研究网络编程,后段时间在研究GPLD,暑假开始在指导老师实验室。目前同时也在准备考研中。  
   
  指导老师简介:  
  刘东权(Dong.C   Liu),1956年出生,博士,四川大学软件学院外籍教师。1978年获台湾清华大学应用数学硕士学位。1984年在美国伊利诺州西北大学获应用数学硕士学位,1987在美国伊利诺州西北大学获计算机科学博士学位,1987到1990年在美国伊利诺州西北大学从事大型最优化软件开发及实践方向博士后研究工作,曾担任,美国Bio—linaging   Research公司超声科学家,西门子美国超声总部首席科学家,美国CUSG科技长,美国TAISON公司执行长。获美国专利局18项专利。研究方向:应用数学数值分析,线形代数,最优化计算,计算机科学算法分析,计算机图形学,讯号及影象处理,软件工程,工业界经验医疗用超声研发。目前在四川大学软件学院任教。  
  ......  
   
  可惜这里不能上传东西,要不就把书和源代码上传上来了  
  要的可以联系我:dayangxi--2002@163.com  
  Top

3 楼jiajun2001(Jagen(嘉俊))回复于 2005-08-02 09:48:22 得分 0

发给我一份吧,Jagen@126.comTop

4 楼dayangxi2002()回复于 2005-08-02 17:25:24 得分 0

我已经发了,注意查收哈Top

5 楼zaisheng09(故雁)回复于 2005-08-02 17:36:32 得分 0

zaisheng08@126.com  
  学习Top

6 楼jiajun2001(Jagen(嘉俊))回复于 2005-08-02 23:22:35 得分 0

收到了,非常感谢啊!Top

7 楼jiajun2001(Jagen(嘉俊))回复于 2005-08-02 23:31:49 得分 0

能否把原代码也发给我,我现在也在研究编译器,希望我能帮得上忙!Top

8 楼dayangxi2002()回复于 2005-08-03 10:14:09 得分 0

编译器和虚拟机的源代码在书后的附录中哈Top

9 楼lda(laoyin)回复于 2005-08-08 18:08:53 得分 0

发给我一份吧,laoyin.com@163.comTop

10 楼lvjinhua(硬件&软件)回复于 2005-08-09 12:35:12 得分 0

很好!Top

11 楼dayangxi2002()回复于 2005-08-09 16:17:20 得分 0

to   laoyin.com@163.com   &   lvjinhua(硬件&软件)    
  我已经发了哈,希望对大家有所帮助,当然更希望大家对其进行改进和扩充...Top

12 楼laomai(老迈)回复于 2005-08-09 17:11:44 得分 0

是楼主自己写的还是转载的?Top

13 楼dayangxi2002()回复于 2005-08-09 17:25:43 得分 0

to   laomai(老迈)   :  
          我真名:杨希,网名:dayangxi,本书作者:杨希.那你说呢?呵呵Top

相关问题

  • vb图形编程问题~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  • 誰有《Windows图形编程》?
  • 求windows图形编程
  • 保护模式下的图形编程
  • 图形编程的重大发现!!!!
  • VC图形编程的高手请进
  • VB图形编程(200分送上)
  • 求图形编程方面的资料!!!
  • 有《Windows图形编程》这本书吗?
  • 急聘!!!!!!!!!!!Vc++图形编程高手!!!!

关键词

  • c++
  • 编译器
  • 图形
  • 虚拟机
  • 版本
  • 编译原理
  • 语言
  • 语法
  • 数学
  • 脚本语言

得分解答快速导航

  • 帖主:dayangxi2002
  • dayangxi2002

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo