正文

Forth-早期岁月(2)2005-08-05 16:17:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/forth/3487.html

分享到:

麻省理工学院,史密森尼亚天文物理观测台,1958
 
    1957年十月是最令人激动的史普尼克事件,我是麻省理工学院的二年级生,并在哈佛大学的史密森尼亚天文物理观测台得到一个14节的兼差工作。
    史密森尼亚天文物理观测台的负责人造卫星的光学追踪网络:一是观月视觉观察网络及Baker-Nunn追踪摄影机网络,由于史普尼克的趁虚而入,他们请了大学生以佛莱登桌上型计算器来计算预测值,John Gaustad告诉我有关麻省理工学院的IBM EDPM 704计算机的事情,并且借我他的Fortran手册,在我的第一个程序,轨道4号,完成后结束了我的工作[Moore 1958]。
    我现在是个跟George Veis一起工作的程序员,应用他的最小平方凑配(Fitting)方法来决定轨道参数、观测站位置及到最后是地球外型[Veis 1960],当然,这个兼差工作最少是40个小时,所以我的学业便墬入了地狱。
    在麻省理工学院,John McCarthy告诉我一个难以置信的LISP语言课程,这是我第一次接触到递归及令人惊叹的多种计算机语言,Wil Baden曾注解说LISP是Lambda微积分而Forth是Lukasewcleicz后置。
    APL当时也是个话题语言,由于它怪异的由右而左剖析法,虽然我佩服并且模仿它的运作,但我不能认同它们是一组最佳的集合。
    在50年代的程序设计环境比现在都还严谨,我的原始码填满了两个纸夹的打洞卡,当它们要放入机器时必须要提着,这事常常是我做的,编译动作花了30分钟(就如同C一样),但每天平均一个人的执行的计算机时间是有限的,除非有第三班。
    所以我写了这个简单的解译器来读取输入卡并且控制程序,它也可直接做计算,5个轨道参数每个都有一个经验等式来计算大气拖延及非球形的地球,就这样我可以将用于许多人造卫星的不同等式做结合,而不用再重新编译。
    因为这些等式将像是P2(二阶多项式)和S(正弦)的项次总和,而36位的浮点数主宰了计算时间,所以负担很小,数据堆栈并不需要,而且我可能也不知道。
    由这里开始的Forth解译器有这些字

     WORD  NUMBER  INTERPRET  ABORT
 
    它们以前并不是以这种拼法,而是陈述数字。

    INTERPRET使用WORD来读取以空白分隔的字,而NUMBER用来转换字符串成为二进制数(在这个例子中是指符点数),这样的自由格式的输入并不普通,但是更有效率(更小且更快)和可靠,Fortran输入则是格式化成特定的字段,常常由于过多的延迟而有印刷上的错误。
    这个解译器以Fortran来编码,使用IF …ELSE IF的结构来找出符合的单字元,错误处理便是结束执行,然后就跟现在一样,ABORT要求使用者做些事情,由于输入卡以它们被读取顺序来排列,所以您可以知道哪里出错了。

史丹佛大学,史丹佛线性加速中心,1961
 
    1961年我到史丹佛大学研究数学,虽然史丹佛有设立自己的计算机科学系,然而我有兴趣的是真正的计算,我很惊讶他们能去(无惧乎?)写自己的Algol编译器,而我像是命运注定般邂遘了Burroughs B5500计算机。
    我在SLAC(史丹佛线性加速中心,12节)得到另一个”兼差”的工作,负责写程序来最佳化延迟2哩的电子加速器的光束前进,这个是我的最小平方经验到相位空间的一个自然应用,Hal Butler是我们团队的主事者,而TRANSPORT程序十分成功。
    另一个最小平方的应用是CURVE程序,它以Algol(1964年)来编写,它是个一般用途的非线性差分修正数据凑配程序,它精密的统计提供模型与数据间一致性所需的洞察。
    数据格式和模型等式被解译,而一个下推的堆栈被用来方便估算,CURVE程序是个令人印象深刻的Forth先驱,它引入了下面这些字来提供功能来凑配模型,让它比简单的等式更精巧。

     +  -  *  NEGATE
     IF  ELSE  THEN  <
     DUP  DROP  SWAP
     :  ;  VARIABLE  !  (
     SIN  ATAN  EXP  LOG
 
拼法可能十分不同:

     NEGATE  是  MINUS
       DROP       ;
       SWAP       .
          !       <
   VARIABLE       DECLARE
          ;       END
     ( ...)       COMMENT ...;

    解译器使用IF…ELSE IF来验证叫做ATOM(由LISP而来)的6个字符的输入字。DUP、DROP和SWAP是5500的指令;我很惊讶拼法的改变,”:”字取自Algol的标记格式,为了由左而右的剖析而翻过来(以便防止解译器遇到一个未定义的字)。

     Algol - LABEL:
     CURVE - : LABEL

    事实上,”:”在输入字符串中标注了稍后要解译的位置,解译工作到”;”而停止,另一个”:”的版本名叫做DEFINE。
    储存操作子(!)出现与VARIABLE有关,但撷取(@)是自动的,请注意输入已变得复杂到足够去赋予批注,时常令人诟病的后置法条件式就由这时开始:
 
     Algol - IF expression THEN true ELSE false
     CURVE - stack IF true ELSE false THEN

    假如堆栈中非零则解译为真值,THEN提供很独特的结束,我常对Algol中没有用它而感到困惑。这样的表示式解释为:IF将向前扫描ELSE或THEN。
    字”<”引入了关系操作子将留下了1代表真而0代表假的真值在堆栈上的习惯用法。当然啰,超越方程是链接库呼叫。

阅读(3873) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册