Garbage Collection Algorithm
七月 2, 2007 at 8:47 下午 | In Technology, gc | 2 CommentsQuick Taxonomy:
- Reference Counting
- Tracing Collector - traverse live objects
- Mark-and-Sweep Collectors
- Copying Collectors
- Hybrids
Other collector characteristics:
- Conservative Tracing
- Generational Tracing
- Real or Incremental
上面这个大纲基本上概括了目前的主流垃圾收集算法。一般来说,工业产品级的实现,通常是在标记-清扫算法和复制算法的基础上,引入分代式或渐进式(也叫增量式)策略。对像我这样单枪匹马实现语言的人来说,暂时可以把分代式和渐进式仍在一边,先把标记-清扫算法和复制算法弄清楚再说。至于古老的,最通俗易懂容易实现的引用计数,我想已经成为边缘算法了。据说Python用的还是RC,反正Python这么慢,也不差这一点了……
说到垃圾收集,最重要的莫过于性能问题。垃圾收集和人肉回收哪个比较快?标记-清扫算法和复制算法哪个比较好?就算是标记-清扫算法,在这个名下也有许多变种,哪个最好?在下结论之前,不妨先问一问:好的标准是什么?衡量垃圾收集算法的指标在哪里?垃圾收集界老大之一,Hans-J.Bohem做过一个lecture,题为Memory Allocation Myths and Half-Truths,前半部分集中谈内存分配算法,后半部分讲垃圾收集,很值得一读,作为进一步研究前扫除知识垃圾之用,充分凸显了内存管理这一问题的复杂性,让我们养成一种小心谨慎的态度。Bohem的演讲可以概括成一句话:具体问题具体分析,实事求是(这是我党的重要思想,可以应用于世上一切已解决与未解决的问题……)
下面简单的列举一下gc算法需要考虑的几个方面:
- 时间,包括垃圾收集本身的时间,以及内存分配的时间
- 空间,主要是内存的使用量
- 局部性,碎片问题以及缓存性能
上面三点,每一点展开都洋洋洒洒,并且三者相互影响,错综复杂。特别是最后一点,很容易被人忽视但实际上非常重要——也非常难搞。把这些内容全部弄清楚不是像我这样的门外汉力所能及;就算是专家,面对这样复杂的问题也不敢妄言自己都明白了,并且本身这里面还有许多未解决的问题。我的目标,就是学习一下基本的Mark-Sweep Algorithm和Copying Algorithm,并实现一个Garbage Collector来用在我自己的语言上。
阅读(946 次)
Using Tabs in Vim
六月 29, 2007 at 7:25 下午 | In Default, vim | No CommentsVim是我最喜欢用的编辑器。Vim v.s Emacs几乎是除开程序语言之争(比如C++ v.s Java)之外持续时间最长、参与人数最多也是最没意义的口水战。Emacs很好,几乎无限的扩展性,但我就不喜欢两点:第一,我不喜欢把指头拐出去按ctrl,alt,而且往往要同时;第二,Emacs慢,拖了那么多五花八门的extension,不慢才怪了。有人说Vim不也经常要伸出手指去够键盘左上角的Esc键?所以我前面说了这是最没意义的口水战;这一类关于个人喜好的争论都是如此,本来个人喜好就是没道理可讲的,偏要去跟人讨论讲出一堆因为所以然来,结果自然是口水飞溅了。
回到正题。Vim 7用了这么久,突然发现一直没有用上Vim 7的最大新特性(之一),就是标签页,tab。在这里把常用的几个命令总结一下:
首先,默认情况下Vim是不显示tab label的。想让Vim在头上显示一栏标签,就要在_vimrc加一句
set showtabline=2
0表示不显示。
打开新标签页
最常用的命令自然是在新标签页中打开文件了。直接:tabnew filename。注意这个命令是支持自动完成的。顺带提一下tabf,后面可以跟通配符进行搜索。
在标签页间切换
有人说直接用鼠标点就行了。我也觉得鼠标很方便,但掌握一些键盘操作命令也是有好处的(这又涉及到另一大著名口水战GUI v.s CLI)。可以用:tabn和:tabp在标签页间移动,或者在normal mode下按gt。此外,还有诸如:tabfirst和:tablast,顾名思义即可。
重新安排标签页
有时需要调整一下标签页的顺序。很遗憾Vim没有提供通过drag调整顺序的功能,只能借助于命令。:tabm n移动当前标签页。Vim将所有标签页从0开始编号,n就是标签页的新位置。
最后提一个十分有用的命令,即:tabdo command,可以一次性对所有标签页执行command命令。比如要对所有标签页进行替换,按照传统是把foo替换为bar,那么
:tabdo %s/foo/bar/g
这篇文章里提到的内容其实只是tab的很小一部分,欲知详情,请查阅vim的帮助。
阅读(837 次)
Restart my Compiler project
六月 26, 2007 at 9:16 下午 | In Default, Technology, compiler | No Comments考完试了,有几天空闲时间。我想起还有个建设中的编译器被我遗忘在目录深处,决定利用这几天工夫好好来写点代码。
这个玩具编译器(我的计划是未来某一天它不再是一个toy language,我设想了许多美好的特性,但我现在还没有足够的技术和时间来实现他们)的前端已经完工。编译器前端——词法分析、语法分析——在教科书上占一半的篇幅,涉及到不少理论知识,但实际上是个无聊的工作。而code generation则是麻烦而繁琐的。网上可以找到全套的工具——从flex、bison这样的前端生成器,到MLRISC这样完备的后端,但我还是想自己动手写一遍。 我现在去看几个月以前写的code generation,惊奇于这样丑陋而复杂的代码居然(貌似)是对的。
我的目标是生成机器代码,这两天花了不少功夫研究IA32处理器的浮点运算,深刻地认识到FPU是一个多么难看的设计,让我的代码增加了无数的条件分支和switch。想了解一下MIPS在这个问题上是怎么处理的。string,class等已经初步提上日程。至于我幻想中的gc及lambda expression,high-order function,continuation等一干functional特性,现在还遥遥无期。
从书签里翻出一篇老文章,一直没细读,Modern x86 assembly (blogspot….被和谐掉了。同志们上代理。),里面着重谈了alignment(对齐)和caching(缓存)。对现代的计算机架构,这两样东西对性能有极其重要的影响。对齐主要是编译器考虑的问题;而cache的影响则更为微妙。准备好好学习一下。
阅读(714 次)
Safari 3.0.2 Beta
六月 23, 2007 at 2:59 上午 | In Default, Technology | No Comments今天背邓论背得头晕眼花,偷空上网就看到Safari 3.0.2 beta已经上线了。不久前听说Safari 3.0.1 beta出世,虽然我很少下beta版来当无名小白鼠,这回还是忍不住下了一个来尝鲜。苹果公司估计是除了微软、Google之外最有名IT公司——世界范围内,如果是中国就另当别论。虽然我并非Mac用户(还好我有一个iPod,总算是苹果的客户),也不是那种狂热得近乎宗教的Apple fans,苹果仍然是一家非常有趣的公司,那种自以为是的可爱作风很能吸引眼球。
3.0.1版一出来就骂声一片:它居然不能正常显示非英语字符!这个bug大的有点丢人,这样的版本连alpha都算不上。除此之外,速度方面,不管是启动速度还是页面渲染,都表现不佳,有人将其评为”the world’s slowest web browser”。苹果执著于自身的UI风格,想要在Microsoft的地盘上占山为王,不管是字体渲染还是窗体都从头做起,于是中文变成了下划线,整个速度也被拖累,归根结底是苹果想在Windows上完全复制Mac的软件外观所致。但是不这么做也就不是苹果了。
这个漏洞无数,问题百出的beta版放出以后,立刻有一堆苹果爱好者们发布了各式各样的补丁教Safari识字。我开过一次Safari之后就不想再用了,等哪一天把中文显示的问题解决再说。结果今天就解决了,终于有了当beta的资格。总的来说,除了UI效果给人印象深刻(苹果最出名的也就是这个。主要是字体,字体……但是习惯了Windows字体渲染引擎的同志可能反而会觉得Safari的字体难看,这是因为Windows和Apple字体渲染的出发点完全不同,所以算法也不一样),别的方面一般。Steve Jobs之前说的,未来的浏览器市场是IE和Safari的天下,我觉得基本上是梦呓。
阅读(706 次)
初试Qt
六月 21, 2007 at 6:38 上午 | In Default, Technology, gui | No Comments昨天一腔热血地编译了Qt 4,编译完才想起可以去下一个Open Source Edition的binary直接来用,大概被俄国同志无私奉献的精神感染了……
顺手装上了一个VS2005的Qt插件。一开始老是出错,而且都只出一行错误信息:找不到头文件。如果代码里有Qt类需要moc出场,就会出另一行:找不到moc。检查了环境变量,没有问题。用qmake生成vcproj,表现良好,说明问题出在VS2005上。昨天折腾了一下午,百思不得其解,不得不感叹微软的产品都像谜一般迷人。
今天早上起来继续钻研,终于发现这回错怪微软了,是我设置的不对。因为是自己编译的版本,所以VS的Qt插件找不到Qt在哪儿,需要手动在选项里指定。当时还迷惑了一会,写上了Qt的二进制代码所在的文件夹$(QTDIR)\bin,实际上只要写$(QTDIR)就可以了。
经过了这么多磨难,终于可以顺顺当当的在VS里用Qt了。
阅读(840 次)
Compling Qt 4.3.0 in a rainy afternoon
六月 20, 2007 at 3:26 上午 | In Default, Technology | No Comments这个标题分为两段:技术的,冰冷的前半段和容易被误认为略带一点小资气息的后半段。下午的雨下得无法无天,全过程完美的体现了夏季雷阵雨的特征。我坐在桌前,被一种莫名其妙的空虚感侵袭,决定折磨一下我的电脑,于是上网下了Qt4。
下面要开始谈一点技术内容。大家都把Qt定义为一个非常优秀的GUI库,这么说未免有点片面,事实上它是一个Framework,像.NET Framework 2.0,Spring一样的Framework。但是和一身铜臭的.NET,Java不同,Qt略略带有一些开源色彩。首先当然是因为KDE用了Qt,大家也就一厢情愿的把Qt归到开源软件里了。其次是Qt确实有一个OpenSource版本(可以想象功能上会打点折扣)。对于盗版精神深入骨髓的中国人和俄罗斯人来说,虽然OpenSource很好让人心安理得,但是如果能D到一个商业版当然更美好。Qt Underground。这个网站的标题已经揭示了它罪恶的本质。
最后谈谈编后感(注:编,编译也)。 这个玩意是我编译过的最大的软件,编译后源码加各种lib,dll居然有近2GB之多,编译时间也长得吓人,光configure就不下半小时。泡一杯茶,然后看着nmake上气不接下气得调用cl干活,屏幕上漆黑丑陋的cmd窗口不停得滚动,听着外面单调的雨声,我的不知从何而来的空虚感也消失了。所以大家以后无聊的时候,不妨去下一个boost或者linux kernel编译一下。言归正传,编译前要做一些必要的改动,来配合该死的VS2005SP1(如果你用的是gcc,这一块讲的都不适用),为了不让技术细节充斥这个页面,我决定只放个链接,是一位高手的Qt 4.2.3编后感,对4.3.0版本也适用。
阅读(744 次)
Zero Sound
, powered by 赛族 & WordPress MU | Theme: Pool by Borja Fernandez.
Entries and comments feeds.
MSN:
