分类 精彩转载 中的文章

无题

1、这个世界上我只相信两个人,一个是我,另一个不是你。 (《空中

监狱》里的经典句子)  

3、叶子的离开,是因为风的追求还是树的不挽留? (终究是因为叶子

自己想离开)
      
4、你以为我会眼睁睁地看着你去送死吗?我会闭上眼睛的!

6、黑夜给了我一双黑色的眼睛,可我却用它来翻白眼。    

7、网络就像是监狱,本来是偷了个钱包进来的,等出去的时候就什么都

学会了。

8、兄弟如手足,女人如衣服,谁动我手足,我扒他衣服!   
 
9、我是个演员,一看见漂亮MM眼就圆……    

10、上帝把所有人都骗了,因为地狱才是最美的!
佛知道真相,所以佛说:“我不入地狱,谁入地狱?”   

11、看到你我连食欲都没了,还谈什么性欲?    

14、别人的失败就是我的快乐!    

15、天哪!我的衣服又瘦了。        

18、以后不要在我面前说英文,OK?    

19、名花虽有主,我来松松土!    

20、有钱男子汉,没钱汉子难!   
 
21、我要是妞,早爱上我了……    (《独自等待》里名句)
  
23、问世间情为何物?圣人答曰:“废物!”  
  
24、我不能给你幸福,但可以给你舒服!  
  
25、思想有多远,你就给我滚多远!  
  
26、流氓不可怕,就怕流氓有文化……  (与流氓会武术一样可怕)

28、有事秘书干,没事干秘书。        
     
29、我爱你!关你什么事?    (张爱玲经典句子)

30、你的就是我的,我的还是我的!    
    
31、男人的谎言可以骗女人一夜,女人的谎言可以骗男人一生!   

33、走牛B的路,让***去说吧!       
 
34、我为兄弟两肋插刀,为女人插兄弟两刀。  
  
35、怀才就像怀孕,时间久了才能让人看出来。 
   
36、想污染一个地方有两种方法:用垃圾,或者用钞票!  
  
37、水能载舟,亦能煮粥!    

39、骑白马的不一定是王子,可能是唐僧;有翅膀的不一定是天使,也

可能是鸟人!    
         
41、数钱数到手抽筋,睡觉睡到自然醒!    

43、鸟大了什么林子都有!       

45、开车无难事,只怕有新人!
Pader 2007-10-11 1

揭开正则表达式的神秘面纱

引言

    正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来:(1)检查一个串中是否含有符合某个规则的子串,并且可以得到这个子串;(2)根据匹配规则对字符串进行灵活的替换操作。

    正则表达式学习起来其实是很简单的,不多的几个较为抽象的概念也很容易理解。之所以很多人感觉正则表达式比较复杂,一方面是因为大多数的文档没有做到由浅入深地讲解,概念上没有注意先后顺序,给读者的理解带来困难;另一方面,各种引擎自带的文档一般都要介绍它特有的功能,然而这部分特有的功能并不是我们首先要理解的。

    文章中的每一个举例,都可以点击进入到测试页面进行测试。闲话少说,开始。


1. 正则表达式规则

1.1 普通字符

    字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号,都是"普通字符"。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。

    举例1:表达式 "c",在匹配字符串 "abcde" 时,匹配结果是:成功;匹配到的内容是:"c";匹配到的位置是:开始于2,结束于3。(注:下标从0开始还是从1开始,因当前编程语言的不同而可能不同)

    举例2:表达式 "bcd",在匹配字符串 "abcde" 时,匹配结果是:成功;匹配到的内容是:"bcd";匹配到的位置是:开始于1,结束于4。


1.2 简单的转义字符

    一些不便书写的字符,采用在前面加 "\" 的方法。这些字符其实我们都已经熟知了。

表达式 可匹配
\r, \n 代表回车和换行符
\t 制表符
\\ 代表 "\" 本身

    还有其他一些在后边章节中有特殊用处的标点符号,在前面加 "\" 后,就代表该符号本身。比如:^, $ 都有特殊意义,如果要想匹配字符串中 "^" 和 "$" 字符,则表达式就需要写成 "\^" 和 "\$"。

表达式

可匹配

 

\^ 匹配 ^ 符号本身
\$ 匹配 $ 符号本身
\. 匹配小数点(.)本身

    这些转义字符的匹配方法与 "普通字符" 是类似的。也是匹配与之相同的一个字符。

    举例1:表达式 "\$d",在匹配字符串 "abc$de" 时,匹配结果是:成功;匹配到的内容是:"$d";匹配到的位置是:开始于3,结束于5。


1.3 能够与 '多种字符' 匹配的表达式

    正则表达式中的一些表示方法,可以匹配 '多种字符' 其中的任意一个字符。比如,表达式 "\d" 可以匹配任意一个数字。虽然可以匹配其中任意字符,但是只能是一个,不是多个。这就好比玩扑克牌时候,大小王可以代替任意一张牌,但是只能代替一张牌。

表达式 可匹配
\d 任意一个数字,0~9 中的任意一个
\w 任意一个字母或数字或下划线,也就是 A~Z,a~z,0~9,_ 中任意一个
\s 包括空格、制表符、换页符等空白字符的其中任意一个
. 小数点可以匹配除了换行符(\n)以外的任意一个字符

    举例1:表达式 "\d\d",在匹配 "abc123" 时,匹配的结果是:成功;匹配到的内容是:"12";匹配到的位置是:开始于3,结束于5。

    举例2:表达式 "a.\d",在匹配 "aaa100" 时,匹配的结果是:成功;匹配到的内容是:"aa1";匹配到的位置是:开始于1,结束于4。


1.4 自定义能够匹配 '多种字符' 的表达式

    使用方括号 [ ] 包含一系列字符,能够匹配其中任意一个字符。用 [^ ] 包含一系列字符,则能够匹配其中字符之外的任意一个字符。同样的道理,虽然可以匹配其中任意一个,但是只能是一个,不是多个。

表达式 可匹配
[ab5@] 匹配 "a" 或 "b" 或 "5" 或 "@"
[^abc] 匹配 "a","b","c" 之外的任意一个字符
[f-k] 匹配 "f"~"k" 之间的任意一个字母
[^A-F0-3] 匹配 "A"~"F","0"~"3" 之外的任意一个字符

    举例1:表达式 "[bcd][bcd]" 匹配 "abc123" 时,匹配的结果是:成功;匹配到的内容是:"bc";匹配到的位置是:开始于1,结束于3。

    举例2:表达式 "[^abc]" 匹配 "abc123" 时,匹配的结果是:成功;匹配到的内容是:"1";匹配到的位置是:开始于3,结束于4。


1.5 修饰匹配次数的特殊符号

    前面章节中讲到的表达式,无论是只能匹配一种字符的表达式,还是可以匹配多种字符其中任意一个的表达式,都只能匹配一次。如果使用表达式再加上修饰匹配次数的特殊符号,那么不用重复书写表达式就可以重复匹配。

    使用方法是:"次数修饰"放在"被修饰的表达式"后边。比如:"[bcd][bcd]" 可以写成 "[bcd]{2}"。

表达式 作用
{n} 表达式重复n次,比如:"\w{2}" 相当于 "\w\w";"a{5}" 相当于 "aaaaa"
{m,n} 表达式至少重复m次,最多重复n次,比如:"ba{1,3}"可以匹配 "ba"或"baa"或"baaa"
{m,} 表达式至少重复m次,比如:"\w\d{2,}"可以匹配 "a12","_456","M12344"...
? 匹配表达式0次或者1次,相当于 {0,1},比如:"a[cd]?"可以匹配 "a","ac","ad"
+ 表达式至少出现1次,相当于 {1,},比如:"a+b"可以匹配 "ab","aab","aaab"...
* 表达式不出现或出现任意次,相当于 {0,},比如:"\^*b"可以匹配 "b","^^^b"...

    举例1:表达式 "\d+\.?\d*" 在匹配 "It costs $12.5" 时,匹配的结果是:成功;匹配到的内容是:"12.5";匹配到的位置是:开始于10,结束于14。

    举例2:表达式 "go{2,8}gle" 在匹配 "Ads by goooooogle" 时,匹配的结果是:成功;匹配到的内容是:"goooooogle";匹配到的位置是:开始于7,结束于17。


1.6 其他一些代表抽象意义的特殊符号

    一些符号在表达式中代表抽象的特殊意义:

表达式 作用
^ 与字符串开始的地方匹配,不匹配任何字符
$ 与字符串结束的地方匹配,不匹配任何字符
\b 匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符

    进一步的文字说明仍然比较抽象,因此,举例帮助大家理解。

    举例1:表达式 "^aaa" 在匹配 "xxx aaa xxx" 时,匹配结果是:失败。因为 "^" 要求与字符串开始的地方匹配,因此,只有当 "aaa" 位于字符串的开头的时候,"^aaa" 才能匹配,比如:"aaa xxx xxx"。

    举例2:表达式 "aaa$" 在匹配 "xxx aaa xxx" 时,匹配结果是:失败。因为 "$" 要求与字符串结束的地方匹配,因此,只有当 "aaa" 位于字符串的结尾的时候,"aaa$" 才能匹配,比如:"xxx xxx aaa"。

    举例3:表达式 ".\b." 在匹配 "@@@abc" 时,匹配结果是:成功;匹配到的内容是:"@a";匹配到的位置是:开始于2,结束于4。
    进一步说明:"\b" 与 "^" 和 "$" 类似,本身不匹配任何字符,但是它要求它在匹配结果中所处位置的左右两边,其中一边是 "\w" 范围,另一边是 非"\w" 的范围。

    举例4:表达式 "\bend\b" 在匹配 "weekend,endfor,end" 时,匹配结果是:成功;匹配到的内容是:"end";匹配到的位置是:开始于15,结束于18。

    一些符号可以影响表达式内部的子表达式之间的关系:

表达式 作用
| 左右两边表达式之间 "或" 关系,匹配左边或者右边
( ) (1). 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰
(2). 取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到

    举例5:表达式 "Tom|Jack" 在匹配字符串 "I'm Tom, he is Jack" 时,匹配结果是:成功;匹配到的内容是:"Tom";匹配到的位置是:开始于4,结束于7。匹配下一个时,匹配结果是:成功;匹配到的内容是:"Jack";匹配到的位置时:开始于15,结束于19。

    举例6:表达式 "(go\s*)+" 在匹配 "Let's go go go!" 时,匹配结果是:成功;匹配到内容是:"go go go";匹配到的位置是:开始于6,结束于14。

    举例7:表达式 "¥(\d+\.?\d*)" 在匹配 "$10.9,¥20.5" 时,匹配的结果是:成功;匹配到的内容是:"¥20.5";匹配到的位置是:开始于6,结束于10。单独获取括号范围匹配到的内容是:"20.5"。


2. 正则表达式中的一些高级规则

2.1 匹配次数中的贪婪与非贪婪

    在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能够匹配不同的次数,比如:"{m,n}", "{m,}", "?", "*", "+",具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。比如,针对文本 "dxxxdxxxd",举例如下:

表达式 匹配结果

(d)(\w+)

"\w+" 将匹配第一个 "d" 之后的所有字符 "xxxdxxxd"

(d)(\w+)(d)

"\w+" 将匹配第一个 "d" 和最后一个 "d" 之间的所有字符 "xxxdxxx"。虽然 "\w+" 也能够匹配上最后一个 "d",但是为了使整个表达式匹配成功,"\w+" 可以 "让出" 它本来能够匹配的最后一个 "d"

    由此可见,"\w+" 在匹配的时候,总是尽可能多的匹配符合它规则的字符。虽然第二个举例中,它没有匹配最后一个 "d",但那也是为了让整个表达式能够匹配成功。同理,带 "*" 和 "{m,n}" 的表达式都是尽可能地多匹配,带 "?" 的表达式在可匹配可不匹配的时候,也是尽可能的 "要匹配"。这种匹配原则就叫作 "贪婪" 模式。

    非贪婪模式:

    在修饰匹配次数的特殊符号后再加上一个 "?" 号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 "不匹配"。这种匹配原则叫作 "非贪婪" 模式,也叫作 "勉强" 模式。如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。举例如下,针对文本 "dxxxdxxxd" 举例:

表达式

匹配结果

(d)(\w+?)

"\w+?" 将尽可能少的匹配第一个 "d" 之后的字符,结果是:"\w+?" 只匹配了一个 "x"

(d)(\w+?)(d)

为了让整个表达式匹配成功,"\w+?" 不得不匹配 "xxx" 才可以让后边的 "d" 匹配,从而使整个表达式匹配成功。因此,结果是:"\w+?" 匹配 "xxx"

    更多的情况,举例如下:

    举例1:表达式 "<td>(.*)</td>" 与字符串 "<td><p>aa</p></td> <td><p>bb</p></td>" 匹配时,匹配的结果是:成功;匹配到的内容是 "<td><p>aa</p></td> <td><p>bb</p></td>" 整个字符串,表达式中的 "</td>" 将与字符串中最后一个 "</td>" 匹配。

    举例2:相比之下,表达式 "<td>(.*?)</td>" 匹配举例1中同样的字符串时,将只得到 "<td><p>aa</p></td>",再次匹配下一个时,可以得到第二个 "<td><p>bb</p></td>"。


2.2 反向引用 \1, \2...

    表达式在匹配时,表达式引擎会将小括号 "( )" 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串可以单独获取。这一点,在前面的举例中,已经多次展示了。在实际应用场合中,当用某种边界来查找,而所要获取的内容又不包含边界时,必须使用小括号来指定所要的范围。比如前面的 "<td>(.*?)</td>"。

    其实,"小括号包含的表达式所匹配到的字符串" 不仅是在匹配结束后才可以使用,在匹配过程中也可以使用。表达式后边的部分,可以引用前面 "括号内的子匹配已经匹配到的字符串"。引用方法是 "\" 加上一个数字。"\1" 引用第1对括号内匹配到的字符串,"\2" 引用第2对括号内匹配到的字符串……以此类推,如果一对括号内包含另一对括号,则外层的括号先排序号。换句话说,哪一对的左括号 "(" 在前,那这一对就先排序号。

    举例如下:

    举例1:表达式 "('|")(.*?)(\1)" 在匹配 " 'Hello', "World" " 时,匹配结果是:成功;匹配到的内容是:" 'Hello' "。再次匹配下一个时,可以匹配到 " "World" "。

    举例2:表达式 "(\w)\1{4,}" 在匹配 "aa bbbb abcdefg ccccc 111121111 999999999" 时,匹配结果是:成功;匹配到的内容是 "ccccc"。再次匹配下一个时,将得到 999999999。这个表达式要求 "\w" 范围的字符至少重复5次,注意与 "\w{5,}" 之间的区别。

    举例3:表达式 "<(\w+)\s*(\w+(=('|").*?\4)?\s*)*>.*?</\1>" 在匹配 "<td id='td1' style="bgcolor:white"></td>" 时,匹配结果是成功。如果 "<td>" 与 "</td>" 不配对,则会匹配失败;如果改成其他配对,也可以匹配成功。


2.3 预搜索,不匹配;反向预搜索,不匹配

    前面的章节中,我讲到了几个代表抽象意义的特殊符号:"^","$","\b"。它们都有一个共同点,那就是:它们本身不匹配任何字符,只是对 "字符串的两头" 或者 "字符之间的缝隙" 附加了一个条件。理解到这个概念以后,本节将继续介绍另外一种对 "两头" 或者 "缝隙" 附加条件的,更加灵活的表示方法。

    正向预搜索:"(?=xxxxx)","(?!xxxxx)"

    格式:"(?=xxxxx)",在被匹配的字符串中,它对所处的 "缝隙" 或者 "两头" 附加的条件是:所在缝隙的右侧,必须能够匹配上 xxxxx 这部分的表达式。因为它只是在此作为这个缝隙上附加的条件,所以它并不影响后边的表达式去真正匹配这个缝隙之后的字符。这就类似 "\b",本身不匹配任何字符。"\b" 只是将所在缝隙之前、之后的字符取来进行了一下判断,不会影响后边的表达式来真正的匹配。

    举例1:表达式 "Windows (?=NT|XP)" 在匹配 "Windows 98, Windows NT, Windows 2000" 时,将只匹配 "Windows NT" 中的 "Windows ",其他的 "Windows " 字样则不被匹配。

    举例2:表达式 "(\w)((?=\1\1\1)(\1))+" 在匹配字符串 "aaa ffffff 999999999" 时,将可以匹配6个"f"的前4个,可以匹配9个"9"的前7个。这个表达式可以读解成:重复4次以上的字母数字,则匹配其剩下最后2位之前的部分。当然,这个表达式可以不这样写,在此的目的是作为演示之用。

    格式:"(?!xxxxx)",所在缝隙的右侧,必须不能匹配 xxxxx 这部分表达式。

    举例3:表达式 "((?!\bstop\b).)+" 在匹配 "fdjka ljfdl stop fjdsla fdj" 时,将从头一直匹配到 "stop" 之前的位置,如果字符串中没有 "stop",则匹配整个字符串。

    举例4:表达式 "do(?!\w)" 在匹配字符串 "done, do, dog" 时,只能匹配 "do"。在本条举例中,"do" 后边使用 "(?!\w)" 和使用 "\b" 效果是一样的。

    反向预搜索:"(?<=xxxxx)","(?<!xxxxx)"

    这两种格式的概念和正向预搜索是类似的,反向预搜索要求的条件是:所在缝隙的 "左侧",两种格式分别要求必须能够匹配和必须不能够匹配指定表达式,而不是去判断右侧。与 "正向预搜索" 一样的是:它们都是对所在缝隙的一种附加条件,本身都不匹配任何字符。

    举例5:表达式 "(?<=\d{4})\d+(?=\d{4})" 在匹配 "1234567890123456" 时,将匹配除了前4个数字和后4个数字之外的中间8个数字。由于 JScript.RegExp 不支持反向预搜索,因此,本条举例不能够进行演示。很多其他的引擎可以支持反向预搜索,比如:Java 1.4 以上的 java.util.regex 包,.NET 中System.Text.RegularExpressions 命名空间,boost::regex 以及 GRETA 正则表达式库等。


3. 其他通用规则

    还有一些在各个正则表达式引擎之间比较通用的规则,在前面的讲解过程中没有提到。

3.1 表达式中,可以使用 "\xXX" 和 "\uXXXX" 表示一个字符("X" 表示一个十六进制数)

形式

字符范围

\xXX 编号在 0 ~ 255 范围的字符,比如:空格可以使用 "\x20" 表示
\uXXXX 任何字符可以使用 "\u" 再加上其编号的4位十六进制数表示,比如:"\u4E2D"

3.2 在表达式 "\s","\d","\w","\b" 表示特殊意义的同时,对应的大写字母表示相反的意义

表达式

可匹配

\S

匹配所有非空白字符("\s" 可匹配各个空白字符)

\D

匹配所有的非数字字符

\W

匹配所有的字母、数字、下划线以外的字符

\B

匹配非单词边界,即左右两边都是 "\w" 范围或者左右两边都不是 "\w" 范围时的字符缝隙

3.3 在表达式中有特殊意义,需要添加 "\" 才能匹配该字符本身的字符汇总

字符

说明

^

匹配输入字符串的开始位置。要匹配 "^" 字符本身,请使用 "\^"

$

匹配输入字符串的结尾位置。要匹配 "$" 字符本身,请使用 "\$"

( )

标记一个子表达式的开始和结束位置。要匹配小括号,请使用 "\(" 和 "\)"

[ ]

用来自定义能够匹配 '多种字符' 的表达式。要匹配中括号,请使用 "\[" 和 "\]"

{ }

修饰匹配次数的符号。要匹配大括号,请使用 "\{" 和 "\}"

.

匹配除了换行符(\n)以外的任意一个字符。要匹配小数点本身,请使用 "\."

?

修饰匹配次数为 0 次或 1 次。要匹配 "?" 字符本身,请使用 "\?"

+

修饰匹配次数为至少 1 次。要匹配 "+" 字符本身,请使用 "\+"

*

修饰匹配次数为 0 次或任意次。要匹配 "*" 字符本身,请使用 "\*"

|

左右两边表达式之间 "或" 关系。匹配 "|" 本身,请使用 "\|"

3.4 括号 "( )" 内的子表达式,如果希望匹配结果不进行记录供以后使用,可以使用 "(?:xxxxx)" 格式

    举例1:表达式 "(?:(\w)\1)+" 匹配 "a bbccdd efg" 时,结果是 "bbccdd"。括号 "(?:)" 范围的匹配结果不进行记录,因此 "(\w)" 使用 "\1" 来引用。

3.5 常用的表达式属性设置简介:Ignorecase,Singleline,Multiline,Global

表达式属性

说明

Ignorecase

默认情况下,表达式中的字母是要区分大小写的。配置为 Ignorecase 可使匹配时不区分大小写。有的表达式引擎,把 "大小写" 概念延伸至 UNICODE 范围的大小写。

Singleline

默认情况下,小数点 "." 匹配除了换行符(\n)以外的字符。配置为 Singleline 可使小数点可匹配包括换行符在内的所有字符。

Multiline

默认情况下,表达式 "^" 和 "$" 只匹配字符串的开始 ① 和结尾 ④ 位置。如:

①xxxxxxxxx②\n
③xxxxxxxxx④

配置为 Multiline 可以使 "^" 匹配 ① 外,还可以匹配换行符之后,下一行开始前 ③ 的位置,使 "$" 匹配 ④ 外,还可以匹配换行符之前,一行结束 ② 的位置。

Global

主要在将表达式用来替换时起作用,配置为 Global 表示替换所有的匹配。

 


 

4. 综合提示

4.1 如果要要求表达式所匹配的内容是整个字符串,而不是从字符串中找一部分,那么可以在表达式的首尾使用 "^" 和 "$",比如:"^\d+$" 要求整个字符串只有数字。

4.2 如果要求匹配的内容是一个完整的单词,而不会是单词的一部分,那么在表达式首尾使用 "\b",比如:使用 "\b(if|while|else|void|int……)\b" 来匹配程序中的关键字。

4.3 表达式不要匹配空字符串。否则会一直得到匹配成功,而结果什么都没有匹配到。比如:准备写一个匹配 "123"、"123."、"123.5"、".5" 这几种形式的表达式时,整数、小数点、小数数字都可以省略,但是不要将表达式写成:"\d*\.?\d*",因为如果什么都没有,这个表达式也可以匹配成功。更好的写法是:"\d+\.?\d*|\.\d+"。

4.4 能匹配空字符串的子匹配不要循环无限次。如果括号内的子表达式中的每一部分都可以匹配 0 次,而这个括号整体又可以匹配无限次,那么情况可能比上一条所说的更严重,匹配过程中可能死循环。虽然现在有些正则表达式引擎已经通过办法避免了这种情况出现死循环了,比如 .NET 的正则表达式,但是我们仍然应该尽量避免出现这种情况。如果我们在写表达式时遇到了死循环,也可以从这一点入手,查找一下是否是本条所说的原因。

4.5 合理选择贪婪模式与非贪婪模式,参见话题讨论。

4.6 或 "|" 的左右两边,对某个字符最好只有一边可以匹配,这样,不会因为 "|" 两边的表达式因为交换位置而有所不同。

Pader 2007-10-5 0

一个跌倒老人引发的群体严重伤害事故

今天上班路上,看到一只河蟹在散步,一不小心撞到了前面的一个老人,致使老人跌倒在地不能起身,河蟹撞到老人后,快速离去。我一看,周围就我一个人,老人还在不断呻吟,我不知如何是好,上去扶成本要4万5,太高了,扶不起啊。送医院,成本要4万5加上车费,想拿手机打120又怕会留下记录,想跑开又怕被法官判我一个做贼心虚畏罪潜逃。我急得是满头大汗,在那里团团转,不知道如何是好。情急之下,我捡起旁边的一根木棍,咬着牙把左手和双腿打断,然后再一棍子打在头上,浑身是血的我倒在老人旁边。我心想,等会有人报警,我就说是老人把我撞成这样的,不但不用对老人作出赔偿,还能让老人赔我的药费。
  谁知道~~很多来来往往的人都看到我们倒在地上,但就是没人报警,部分人看到后先是一愣,然后见了鬼似的以百米跑的速度撒丫子跑了;部分人拿起了手机后又放了回去,呆在那里急得团团转,然后拿起我旁边的木棍自己打断双脚倒在我旁边;部分心理承受能力不强的直接晕了过去;有一妇女,吓得浑身无力,想跑跑不动,棍子也拿不了,高呼一声:“这么多人,得多少个4万5”后,吐血晕过去了;有2个男青年,为了争夺那根棍子大打出手两败俱伤,最后被一个老伯拿了那根棍子,写了个招牌出租棍子:木棍出租,打一下100块,包断手脚。
  最后,实在饥饿难忍,我只得倒立着用一只手跳回家去了。

Pader 2007-9-8 0

最有口碑的几款车

  经常有想要买车的朋友想询问关于选车的各种问题,有些是想在某个价位区间寻找一款最合适的车型,有些则是在某几个车型中徘徊不定。其实买车也还是遵循着一条真理:买车也和买其他用品一样,在确定了消费金额和基本性能之后,总会有两三种甚至更多的产品让你难以抉择,谁也不能保证最后的选择是否是最佳的,对这个问题的回答,不同的人当然也会见仁见智。

  个人认为,要买车就要买市面上最有口碑的车型。从某种角度来看,要想选好你的爱车,其实也是购买大众最喜欢的车,这样也是很明智的。假如这些车口碑不行,就是厂家广告做得再好,也还是白搭。

  当然,在大众心中最有口碑的车,也得分为好几个级别,下面这些车,就是在社会各个阶层中最具代表型,也最有口碑的车型。要想买车,从这些车里选,绝对不会错的。



  永久牌自行车

  口碑指数:★★★★★

  现在,知道永久自行车的已经不太多了,但是,在上个世纪七八十年代,大马路上,到外可以见到人们自豪地踏上永久牌的单车,而且它也是最实用的。那时候,最好的自行车是永久的,飞鸽的老被贼偷。如果现在要想买单车的兄弟,还是选择买永久吧。



  豪爵钻豹

  口碑指数:★★★★☆

  "想到做到,豪爵钻豹",当这句广告语出现在人们视线中时,恐怕没有人会想到短短10年后,它会取得如此骄人的"战绩"。这款由大长江自行研发设计的摩托车,持续引领中国摩托车市场流行趋势,成为125排量车型中被仿制最多的车款之一。"钻豹"系列的成功,并不在于技术上有多大的突破,而是它所贯彻的质量至上赢得了百万消费者的认可。而且豪爵钻豹是在我国生产唯一返销日本的车,口碑还是相当不错的。



  奇瑞QQ

  口碑指数:★★★★☆

  作为国产车的排头兵,奇瑞这几年发展的很快,汽车制造技术也是逐步精湛,自主研发发动机出口国外,口碑甚佳。特别是QQ车开创了微型车销量的阶段性"神话",短短两三年的时间,QQ市场保有量直线上升,直追夏利,满大街跑得是QQ,这是不争的客观现实。QQ作为价格低廉的国产车,也是普通老百姓能养的起的车。许多人就将奇瑞QQ作为人生中的第一辆车了。



  捷达

  口碑指数:★★★★★

  本来觉得像捷达、桑塔纳、富康这些老三样车型有些太过陈旧,但是从它们成熟的技术、方便的维修保养等方面来看,又绝对算得上是一大优点,让人难以随便割舍。虽然车型已经有多年历史,但仍旧是支撑一汽大众销量的中流砥柱,其信得过的质量成为令消费者认可的绝密武器。正是因为它实用,除了家庭普遍适用外,也多用于出租车。



  凯美瑞

  口碑指数:★★★★☆

  凯美瑞之所以被人高看一眼,并非因为其配置比竞争车型多。凯美瑞被众多消费者喜爱,是因为它的性价比高。那么,怎么理解凯美瑞的性价比呢?通过动态和静态的产品对比,熟悉汽车产品的人就能发现这样一个有趣的现象:若论所有性能指标,凯美瑞并不都是最好的,可综合起来看,凯美瑞的得分领先,它没有明显的弱项,明显的长项也不多,有超越也只是那么一点点。它各方面的能力表现出均衡发展的特征,高水平上的均衡,这就是所谓的"木桶理论"。



  克莱斯勒300C

  口碑指数:★★★★★

  克莱斯勒300C是一款买得起用得起、与众不同的豪华车。既注重外又重视内涵的商务型男人都喜欢,喜欢它的大气,实用的空间,美国豪华血统相当浓。业内有句这样的话:克莱斯勒300C是"五百万的外形,四百万的动力,三十万的价格",进口克莱斯勒300C先期在国内用户中建立了不错的口碑,而且,国产克莱斯勒300C能够在短时间内如此迅速上位,还是让人感到有些意外,但是又完全在情理之中。随着人们将克莱斯勒300C作为婚车越来越多,看样子其作为婚礼用车的口碑和形象也将会越来越具有典型性。



  奔驰S系

  口碑指数:★★★★★

  奔驰是实力人士的最爱之一。S级奔驰则在传统的稳重、豪华、大气之外,增加了一丝灵动、内秀。根据全球首项有关消费者对全球品牌喜爱价值的研究,德国豪华汽车制造商奔驰是最多车主谈论和推介给朋友的品牌。而且,奔驰的进口车在国内一直有着很稳定的销量。S级在在国内市场,奔驰S级的销量已经超过了E和C的总和,在国内的销量已经排到全球第二,一方面说明了奔驰品牌良好的口碑;另外一方面也反映了奔驰主要用户群体的富有。

  现在,许多企业也就口碑来作为营销手段了,口碑营销不依靠传统的广告方式来打响一个品牌的名气,而是依靠口碑来传播企业的名声。一般的做法是选定某些群体(这些人在这一阶层中具有权威性和代表性),让他们先得到你的产品并了解他的好处。俗说也说得好:群众的眼睛是雪亮的。通常,这些喜欢新鲜事物及宣讲自己新发现的人就成为一个企业的义务宣传员。总的说来,口碑好,也才是真的好。

Pader 2007-9-8 0

计算机发展史

无处不在、无所不能的电脑,已历经了50多个春华秋实。50余年在人类的历史长河中只是一瞬间,电脑却彻底改变了我们的生活。回顾电脑发展的历史,并依此上溯它的起源,真令人惊叹沧海桑田的巨变;历数电脑史上的英雄人物和跌宕起伏的发明故事,将给后人留下了长久的思索和启迪。请读者随着我们的史话倒转时空,从电脑最初的源头说起。


谁都知道,电脑的学名叫做电子计算机。以人类发明这种机器的初衷,它的始祖应该是计算工具。英语里“Calculus”(计算)一词来源于拉丁语,既有“算法”的含义,也有肾脏或胆囊里的“结石”的意思。远古的人们用石头来计算捕获的猎物,石头就是他们的计算工具。著名科普作家阿西莫夫说,人类最早的计算工具是手指,英语单词“Dight”既表示“手指”又表示“整数数字”;而中国古人常用“结绳”来帮助记事,“结绳”当然也可以充当计算工具。石头、手指、绳子……,这些都是古人用过的“计算机”。


不知何时,许多国家的人都不约而同想到用“筹码”来改进工具,其中要数中国的算筹最有名气。商周时代问世的算筹,实际上是一种竹制、木制或骨制的小棍。古人在地面或盘子里反复摆弄这些小棍,通过移动来进行计算,从此出现了“运筹”这个词,运筹就是计算,后来才派生出“筹”的词义。中国古代科学家祖冲之最先算出了圆周率小数点后的第6位,使用的工具正是算筹,这个结果即使用笔算也很不容易求得。


欧洲人发明的算筹与中国不尽相同,他们的算筹是根据“格子乘法”的原理制成。例如要计算1248×456,可以先画一个矩形,然后把它分成3×2个小格子,在小格子边依次写下乘数、被乘数的各位数字,再用对角线把小格子一分为二,分别记录上述各位数字相应乘积的十位数与个位数。把这些乘积由右到左,沿斜线方向相加,最后就得到乘积。1617年,英国数学家纳皮尔把格子乘法表中可能出现的结果,印刻在一些狭长条的算筹上,利用算筹的摆放来进行乘、除或其他运算。纳皮尔算筹在很长一段时间里,是欧洲人主要的计算工具。算筹在使用中,一旦遇到复杂运算常弄得繁杂混乱,让人感到不便,于是中国人又发明了一种新式的“计算机”。


著名作家谢尔顿在他的小说《假如明天来临》里讲过一个故事:骗子杰夫向经销商兜售一种袖珍计算机,说它“价格低廉,绝无故障,节约能源,十年中无需任何保养”。当商人打开包装盒一看,这台“计算机”原来是一把来自中国的算盘。世界文明的四大发源地──黄河流域、印度河流域、尼罗河流域和幼发拉底河流域──先后都出现过不同形式的算盘,只有中国的珠算盘一直沿用至今。珠算盘最早可能萌芽于汉代,定型于南北朝。它利用进位制记数,通过拨动算珠进行运算:上珠每珠当五,下珠每珠当一,每一档可当作一个数位。打算盘必须记住一套口诀,口诀相当于算盘的“软件”。算盘本身还可以存储数字,使用起来的确很方便,它帮助中国古代数学家取得了不少重大的科技成果,在人类计算工具史上具有重要的地位。


15世纪以后,随着天文、航海的发展,计算工作日趋繁重,迫切需要探求新的计算方法并改进计算工具。1630年,英国数学家奥特雷德使用当时流行的对数刻度尺做乘法运算,突然萌生了一个念头:若采用两根相互滑动的对数刻度尺,不就省得用两脚规度量长度吗?他的这个设想导致了“机械化”计算尺的诞生。奥特雷德是理论数学家,对这个小小的计算尺并不在意,也没有打算让它流传于世,此后二百年,他的发明未被实际运用。18世纪末,以发明蒸汽机闻名于世的瓦特,成功地制出了第一把名副其实的计算尺。瓦特原来就是一位仪表匠,他的蒸汽机工厂投产后,需要迅速计算蒸汽机的功率和气缸体积。瓦特设计的计算尺,在尺座上多了一个滑标,用来“存储”计算的中间结果,这种滑标很长时间一直被后人所沿用。


1850年以后,对数计算尺迅速发展,成了工程师们必不可少的随身携带的“计算机”,直到20世纪五、六十年代,它仍然是代表工科大学生身份的一种标志。


凝聚着许许多多科学家和能工巧匠智慧的早期计算工具,在不同的历史阶段发挥过巨大作用,但也将随着科学发展而逐渐消亡,最终完成它们的历史使命。


第一台真正的计算机是著名科学家帕斯卡(B.Pascal)发明的机械计算机。


帕斯卡1623年出生在法国一位数学家家庭,他三岁丧母,由担任着税务官的父亲拉扯他长大成人。从小,他就显示出对科学研究浓厚的兴趣。


少年帕斯卡对他的父亲一往情深,他每天都看着年迈的父亲费力地计算税率税款,很想帮助做点事,可又怕父亲不放心。于是,未来的科学家想到了为父亲制做一台可以计算税款的机器。19岁那年,他发明了人类有史以来第一台机械计算机。


帕斯卡的计算机是一种系列齿轮组成的装置,外形像一个长方盒子,用儿童玩具那种钥匙旋紧发条后才能转动,只能够做加法和减法。然而,即使只做加法,也有个“逢十进一”的进位问题。聪明的帕斯卡采用了一种小爪子式的棘轮装置。当定位齿轮朝9转动时,棘爪便逐渐升高;一旦齿轮转到0,棘爪就“咔嚓”一声跌落下来,推动十位数的齿轮前进一档。


帕斯卡发明成功后,一连制作了50台这种被人称为“帕斯卡加法器”的计算机,至少现在还有5台保存着。比如,在法国巴黎工艺学校、英国伦敦科学博物馆都可以看到帕斯卡计算机原型。据说在中国的故宫博物院,也保存着两台铜制的复制品,是当年外国人送给慈僖太后的礼品,“老佛爷”哪里懂得它的奥妙,只把它当成了西方的洋玩具,藏在深宫里面。


帕斯卡是真正的天才,他在诸多领域内都有建树。后人在介绍他时,说他是数学家、物理学家、哲学家、流体动力学家和概率论的创始人。凡是学过物理的人都知道一个关于液体压强性质的“帕斯卡定律”,这个定律就是他的伟大发现并以他的名字命名的。他甚至还是文学家,其文笔优美的散文在法国极负盛名。可惜,长期从事艰苦的研究损害了他的健康,1662年英年早逝,死时年仅39岁。他留给了世人一句至理名言:“人好比是脆弱的芦苇,但是他又是有思想的芦苇。”


全世界“有思想的芦苇”,尤其是计算机领域的后来者,都不会忘记帕斯卡在浑沌中点燃的亮光。1971年发明的一种程序设计语言──PASCAL语言,就是为了纪念这位先驱,使帕斯卡的英名长留在电脑时代里。


帕斯卡逝世后不久,与法兰西毗邻的德国莱茵河畔,有位英俊的年轻人正挑灯夜读。黎明时分,青年人站起身,揉了一下疲乏的腰部,脸上流露出会心的微笑,一个朦胧的设想已酝酿成熟。虽然在帕斯卡发明加法器的时候,他尚未出世,但这篇由帕斯卡亲自撰写的关于加法计算机的论文,却使他似醍醐灌顶,勾起强烈的发明欲。他就是德国大数学家、被《不列颠百科全书》称为“西方文明最伟大的人物之一”的莱布尼茨(G.Leibnitz)。


莱布尼茨早年历经坎坷。当幸运之神降临之时,他获得了一次出使法国的机会。帕斯卡的故乡张开臂膀接纳他,为他实现计算机器的夙愿创造了契机。在巴黎,他聘请到一些著名机械专家和能工巧匠协助工作,终于在1674年造出一台更完美的机械计算机。


莱布尼茨发明的新型计算机约有1米长,内部安装了一系列齿轮机构,除了体积较大之外,基本原理继承于帕斯卡。不过,莱布尼茨技高一筹,他为计算机增添了一种名叫“步进轮”的装置。步进轮是一个有9个齿的长圆柱体,9个齿依次分布于圆柱表面;旁边另有个小齿轮可以沿着轴向移动,以便逐次与步进轮啮合。每当小齿轮转动一圈,步进轮可根据它与小齿轮啮合的齿数,分别转动1/10、2/10圈……,直到9/10圈,这样一来,它就能够连续重复地做加法。


稍熟悉电脑程序设计的人都知道,连续重复计算加法就是现代计算机做乘除运算采用的办法。莱布尼茨的计算机,加、减、乘、除四则运算一应俱全,也给其后风靡一时的手摇计算机铺平了道路。


不久,因独立发明微积分而与牛顿齐名的莱布尼茨,又为计算机提出了“二进制”数的设计思路。有人说,他的想法来自于东方中国。


大约在公元1700年左右某天,友人送给他一幅从中国带来图画,名称叫做“八卦”,是宋朝人邵雍所摹绘的一张“易图”。莱布尼茨用放大镜仔细观察八卦的每一卦象,发现它们都由阳(—)和阴(--)两种符号组合而成。他挠有兴趣地把8种卦象颠来倒去排列组合,脑海中突然火花一闪──这不就是很有规律的二进制数字吗?若认为阳(—)是“1”,阴(--)是“0”,八卦恰好组成了二进制000到111共8个基本序数。正是在中国人睿智的启迪下,莱布尼茨最终悟出了二进制数之真谛。虽然莱布尼茨设计的计算机用的还是十进制,但他率先系统提出了二进制数的运算法则,直到今天,二进制数仍然左右着现代电脑的高速运算。


帕斯卡的计算机经由莱布尼茨的改进之后,人们又给它装上电动机以驱动机器工作,成为名符其实的“电动计算机”,并且一直使用到本世纪20年代才退出舞台。尽管帕斯卡与莱布尼茨的发明还不是现代意义上的计算机,但它们毕竟昭示着人类计算机史里的第一抹曙光。


要让机器听人类的话,按人类的意愿去计算,就要实现人与机器之间的对话,或者说,要把人类的思想传送给机器,让机器按人的意志自动执行。


说来也怪,实现人与机器对话的始作俑者却不是研制计算机的那些前辈,而是与计算机发明毫不相干的两位法国纺织机械师。他们先后发明了一种指挥机器工作的“程序”,把思想直接“注入”到了提花编织机的针尖上。


顾名思义,提花编织机具有升降纱线的提花装置,是一种能使绸布编织出图案花纹的织布机器。


应该是,提花编织机最早出现在中国。在我国出土的战国时代墓葬物品中,就有许多用彩色丝线编织的漂亮花布。据史书记载,西汉年间,钜鹿县纺织工匠陈宝光的妻子,能熟练地掌握提花机操作技术,她的机器配置了120根经线,平均60天即可织成一匹花布,每匹价值万钱。明朝刻印的《天工开物》一书中,还赫然地印着一幅提花机的示意图。可以想象,当欧洲的王公贵族对从“丝绸之路”传入的美丽绸缎赞叹不已时,中国的提花机也必定会沿着“丝绸之路”传入欧洲。


不过,用当时的编织机编织图案相当费事。所有的绸布都是用经线(纵向线)和纬线(横向线)编织而成。若要织出花样,织工们必须细心地按照预先设计的图案,在适当位置“提”起一部分经线,以便让滑梭牵引着不同颜色的纬线通过。机器当然不可能自己“想”到该在何处提线,只能靠人手“提”起一根又一根经线,不厌其烦地重复这种操作。


1725年,法国纺织机械师布乔(B.Bouchon)突发奇想,想出了一个“穿孔纸带”的绝妙主意。布乔首先设法用一排编织针控制所有的经线运动,然后取来一卷纸带,根据图案打出一排排小孔,并把它压在编织针上。启动机器后,正对着小孔的编织针能穿过去钩起经线,其他的针则被纸带挡住不动。这样一来,编织针就自动按照预先设计的图案去挑选经线,布乔的“思想”于是“传递”给了编织机,而编织图案的“程序”也就“储存”在穿孔纸带的小孔之中。真正成功的改进是在80年后,另一位法国机械师杰卡德(J.Jacquard),大约在1805年完成了“自动提花编织机”的设计制作。


那是举世瞩目的法国大革命的年代──攻打巴士底狱,推翻封建王朝,武装保卫巴黎,市民们高唱着“马赛曲”,纷纷走上街头,革命风暴如火如荼。虽然杰卡德在1790年就基本形成了他的提花机设计构想,但为了参加革命,他无暇顾及发明创造,也扛起来福枪,投身到里昂保卫战的行列里。直到19世纪到来之后,杰卡德的机器才得以组装完成。


杰卡德为他的提花机增加了一种装置,能够同时操纵1200个编织针,控制图案的穿孔纸带后来也换成了穿孔卡片。据说,杰卡德编织机面世后仅25年,考文垂附近的乡村里就有了600台,在老式蒸气机噗嗤噗嗤的伴奏下,把穿孔卡片上的图案变成一匹匹漂亮的花绸布。纺织工人最初强烈反对这架自动化的新鲜玩意的到来,因为害怕机器会抢去他们的饭碗,使他们失去工作,但因为它优越的性能,终于被人们普遍接受。1812年,仅在法国已经装配了万余台,并通过英国传遍了西方世界,杰卡德也因此而被受予了荣誉军团十字勋章和金质奖章。


杰卡德提花编织机奏响了19世纪机器自动化的序曲。在伦敦出版的《不列颠百科全书》和中国出版的《英汉科技词汇大全》两部书中,“JACQUARD”(杰卡德)一词的词条下,英语和汉语的意思居然都是“提花机”,可见,杰卡德的名字已经与提花机融为了一体。杰卡德提花机的原理,即使到了电脑时代的今天,依然没有更大的改动,街头巷尾小作坊里使用的手工绒线编织机,其基本结构仍与杰卡德编织机大体相似。


此外,杰卡德编织机“千疮百孔”的穿孔卡片,不仅让机器编织出绚丽多彩的图案,而且意味着程序控制思想的萌芽,穿孔纸带和穿孔卡片也广泛用于早期电脑以存储程序和数据。或许,我们现在把“程序设计”俗称为“编程序”,就引申自编织机的“编织花布”的词义。


今天出版的许多计算机书籍扉页里,都登载着巴贝奇(C.Babbage)的照片:宽阔的额,狭长的嘴,锐利的目光显得有些愤世嫉俗,坚定的但绝非缺乏幽默的外貌,给人以一个极富深邃思想的学者形象。


巴贝奇是一位富有的银行家的儿子,1792年出生在英格兰西南部的托特纳斯,后来继承了相当丰厚的遗产,但他把金钱都用于了科学研究。童年时代的巴贝奇显示出极高的数学天赋,考入剑桥大学后,他发现自己掌握的代数知识甚至超过了教师。毕业留校,24岁的年青人荣幸受聘担任剑桥大学“路卡辛讲座”的数学教授。这是一个很少有人能够获得的殊荣,牛顿的老师巴罗是第一名,牛顿是第二名。在教学之余,巴贝奇完成了大量发明创造,如运用运筹学理论率先提出“一便士邮资”制度,发明了供火车使用的速度计和排障器等等。假若巴贝奇继续在数学理论和科技发明领域耕耘,他本来是可以走上鲜花铺就的坦途。然而,这位旷世奇才却选择了一条无人敢于攀登的崎岖险路。


事情还得从法国讲起。18世纪末,法兰西发起了一项宏大的计算工程──人工编制《数学用表》,这在没有先进计算工具的当时,是件极其艰巨的工作。法国数学界调集大批数学家,组成了人工手算的流水线,算得天昏地暗,才完成了17卷大部头书稿。即便如此,计算出的数学用表仍然存在大量错误。据说有一天,巴贝奇与著名的天文学家赫舍尔凑在一起,对两大部头的天文数表评头论足,翻一页就是一个错,翻两页就有好几处。面对错误百出的数学表,巴贝奇目瞪口呆,他甚至喊出声来:“天哪,这些计算错误已经充斥弥漫了整个宇宙!”


这件事也许就是巴贝奇萌生研制计算机构想的起因。巴贝奇在他的自传《一个哲学家的生命历程》里,写到了大约发生在1812年的一件事:“有一天晚上,我坐在剑桥大学的分析学会办公室里,神志恍惚地低头看着面前打开的一张对数表。一位会员走进屋来,瞧见我的样子,忙喊道:‘喂!你梦见什么啦?’我指着对数表回答说:‘我正在考虑这些表也许能用机器来计算!’”巴贝奇的第一个目标是制作一台“差分机”。所谓“差分”的含义,是把函数表的复杂算式转化为差分运算,用简单的加法代替平方运算。那一年,刚满20岁的巴贝奇从法国人杰卡德发明的提花编织机上获得了灵感,差分机设计闪烁出了程序控制的灵光──它能够按照设计者的旨意,自动处理不同函数的计算过程。


巴贝奇耗费了整整十年光阴,于1822年完成了第一台差分机,它可以处理3个不同的5位数,计算精度达到6位小数,当即就演算出好几种函数表。由于当时工业技术水平极低,第一台差分机从设计绘图到机械零件加工,都是巴贝奇亲自动手完成。当他看着自己的机器制作出准确无误的《数学用表》,高兴地对人讲:“哪怕我的机器出了故障,比如齿轮被卡住不能动,那也毫无关系。你看,每个轮子上都有数字标记,它不会欺骗任何人。”以后实际运用证明,这种机器非常适合于编制航海和天文方面的数学用表。


成功的喜悦激励着巴贝奇,他连夜奋笔上书皇家学会,要求政府资助他建造第二台运算精度为20位的大型差分机。英国政府看到巴贝奇的研究有利可图,破天荒地与科学家签订了第一个合同,财政部慷慨地为这台大型差分机提供出1.7万英镑的资助。巴贝奇自己也贴进去1.3万英镑巨款,用以弥补研制经费的不足。在当年,这笔款项的数额无异于天文数字──有资料介绍说,1831年约翰·布尔制造一台蒸汽机车的费用才784英磅。


然而,第二台差分机在机械制造工厂里触上了“暗礁”。


第二台差分机大约有25000个零件,主要零件的误差不得超过每英寸千分之一,即使用现在的加工设备和技术,要想造出这种高精度的机械也绝非易事。巴贝奇把差分机交给了英国最著名的机械工程师约瑟夫·克莱门特所属的工厂制造,但工程进度十分缓慢。设计师心急火燎,从剑桥到工厂,从工厂到剑桥,一天几个来回。他把图纸改了又改,让工人把零件重做一遍又一遍。年复一年,日复一日,直到又一个10年过去后,巴贝奇依然望着那些不能运转的机器发愁,全部零件亦只完成不足一半数量。参加试验的同事们再也坚持不下去,纷纷离他而去。巴贝奇独自苦苦支撑了第三个10年,终于感到无力回天。


那天清晨,巴贝奇走进车间,偌大的作业场空无一人,只剩下满地的滑车和齿轮,四处一片狼藉。他呆立在尚未完工的机器旁,深深地叹了口气。在痛苦的煎熬中,他无计可施,只得把全部设计图纸和已完成的部分零件送进伦敦皇家学院博物馆供人观赏。1842年,在巴贝奇的一生中是极不平常的一年。英国政府宣布断绝对他的一切资助,连科学界的友人都用一种怪异的目光看着他。英国首相讥讽道:“这部机器的唯一用途,就是花掉大笔金钱!”同行们讥笑他是“愚笨的巴贝奇”。皇家学院的权威人士,包括著名天文学家艾瑞等人,都公开宣称他的差分机“毫无任何价值”……


就在痛苦艰难的时刻,孤独苦闷的巴贝奇意外地收到一封来信,写信人不仅对他表示理解而且还希望与他共同工作。娟秀字体的签名,表明了她不凡的身份──伯爵夫人。


接到信函后不久,巴贝奇实验室门口走进来一位年轻的女士。她身披素雅的斗蓬,鬓角上斜插一朵白色的康乃馨,显得那么典雅端庄。巴贝奇一时愣在那里,他与这位女士似曾相识,又想不起曾在何处邂逅。女士落落大方地作了自我介绍,正是那位写信人。


“您还记得我吗?”女士低声问道,“十多年前,您还给我讲过差分机原理。”看到巴贝奇迷惑的眼神,她又笑着补充说:“您说我像野人见到了望远镜。”巴贝奇恍然大悟,想起已经十分遥远的往事。面前这位女士和那个小女孩之间,依稀还有几分相似。原来,伯爵夫人本名叫阿达·奥古斯塔(AdaAugusta),是英国著名诗人拜伦的独生女。她比巴贝奇的年龄小20多岁,1815年出生。阿达自小命运多舛,来到人世的第二年,父亲拜伦因性格不合与她的母亲离异,从此别离英国。可能是从未得到过父爱的缘由,小阿达没有继承到父亲诗一般的浪漫热情,却继承了母亲的数学才能和毅力。


还是在阿达的少女时代,母亲的一位朋友领着她们去参观巴贝奇的差分机。其他女孩子围着差分机叽叽喳喳乱发议论,摸不着头脑。只有阿达看得非常仔细,她十分理解并且深知巴贝奇这项发明的重大意义。或许是这个小女孩特殊的气质,在巴贝奇的记忆里打下了较深的印记。他赶紧请阿达入座,并欣然同意与这位小有名气的数学才女共同研制新的计算机器。


就这样,在阿达27岁时,她成为巴贝奇科学研究上的合作伙伴,迷上这项常人不可理喻的“怪诞”研究。其时,她已经成了家,丈夫是洛甫雷斯伯爵。按照英国的习俗,许多资料在介绍里都把她称为“洛甫雷斯伯爵夫人”。


30年的困难和挫折并没有使巴贝奇屈服,阿达的友情援助更坚定了他的决心。还在大型差分机进军受挫的1834年,巴贝奇就已经提出了一项新的更大胆的设计。他最后冲刺的目标,不是仅仅能够制表的差分机,而是一种通用的数学计算机。巴贝奇把这种新的设计叫做“分析机”,它能够自动解算有100个变量的复杂算题,每个数可达25位,速度可达每秒钟运算一次。


今天我们再回首看看巴贝奇的设计,分析机的思想仍然闪烁着天才的光芒。


由于巴贝奇晚年因喉疾几乎不能说话,介绍分析机的文字主要由阿达替他完成。阿达在一篇文章里介绍说:“这台机器不论在可能完成的计算范围、简便程度以及可靠性与精确度方面,或者是计算时完全不用人参与这方面,都超过了以前的机器。”巴贝奇把分析机设计得那样精巧,他打算用蒸汽机为动力,驱动大量的齿轮机构运转。巴贝奇的分析机大体上有三大部分:其一是齿轮式的“存贮库”,巴贝奇称它为“仓库”(Store),每个齿轮可贮存10个数,齿轮组成的阵列总共能够储存1000个50位数。分析机的第二个部件是所谓“运算室”,它被巴贝奇命名为“作坊”(Mill),其基本原理与帕斯卡的转轮相似,用齿轮间的啮合、旋转、平移等方式进行数字运算。为了加快运算速度,他改进了进位装置,使得50位数加50位数的运算可完成于一次转轮之中。第三部分巴贝奇没有为它具体命名,其功能是以杰卡德穿孔卡中的“0”和“1”来控制运算操作的顺序,类似于电脑里的控制器。他甚至还考虑到如何使这台机器处理依条件转移的动作,比如,第一步运算结果若是“1”,就接着做乘法,若是“0”就进行除法运算。此外,巴贝奇也构思了送入和取出数据的机构,以及在“仓库”和“作坊”之间不断往返运输数据的部件。


阿达“心有灵犀一点通”,她非常准确地评价道:“分析机‘编织’的代数模式同杰卡德织布机编织的花叶完全一样”。于是,为分析机编制一批函数计算程序的重担,落到了数学才女的肩头。阿达开天辟地第一次为计算机编出了程序,其中包括计算三角函数的程序、级数相乘程序、伯努利函数程序等等。阿达编制的这些程序,即使到了今天,电脑软件界的后辈仍然不敢轻易改动一条指令。人们公认她是世界上第一位软件工程师。众所周知,美国国防部据说是花了250亿美元和10年的光阴,把它所需要软件的全部功能混合在一种计算机语言中,希望它能成为军方数千种电脑的标准。1981年,这种语言被正式命名为ADA(阿达)语言,使阿达的英名流传至今。


不过,以上讲的都是后话,殊不知巴贝奇和阿达当年处在怎样痛苦的水深火热之中!由于得不到任何资助,巴贝奇为把分析机的图纸变成现实,耗尽了自己全部财产,弄得一贫如洗。他只好暂时放下手头的活,和阿达商量设法赚一些钱,如制作什么国际象棋玩具,什么赛马游戏机等等。为筹措科研经费,他们不得不“下海”搞“创收”。最后,两人陷入了惶惶不可终日的窘境。阿达忍痛两次把丈夫家中祖传的珍宝送进当铺,以维持日常开销,而这些财宝又两次被她母亲出资赎了回来。贫困交加,无休止的脑力劳动,使阿达的健康状况急剧恶化。1852年,怀着对分析机成功的美好梦想,软件才女英年早逝,死时年仅36岁。阿达去世后,巴贝奇又默默地独自坚持了近20年。晚年的他已经不能准确地发音,甚至不能有条理地表达自己的意思,但是他仍然百折不挠地坚持工作。1871年,为计算机事业贡献毕生精力的先驱者巴贝奇,终于满怀着对分析机无言的悲怅,孤独地离开了人世。有人把他的大脑用盐渍着保存起来,想经过若干年后,有更先进技术来研究他大脑保存的精神。


分析机终于没能造出来,巴贝奇和阿达失败了。巴贝奇和阿达的失败是因为他们看得太远,分析机的设想超出了他们所处时代至少一个世纪!社会发展的需求和科学技术发展的可能,使得他们注定要成为的悲剧人物。尽管如此,巴贝奇和阿达为电脑科学留下了一份极其珍贵的精神遗产,包括30种不同设计方案,近2000张组装图和50000张零件图……,更包括那种在逆境中自强不息,为追求理想奋不顾身的拼搏精神。


巴贝奇巨星陨落后,世人已逐渐将他淡忘,20世纪已经来临。计算机的历史等待着,等待着巴贝奇式的人物再世,等待着人类划时代的壮举。


大约在1936年,美国青年霍德华·艾肯(H.Aiken)来哈佛大学攻读物理学博士学位。恰好在世纪之交来到人世的艾肯,属于大器晚成的科学家。由于家庭贫困,他不得不以半工半读的方式艰难地读完高中。大学期间,也是一边工作,一边刻苦学习,直到毕业后才谋到一份工程师的工作。36岁那年,他毅然辞去收入丰厚的职务,重新走进大学校门。由于博士论文的研究涉及到空间电荷的传导理论,需要求解非常复杂的非线性微分方程,在进行繁琐的手工计算之余,艾肯很想发明一种机器代替人工求解的方法,幻想能有一台计算机帮助他解决数学难题。


三年之后,正如莱布尼茨在书里“找到”帕斯卡一样,艾肯也是在图书馆里“发现”的巴贝奇和阿达。巴贝奇和阿达的论文,令年轻人心摇旌动。70多年过去后,巴贝奇仿佛还在对他娓娓而谈:“任何人如果不接受我失败的教训,还仍然下决心去研制一台把数学分析的全部工作都包括在内的机器的话,我不怕把自己的名誉交给他去作出应有的评价,因为只有他才完全了解我工作的性质及其成果的价值”。以艾肯所处时代的科技水平,也许已经能够完成巴贝奇未竞的事业,造出通用计算机。为此,他写了一篇《自动计算机的设想》的建议书,提出要用机电方式,而不是用纯机械方法来构造新的“分析机”。然而,正在求学的读书人根本没有可能筹措到那么大的一笔经费。


取得博士学位的艾肯进入了美国海军军械局。一名小小的中尉,他仍然没有钱。“金钱不是万能的”,但是,对于艾肯实现计算机梦想来说,“没有钱却是万万不能的”,否则只会重蹈巴贝奇和阿达的复辙。


年轻的海军中尉想到了制表机行业的IBM公司。


艾肯从他一位老师口中得知IBM董事长沃森的大名,他的老师此时正在一所由IBM出资创办的“哥伦比亚大学统计局”里任职,非常乐意为学生写了份推荐信。艾肯连续通宵达旦地准备材料,拟好了一份详细的可行性报告,直接跑去找沃森。他听老师讲,沃森的作风从来就是独断专行,不设法说服此人,研制计算机的计划一准泡汤。


IBM的总部座落在一幢古色古香的建设物里。沃森坐在宽大的写字台后,一言不发听艾肯陈述。在他的背后,是整整齐齐摆满各种书籍的大书柜,书柜的上方贴着只有一个单词的格言──思考(THINK),这是沃森最为推崇的行动准则。


艾肯说完了该说的话,忐忑不安地望着对面这位爱好“思考”的企业家。


“至少需要多少钱?”沃森开口询问。“恐怕要投入数以万计吧”,艾肯喃喃地回答,“不过……”


沃森摆了摆手,打断了艾肯的话头,拿起笔来,在报告上划了几下。


艾肯心里一紧:“没戏了!”出于礼貌,他还是恭敬地用双手接过那张纸,随即低头一瞅,顿时喜上眉稍──沃森的大笔一挥,批给了计算机100万美元!


有了IBM作坚强后盾,新的计算机研制工作在哈佛物理楼后的一座红砖房里开了场,艾肯把它取名为“马克1号”(MarkⅠ),又叫做“自动序列受控计算机”。IBM又派来莱克、德菲和汉密尔顿等工程师组成攻关小组,财源充足,兵强马壮。比起巴贝奇和阿达,艾肯的境况实在要幸运得多。IBM也因此从生产制表机、肉铺磅秤、咖啡碾磨机等乱七八糟玩意的行业里,正式跨进了计算机的“领地”。


艾肯设计的马克1号已经是一种电动的机器,它借助电流进行运算,最关键的部件,用的是普通电话上的继电器。马克1号上大约安装了3000个继电器,每一个都有由弹簧支撑着的小铁棒,通过电磁铁的吸引上下运动。吸合则接通电路,代表“1”;释放则断开电路,代表“0”。继电器“开关”能在大约1/100秒的时间内接通或是断开电流,当然比巴贝奇的齿轮先进得多。


为马克1号编制计算程序的也是一位女数学家格雷斯·霍波(G.Hopper)。这位声名遐迩的数学博士,1944年参加到哈佛大学计算机研究工作,她说:“我成了世界上第一台大型计算机MarkⅠ的第三名程序员。”霍波博士后来还为第一台储存程序的商业电子计算机UNIVAC写过程序,又率先研制成功第一个编译程序A-O和计算机商用语言COBOL,被公认是计算机语言领域的带头人。有一天,她在调试程序时出现了故障,拆开继电器后,发现有只飞蛾被夹扁在触点中间,从而“卡”住了机器的运行。于是,霍波恢谐地把程序故障统称为“臭虫”(bug),而这一奇怪的“称呼”,后来成为计算机领域的专业行话,如DOS系统中的调试程序,程序名称就叫DEBUG。


1944年2月,马克1号计算机在哈佛大学正式运行。从外表看,它的外壳用钢和玻璃制成,长约15米,高约2.4米,自重达到31.5吨,是个像恐龙般巨大身材的庞然大物。据说,艾肯和他的同事们,为它装备了15万个元件和长达800公里的电线。这台机器能以令当时人们吃惊的速度工作──每分钟进行200次以上的运算。它可以作23位数加23位数的加法,一次仅需要0.3秒;而进行同样位数的乘法,则需要6秒多的时间。只是它运行起来响声不绝于耳,有的参观者说:“就象是挤满了一屋子编织绒线活的妇女”,也许你会联想到,马克1号计算机也与杰卡德编织机有天然的联系。马克1号代表着自帕斯卡以来,人类所制造的机械计算机或电动计算机之顶尖水平,当时就被用来计算原子核裂变过程。它以后运行了15年,编出的数学用表我们至今还在使用。1946年,艾肯和霍波联袂发表文章说,这台机器能自动实现人们预先选定的系列运算,甚至可以求解微分方程。


马克1号终于实现了巴贝奇的夙愿。事隔多年后,已经担任大学教授的艾肯谈起巴贝奇其人其事来,仍然惊叹不已,他曾感慨地说,如果巴贝奇晚生75年,我就会失业。但是,马克1号是早期计算机的最后代表,从它投入运行的那一刻开始就已经过时,因为此时此刻,人类社会已经跨进了电子的时代。

Pader 2007-7-1 2