Everything you care about in one place

Follow feeds: blogs, news, RSS and more. An effortless way to read and digest content of your choice.

Get Feeder

rsshub.app

王垠的博客-当然我在扯淡

Get the latest updates from 王垠的博客-当然我在扯淡 directly as they happen.

Follow now 89 followers

Latest posts

Last updated over 2 years ago

什么是“对用户友好”

about 14 years ago

什么是“对用户友好” 当我提到一个工具“对用户不友好”(user-unfriendly)的时候,我总是被人“鄙视”。难道这就叫“以其人之道还治其人之身”?想当年有人对我抱怨 Linux 或者 TeX 对用户不友好的时候,我貌似也差不多的态度吧。现在当我指出 TeX 的各种缺点,提出新的解决方案的时候,往往会有美国同学眼角一抬,说:“菜鸟们抱怨工具不好用,那是因为他们不会用。LaTeX 是‘所想即所得’,所以不像 Word 之类的上手。” 殊不知他面前这个“菜鸟”,其实早已把...

GTF - Great Teacher Friedman

about 14 years ago

GTF - Great Teacher Friedman 写小人书的老顽童 Dan Friedman 是 Indiana 大学的教授,程序语言领域的创始人之一。他主要的著作《The Little...

什么是语义学

almost 14 years ago

什么是语义学 很多人问我如何在掌握基本的程序语言技能之后进入“语义学”的学习。现在我就简单介绍一下什么是“语义”,然后推荐一本入门的书。这里我说的“语义”主要是针对程序语言,不过自然语言里的语义,其实本质上也是一样的。 一个程序的“语义”通常是由另一个程序决定的,这另一个程序叫做“解释器”(interpreter)。程序只是一个数据结构,通常表示为语法树(abstract syntax tree)或者指令序列。这个数据结构本身其实没有意义,是解释器让它产生了意义。对同一个程序可以有不同的解释,就像上面这幅图,对画面元素的不同解释,可以看到不同的内容(少女或者老妇)。 解释器接受一个“程序”(program),输出一个“值”(value)。用图形的方法表示,解释器看起来就像一个箭头:程序 ===> 值。这个所谓的“值”可以具有非常广泛的含义。它可能是一个整数,一个字符串,也有可能是更加奇妙的东西。 其实解释器不止存在于计算机中,它是一个很广泛的概念。其中好些你可能还没有意识到。写 Python 程序,需要 Python...

怎样写一个解释器

almost 14 years ago

怎样写一个解释器 写一个解释器,通常是设计和实现程序语言的第一步。解释器是简单却又深奥的东西,以至于好多人都不会写,所以我决定写一篇这方面的入门读物。 虽然我试图从最基本的原理讲起,尽量不依赖于其它知识,但这并不是一本编程入门教材。我假设你已经理解 Scheme 语言,以及基本的编程技巧(比如递归)。如果你完全不了解这些,那我建议你读一下 SICP 的第一,二章,或者 HtDP 的前几章,习题可以不做。注意不要读太多书,否则你就回不来了 ;-) 当然你也可以直接读这篇文章,有不懂的地方再去查资料。 实现语言容易犯的一个错误,就是一开头就试图去实现很复杂的语言(比如...

TeXmacs:一个真正“所见即所得”的排版系统

almost 14 years ago

TeXmacs:一个真正“所见即所得”的排版系统 好久没有推荐过自己喜欢的软件了,现在推荐一款我在美国做数学作业的私家法宝:TeXmacs。我恐怕不可能跟以前那么有闲心写个长篇的 TeXmacs 说明文档了,不过这东西如此的简单好用,所以基本上不用我写什么文档了。鉴于知道的人很少,不理解它的人很多,这里只是帮它打个广告,吊一下胃口。 TeXmacs 的主要特点是: 跟 Lyx 等不同,它不是一个 TeX 的“前端”,而是一个完全独立的,超越 TeX...

Braid - 一个发人深思的游戏

over 13 years ago

Braid - 一个发人深思的游戏 我已经很久很久没有打游戏了(如果不算 Angry Birds 之类用来打发时间的游戏的话)。我的最后一个真正意义上的游戏机是 PlayStation 1。在那上面,我真正欣赏的最后一个游戏,是 Metal Gear Solid...

解密“设计模式”

over 13 years ago

解密“设计模式” 有些人问我,你说学习操作系统的最好办法是学习程序设计。那我们是不是应该学习一些“设计模式”(design patterns)。这是一个我很早就有定论,而且经过实践检验的问题,所以想在这里做一个总结。 总的来说,如果光从字面上讲,程序里确实是有一些“模式”可以发掘的。因为你总是可以借鉴以前的经验,用来构造新的程序。你可以把这种经验叫做“模式”。可是自从《设计模式》(通常叫做 GoF,“Gang of Four”,“四人帮”)这本书在 1994 年发表以来,“设计模式”这个词有了新的,扭曲的含义。它变成了一种教条,带来了公司里程序的严重复杂化以及效率低下。 GoF 借鉴的是一个叫 Christopher...

谈 Linux,Windows 和 Mac

over 13 years ago

谈 Linux,Windows 和 Mac 这段时间受到很多人的来信。他们看了我很早以前写的推崇 Linux 的文章,想知道如何“抛弃 Windows,学习 Linux”。天知道他们在哪里找到那么老的文章,真是好事不出门…… 我觉得我有责任消除我以前的文章对人的误导,洗清我这个“Linux 狂热分子”的恶名。我觉得我已经写过一些澄清的文章了,可是怎么还是有人来信问 Linux...

Oberon 操作系统:被忽略的珍宝

over 13 years ago

Oberon 操作系统:被忽略的珍宝 推荐一篇很久以前看的文章:Oberon - The Overlooked Jewel 它介绍的是 Niklaus Wirth 设计的一种操作系统,叫做 Oberon。Niklaus...

谈语法

over 13 years ago

谈语法 使用和研究过这么多程序语言之后,我觉得几乎不包含多余功能的语言,只有一个:Scheme。所以我觉得它是学习程序设计最好的入手点和进阶工具。当然 Scheme 也有少数的问题,而且缺少一些我想要的功能,但这些都瑕不掩瑜。在用了很多其它的语言之后,我觉得 Scheme 真的是非常优美的语言。 要想指出 Scheme 所有的优点,并且跟其它语言比较,恐怕要写一本书才讲的清楚。所以在这篇文章里,我只提其中一个最简单,却又几乎被所有人忽视的方面:语法。 其它的 Lisp “方言”也有跟...

程序语言的常见设计错误(1) - 片面追求短小

over 13 years ago

程序语言的常见设计错误(1) - 片面追求短小 我经常以自己写“非常短小”的代码为豪。有一些人听了之后很赞赏,然后说他也很喜欢写短小的代码,接着就开始说 C 语言其实有很多巧妙的设计,可以让代码变得非常短小。然后我才发现,这些人所谓的“短小”跟我所说的“短小”完全不是一回事。 我的程序的“短小”是建立在语义明确,概念清晰的基础上的。在此基础上,我力求去掉冗余的,绕弯子的,混淆的代码,让程序更加直接,更加高效的表达我心中设想的“模型”。这是一种在概念级别的优化,而程序的短小精悍只是它的一种“表象”。就像是整理一团电线,并不是把它们揉成一团然后塞进一个盒子里就好。这样的做法只会给你以后的工作带来更大的麻烦,而且还有安全隐患。 所以我的这种短小往往是在语义和逻辑 层面的,而不是在语法上死抠几行代码。我绝不会为了程序显得短小而让它变得难以理解或者容易出错。相反,很多其它人所追求的短小,却是盲目的而没有原则的。在很多时候这些小伎俩都只是在语法层面,比如想办法把两行代码“搓”成一行。可以说,这种“片面追求短小”的错误倾向,造就了一批语言设计上的错误,以及一批“擅长于”使用这些错误的程序员。 现在我举几个简单的“片面追求短小”的语言设计。 自增减操作 很多语言里都有...

“解决问题”与“消灭问题”

over 13 years ago

“解决问题”与“消灭问题” 一直以来,人们都重视“解决问题”的能力,却忽视了另一种重要的能力:“消灭问题”的能力。各种各样的竞赛,分数和排名,让很多人从小就片面的认为,能“解决问题”的人,就是最厉害的人。拿到一个问题就埋头求解,很少考虑这问题到底有什么意义。这种呆板的思维方式,不仅存在于低级的“应试”和“解题”过程,而且蔓延到了很多艰深的研究领域。 如果你仔细观察就会发现,很多“难题”,其实是“人造”出来的,而不是“必然”的。它们的存在,往往是由于一些早期的“设计错误”。人造的东西里面往往有设计上的错误,如果你把这些东西看成是不可改变的东西,那你就会遇到很多不必要的问题。打个比方,如果当初轮子被设计成方形的,而没有人质疑这样做的“必要性”,那么也许人类早就因为“能源问题”而灭绝了。有点夸张,但它却形象的说明了,为什么错误的设计会导致不必要的难题。 其实如果我们转换一下思路,或者改变一下“设计”,很多问题就可以不解自消。这就是我所谓的“消灭问题”的能力。这种“消灭问题”的能力,表面上容易其实难,有点像脑经急转弯,所以经常受到人们的忽视。看到一个问题轻而易举的消失了,总有人满不在乎的说:“这个容易。我也能做到。” 可问题就在于,你怎么没想到?说这种话的人,完全没有意识到,他们的思维里面其实缺少了非常重要的东西。由于喜欢炫耀自己的“头脑暴力”,他们经常解决(甚至制造)错误的问题。 所以,在解决问题之前,我们应该先问自己三个问题: 这问题是否真的“存在”? 也许你已经看出来了,很多问题,即使众人都认为它存在,其实也可能是不存在的。在这一点上不能相信任何人或者机构,不管他有多么的“权威”。就像小马过河的道理,只有靠自己的实践。 如果解决了这个问题,会给我和他人带来什么实际的好处? 世界上不存在“永远”,也不存在“无穷”。如果一个“科学算命家”花100年才能算出我的未来,那我还不如坐等“未来”的到来。所有的人,都不过是来这世界上做短暂的旅行。所以,问题的答案,应该能在合理的时间之内给人带来实际的好处。 这问题是否可以在简单的改变某些“设计”或者“思路”之后,不复存在? 很多问题的“存在”,其实是因为人们的“思维定势”。他们看不到问题的“根源”和因果关系,而是经常在下意识里假定某种“先决条件”(A)的存在,然后坚定不移的相信由此“导致”的问题(B)的存在,如下图:...