介绍两篇文章

1. 梁文道老师写了一篇文章, 我认为很值得推荐.

西方媒体的偏见源于价值观

 2.  今天CNN上一个华裔教授也写了一篇文章,提到了 self-rightness 和 hypocrisy, 即自认为正确和自认为道德优越. 以我看,很多西方媒体,以及中国愤青,都是一样的手段. 利用自认为宽容的政治正确(或者自认为完美的民主自由,或者自认为正确的爱国主义)和道德制高点的大棒杀人,并不能以理服人。

Bashing China is not the answer

 真心希望多出现这样的理性思考者. 左派愤青请停止网络暴力,右派也请用理性思考,而不是屁股决定脑袋。大家一起合力解决这个国家对内对外的问题.没有什么能比上这件事情激起大家观点的激荡了,倘若中国的启蒙进程因此加快,言论和媒体因此放开,则不得不说是各派人士都乐于见到的. 

Comments (5)

计算机科学必读经典

前天看到 pongba 说好书太多 以致于没时间写博客, 深有同感. 架子上目前放着 Dreaming in CodeTAoCP 第四卷第三册, 手不释卷, 以至于三上时间都不放过. 细想自己读过的好书不少(至于烂书, 只能用无数这个词来衡量了), 勉强回忆了一些让自己印象深刻的, 写一两句话的点评, 算是我眼中的必读经典吧.

A类. 基础

Structure and Interpretation of Computer Programs (SICP)


SICP 计算机程序的构造和解释 (SICP) 堪称是MIT计算机系的镇山之宝之一, 书中通过展示 LISP 语言和程序设计两条主线, 向读者展示了程序设计的几乎所有重要概念. 数十年来各种语言层出不穷, MIT 依然故我给入学本科生教 LISP. LISP 这种函数式的语言, 和过程语言相比, 理论更加优美(lambda 演算), 描述更加简洁. 现代的动态语言如 Javascript, Python 和 Ruby 都或多或少被 LISP 影响. 任何想写具有清晰结构, 或者正确思路的程序的人, 都应当阅读这本书. 好消息是, 这本书是可以在线免费看的.

The Art of Computer Programming (TAOCP)


计算机程序设计艺术 (TAOCP) 是计算机领域的一部未完成的里程碑. 如果之前没有听过它的大名, 那就不算学过计算机科学. Knuth (中文名高德纳) 阅读文献无数, 博古通今, 文风幽默. 书中讲解细致深入, 大开大阖. 如果说 SICP 是练童子功的话, 这本书就是属于名门正派的顶极内功. c0031186_46dce4fb1637c.gifTAoCP上往往一个普通的习题, 就是一个很经典的结论; 往往不经意的一句话, 就是一个巧妙的算法. Knuth 常常把貌似不相关的结论深刻的联系在一起, 比如我现在读的第四卷第二册上九连环问题和Gray码是深刻联系的, 易经和生物遗传密码子也是有对应关系的(当然不是民科说的那种).

如此的打通任督二脉的例子和习题俯拾皆是, 真的是穷人进了皇宫的感觉. 即使对于面试工作, 这套书也是值得一翻的: 在Google面试的时候, 面试官问一道题目, 我很快给了一个答案, 其中用到了一个不太显然的结论. 面试官问, 这个结论怎么来的? 我说, TAOCP 第二卷讲了这道题目的一个推广情形. 面试官说, 这道题目就是看面试的有没有看过 TAOCP. 我看很多人面试之前都在网上疯狂做题, 尚不能穷其一隅. 其实读过 TAoCP 的人极少会害怕面试的时候那些技巧性的问题. 万变都极少超出TAOCP划出的框架.

Introduction to Algorithm (CLRS)

0262032937-f30.jpg算法导论 (Introduction to Algorithm), 在圈子里常常按四个作者的首字母写成 CLRS, 算是对不愿意看或者看不懂 TAOCP 的人送上了半个梯子(还有半个当属具体数学 Concrete Mathematics). 这本书在美国大部分大学中被列为算法类教材, 在国内也是 ACM 竞赛集训必看的教材之一. 虽然名字里面带一个导论, 内容却一点不含糊. 在我个人看来, 其内容基本覆盖绝大多数常用的算法, 在 NP 复杂性理论以及近似算法方面也有所涉及. 这本书最好的地方是习题详细且全部没有答案, 非常适合作为大学课本和ACM讨论班阅读材料, 最坏的地方也在于没有答案, 对于自学者来说, 可能会觉得枯燥无味且困难重重.

另: 如果有淘老书的习惯, 不妨选择 The Design and Analysis of Computer Algorithms (计算机算法设计与分析) 这本书在 CLRS 出现之前绝对是算法教材一哥. 可惜这本书一直没有更新, CLRS 才以算法多而全取胜.

Compilers: Principles, Techniques, and Tools

这就是著名的龙书 (Dragon Book) 啦. 和上面的 The Design 一样, 都是 Stanford 教授 Jeffrey D. Ullman 的巨著. 计算机的历史很大程度上是编译器发展的历史. 当年 Knuth 就是因为写了Alogo 60 编译器后, Addison-Wesley 过来找高爷爷约稿, 1962年的时候就让他写本编译器的书. Knuth 写啊写啊, 发现写了很久还没写到主题. 那边编辑急了, 说你都写了3000页手稿了, 你还不交稿. 高爷爷说, 这个, 我还没写到正题呢. 书商说, 算了, 你出多卷本吧. 于是才51xtgj64tzl.jpg有了 TAoCP. 这个小故事也就说明计算机编程的发展史和编译器的发展史是平行的. 龙书基本上框出了一个编译器的架子, 从词法句法分析到类型分析 代码生成. 新版加入了JIT, 垃圾收集等现代特性. 这部巨作的作者阵容也是强大的: Alfred Vaino Aho 是 grep 和 awk 的作者. Ravi Sethi 以前在 Bell 实验室, 现在好像是朗讯的首席技术官. Avaya 实验室的头. 至于 Jeffrey Ullman 这个老头, 好玩的趣事就更加多了, 比如他是 Sergey Brin的导师, 他有两大不回信原则: 陶瓷信不回, 问书后习题信不回.

[under construction, more later…]

Modern OS

(Artificial Intelligence: A Modern Approach(AIMA)

Structured Compter Architecture

Computer Architecture: A Quantitative Approach

Computer Networks

B类, 编程

K&R C

Programming Pearls and More Programming Pearls
The Practice of Programming
Code Complete or The Elements of Programming Style
MMM(Mythical Man Month)
GoF’s Design Pattern
The Art of Unix Programming

C类, Geek

H2G2
GEB
How to Solve It
Elements of Style
The Cathedral and the Bazaar

Comments (7)

海外留学生怎么就不能爱国

牛博网的胡缠同学文如其名, 写文章常常胡缠,毫无逻辑. 比如最近一篇 <海外留学生最爱国>, 打死我也没看出来他怎么论证这个”最”字. 倒是在最后红字标出了要驳论的稻草人, 即”无论怎样, 仍然支持“. 我还真没发现哪个人用过这个句式, 如果胡缠同学发现了, 不妨展示一下.  胡缠同学一方面立了一个稻草人, 另一方面”使用常识”来驳论, 从价值观上毫无理由直接把支持这个行为打成土鳖. 最后为了炫耀自己的一点小虚荣, 还政治正确的”情不自禁的恶毒一下”, 别, 胡缠同学, 您继续恶毒, 别这么政治正确.

胡缠同学的文章从自己是海龟起头, 到别人是环绕世界的土鳖结尾, 文中没有任何立论, 所以我主观恶毒的提取一下主干就是: “我是美国读过书的人,我是海龟,你们周游列国的依然支持的全是土鳖”. 这么宏大的叙事本应该起一个更好的标题, 比如”内有海龟慎入”. 可惜白糟蹋了一个适合愤青专用的标题。 我越俎代庖, 结合胡缠同学最近的几篇文章, 帮他归纳出来的论题就是: “留学生见识了西方的自由民主, 应该跳出爱国主义这个樊篱, 把爱国当成一种自由的选择去做”. 那么我就反问了, 海外留学生怎么就不能选择爱国了?

圣火过街, 抗议不少. 假如这个抗议是举个牌子喊个广播, 那就用不着人去护卫火炬了. 恰恰相反, 抢圣火的比呛声的人多多了, 暴力抢圣火破坏奥林匹克的事情要不要去出头? 中国在世界各地的大使馆轮流被攻击, 我体会到的就是本来芝加哥大使馆要各地走一下方便留学生换签证的事情因为大使馆被攻击而取消了, 这样的行为要不要被谴责? 在西方, 一个原则就是如果你自己不说话, 别人就把你当哑巴. 如果不防卫抢圣火和藏独的恐怖行为的话, 那圣火就被抢走, 大使馆就被占领, 也没人同情. 反而别人觉得应该的.

中国留学生在美国很不待见. 美国人先入为主, 你是共产主义国家被洗脑的, 又是没有信仰上帝的, 简直是邪恶透顶. 我们不管英语说的多么好, 有色眼镜也是一样存在的. 现在很多人把少数民族的话题扯上来, 在海外的留学生大部分是汉民族的, 我们又莫名其妙多了一项罪名: 文化灭绝西藏. 我们为什么不能出头向别人解释我们汉民族没有所谓的文化灭绝? CNN, BBC 整天报道中国政府如何如何, 夹杂着对中国政府的不信任. 媒体当然很专业, 不会把祸水引导到普通汉族人民身上. 可是阅读者呢? 阅读者看了, 就会觉得一切中国人都是邪恶的, 欺压西藏人, 而且被洗脑了, 连民主都不想要. 人家看我们, 是一种看没救的受害者和施暴者的表情, 是从高处看的. 我在美国生活将近两年了, 基本融入到了日常的生活, 可是口音, 肤色这些东西都不会改变的. 现在自由派知识分子猛烈抨击国家的民族政策, 我没有发言权, 但是我们留学生从某个程度上讲, 和少数民族没有区别. 如果我们不主动撕掉身上被西方媒体和宣传有意无意加的标签, 我们就会一直是被误解和误会的.

自由派知识分子往往很喜欢美国的夹带私货的做法, 打伊拉克明明想要石油非要告诉人家它有WMD. 现在也是, 明明旗子上写的是想在中国推广自由和民主, 非要加上政治正确这样一个遮羞布, 显得自己很无私很世界大同. 美国911的时候帮着美国人说 God Bless American, 现在别人爱国的时候我就说国不重要; 恐怖分子出现的时候就支持打伊拉克, 现在别人暴动的时候就说要和谈和谈. 无论怎样都是占据道德的制高点, 没人敢说不正确, 说不正确就是道德有问题. 西藏独立这样一个议题, 自由派知识分子本应该关注的应该是改善全国包括西藏的人权状况, 在国内推广自由民主, 而不是夹上私货, 表示要充分听取暴力藏独的意见, 顺带通过圣火和奥运被破坏羞辱一下共产党. 如果我会画漫画, 我一定给中国的自由派知识分子画上两个小粉拳, 左边是从西方左派借来的政治正确, 右边是逢共必反. 左拳用来施展一下自己宽容而高尚的知识分子道德情操, 右拳用来挽上西方的胳膊. 头带上写的很大的几个大字: Freedom, 其实口袋里面不是放着圣经, 就是放着转啥轮, 要不就是美国美元. 至于口袋空空两袖清风的自由派, 早就在民国之后消失了.

中国的民主和自由的希望, 应当寄托在全体中国人民身上. 海外留学生带给中国和世界的, 是一个进步的正面的中国, 而不是歪曲的被误解的中国. 有些自由派知识分子对海外留学生没有和他们站到统一战线上反 共很不爽, 就开始拿出土鳖海龟理论, 仿佛只要你丫爱了国, 你就是土共, 是土鳖. 其实海外留学生对中国的自由和民主进程的关心, 可能比自由派知识分子的动机更加单纯和直接.

我一直认为, 没有独立人格的人,借来的粉拳, 终究是无力少女的小粉拳, 看上去很美, 摆设而已.

Comments (9)

大型MMORPG杀人游戏”际莎”开始内测

经过长期深入研究魔兽世界和传奇等游戏, 我公司一名实习生, 联合世界上最大的网络服务提供商 Google, 作为 Google Summer Code 的一个项目, 利用 100% 的业余时间, 开发出了一款基于Gtalk 的大型多人在线角色扮演游戏: Gtalk 版杀人游戏际莎 (下文简称为际莎). 本游戏具有如下特点:

1. 三大职业系统: 警警察察, 平民和杀手. 三小职业系统: 城管: 看上去像警察其实是杀手的. Leon: 看上去是杀手其实不太冷的平民. 便衣: 看上去是平民其实是警察的. 各个职业都具有转生系统, 玩家可以自由选择偏好.

2. 无经济和武侠系统. 在巨人等网游充分利用猪肉涨价赚取用户道具钱的时候, 本游戏不使用任何道具,一举解决长期困扰韩国网游的玩家打道具赚钱的弊端. 无武侠系统使得白领玩家和学生一族不会练功走火入魔,促进社会和谐.

3. 公会即时通信支持. 本机器人可实现一定程度的语音识别, 自动将用户声音识别并以文字传送给特定玩家,使得您海内存知己, 晤言一室中. 真正意义上实现了杀人游戏的乐趣. 同时用户还可以通过及时免费的文字通信掌握游戏动态. 短信不收取信息费.**

4. 低配置的客户端支持. 根据我们测试结果, 奔腾 66Mhz 计算机可以顺利运行我们的游戏客户端. 在游戏客户端越来越大, 对显卡要求越来越高的今天, 我们反其道行之, 使用简单的网络协议, 让您在浏览器中即可实现游戏. 强大的协议使得您可以选择苹果或者Linux等小众平台, 同时老板键可以让你一键切换到 word/excel. 您还可以在 excel 里面边做表格边操作游戏. 目前支持的系统有 Windows 3.2, DOS 6.22, Linux 0.01+, 苹果 OS 8+, SUN OS3+ 和 MINIX. 硬盘 10Mb+, 处理器 1MHz +, 显卡不是必须配置.

5. 防沉迷系统. 家长不必担心孩子沉迷游戏, 因为按照我们和Google签订的协议, 未满18岁不能获得游戏所需Google 账号*. 成年人在连续6小时后, 自动转入休息模式. 系统自动播放轻柔的背景音乐让您获得充分休息+.

6. 强大服务器和网络支持. 目前该系统运行于三台 SUN Ultra II 和 4 台AMD 64 组成的集群上, 光纤接入美国信息高速公路骨干网. 电信网通均可接入, 延时不超过0.01ms, 可支持5000人同时在线. ultra-enterprise2.jpg

际莎内测期间,小规模放号, 请加 sharenyouxi@gmail.com 为好友.^ 一旦内测稳定, 即转入公测, 不删号, 经验值和等级可积累. 本游戏承诺永远免费**.

附注:

* 其他服务商可能不限制jabber 账号注册年龄, 由此带来的一切负担本公司概不承担.

+ 本功能可能需要高速网络连接支持, 如 ADSL.

** Google 可能会在杀人游戏过程中加入广告, 用户必须接受此才能游戏.

^ 先别加了, 各位愚人节快乐. 这个机器人短期肯定会上线. 到时候欢迎内测, 永远免费.

Comments (6)

独立思考

最近的政治事件发生后,各派有各派的说法,我也不想强加自己的看法给别人,只略说几句关于独立思考的事情。

无论哪种媒体,都是沿着自己的价值观路线走的, 这一点在世界各国都存在。只有认真观察,独立思考的人才能得到客观的结论。就我的观察,西方的目击者写下的报道都比较客观,不因为自己主张什么或者希望看到什么而去掩饰什么。我们没有目击的人,要从多个信息源互相参照。

我天朝一贯使用和谐方法治理言论,这次还算有理有据还居然吃亏了。如果当时更多的西方人士不被赶走,至少舆论阵地上不会丢失。我天朝外办有钱,但是从来不懂外宣工作。这次如果不是海外华人出头,我天朝的舆论更加被动。运独轮都有自己的宣传机器,我天朝独独高高在上,使用“为广大人民根本利益“这种空虚字眼,剥夺听众独立思考的权利,这种宣传方式,是没有人喜闻乐见的。

独立思考是重要的,王小峰说:就不发表意见。一群人嗷嗷待哺等着公众人物发表意见这种现象正反应了独立思考的丧失。

某些左派和右派都可以拿此事举例子,说明自己的思想正确。不幸的是有些人连以暴易暴这种话都说的出来, 或者千方百计帮着自己钟爱的某些公正客观的而这次偏偏不公正客观的西方媒体解释说明而不顾事实。 这些做法,实在是屁股决定脑袋。因为自己的站位就是一贯如此,因此就为了反对而反对,为了支持而支持,实在弱智得可以。

对了, 历史一次一次证明,压制对手的结果就是少壮派崛起,温和派衰落。想解决问题,还是要找温和派。

(我是左派,主张非暴力主义,认为任何媒体都是为其核心价值观服务的。我的观点可能是错误的,请独立思考)

Comments (2)

几个趁手语句

处于局域网中的小型开发团队常常需要互相贴代码, 传文件, 共享资源, 我长期使用过程中总结了几行趁手的语句, 贴出来共享. (本文不适合 windows 用户)

1. Gtalk 传递命令行程序输出信息

常常需要把程序的输出结果或者调试结果通过 IM 发给同事诊断. 而这些结果通常都在字符界面下,拷贝出来很麻烦,于是,我写了一个小程序 gpipe.py,可以把 gtalk 当作一个管道接在程序后面, 比如说, 想把程序编译结果给郝培强(tinyfool),

make 2>&1 | gpipe tinyfool

他的gtalk 客户端就被我用输出给淹没了.
有兴趣的还可以套接 gtalk, 把信息用 base64 编码, 接受方再解码, 如此一来, gtalk 就和Linux 中的管道一样, 将一个机器上的程序的输出套接到另一个机器上另一个程序的输入. 实践证明, 在跨平台的环境下这种做法比使用中间文件分别执行高效很多. 调试时间也大大减少.

2. 传送文件作为邮件附件.

使用matt 客户端,一行即可完成:
echo “Content” | mutt -s “Subject” -a file email@address.demo

这个方法对及时传输一些小文件非常有效, 特别是传送源代码. 还能起到存档备份的效果, 反正Gmail 那么大不用也浪费. 懒人还可以进一步用一个脚本包装, 比如我机器上就包装出了一个 sendboss.sh, 里面是:
echo “Hi, These are the file(s), thanks. Eric” | mutt -s “File” -a $* myboss_email@wustl.edu

这样我每次就只要 “sendboss.sh files” 就可以了. 我老板常常惊讶于我发送文件的反应速度.

3. 一行语句的HTTP文件服务器.

python -m SimpleHTTPServer

即可将当前目录开设为一个8000端口的http 服务器的根目录. 在局域网中,如果需要临时共享当前目录下的一个较大文件,这个方法简便安全,实在是居家旅行必备.

还有, 下载的时候使用 “wget -c” 可以断点续传,很多哥们好像不知道这个小花招.

4. NFS 共享文件夹

SVN 和 CVS 对于代码和文档控制得很好,可是团队中免不了有些 PDF 文档或者色戒电影需要全团队共享,又不需要送到版本控制系统里面。一个共享的文件夹很有必要. 最简单的方法是使用 NFS, 能够跨平台且性能稳定. 具体服务器设置可以参考这里,客户端只要

mount nfs_server:/dir /mnt/share

即可顺利使用此文件夹. 此法对于有电驴 bt 爱好者存在的团队来说,实在是必备良方.

Comments (8)

博客推荐之三

今天推荐三个博客, 两个师兄, 一个学弟, 都是技术和生活类博客.

1. Pongba 刘未鹏

比我大一岁已经出了好几本书的正牌师兄. 对C++和其他编程语言都有深刻研究. 文笔我, 说理清楚, 适合喜欢计算机科学的以及同龄人. 博客在 CSDN.

随机文章:

康托尔、哥德尔、图灵——永恒的金色对角线

关于谭浩强老先生的《C++程序设计教程》

学习密度与专注力


2. cn.zhangzheng 张振

比我大一岁的混迹数家知名企业的自称 IT民工的正牌师兄. 当年我在西门子实习的时候就是靠此师兄罩着. 博客叫做 Z^{2}, 其实可以当成中国调侃版 Joel on Software.博客在 MSN Spaces

随机文章:

一个程序员的自我修养

有什么样的人民就有什么样的程序员

两会报告之IT民工理解


3. chen yufei

比我小两岁的南京大学软件学院的师弟. (好像) 在 SUN 实习. 文章内容涵盖开源技术 Ruby等语言,以及大学生活. 独立博客.

随机文章:

求斐波那契 (Fibonacci) 数列第 n 项的算法

我来自浦口大学

看 Concrete Mathematics 时对教科书的一点感想

Comments (2)

工具的强是无敌的

故事A:

昨天我去一家美国理发店理发 (以前我都是自己动手), 理发师傅拿出一大堆奇形怪状的梳子(左图), 让我挑一个.comb1.jpg 我心说这是干啥,烫发呐?理发师傅让我选一个号码. 我看了看,上面标记了4′, 5′ 6‘ 之类的号码. 表示留多长. 我百思不得其解, 在国内理发,只要说大致留多长,理发师傅就自然知道. 这里居然还拿出一些梳子来量长度, 此为不解一; 还有这些梳子和长度有啥关系呢, 此为不解二. 没等我问清楚,师傅就自作主张给我挑选了一个4’. 然后把4’梳子咔嗒一下装上了推子(右图). comb2.jpg哦, 娘的,我心说,原来梳子是量着头皮到推子之间的距离的. 然后,他就随意在我头上像刮冬瓜皮一样捣鼓起来, 把我的乱糟糟的鸟巢发型彻底改造成了美国大兵头。 刮完了,手一伸,15元大洋. 感慨啊,原本超级有技术含量的事情,就变成了刮冬瓜皮.

故事B

我在家看美国版菜谱, 经常遇到上面写着img_0181.JPG放 1/4 茶勺盐, 或者加 1/3 杯水. 做中国菜还能估摸着放, 做甜点或者牛排的时候就心虚了,于是某次到沃尔玛,我就亲自考察一下一茶勺到底多大,这样做到心里有数. 到了货架前面我就被彻底震撼了. 娘的,居然有一个勺,就叫 “1/4茶勺” (见右图,点击可放大).

img_0186.JPG好吧,我被彻底打败了. 我触类旁通,又去找 1/3 杯, 果然又被我找到了.

好吧, 不得不承认,工具的强悍是无敌的. 我喝下1/3杯水,顶着标准化生产的美国大兵头,写下了这篇 Blog.

Comments (9)

循环迭代器和闭包

通常, C 程序员使用如下代码对 a 数组的每个元素进行操作:

for (i = 0; i < n; i++) func(a[i]);

这行代码有三个独立的逻辑, for 循环控制了对 a 的访问顺序, a[i] 控制了对 a 数组的元素访问方式, func() 函数控制了对 a 元素的操作. 这个三个逻辑是彼此独立的. 然而, 问题逐渐浮出水面. 首先是 for 循环的次序. 对于随机存取的数组 a, 访问顺序应当是没有关系的. for( i=n-1; i>=0; i–) 也是可以的. 一个简洁的语言应当突出逻辑, 丢掉不必要的代码. 因此, 最好能写成

foreach (k in a)  func(k);

这个解一石二鸟, 第一是把访问顺序逻辑彻底抛弃, 第二是改变了访问方式, 从此没有烦人的 ArrayIndexOutOfBoundException, 不需要担心访问越界. 在函数式编程语言中, 类似的形式是:

map(func, a)

我们希望 foreach 能够遍历一个数据结构的每个元素一次. 可是这个终究是一个语法糖, 因为它只能胜任特定的数据结构. 对于用户自己设计的一些数据结构, 比如树, 想同时拥有先序和后序遍历, foreach 就无能为力了. 与此同时, 我们也不想用 for 那样简单粗暴的方式去控制访问顺序 (因为很容易导致内存越界, 而且很多数据结构不支持随机存取). 这时候, 就需要迭代器的帮助了. 因为不同的数据结构要求不同的访问顺序, 我们希望数据结构本身能够提供一些访问顺序. 这种对于数据结构上元素访问顺序的抽象, 被称为迭代器. 一般来说, 迭代器通过 getIterator() 被数据结构构造, 具有一个 hasNext() 的判断和一个 next() 的函数. 对一个数据结构的访问可以四海一家的写成:

for (i = a.getIterater(User’s_Order); i.hasNext(); i.next() ) func(i.current());

迭代器把访问逻辑从数据结构上分离出来, 是一个常用的设计方法. Design Pattern 也把它作为23个Pattern之一.在 STL 中也到处都是了它的身影. 但对一个完美主义者来说, 这个代码还是太冗长, 既然对数据结构的访问能够四海一家的写成如此, 为何不直接规定一个简洁的语法访问呢? 是的, 我们希望返朴归真, 回到原来的形式:

for i in a.SomeIterator(): func(i)

好消息是现代语言都支持这样的方法. [注: 在C/C++ 语言中, 还不能支持上面的写法. C#有类似的写法. 在 Ruby 和 Python 中很常见. ] 可是能不能再简化呢, 能不能连 i 这个中间变量都不要呢? 我们简直希望写成:

a.SomeIterator(func)

是呀, 这样的世界多美好啊. 可是, 别忘了在面向对象的语言中间, 一切都是对象. 在 C 的时代, 我们可以通过函数指针把 func 参数传递进去. 可是这里是对象, 怎么办呢. 很简单, 只要构造一个只有一个方法的对象, 传进去就行了. 这样的构造方法, 居然也是一个设计模式, 叫做函数对象(Function Object), 或者叫函数子 (Functor). 被 Java 的匿名内部类这个概念折腾到崩溃的读到这里, 应该知道所谓的匿名内部类, 就是为了在面向对象的环境中做函数传递这个事情而想出来的小花招. Java 的写法就是

a.SomeIterator( new FunctionObject()
{ public func(a)
{return something;}
});

[为了引用这样一个函数, 使用了天书一般的不必要代码, 可想有多少人真的喜欢这个方法]

逃离了Java 的世界, 我们来到 Python 或者 Ruby 或者其他函数式语言的世界, 激动的发现原来函数也是一种对象, 和其他对象一样在 Python 中坐上头等舱. 如此好事怎么能错过呢. 于是, 大摇大摆写上:

a.SomeIterator(func)

没有类型检查, 也没有复杂代码, 连一个辅助变量都不多谢, 真舒服. 在 Python 中间, 这样的模式比比皆是, 比如 os.path.walk(path, visit, arg) 可以对path目录下所有的文件遍历, 并且调用 visit 函数处理, 还可以夹带一个私货 arg 进去, 非常方便. [注: os.walk() 则反其道行之, 提供一个 generator, 外部用 for 访问]

从外面夹带私货不算特别困难, 毕竟可以通过修改函数的定义方式来实现. 可是假如想从迭代器里面夹带一些私货出来给函数用, 就有点困难了. 比如说, func 函数需要访问迭代器的一个私有的变量. 显然把迭代器作为参数传给函数是不行的. 只能反其道行之, 让迭代器把函数当成自己人, 以迭代器为主, 把函数包含到迭代器的作用域内才能玩转. 这个就是所谓的闭包. 也就是说, 一个函数被包入另一个更大的作用域, 并且可以访问大的作用域里面的变量. C/C++ 是不允许在函数里面定义函数的, 所以只好望着闭包干羡慕. Java 算不错了, 用内部类解决了这个问题.

我们说个具体的例子: 函数 func(x) 需要另一个值 y, 返回 x*y, 另一个值 y 在外部作用域定义了. 写成 Python 代码

a= [1, 2, 3]
def func(x):
return x*y

for y in a:
print func(2)

会出现 2,4,6

我们可以看到, 函数func 的定义和使用是独立的. 而静态语言是不能随便在什么位置都能定义函数闭包的, 原因不难解释: 编译器会跳出来告诉你 y 这个变量没有定义. 因为动态语言在运行时才能得到 y 的值, 从而使用 func, 所以不存在这个问题. 动态语言的灵活性在此充分展现. 最后, 既然我们知道迭代器后面必然要加一个闭包, 还要括号干啥? 不如直接写成 (实际上, Groovy 语言就是这样的):

a.each func

从简单的循环, 到迭代器, 到生成器, 到内部类, 到函数作为一级对象, 再到闭包, 过程式编程语言, 对象编程语言和函数编程语言越来越呈现融合的趋势.

Comments (5)

请懂量子力学的一起帮我参详一篇论文

文章名:

Ultimate Physical Limits to Computation [计算的终极物理极限]

作者: MIT 的 Seth Lloyd,  量子计算领域顶尖科学家.

概要:  计算机是一种物理系统,因此肯定服从物理系统的规律。文章研究了一千克的计算机最多一秒能执行多少次逻辑运算,最大存储容量是多少,并且给出了定量的结果。所以, 摩尔定律不能永续。

这些问题和我以前提到的比特每焦耳问题是很相似,但是我物理基础有限,不能全部理解。
本文发在 2000 年 Nature.地址: 

http://puhep1.princeton.edu/~mcdonald/examples/QM/lloyd_nature_406_1047_00.pdf

有兴趣的直接给我发邮件或者gtalk: xu.mathena [A@T] gmail.com

Comments (3)

« Previous entries · Next entries »