第拾玖章 范含归来 (下)
一九六八年六月的《美国计算机协会通信》杂志发表了KenThompson的文章“正则表达式搜索算法”。这是第一篇将正则表达式理论应用于计算领域的文章,在此之前,正则表达式仅仅是纯粹数学家们的分析工具。 回家之后,范含就看到了这篇文章。 正则表达式啊,很熟悉呀。前一阵子写解释器的时候,用到了lex和yacc,这两个工具就是利用正则表达式技术进行匹配的。只不过,由于中间过程一直运行在脑子里,别人不知道,看到的仅仅是范含“写”出来的C代码而已。 几乎所有的有序“符号串”都可以认为是符合某一种“模式”,或者说“规则”,这种“规则”的定义就是正则表达式。对于分析字符串的任务,正则表达式是最恰当的方式,当然,也是最强大和最灵活的。 说来惭愧,范含一直等到听说了Perl,才第一次知道并从此开始使用正则表达式。在那之前,接触的仅仅是“DOS”、“Windows”、“Basic”之流,根本碰不上。尤其是刚用DOS的时候,会写通配符查找文件就已经沾沾自喜了。 恐怕不光是范含自己,整整这一代人都是这么过来的。归根到底,微软的东西虽然说越来越复杂,但是cao作起来却是越来越傻瓜。只要市场调查显示一个“平均”的用户用不到的地方,绝对不会做出来摆在台面上。 相比之下,老一辈资产阶级程序员都是从文本界面入手。并且,由于这时候是用文本界面cao作一切,当然会将其潜力发挥到极致。只要在“文本交互”的前提下,任何可能提高工作效率的技术,都会想方设法实现。 对了,KenThompson这家伙后来开发的行编辑器“ed”,里面就用到了正则表达式的技术。这时候,一般的计算机还都没有显示器,都是在一台打印终端前面工作。手上啪啪的敲“电传打字机”,眼前就会看到针式打印机嗞嗞的吐出一行。全屏幕编辑?想都别想,就连看全文件内容都不容易。所以,一行一行的编辑看来是唯一选择。 其实这就是一个观念转变的问题,毕竟这时候显示器又不是没有,只不过不是计算机的“标准配件”而已。前年范含买PDP-8的时候,还特意声明加装显示器模块,因为自己很难想象没有屏幕会是什么样子。这也难怪,范含总是拿微型机的眼光看待问题,如果考虑到现在的情况……许多终端连在另外一间房子里的主机上……没有显示器也不算奇怪。 到后来,开发MS的时候,显示器就成标配了,哪怕成本高出一块也在所不惜。不过确实没人反对,因为机器的设计就是必须如此,没有显示器就玩不转了。再说,自从范含带头发挥了屏幕的优点之后,“盯着电视干活”的使用方式也渐渐的被业界接受了。 对于编辑一行的工作,如果只是把正确的内容完全敲进去,工作效率也未免太低。况且,行编辑器一般都是用来进行批处理,比如替换内容,消除不必要的空格之类。这些工作对于每一行而言都是例行公事,所以,既然要找到任务的共同点设计命令,那么正则表达式的采用也是顺理成章。 在Unix出现之前,许多命令行工具就已经存在了,这些工具的共同点就是:读输入,做一些处理,写输出。既然分析输入内容的工作免不了,自然也都会用到正则表达式。限于硬件水平,每个工具完成的事情都很简单,不过都干得很好。 不过,一个工具的输出可以作为另一个工具的输入。以前看到的高手所写的Shell脚本里面,有许多这样的事例:开头是一个小于号重定向输出。像流水线一样,许多小玩意组合起来完成复杂任务,这就是Unix的设计哲学。 这种设计虽然是局限于当时硬件水平的权宜之计,不过其思想至今仍未过时,现在看来,这种工作方式仍然是Unix系统的魅力之所在。需要的工具可以随时编写、补充,不再需要的就可以废弃不用,整个系统永远都是在滚动中更新。现代的软件设计讲究“组件化”、“分布式”、“协作水平”,其实说的就是同一码事。 但是,有利必有弊,正是由于开发工作不限于一时一地,几十年积累下来,四世同堂的工具们自然就有了代沟。最常见的,就是正则表达式规范的不统一。 范含所知道的规范,就有“基本的”、“扩展的”、“再扩展的”和“Perl式的”几种,这几种的写法还都不一样。以前用“grep”的时候,总要先看选项,了解一下这个版本支持那些规范,再用相应的命令行开关打开或关闭。比如表示“匹配一次或多次”的“ ”和“匹配零次或一次”的“”就不是“基本的”规范,想用的话必须打开扩展规范支持。 所以,后来的Sun专门对他们的Unix产品“Solaris”进行了升级,就是为了统一所有命令行工具,都采用相同的规范。 至于平时开发,范含用的是“PCRE”,PerlCompatibleRegularExpression,一个给C语言使用的和Perl兼容的正则表达式库。因为C/C 语言也好,VC之类的开发工具也好,都没有内置的正则表达式支持。这个库自打出现起,就成了C/C 开发者的共识。 说起来,Perl的规矩还真是深入人心,几乎成了业界的事实标准。就在微软推出的最新平台“.Net”框架中,也提供了正则表达式支持,而官方文档中明明白白的写着:“和Perl兼容”。 这么说来,自己如果开发这部分内容,干脆直接使用Perl的标准,一步到位得了。 等等,在什么上面开发?Unix?!啊……不就是Ken这个家伙搞出来的么?!现在估计已经开始动手,等到明年就要修成正果了!既然KenThompson发表了这篇文章,恐怕早就得到灵感,现在构思都差不多成熟了。 不行,Unix的工作一定要抓紧,不然就真来不及了。 歇了两天,也该缓过来了,上班去! ------- 内存芯片已经造好了,黑黑的,扁扁的,远远看去,像土鳖趴在桌子上一样。 算了,能用就成,难看点就难看点,范含也不计较。 “多大容量?”范含明知故问。 “256字节,”法金回答,“按照您的要求,四片拼成1k。” “嗯。”范含有点失望,本来还抱着万一的打算来个惊喜呢,“既然搞出来了,以后就慢慢提高容量吧。” “OK。” “估计咱们的产能有多大,每天能出几片?”范含又问。 “一片也出不了,”汤姆回答,“因为我们没有工厂。” “这些都是在实验室里面做的原型,”杰瑞说,“生产需要的设备还没设计呢,更甭提流水线了。” “这样啊……”范含以前还真没想到这个问题,自己的FOR本来就是个研究机构,除了实验室以外什么都没有,产能可以说是零。 “专利申请了么?”范含赶紧问这个关键问题。 “申请了,”法金回答,“凡是能想起来的地方都申请了,还有好多彼此重复的技术,一并提交上去。” “这以后就轻松了,”范含说,“宁可将来被判为无效,也不能一时手懒。” “那我们现在干什么?”汤姆问。 “先整理一下生产这东西需要的条件有哪些,”范含说,“工厂的事情我来想办法。” 怎么办?发明出来造不出来也是白搭。 自己动手,丰衣足食?不行,首先时间上就来不及,其次经费也不够,虽然就目前的技术水平而言,建立一条生产线的投资不算太大,不过即便这样,开销也是FOR所承受不起的。 代工?也不行,如今的半导体行业差不多都是自产自销,目前还没有独立的不依附于研发公司的芯片工厂。 干脆把专利卖了吧。范含脑子里刚出现这个念头,立刻就自我否定掉,那是杀鸡取卵。 现在的产能主要集中在几家大的半导体公司,比如仙童和德州仪器,再比如刚刚成立的Intel和AMD。 前一阵子桑德斯来借钱的时候,本来有可能控股的,那样一来,至少有了一块根据地。但是范含不想那么早和Intel对决,同时也为了保持自己这个“研究所”的超然身份,还是放弃了。 现在看来,买卖不成仁义在,找他们帮忙肯定是可以的。况且AMD正在创业,还没想好要生产什么。就算是Intel,也是在1969年才推出第一款产品,双极存储芯片……和FOR现在的内存技术比起来,恐怕还没开工就已经落伍了。 不过,既然当初没掺和进AMD,现在也不能明显的向着他们,暗地里向着也不好看。要结盟就干脆直说,遮遮掩掩的……那叫又当婊子又立牌坊。 总之,一碗水要端平,条件应该对于包括AMD在内的所有公司都一样。反正当初借给桑德斯钱的是范含个人,高层之间已经建立起来“深厚的私人友谊”了。 最后的决定是“开放授权”,任何公司都可以生产,包括Intel,甚至IBM。 只不过,专利协议有个条件,那就是:凡是在内存芯片的生产过程中的产生的专利,无论是原生型的还是改良型的,FOR可以无偿使用。 这一点才是关键。 归根到底,硅门电路和MOS都仅仅是一项技术而已,如何运用这些技术的创意,并不是属于技术本身的专利。对内存而言,怎样设计电路才能使频率更快、带宽更大、一个时钟周期多次访问,这些技术更为重要。而这一部分,恰恰是FOR所不擅长,或者说有心无力的。 对于微处理器,这一点更为明显。一条指令可以有许多种方式实现,实现的效率必定有差异。历史上Intel获得的专利,绝大部分都是在处理器内部电路的设计上。正是靠着这些专利的先行地位,才保持了领先的优势。 应该说,这种“专利覆盖”是很可怕的,后来者根本绕不过去。如果勉强用其他手段实现,必定比不上先行者同等产品的性能。这就是为何同样使用MIPS指令集,国产通用处理器“狗剩”就是不如老外造的东西,至少也是一个重要原因。 这个条件确实苛刻,但是范含不怕没人搭理。 历史上AMD头一次在技术领域领先Intel,就是六十四位的x86体系处理器的推出。 本来,按照Intel的打算,x86体系就到此为止了,六十四位处理器采用全新架构……和HP共同开发的“安腾”。这个体系完全是另外一码事,与x86完全不兼容。 市场不饶人,在服务器领域还能卖得动,在桌面应用就不行了,用户根本不买账。毕竟桌面领域已经存在的软件浩如烟海,即便升级成六十四位,也不可能专门为Itanium重写一遍。 这时候AMD趁虚而入,抢先推出x86-64体系。顾名思义,就是六十四位的x86体系,仍然保持向后兼容……这恰恰是Intel多年来无比成功的法宝。理由自然是为了保护客户以前的投资,或者说AMD根本就不打算放弃x86架构。 一开始Intel还在死撑,直到撑不住为止。好在Intel内部早就预计到了这种情况,事先准备好了解决方案……Yamhill平台……也是六十四位的x86体系,不过和AMD搞的那个不兼容,有些微小差别。 不过,以微软为首的软件公司不干了,它们绝对不愿意针对两种差之毫厘谬以千里的架构开发两套系统。没有足够软件支持的硬件肯定混不下去,不提苹果,光看看游戏机市场就知道了。于是乎,在这些“衣食父母”的压力下,Intel不得不低头:和AMD兼容。主动去迁就别人,在Intel历史上确实是头一次。 幸亏,让范含印象最深刻的就是这个幸亏,Intel当年授权x86指令集给AMD的时候,签署的协议里面就有这么一条,可以随意使用AMD相应的专利。自然,Intel当仁不让,使用到了如此地步:连文档都是以AMD的原件为范本,略作修改交差。结果还没完全改好,里面不时出现AMD体系特有的东西……洋相出大了,这也是自打“奔腾浮点错误”以来的又一回。 总之,这样的“不平等条约”是有“先”例的。 话说回来,当年AMD俯首称臣的原因,是由于x86体系已经是业界事实标准,不服不行。现在的FOR还没有当年Intel的地位和实力,但范含并不担心其他公司另起炉灶,自己就像苹果那样逐渐远离主流。因为内存和硬盘、CRT显示器一样,几十年来虽然技术含量不断提高,但是原理仍然没变。或许遥远的将来会有替代品,但是这几十年之中,谁也绕不过去。 不会有计算机公司顽固到干等几十年。 乖乖的上钩吧!各位! ------- “那些公司都是边开工边扩建生产线,”汤姆说,“一个月就能出产品,最多两个月就可以上批量。” “那就好,”范含说,“内存问题解决了,下面都好办。” “现在我们干什么?”杰瑞问,“好象技术上不需要我们cao心了,别人琢磨出来之后,拿来用就是了。” “是啊,可以干点儿别的了。”范含说,“对了,要不你们开始研究‘微处理器’吧。” “什么是‘微处理器’呀?”法金问。 “就是很‘micro’的‘preocessor’,”范含回答,这应该是这个术语头一次出现,“我在想:现在的一台计算机也许有几万个晶体管,根据摩尔定律,早晚有一天会达到某个程度,这几万个晶体管可以集成在一块芯片上。这就是说,理论上可以在一块芯片上面实现计算机的全部功能。” “唔……确实如此。”众人明白了。 “那你们就去干吧!” “干什么?”没有具体的指示,有点摸不着头脑。 “比如说,先拿咱们的‘Kervin’处理器开刀,”范含说,“能放在一起的就先放在一起,一点一点缩小,到了最后全集成到一块芯片上。” “OK。” “啊,不!”范含改主意了,“Kervin也不简单,好歹也是个8位处理器,这么干恐怕得很久。” “是啊。” “先弄个简单的,”范含说,“申请专利要紧。” “多简单?” “一位的微处理器能造出来么?”范含问。 “不行!”异口同声。 “为什么?”范含奇怪。 “不为什么,”法金回答,“一位的不是处理器,那是开关。” “明白了,”范含很没面子,居然问了这么个愚蠢的问题,“那就造个两位的吧!” “……” “怎么了?”范含问,“我又说错了什么?” “没有,”汤姆说,“造出来倒是可以……” “嗯?” “不过就算造出来能拿来干什么?”杰瑞说,“没有任何实用价值。” “只要把几个寄存器倒来倒去,”范含松口气,原来是这么回事,“十以内加减法总是可以算的吧?” “确实可以,”法金说,“不过这种发明有点……让人哭笑不得。” “不管了,”范含也知道这个要求确实过分,要搁以后估计肯定能获得“搞笑诺贝尔奖”,“只要能达到申请专利的地步就行了,一定要尽可能的简单,这是为了发明速度尽可能得快。” “知道了。”众人打算告辞。 “你们俩留一下,”范含把汤姆和杰瑞叫住,“先干一件要紧事。” “啥?” 自从MS开发完成之后,范含就感觉到了局限性。不光是没有cao作系统……这个还好办……主要问题是内存太小。 解释器是烧在ROM里面的,开发的时候范含是按照嵌入式的标准写的代码,程序基本上可以“原地”执行,命令缓冲区也都是单独开列,运行起来并不会占用额外的内存。虽然64k内存完全被用来存放变量,不过仍然不够用。整个内存满打满算,也只能放下一个128阶的单精度方阵,这还只能放着,不能对其进行任何处理,那样的话还需要有不少存放中间变量的空间。况且,科学计算所处理的矩阵都不会太小,怪不得IBM主动提供了接口,为的就是利用System360那“强大”的计算能力。 原来用的是磁环存储器,64k的体积就相当大了。现在既然有了内存颗粒,可能会小一些。批量生产后,成本也不会太高。这使得升级MS成为可能。不过,处理器的地址线只有16位,最多只能寻址64k,只有修改处理器才能利用额外的内存。 好在68k体系的寄存器本来就是32位,内部处理不需要大改,数据线可以保留16位也不用动,读两次就得了。真正需要重新设计的是寻址方式。 现在的处理器不“微”也有不“微”的好处,只要替换相应寻址部分的芯片,就可以达到修改的目的,这要是以后的CPU,只能整片扔掉了。 “你听我说,”范含面向汤姆,“改成段式寻址。” “每段64k,最多一共有64k个段?”汤姆反应很快。 “对。”范含说,DOS下面的“伪”段式寻址一共只有20位,自己这个构想可有点不一样,应该是真正的32位地址,“我们MS的内存就是应该以64k为单位添加的。” “就是说,”杰瑞插嘴,“机器上的内存应该是64k的整数倍?” “没错,这样一来我们也方便点。”范含说,“我的设想是:每64k内存的板子上面就有16个跳线,表示这些内存属于哪个段。通过硬件判断有多少段,哪些段可以用。” “可以,不过,”汤姆说,“对于跨段的寻址怎么办?” “不让,”范含说,“具体到MS机型上,一个变量只能放在一个段里面。” “那合着大一点的矩阵还是没法用。”杰瑞说。 “是啊,”范含说,“这也是没办法的事。” ------- 月底了,第二季度的报表也出来了。MS一共才卖出几百台,总销量还不到两千台。这也是预料之中,毕竟数学工作站属于专用机型,用户范围本来就狭窄。 两千台……不算多,范含想,不过,升级起来也省事不少。 “你说免费升级?!”奥尔森以为自己听错了。 “嗯,这次不跟他们要钱。”范含说。 “那我们得花多少钱?”奥尔森问。 “也就几十万吧,”范含回答,“只有换下来的处理器芯片会报废,原来的磁环内存都可以卖掉。” “那也是亏本买卖。” “做买卖总得先赔后赚,”范含说,“别忘了如果他们想要加内存,只能从我们这里买。” “那你打算把内存卖到多贵?”奥尔森问,“如果想要捞回来的话。” “价格公道,”范含说,“不会牟取暴利。” “那样干划算么?”奥尔森说,“你好好算算这笔账。” “当然划算,我已经算过了。”范含说,“以前的计算机都是整个买,整个报废,单笔花销很大。现在改成慢慢升级,每次都只花小钱,预算的申请比较容易通过。别忘了这些买主可都是公费。” “呃……”奥尔森停顿了一下,“即便这样,光靠内存也赚不回来吧?” “内存只是开始,”范含说,“前两天和IBM达成了交叉授权的协议,我们用内存换来了磁盘技术。” “你的意思是说,以后靠各种配件赚钱?” “不要说‘配件’嘛,”范含纠正,“应该说‘服务’。如果不是主机实在太贵,我连白送的心都有。” “不懂!” “这个MS的销量很少,还不明显。”范含说,“等到游戏机开始发售的时候,你就该乐了……呵呵呵……嘿嘿嘿……” -------