随笔-10  评论-133  文章-0  trackbacks-0
  2011年12月16日

(很荣幸被华南理工大学软件学院邀请撰写此文,关于毕业那会儿找工作的一些事情)

 

前些日子被华南理工大学软件学院邀请回去参加一些活动,其中包括跟一些师弟师妹们进行座谈。期间就有一个人问,要怎么样才可以去微软。其实我从来没有想过这个问题,所以那个时候的答案自然就是微软的广告(编程好,数学好,态度好)了。09年大四那会儿,刚好碰上了美帝的次贷危机,令我们这些想去美帝的公司被剥削的这帮人倍感艰辛。所幸后来还是过五关斩六将,最后在实习结束之后成功留了下来。这其中的因果,显然不是面试的那几天所能够决定的,因此还得从hello world讲起。

 

我有幸从初二开始就学习编程。那个时候世界已经处于一个现代化的程度了,操作系统都有虚拟内存,有图形界面,有因特网,开发软件还有集成开发环境可用,跟一些老前辈所描述的编译一个程序还要换几次磁盘的日子已经完全不一样了。那个时候正值购买电脑半年,处于看见什么东西都感到十分好奇的时候,再加上父亲那个时候不太同意我玩游戏,所以我就在想什么时候也自己做几个游戏,就可以光明正大的玩了。所以在听到汕头华侨中学开Visual Basic 5.0的课的时候,感到比较兴奋。但是其兴奋程度比起初一为了上第一节电脑课兴奋过度,骑自行车超速以至于留了一大堆血没了几颗牙的那一天,已经可以忽略了。

 

那个时候还是21世纪的第一年,正处于上网费用巨贵无比、Google还刚起来没多久基本没人知道的时候,学习编程要比现在困难很多。当时想寻找什么知识,因特网基本上是没什么指望的,所以我就有了一个没事去书店的爱好。没过多久我就找到了一本《Visual Studio高级图形程序设计教程》。这本书我很喜欢,插图十分漂亮,而且还是使用Visual Basic编程绘制的,更是爱不释手。可惜内容过于高深,所以后来就有了初三的时候自学学会初步的立体解析几何,以及高三上课不听讲仅凭自己看数学分析后来还被我看明白了的故事。中间因为试图使用编程绘制很多复杂的图形和对图像进行各种复杂的变换,于是每当写程序之前都要在纸上推导长长的公式。如果程序的运行结果不对了,根本无从调试,只好重新推导,借以希望可以发现公式的几个bug以解释为什么会出现错误。从此以后我对符号运算就十分拿手。而且做数学物理作业也好,为了编程推导公式也好,需要计算的东西太多懒得到处寻找废纸,从而便获得了心算复杂过程的本领(可惜现在已经丧失了)。这顺带还给我带来了一个好处,就是高考数学选择题在发卷后不许动笔的10分钟内就被我全部心算出答案,而且全对了。

 

图形编程做久了,就想起了当初的理想,于是就搞游戏去了。那会儿看到了成都金点工作组开发的《圣剑英雄传》,点燃了我开发RPG的热情。在经历了几次失败之后,我终于在高二的正月初一那一天完成了《天地传》的所有编码工作,没过多久就上传到了GameRes的网站上。这是我第一个行数过万的程序。为了顺利完成它,我悟到了很多道理,包括为什么要面向对象,为什么要划分模块减少互相依赖。这也成为我后来开发自绘图形界面和脚本引擎的契机。后来我试图用OpenGL3D游戏,但是由于很难找到有共同爱好的美工跟我一起做,便作罢了。但是这却让我获得了很多时间,可以投入到图形界面和脚本引擎之中去。

 

后来我就萌发了解释高级语言的想法。这是我整个编程历史上的第一个转折点。那个时候我数据结构只会用链表,而且编译原理也好,设计模式也好,都还没听过。那个时候去解释高级语言自然是比较困难的。因此我经过很多天的苦思冥想自己想出了一个如今称之为一遍编译(也就是很烂)的方法来把一个简单的高级语言重新处理成一个简单的指令集语言,就跟汇编长得差不多。那个时候已经高三了,所以其实也没多少时间可以投入在编程上面,因此做出来的第一个原型是一个简化后的Pascal的解释器,用Delphi开发的。现在想起来,里面肯定有巨多内存泄露和性能问题,不过当时根本不知道这些东西是什么。在高中毕业之后的三个月无所事事的日子里,我就重新把这个东西设计了一遍,得到了一个几十页的计划。由于后来没来得及做完,就打印出来带去了华南理工大学。

 

刚进了大学没几天,就听一个大四的师姐说我们的班主任陈健老师是教编译原理的,于是我就把这一叠纸拿给了她看。她什么也没说(现在回想起来,只能是那一份设计实在是不堪入目……),就给了我一本编译原理的课本。我很快就看完了,然后用了里面的知识做了第一个真正意义上的脚本引擎,语法山寨了Java语言的一些简单的部分,还添加了一个编译的时候自动把模板参数都改成Object类型的语法,起了个名字叫JoveScript。后来上了Java的课,发现Java竟然真的这么干了,让我觉得好生奇怪。

 

后来我陆陆续续写了很多脚本引擎。大一的时候做的JoveScript是第一个我觉得还能见人的脚本引擎。第二个就是大二失败了一整年吸取了很多教训之后,于大三开发出的动态语言,名字叫FreeScript(可以在我的博客http://www.cppblog.com/vczh上找到)。最近正在打算将其更新到3.0来配合一个正在开发中的显卡加速的GUI类库GacUI。接下来就是在去微软上海的WCF Tools组实习的那一段时间里面,利用每天晚上的时间完成的一门纯函数式语言叫KernelFP,这后来成为了我的毕业设计。提交了毕业设计之后,我又在毕业前的几个月时间里面完成了CMinus。这不是编译原理课程设计上的那个简单到没法再简单的CMinus,而是一个完整的C语言编译器(其中函数指针的语法被我改掉了,但是仍然支持)。其编译结果是保存到内存中的一段X86二进制代码,可以将函数的起始地址强制转换成函数指针直接在C++程序中使用,这是因为我在生成指令的时候遵守了Visual C++中的一些在MSDN里描述得很清楚的约定。毕业后我又雄心勃勃地做了NativeX,是一个带泛型以及concept mappingC语言。前几个月我又试图山寨C#,但是无奈C#实在是太复杂,所以转而去做GacUI。图形界面(GUI)类库我也写了不少。继高中的时候为RPG而开发的两个控件类库之后,在上大学的过程中使用OpenGL开发的两次GUI类库均告失败。后来还封装了一次WindowsAPIVczh GUI),试图让其易用性接近VCLWinForm。毕业后我又尝试发了若干次基于渲染的GUI,换了几次架构,一直到现在正在开发的GacUI才感觉走上了正轨。我在这个过程中得到的一个结论就是:Windows Presentation Foundation的设计实在是太完美了……在做这些东西之余,我还开发了三次三维物体的软件渲染程序,前两个是在毕业前做的,最后一个是一年前因为一下子不知道要如何利用业余时间来充实生活而开发出来的,目的是用于打发时间。

 

在这里我想可以回答一个月前不能很好地回答师弟师妹们的一个问题了。如何能够在微软找到工作?因为我把我上面做的这些东西都写进了简历。同时如果你们到了大四才来问这个,就已经太迟了……

 

值得一提的是,我从大三开始指导一名基础几乎是零的、比我低两个年级的软件学院的一位学生学习编程。为了让对方在接受我为期3年的训练之后有扎实的C++基础、熟练的单元测试编写水平以及能够靠直觉给出一些不算太差的设计,我回顾了许多关于C++的内容,特别是给指针的几节课备课了好几天,并且每一天都要出一个作业。在这个过程中我深刻的感觉到,如果要快速提高自己的编程水平的话,你必须总是去做一些你做得出来,但是难度大到只要再难一点点你就做不出来的事情。再这么坚持好些年之后,肯定会进入高手的行列。因此我在安排作业的过程中,有意推迟了关于指针的内容。首先让对方接受变量和分支循环,然后要养成一个好的风格(譬如说不能老是用一个字母给变量命名之类),然后学会操作数组,接下来才是关于没有强制类型转换的指针的一些操作,并且在一个月之内做出一个带单元测试的字符串类。指针的重点是要对方深刻的理解,“指针本身就是一个指向位置的数字”这么一个概念。为此我特别设计(但没有实现)了一门只带有一个全局无限长数组的汇编语言来讲述指针背后一些复杂的概念。之后就是一些关于面向对象的知识、设计模式的知识、还有跟脚本引擎有关的一些东西。该学生的毕业设计是一个简单的动态语言的脚本引擎,并且该脚本引擎的实现正确地运行了我在上面模仿Linq的一个列表处理函数库。这个实现闭包一层套一层,到处都在给一个物体添加删除函数,创建各种延迟执行的迭代器,很是能够考验一个脚本引擎的实现。对方毕业后被网易招去了,并且在待遇上给予了一些人文关怀。

 

自己的编程历程不仅包括自己在业余时间内做的这些程序,而且也包括在微软实习和工作的过程。高中的时候就听说了华南理工大学有微软俱乐部的事情,再加上自己对微软也持有一定的向往,因此在入学之后,除了学院的学生会以外,我就一直在密切关注着微软俱乐部的招新,并且忽略其它所有社团。不过说实话在学生会和微软俱乐部的工作也纯属打酱油,没干过什么正事儿。大二的时候微软搜索技术中心(STC)来微软俱乐部收简历的时候,我在路上碰到了陈健老师,也就是之前提到的班主任,就跟她说了这个事情。后来由于对方说我年龄太小而作罢,因为其它人全部都是研究生。到了大三的时候,陈健老师就跟我提到她可以找老同学帮我投微软的实习简历,因此我于20083月份接到了微软上海的电话面试。电话面试有两次,第一次对方是一位HR,第二次则是一位软件工程师。在第二次电话面试的过程中,我们聊了上面提到的FreeScript,还针对一些数据结构和框架设计的问题进行了热情洋溢的讨论。没过几天,我就收到了面试通知,前往上海闵行区的紫竹数码信息港面试。那是我人生中的第一次面试。

 

微软的面试安排精确到秒,这跟某些公司比起来要人性化许多,不会动辄浪费别人数个小时的时间。实习的面试一共有三轮,对话全部使用英语,尽管里面只有一个是外国人。我还依稀记得被那个年轻的老外面试的时候由于过于紧张,而导致一道简单的问题没有给出最优解的事情。不过他们最终还是让我进入微软位于上海的一个WCF Tools小组实习。

 

这个小组有一位让我十分尊敬的软件开发主管。主管先生是一位热爱敏捷并且经常投身于实践中的人。他在我长达4.5个月的实习过程中,教给了我很多软件工程上的东西,而其中最重要的、让我受益匪浅的则是关于单元测试的内容。除此之外,我也体验了快速迭代、Scrum会议、结对编程以及基于源代码版本管理系统(我们使用的是TFS)进行多人协作开发的流程。在经历了为TechEd大会修改PetShop制作WCFDemo、为Visual Studio 2010WCF开发工具修bug和开发一个具有高度可扩展性的配置文件编辑器之后,我于200812月份结束了在微软的实习。经过了这次实习,我对源代码的掌控能力也得到了提高,并且直接体现在我利用业余时间开发的项目的代码质量上。

 

在实习结束之前,我获得了一次面试全职员工(FTE)的机会。当时形势十分严峻。2008年美国的次贷危机于10月份正式影响微软上海,公司在那一段时间决定减少全职员工的招聘数量。而我是11月份进行转正的面试,结果这件事情令我十分紧张。后来主管先生表示他的个人建议是希望我毕业后留下来继续工作,让我吃了一颗定心丸。实习生转全职员工的面试一共有五轮。其中令我印象非常深刻的是有一轮的面试官问了我很多非常复杂的问题,最后还考了我一道关于线索二叉树在线更新的问题,不过我已经记不清楚具体是什么内容了。我只记得我花了很长时间终于想到了一个正确的算法之后,时间就结束了,根本来不及在白板上写代码。后来我终于通过了面试,少数的几个名额里面终于被我拿走了一个。不过听说几个月后限制开始放宽,没有我面试的时候那么困难了。

 

在实习和面试的过程中,我觉得华南理工大学软件学院开设的很多课程其实都是十分有用的,特别是关于数据结构、设计模式和软件测试的内容。这些都是在工作中十分有用的知识,并且也需要在今后的工作中继续积累这些东西的经验。只不过因为学院学生人数众多,而一个新的学院总是免不了缺乏一些师资力量,所以我有很多同学都表示很难体会到课本中所提到内容的作用。想必如今应该比我们那几年要改善许多了。

 

面试结束到获得offer中间隔了几十天,最后HR的通知在除夕的那一天终于到来了。之后的半年时间我就在学校里面继续做自己的事情,偶尔参加几个活动介绍经验等等,还有就是跟一些人出去游玩。毕业后动身前往上海微软。中间发生了一些事情,因为名额变动的问题,我虽然拿的是WCF Toolsoffer,但是最后却被安排到SQL Server组,在此之前我并没有收到通知。由于我比较不喜欢数据库,对SQL Server了解很浅,所以我做了一年半的SQL Server Management Studio(也就是传说中的“界面”)的开发。在这期间我跟同事们传播了一些关于单元测试、界面开发、设计模式、Linq和语法分析器的知识。

 

这一年半的经历让我成长了许多,主要是比起实习,正式工作的时候总是免不了经常要跟别的团队、公司、民族、国家和物种进行热情洋溢的广泛交流,而且还占用了不少的时间。有些时候还要坐飞机前往美帝,感受一下社会主义的优越性。正式软件的界面部分十分复杂,不仅要在操作系统的DPI变动以及本地化(大部分内容是把界面上的文字翻译成别的语言)的过程中界面的布局需要自动调整,以便不让一些文字或者按钮只显示一半,还要照顾各式各样的残疾人(特别是失去视力的人群),并且对于某些自绘的复杂内容还要提供一些运行时的接口,使得自动测试团队可以完成他们的工作。这个经历让我感受到了开发一个严谨的界面是多么地不容易。另一个感受是关于需求变更的。设计模式的存在就是为了抵御需求变更,这个真理我直到工作之后才能明白。你必须把一个软件的架构设计得如此之好,才能在需求大规模变更之后,还能在整体上让你的代码是漂亮的、易于修改的、高性能的、并且是安全的。每一次改动都不能是打补丁,你总是需要重构来使得你的代码在任何一刻都在整体上是好的。为了达到这个目标,就需要熟练掌握并使用设计模式来开发项目。

 

微软的跟别的公司比起来罕有一个好处就是他会给你很多时间,让你慢慢把软件做好。而这个好的定义,当然是以功能和可维护性为重点。倘若一段代码以非常精妙的方法来高速完成一个任务,但是却复杂到哪怕写遍了注释也不能让后续维护的人看懂的话,那这段代码是没有实用价值的。一段好的代码,不在于它的设计有多么巧妙,不在于它的算法有多么高深,而在于它可以被几千个人同时开发10年,并且在持续添加功能的过程中,不会因为过于混乱而导致出现了重写的需要。

 

后来我因为一些原因申请了到微软亚洲研究院(MSRA)的人事调动。20111月份我在获得了经理的批准之后,从上海前往北京参加研究院的面试。这一次面试仍然有五轮。这次面试很难,其中一个面试官因为在我的简历上发现了很多跟编译器有关的东西之后,决定让我实现一个strncpy函数,要求是CPU对内存的访问次数要最少。这包含了很多诸如带宽、对齐和二进制字节位移操作等各种问题。方法本身就已经很繁琐,再加上纸上写代码总是免不了要犯错误,所以我依然没有时间把整个程序写完。另一个面试官老外在年轻的时候也做过一些编译器的事情,让我出乎意料的是他在面试的过程中没有跟我出题目,反而就编译器的各种算法和问题聊了整整一个小时,基本上我会的知识全部都因为要回答问题而说了出来。之后我跟这个人产生了深厚的友谊。

 

不久之后我就获得了调动的批准。在做了一些包括给上海的SQL Server团队建立单元测试标准之类的收尾工作之后,我于2011年的4月份前往北京,正式成为微软亚洲研究院的一员,做一些跟分布式系统相关的研究。

 

过往的这些事情给了我很多的启示。在程序员的生涯里面,最重要的就是保持对编程的热情,不要被生活的琐事所磨灭。其次是要给自己不断地创造一些足够困难但是又有办法完成的挑战,这样才可以总是让自己保持着一个快速前进的状态。最后,记得要感谢国家。
posted @ 2011-12-16 23:44 陈梓瀚(vczh) 阅读(7038) 评论(52) 编辑
  2011年8月11日

    代码上传到了http://vlpp.codeplex.com/的Candidate\Games\FunctionVisualizer文件夹下面,VS2010,.NET 4.0。做这个的目的只要是前几天看到了batman equaltion,然后浑身不舒服,因此就想起了这片新闻(http://news.cnblogs.com/n/106212/)里面的东西。就花了一个晚上和一个早上的时间做了出来。当然这里面有点瑕疵,不过大概还是好的。

 

    在Candidate\Games\FunctionVisualizer\FvCalculation\RawExpression.cs里面可以看到用来表达函数的语法树。旁边的ExpressionParser.cs有一个用unsafe+char**写的语法分析器。当我得到了语法树之后,就求f(x,y)的偏微分(RawExpression.Different函数),然后按照下面的步骤进行:

 

    1:从屏幕的所有点(a,b)开始

    2:用牛顿迭代发求f(x,b)=0的解x'

    3:用牛墩迭代法求f(a,y)=0的解y'

    4:每个点(a,b)就变换成了(a,y')和(x',b)

    5:如果Bitmap的大小是100*100的话,那么现在我就获得了两万个(double, double)点,将他们Math.Round之后画到Bitmap里面就成为函数图像了。

 

    为了加速,我做了下面的几件事情

    1:用unsafe把string转成char*,然后做语法分析器(方法基本上就是我写的这篇文章http://www.cppblog.com/vczh/archive/2008/06/15/53373.html)。

    2:绘图的时候Bitmap.Lock得到指向Bitmap的颜色的缓冲区,unsafe强制转换成byte*,然后填颜色。

    3:在得到f(x,b)和f(a,y)之后,对他们求微分f'x(x,b)和f'y(a,y),然后把这些函数从RawExpression编译到System.Linq.Expression再Compile成Func<double, double>。

 

    下面就放几个截图。由于|x|我还没想到好方法去支持,所以我只画了上面提到的那片新闻的一半的图。

   

posted @ 2011-08-11 15:05 陈梓瀚(vczh) 阅读(1309) 评论(9) 编辑
  2010年4月28日
摘要: Vczh Library++ 语法分析器开发指南陈梓瀚前言在日常的开发工作中我们总是时不时需要写一些语法分析器。语法分析器不一定指的是一门语言的编译器前端,也有可能仅仅是一个自己设计格式的配置文件的读写程序,或者是一门用来简化我们开发的DSL(领域专用语言)。我们可以选择使用XML,不过因为XML的噪音实在是太多,所以自己写语法分析器在有些情况下是必要的,特别是那种经常需要修改的文件,使用XML有...阅读全文
posted @ 2010-04-28 13:46 陈梓瀚(vczh) 阅读(803) 评论(2) 编辑
  2010年1月8日

    最近在公司写了一大堆复杂的界面,终于体会到了前辈们那种上刀山下火海的感觉了。做完了之后回头想想,MVC还是有道理的。


    什么是MVC?其实可以简单的理解为一个有UI的程序可以划分为三个部分:数据层、逻辑层和应用层。当然这些名字是我乱起的。数据层顾名思义就是用来读写数据的地方,譬如说一个电话本的文件。逻辑层就是用户在界面上的操作的抽象,譬如说要通过名字来查找消息啦,给一个关键字求得筛选后的电话信息列表啦。应用层指的就是那一堆控件了。MVC三个字母分别指的是Model、View和Controller,也就是模型、视图和控制器了,分别对应于数据层、应用层和逻辑层。

    以前在看MVC的时候总是被一些教条主义的东西迷惑,说什么在MVC里面,MV解耦,所以M可被替换,V也可被替换。这个时候往往会感到迷惑。为什么模型,或者说数据层要被替换?为什么视图,或者说界面要被替换?其实这在一个不是复杂到神级级别的程序里面是不会发生的。但是MVC并不是为了让你能够实现模型被替换或者试图被替换而产生出来的,我觉得这个模式(其实这不是设计模式的其中一项,真的)更加重要的特点是可以让你的程序写起单元测试来更加容易。

    还是电话本,现在有一个要求,说在输入人的名字之后,只要系统检查出你超过0.5秒没有持续输入,那么底下的列表就会自动根据你上面的输入进行筛选。其实这有点像Outlook。这要怎么写单元测试?我们知道虽然正规的测试会有一大堆用来自动完成界面操作的工具啊,或者类库,但是作为单元测试来讲我们并不需要去做这种事情。因为单元测试是程序员写的,凡是程序员写的东西当然是需要尽快得到结果的。一般的开发方法是写一点代码,写一点测试,跑,有bug改没有bug继续。我们在开发程序的时候会不断地、频繁地跑单元测试,来看看我们的东西是不是有问题,或者在重构的时候我们对于我们的代码正确的信心会大一点。

    那界面怎么办呢?难道我们真的要去引入一个库来搞界面的自动测试吗?当然想要也可以,不过这毕竟太复杂,而且这一类的工具的稳定性其实都不是特别好,被误导的几率倒是大增。这仅仅是对于程序员来讲的,当然搞测试的那些人自有他们的办法。那既然我们不做界面的自动测试那怎么知道文本框被输入之后究竟筛选出来的数据对还是不对呢?

    答案:MVC。

    为什么View,也就是试图,也就是界面,可以被替换是一件很重要的事情?想一想,如果控件可以被换成单元测试的一段代码,那岂不是很爽么?举个例子,我们要告知用户说,我们的事情已经做了一半了,这个时候我们可能会去设置进度条的位置。但是“告诉用户说我们的事情已经做了一半”跟“设置进度条的位置”其实是完全无关的两件事情。因此我们的Controller要负责通知View说事情做了一半了,然后View就可以去设置进度条的位置了。现在我们把View换成单元测试的一段代码,这个时候就变成Controller通知测试程序说事情已经做到一半了,然后测试程序就会去检查说现在是不是应该做到了一半,如果应该,显然这个用例就通过了。

    那Model呢?Model可以简单的理解为数据源,其实当然不只是那么简单,不过这样理解会让我们更容易接受一点。数据源是什么,当你写单元测试的时候,去连接一个数据库来获得数据源,然后就操作Controller,这个时候你如果不亲自去读一下数据库,你怎么知道Controller给你的东西究竟是对的还是错的?显然Model我们也可以换掉,测试程序伪造数据成为一个Model,然后插入Controller,事情就解决了。数据是我们自己给的,那Controller应该提供什么我们也能知道了。

    于是,使用了MVC之后,单元测试想换Model就换Model,想换View就换View,测试什么就非常容易了。至于说用户停止输入0.5秒之后是不是会真的去进行数据的筛选,这个我们手工测试就好了,而且那些搞测试的人也会帮我们检查的。

    好吧,说到这里有人可能会问为什么我没有给出一个Demo?这东西太虚,实践实践自己体会一下就行了,而且MVC变形那么多,有Model-View-Presenter,还有最近兴起的Model-View-ViewModel等等,其实现都跟传说中的那个类似桥接模式的东西差别甚远。这个自己去看一看就好了。

posted @ 2010-01-08 20:02 陈梓瀚(vczh) 阅读(2825) 评论(26) 编辑
  2009年12月31日
    项目主页:http://vlpp.codeplex.com/

    Vczh Library++从2006年就开始开发,到现在经历了一些版本变迁,到现在已经正式步入3.0了。现在Vczh Library++ 3.0的基础部分已经成型,我的目标是将Vczh Library++ 3.0做成一个在性能不是极端苛刻情况下使用的数据处理库,附带一个高速的脚本引擎。未来可能会提供更多的东西,但主要围绕着这两个目标走。

    我选择CodePlex主要是因为CodePlex支持Team Foundation System,这个系统跟Visual Studio 2008结合的相当好,提交更改都非常方便。而且CodePlex也提供SVN服务,一些不喜欢IDE的大大们也可以用SVN来下载代码。

    至于为什么上面的描述是英文的,因为在美帝公司习惯了……
posted @ 2009-12-31 11:06 陈梓瀚(vczh) 阅读(400) 评论(2) 编辑
  2009年12月17日
摘要: 这个做了两天的小demo(下载)主要是为了解决如何在ListView上排序大量数据的问题。 这个Demo窗口上的ListView有一百万个项目,点了“Sort”之后就会开始排序。但这个排序跟以往的不同,你看到哪里它排到哪里,但这个排序不仅仅是在窗口内部排,而是你看到的内容都是正确的。 举个例子,你在浏览1000-1020条的时候,我会开始排序(当然有一点点延迟,不过不会卡窗...阅读全文
posted @ 2009-12-17 10:42 陈梓瀚(vczh) 阅读(1854) 评论(11) 编辑
  2008年11月9日
posted @ 2008-11-09 21:36 陈梓瀚(vczh) 阅读(1162) 评论(3) 编辑
  2008年9月6日
摘要: 我们知道Yacc和Bison都是产生C++的代码作为编译器的前端的。但是有时候我们需要动态地产生一个编译器前端,极端一点讲,譬如“文法调试器”。调试器总不能动态生成.y文件,让yacc编译,让gcc再度编译,然后execute,最后将程序的输出结果读进来。这样就太麻烦了,于是我们需要重新写一个生成编译器前端的程序。阅读全文
posted @ 2008-09-06 18:56 陈梓瀚(vczh) 阅读(1160) 评论(2) 编辑
  2008年8月27日
摘要: 大概一年前曾经用C++开发了一个可以在C++中直接写上下文无关文法的上下文无关文法分析器。这玩意儿叫Syngram。Syngram曾经做了两次,第一次做成了用一个类去读文法文件,后来不爽就改成了直接在C++里面写的。我弄了一个叫Term的类,重载了一些操作符,于是你可以搞分支、可选、错误处理等复杂的文法推导式。现在打算做一个周边工具。阅读全文
posted @ 2008-08-27 21:07 陈梓瀚(vczh) 阅读(2090) 评论(18) 编辑
  2008年8月15日
posted @ 2008-08-15 22:39 陈梓瀚(vczh) 阅读(748) 评论(8) 编辑
昵称:陈梓瀚(vczh)
园龄:3年5个月
粉丝:79
关注:1
<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

搜索

 
 

常用链接

随笔分类

随笔档案

好友博客

最新评论

阅读排行榜

评论排行榜

推荐排行榜