<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">

<channel>
	<title>4G spaces</title>
	
	<link>http://blog.youxu.info</link>
	<description>I am Eric, Xu, a Ph.D. student at Washington University. I share my experiences about my life, my universe and everything here.</description>
	<pubDate>Fri, 03 Jul 2009 19:27:23 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.1</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/xumathena" type="application/rss+xml" /><item>
		<title>编程珠玑番外篇-F. 高级语言怎么来的-3</title>
		<link>http://blog.youxu.info/2009/07/02/fortran/</link>
		<comments>http://blog.youxu.info/2009/07/02/fortran/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 04:16:37 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
		
		<category><![CDATA[CompSci]]></category>

		<category><![CDATA[pearl]]></category>

		<category><![CDATA[tech]]></category>

		<category><![CDATA[fortran]]></category>

		<guid isPermaLink="false">http://blog.youxu.info/?p=950</guid>
		<description><![CDATA[FORTRAN 语言是怎么来的
在高级语言是怎么来的子系列的第一篇中， 我们结合当时硬件的特点，分析了 FORTRAN 为什么一开始不支持递归。但是 FORTRAN 本身是怎么来的这个问题其实还是没有得到正... ]]></description>
			<content:encoded><![CDATA[<h3>FORTRAN 语言是怎么来的</h3>
<p>在高级语言是怎么来的子系列的<a href="http://blog.youxu.info/2009/05/13/hpl/">第一篇</a>中， 我们结合当时硬件的特点，分析了 FORTRAN 为什么一开始不支持递归。但是 FORTRAN 本身是怎么来的这个问题其实还是没有得到正面回答，本节我们就谈谈 FORTRAN 语言本身是怎么来的。</p>
<p>其实，FORTRAN 语言也是现实驱动的。 所以我们还是回到当时，看看当时程序员的需求和软硬件条件，看看 FORTRAN 是怎么来的。 了解历史的另一个好处是， 因为 FORTRAN 的发展历史正好和高级语言的发展历史高度重合，所以了解 FORTRAN 的背景，对于理解其他高级语言的产生都是大有帮助的。</p>
<p><strong>1. 困难的浮点计算</strong><br />
我们先从硬件的角度说起。 大致从 1946 年第一台计算机诞生，到 1953 年，计算机一直都缺少两件非常重要的功能，一个叫浮点计算，一个叫数组下标寻址，这两个功能的缺失直接导致了高级语言的兴起。 我们依次单个分析。读者对浮点计算应该都不陌生，用通俗的话说就是如 0.98×12.6 这样的实数乘法，或者  0.98 + 12.6 这样的实数加法的运算。用行话说，就是用计算机进行大范围高精度数的算术运算。</p>
<p>学过二进制的同学都知道，二进制整数之间的乘法和加法等运算都是相对简单的，和正常的十进制运算是一样的，只是把加法和乘法这些基本操作用更加简单的逻辑或(OR) 和 逻辑与 (AND) 实现而已，在电子电路上也很好实现。 因此，就是世界上最早的电子计算机，ENIAC，也是支持整数的乘法加法等算术操作的。</p>
<p>可是浮点运算就不一样了。 因为一个额外的小数点的引入，在任何时候都要注意小数点的对齐。 如果用定点计数，则计数的范围受到限制，不能表示非常大或者非常小的数。所以，浮点数一般都是用科学记数法表示的，比如 IEEE 754 标准。（不熟悉 IEEE 754 的读者也可以想像一下如何设计一套高效的存储和操作浮点数的规范和标准，以及浮点算法）， 科学记数法表示的浮点数的加减法每次都要对齐小数点，乘除法为了保持精度，在设计算法上也有很多技巧，所以说，相比较于整数的运算和逻辑运算，浮点运算是一件复杂的事情。落实到硬件上就是说，在硬件上设计一个浮点运算，需要复杂的电路和大量的电子元器件。在早期电子管计算机中，是很少能做到这么大的集成度的。因此，不支持浮点也是自然的设计取舍。在计算机上放一个浮点模块这个想法，需要等电子工业继续发展，使得电子管体积小一点，功耗低一点后，才能进入实践。</p>
<p><strong>2. 关于浮点计算的一些八卦</strong></p>
<p>关于浮点，这里顺带八卦一点浮点计算的事情。在计算机芯片设计中，浮点计算一直是一个让硬件工程师头疼的事情，即使到了386时代，386 处理器 (CPU)的浮点乘法也是用软件模拟的，如果想用硬件做浮点乘法，需要额外购买一块 80387 浮点协处理器 FPU，否则就在 386 上做软件的模拟。这样做的原因在一块硅片上刻蚀一个 CPU 和一个FPU 需要的集成度还是太高，当时的工艺根本没法实现。真的把 FPU 和 CPU 融在一起刻蚀到一块硅片上，已经是 1989 年的事情了。当时，Intel 把融合了 80386 和 80387 的芯片改了改，起了个名字叫 80486，推向了市场。带着浮点的处理器的普及，使得个人计算机能做的事情变多了。极度依赖于浮点计算的多媒体计算机（视频和声音等多媒体的压缩，转换和回放都是要依赖于浮点运算的），也正好随着 80486 的流行，逐渐普及开来。</p>
<p>在处理器上融合浮点运算依然是困难的。即使到今天，很多低端的处理器，都不带有浮点处理器。 所以，号称能够上天入地的，被移植到很多低端设备比如手机上的 Linux 内核，必然是不能支持浮点运算的，因为这样会破坏内核的可移植性。我们都知道， 在内核模式下，为了保证内核操作的原子性，一般在内核从事关键任务的时候所有中断是要被屏蔽的，用通俗的话说就是内核在做事情的时候，其他任何人不得打 扰。 如果内核支持浮点运算，不管是硬件实现也好，软件模拟也罢， 如果允许在内核中进行像浮点计算这样复杂而耗时的操作，整个系统的性能和实时响应能力会急剧下降。  即使是在硬件上实现的浮点运算，也不是件容易的事情，会耗费CPU较多的时钟周期，比如 Pentium 上的浮点数除法，需要耗费 39 个时钟周期才行，在流水线设计的CPU中，这种占用多个时钟周期的浮点运算会让整个流水线暂停，让CPU的吞吐量下降。在现代 CPU 设计中，工程师们发明了超标量，乱序执行，SIMD 等多种方式来克服流水线被浮点运算这种长周期指令堵塞的问题，这都是后话了。</p>
<p>正因为对于计算机来说，浮点运算是一个挑战性的操作，但又是做科学计算所需要的基本操作，所以浮点计算能力就成了计算机能力的一个测试标准。我们常常听说有一个世界上前 500 台最快的超级计算机列表，这里所谓的“快”的衡量标准，就是以每秒钟进行多少次浮点计算(FLOPS) 为准。按照 <a href="http://Top500.org">Top500.org</a>, 即评选世界上前 500 台超级计算机的机构 2009年6月的数据，世界上最快的计算机，部署在美国能源部位于新墨西哥的洛斯阿拉莫斯国家实验室 (Los Alamos National Laboratory)，当年造出第一颗原子弹的实验室。这台超级计算机，浮点计算速度的峰值高达 1456 TFlops，主要用来模拟核试验。因为美国的所有核弹头，海军核动力航母中的反应堆以及核试验，都由能源部国家核安全署(NNSA) 管理，所以能源部一直在投资用超级计算机进行核试验。 在 1996 年美国宣布不再进行大规模的物理核试验后的这么多年，美国能源部一直用超级计算机来做核试验，所以在 Top500 列表中，美国能源部拥有最多数量的超级计算机。</p>
<p><strong>3. 数组下标寻址之障</strong></p>
<p>言归正传，我们刚才说了在早期计算机发展史上，浮点计算的困难。除了浮点计算，还有一件事情特别困难，叫做数组下标寻址。用现代通俗的话说，就是当年的计算机，不直接支持 A[3] 这样的数组索引操作，即使这个操作从逻辑上说很简单：把数组 A 的地址加上 3，就得到了 A[3] 的地址，然后去访问这个地址。</p>
<p>这个困难在今天的程序员看来是不可思议的。 为什么这么简单的数组下标寻址机制最一开始的计算机没有支持呢？ 原来，当年的计算机内存很小，只有一千到两千的存储空间，所以，描述地址只需要几位二/十进制数（<a href="http://en.wikipedia.org/wiki/Binary-coded_decimal">BCD</a>)。从而，在每条指令后面直接加一个物理地址是可行且高效的寻址方式。这种寻址方式，叫做直接寻址，当时所有的机器，都只支持直接寻址，因为在机器码中直接指出操作数的准确地址是最简单直接的方法，计算机不需要任何复杂的地址解码电路。但坏处是，这个设计太不灵活了，比如说 A[3] 这个例子，就没法用直接寻址来表示。</p>
<p>一般情况下，如果知道数组A， 对于 A[3] 这样的例子，用直接寻址问题去模拟间接寻址的困难还不是很大，只要程序员事先记住数组 A 的地址然后手工加上 3 就行了 （A也是程序员分配的，因为当时没有操作系统，所以程序员手工管理内存的一切）。可是，也有一些情况这样直接寻址是不行的。比如说，当时计算机已经能支持跳转和判断指令了，也就是说，可以写循环语句了。我们可以很容易看到， 以 i 为循环变量的循环体内，对 A[i] 的访问是不能写成一个静态的直接寻址的，因为 i 一直在变化，所以不可能事先一劳永逸的定好 A[i] 的所在位置，然后静态写在程序中。</p>
<p>这样，即使写一个简单的 10×10 矩阵的乘法，程序员就不得不死写 10的三次方即1000 行地址访问，而没办法用几行循环代替。当时的一些聪明人，也想了一些方法去克服这个问题，比如说，他们先取出 A 的地址，然后做一次加法，把结果，也就是当时 A[i] 的地址，注射到一个读内存的 LOAD 指令后面。然后执行那条 LOAD 指令。比如我要读 A[i]，我先看，A的地址是 600，再看看 i 是3， 就加上 i，变成603，然后，把后面的指令改成 LOAD 603， 这样，就可以读到 A[i]。这个小技巧之所以可行，要感谢冯诺依曼爷爷的体系设计。在冯诺依曼计算机中，数据和程序是混在一起不加区分的，所以程序员可以随时像修改数据一样修改将要运行的下一条程序指令。就这样，靠着这个小技巧, 好歹程序员再也不要用1000行代码表示一个矩阵乘法了。</p>
<p><strong>4. SpeedCoding 的出现</strong></p>
<p>计算机本来就是用来做数学计算的，可是科学计算里面最最基本的两个要素&#8211;浮点计算和数组下标访问，在当时的计算机上都缺少支持。这种需求和实际的巨大落差，必然会召唤出一个中间层来消弭这种落差。 其实计算机科学的一般规律就是这样：当 A 和 C 相差巨大的时候，我们就引入一个中间层 B，用 B 来弥合 A 和 C 之间的不兼容。 当年的这个中间层，就叫做 SpeedCoding，由 IBM 的工程师 John Backus 开发。</p>
<p>SpeedCoding，顾名思义，就是让程序员编程更快。它其实是一个简单，运行在 IBM 701 计算机上的解释器。它允许程序员直接写浮点计算和下标寻址的指令，并且在底层把这些 “伪指令” 翻译成对应的机器码，用软件模拟浮点计算，自动修改地址等等。这样，程序员就可以从没完没了的手工实现浮点运算和下标寻址实现中解放出来，快速的编程。这个 SpeedCoding，这可以算得上是 FORTRAN 的种子了。</p>
<p>虽然这个解释器超级慢，程序员用这个解释器也用得很爽，也不感到它非常慢。 这是因为当年计算机浮点计算都绕不过软件模拟，即使最好的程序员用机器码而不用这个解释器，写出来的程序，也不比这个解释器下运行快多少。另一个更加重要的原因是，这个解释器极大的减少了程序员 debug 和 code 的时间。随着计算机速度的提高，当年一个程序耗费的计算成本和程序员编程耗费的人力成本基本上已经持平了，所以，相比较于写更加底层的机器码，用了 SpeedCoding 的程序员的程序虽然慢点，但人力成本瞬间降成 0，总体下来，用 SpeedCoding 比起不用来，总体成本还要低不少。</p>
<p>好景不长，因为客户一直的要求和电子工业的发展，IBM 在 1954 年，终于发布了划时代的 704 计算机，很多经典的语言和程序，都首次在 704 上完成了。比如之前我们在本系列的D篇中提到的 Steve Russell 的 LISP 解释器，就是在 704 上完成的。 704 计算机一下子支持了浮点计算和间接下标寻址。 这下用 SpeedCoding 的人没优势了，因为机器码支持浮点和下标寻址之后，写机器码比写 SpeedCoding 复杂不了多少，但是速度快了很多倍，因为 SpeedCoding 解释器太慢了，以前因为浮点和解释器一样慢，所以大家不在意它慢，现在浮点和寻址快了，就剩下解释器慢，写机器码的反而占了上风，程序员也就不用 SpeedCoding 了。</p>
<p><strong>5. FORTRAN 创世纪</strong></p>
<p>在 704 出来之前，做 SpeedCoding 的 John Backus 就认识到，要想让大家用他的 SpeedCoding, 或者说，想要从软件工具上入手，减少程序的开发成本，只有两个方法： 1. 程序员可以方便的写数学公式  2. 这个系统最后能够解析/生成足够的快的程序。他认为，只有达到了这两点，程序员才会乐意使用高级的像 SpeedCoding 这样的工具，而不是随着硬件的发展在机器码和 SpeedCoding 这样的工具之间跳来跳去。他本人通过实现 SpeedCoding, 也认识到如果有一个比机器码高级的语言， 生产效率会高很多倍。那么，现在唯一的问题就是实现它，当然，这就不是一个小项目了，就需要 IBM 来支持他的开发了。 所以，在 1953年，他把他的想法写成了一个文档，送给了 IBM 的经理。项目在 1954 年， 704 发布的当年，终于启动。John Backus 领导的设计一个能达到上面两点的编程系统的项目的成果，就是日后的 FORTRAN。</p>
<p>和现在大多数编程语言不一样，FORTRAN 语言的设计的主要问题不是语法和功能，而是编译器怎么写才能高性能。John Backus 日后回忆说，当时谁也没把精力放在语言细节上，语言设计很潦草的就完成了（所以其后正式发布后又经过了N多修订），他们所有的功夫都是花在怎么写一个高性能的编译器上。这个高性能的编译器很难写，到 1957 年才写好，总共花了 IBM 216 个人月。等到 FORTRAN 一推出，不到一年的时间，在 IBM 总共售出的 60 台 704上，就部署了超过一半。现在没啥编程语言能够这么牛的攻城掠地了 ：）</p>
<p><strong>6. 结语</strong></p>
<p>放到历史的上下文中看，FORTRAN 的出现是很自然的。一方面，复杂的数学运算使得一个能够表述数学计算的高级语言成为必须，计算机的发展也为这个需求提供的硬件条件；另一方面，随着计算机的发展，程序员的时间成本一直不变，但是计算的成本一直在降低，用高级语言和用机器码在性能上的些许差异变得可以忽略。这样的历史现实，必然会召唤出以少量的增加计算机工作量为代价，但能大幅度降低程序员时间成本的新的工具和设计。这种新的工具，新的设计，又对程序设计产生革命性的影响。在整个编程发展的历史上，FORTRAN 和其他高级语言的出现可以说是第一波的革命；而后， UNIX和C语言的兴盛，使得系统编程的效率得到革命性提升，可以算是第二波革命；而面向对象方法，使得复杂的 GUI 等系统的编程效率得到提升，应该算得上是第三波革命。到如今，现在各种各样的方法论就更加多了，且看以后回看，哪种方法和工具能够大浪淘沙留下来。</p>
<img src="http://feeds.feedburner.com/~r/xumathena/~4/cc1VDHZHcVI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.youxu.info/2009/07/02/fortran/feed/</wfw:commentRss>
		</item>
		<item>
		<title>编程珠玑番外篇-E. 高级语言怎么来的-2</title>
		<link>http://blog.youxu.info/2009/06/13/vm/</link>
		<comments>http://blog.youxu.info/2009/06/13/vm/#comments</comments>
		<pubDate>Sat, 13 Jun 2009 21:29:35 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
		
		<category><![CDATA[CompSci]]></category>

		<category><![CDATA[pearl]]></category>

		<guid isPermaLink="false">http://blog.youxu.info/?p=942</guid>
		<description><![CDATA[虚拟机的前世今生
上节我们提到了 LISP 中, 因为 eval 的原因, 发展出了运行时环境这样一个概念。基于这个概念，日后发展出了虚拟机技术。但这段历史并不是平铺直叙的，实际上，这里面还经... ]]></description>
			<content:encoded><![CDATA[<h3>虚拟机的前世今生</h3>
<p><a href="http://blog.youxu.info/2009/05/13/hpl/">上节</a>我们提到了 LISP 中, 因为 eval 的原因, 发展出了运行时环境这样一个概念。基于这个概念，日后发展出了虚拟机技术。但这段历史并不是平铺直叙的，实际上，这里面还经历了一个非常漫长而曲折的过程， 说起来也是非常有意思的。 这一节我们就着重解释虚拟机的历史。</p>
<p>我们 21 世纪的程序员，凡要是懂一点编程技术的，基本上都知道<em>虚拟机</em>和<em>字节码</em>这样两个重要的概念。 所谓的字节码 (<a href="http://en.wikipedia.org/wiki/Bytecode">bytecode</a>)，是一种非常类似于机器码的指令格式。这种指令格式是以二进制字节为单位定义的（不会有一个指令只用到一个字节的前四位），所以叫做字节码。所谓的虚拟机，就是说不是一台真的计算机，而是一个环境，其他程序能在这个环境中运行，而不是在真的机器上运行。现在主流高级语言如 Java, Python, PHP, C#，编译后的代码都是以字节码的形式存在的， 这些字节码程序， 最后都是在虚拟机上运行的。</p>
<p><strong>1. 虚拟机的安全性和跨平台性</strong></p>
<p>虚拟机的好处大家都知道，最容易想到的是安全性和跨平台性。安全性是因为现在可执行程序被放在虚拟机环境中运行，虚拟机可以随时对程序的危险行为，比如缓冲区溢出，数组访问过界等等进行控制。跨平台性是因为只要不同平台上都装上了支持同一个字节码标准的虚拟机，程序就可以在不同的平台上不加修改而运行，因为虚拟机架构在各种不同的平台之上，用虚拟机把下层平台间的差异性给抹平了。我们最熟悉的例子就是 Java 了。Java 语言号称 <em>一次编写，到处运行(Write Once, Run Anywhere)</em>，就是因为各个平台上的 Java 虚拟机都统一支持 Java 字节码，所以用户感觉不到虚拟机下层平台的差异。</p>
<p>虚拟机是个好东西，但是它的出现，不是完全由安全性和跨平台性驱使的。</p>
<p><strong>2. 跨平台需求的出现</strong></p>
<p>我们知道，在计算机还是锁在机房里面的昂贵的庞然大物的时候，系统软件都是硬件厂商附送的东西（是比尔盖茨这一代人的出现，才有了和硬件产业分庭抗礼的<a href="http://en.wikipedia.org/wiki/Software_company">软件产业</a>），一个系统程序员可能一辈子只和一个产品线的计算机打交道，压根没有跨平台的需求。应用程序员更加不要说了，因为计算机很稀有，写程序都是为某一台计算机专门写的，所以一段时间可能只和一台庞然大物打交道，更加不要说什么跨平台了。 真的有跨平台需求，是从微型计算机开始真的普及开始的。因为只有计算机普及了，各种平台都被广泛采用了，相互又不互相兼容软件，才会有软件跨平台的需求。微机普及的历史，比 PC 普及的历史要早10年，而这段历史，正好和 UNIX 发展史是并行重叠的。</p>
<p>熟悉 UNIX 发展史的读者都知道， UNIX 真正普及开来，是因为其全部都用 C，一个当时绝对能够称为跨平台的语言重写了一次。又因为美国大学和科研机构之间的开源共享文化，C 版本的 UNIX 出生没多久，就迅速从原始的 PDP-11 实现，移植到了 DEC，Intel 等平台上，产生了无数衍生版本。随着跨平台的 UNIX 的普及， 微型计算机也更多的普及开来，因为只需要掌握基本的 UNIX 知识，就可以顺利操作微型计算机了。所以，微机和 UNIX 这两样东西都在 1970年 到 1980 年在美国政府，大学，科研机构，公司，金融机构等各种信息化前沿部门间真正的普及开来了。这些历史都是人所共知耳熟能详的。</p>
<p>既然 UNIX 是跨平台的，那么，UNIX 上的语言也应当是跨平台的 （<em>注: 本节所有的故事都和 Windows 无关，因为 Windows 本身就不是一个跨平台的操作系统</em>）。UNIX 上的主打语言 C 的跨平台性，一般是以各平台厂商提供编译器的方式实现的，而最终编译生成的可执行程序，其实不是跨平台的。所以，<strong>跨平台是源代码级别的跨平台，而不是可执行程序层面的</strong>。 而除了标准了 C 语言外，UNIX 上有一派生机勃勃的跨平台语言，就是脚本语言。（<em>注：脚本语言和普通的编程语言相比，在能完成的任务上并没有什么的巨大差异。脚本语言往往是针对特定类型的问题提出的，语法更加简单，功能更加高层，常常几百行C语言要做的事情，几行简单的脚本就能完成</em>）</p>
<p><strong>3. 解释和执行</strong></p>
<p>脚本语言美妙的地方在于，它们的源代码本身就是可执行程序，所以在两个层面上都是跨平台的。不难看出，脚本语言既要能被直接执行，又要跨平台的话，就必然要有一个“<em>东西</em>”，横亘在语言源代码和平台之间，往上，在源代码层面，分析源代码的语法，结构和逻辑，也就是所谓的“<strong>解释</strong>”；往下，要隐藏平台差异，使得源代码中的逻辑，能在具体的平台上以正确的方式执行，也就是所谓的“<strong>执行</strong>”。</p>
<p>虽说我们知道一定要这么一个东西，能够对上“解释”，对下“执行”，但是 “解释” 和 “执行” 两个模块毕竟是相互独立的，因此就很自然的会出现两个流派：<strong>把解释和执行设计到一起</strong> 和 <strong>把解释和执行单独分开来</strong> 这样两个设计思路，需要读者注意的是，<strong>现在这两个都是跨平台的，安全的设计，而在后者中字节码作为了解释和执行之间的沟通桥梁，前者并没有字节码作为桥梁。</strong></p>
<p><strong>4. 解释和执行在一起的方案</strong></p>
<p>我们先说前者，前者的优点是设计简单，不需要搞什么字节码规范，所以 UNIX 上早期的脚本语言，都是采用前者的设计方法。 我们以 UNIX 上大名鼎鼎的 AWK 和 Perl 两个脚本语言的解释器为例说明。 AWK 和 Perl 都是 UNIX 上极为常用的，图灵完全的语言，其中 AWK, 在任何 UNIX 系统中都是作为标准配置的，甚至入选 IEEE POSIX 标准，是入选 IEEE POSIX 卢浮宫的唯一同类语言品牌，其地位绝对不是 UNIX 下其他脚本语言能够比的。这两个语言是怎么实现解释和运行的呢？ 我从 AWK 的标准实现中摘一段代码您一看就清楚了:</p>
<pre><tt><span style="color: #009900;">int</span> <strong><span style="color: #000000;">main</span></strong><span style="color: #990000;">(</span><span style="color: #009900;">int</span> argc<span style="color: #990000;">,</span> <span style="color: #009900;">char</span> <span style="color: #990000;">*</span>argv<span style="color: #990000;">[])</span> <span style="color: #ff0000;">{</span>
  <span style="color: #990000;">...</span>
  <strong><span style="color: #000000;">syminit</span></strong><span style="color: #990000;">();</span>
  compile_time <span style="color: #990000;">=</span> <span style="color: #993399;">1</span><span style="color: #990000;">;</span>
  <strong><span style="color: #000000;">yyparse</span></strong><span style="color: #990000;">();</span>
  <span style="color: #990000;">...</span>
    <strong><span style="color: #0000ff;">if</span></strong> <span style="color: #990000;">(</span>errorflag <span style="color: #990000;">==</span> <span style="color: #993399;">0</span><span style="color: #990000;">)</span> <span style="color: #ff0000;">{</span>
      compile_time <span style="color: #990000;">=</span> <span style="color: #993399;">0</span><span style="color: #990000;">;</span>
      <strong><span style="color: #000000;">run</span></strong><span style="color: #990000;">(</span>winner<span style="color: #990000;">);</span>
    <span style="color: #ff0000;">}</span>
  <span style="color: #990000;">...</span>
<span style="color: #ff0000;">}</span>
</tt></pre>
<p>其中, <code>run</code> 的原型是<br />
<code>run(Node *a)   /* execution of parse tree starts here */</code></p>
<p>而 <code>winner</code> 的定义是:<code><br />
Node    *winner ;    /* root of parse tree */</code></p>
<p>熟悉 Yacc 的读者应该能够立即看出, AWK 调用了 Yacc 解析源代码，生成了一棵语法树。按照 <code>winner</code> 的定义, <code>winner</code> 是这棵语法树的根节点。 在“解释”没有任何错误之后，AWK 就转入了“执行” (compile_time 变成了 0)，将 <code>run</code> 作用到这棵语法树的根节点上。 不难想像，这个 <code>run</code> 函数的逻辑是递归的（事实上也是），在语法树上，从根依次往下，执行每个节点的子节点，然后收集结果。是的，这就是整个 AWK 的基本逻辑: <strong>对于一段源代码, 先用解释器（这里awk 用了 Yacc 解释器），生成一棵语法树，然后，从树的根节点开始，往下用 run 这个函数，遇山开山，遇水搭桥，一路递归下去，最后把整个语法树遍历完，程序就执行完毕了。</strong>（这里附送一个小八卦，抽象语法树这个概念是 LISP 先提出的，因为 LISP 是最早像 AWK 这样做的，LISP 实在是属于开天辟地的作品！）Perl 的源代码也是类似的逻辑解释执行的，我就不一一举例了。</p>
<p><strong>5. 三大缺点</strong></p>
<p>现在我们看看这个方法的优缺点。 优点是显而易见的，因为通过抽象语法树在两个模块之间通信，避免了设计复杂的字节码规范，设计简单。但是缺点也非常明显。最核心的缺点就是性能差，需要资源多，具体来说，就是如下三个缺点。</p>
<p><strong>缺点1</strong>，<strong>因为解释和运行放在了一起，每次运行都需要经过解释这个过程。</strong>假如我们有一个脚本，写好了就不修改了，只需要重复的运行，那么在一般应用下尚可以忍受每次零点几秒的重复冗余的解释过程，在高性能的场合就不能适用了。<strong> </strong></p>
<p><strong>缺点2</strong>，<strong>因为运行是采用递归的方式的，效率会比较低。</strong> 我们都知道，因为递归涉及到栈操作和状态保存和恢复等，代价通常比较高，所以能不用递归就不用递归。在高性能的场合使用递归去执行语法树，不值得。</p>
<p><strong>缺点3</strong>，因为一切程序的起点都是源代码，而抽象语法树不能作为通用的结构在机器之间互传，所以<strong>不得不在所有的机器上都布置一个解释+运行的模块。</strong> 在资源充裕的系统上布置一个这样的系统没什么，可在资源受限的系统上就要慎重了，比如嵌入式系统上。 鉴于有些语言本身语法结构复杂，布置一个解释模块的代价是非常高昂的。本来一个递归执行模块就很吃资源了，再加一个解释器，嵌入式系统就没法做了。所以，这种设计在嵌入式系统上是行不通的。</p>
<p>当然，还有一些其他的小缺点，比如有程序员不喜欢开放源代码，但这种设计中，一切都从源代码开始，要发布可执行程序，就等于发布源代码，所以不愿意公布源代码的商业公司很不喜欢这些语言等等。但是上面的三个缺点，是最致命的，这三个缺点，决定了有些场合，就是不能用这种设计。</p>
<p><strong>6. 分开解释和执行</strong></p>
<p>前面的三个主要缺点，恰好全部被第二个设计所克服了。在第二种设计中， 我们可以只解释一次语法结构，生成一个结构更加简单紧凑的字节码文件。这样，以后每次要运行脚本的时候， 只需要把字节码文件送给一个简单的解释字节码的模块就行了。因为字节码比源程序要简单多了，所以解释字节码的模块比原来解释源程序的模块要小很多；同时，脱离了语法树，我们完全可以用更加高性能的方式设计运行时，避免递归遍历语法树这种低效的执行方式；同时，在嵌入式系统上，我们可以只部署运行时，不部署编译器。 这三个解决方案，预示了在运行次数远大于编译次数的场合，或在性能要求高的场合，或在嵌入式系统里，想要跨平台和安全性，就非得用第二种设计，也就是字节码+虚拟机的设计。</p>
<p>讲到了这里，相信对 Java, 对 PHP 或者对 Tcl 历史稍微了解的读者都会一拍脑袋顿悟了: 原来这些牛逼的虚拟机都不是天才拍脑袋想出来的，而是被需求和现实给召唤出来的啊！</p>
<p>我们先以 Java 为例，说说在嵌入式场合的应用。Java 语言原本叫 Oak 语言，最初不是为桌面和服务器应用开发的，而是为机顶盒开发的。SUN 最初开发 Java 的唯一目的，就是为了参加机顶盒项目的竞标。嵌入式系统的资源受限程度不必细说了，自然不会允许上面放一个解释器和一个运行时。所以，不管Java 语言如何，Java 虚拟机设计得直白无比，简单无比，手机上，智能卡上都能放上一个 Java 运行时（当然是精简版本的）。 这就是字节码和虚拟机的威力了。</p>
<p>SUN 无心插柳，等到互联网兴起的时候, Java 正好对绘图支持非常好，在 Flash 一统江湖之前，凭借跨平台性能，以 Applet 的名义一举走红。然后，又因为这种设计先天性的能克服性能问题，在性能上大作文章，凭借 JIT 技术，充分发挥上面说到的优点2，再加上安全性，一举拿下了企业服务器市场的半壁江山，这都是后话了。</p>
<p>再说 PHP。PHP 的历史就包含了从第一种设计转化到第二种设计以用来优化运行时性能的历史。 PHP 是一般用来生成服务器网页的脚本语言。一个大站点上的PHP脚本, 一旦写好了，每天能访问千百万次，所以，如果全靠每次都解释，每次都递归执行，性能上是必然要打折扣的。 所以，从 1999年的 PHP4 开始， Zend 引擎就横空出世，专门管加速解释后的 PHP 脚本, 而对应的 PHP 解释引擎，就开始将 PHP 解释成字节码，以支持这种一次解释，多次运行的框架。 在此之前， PHP 和 Perl, 还有 cgi, 还算平分秋色的样子，基本上服务器上三类网页的数量都差不多，三者语法也很类似，但是到了 PHP4 出现之后，其他两个基于第一种设计方案的页面就慢慢消逝了， 全部让位给 PHP。 你读的我的这个 Wordpress 博客，也是基于 PHP 技术的，底层也是 Zend 引擎的。 著名的 LAMP 里面的那个 P， 原始上也是 PHP，而这个词真的火起来，也是 99年 PHP4 出现之后的事情。</p>
<p>第二种设计的优点正好满足了实际需求的事情，其实不胜枚举。比如说 在 Lua 和 Tcl 等宿主语言上也都表现的淋漓尽致。像这样的小型语言，本来就是让运行时为了嵌入其他语言的，所以运行时越小越好，自然的，就走了和嵌入式系统一样的设计道路。</p>
<p><strong>7. 结语</strong></p>
<p>其实第二种设计也不是铁板一块，里面也有很多流派，各派有很多优缺点，也有很多细致的考量，下一节，如果不出意外，我将介绍我最喜欢的一个内容： 下一代虚拟机：寄存器还是栈。</p>
<p>说了这么多，最后就是一句话，有时候我们看上去觉得一种设计好像是天外飞仙，横空出世，其实其后都有现实，需求等等的诸多考量。虚拟机技术就是这样，在各种需求的引导下，逐渐的演化成了现在的样子。</p>
<img src="http://feeds.feedburner.com/~r/xumathena/~4/uoTK17pPmDY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.youxu.info/2009/06/13/vm/feed/</wfw:commentRss>
		</item>
		<item>
		<title>推荐最近所读两本关于”道”的书</title>
		<link>http://blog.youxu.info/2009/06/10/two-books/</link>
		<comments>http://blog.youxu.info/2009/06/10/two-books/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 00:28:49 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
		
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://blog.youxu.info/?p=939</guid>
		<description><![CDATA[[养成习惯了， 每过段时间就推荐几本读过的书]
这次回国，蒙博文视点的周筠老师安排，在敏感词日，和博文的两位编辑徐定翔，许莹，还有微软亚研院的邹欣老师一起吃次饭（还有未鹏，Tiny... ]]></description>
			<content:encoded><![CDATA[<p>[养成习惯了， 每过段时间就推荐几本读过的书]<br />
这次回国，蒙博文视点的<a href="blog.csdn.net/yeka">周筠</a>老师安排，在敏感词日，和博文的两位编辑徐定翔，许莹，还有微软亚研院的邹欣老师一起吃次饭（还有<a href="http://mindhacks.cn/">未鹏</a>，<a href="http://tinydust.net">Tiny</a>, <a href="http://blog.solrex.cn/">Solrex</a>, <a href="http://twitter.com/turingbook">刘江</a>）。 当天晚上在霍炬婚礼上，邹欣老师托未鹏送给我一本他写的《<a href="http://yishan.cc/">移山之道</a>》。在此要狠狠的谢谢邹欣老师。</p>
<p>一般我对微软开发路线上的书是不怎么感冒的，不过这本书的前言就非常吸引人，所以我拿起来就没放下，当天乘地铁的时候看，等飞机的时候看， 在飞机上也一直看。 这是一本非常引人入胜的技术书。虽然我对微软的技术和内部规约不太熟悉，但书中说的敏捷开发的那些规约和规范，还是让我深有共鸣的。</p>
<p>这本书最大的特点是那些有趣的小故事和对话，虽然都是杜撰，实际中原型可不少。 就像我前段时间在《<a href="http://blog.youxu.info/2009/05/17/read/">读品选择标准</a>》中说的， 这些一手的小故事，和精心提炼的对话，都是富矿，是具有非常高的挖掘价值的，各种水平的开发人员都能从这些小故事中，学到很多东西。当然我自己的团队项目开发的经验还是太少了，现在也就只对一小部分的故事有深刻同感。 对了，这本书中的漫画和人物设计也很有意思，我几乎都能在周围的人中找到了漫画人物的原型。</p>
<p>另一本书是最近淘到的，叫做 《<a href="http://www.amazon.com/China-Road-Journey-Future-Rising/dp/1400064678">China Road</a>》, 是 NPR 中国记者 Rob Gifford 写的。 此人在中国 6 年，说一口流利的普通话。08年背起一个大背包，通过从上海，到新疆的 312 国道上的所见所闻，写成了一本书。作者认为， 312 国道就像 美国的 66 号公路一样，是中国大道，沿线风土人情最能反映当下中国的情况。书中关于天朝各处的人物，思想都有记述。我想，若干年后，此书必然成为西方记者观察天朝的经典，因为就连我这样的天朝人，看了之后都觉得作者见识思考高度深度都让人佩服。</p>
<p>我研究了一下，前一本书封面上的道，和后一本书每一张开头的道，是同一个字体，所以，我就把他们都叫做 “关于道的书”。 前一本书值得推荐给每一个雄心壮志实践敏捷方法的软件开发团队，后一本书推荐给对天朝未来走向感兴趣的知识青年。</p>
<img src="http://feeds.feedburner.com/~r/xumathena/~4/rU1GFCzPHMw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.youxu.info/2009/06/10/two-books/feed/</wfw:commentRss>
		</item>
		<item>
		<title>订婚了</title>
		<link>http://blog.youxu.info/2009/06/07/engadged/</link>
		<comments>http://blog.youxu.info/2009/06/07/engadged/#comments</comments>
		<pubDate>Sun, 07 Jun 2009 05:44:24 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
		
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://blog.youxu.info/?p=936</guid>
		<description><![CDATA[这次不是愚人节新闻了，是真的。
前些日子在国内，让女友见了父母，父母非常高兴，也非常同意。
今天下午以倒时差为借口逛珠宝店，看到钻戒一枚，特漂亮，遂买之，趁着今天 6 月 6 日这... ]]></description>
			<content:encoded><![CDATA[<p>这次不是愚人节新闻了，是真的。</p>
<p>前些日子在国内，让女友见了父母，父母非常高兴，也非常同意。</p>
<p>今天下午以倒时差为借口逛珠宝店，看到钻戒一枚，特漂亮，遂买之，趁着今天 6 月 6 日这个吉祥的日子，向女友求婚，得到了她的同意, 算是订婚成功 :)</p>
<p>遇到她，我很高兴，很幸福。</p>
<img src="http://feeds.feedburner.com/~r/xumathena/~4/C5Y9qMBvvpY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.youxu.info/2009/06/07/engadged/feed/</wfw:commentRss>
		</item>
		<item>
		<title>美国总统奥巴马在开罗大学的演讲</title>
		<link>http://blog.youxu.info/2009/06/06/obama-speech/</link>
		<comments>http://blog.youxu.info/2009/06/06/obama-speech/#comments</comments>
		<pubDate>Sun, 07 Jun 2009 03:41:13 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
		
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://blog.youxu.info/?p=934</guid>
		<description><![CDATA[所有华文链接都成了死链接了。 其实这篇演讲有深度有内容， 对于认识伊拉克战争后美国和伊斯兰世界的关系很有启发。以下内容均来自 http://www.america.gov/st/peacesec-chinese/2009/June/20090604121534eaif... ]]></description>
			<content:encoded><![CDATA[<p>所有华文链接都成了死链接了。 其实这篇演讲有深度有内容， 对于认识伊拉克战争后美国和伊斯兰世界的关系很有启发。以下内容均来自 http://www.america.gov/st/peacesec-chinese/2009/June/20090604121534eaifas0.4368097.html (好像要穿墙）</p>
<blockquote>
<h3>奥巴马总统在埃及开罗大学讲话全文</h3>
<p>美国总统巴拉克·奥巴马6月4日在埃及开罗大学发表讲话，阐明美国致力于寻求与穆斯林国家关系的新开端。以下是讲话文字记录中译文，由美国国际信息局（IIP）翻译。</p>
<p class="byline"> </p>
<p align="center">&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>(讲话文字记录开始)</p>
<p>白宫新闻秘书办公室</p>
<p>（埃及开罗）</p>
<p>2009年6月4日</p>
<p align="center"><strong>奥巴马总统谈新的开端</strong></p>
<p align="center"><strong>(Remarks by the President on A New Beginning)</strong></p>
<p align="center"><strong>埃及开罗大学</strong></p>
<p align="center"><strong>（</strong>Cairo University）</p>
<p align="center"><strong>2009</strong><strong>年</strong><strong>6</strong><strong>月</strong><strong>4</strong><strong>日</strong></p>
<p align="center"><strong>当地时间下午</strong><strong>1</strong><strong>时</strong><strong>10</strong><strong>分</strong><strong> </strong></p>
<p>奥巴马总统：非常感谢你们。下午好。我荣幸地来到永恒的开罗古城，荣幸地受到两所著名学府的邀请。爱资哈尔(Al-Azhar)一千多年来一直是一座伊斯兰 学术的灯塔，开罗大学(Cairo University)一百多年来一直是埃及发展的源泉。你们并肩而立，象征着传统与进步的和谐共进。我对你们的盛情邀请，对埃及人民的盛情邀请表示感 谢。我也自豪地带来美国人民的友好情谊，带来我国穆斯林民众的平安问候： “Assalaamu alaykum.”（&#8221;愿你平安。&#8221;）</p>
<p>我 们相聚在美国和穆斯林世界之间关系十分紧张的时期──这种紧张关系的历史根源远远超出了当前的任何政策辩论。伊斯兰教与西方世界之间的关系史既包括好几个 世纪的共存与合作，也包括冲突和宗教战争。在近代，剥夺众多穆斯林权利和机会的殖民主义，以及穆斯林占主体的国家往往被视为傀儡、对其自身意愿鲜有顾及的 冷战，加剧了这种紧张。此外，现代化和全球化带来的巨大变化致使很多穆斯林将西方视为伊斯兰传统的敌人。</p>
<p>暴力极端主义分子利用这种 紧张关系煽动穆斯林世界为数不多但很有影响的少数派。9.11袭击事件以及这些极端主义分子不断对平民百姓采用暴力的行径使得我们国家中的一些人认为，伊斯兰教注定不仅与美国和西方国家，而且与人权为敌。所有这一切导致滋生出更多的恐惧，更多的不信任。</p>
<p>只要我们之间的关系定位于我们的分歧，我们就会让那些播种仇恨而不是和平，宣扬冲突而不是合作的人得势，而合作会帮助将正义与繁荣带给所有人。我们必须打破这种怀疑与不和的恶性循环。</p>
<p>我来到这里是要在美国和穆斯林世界之间寻求一种以共同利益和相互尊重为基点的新开端──基于美国和伊斯兰教并不相互排斥、不必相互竞争的真情。不仅如此，它们相互重合，拥有一些共同原则──公正与进步的原则；容忍与全人类都有尊严的原则。</p>
<p>我 认识到，变化不会发生于一夜之间。一次讲话不可能排除多年来的不信任，我也不可能在我有限的时间里回答迄今摆到我们面前的所有复杂问题。但是我深信，为了 向前推进，我们必须公开说出内心深处的话，但我们往往关起门来才说这些话。这必须成为相互倾听、相互学习、相互尊重并寻求共同之处的持久努力。《古兰经》(Holy Koran)教诲我们：&#8221;明记真主，永吐真言。&#8221;这就是我将在今天努力做到的──尽最大努力说实话，兢兢业业面对使命，坚信我们同为人类的共同利益远比给 我们造成隔阂的力量强大得多。</p>
<p>这种信念一部分来源于我个人的经历。我是基督教徒。我父亲来自肯尼亚一个数代穆斯林家庭。我小时候在印度尼西亚生活过几年，听到过宣礼塔在破晓和日落时刻的召唤。我年轻时在芝加哥的社区工作，那里有很多人从他们的穆斯林信仰中找到了尊严与安宁。</p>
<p>作为一个研读历史的人，我还知道伊斯兰教对文明的重大贡献。正是伊斯兰教──在爱资哈尔这样的地方──让学术之光照亮了一个又一个世纪，为欧洲的文艺复兴和 启蒙运动铺平了道路。穆斯林群体不断创新，发明了代数学；磁性罗盘仪和导航工具；掌握了书写与印刷术；使我们了解了疾病的传播与治疗方式。伊斯兰文化为我 们创造了雄伟的拱顶和高耸的尖塔；永恒的诗篇和美妙的音乐；遒劲的书法和瞑思静想之所。纵观历史，伊斯兰教以言词和行动揭示了宗教容忍与种族平等的可能。</p>
<p>我也知道，伊斯兰教一直是美国历程的一个组成部分。第一个承认我的国家的是摩洛哥。我国第二任总统约翰·亚当斯(John Adams)在1796年签署《的黎波里条约》(Treaty of Tripoli)时写道，&#8221;美国自身对穆斯林的法律、宗教或安宁绝无任何敌意&#8221;。 自我国建国以来，美国穆斯林使美国丰富多姿。他们为国作战，担任公职，为民权奋斗，创办企业，在高等院校任教，在体育场上出类拔萃，赢得诺贝尔奖，建造我 国最高建筑，点燃奥林匹克火炬。当第一位当选国会议员的美国穆斯林在宣誓捍卫我国宪法时，他手抚的是来自我国建国先父之一──托马斯·杰斐逊 (Thomas Jefferson)──私人图书馆藏书中的那本《古兰经》。</p>
<p>因此，在来到伊斯兰教的最初降示之地以前，我已经在三大洲了解了伊斯兰教。这段经历使我确信不疑，美国和伊斯兰教的伙伴关系必须基于真实的伊斯兰教，而不是那些不实之词。身为美国总统，我认为我的职责之一是随时驳斥对伊斯兰教的消极成见。</p>
<p>然 而，同样的原则也必须适用于穆斯林对美国的态度。就像穆斯林不是一个模子里刻出来的一样，美国也不能被用妄自尊大的帝国模子定型。美国是世界历来所知的最 伟大的发展源泉之一。我的国家是在反抗一个帝国的斗争中诞生的。我们的建国理念是人人平等。几个世纪以来，我们不惜流血奋斗，实现那些话的含义──在我国 国内，以及在世界各地。我们受到来自地球四面八方的各种文化的影响，但笃信一个简单的理念：合众为一(E pluribus unum)。</p>
<p>对 一个名叫巴拉克·侯赛因·奥巴马的非洲裔美国人能够当选美国总统这一点已经议论繁多。但我的个人经历并不是那么独特。虽然人人都有机会的这个理想还没有在 美国每一个人身上实现，但对于登陆我国的所有人来说，这个希望是存在的──其中包括属于我国今天80多个族裔群体的近700万美国穆斯林。实际上，美国穆 斯林的收入及教育水平超过了我国的平均线。</p>
<p>而且，美国的自由与信奉宗教的自由密不可分。这就是为什么清真寺遍及我们合众国的每个州，在我们境内有着1200多座清真寺。这就是为什么美国政府为保护妇女和女童戴头巾的权利和为了惩罚那些想剥夺这项权利的人而诉诸司法手段。</p>
<p>所以，毋庸置疑：伊斯兰是美国的一部分。我认为美国自身坚信这样一个真理：我们大家，无论种族、宗教或生活地位，都有着共同的理想──和平安全地生活；受教育和有尊严地工作；热爱我们的家庭、我们的社区、我们的神主。这些是我们共享的东西。它是全人类的希望。</p>
<p>当然，认识到我们共同的人性还只是我们使命的开始。仅凭言语无法满足我们人民的需要。要做到满足这些需要，我们必须在今后的年月里大胆行动，我们必须理解，全世界人民面临的种种挑战是共同的，不能应对这些挑战将使我们所有人受害。</p>
<p><strong>我们已经懂得，当一个国家的金融体系衰弱时，世界各地的繁荣都受损害。当一种新流感感染了一个人时，对所有人都有威胁。当一个国家寻求核武器时，所有国家都 面临核袭击的更大危险。当暴力极端分子在一个山区活动时，大洋彼岸的人受到威胁。当波斯尼亚和达尔富尔无辜的人民遭屠杀时，它给我们大家的良心留下污点。 </strong>这就是在21世纪共享世界的含义。这就是我们作为人类相互具有的责任。</p>
<p>这是一项艰难的责任；人类的历史常常是国家、部落甚至宗教为自身利益征服他方的历史。然而，在这个新时代，那种心态是自我消损。任何旨在让某一国家或某一群体提高地位的世界秩序都将注定失败。因此，无论我们如何看待过 去，我们绝不成为它的俘虏。我们的种种问题必须通过合作方式来处理，我们必须分享进步。</p>
<p>这并不意味着我们应忽视紧张关系的来源。恰恰相反，它需要我们必须严正面对。本着这一精神，请让我尽力明确和直率地谈谈某些我认为我们最终必须共同面对的具体问题。</p>
<p>我们必须面对的第一个问题是一切形式的极端主义。</p>
<p>我在安卡拉明确表示，美国并非──也绝不会──与伊斯兰教交战。但我们会无情抗击对我国安全构成严重威胁的暴力极端主义分子。因为我们绝不接受所有宗教的信众都会拒绝的同样的行为：杀害无辜的男子、妇女和儿童。保护美国人民的安全是我作为总统的首要职责。</p>
<p>阿 富汗的形势既说明了美国的目标，也说明我们必须进行合作。7年多前，美国在广泛的国际支持下追剿“基地”组织和塔利班。我们毫无选择的余地，因为我们必须 这样做。我知道，有人仍对9.11事件有疑问或为其找借口。但我们必须清楚地认识到：2001年9月11日，“基地”组织杀害了将近3000人，受害者是 美国和许多其他国家的无辜男子、妇女和儿童，他们未曾伤害任何人。他们与“基地”组织政治上的嫌怨或仇恨意识形态毫不相干。然而，“基地”组织蓄意残忍地 杀害了这些人，声称这一袭击行动系其所为，并一再表明打算再次进行大规模屠杀的狼子野心。他们在很多国家都有同伙，并企图扩大他们的影响。这些都不是可以 辩论的看法问题，而是必须正视的事实。</p>
<p>不要有任何误解：我们不希望保持在阿富汗的驻军。我们不在阿富汗寻求军事基地。失去我国青年男女的生命是美国十分痛苦的事。继续这场冲突要付出昂贵的代价，在政治上也是困难的决定。一旦我们可以确定在阿富汗和巴基斯坦已经不存在要尽可能多地杀害美国 人的丧心病狂的暴力极端主义分子，我们会很高兴地撤回每一名美军士兵。但目前还不是这种情况。</p>
<p>因此我们在与46个国家结成合作联盟。尽管需要付出代价，美国的决心不会减弱。的确，我们任何人都不应容忍这些极端主义分子。他们在很多国家杀人。他们杀害了持有各种宗教信仰的人──杀害最多的是穆斯林。他们的行为与人类的权利、国家的进步和伊斯兰教的教义是不相容的。《古兰经》教导说，谁杀害一个无辜者就好比杀害了整个人类；《古兰经》还说， 谁拯救了一个人就好比拯救了整个人类。有超过10亿人口的这一永恒信仰之宏大是一小撮人狭隘的仇恨之心无法比拟的。我知道，在打击暴力极端主义的斗争中， 伊斯兰教并不是一个问题──伊斯兰教必须是解决问题的途径之一。</p>
<p>我们也知道，仅凭军事力量无法解决阿富汗和巴基斯坦的问题。正是因为这个原因，我们打算在今后5年内每年投入15亿美元，与巴基斯坦合作建造学校、医院、道路和企业，另投资1.7亿美元帮助流离失所的人。也正是因为这个原 因，我们提供超过28亿美元帮助阿富汗人发展经济和提供人民赖以生存的服务。</p>
<p>我再来谈谈伊拉克问题。不同于阿富汗的是，伊拉克战争是一 场可以选择不打的战争，在美国国内和国际上引起了巨大分歧。虽然我相信没有萨达姆·侯赛因的暴虐政权，伊拉克人民最终会获益良多，但我也相信，伊拉克发生 的事件提醒我们，有必要通过外交手段和建立国际共识解决我们的问题。确实，我们可以回想一下托马斯·杰斐逊曾经说过的话：“我希望我们的智慧会随我们的力 量而增长，并告诫我们，我们的力量使用得越少，它就越有力。”</p>
<p>今天，美国承担着双重责任：帮助伊拉克人打造更美好的未来，同时要将伊拉 克交给伊拉克人。我明确地向伊拉克人民表示，我们不寻求基地，对领土或资源没有要求。伊拉克的主权属于伊拉克自己。正是出于这个原因，我已下令在明年8月 前撤出我们的作战部队。也正是出于这个原因，我们将履行与伊拉克民选政府达成的协议，在7月前从伊拉克城市撤出作战部队，在2012年年底前将所有的部队 撤出伊拉克。我们将帮助伊拉克训练安全部队和发展经济。但我们是以伙伴的身份，而绝不是以保护人的身份支持伊拉克的安全与统一。</p>
<p>最后， 美国绝不能容忍极端主义分子的暴力，同样我们也绝不能改变或忘记我们的原则。9.11事件给我国造成了巨大的创伤。这一事件引起的忧惧和愤怒是可以理解 的，但在某些情况下，这一事件也使我们采取了与我们的传统和理想相悖的行动。我们正在采取具体行动改变路线。我明确禁止美国使用酷刑，我已下令明年初关闭 关塔纳摩湾监狱。</p>
<p>因此，美国将进行自卫，同时尊重其他国家的主权和法治。我们在这样做的时候，将与同样受到威胁的穆斯林社区结成伙伴。早一天使极端主义分子在穆斯林社区受到孤立和丧失人心，我们就能早一天获得更大的安全。</p>
<p>我将讨论的紧张关系的第二大根源是以色列人、巴勒斯坦人和阿拉伯世界之间的局势。</p>
<p>美国与以色列之间的牢固关系众所周知。 这种关系坚不可摧。它基于文化和历史的纽带以及这样一个认识：对犹太家园的渴望有着一个悲哀的历史源头，这个历史是无可否认的。</p>
<p>犹 太人在世界各地经受了很多世纪的迫害，反犹太主义被前所未有的大屠杀推到顶峰。明天，我将参观布痕瓦尔德，那里曾是犹太人遭受纳粹奴役、折磨、杀害和被毒 气致死的集中营之一。600万犹太人惨遭杀害──这超过了今天以色列的全部犹太人口。否认这一事实是站不住脚的，无知的，仇视性的。威胁毁灭以色列──或 不断重复有关犹太人的恶意成见──是极其错误的，而且只会在以色列人心目中唤起这一最痛苦的记忆，同时阻碍这个地区人民应得的和平。</p>
<p>然 而，同样不能否认的是，巴勒斯坦人民──穆斯林和基督徒──在寻找家园的过程中历经苦难。60多年以来，他们承受了流离失所的痛苦。许多人在西岸、加沙以 及邻国土地的难民营里等待着他们从不曾过上的和平与稳定的生活。他们每天忍受着由占领带来的大大小小的羞辱。所以，毋庸置疑：巴勒斯坦人民的境况是不能容忍的。美国对巴勒斯坦人追求尊严、机会和自身国家的合理抱负不会置之不理。</p>
<p>几十年来，一直存在着一种僵持局面：有着合理追求的两族人民，因各自的痛苦历史而使妥协可望不可及。相互指责并不难——巴勒斯坦人指责由以色列建国而造成的流离失所，以色列人指责贯穿其全部历史的来自境内外的敌 意和袭击。然而，如果我们仅仅从一方或另一方来看待这一冲突，我们将无视事实：实现双方愿望的惟一出路是以色列人和巴勒斯坦人和平安全共存的两国解决方 案。这符合以色列的利益，符合巴勒斯坦的利益，符合美国的利益，符合世界的利益。因此我将亲自致力于取得这一结果。各方根据“路线图”已同意承担的义务是 明确的。为了实现和平，现在是他们──以及我们各方──应该履行自己职责的时候了。</p>
<p>巴勒斯坦人必须放弃暴力。暴力抵抗和屠杀不能达到目 的。在几个世纪里，美国黑人奴隶遭鞭打，受种族隔离的凌辱。然而，最终导致获得全面平等权利的不是暴力，而是对美国建国核心理想的和平与执著的坚持。同样 的经历也可在从南非到南亚，从东欧到印度尼西亚的其他国家人民的历史中看到。这个经历揭示了一个简单的真理：暴力是死路一条。向睡梦中的以色列儿童发射火 箭炮或炸死公共汽车上的老妪，既非胆识也非力量的表现。它不是在申明道义权威，而是在丧失道义权威。</p>
<p>现在是巴勒斯坦人致力于如何进行建设的时候了。巴勒斯坦权力机构必须发展治理能力，建立为人民的需求服务的机制。“哈马斯”确实在一些巴勒斯坦人中拥有支持，但他们也有责任。要为实现巴勒 斯坦的抱负而发挥作用，“哈马斯”就必须停止过去的暴力，遵守过去的协议， 承认以色列的生存权。</p>
<p>与此同时，以色列人必须意识到，正如以色列的生存权不能被剥夺一样，巴勒斯坦的生存权也不能被剥夺。美国不接受以色列继续建造定居点的合法性。这一做法违反了过去的协议，有损实现和平的努力。现在是停止这些定居点的时候了。</p>
<p>以色列也必须履行其义务，确保巴勒斯坦人能够生活、工作、建设其社会。正如摧毁巴勒斯坦人的家庭一样，加沙持续的人道危机无益于以色列的安全，西岸缺乏机会也同样如此。巴勒斯坦人民日常生活的改善必须是通向和平之路的一个关键部分。</p>
<p>最 后，阿拉伯国家必须认识到，阿拉伯和平倡议（Arab Peace Initiative）是一个重要的开端，而不是责任的终止。阿-以冲突决不应再被用来转移阿拉伯国家人民对其他问题的视线。相反，它应成为一个行动的号 召，帮助巴勒斯坦人民发展维系国家的机制；承认以色列的合法性；选择进步，而不是自我消耗地向后看。</p>
<p>美国将使我们的政策与追求和平者的 政策协调一致。无论在公开场合还是非公开场合，我们将对以色列人、巴勒斯坦人和阿拉伯人说同样的话。我们不能把和平强加于人。但是，在非公开场合，许多穆 斯林承认以色列不会消失。同样，许多以色列人也承认建立巴勒斯坦国的必要性。时不我待，我们必须基于人所共知的事实行动起来。</p>
<p>眼泪已流 得太久；鲜血已洒得太多。我们大家都有责任为这样一天的到来而奋斗，那就是：以色列和巴勒斯坦的母亲能够看到自己的孩子毫无恐惧地长大，三大信仰的圣地 (Holy Land)成为天意属望的和平之地，耶路撒冷是犹太人、基督徒和穆斯林的安全和永久的家园，并像伊斯拉(ISRA)故事中摩西、耶稣和穆罕默德(颂安)共 同祈祷那样，成为亚伯拉罕所有子孙和平相处的地方。</p>
<p>第三个造成紧张关系的原因涉及国家在核武器问题上的权利和责任，对此，我们必须达成共识。</p>
<p>这 个问题是美国与伊朗伊斯兰共和国之间关系紧张的一个根源。多年来，伊朗在某种程度上用它与我的国家的对立来给其自身定位。伊朗与美国之间确实有着坎坷的历 史。在冷战期间，美国对伊朗的民选政府被推翻起了作用。自伊斯兰革命以来，伊朗在劫持人质和对美军及平民发动的暴力事件中扮演了角色。这一历史众所周知。 我没有选择自陷于过去，我已经向伊朗领导人和伊朗人民表明，我国已做好向前迈步的准备。对于伊朗而言，现在的问题不在于反对什么，而在于它希望建设什么样的未来。</p>
<p>消除数十年的不信任决非易事，但是我们有勇气、有正气、有决心向前迈进。我们两国之间有许多问题有待商讨，我们愿意在没有先决 条件的情况下基于相互尊重向前迈进。但是，有关各方都很清楚，在核武器方面我们已经处在一个决定性关头。它所关系到的不单纯是美国的利益，而是为了阻止一 场可能会使中东地区和全世界走上一条极其危险的道路的核武器竞赛。</p>
<p>我理解有些人针对一些国家拥有核武器而其他国家没有核武器而提出的抗议。任何一个国家都不应挑选哪些国家可以拥有核武器。因此，我坚决重申，美国承诺争取建立一个任何国家都不拥有核武器的世界。任何一个国家——包括伊朗 ——如果它履行对《不扩散核武器条约》(Non-Proliferation Treaty)承担的责任，就应当有权获取用于和平目的的核能源。这一承诺是这项条约的核心，应为条约各方全面遵守。我希望这个地区的所有国家都支持这一 目标。</p>
<p>我要讲的第四个题目是民主。</p>
<p>我知道，近几年来在推进民主方面存在争议，而且许多争议与伊拉克战争有关。<strong>所以，我要明确表示：没有任何一种政府体制能够或应该被一个国家强加给另一个国家。</strong></p>
<p><strong>但是，我并不因此而减少我对代表人民意愿的政府的承诺。每个国家以植根于本国人民传统的各自方式给这一原则赋予生命力。美国并不自认知道什么是对所有人最为有益的做法，正如我们不会主观选择和平选举的结果一样。但是我确实坚信，某些东西是所有人都渴望的：能够畅所欲言并对自己被管理的方式有发言权；对法治和 司法公正有信心；政府施政透明，不盗窃人民财富；以及有自由按自己选择的方式生活等。这些不是美国人的发明，这些是人的权利，因此美国在各地都支持这些权 利。</strong></p>
<p>实现这一诺言没有直线可循，但是有一点是明确的：保护这些权利的政府最终会更稳定、更成功、更安全。压制思想决不会让这些思想消 失。美国尊重世界各地一切和平、守法人士的发言权，即使我们与他们意见不一。我们将欢迎所有民选的和平政府——只要这些政府在施政时尊重本国人民。</p>
<p><strong>最后一点很重要，因为有些人只是在不当政时呼吁民主，一旦大权在握，他们就残暴压制他人的权利。无论植根于何处，民有和民治的政府为所有当权者设定了一个标 准：你必须通过人民的许可保持权力，而不是采用强迫手段；你必须尊重少数派的权利，本着宽容和妥协的精神参与；你必须把人民的利益以及合法的政治程序至于自己的政党利益之上。没有这些要素，单凭选举无法实现真正的民主。</strong></p>
<p>我们必须共同解决的第五个问题是宗教自由问题。</p>
<p>伊 斯兰教拥有值得自豪的宽容的传统。这一点我们在宗教法庭时期安达鲁西亚（Andalusia）和科尔多瓦（Cordoba）的历史上看得很清楚。我童年时 在印度尼西亚亲眼所见，在这个穆斯林占人口绝大多数的国家，虔诚的基督教徒可以自由地从事礼拜活动。这种精神是我们今天所需要的。每一个国家的人民都应能 听从自己的思想、感情和灵魂的驱使，自由地选择宗教信仰和过自己的宗教生活──无论他们选择的是何种宗教。这种宽容精神对宗教的兴旺是必不可少的，但现在 受到了来自多方面的挑战。</p>
<p>在某些穆斯林中，有一种令人不安的倾向：通过排斥他人的信仰来显示对自己的信仰之忠诚。丰富的宗教多样性必须 得到维护──无论是黎巴嫩的马龙派教徒(Maronites)还是埃及的科普特教会成员(Copts)。另外，如果我们能够诚实地对待这个问题，穆斯林内 部的裂隙也必须弥合，因为逊尼派和什叶派的分歧在某些地方已导致悲惨的暴力，特别是在伊拉克。</p>
<p>宗教自由对各族人民能否和睦相处至关重要。我们必须经常认真地考虑我们保护宗教自由的方式。例如，在美国，有关慈善捐款的规定加大了穆斯林履行宗教捐助义务的难度。为此，我承诺与美国穆斯林共同努力，以确保他们能够施行天课（<em>zakat</em>）。</p>
<p>同样，西方国家必须避免妨碍穆斯林公民按照自己的意愿从事宗教活动—例如，不能对穆斯林妇女的着装进行强制规定。我们不能以自由主义为幌子敌视任何宗教。</p>
<p>的 确，信仰应有助于我们休戚与共。因此，我们正在美国制订一些新的服务计划，使基督徒、穆斯林和犹太人共同参与。因此，我们欢迎阿卜杜拉国王倡导的宗教间对 话和土耳其在文明联盟(Alliance of Civilizations)中发挥的领导作用。在全世界各地，我们可以使宗教间对话发展成宗教间服务，通过各种连接各族人民的桥梁促使我们采取行动推进 共同的人道精神──不论是在非洲抗击疟疾, 还是在自然灾害后提供救援。</p>
<p>我要谈的第六个问题是妇女的权利。</p>
<p>我知道在这个问题上存在着争论，在座的各位就是例证。西方某些人认为一位妇女选择遮盖自己的头发即说明不那么平等，我反对这种看法。但我确实认为剥夺妇女的教育权利就是剥夺了妇女的平等权利。妇女受到良好教育的国家有极大的可能实现繁荣，这种情况决非偶然。</p>
<p>我希望明确表示：妇女的平等权利绝不仅仅是伊斯兰教的问题。在土耳其、巴基斯坦、孟加拉国和印度尼西亚，我们看到这些穆斯林人口占多数的国家选举了妇女领导人。与此同时，在美国社会生活的许多方面以及在世界上其他国家，争取妇女平等的斗争仍在持续。</p>
<p>我 深信，我们的女儿们也能像我们的儿子们一样为社会作出很大贡献。让全人类—包括男人和女人—充分发挥其潜力将促进我们的共同繁荣。我并不认为，妇女为了获 得平等必须作出与男人相同的选择，我尊重在生活中选择承担传统角色的妇女。但是，这应当是她们自己的选择。因此，美国愿意与任何一个以穆斯林为主体的国家 进行合作，支持提高女童识字率，并通过小型信贷帮助年轻妇女创业，实现自己的梦想。</p>
<p>我要谈的最后一个问题是经济发展和经济机会。</p>
<p>我 知道对许多人来说，全球化的景象充满着矛盾。因特网和电视能传播知识和信息，但同时也会展示露骨的性行为和肆无忌惮的暴力。贸易可以带来新的财富和机会， 但也会造成巨大的分化和社区的演变。在所有的国家──其中也包括美国──这种变化可以引起恐惧，担心现代化会意味着我们失去对自己的经济选择、对政治，最 重要的是对自身特征的控制──那些我们挚爱的有关我们的社区、我们的家庭和我们的宗教信仰的方方面面。</p>
<p>但我知道，人类的进步不可阻挡。发展与传统并不矛盾。日本和韩国等国家在保持自己特有文化的同时发展了经济。在从吉隆坡到迪拜的穆斯林占主体的国家内，也出现了同样惊人的经济进步。无论在古代还是现代，穆斯林社区都站在创新和教育的前列。</p>
<p><strong>这一点十分重要，因为发展战略绝不能仅仅建立在地下资源的基础之上，在年轻人失业的情况下，发展也不可能持续。很多海湾国家因丰富的石油资源而享有富足的生 活，其中有些国家已开始专注于更广泛的发展。但是，我们大家都必须认识到，教育和创新将成为21世纪的资本，而太多穆斯林社区对这些领域投资不足。我正在 我的国家强调这一点。过去，美国特别重视这一地区的石油和天然气资源，如今，我们将寻求更广泛的接触。</strong></p>
<p><strong>在教育领域，我们将扩大交流项目，增加奖学金，就像我父亲，当年就是靠奖学金有机会去美国的。与此同时，我们将鼓励更多的美国人到穆斯林地区学习。我们将安排有前途的穆斯林学生到美国 实习，为世界各地的教师与儿童投资发展在线教学，创造新的在线网络，让堪萨斯的青少年能够即时与开罗的青少年进行网上沟通。</strong></p>
<p>谈到经济发展，我们将建立新的商务志愿队，与穆斯林为主体的国家中的同行结成伙伴。我将在今年主持一次创业峰会( Summit on Entrepreneurship)，以确定我们如何能够深化美国与全世界穆斯林社区中的工商领导人、基金会及社会企业家之间的关系。</p>
<p>在 科学技术领域，我们将发起一项新的基金以支持穆斯林为主体的国家中的技术发展，帮助将创意投入市场，以创造更多就业机会。我们将在非洲、中东及东南亚地区 开设促进科学事业中心，并任命新的科学事务特使，就有关计划进行合作，以开发新型能源、创造有利环保的工作机会、使档案数字化、使水资源洁净化，并种植新 型作物。今天我宣布与伊斯兰会议组织(Organization of the Islamic Conference)的一项新合作，旨在根除小儿麻痹症。我们还将谋求扩大与穆斯林社区的合作关系，以促进儿童和妇女健康。</p>
<p>所有这一切必须通过合作关系来实现。美国人已准备与各国政府及公民、社区组织、宗教领袖及穆斯林社区的公司企业携手努力，帮助人们追求更好的生活。</p>
<p>我 所谈到的这些问题并不能轻易解决。然而，我们有责任携手努力建设一个我们所追求的世界——一个极端主义分子不再威胁我们的人民、美国军队返回家园的世界； 一个巴勒斯坦人和以色列人在各自国家中和平安全、核能仅用于和平目的世界；一个政府服务于人民、上天所有子民的权利都得到尊重的世界。这些是共同的利益。 这是我们所追求的世界，但我们只有携手共进才能如愿以偿。</p>
<p>我知道有很多人──穆斯林和非穆斯林──怀疑我们是否能创造这个新的开端。有 些人急于煽风点火制造隔阂，成为前进路上的绊脚石。有些人认为不值得付出这样的努力──他们说我们注定要有分歧，文明的冲突在劫难逃。还有很多人只是对变 化是否真能发生疑虑重重。有太多的恐惧感，太多的不信任。但我们若甘于被过去束缚，就永远无法前进。我特别要对各国各个信仰的年轻人说——你们，比任何人 都有能力重建这个世界。</p>
<p>我们所有人都不过是这个世界的匆匆过客。问题在于，我们是把这段时间花在导致我们分裂的东西上，还是全心致力于一种努力──一种持久努力──以寻求共同之处，以我们争取为子孙后代创造的未来为重，并尊重全人类的尊严。</p>
<p>结束战争比发动战争要难。看到与别人的共同之处比看到不同之处要难。我们应该选择正确的道路，而不只是容易的道路。而这正是信仰给我们指明的方向。所有宗教 都有同一个核心原则──已所不欲，勿施于人。这条真理超越国家与民族──这一信念不是新出现的；不是黑色的、白色的或棕色的；也不代表基督教、伊斯兰教或 犹太教。这种信仰孕育于文明的摇篮，至今跳动在亿万民众的心间。它是对他人的信任，它是促使我今天来到这里的原因。</p>
<p>我们有能力把世界变成我们所希望的那样，但前提是我们必须勇于开创新的开端，同时谨记经文的训导。</p>
<p>《古兰经》告诉我们：“人类！我们创造了你男人和一个女人；我们让你们成为国家和部落以便彼此相识。”</p>
<p>《塔木德经》(Talmud)告诉我们：“全部《托拉》(Torah)都是为倡导和平。”</p>
<p>《圣经》（Holy Bible）告诉我们：“使人和睦的人有福了，因为他们必称为神的儿子 。”</p>
<p>世界人民能够和平共处。我们知道这是主的旨意。现在，这必须是我们在地球上的使命。</p>
<p>谢谢你们，愿主赐予各位平安。非常感谢你们。谢谢你们。</p>
<p>（完）</p>
<p>当地时间下午2时05分</p></blockquote>
<p>&#8212;</p>
<p>黑体是我所加.</p>
<img src="http://feeds.feedburner.com/~r/xumathena/~4/SGwVKMByGcw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.youxu.info/2009/06/06/obama-speech/feed/</wfw:commentRss>
		</item>
		<item>
		<title>朝拜帝都中</title>
		<link>http://blog.youxu.info/2009/05/25/beijing/</link>
		<comments>http://blog.youxu.info/2009/05/25/beijing/#comments</comments>
		<pubDate>Tue, 26 May 2009 00:53:15 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
		
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://blog.youxu.info/?p=929</guid>
		<description><![CDATA[昨天下午以 35 摄氏度的测量体温入关，进入天朝帝都国际机场
今天早晨带女友去找永和豆浆大王了，结果没找到， 就随便找了一家中国早餐，好像是山寨永和，她很喜欢
今天下午交签证费等... ]]></description>
			<content:encoded><![CDATA[<p>昨天下午以 35 摄氏度的测量体温入关，进入天朝帝都国际机场</p>
<p>今天早晨带女友去找永和豆浆大王了，结果没找到， 就随便找了一家中国早餐，好像是山寨永和，她很喜欢</p>
<p>今天下午交签证费等等 明天早晨签证 晚上回扬州</p>
<img src="http://feeds.feedburner.com/~r/xumathena/~4/kxW35W6pDZo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.youxu.info/2009/05/25/beijing/feed/</wfw:commentRss>
		</item>
		<item>
		<title>最终回国行程</title>
		<link>http://blog.youxu.info/2009/05/19/itertarany/</link>
		<comments>http://blog.youxu.info/2009/05/19/itertarany/#comments</comments>
		<pubDate>Tue, 19 May 2009 18:45:44 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
		
		<category><![CDATA[Family]]></category>

		<category><![CDATA[Life]]></category>

		<category><![CDATA[USA]]></category>

		<guid isPermaLink="false">http://blog.youxu.info/?p=924</guid>
		<description><![CDATA[最近流感的事情闹得很凶， 而且美国是国家重点防备的地方。从新闻看，卫生部门对从美国回去的查的比较严。 大陆已经出现了几个疑似似乎都是留学生， 所以身为留学生的我不得不小心谨... ]]></description>
			<content:encoded><![CDATA[<p>最近流感的事情闹得很凶， 而且美国是国家重点防备的地方。从新闻看，卫生部门对从美国回去的查的比较严。 大陆已经出现了几个疑似似乎都是留学生， 所以身为留学生的我不得不小心谨慎。回国还是改签这个事情我纠结了好久， Gtalk 签名档也改了好几次， 最终还是决定按原计划回去。 为了让可能与我接触的人放心， 我诚实的告诉大家我的理由，并且把我回国的 11 天日程贴在这里。 </p>
<p>首先， 我尝试了很多推迟回国的办法， 我给机票代理打了很多次电话，不同的代理， 都告知没有办法帮我找到便宜的机票， 且如果退票要交比较高的手续费，如果我改签一张票的话，机票代理说要 500 美元左右的损失，包含新机票的差价和取消预定费（我的机票是2，3月份订的， 所以票价相对低）。 我这次是和女友一起回国， 如果我改签的话，她就要莫名其妙付 500 美元。 对她来说， 这也是一件非常困难的事情， 她大学是自己付钱读下来的，所以每个月付完房租和联邦学生贷款的欠债之后，就所剩无几了。同时，我也不愿意莫名其妙的赔掉这么多钱。</p>
<p>当然， 如果调整日期可以的话，钱不是什么决定性的因素。 但是调整日期还有一个现实的困难，就是我女友的假期问题。 她已经工作了， 年假虽说什么时候都可以放， 但是因为在图书馆工作，需要听从图书馆的协调。她们图书馆一直人手不够， 本来就缺一个人，去年下半年到现在，因为经济危机，一直也没招人。 所以，她一个人干两个人的活。 她和我回国期间， 图书馆不得不招一个暑期的实习学生补这个人力缺口。 据我女友说， 他们好不容易让每天都至少有两个全职员工上班， 且让那个实习学生正好在我女友不在的时候能够和全职员工搭配，其他时间半职， 所以，这期间是非常复杂的人员安排关系。如果她改日期的话， 又是一轮折腾， 所以， 她老板不希望（其实就是不准）她改期。 我的日程倒是很随意， 但是本来这次主要目的就是和她一起回国， 我只能就她的日程。</p>
<p>那么， 我为什么没有取消机票呢? 这里面有三个原因，我也很坦率的告诉大家。</p>
<p>第一， 我已经一年半没有回去了。 我的父母很想我。 在这一年半里面， 我的外公去世了， 我外婆一个人过，身体也不是很好，她特别想要我回去，老人家还总想着见见我女友。和我家一直关系很好的我表姐也生孩子了， 我也该回去看看。 这个是亲情方面的考虑。 </p>
<p>第二是因为如果我今年暑假不回去， 就只能等明年暑假了。 我们领域， 一般论文的截至时间都是寒假， 而暑假相对轻松。我现在已经三年级了， 需要以发论文为重， 所以寒假我是绝对不会回去的。如果我想改签推后， 我女友的日程不答应，她调一下假期， 或许一年半年之后才能有时间和我一起回去（我父母还从来没有见过她呢）。那么， 我们就要等到明年的暑假。在这一年里， 我弟弟可能就要申请出国了。所以，我父母不光看不到大儿子回来， 还要送一个小儿子出远门， 我觉得这实在残酷。 </p>
<p>第三， 我这次国内有很多的事情要做。 具体哪些事情我就不说了，反正全是被我压到六月份一起搞定的，如果这趟不会去， 我很多事情就全部做不成了。 </p>
<p>上面说了这么多， 都是我按时回国的理由。 但是病毒不会听我的理由， 有些特别爱国的哥们也不会理会我的理由， 这不要紧，我已经规划好了我回国要做的几件事情，并且响应卫生部门号召，坚决避免在落地后七天内参加任何社会活动。 </p>
<p>我的行程是这样的</p>
<p>25 日早晨， 我从圣路易斯出发， 到芝加哥转机。 期间， 我会一直在机场不乱走，并且带口罩。</p>
<p>中国时间 26 日中午， 我到北京机场， 然后立即到<del datetime="2009-05-20T16:12:15+00:00">我在亚运村附近的亲戚家</del> 大使馆附近的宾馆住下来。 休息，宅一天，自我隔离。</p>
<p><del datetime="2009-05-20T16:12:15+00:00">28</del>  27 日， 我预约了美国使馆的签证， 这个是我唯一到公共场合的一次，而且很早就预约了，没法改动。没签证我就回不去美国了， 这个事情想避免我也避免不了。 我会想办法不乘坐任何公共交通工具到使馆。签完我立即回家。</p>
<p><del datetime="2009-05-20T16:12:15+00:00">29</del> 28 日晚， 我将乘 Z29 到扬州， 去火车站的时候我也不会乘坐公共交通工具。在扬州，相信家人会在火车站接我， 所以，除了火车， 我不会乘坐其他任何公共交通工具。我会在家再自我隔离5天，陪陪父母和家里人。 </p>
<p>6月2日晚， 我可能会去北京。 这时候距离我回国已经七天开外了，如果没症状， 按照医学规律，就是安全的了。所以， 我6月3日， 4日会在北京， 和大家平时一样， 参与一些社会活动，取签证，参加霍炬婚礼，办其他事情等等。 6月5日下午我从北京返回美国。 我想我已经尽一切可能，避免社会活动， 并且把和同学，朋友见面的日期安排和压缩成落地七天过后的短短两天了。</p>
<p>病毒这个东西是不受人的意志为转移的， 只能预防。 在旅行过程中， 我将做好一切预防措施，保存好所有旅行票据。 但是假如不幸碰上，卫生防疫部门说怎么办我就怎么办，绝不犹豫。 我就希望假如我不幸碰上病毒， 全国人民别把我当成美国间谍专门带生化武器祸害全国人民， 或者把我说成徐跑跑， 我没有任何这样的动机。 </p>
<p>另外，虽然国内第一个例子是我们城市过去的，但我这十天来， 一直蒙在家里看书编程， 几乎没有出去过， 目前也没有任何流感发烧症状。 我上飞机的时候或者在任何地方， 如果有流感症状， 我会主动报告。</p>
<p>希望读者能理解我的决定</p>
<img src="http://feeds.feedburner.com/~r/xumathena/~4/HCFBsOO_fFA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.youxu.info/2009/05/19/itertarany/feed/</wfw:commentRss>
		</item>
		<item>
		<title>读品选择标准</title>
		<link>http://blog.youxu.info/2009/05/17/read/</link>
		<comments>http://blog.youxu.info/2009/05/17/read/#comments</comments>
		<pubDate>Sun, 17 May 2009 17:43:56 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
		
		<category><![CDATA[Article]]></category>

		<category><![CDATA[Memo]]></category>

		<category><![CDATA[Self-help]]></category>

		<guid isPermaLink="false">http://blog.youxu.info/?p=915</guid>
		<description><![CDATA[上次和俊煜讨论过写博客的一些想法之后, 我就一直想一个问题, 什么样的东西值得反复读, 或者说耐读.
大约几个星期之前, 我写了一篇没发出来的博客, 大体是说, 读品分成收藏品和消费品两种... ]]></description>
			<content:encoded><![CDATA[<p>上次和俊煜讨论过写博客的一些想法之后, 我就一直想一个问题, 什么样的东西值得反复读, 或者说耐读.</p>
<p>大约几个星期之前, 我写了一篇没发出来的博客, 大体是说, 读品分成收藏品和消费品两种. 收藏品是那些读完了要放在脑子里的, 对以后做事情有用的. 消费品则是过脑子一下,  为了娱乐或者为了知道某件事情而阅读的那些. 除此两个集合之外, 就是广袤的暗物质, 既看不到, 也想不到. 读者应该注意常常阅读收藏品, 把一部分消费品提取出精华变成收藏品, 并且随机的读一些&#8221;暗物质&#8221;里面的东西, 就像逛古董市场一样, 以便能找到好的收藏品.</p>
<p>随着更加深入的思考, 我认识到上面的这个分类过于主观. 比如我认为收藏品的东西, 别人不认为是的; 甚至, 我几年前认为是收藏品的东西, 现在完全不觉得有价值. 那么, 判断一样东西有没有阅读的价值, 到底有没有一个相对客观一点的标准呢. 我觉得有, 并且总结了新的两条.</p>
<p>1. 建立了一种全新的框架, 或者全新的思考体验的; 读了之后能够改变人固有的观念或方法的</p>
<p>读了 The Structure of Scientific Revolution 之后, 我就被 paradigm shift 这个词给迷住了, 现在看问题也自觉不自觉的用 paradigm shift 的眼光. 用 paradigm shift 的眼光来看, 像&lt; 黑天鹅&gt; 这样的书, 就是典型的建立一种新的框架的例子. 很多时候, 我们认识不到某种现象后面的道理, 或者不明白一个道理. 这时候, 通过阅读, 我们可以在大脑中建立起一个新的框架, 甚至是用一种全新的思维方式看问题. 常常有人说, 读过了某样东西, 如沐春风, 看世界都不一样了, 我觉得那样的读物就是这个例子.</p>
<p>其实这个不仅限于科学, 在社会, 哲学等领域, 都有这样的例子. 像马克思韦伯, 亨廷顿这样的学者的书, 像开山立派的经济学家的书等等, 都是这样的例子. 就算在文学领域, 也是有大开眼界这一说法的. 比如说没看王朔老师之前, 我从来不知道写文章能写得那么油里油气且聪明好笑的. 这样的例子在各个领域不胜枚举, 都有这类让人大开眼界, &#8220;洗心革面&#8221;的经典书. 这类书, 当属一品读物.</p>
<p>当然, 也要防止陷入两种极端. 一种是拼命的陷入只读经典书的信息焦虑中, 觉得每天的脑袋都要不一样才行, 每天都要读经典改变自己才行. 其实世界上没那么多经典, 完全不要害怕自己还没读某某经典, 使得自己比起别人来变得笨了. 人的脑袋, 只要充分自恰就行了, 不需要面面俱到.  这种信息焦虑也不是好事, 它会让人频繁的处于搜索新知识的过程中, 而放弃了对已有知识的咀嚼和再认识. 大凡一本好书, 如果作者写得非常自恰, 那基本上是不需要立即按照去找相关的书看的. 一本书, 总是要读个几遍, 才能完全领会其中的精髓, 然后再去找类似的书看, 才事半功倍.  比如读些通俗经济学的书, 立即就跳出去看统计学, 然后跳到数学, 跳到计算机, 本本都是跳经典, 本本都读不完, 再多的经典也是白搭.</p>
<p>第二个极端是陷入对阴谋论的崇拜中. 人初次读一个让自己洗心换髓的书的时候, 往往会陷入对书中理论疯狂的信仰中. 这种信仰可以是好事, 也可以是坏事. 好事是, 如果这本书是一个在相关领域有高深基础的专业人士所写的, 那么这种脱胎换骨往往很快让读者进入状态. 比如读 Knuth 的计算机书, 或者 SICP, 就是这样的例子. 坏事是, 如果这本书只是一个半调子写的, 又为了看上去很牛逼, 那么在书中, 就必然有很多惊世骇俗的言谈. 这种言谈常常是没有什么事实依据, 也没法证伪的. 但因为观点耸人听闻, 显得非常时髦, 比如 &lt; 货币战争&gt;.  我的标准是, 在选择读品的时候, 一定要对那些号称&#8221;革命&#8221;, &#8220;颠覆&#8221; 的出版物保持必要的警惕. 比如当年奇书&lt; 学习的革命&gt;, 看了受益的能有几个, 现在还反复阅读这本书的, 又有几个?  再比如&lt; 货币战争&gt; 这样的书, 其中观点如何证伪? 我个人觉得, 这类过分宣扬颠覆, 革命的书, 往往只是宣传的噱头而已. 一定要避免把自己的脑袋用在阴谋论分析里面.</p>
<p>还有一种读品, 也算是建立了一个新的框架, 但是知识密度不够, 或者被更加新的知识取代.  这类读品我觉得也不值得阅读. 比方说, 佛经有很多种读法, 其中有一种读的方法是把佛经当成心理学读. 如果是这样, 那么读佛经, 绝对抵不上读现代心理学的书籍. 现代心理学, 无论是在框架完整性, 还是在对问题的研究深入程度上, 都胜过于佛经不知道多少倍(我不想打口水仗, 我只谈把佛经解读为心理学和现代西方心理学之间的关系). 况且, 佛经当中, 其他知识和心理学知识淆杂, 知识密度比较低.  像&lt; 黑天鹅&gt;这样的书, 其实也是废话太多. 如果读者肯花功夫认真研究概率论, 则这本书绝对抵不上概率论的深度和广度. 像牛顿的&lt; 原理&gt;, 现在更加好的物理教科书太多了, 完全没有必要读牛顿的原作. 事实上, 有很多学科, 最经典的书不见得是最好的读品, 如果经典书已经被新的理论取代, 则最好还是读现代的书籍.  在社会科学领域, 有些 18XX 年蒸汽时代写成的哲学书还被人奉为圭臬, 有些原本写给农民看的文章, 或者教育幼儿园小朋友的学说, 直到今天还有人觉得价值巨大. 其实早就有更多深刻有价值的内容完全的胜出这些思想贫瘠的内容了. 最好的理念是, 如果有一个富矿, 就不要先去采一个贫矿.  有时, 或作者自己文笔不够好, 或作者表达能力不够强, 或作者思考能力不够深入, 或者因为写作年代较早, 相关理论不健全等等, 一些读品总让你感到有个如骨鲠在喉的结论作者一直没说出来, 然后自己也悟不出来, 痛苦至死. 对于这一类读品, 我认为用&#8221;读百遍, 义自现&#8221;的方法去读完全是浪费时间, 因为有更加好的读物只要读一次两次就明白了相同的道理.  在科学学习上也有类似的例子, 比如说任凭看多少科普, 都比不上自己找本教科书学得踏实; 任凭上多少维基百科看多少条目, 抵不上自己从课本看起. 因此, 我们最好要选择知识密度高的, 框架严密的读品, 这样才是阅读的捷径.  常常纠结于过时和劣质读品的一个原因, 是因为并不知道有更加高价值的东西存在.  因此在选择读品时, 如果有高人指点, 或者花点时间看看书评等等, 选择的时候就会少一点盲目, 快速的选到富矿, 而不需要在贫矿上纠结.</p>
<p>还有一种读物, 整本书就可以用一句话概括, 非要絮絮叨叨的写一本书. 这样的书, 作为读物本身是没有价值的, 但是作为一本放在书架上随时用标题提醒自己还是有价值的. 比方说, &lt; ##决定成败&gt; 和 &lt; Outliers&gt; 这样的书, 只要每天瞄瞄提醒自己一下要注意细节, 要勤奋工作投入时间, 大致上就差不多了. 就算把整本书背下来, 效果也和天天见封面差不多. 大部分成功学的书, 讲经济管理方法的书, 讲处理人际关系的书, 基本上都是只有标题(或目录)有价值. 如果书店允许人只买封面, 我相信不少人只需要买个封面回家就够了, 里面东西读了和不读是一样的.</p>
<p>2. 需要被反复推敲, 语料型读物. 能够从里面挖掘出思考</p>
<p>这类书, 主要是史料, 参考资料和人物传记, 加上一些小说. 在我的计算机专业中, 我喜欢读图灵奖论文集这些玩意, 看上去和自己研究没啥关系, 但是读一遍思考一遍就觉得又学了一个新东西, 又重新沐浴了一遍.  还有史书或者人物传记. 这些书, 应该仁者见仁的读. 不同的读者用视角能读出不同的东西. 有的时候能读出文学, 有的时候读出做事情的方法, 有的时候能读出如何追MM 等等, 读法不是固定的, 所以完全不要按照别人既定的读法去剖析.  只要有脑子, 完全可以自己从中找到有益的东西. 这些读品, 比上面说的成功学, 管理学的读品要有价值的多. 因为这是别人告诉你的他们经历的一手人生体验, 完全可以结合自己的经历融入自己的血液.</p>
<p>有些史料, 语料, 人物传记等, 过于简略和微言大义, 我觉得不可看. 因为与其花精力咬文嚼字的研究一个字, 一段话的深刻含义, 不如找点平实的文字; 有些资料过于八卦, 过于琐碎, 我也建议不要看, 因为整理碎片的工作很麻烦, 比如有些老师的文字, 基本上就是东拉西扯的毫无体系的文学碎片. 作者不好好说事情, 东一榔头西一棒显示博学的, 把博学部分可以撕了再看, 比如&lt; 梦断代码&gt;, 只有真实的故事有价值. 有些老师的书撕了八卦和卖弄, 基本就剩下封面了, 所以可以只买封面看. 大多数权贵人士的回忆录, 基本都不值得看, 因为已经被化妆了, 而第三方写的人物传记, 倒是价值巨大; 还有一些资料, 作者倒是有很多一手资料, 也研究了很多一手资料, 但行文流于戏说, 或附加太多没有根据的猜测和个人观点, 而将有价值的资料掩盖. 这一类的, 除非作者观点属于第一类, 否则大可撕了再看.</p>
<p>除了史料和小说, 人物传记等等, 还有一种就是新闻和信息类消息博客, 理论上也能得到一些思考材料. 不过信息类博客和新闻的阅读比较耗时间, 而且信噪比不大, 很多东西其实自己不需要的, 也给读了. 我现在也没有很好的办法, 所以我现在干脆就不读. 当然这是因噎废食了, 如果读者有更好的方法, 不妨推荐.</p>
<p>我说的第二类读品, 和第一类一样, 都是属于耐读的范畴. 这种耐读, 在于每多读一次, 就能吸取一次营养. 第一种提供思考的方法, 第二种提供思考的材料来源. 看上去很完美. 但实际中, 人不可能这么理想化的去阅读, 往往最是闲书, 在某些时候最是有用. 所以, 我觉得还要在上面这两种读品之外, 外加一品, 一切觉得好玩的喜欢的有意思的读品. 这类东西, 不见得耐读, 可能读了之后都忘得差不多了, 如洗发水一样, 用完就扔了的那种, 算得上是消费品类型. 如果用纯粹功利的眼光去看, 这样的读品一本不读最好. 但是耐读的东西, 其实总是由不耐读的慢慢积淀成的, 况且如果光读所谓的耐读, 生活也显得颇为无趣. 一个人用持续的, 轻松愉快的心态, 每天读些消费品, 让这些有趣的东西过过脑子, 他的知识结构和思想认识就不会僵化, 不会显得掉书袋,  且富有幽默感和时代精神. 一个很普遍的现象就是, 很偶然机会读到了某样东西, 东西本身可能不是好东西, 但是却打开了一扇新的窗, 发现了很多好东西. 就像金库的铜钥匙一样, 还是要随手捡一点比较好玩.</p>
<p>三种读品都消化, 应该可以造就一个敏锐, 靠谱和有幽默感的人.</p>
<img src="http://feeds.feedburner.com/~r/xumathena/~4/aogEPXwwaPs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.youxu.info/2009/05/17/read/feed/</wfw:commentRss>
		</item>
		<item>
		<title>编程珠玑番外篇-D. 高级语言怎么来的-1</title>
		<link>http://blog.youxu.info/2009/05/13/hpl/</link>
		<comments>http://blog.youxu.info/2009/05/13/hpl/#comments</comments>
		<pubDate>Wed, 13 May 2009 22:04:37 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
		
		<category><![CDATA[CompSci]]></category>

		<category><![CDATA[pearl]]></category>

		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://blog.youxu.info/?p=910</guid>
		<description><![CDATA[终于放暑假了, 有心情来八卦了. 我主要想八卦一下高级语言的设计思想和各种范式的来龙去脉, 也就是回答这个问题: 编程语言为什么会发生成现在这个样子哩?　这里面的奥妙又在哪里哩? 我尝... ]]></description>
			<content:encoded><![CDATA[<p>终于放暑假了, 有心情来八卦了. 我主要想八卦一下高级语言的设计思想和各种范式的来龙去脉, 也就是回答这个问题: 编程语言为什么会发生成现在这个样子哩?　这里面的奥妙又在哪里哩? 我尝试着把这个系列的八卦写下去, 包括虚拟机的设计, 线程的设计, 栈和寄存器两大流派的来龙去脉等等, 也算是<a href="http://blog.youxu.info/2008/12/22/">完成年初给大家许下的诺言</a>. </p>
<p>高级编程语言的创始纪上写道:&#8221;初, 世间无语言, 仅电路与连线. 及大牛出, 天地开,　始有FORTRAN,　LISP. ALGOL 随之, 乃有万种语.&#8221; 我们都知道, LISP 是基于递归函数的, FORTRAN 是做科学计算的. 现在的C 等等, 都比较像 FORTRAN 不像 LISP.  可是很少有人知道, 最初, FORTRAN 是不支持函数递归调用的, 而LISP是一生下来就支持的, 所有高级语言里面的递归调用, 都是逐渐从 LISP 那里学来的. 这段尘封的历史非常有趣, 值得八卦一番. </p>
<p>一般人学编程, 除了写 Hello World 之外, 人生写的第二个程序, 不是阶乘就是菲波拉契数列,　要不就是汉洛塔. 而这几个程序, 基本上都是因为函数的递归调用才显得简单漂亮. 没有递归的日子里, 人民非常想念您. 可是, 第一版的 FORTRAN 就居然居然不支持递归. 细心的读者要问了, 不支持递归的语言能图灵完全么?　当然可以, 图灵机就是没递归的典型的例子. 但是没递归调用的程序会很难写, 尤其像汉诺塔这种. 那么, FORTRAN 他怎么就悍然不支持递归呢, 让我们回到 1960 年. </p>
<p>话说当年,　IBM 是计算机行业的领军者.　那时候的计算机,　都是比柜子还大的大家伙, 至于计算能力嘛, 却比你的手机还弱.　那时候计算机所做的最多的事情,　不是发邮件打游戏,　而是作计算.　作计算嘛,　自然需要一种和数学语言比较接近的编程语言.　于是,　1960年, IBM　就捣鼓出了 FORTRAN, 用行话说,　就是公式翻译系统.　这个公式翻译系统,　就成了世界上第一个编程语言. 这个编程语言能做数学计算,　能作条件判断,　能 GOTO.　用现在的眼光看,　这个语言能构模拟图灵机上的一切操作,　所以是图灵完全的.　学过数值计算的同学都知道, 科学计算无非就是一大堆数学计算按照步骤进行而已. 所以, 一些控制判断语句, 数学公式加上一个数组, 基本上就能完成所有的科学计算了. IBM 觉得这个语言够用了, 就发布了 FORTRAN　语言规范, 并且在自家的大型机上实现了这个语言.　</p>
<p>在实现这个语言的时候, IBM　的工程师要写一个 FORTRAN 编译器 (请注意那时候的大型机没有操作系统). 那时候的编译器都是用机器语言或者很低级的汇编语言写成的, 所以编译器要越简单越好. 这些工程师觉得,　弄一个让用户运行时动态开辟内存的机制太麻烦了,　所以干脆,　强迫用户在写程序的时候,　就要定好数组的大小,　变量的类型和数目. 这个要求并不过分, 因为在科学计算中, 数组的维度, 用到的变量等, 在计算之前, 就是可以知道大小的. 用现在的话说,　就是不能动态开辟内存空间, 也就相当于没有 malloc 的 C, 或者没有 new 的 C＋＋. 这样的好处是, 一个程序要多少内存, 编译的时候就知道的一清二楚了. 这个主意看上去很聪明, 不过 IBM 的工程师比你想得更加聪明, 他们想, 既然一个程序或者子程序要多少内存在编译的时候都知道了, 我们干脆就静态的把每个子程序在内存中的位置, 子程序中参数, 返回值和局部变量放的位置, 大小都定好, 不久更加整齐高效么. 是的, 我们都知道, 在没有操作系统管理的情况下, 程序的内存策略越简单越好, 如果内存放的整整齐齐的, 计算机的管理员就能够很好的管理机器的内存, 这样也是一件非常好的事情. (再次强调, 当年还没有操作系统呢, 操作系统要等到 1964年发布的 IBM 360 才有, 具体开发一个操作系统之难度可参考< 人月神话>). </p>
<p>可是, 聪明的读者一下子就看出来了, 这样静态的搞内存分配, 就递不成归不了了. 为啥呢. 试想, 我有个 Fib 函数, 用来计算第 N 个菲波拉契数. 这个函数输入一个整数, 返回一个整数, FORTRAN 编译器帮我把这个函数给静态分配了. 好, 我运行 Fib(5) 起来, FORTRAN 帮我把 5 存在某个专门给输入参数的位置. 我在 Fib(5) 里面递归的调用了Fib(4), FORTRAN 一看, 哈, 不还是 Fib 么, 参数是 4, 我存. 这一存, 新的参数4, 就把原来的 5 给覆盖掉了, 新的返回值, 也把原来的返回值给覆盖掉了. 大事不好了, 这么一搞, 新的调用的状态居然覆盖了老的调用, 这下, 就没法返回原来的 Fib(5) 了, 这样一搞, 怎么递归啊?  </p>
<p>IBM 这些写编译器的老前辈们, 不是不知道这个问题, 而是压根就鄙视提出这个问题的人: 你丫科学计算递归什么呀, 通通给我展开成循环, 展不开是你数学没学好, 想用递归, 你就不要用 FORTRAN 了. 那时候 IBM 乃是老大, 只有他们家才生产大型机, 老大发话, 下面的消费者只能听他的. </p>
<p>既然软件不支持, 硬件也就可以偷工减料嘛, 所以, 硬件上, 就压根没有任何栈支持. 我们都知道, 计算机发展史上, 软件和硬件是相互作用的. 我们现在也很难猜测, 是IBM 的软件工程师因为 IBM 的硬件工程师没有在硬件上设计出堆栈所以没有能在 FORTRAN 里面设计出递归调用呢, 还是 IBM 的硬件工程师觉得既然软件没要求, 我就不设计了呢? 不管怎么样, 我们看到的是, 1960 年前, 所有的机器的硬件都没有直接支持栈的机制. 熟悉CPU的都知道, 现代 CPU 里面, 都有两个至关重要的地址寄存器, 一个叫做 PC, 用来标记下一条要执行的指令的位置, 还有一个就是栈顶指针 SP. 如果没有后者, 程序之间的调用就会非常麻烦, 因为需要程序员手工维护一个栈, 才能保证程序之间调用最后还能正确的返回. 而当年, 因为 FORTRAN 压根就不支持递归, 所以支持 FORTRAN 的硬件, 就省去了栈指针了. 如果一个程序员想要递归调用, 唯一的实现方法, 就是让程序员借用一个通用寄存器作为栈指针, 自己硬写一个栈, 而且不能用 FORTRAN. </p>
<p>因为　FORTRAN 不支持递归调用, 按照自然规律, 自然会有支持递归的语言在同时代出现.  于是, 很快的, LISP 和 ALGOL 这两个新语言就出道了. 我们只说 LISP. 它的创始人 <a href="http://en.wikipedia.org/wiki/John_McCarthy_(computer_scientist)">John McCarchy</a> 是　MIT　教授, 也是人工智能之父, 是学院派人物. 他喜欢丘齐的那一套 <a href="http://en.wikipedia.org/wiki/Lambda_calculus">Lambda 演算</a>, 而非图灵的机械构造. 所以, LISP 从一开始, 就支持递归的调用, 因为递归就是　lambda 演算的灵魂. 但是有两大问题摆在　McCarchy 面前. 一是他的 LISP 理论模型找不到一个可以跑的机器, 二是他的　LISP 模型中有一个叫做　eval 的指令, 可以把一个字符串当成指令在运行时求值, 而这个, 当时还没有人解决过. 按照 Paul Graham 大叔在他的 Hackers and Painters 里面的说法, McCarchy 甚至压根就不想实现这个 eval 指令, 因为当 IBM 的一个叫 <a href="http://en.wikipedia.org/wiki/Steve_Russell">Steve Russell</a>的工程师宣称要实现 eval 的时候, McCarthy 还连连摇手说理论是理论, 实际是实际, 我不指望这个能被实现. 可是, Russell 居然就把这两个问题一并给解决了(这哥们也是电子游戏创始人, 史上第一个电子游戏就是他写的, 叫　Space War).　他的方法, 说来也简单, 就是写了一个解释器, 让　LISP 在这个解释器里面跑. 这个创举, 让传统上编译－> 运行 的高级语言流程, 变成了　编写-> 解释执行的流程, 也就是著名的 <a href="http://en.wikipedia.org/wiki/REPL">REPL</a> 流程. 他做的事情, 相当于在IBM 的机器上用机器码写了一个通用图灵机, 用来解释所有的　LISP 指令. 这个创举, 就让 LISP 从理论走到了实践. </p>
<p>因为有了运行时的概念, LISP 想怎么递归, 就可以怎么递归, 只要运行时支持一个软件实现的栈就可以了. 上面我也说了, 也就是写解释器的人麻烦一点而已, 写LISP程序的人完全就可以不管下层怎么管理栈的了. 同时, 有了解释器, 也解放了原来动态分配空间的麻烦, 因为现在所有的空间分配都可以由解释器管理了, 所以, 运行时环境允许你动态的分配空间. 对空间分配的动态支持, 随之就带来了一项新技术: 垃圾收集器. 这个技术出现在　LISP 里面不是偶然的, 是解释器的自然要求和归宿. 在 FORTRAN 上本来被绕过的问题, 就在 LISP 里面用全新的方法被解决了. LISP 的划时代意义和解释器技术, 使得伴随的很多技术, 比如抽象语法树, 动态数据结构, 垃圾收集, 字节码等等, 都很早的出现在了 LISP 中, 加上 LISP 本身规则很少, 使用起来非常灵活, 所以, 每当有一项新技术出现, 特别是和解释器和运行时相关的一项新技术出现, 我们就会听到有人说, &#8220;这玩意儿 LISP 里早就有了&#8221;, 这话, 是有一定道理的. </p>
<p>除了上面的软件模拟之外, MIT 还有一派在作硬件模拟, 这一派, 以后发展成了灿烂一时的　LISP machine, 为日后所有虚拟机理论铺开了一条新路. 这一派在70, 80年代迅速崛起, 然后随着　PC 的兴起又迅速的陨落, 让人唏嘘不已. </p>
<p>最后附送一个八卦: 1960 年的时候, 高级语言编程领域也发生了一件大事, 即　ALGOL 60 的提出. ALGOL 是划时代的标准, 我们今天用的　C/Java 全是　ALGOL 家族的. ALGOL 注意到了　FORTRAN 的不支持递归的问题, 于是从一开始, 就订立标准支持递归. 但是, 处理递归需要很小心的安排每个函数每次调用的地址和所谓的活动窗口(Active Frame), 而并不是每个编译器都是牛人写的, 所以在处理递归这样一个新事物上, 难免会出点小问题和小 BUG. 这时候, 搞笑的高爷爷(Knuth) 出场了, 他提出了一个测试, 叫做 &#8220;是男人就得负67&#8243;. (The man or boy test). 恕我功底不深, 不能给各位读者把这个男人测试的关窍讲清楚, 但是, 我知道, 这个测试, 乃是看 ALGOL 60 编译器有没有正确的实现递归和外部引用的. 照高爷爷的说法, 真的男人要能得到正确答案, 不是男人的就得不到正确答案. 当然, 高爷爷当时自己也没有男人编译器, 所以自己猜了一个 -121, 后来, 真的男人编译器出来了, 正确答案是 -67. 可见, 高爷爷的人脑编译器, 也不是男人编译器&#8230; </p>
<p>各位欲知详情的, 猛点<a href="http://en.wikipedia.org/wiki/Man_or_boy_test">这个</a>.</p>
<img src="http://feeds.feedburner.com/~r/xumathena/~4/xXolrSUMGLs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.youxu.info/2009/05/13/hpl/feed/</wfw:commentRss>
		</item>
		<item>
		<title>论动鸡不良</title>
		<link>http://blog.youxu.info/2009/05/10/zola/</link>
		<comments>http://blog.youxu.info/2009/05/10/zola/#comments</comments>
		<pubDate>Mon, 11 May 2009 03:58:02 +0000</pubDate>
		<dc:creator>Eric</dc:creator>
		
		<category><![CDATA[Article]]></category>

		<guid isPermaLink="false">http://blog.youxu.info/?p=907</guid>
		<description><![CDATA[我不认识周曙光, 没见过面, 只在网上说过几句和计算机有关的话. 但是看看他做的事情, 就知道他是个有趣的人.  每次热点事件, 周曙光不是亲自去现场, 就是立即做专题. 上次的俯卧撑, 山寨牛... ]]></description>
			<content:encoded><![CDATA[<p>我不认识周曙光, 没见过面, 只在网上说过几句和计算机有关的话. 但是看看他做的事情, 就知道他是个有趣的人.  每次热点事件, 周曙光不是亲自去现场, 就是立即做专题. 上次的俯卧撑, 山寨牛博, CCAV 事件等等, 我基本上都是直接看周曙光的聚合信息. 他是一个善于利用传播方法的人. </p>
<p>每次, 总有人出来怀疑周曙光的动机. 我不知道这些人是什么样的心理. 李笑来老师在博客上维权的时候, 有一个人就说, &#8220;你这样跟网络暴民有什么区别,得理不饶人啊.人家都联系你了,你不理人家,那么你的目的到底是要退款还是把事情搞大.&#8221; 这次周曙光做了一个70码的专题, 又有人说, &#8220;不知道那些所谓公民记者，是对 杭州事件 极其感兴趣亦或为了伸张正义？ 一直抓住不放。四川出现H1N1疑似咋不去追踪、报道？甚至怀疑政府别有用心囧。我感觉他们是在借 #70km 事件炒作自己。制作网站http://70km.org/ 并租售广告位，可见一斑。&#8221; 还有包括周曙光去 Google 维权, 也有一大帮子人不从事情本身角度来思考, 却口口声声说周曙光又炒作了. </p>
<p>在这些人眼里, 别人做事, 不管事情本来的原因是什么, 做的人一定要声张正义, 一定要不牵扯任何的个人利益, 一定要在他眼里公平公正, 这个事情才能做, 才做得对, 否则就一定是别有用心炒作自己. 这个思维方式, 不客气的说是被高大全英雄主义和顺民逻辑洗脑后的结果. 在这些评论者的眼里, 一个人一定要清纯的像水晶一样, 才能够做专题, 才能写博客, 否则, 就是要把事情搞大, 就是别有用心. 在他们的社会里面, 一定要大事化小, 小事化了才是正常的逻辑; 若非如此, 就一定是炒作自己. 多年网上论战经验表明, 和这些脑子被门夹了的人说清楚一个道理很难, 特别是不接受逻辑还口口声声号称正义的人, 是无法用正常人的逻辑说服的, 所以, 我也就懒得写文字一一反驳这些话语了. </p>
<p>我是希望更多的人像周曙光老师这样, 把越来越多的事情&#8221;好玩化&#8221;, 用轻松愉快又赚钱又不摸老虎臀部的方法, 把个人利益和社会责任结合起来, 既能让大家得到信息, 又能在这个过程中获得个人利益的诉求的满足. 这样轻松愉快(其实我知道, 在贵国, 这可不轻松愉快, 但现有的阶段, 只能这么做, 原因可参考<a href="http://blog.youxu.info/2008/07/07/entertaining-politics/">我以前文章</a>. 周曙光老师和连岳老师, 冉云飞老师, 以及韩寒老师一样, 都是底线守得非常好的实干家) 又双赢的事情, 都是聪明人才能做得到的. 把事情做到双赢局面, 其实不是人人能做到的. 很多嘴上牛逼哄哄, 天天说你说他的的评论家, 大都抵不上前面四位老师的机灵劲儿的.  </p>
<p>周曙光老师这样的人, 是典型的王小波笔下的&#8221;有趣&#8221;的人. 这样有趣的人, 要越多越好, 这样社会才能有趣, 未来才能有趣.  再说, 动鸡这东西, 本来就是正常人的需求嘛. 鸡这个东西, 长在人身上, 本来就是用来动的嘛. 部分观众偏要指责动鸡不良, 也太摧残人家周曙光老师的人性了吧.</p>
<img src="http://feeds.feedburner.com/~r/xumathena/~4/OjOX5KJr8LA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.youxu.info/2009/05/10/zola/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
