﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Snowdream-随笔分类-Courses</title><link>http://www.blogjava.net/zellux/category/27574.html</link><description>迷茫的大二：读书 思考 等待</description><language>zh-cn</language><lastBuildDate>Sat, 17 May 2008 19:08:01 GMT</lastBuildDate><pubDate>Sat, 17 May 2008 19:08:01 GMT</pubDate><ttl>60</ttl><item><title>ICS Lab 6</title><link>http://www.blogjava.net/zellux/archive/2008/05/17/201170.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sat, 17 May 2008 14:28:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/05/17/201170.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/201170.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/05/17/201170.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/201170.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/201170.html</trackback:ping><description><![CDATA[重定向：<br /><br />主要用到open, close, read和write这几个函数，关于它们的使用方法可以使用<br />man 2 &lt;函数名&gt;<br />查看。<br /><br />这里简单介绍下：<br />Linux内核为每个进程维护了一张已打开的文件的表格，用File Descriptor（整型，以下简写成fd）可以访问到这些文件。所以很容易理解tsh.c中的函数listjobs为什么需要<br />一个output_fd的整型参数，注意它的后面有这么一行：<br />    if (writer(output_fd, buf, strlen(buf)) &lt; 0) …<br /><br />这一行就把前面构造好的buf字符串（包括当前进程的信息）输出到这个output_fd对应的文件中了。<br /><br />每个进程的值为0, 1, 2的fd都指向相同的文件，0对应标准输入（通常是键盘输入），1对应标准输出（通常为屏幕），2对应标准错误输出。<br /><br />可以看到在main方法的开头，有这么一句<br />    dup2(1, 2);<br /><br />dup2的作用是把参数二指向的文件改成和参数一一样（如果之前打开了文件，则先关闭），这句话的作用就是把原来要输出到标准错误端(stderr)的内容<br />输出到标准输出端(stdout)，便于调试。<br /><br />理解了fd和dup2的作用后，重定向也就很容易实现了，一种最简单的方法就是先用open函数打开输出文件并得到对应的fd，然后用dup2把标准输出/输入端的指向改成文件的fd<br />。<br /><br />另外注意用open创建输出重定向的文件的时候要加上S_IRUSR和S_IWUSR选项，否则创建后的文件没有读写权限。（不过好像这个lab的测试数据比较厚道，会事先touch一下，不加这两个选项应该也能通过测试）<br /><br />一些文档中未定义的行为：<br />argv<br />假如我输入的命令是/bin/ls -l &gt; ls.txt，对应的argv应该包括哪些内容呢？<br />一般的情况argv的内容应该是['/bin/ls', '-l']，后面的重定向符是不包括的不过在这个lab中似乎没有这个限制，不去掉重定向和管道部分应该还是能通过测试的。<br /><br />Job ID的分配<br />如果现在1, 2, 4号子任务在后台运行，再新增一个进程的话应该给它分配多少呢？<br />这个问题不需要处理，只要所有的jobs队列操作统一使用tsh.c中给出的几个函数就行。<br /><br />其他：<br />关于信号的转发、后台前台的转换等内容，文档和书上都说得很清楚了，这里不再赘述。<br /><br /><br />P.S. 多进程程序的调试大家之前应该接触的比较少，其实这个lab大致的代码不难写，难点在于细节上的debug比较困难，调试过程对第八章的理解很有帮助。<br /><img src ="http://www.blogjava.net/zellux/aggbug/201170.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-05-17 22:28 <a href="http://www.blogjava.net/zellux/archive/2008/05/17/201170.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ICS Lab 5</title><link>http://www.blogjava.net/zellux/archive/2008/04/26/196252.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sat, 26 Apr 2008 06:49:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/04/26/196252.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/196252.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/04/26/196252.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/196252.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/196252.html</trackback:ping><description><![CDATA[做一回标题党，因为这个lab太简单了 =,=<br /><br />记得要在真机上做，虚拟机里测出来的结果偏差很大。<br /><br />第一个问题就是unrolling/splitting一下，然后看看哪种情况下跑得最快<br /><br />第二个问题貌似更简单，换下循环顺序就差不多满分了，我一开始还以为要根据cachesize分下block然后拆开来做，囧<br /><br />酱紫，over<br /><br /><img src ="http://www.blogjava.net/zellux/aggbug/196252.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-04-26 14:49 <a href="http://www.blogjava.net/zellux/archive/2008/04/26/196252.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ICS Lab4 经验</title><link>http://www.blogjava.net/zellux/archive/2008/03/16/186642.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sun, 16 Mar 2008 11:16:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/03/16/186642.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/186642.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/03/16/186642.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/186642.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/186642.html</trackback:ping><description><![CDATA[  1. 编译<br /><br />
  不安装图形界面：<br />
  修改sim/Makefile，把前三行非注释部分用#注释掉，变成<br />
  # GUIMODE ...<br />
  # TKLIB ...<br />
  # TKINC ...<br />
  保存后运行make<br /><br />
  图形界面：<br />
  需要安装Tcl/Tk库<br />
  + Redhat 9：<br />  可以在Redhat菜单-&gt;System Settings-&gt;Add/Remove Applications中添加X Software Development，根据提示载入相关镜像文件。<br />  然后在sim目录下运行make<br />
  + Arch Linux：<br />
    有包管理机制的发行版直接用相关软件安装（比如Arch中pacman -S tcl tk），注意安装好以后生成的动态链接库可能带有版本号（比如libtcl8.5.so libtk8.5.so）<br />
    具体版本号通过pacman -Ql tcl tk | grep '\.so'查得<br />
    接着只要修改Makefile中的TKLIBS参数，或者用ln建个链接即可<br />
  + Ubuntu<br />
    由于ubuntu默认没有lex词法分析工具，在编译时需要先安装flex<br />
    <u>sudo apt-get install flex</u><br /><br />
    图形界面和Arch类似<br />
    <u>sudo apt-get install tcl8.5-dev tk8.5-dev tcl8.5 tk8.5</u><br />
    然后修改Makefile<br />
    ltcl-&gt;ltcl8.5<br />
    ltk-&gt;ltk8.5<br />
    /usr/local/lib/.. -&gt; /usr/lib/..<br />
    /usr/local/include/ -&gt; /usr/lib/tcl8.5/include/<br /><br />
  2. Part A<br />
  用y86写三个小程序，基本上仿照seq/asum.ys写就行了。装了图形界面的模拟器的话调试起来也很方便。<br />
  相关命令（假设在seq目录下）：<br />
  编译 <u>make asum.yo</u><br />
  运行 <u>../misc/yis asum.yo</u><br />
  调试 <u>./ssim -g asum.yo</u><br /><br />
  3. Part B<br />
  同样不需要花多少力气，把Homework 16的答案写成HCL语言就行，可以参照opl, irmovl, popl这三个指令的写法。<br />
  通过ICS主页上的Lab4.pdf中的几个测试命令即可。<br /><br />
  4. Part C<br />
  通过修改HCL和y86代码优化程序，最麻烦的一块。<br />
  在pipe目录下运行<u>./benchmark.pl -f ncopy.ys</u>，这个脚本就会自动运行一系列测试程序并计时，最后一行显示了平均所需的时间。<br />
  优化方法很多，系版的精华区的讨论帖里就有不少。<br />
  另外可以看看pipe/README这个文件，里面也说了几种方法。<br />
  最简单的就是实现iaddl指令，用它替换部分语句缩短时间；还有一个比较重要的就是loop unrolling，所谓loop unrolling就是把一个循环中的语句合并，减少循环次数。<br />
  用C语言简单的举一个例子<br />
  for (int i = 0; i &lt; 10; i++)<br />
      dst[i] = src[i];<br />
  把相邻两个循环合并起来，变成<br />
  for (int i = 0; i &lt; 10; i += 2) {<br />
      dst[i] = src[i];<br />
      dst[i + 1] = src[i + 1];<br />
  }<br />
  这样增加i的值的语句就从原来的10个减少到了现在的5个。<br />
另外这里还有一个潜在的好处，dst[i] = src[i]在执行的时候有个Load/Use Data
Hazards，会产生一个bubble，如果先读出src[i]，再读出src[i+1]，然后依次写入dst[i]，dst[i+1]，这样就可以消
去这个bubble，从而为每个元素节约一个左右的时钟数。<br /><br />
  测试方法：<br />
  先保证pipe-full.hcl中的iaddl语句的正确，make以后在ptest目录下运行<br /><u>
  make SIM=../pipe/psim TFLAGS=-i TFLAGS=-i</u><br />
之后在pipe目录下运行<u>./correctness.pl -f ncopy.ys</u>测试样例程序，通过以后再运行<u>./benchmark.pl -f ncopy.ys</u>就能看到这个程序的性能了。<br /><br />
5. 其他一些补充<br />
1) correctness.pl这个脚本测试时报的错误可能会和实际不一致，比如Bad count和Incorrect copying貌似会混淆。<br />
2) unrolling的时候建议写个专门生成相关代码片段的脚本，否则改起来太麻烦了。<br /><img src ="http://www.blogjava.net/zellux/aggbug/186642.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-03-16 19:16 <a href="http://www.blogjava.net/zellux/archive/2008/03/16/186642.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于计算机图形学的学习 原创 FatGarfield </title><link>http://www.blogjava.net/zellux/archive/2008/02/21/181080.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Thu, 21 Feb 2008 07:46:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/02/21/181080.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/181080.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/02/21/181080.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/181080.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/181080.html</trackback:ping><description><![CDATA[这学期想上这门课，纯属娱乐，不准备深入。<br />主要还是考虑到有机会和安然小朋友合作一个大程 ;-)<br /><br /><div class="postText"><strong>关于计算机图形学的学习</strong><br />注意： <br />本文尽量避免理论化的描述，试图用最通俗的语言介绍一下计算机图形学的学习，以及一些参考书目和网络资源； <br />本文不涉及对概念的定义，以免陷入学术讨论之中 <br />本文是作者学习计算机图形学的体会，如果有不同的意见，请不要攻击和漫骂 <br /><br />本文合适的题目应当是:白话说学计算机图形学？ <br /><br />1． 引言 <br />什么是计算机图形学？ 本文尽量避免给它做严格的定义，但是通常来说，计算机图形学是数字图象处理的逆过程，这只是一个不确切的定义，后面我们会看到，实际上，计算机图形学、数字图象处理和计算机视觉在很多地方的区别不是非常清晰的，很多概念是相通的。 <br />计算机图形学是用计算机来画东西的学科，数字图象处理是把外界获得的图象用计算机进行处理的学科。在法国，图形图象是一门课程。 <br />如何学习计算机图形学呢？除了计算机图形学的基础知识以外，你还需要有以下的知识，你懂的越多，当然做的越好。 <br />* 英语， 你一定要把英语学好，如果你想学习计算机图形学的话，尽量看英文的书籍和资料 <br />* 数学， 计算机图形学里面的数学用的比较多，，我们可以列举一些常用的： <br />高等数学，数值分析，微分几何，拓扑，概率， 插值理论，（偏）微分方程… <br />* 物理， 如果你要进行基于物理的建模，一些物理理论是要学习的： <br />力学（运动学，动力学，流体力学…），光学，有限元… <br />* 编程语言： C或C++是计算机图形学最通用的‘普通话’， <br />* 数据结构： 你需要数据结构来描述你的图形对象，除了通用的链表、树等数据结构外，图形学还有自己特殊的数据结构 <br />* 其他类别： 有的时候你需要其他学科的知识，根据你的需要去学习吧 <br /><br />上面列举的不是你必须学习的东西，而是计算机图形学可能会用到的东西，一定要记住，不要指望通过一本教材就学会计算机图形学，它比你想象的要复杂的多。 <br /><br />2． 图形学的问题 <br />每个学科都有自己学科的特定问题，图形学要解决的是如何画出图来，得到需要的效果，当然这是图形学最大的一个问题。 <br /><br />在开始学习计算机图形学的时候，找一本简单的书看，对计算机图形学有个大概的认识，你就可以开始图形学之旅了： <br /><br />OpenGL Programming Guide: The Official Guide to Learning OpenGL, Version 1.4, Fourth Edition <br />OpenGL SuperBible (3rd Edition)  <br /><br />是比较好的学习计算机图形学的入门教材，在练中去学，一开始就去啃 <br /><br />Foley的 <br />Computer Graphics: Principles and Practice, Second Edition in C  <br />不是好主意，会看的一头雾水，一本什么都讲的书的结果往往是什么都没讲清楚。 <br />当你把OpenGL的基本内容掌握之后，你对图形学就有了大概的了解了 <br /><br />那么下面你可以来学习一下计算机图形学的数据结构和算法，下面的书比较适合 <br />Joseph O'Rourke 的Computational Geometry in C，书里面有C的源代码，讲述简单，清晰，适合程序员学习 <br /><br />总的来说，计算机图形学涉及到2大部分：建模和渲染 <br />2.1建模 <br /><br />你想画一个东西，首先要有它的几何模型，那么这个几何模型从什么地方来呢？下面的书很不错的： <br />Gerald Farin 的Curves and Surfaces for CAGD: A Practical Guide <br />这本书就有一点的难度了，呵呵，要努力看啊 <br /><br />这本书算是CAGD (计算机辅助几何设计)的经典图书，CAGD方面的全貌，还有2本很好的讲述曲面的书Bezier和Nurbs的书 <br /><br />Les A. Piegl, Wayne Tiller 的The Nurbs Book  <br />书里面有NURBS曲线、曲面的程序伪代码，很容易改成C的，书讲的通俗、易懂，但是你要有耐心看的：） <br /><br />曲线与曲面的数学 <br />这本书是法国人写的中文翻译版，里面还有Bezie本人写的序J，翻译的很不错的，看了你就掌握Bezier曲面技术了 <br /><br /><br />//另外一些你想知道的事情：其他的造型方式-开始 <br />注意：在后面会有这样的章节，标明 <br />//另外一些你想知道的事情：其他的造型方式-开始 <br />//另外一些你想知道的事情：其他的造型方式-结束 <br />里面是我认为的一些高级话题，跳过他们不影响你学习计算机图形学，但是要学好就要注意了，呵呵 <br />还有其他的一些造型技术，比如： <br />隐式曲面(Implicit Surface)的造型： <br />就是用函数形式为F( x ,y ,z ) = 0的曲面进行造型，这样的造型技术适合描述动物器官一样的肉乎乎的东西，有2本书推荐大家 <br />Jules Bloomenthal编辑的Introduction to Implicit Surfaces，是一本专著，讲述了Implicit Surface建模型(Modeling)，面片化(Polygonization)，渲染(Rendering)的问题 <br />Luiz Velho 的 Implicit Objects Computer Graphics 也是一本专著，讲述个更新的一些进展 <br /><br />细分曲面（Subdivision Surface）造型 <br />当用NURBS做造型的时候，曲面拼接是复杂的问题，在动画的时候，可能产生撕裂或者褶皱，Subdivision Surface用来解决这个问题 <br />Joe Warren的Subdivision Methods for Geometric Design: A Constructive Approach就是这方面的专著 <br /><br />从实际物体中得到造型，现在的技术可以用三维扫描仪得到物体表面的点，然后根据这些点把物体的表面计算出来，称为重建(Reconstruction)，因为这些技术之在文章中论述，所以我们省略对它的描述 <br /><br />//另外一些你想知道的事情：其他的造型方式-结束 <br /><br /><br />下面还是一个高级话题：） <br /><br />//另外一些你想知道的事情：光有造型是不够的！-开始 <br />在你的几何模型做好之后，有一些问题需要对这个模型进一步处理，得到适合的模型，当面片很多的时候，或者模型很复杂的时候，需要对几何模型进行简化，才可以满足一些实时绘制的需要，这个技术叫做层次细节（LOD-Level of Detail）。下面的书就是讲这个的： <br />David Luebke编著的 Level of Detail for 3D Graphics <br />//另外一些你想知道的事情：光有造型是不够的！-结束 <br /><br />2.2渲染 <br />有了模型，怎么把这个几何模型画出来呢？这个步骤就是渲染啦 <br />如果你看了上面的OpenGL的书，那么你就知道一些渲染的知识了，但是别高兴的太早，OpenGL使用的是局部光照模型（Local Illumination Model），不要被这个词吓住了 <br /><br />Local illumination Model指的是在做渲染的时候只考虑光源和物体之间的相互作用，不考虑物体和物体之间的影响，所以OpenGL不支持阴影，一个（半）透明物体的效果..，这些需要考虑物体之间的影响才可以实现。 <br /><br />//另外一些你想知道的事情：OpenGL可以实现阴影-开始 <br />OpenGL本身不支持，但是通过一些方法可以实现的：），用Google搜索一下 <br />Shadow Volume, OpenGL就找到答案啦 <br />//另外一些你想知道的事情：OpenGL可以实现阴影-结束 <br /><br />Global Illumination Model 这类模型考虑的就比较全啦。现在关于Global Illumination的技术有3大类，具体的技术就不在这里介绍了，如果想了解，可以联系我，大家一起讨论： <br /><br />光线追踪(Ray Tracing) <br />关于Ray Tracing的好书有2本： <br /><br />Andrew Glassner 的An Introduction to Ray tracing  <br />Glasser是图形界的名人，这本书也是Ray Tracing的经典 <br /><br />R. Keith Morley, Peter Shirley 的Realistic Ray Tracing, Second Edition <br />这本书第一版是伪代码，第二版是C代码。它的结构不是很清楚，虎头蛇尾的感觉。 <br /><br />辐射度(Radiosity) <br />关于Radiosity的好书有4本： <br />Michael Cohen 的Radiosity and Realistic Image Synthesis ， Cohen获得SIGGRAPH 1998计算机图形学成就奖，他把Radiosity变成实际可用，现在Cohen在MSR图形<img height="15" alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" width="15" align="absBottom" border="0" /><a href="http://research.microsoft.com/~cohen/CohenSmallBW2.jpg" target="_blank">http://research.microsoft.com/~cohen/CohenSmallBW2.jpg</a><br /><br />Francois X. Sillion的Radiosity and Global Illumination ， Sillion是法国人，他的主要研究方向是Radiosity，这本书写的很不错的，非常清晰 <br /><br />Philip Dutre 的新书Advanced Global Illumination ，看起来还不错，刚拿到手，还没看，呵呵，所以不好评价 <br /><br />Ian Ashdown的Radiosity: A Programmer's Perspective  <br />有源代码的书啊！！ 就凭这个，得给5***** <br /><br />Photon mapping <br />这个我也不知道怎么翻译，呵呵。这个技术出现的比较晚，一本好书！ <br />Henrik Wann Jensen的Realistic Image Synthesis Using Photon Mapping <br />Henrik Wann Jensen是Photon mapping技术的发明者 <br /><br />3.3这些也是图形学吗？ 图形和图象的区别模糊了：（ <br />除了上面讲的‘经典’的计算机图形学，还有下面的一些东西，它们也叫计算机图形学吗？是的！！！ <br />3.3.1非真实性图形学（Non-Photorealistic Graphics） <br />真实性不是计算机图形学的唯一要求，比如：你给我画一个卡通效果的图出来，或者我要用计算机画水彩画怎么办？或者：把图象用文字拼出来怎么做？，解决这些问题要用到非真实性图形学， 好书继续推荐！！！ <br />Bruce Gooch, Amy Ashurst Gooch的 Non-Photorealistic Rendering  <br /><br />3.3.2体图形学(Volume Graphics) <br />用CT机做很多切片（比如头骨），那么能通过这些切片得到3D的头骨吗？Volume Graphics就是解决这样的问题的 <br />Min Chen 编著的Volume Graphics  <br /><br />上面的2个图形学技术就和图象的界限不明显了，实际上他们是图形图象的综合 <br /><br /><br />4 .还有其他的书吗？ <br />还有一些好书啊，呵呵，好书看不完的：），继续放送： <br /><br />Graphics Gems I ~ V，一大帮子人写的书，包括研究人员，程序员… <br />有计算机图形学的各种数据结构，编程技巧 <br /><br />Tomas Akenine-Moller 等人编著的Real-Time Rendering (2nd Edition)  <br />许多最新的计算机图形学进展 <br /><br />David Ebert等人的Texturing &amp; Modeling: A Procedural Approach, Third Edition  <br />讲述如何通过程序实现纹理、山、地形等图形学要素 <br />F. Kenton Musgrave号称分形狂(Fractal Mania) <br />Ken Perlin就是Perlin噪声的发明者，用过3d软件的人对Perlin Noise不会陌生的 <br /><br />关于图形学的特定对象，有特定的专题图书， <br />Evan Pipho Focus On 3D Models,对于图形学的常用模型格式，进行了讲解 <br />Trent Polack的 Focus On 3D Terrain Programming ，讲地形的 <br />Donald H. House 的Cloth Modeling and Animation ，讲布料的 <br />Nik Lever的Real-time 3D Character Animation with Visual C++ ，讲角色动画的 <br />…… <br /><br />还有：） <br />Richard Parent的 Computer Animation: Algorithms and Techniques，当然是讲动画的啦，呵呵。 <br />David H. Eberly的3D Game Engine Design : A Practical Approach to Real-Time Computer Graphics ，有代码的啊！呵呵：） <br /><br />最后，没事情的时候，看看下面的书吧 <br />Alan H. Watt， 3D Computer Graphics (3rd Edition)  <br /><br />James D. Foley等人的 Computer Graphics: Principles and Practice in C (2nd Edition) ，这本圣经没事的时候再看吧，呵呵 <br /><br />累了：（ 不说了，上面的书差不多了，还有一些shader的书，我不了解，以后会补上的：） <br /><br />5.从哪里找到这些书啊？还有什么资源啊？ <br />我保证，上面的书在www.amazon.com 都可以买到：） 别打我 <br /><br />那好，大部分的书在国家图书馆可以复印到，北京的兄弟有福啦，3年前的书借出来复印，1角/页，但是新书要早图书馆里复印，5~6角/页，还是比Amazon便宜啊，呵呵。 <br /><br />不行大家就到国外买，合买吧，还负担的起。 <br />我对DirectX不了解，所以没有涉及关于DirectX的内容：） <br /></div><img src ="http://www.blogjava.net/zellux/aggbug/181080.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-02-21 15:46 <a href="http://www.blogjava.net/zellux/archive/2008/02/21/181080.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>orz 虎书的一个比喻</title><link>http://www.blogjava.net/zellux/archive/2008/01/05/172985.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sat, 05 Jan 2008 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/01/05/172985.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/172985.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/01/05/172985.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/172985.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/172985.html</trackback:ping><description><![CDATA[<p>讲到out-of-bounds detection时，有这么一段<br />
One may say, by way of excuse, "but the language in which, I program has the kind of address arithmetics that makes it impossible to know the bounds of an array." Yes, and the man who shot his mother and father threw himself upon the mercy of the court because he was an orphan.<br />
很强大，很贴切</p>
<img src ="http://www.blogjava.net/zellux/aggbug/172985.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-01-05 16:36 <a href="http://www.blogjava.net/zellux/archive/2008/01/05/172985.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ICS Lab3 简易攻略</title><link>http://www.blogjava.net/zellux/archive/2007/12/15/167960.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sat, 15 Dec 2007 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/12/15/167960.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/167960.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/12/15/167960.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/167960.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/167960.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/zellux/archive/2007/12/15/167960.html'>阅读全文</a><img src ="http://www.blogjava.net/zellux/aggbug/167960.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-12-15 15:51 <a href="http://www.blogjava.net/zellux/archive/2007/12/15/167960.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用GraphViz画了ICS Lab1的call graph</title><link>http://www.blogjava.net/zellux/archive/2007/11/27/163536.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Tue, 27 Nov 2007 12:04:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/11/27/163536.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/163536.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/11/27/163536.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/163536.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/163536.html</trackback:ping><description><![CDATA[<p>其实关键的工具还是google的gprof2dot<br />
<a href="http://google-gprof2dot.googlecode.com/">http://google-gprof2dot.googlecode.com/</a><br />
<br />
四种风格，应该在生成dot的时候还可以设定其他信息，比如每个结点费时等，毕竟profiling这个指数更重要</p>
<br />
<img style="width: 369px; height: 286px" height="286" alt="" src="http://www.blogjava.net/images/blogjava_net/zellux/graph_circo.jpeg" width="369" border="0" /><img style="width: 447px; height: 346px" height="346" alt="" src="http://www.blogjava.net/images/blogjava_net/zellux/graph_fdp.jpeg" width="447" border="0" /><br />
<img style="width: 558px; height: 433px" height="433" alt="" src="http://www.blogjava.net/images/blogjava_net/zellux/graph_neato.jpeg" width="558" border="0" /><img style="width: 414px; height: 321px" height="321" alt="" src="http://www.blogjava.net/images/blogjava_net/zellux/graph_twopi.jpeg" width="414" border="0" /> 
<img src ="http://www.blogjava.net/zellux/aggbug/163536.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-11-27 20:04 <a href="http://www.blogjava.net/zellux/archive/2007/11/27/163536.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LL(1) 语法解析</title><link>http://www.blogjava.net/zellux/archive/2007/09/24/147878.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Mon, 24 Sep 2007 11:34:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/09/24/147878.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/147878.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/09/24/147878.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/147878.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/147878.html</trackback:ping><description><![CDATA[还是做一点笔记，记得牢一些<br />
<br />
有了follow和first集合后，就可以构造一张预测解析表(predictive parsing table)了。<br />
具体方法是：<br />
对于任一产生式X -&gt; &#402;，找到first(&#402;)中的每一个元素T，把X -&gt; &#402;填充到X行T列中去；<br />
如果&#402; nullable，还要把X -&gt; &#402;填充到X行follow(&#402;)列中去<br />
<br />
预测解析表构造完成后，如果某格中不止一个产生式，则说明该语法不适用于预测解析表；<br />
如果每格至多一个产生式，则该语法被称为LL(1)&nbsp; Left-to-right parse, Leftmost-derivation, 1-symbol lookahead&nbsp;&nbsp;&nbsp;&nbsp;
 <img src ="http://www.blogjava.net/zellux/aggbug/147878.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-09-24 19:34 <a href="http://www.blogjava.net/zellux/archive/2007/09/24/147878.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>总算弄明白生成first和follow集合的算法了</title><link>http://www.blogjava.net/zellux/archive/2007/09/23/147627.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sun, 23 Sep 2007 14:22:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/09/23/147627.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/147627.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/09/23/147627.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/147627.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/147627.html</trackback:ping><description><![CDATA[太笨了，看了好久才明白。。。<br />
first集合没有问题<br />
<br />
follow集合：<br />
以A -&gt; aBb为例，如果b nullable，则follow(B)包括follow(A)，原因很简单，把A看成一个整体，当作为production的右式时它后面直接跟的元素自然也可能是B后面直接跟的元素，因为b可能为空。<br />
<br />
理解follow集合的定义后，虎书上给出的算法<br />
if Yi+1 ... Yk are all nullable<br />
&nbsp;&nbsp;&nbsp; then FOLLOW(Yi) = FOLLOW(Yi) U FOLLOW(X)<br />
if Yi+1 ... Yj-1 are all nullable<br />
&nbsp;&nbsp;&nbsp; then FOLLOW(Yi) = FOLLOW(Yi) U FIRST(Yj)<br />
就不难理解了<br />
<br />
 <img src ="http://www.blogjava.net/zellux/aggbug/147627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-09-23 22:22 <a href="http://www.blogjava.net/zellux/archive/2007/09/23/147627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lex 使用笔记</title><link>http://www.blogjava.net/zellux/archive/2007/09/09/143841.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sun, 09 Sep 2007 14:22:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/09/09/143841.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/143841.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/09/09/143841.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/143841.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/143841.html</trackback:ping><description><![CDATA[<p>1. 写了个测试脚本，逐个测试testcases目录下的各个tiger程序，并统计出错数<br />
#!/usr/bin/python</p>
<p>from commands import *</p>
<p>countOk = countError = 0</p>
<p>for i in range(1,50):<br />
&nbsp;&nbsp;&nbsp; result = getstatusoutput('./lextest ../testcases/test%s.tig' % i)<br />
&nbsp;&nbsp;&nbsp; if (result[0] == 0):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print('Test case %s: OK' % i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; countOk += 1<br />
&nbsp;&nbsp;&nbsp; else:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print('Error on test case %s with errorno %s' % (i, result[0]))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; countError += 1</p>
<p>print("Total cases: %s" % (countOk + countError))<br />
print("Passed cases: %s" % (countOk))<br />
print("Failed cases: %s" % (countError))</p>
<p>2. 状态：<br />
定义的状态名不能与已经定义的变量/宏名冲突。在处理字符串的时候定义了个&lt;STRING&gt;状态，和tokens.h中的STRING冲突了，结果解析的时候被认成了BAD_TOKEN。<br />
</p>
 <img src ="http://www.blogjava.net/zellux/aggbug/143841.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-09-09 22:22 <a href="http://www.blogjava.net/zellux/archive/2007/09/09/143841.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lexical Analysis - Finite Automata</title><link>http://www.blogjava.net/zellux/archive/2007/09/06/143285.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Thu, 06 Sep 2007 14:09:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/09/06/143285.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/143285.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/09/06/143285.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/143285.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/143285.html</trackback:ping><description><![CDATA[<p>DFA(deterministic finite automaton): 从同一状态出发的边都标记有不同的符号<br />
<br />
可以把一个DFA用一个转置矩阵(transition matrix)表示，矩阵的第i行记录状态i向其他状态跳转的情况，edges[i][j]表示状态i时吃掉一个j符号后跳转到edges[i][j]状态。<br />
<br />
DFA的一个好处就是可以识别最长的匹配，比如对于IF8这个字符串，可以被识别为一个变量而不是一个关键字加数字。<br />
处理方法是保留最后一次自动机的终结状态Last-Final及其相对应的字符位置Input-Position-at-Last-Final。<br />
每次进入一个终结状态，就更新这两个变量。<br />
遇到死路(dead state, a nonfinal state with no output transitions)，通过这两个变量回复到上一个终结状态。<br />
<br />
NFA(nondeterministic finite automaton): 从同一状态出发的边可能标记有相同的符号<br />
由于从同一状态出发选择的路径可能有多条，非确定性自动机总是需要进行&#8220;猜测&#8221;，而且总要做出正确的猜测。</p>
  <img src ="http://www.blogjava.net/zellux/aggbug/143285.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-09-06 22:09 <a href="http://www.blogjava.net/zellux/archive/2007/09/06/143285.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BNF 文法 (1) - 语法树 | 二义性的解决</title><link>http://www.blogjava.net/zellux/archive/2007/07/27/132722.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Fri, 27 Jul 2007 03:28:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/07/27/132722.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/132722.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/07/27/132722.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/132722.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/132722.html</trackback:ping><description><![CDATA[1. 考虑表达式3 + 4的语法分析树，exp( exp(number (3)), op(+), exp(number (4)) )。<br>还有一种更为简单的表示方法，例如将(34 - 3) * 42表示为*(-(34, 3), 42)<br>后者被称为抽象语法树(abstract syntax tree)，它的效率更高，但是不能从中重新得到记号序列。<br><br><br>2. 简单的算术表达式的抽象语法树的数据类型<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">typedef&nbsp;</span><span style="COLOR: #0000ff">enum</span><span style="COLOR: #000000">&nbsp;{Plus,&nbsp;Minus,&nbsp;Times}&nbsp;OpKind;<br>typedef&nbsp;</span><span style="COLOR: #0000ff">enum</span><span style="COLOR: #000000">&nbsp;{OpKind,&nbsp;ConstKind}&nbsp;ExpKind;<br>typedef&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;streenode<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;ExpKind&nbsp;kind;<br>&nbsp;&nbsp;&nbsp;&nbsp;OpKind&nbsp;op;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;streenode&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">lchild,&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">rchild;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;val;<br>}&nbsp;STreeNode;<br>typedef&nbsp;STreeNode&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">SyntaxTree;</span></div>
<br><br>3. 简单算术文法的二义性解决<br>例如串34 - 3 * 42，可以有两种不同的分析树： <br>34 - 3 = 31, 31 * 42<br>3 * 42 = 126, 34 - 126<br>解决二义性的方法通常有两种，一种是设置消除二义性规则（disambiguating rule)，如设置运算符的优先权；另一种是将文法限制为只能分析成单一的分析树，如将上式表示为34 - (3 * 42)。<br><br>设置运算符的优先权<br>定义如下的简单表达式文法：<br>exp -&gt; exp addop exp | term<br>addop -&gt; + | -<br>term -&gt; term mulop term | factor<br>mulop -&gt; *<br>factor -&gt; (exp) | number<br>这样乘法被归在term规则下，而加减法被归在exp规则下，因此在分析树和语法树中加减法将更接近于根，由此也就接受了更低一级的优先权。<br>这样将算符放在不同的优先权级别中的办法是在语法说明中使用BNF的一个标准方法，成为优先级联(precedence cascade)。<br>接下来的问题就是如何让同级运算从左往右。<br>可以将表达式文法改为<br>exp -&gt; exp addop <span style="FONT-WEIGHT: bold; COLOR: red">term</span> | term<br>addop -&gt; + | -<br>term -&gt; term mulop <span style="FONT-WEIGHT: bold; COLOR: red">factor</span> | factor<br>mulop -&gt; *<br>factor -&gt; (exp) | number <br>这样就使得加法和减法左结合，而如果写成<br>exp -&gt; term addop exp | term<br>这样的形式，则会使得它们右结合。<br><br>4. else 悬挂的问题<br>简单 if 语句的文法<br>statement -&gt; if-stmt | other<br>if-stmt -&gt; if (exp) statement | if (exp) statement else statement<br>exp -&gt; 0 | 1<br>考虑串 if (0) if (1) other else other<br>这时else other的悬挂就出现了二义性，它既可以理解为是if (0)匹配失败后的选择，也可以理解为if (0)匹配成功，if (1) 匹配失败后的结果。<br>消除二义性的规则是<br>statement -&gt; matched-stmt | unmatched-stmt<br>matched-stmt -&gt; if (exp) matched-stmt else matched-stmt | other<br>unmatched-stmt -&gt; if (exp) statement | if (exp) matched-stmt else unmatched-stmt<br>exp -&gt; 0|1<br>由这个定义，上面的串就可以分析为<br>if (0)&nbsp; // unmatched-stmt<br>&nbsp;&nbsp;&nbsp; if (1) other else other&nbsp; // matched-stmt<br><br>另外一种解决方法就是在语法中解决这个问题。<br>可以要求出现else部分，或者使用一个分段关键字(bracketing keyword)，例如<br>if (1) then<br>&nbsp;&nbsp;&nbsp; if (0) then other<br>&nbsp;&nbsp;&nbsp; else other<br>&nbsp;&nbsp;&nbsp; endif<br>endif<br><br>
 <img src ="http://www.blogjava.net/zellux/aggbug/132722.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-07-27 11:28 <a href="http://www.blogjava.net/zellux/archive/2007/07/27/132722.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>总算成功的运行了个词法解析程序</title><link>http://www.blogjava.net/zellux/archive/2007/07/20/131502.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Fri, 20 Jul 2007 07:46:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/07/20/131502.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/131502.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/07/20/131502.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/131502.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/131502.html</trackback:ping><description><![CDATA[书上的例子，计算行号的，但是书中对行的定义是<br>line *.\n<br>貌似不正确，flex无法解析，改成line (.)*\n就可以了。<br>书上的样例也没有yywrap，写了个空函数。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">%</span><span style="color: #000000;">{<br></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;a&nbsp;Lex&nbsp;program&nbsp;that&nbsp;adds&nbsp;line&nbsp;numbers<br>&nbsp;&nbsp;&nbsp;to&nbsp;lines&nbsp;of&nbsp;text,&nbsp;printing&nbsp;the&nbsp;new&nbsp;text<br>&nbsp;&nbsp;&nbsp;to&nbsp;the&nbsp;standard&nbsp;output<br></span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;lineno&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br></span><span style="color: #000000;">%</span><span style="color: #000000;">}<br>line&nbsp;(.)</span><span style="color: #000000;">*</span><span style="color: #000000;">\n&nbsp;<br></span><span style="color: #000000;">%%</span><span style="color: #000000;"><br>{line}&nbsp;{&nbsp;printf&nbsp;(</span><span style="color: #000000;">"</span><span style="color: #000000;">%5d&nbsp;%s</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;lineno</span><span style="color: #000000;">++</span><span style="color: #000000;">,&nbsp;yytext);&nbsp;}<br></span><span style="color: #000000;">%%</span><span style="color: #000000;"><br>main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;yylex();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;yywrap()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}<br></span></div>
生成flex程序：flex linecount.lex<br>编译：gcc lex.yy.c<br>利用管道输入刚才的程序：cat linecount.lex | ./a.out<br><br><br> <img src ="http://www.blogjava.net/zellux/aggbug/131502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-07-20 15:46 <a href="http://www.blogjava.net/zellux/archive/2007/07/20/131502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lex约定</title><link>http://www.blogjava.net/zellux/archive/2007/07/20/131470.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Fri, 20 Jul 2007 06:35:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/07/20/131470.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/131470.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/07/20/131470.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/131470.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/131470.html</trackback:ping><description><![CDATA[<p>1. 允许将字符放在引号中作为真正的字符匹配。</p>
<p>例如要匹配\*可以写成<a>\\\</a>*，也可以是"\*"<br></p>
<p>2. 方括号中大多数元字符都可以无需引号直接引出。如("+"|"-")可以写成[-+]，但不能写成[+-]，因为-在中括号中可以作为表示范围的连字符。<br></p>
<p>3. 大括号可以指出正则表达式的名字，但不能递归调用。</p>
<p>nat [0-9]+</p>
<p>signedNat (+|-) ? {nat}</p>
<p>&nbsp;</p>
 <img src ="http://www.blogjava.net/zellux/aggbug/131470.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-07-20 14:35 <a href="http://www.blogjava.net/zellux/archive/2007/07/20/131470.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>还是关于编译器的优化</title><link>http://www.blogjava.net/zellux/archive/2007/07/19/131375.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Thu, 19 Jul 2007 15:41:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/07/19/131375.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/131375.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/07/19/131375.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/131375.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/131375.html</trackback:ping><description><![CDATA[装了fcitx以后thunderbird罢工了。。。现在只能用Google groups上新闻组了，不过fcitx的确不错的说。<br><br>cs书上的一个习题，在执行i=0这样的命令时是用: xorl %edx, %edx <br>为什么不用 movl $0, %edx呢？
<br>老大: 一般的说立即数的存取是内存操作，而前一条指令是寄存器操作。所以Itanium上有专门的寄存器放0. <br>SecretVan@smth.org: 可能跟标志位有关系，如xor清零后紧跟一个条件跳转。
<br>先把这些回答放这，以后在回过头来看。<br><br> <img src ="http://www.blogjava.net/zellux/aggbug/131375.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-07-19 23:41 <a href="http://www.blogjava.net/zellux/archive/2007/07/19/131375.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个编译器优化问题</title><link>http://www.blogjava.net/zellux/archive/2007/07/19/131179.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 18 Jul 2007 16:51:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/07/19/131179.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/131179.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/07/19/131179.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/131179.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/131179.html</trackback:ping><description><![CDATA[看到汇编中的基本运算这一节，想看看传说中的编译器把a*2优化为a&lt;&lt;1是不是真的呢，写了个函数试了下：<br>int func(int x)<br>{<br>&nbsp;&nbsp;&nbsp; return x * 2;<br>}<br>用gcc -O2 -S test.c
编译，发现优化后是用了加法，而不是位移<br>func:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pushl&nbsp;&nbsp; %ebp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; movl&nbsp;&nbsp;&nbsp; %esp, %ebp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; movl&nbsp;&nbsp;&nbsp; 8(%ebp), %eax<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; popl&nbsp;&nbsp;&nbsp; %ebp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addl&nbsp;&nbsp;&nbsp; %eax, %eax<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret <br>BBS上问了，老大说一般加法不会慢。<br>又试了一下把*2改成*3，仍然是使用leal&nbsp;&nbsp; &nbsp;(%eax,%eax,2), %eax进行加法操作完成的，而改成*4就使用位移了。<br>其他回答：<br>SecretVan@smth.org: CISC指令集上更倾向于选择功能一样而长度较短的指令，带了立即数之后指令就长了，如果使用寄存器那更得不偿失<br>Nineveh@smth.org: 因为 add 的长度短于或等于 sal，速度快于或等于 sal，吞吐量大于或等于 sal。
<br>lib@rygh: 在P4里面我记得一条加法指令是0.5个cycle.移位指令撑死了也要0.5个cycle吧，没听说过有0.25cycle的指令。
<br> <img src ="http://www.blogjava.net/zellux/aggbug/131179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-07-19 00:51 <a href="http://www.blogjava.net/zellux/archive/2007/07/19/131179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式</title><link>http://www.blogjava.net/zellux/archive/2007/07/17/130924.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Tue, 17 Jul 2007 12:46:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/07/17/130924.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/130924.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/07/17/130924.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/130924.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/130924.html</trackback:ping><description><![CDATA[<p>1. {a, b, c}上的串S中，任何两个b都不相连，用正则表达式表示为<br>(a|c|ba|bc)*(b|空)</p>
<p>&nbsp;<br>2. Pascal注释的表示</p>
<p>{(~})*}<br>{ } 中间为任意非}的符号，注意表达的严谨<br></p>
<p>&nbsp;</p>
<p>3. C注释的表示就困难很多</p>
<p>例如要表示ba ...(没有ab)... ab这样的字符串，不能简单的写成</p>
<p>ba(~(ab))*ab</p>
<p>因为~非运算符通常只适用于单字符，否则容易产生混淆。</p>
<p>b*(a*~(a|b)b*)*a*</p>
<p>像这样的定义很难读，而且难以证明其正确性，因此在真正的扫描程序中通常用特殊方法解决。 </p>
 <img src ="http://www.blogjava.net/zellux/aggbug/130924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-07-17 20:46 <a href="http://www.blogjava.net/zellux/archive/2007/07/17/130924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>