SQYBI.com

Change is a part of life, and takes part in finding us who we are.

2011年05月08日
by sqybi
3 Comments

编译器和它的故事——自展与交叉编译

其实好久以前就想开始动手写这么一篇文章了,不过一直没有时间。现在正好刚考完最后一门期中考试,还是编译原理,就把这篇文章写出来。 要阅读本文,不需要太高深的编译原理知识,甚至不需要编译相关的知识。但是本文也不是面向对电脑一无所知的读者的,你至少要知道: 1. 不管是exe可执行文件还是Linux下的程序,都是一些二进制代码,我们称之为机器语言。这些代码的执行和系统以及CPU都有关。 2. 大部分情况下,编译器是一种将高级语言翻译成机器语言的程序。而任何程序本身也是一些机器语言的代码。 3. 无论是高级语言、汇编语言还是机器语言,实际上都是等价的,唯一有区别的是,越高级的语言写起来越容易(所以我们倾向于尽量多书写高级语言代码);同时,机器语言是可以直接运行的。 如果你觉得上面三条可以理解或者可以理解一部分,那么请继续阅读。 另外,本文中提到的无论是编译的过程还是语言的分类甚至是一些例子,都可以看做是一个简化的模型。实际上,很少有一个exe程序就可以运行的编译器,现代的编译器都是十分复杂的。不过,考虑这些简化模型对我们没有任何坏处,它们和实际情况相差并不很大。 首先我来详细解释一下高级语言和机器语言。 语言的所谓“高级”,实际上界定不是那么明确。不过我们可以确定的是:C++、Java、Python之流比汇编语言更高级,而汇编语言比机器语言更高级。 这里提到一个汇编语言和机器语言的区分。可能有些读者不明白这两个概念的区别,实际上很简单,汇编语言是我们会看到的那些MOV、JMP等命令组成的语言,而机器语言则纯粹是是各种01串。我想没有人会愿意写一个机器语言的程序——实际上,我们学校的计算机组成实验都是用Verilog HDL这种高级语言来完成的,而嵌入式原理实验也是用一种汇编语言完成的;即使是做处理器和单片机,也不会有人愿意去写机器语言,毕竟一大堆01串太坑爹了。 试想,让你用C++写一个从1输出到100的程序,几行代码就可以搞定;而汇编语言则可能需要几十行;机器语言呢,Oh my god,一大堆01000101110110101011111001……,看都看不懂,还写啥啊。 但是上面也提到了,机器语言和高级语言的区别是,它可以直接运行。比如exe程序,实际上它内部存储的就是一些机器语言的代码,机器可以直接阅读这些代码并在处理器中运行它们(这里说的不是完全准确,比如.NET编译出的exe程序实际上是一段中间代码,由CLR解释成机器代码才能运行——不过这可以暂且忽略,就当作我说的是一个简化的模型)。当然程序的运行是依赖机器架构和系统的,不然Wine什么的也就没有用了(什么是Wine?WINE = WINE Is Not an Emulator!有趣的名称递归定义还有很多,不过与本文无关,请自行Google)。 而实际上,是机器架构不同还是系统不同,并不是我们考虑的问题。我们考虑的问题只是,一段代码在A机器和X系统下能否运行,换到B机器和Y系统下又能否运行。就算在A机器和X系统下能运行,如果换成了A机器和Y系统之后不能运行了,那对于我们这也可以看做两台不同的机器(也就是说,A机器和Y系统实际上就可以看做一个新的机器B)。所以之后的描述中,我们不考虑操作系统的情况,而是只考虑机器,我们编号为a、b等,而它们上面可以运行的机器语言我们编号为A、B等。 以上几段的关键点是: 无论是机器语言还是高级语言,实际上都是代码。在之后的讨论中,我们不应该将它们区别对待。 虽然机器语言代码和高级语言略有不同,它可以直接在机器上运行,但是对于编译过程,它们没有任何区别。 上面的问题了解了之后,我再来简单说一下编译器。那编译器是什么?这要从两个方面来解释。 首先,编译器本身的功能是,将一种语言S的代码转化为一种语言T的代码。这里稍微了解编译器的读者可能有疑问了:我用的gcc之类的编译器,明明是把C语言代码编译成了一个exe程序,并不是把S语言的代码编译成了T语言的代码啊?如果你也有这个疑问,请重新阅读以上几段——我在前面已经提过了,“任何程序本身也是一些机器语言的代码”。也就是说,我们这里把机器语言也看作一种语言,只不过是很低级的语言;而编译器就可以将C语言这种高级语言S转化为机器语言这种低级语言T,恰好这种低级语言还是可以在机器t上直接运行的。 其次,大部分情况下,编译器自己也是一段程序,那么它也可以看做是一段代码。而编译器也会有它的源代码,这个源代码就是一种高级语言的代码,我们这时仍然叫它编译器。随便举个例子,对于gcc.exe,这个程序是一种机器语言A的代码,它可以直接在a机器上运行。而它的功能则是,将C语言的代码转化为机器语言A的代码(一个C语言的编译器),使得本身无法直接运行的C语言程序变得可以在a机器上运行。而在得到gcc.exe之前,我们一定也有一段代码,它是用来生成gcc.exe这个程序的,这段代码可能是一个高级语言的代码,比如汇编语言。那这时候,这段汇编语言的代码即使不能直接在电脑上运行,我们依然说这是一个C语言的编译器。 有了这两点,我们就可以总结出一个编译器的特征: 1. 本身是一段代码,假设是A语言的代码,A可以是机器语言,也可以不是; 2. 可以接收一段代码,假设是S语言的代码,S一般来说是高级语言,但理论上也可以不是; 3. 可以将接收到的S语言代码在内部转换后输出一段代码,假设是T语言的代码,T有可能是机器语言,但也有可能是一种高级语言。 这样,一个编译器就可以被表示为A(S –> … Continue reading

2011年04月18日
by sqybi
22 Comments

高效率写作利器 —— 几款写作软件对比

几点说明 欢迎转载,转载请注明出自SQYBI.com,并附上原文链接(最好Trackback 一下)。 本文所提及的软件,并非那种“自动生成作文”的所谓“写作软件”——自己尽心尽力写出的文字才是最好的文字。所谓“写作软件”,自然是文字处理软件的意思。 为什么不用Word?Word的确是很多职业作家的选择,但是它的界面过于臃肿,有很多在写作中根本用不到的功能——或者说,它的大部分功能都是在写作过程中根本用不到的。 为什么不用TeX/LaTeX?TeX的确是用于科技论文写作的好软件,不过在文学写作上,用它实在是太屈才了。而且对于文学写作这种感性的创作,WYSIWYG(What You See Is What You Get,所见即所得)的编辑器往往比一长串像代码一样的东西更容易激发人们的写作灵感和写作热情。我想没有人愿意对着一大串代码想象两个人的恋爱的故事该如何继续进行。 为什么不用记事本/VIM/Emacs/etc.?本文的标题是“高效率写作利器”——而文中介绍的几个软件都有这样一个特点,那就是排除一切干扰,让作者专心于写作。具体的实现方法是,程序全屏、没有多余的菜单和按钮、有纯色背景或风景图片背景、有背景音乐等等(这里插一句题外话,记得上次查字典,“等”的意思是“只有以上这些”,“等等”的意思是“除了以上这些还有别的”,希望没记错……)。因为我是个VIM党,所以我对Emacs并不熟悉,不能妄加评论,不过我想VIM应该是不能简单地实现这些功能的。毕竟要想着各种命令就很烦人了…… 因为作者的测试环境是Windows,所以只评测有Windows版本的软件。似乎Mac上有一些非跨平台的软件,有兴趣的读者可以自行搜索。 本文中得出的任何结论都是作者个人的推荐,如果想知道哪一个软件更适合你,最好还是亲自试用一下。 测试环境 计算机:Dell Studio 1450,Core2 Duo P8700,4G,ATI Raedon HD 4530 系统:Windows 7 Ultimate 64-bit 显示器:双屏;外接Philips显示器作为主屏,分辨率1920*1080;笔记本显示器作为副屏,分辨率1366*768。 写在前面 前几天偶然在GR上看到小众软件发表了一篇关于OmmWriter的介绍文章。正好我之前苦寻此类软件未果,就试用了一下,但是个人感觉体验并不是很好。 之后又在这篇文章的评论下面看到有很多人推荐各种各样的写作软件,于是依次试用了一下。后来一想,既然已经尝试了这么多款软件,为什么不写一个评测,让更多的人知道这类软件的存在呢。 于是就有了这篇文章。 这些软件的一个共同特点是,可以让写作者集中精神于自己的工作。利用简单的界面,或者清爽的音乐,营造一种轻松专注的氛围,这是我在这里介绍它们的原因。如果不需要这个特性,那么Word或者记事本(甚至VIM?)会更适合你。 因为之前发预告文章的时候很多人都在说VIM之类的更好,所以这里特别说明一下。此外,我个人认为VIM十分不适合文学写作。 如果你是从人人网上看到这篇文章的,推荐来看原文,人人网上RSS的图片显示可能会有问题。

2011年04月14日
by sqybi
6 Comments

Gmail的哪些功能吸引了我?[updated]

昨天在人人上发了个关于Gmail的状态,引发了热烈讨论。某同学表示不知道为什么有那么多人在用Gmail,然后瞬间蹦出N个回复提出了Gmail的种种优点。 仔细想想,为什么Gmail这么吸引我呢? 很早以前,我的第一个邮箱是sohu邮箱,用户名我还记得,是jk041。真的是很早以前的事情了。之后几乎尝试过国内每一个著名邮箱(正如当初几乎尝试过国内每一个著名BSP),然后换到了新浪。再后来,126邮箱似乎率先推出了什么功能(好像是无限容量,我也记不太清了),于是转到了126邮箱,而且那个邮箱也持续用到今天。 但是,实际上,现在的126邮箱对于我只是一个收垃圾邮件用的邮箱——所有网站的注册都用126的邮箱,然后私人的邮件都用Gmail。我已经忘了自己是什么时候开始用Gmail的,不过的确最开始的时候我也不觉得Gmail有什么好的功能,甚至觉得很难“上手”。不过某一次连续用了一个礼拜Gmail之后,我才发现原来这个邮箱真的这么优秀,国内没有任何一个邮箱能够与其比肩,甚至赶不上它的十分之一(国外估计也不会有吧?)。 这时我才发现,所谓很难“上手”,实际上只是迁移成本罢了,当初国内邮箱“上手”的时候,没有一个比Gmail更容易多少。Gmail已经在易用性和用户体验中间找到了一个十分良好的平衡点,国内邮箱互相的迁移成本低,是因为中国的网络产品“抄”的现象太严重,结果每个邮箱界面都一样,用起来感觉都一样,不一样的只剩下了域名。 扯淡扯太多了。那么回归正题,Gmail到底有哪些功能吸引了我呢? ---------- 以下是Gmail默认开启的功能 ---------- 界面布局 之所以把这个放在第一个,是因为国内邮箱千篇一律的页面布局实在让人头疼。Gmail将Mail、Contacts和Tasks整合在了一起,对功能进行了分块。上面的搜索框也很有Google特色,用起来相当方便。通过Labs的功能,还可以对界面进行进一步改造(比如把Inbox分成多个,把Gtalk放到右边之类)。其实这个也不算太亮的亮点,但是用起来的确很舒服。 标签管理 这个是Gmail一个很核心的功能,可以说,如果不用这个功能,Gmail就浪费了一半。 虽然标签管理本身并不能带给我们什么体验上质的飞跃,但是它可以和很多功能相互配合使用,比如代收取邮件、过滤器和Archive等。可以发现,这时标签功能才真正展现出它的实力,把一切都统一成标签,简洁明了,完全不是国内邮箱那样,一个文件夹列表,一个代收取的邮箱列表,大大限制了灵活性。 Archive 这个功能可以说完全依赖标签才得以实现。有的邮件可能已经没有什么用处了,或许是谈论某个project然后project已经完成,或许是向教授套磁然后失败了……不管怎样,这种邮件会有一种删也不是不删也不是的感觉。这时怎么办?Archive功能告诉你,你可以把它从inbox中完全隐藏掉,但是这个邮件不会被删除,想要读的时候,搜索功能可以帮你忙。 这个功能的实现是,Inbox里的邮件都会被自动加上“Inbox”这样一个标签,只要把这个标签去掉,邮件就不会再在Inbox中出现了——这就是Archive功能。 代收取邮件 这个功能很多国内邮箱也已经开发了,不过至少我用126邮箱的时候,从来没收取成功过。Gmail的收取功能是十分稳定的,从来没有出错(除了126十分傻X地把POP端口只开放给本地客户端导致收取失败)。 配合Label,可以给每个邮箱收取的邮件标上不同的标签不同的颜色,一目了然。Labs里的Multiple Inbox功能,还可以在Inbox页同时显示多个Inbox,完全让Gmail替代、超越本地客户端。 可以说,这个功能是邮箱迁移的利器,也是多邮箱用户必用的功能。 Prioirty Inbox 这个功能也是Google最近才推出的,效果相当不错。 它可以通过邮件的内容,自动判断这封邮件是不是“重要”邮件。如果是“重要”邮件,就会在Priority Inbox的最前面集中显示出来。 上学期当助教的时候,我的邮箱受到了各种邮件轰炸,这个功能帮了我大忙。准确率令人发指啊,和垃圾邮件过滤的准确率有的一拼。 垃圾邮件过滤 既然提到了,就来说说垃圾邮件过滤。 我这个Gmail邮箱也和其它邮箱一样,每天收到十来封甚至几十封垃圾邮件。但是,Gmail的垃圾邮件过滤系统真的强大到了一定程度。至今为止,我似乎还没有任何有用邮件被识别为垃圾邮件的记忆;而垃圾邮件的漏网率,大概也不到百分之一——其实一个月也没有一封漏网的。 这么强大的垃圾邮件过滤器,大概是我选用Gmail的根本原因吧。 联系人管理 这个没什么亮点,不过给人感觉不差就是了。和国内的邮箱比起来,这个联系人管理可谓简单得多,怎么看上手也不会比国内那些乱七八糟的联系人管理难吧。 内嵌Google Talk和Google Tasks Google服务之间的整合做的相当不错。这个不多说了,内嵌的Gtalk估计每个Gmail邮箱用户都用过吧。Tasks虽然我没有用,但是放在邮箱里绝对没有错,想想那么多人热衷的Outlook就知道。 和Android手机的同步 安卓手机会和Google服务有紧密结合度是理所当然的事情。我现在的Milestone,通讯录是和Google … Continue reading

2010年11月21日
by sqybi
0 comments

[zz from Nxun.com] Windows7中的扫雷

以下内容转载自Nxun的blog:http://blog.nxun.com/archives/35#comment-215。 ------------------------------------人肉分隔线------------------------------------ 扫雷游戏(Minesweeper),自从1981年 Windows 3.1 出现以来,此款游戏的流行程度从未减退。在此不对游戏的规则及策略作介绍,如果您真的不清楚这是什么,请自行询问身边的朋友。 本人最近就迷上了 Windows 7 中自带的扫雷游戏,很OUT是吧,冒着被喷的危险,与大家分享点有趣的见闻。 Windows 7 / Vista 中的扫雷游戏,与 Windows XP / 2000 / 98- 中的比起来,游戏体验终于有了质的提升,从清新醒目的配色到简洁明快的动画效果,可见微软在此还是倾注了一定的心血。 新版本的改动并不仅限于画面效果,一个重要的变化是地雷的布局算法。有经验的扫雷玩家可能都知道,在一局扫雷游戏中,第一个点开的方块一定不是地雷。这一点不用怀疑,因为这不是概率问题,一个设计良好的扫雷游戏不会让你直接点到雷上,它们或者在点开第一个方块后再布局地雷,或者把第一下点到的地雷换到其他地方去。在Win7新版本扫雷中,做出了更加人性化的改动,第一个点开的方块连同周围8个方块(如果有的话)保证都不是地雷,使用9*9雷数最多的自定义游戏也可以证实这一点。 在XP扫雷(高级)中点开的第一个方块 在Win7扫雷(高级)中点开的第一个方块 9*9雷数67的自定义游戏 这样做给玩家带来的好处是显而易见的,因为开局点开一个孤立的方块几乎没有任何价值。事实上微软考虑的可能更多,我随便在高级游戏中测试了几次,几乎每次第一下都会点开一大片区域(超过20块),稍微计算一下便可知道这种概率并不高,唯一合适的解释就是游戏“智能”的为玩家提供了一个舒适的开局。 这里还有一个有趣的小程序,如果您对本文第一张截图感觉好奇,可以试一下。在这里下载。 实现原理见作者的这篇文章。 ------------------------------------人肉分隔线------------------------------------ 上面提供的程序下载经我测试在我这里无法运行,inject后找不到某个模块,所以懒得再传到我blog上了。可能和我是64位有关,想要自己试一下的请去原文照下载链接。 其实这几天在和Nxun玩扫雷,既然他开始研究扫雷的布局算法了,那我看来要多看看解扫雷的算法了……总感觉可以转化为一个完整的数学模型来解……