堡垒的早期

图片

从这里拍摄的KDPV

介绍


FORT是一种简单自然的计算机语言。在需要高效率的地方,它已经得到了广泛的分配。在60年代,他走过了从大学到企业再到实验室的发展道路。这是一个有关简单解释器如何扩展其功能并如何成为完整的编程语言和操作系统的故事。

这项工作是为举办有关编程语言历史的会议-HOPL II而编写的。她最终被拒绝了,可能是由于她的演讲风格。

FORT于六十年代在美国蔓延-大学,商业和科学,以及其他发达语言。那时我是唯一的程序员,直到这一时期的最后,它还没有名字。此处描述的所有内容都是从内存,零散文档和尚存的程序列表中恢复的。

总体而言,FORT几乎不是原始的,但它是组件的独特组合。我感谢那些允许我开发它的人和组织-通常我自己都不知道它。我感谢您有兴趣让您阅读它。

FORT是一种简单自然的计算机语言。今天[1991-约翻译。]它被认为是世界级的编程语言。他在没有工业,大学或政府支持的情况下达到如此水平的事实是其有效性,可靠性和多功能性的结果。 Fort是一种在其有效性比其他语言的普及更重要的情况下选择的语言。在诸如控制和通信系统的实际领域中,这是经常发生的情况。

许多FORT组织和许多小型公司都提供系统,应用程序和文档。在北美,欧洲和亚洲,每年举行一次会议。即将发布ANSI标准草案[ANS 1991]。

关于FORT的书都没有完全描述他的“品味”。我认为最好的还是第一个-Leo Brodie的“ Starting Forth” [例如,在这里-https ://www.forth.com/starting-forth/-大约。翻译]

我们正在讨论的经典FORT为程序员提供了最少的充分支持,使其可以为其应用程序开发出最佳的语言。它旨在用于工作站等环境,包括键盘,显示器,计算机和磁盘驱动器(在那时,磁盘驱动器通常是外部的,因此作者只列出了最小计算机系统的组成部分-大约。翻译]

FORT本质上是一种无上下文的文本语言。它允许您组合用空格分隔的“单词”以构造新的“单词”。其中约150个单词构成一个系统,该系统提供:

         SAO  1958  
        SLAC  1961   
         RSI  1966    ,   , 
     Mohasco  1968  ,  , ,  ,
                    
        NRAO  1971   *,    

*绣花代码是一种编译程序的方法,其中该程序是子程序调用的数组,请参见https://en.wikipedia.org/wiki/Threaded_code-约。佩雷夫。

这样的系统包含从10到20页的源代码编译的3到8 KB的程序代码。即使在资源有限的计算机上,也可以由一个程序员轻松地开发它。

这段文字必然描述了我的职业;但是他被认为是堡垒的“传记”。我将讨论上面列出的FORT功能以及与之相关的“单词”的名称。许多“单词”的含义是显而易见的。有些需要描述,而有些超出了本文的范围。

下面列出了FORT语言词典中要考虑的部分:


     WORD  NUMBER  INTERPRET  ABORT
     HASH  FIND  '  FORGET
     BASE  OCTAL  DECIMAL  HEX
     LOAD  EXIT  EXECUTE  (
 (  )
     KEY  EXPECT
     EMIT  CR  SPACE  SPACES  DIGIT  TYPE  DUMP
 
     DUP  DROP  SWAP  OVER
     +  -  *  /  MOD  NEGATE
     ABS  MAX  MIN
     AND  OR  XOR  NOT
     0<  0=  =
     @  !  +!  C@  C!
     SQRT  SIN.COS  ATAN  EXP  LOG
 
     :  ;  PUSH  POP  I
 (   )
     BLOCK  UPDATE  FLUSH  BUFFER  PREV  OLDEST

     CREATE  ALLOT  ,  SMUDGE
     VARIABLE  CONSTANT
     [  ]  LITERAL  ."  COMPILE
     BEGIN  UNTIL  AGAIN  WHILE  REPEAT
     DO  LOOP  +LOOP  IF  ELSE  THEN


麻省理工学院,1958年


最激动人心的时刻是1957年10月,当时人造卫星发射了[人造卫星1号卫星-大约翻译]。我是麻省理工学院的二年级学生,并在哈佛大学的SAO(史密森天体物理天文台,多达16个音节,一场噩梦)兼职。天文台负责卫星的光学跟踪-利用月亮视觉观察[意项目月球表- https://en.wikipedia.org/wiki/Operation_Moonwatch -大约。 。译]和卫星跟踪摄像机[贝克-中午相机- https://en.wikipedia.org/wiki/Schmidt_camera#Baker-Nunn -大约。 perev。]。出乎意料的是,他们聘请学生在Friden台式计算器上计算出轨迹。 John Gaustad在麻省理工学院向我介绍了IBM EDPM 704,并借给我他的FORTRAN II手册。最后,我的第一个程序Ephemeris 4使我失业。

现在,我已经以程序员的身份与乔治·维斯(George Veis)合作,应用他的最小二乘法来确定轨道参数,静止位置,并最终确定地球的形状。当然,这个“兼职工作”至少要花40个小时,但是,是的,我的文凭已经涵盖了。

约翰·麦卡锡(John McCarthy)在麻省理工学院教授了出色的LISP课程。本课程是我对递归和各种编程语言的介绍。威尔·巴登(Wil Baden)指出,用于lambda演算的LISP与后缀表示法Lukasewcleicz [ Lukashevich 的表示法,也称为反向波兰表示法-大约。翻译]

潜水艇也很重要,从右到左对其进行了奇怪的分析。尽管我欣赏他并模仿他的操作员,但我不相信他们是最佳组合。

五十年代的编程比今天更加苛刻。我的源代码占用了2张打孔卡。为了让他们上车,我不得不修补,基本上我自己做。组装过程花了半个小时(就像在C中一样),但是有限的计算机时间意味着每天只有一次启动,除了第三次轮班。

因此,我编写了一个简单的解释器,该解释器读取具有输入数据的卡并控制程序。他还控制计算。对于这五个轨道参数中的每一个,都有经验公式可以考虑大气漂移和地球形状与球体的偏差。这样,我可以为几颗卫星组成各种方程式,而无需重新编译程序。

P2(二次多项式)和S(正弦)等因素参与了这些方程式。大多数情况下,占用了36位浮点计算,因此开销很低。不需要数据堆栈,但我可能对此一无所知。

因此,FORT解释器的故事开始了-从单词

WORD  NUMBER  INTERPRET  ABORT


由于它们是操作员编号,因此尚未用文字记录。

INTERPRET使用WORD读取以空格分隔的单词,并使用NUMBER转换单词[文本记录中的数字-大约1。 ]以二进制形式(在这种情况下,具有固定点)。这种自由格式的输入是不寻常的,但是效率更高(更小,更快)并且更可靠。 Fortran风格的输入被格式化为特定的列,而错别字导致了许多延迟。

该解释器使用了用FORTRAN编码的IF ... ELSE IF构造来匹配每个字符。所有错误处理都只是在中断程序的执行。然后,像现在一样,ABORT一词询问用户该怎么做。由于输入卡是按阅读顺序编号的,因此您可以找出错误所在。

斯坦福,SLAC,1961年


1961年,我来到斯坦福大学学习数学。尽管斯坦福大学创建了自己的计算机科学系,但我对计算更感兴趣。他们可以(敢于?)编写自己的ALGOL编译器给我留下了深刻的印象。然而-命运把我带到了Burroughs B5500计算机上。我再次受雇在SLAC(斯坦福线性加速器,10个音节)兼职,编写代码以优化未来三公里电子加速器中的束流保持率。这是最小二乘法(根据我的经验)在相空间中的自然应用。哈尔·巴特勒(Hal Butler)负责我们的小组,我们的运输计划取得了成功。

最小二乘法的另一个应用是1964年在ALGOL上编写的CURVE程序。它是用于带有差分校正的非线性数据选择的通用程序。它的统计严谨性提供了对模型和实验数据一致性的详细分析。

解释了数据格式和模型方程式,并使用堆栈简化了计算。CURVE是FORT令人印象深刻的先驱。为了提供不使用简单方程式而是使用更复杂模型的机会,她引入了以下词语:

     +  -  *  NEGATE
     IF  ELSE  THEN  <
     DUP  DROP  SWAP
     :  ;  VARIABLE  !  (
     SIN  ATAN  EXP  LOG


拼写略有不同:

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


为了定义一个六个字符的输入字(类似于LISP称为ATOM),解释器使用IF ... ELSE IFDUPDROPSWAP是机器指令;我为它们的写法不同而感到惊讶。 “ ”(冒号)一词取自ALGOL的标签格式,并被“翻转”以从左向右解析(以防止解释器检测到未定义的词):

     ALGOL - LABEL:
     CURVE - : LABEL

实际上,冒号标记了输入行中的位置,稍后将对其进行解释。解释停止于“ ; ”(分号)。结肠的一种版本称为DEFINE

记录运算符” “(感叹号)与VARIABLE有关;但是读取“ @ ”是自动的。请注意-代码变得足够复杂,需要注释。曾经被批评的后缀条件从这里开始:

     ALGOL - IF expression THEN true ELSE false
     CURVE - stack IF true ELSE false THEN

如果堆栈顶部有一个非零值,则将其视为布尔真值(true)。THEN提供了独特的结局,而ALGOL的缺席总是让我感到困惑。类似的表达式解释如下:IF扫描输入中的ELSETHEN单词<引入了一种约定,即关系在堆栈上保留一个布尔值-如果为true,则为1,如果为false,则为0。超越函数当然是对库例程的调用。

在免费面包上


我于1965年离开斯坦福大学,成为纽约的自由计算机程序员。这并不罕见,我在FORTRAN,ALGOL,Jovial,PL / I和各种汇编程序中找到了工作程序。我从字面上拖着我的打孔卡,并根据需要对其进行了重新编程。出现了小型计算机,以及它们-终端。该解释器非常适合电传打字输入,很快就获得了用于输出的代码。因此我们找到了以下单词:

     KEY  EXPECT
     EMIT  CR  SPACE  SPACES  DIGIT  TYPE

EXPECT是一个循环,它调用KEY来读取击键。TYPE是一个调用EMIT来显示字符的循环

随着电传打字机的到来,是时候来打孔磁带和您可以想象的最不舒服的程序了-需要大量时间进行编辑,打孔,装载,组装,打印,下载,测试,然后再进行。我记得在曼哈顿摩天大楼中的一个糟糕的星期天,那时我找不到胶带(没有其他帮助),并诅咒“一定有更好的方法”。

我在Realtime Systems,Inc(RSI)的Bob Davis方面做得不错。我对5500 MCP进行了深入的研究-足以支持其时间共享服务(与远程终端一起使用),还编写了从FORTRAN到ALGOL的翻译器以及文件编辑实用程序。译者向我展示了FORTRAN不需要的单词之间的空格值。

解释器仍然只能通过前6个字符来区分单词(因为Burroughs B5500中的数据单词为48位)。出现LIST EDIT BEGAIN AGAIN EXIT字样BEGIN ... AGAIN

一词被写为START ... REPEAT,并作为编辑命令T TYPE I INSERT D DELETE F FIND的 “括号”后来在NRAO编辑器中使用。Mohasco的Forth DBMS样式中使用了FIELD

这个词。因此,FORT的标志之一。规则是FORT在解释完成时通过添加OK来确认输入的每一行。这可能很麻烦,因为当输入以CR字符终止时,应该显示一个空格,然后单击OK,最后显示CR。在RSI中,可以,我走到了下一行,但是尽管如此,我还是通过令人恐惧的通信线路通过了友好的确认[作者的笑话是基于以下事实:在那些年中,具有通信线路的计算机的工作非常罕见;对于现代读者来说,这个笑话已经失去了意义,至少听起来很奇怪-大约。翻译]

     56 INSERT ALGOL IS VERY ADAPTABLE
     OK


此后缀表示建议使用数据堆栈,但其足够的深度仅为一个。

莫哈斯科(Mohasco),1968年


1968年,我来到纽约阿姆斯特丹商业公司Mohasco Industries,Inc担任程序员。这是一家生产家居用品的大公司-地毯和家具。我曾在RSI与Geoff Leach合作,他说服我将他转移到该州北部。我刚结婚,在阿姆斯特丹有一个小镇的奇妙氛围,与纽约形成鲜明对比。

我在COBOL上重写了代码,并弄清了什么是商业软件。Bob Raiko负责公司数据处理,并给了我两个相关项目。

他租用了一台带2250图形显示屏的IBM 1130微型计算机,目的是看计算机图形是否可以帮助制作图案地毯。答案是“没有颜色支持就无济于事”,并且不再提供1130选项。

当时,我拥有最新的微型计算机:16位处理器,8K RAM,磁盘驱动器(这是我人生中的第一个),键盘,打印机,读卡器和打孔器,FORTRAN编译器。如果发生磁盘故障,则读取器和打孔器是备份选项。我再次移植了我的解释器(回到FORTRAN),并添加了交叉汇编器以与2250一起使用。

系统很棒。当IBM几乎无法绘制静态平面图片时,她可以绘制动画三维图像。由于这是我的第一个实时图形,因此我为第一个视频游戏Spacewar编写了代码。我还重写了最初用ALGOL编写的FORT国际象棋程序,并且对它变得如此简单感到很满意。

包含解释器的文件称为FORTH,这意味着第四(下一代)软件FOURTH。但是名称必须缩短,因为操作系统将文件名限制为5个字符。

2250的编程环境远远优于FORTRAN,因此我将2250交叉汇编器扩展到1130编译器,其中有很多新词:

     DO  LOOP  UNTIL
     BLOCK  LOAD  UPDATE  FLUSH
     BASE  CONTEXT  STATE  INTERPRET  DUMP
     CREATE  CODE  ;CODE  CONSTANT  SMUDGE
     @  OVER  AND  OR  NOT  0=  0< 


他们的拼写仍与[FORT标准-大约翻译]

      LOOP     CONTINUE
     UNTIL -      END
     BLOCK -      GET
      LOAD -      READ
      TYPE -      SEND
 INTERPRET -      QUERY
    CREATE -      ENTER
      CODE -       


这是我找到的唯一用于美分符号的应用程序。

计数器和循环限制存储在数据堆栈中。多亏了FORTRAN,DOCONTINUE才得以实现。

BLOCK控制缓冲区的数量以最小化磁盘访问。LOAD从大小为1024字节的块中读取源代码。根据磁盘上块的大小选择1024字节的大小,并且大小成功。单词UPDATE允许您在内存中标记一个块,然后在需要释放缓冲区时(或通过单词FLUSH)将其刷新到磁盘。它实现了一种虚拟内存,并在写操作期间被隐式调用。BASE

一词允许使用八进制,十六进制和十进制数字。这个词CONTEXT是字典的第一次暗示和服务分开编辑的话。STATE一词设置了编译和解释模式。在编译过程中,该单词的字符数和前3个字符被编译[编译为标识符-大约。翻译]。奇怪的是,单词可能会被特殊字符打断-但这很快就被放弃了。读取运算符(@)有很多选项,因为需要区分从变量,数组和磁盘读取的内容。DUMP允许深入内存进行调试。

但最重要的是,现在有了字典。现在,解释器代码使用了一个名称,并在一个链接列表中寻找它。CREATE这个词创建了一个经典的词汇条目:

   *       
   *     3  *
   *  ,   
   *  

* FORT标识符以32位的形式包装:1个字节-单词中的字符数,其余3个字节-单词的前3个字符(轻骑兵,请保持沉默!)-大约。佩雷夫。

代码字段是一项重要的创新-单词找到后,解释器的开销仅剩下一个间接转换。我从斯坦福大学的编译器开发人员那里了解了区分单词的字符数的含义。

单词CODE创建了重要的单词类别。它的参数字段包含机器指令。因此,现在有可能在计算机的能力范围内创建任何单词。单词“ ; CODE ”定义了将要针对一类新单词执行的代码,并介绍了现在称为对象的对象。

SMUDGE避免在解释定义时进行递归。由于按照从最新定义到最旧的顺序查看字典,因此常见的是不必要的递归。

最后,出现了返回堆栈。在此之前,定义不能嵌套,或者必须将返回地址存储在数据堆栈中。总而言之,这是堡垒(间歇性)发展的伟大创新时期。

我和Geoff Leach于1970年撰写了有关FORT的第一篇文章(以Mohasco内部报告的形式)。她今天没有失去相关性。

1970年,鲍勃订购了Univac1108。这是一个雄心勃勃的项目,旨在为订单输入系统提供专用的线路网络。我在FORT上编写了一个报告生成器,但是我确定我可以编写用于输入订单的代码。为了增强对FORT的信心,我将其移植到5500(作为单独的程序!)。但是公司软件是COBOL。出人意料的是,通过将FORT系统设置为1108,使其与COBOL模块进行交互以进行事务处理,实现了折衷。

我非常记得那年冬天去斯克内克塔迪(Schenectady)的旅行,这需要花些时间在3107的第三班次。我的房间没有地板和窗户,这是每夜生存的运动。但是事实证明该系统非常成功,甚至给Univac留下了深刻的印象(Les Sharp参与了该项目的集成)。决定性的标准是响应时间,但我还下定决心以适合维护的形式维护项目(即,使其规模小而简单)。 las,经济下滑迫使管理层取消了1108。我仍然认为这是一个错误的决定。我是第一个辞职的。

1108年的堡垒必须用汇编语言编写。它缓冲了输入和输出消息,并在处理每一行的任务之间分配了处理器。在这里,您拥有经典的操作系统。但是他还可以解析输入行并执行(用单词PERFORM)相应的COBOL模块。他监视存储鼓的缓冲区,并参与包装和拆包记录。话

     BUFFER  PREV  OLDEST
     TASK  ACTIVATE  GET  RELEASE


就在这时出现。如果知道请求的块为空,

BUFFER不会读取磁盘。PREVOLDEST是系统变量,可以在“最少使用”的基础上实施缓冲区管理。TASK在引导时定义了任务,并在需要时ACTIVATE运行了该任务GETRELEASE控制共享资源(存储鼓,打印机)。PAUSE是任务用来释放处理器的词。它包含在所有I / O操作中,并且对事务代码不可见。这使得避免阻塞的简单循环调度算法成为可能。

声明后[可能关于解雇-大约。转]我写了一个愤怒的诗和一本书,也从未发表过。它描述了如何在FORT中编程,并鼓励了简单性和创新性。它还描述了间接缝制代码的技术,但这是首次在NRAO中实现。

我研究了元语言的概念-元语言。Fort现在可以解释编译器所汇编的汇编器,该汇编器对解释器进行了编译。最后,我认为该术语不起作用,但是用于重新编译FORT本身的“元编译”一词仍在使用。

NRAO,1971年


乔治·科南特(George Conant)为我提供了NRAO(国家射电天文台,22个音节)的职位。我在CAO认识他,他喜欢Ephemeris4。我们搬到弗吉尼亚的夏洛茨维尔,并在夏天可以在亚利桑那州的图森度过夏天,当时可以使用Kitt Peak射电望远镜进行维护。

该项目涉及对Honeywell 316微型计算机进行编程,以控制用于36英寸毫米波射电望远镜的新滤镜组。他有一个9轨磁带和一个带有“存储器”的Tektronix电子管端子[可能是指余辉管或电位器-大约。 perev。]。乔治给了我开发系统的完全自由,但是他对结果不满意。在NRAO中,每个人都使用FORTRAN,现在我和我的FORT一起出现了。他说对了,组织标准应该提供一种通用的编程语言。现在其他程序员也希望使用自己的语言。

尽管如此,我还是在IBM 360/50大型机上的汇编器中编写了FORT代码。然后我在316下重新编译。然后我将其本地编译为316(尽管我有360终端,但是响应时间很糟糕)。一旦系统可用,那就很容易了。有两种观测模式:全频和谱线。光谱线最有趣,因为我可以在收集数据时显示光谱,并使用最小二乘法平滑线的形状。

由内德·康克林(Ned Conklin)领导的图森(Tucson),该系统广受欢迎。这是立即减少收集到的数据量的又一步。一旦这成为研究的时尚领域,天文学家就开始使用它来检测和绘制星际分子图。

贝丝·拉瑟(Bess Rather)被雇用来支持天文台。首先,她不得不研究FORT系统,然后在我的帮助下,用最少的帮助进行解释和记录。第二年,我对DDP-116进行了重新编程,以优化望远镜指向。然后Bess和我用DEC PDP-11替换了DDP-116和Honeywell 316。

由于间接缝制代码的发展,这种替换成为可能。这是我在Mohasco工作的自然发展,尽管后来我了解到DEC在其中一个编译器中使用了直接缝制的代码。编译器不必每次都编译整个定义,而只是从字典中获取每个单词的地址。每个链接的性能提高仅需要两个字节,并且解释器可以更快地执行代码。在DEC PDP-11上,此解释器实质上是一个两个单词的宏:

: NEXT IP )+ W MOV W )+ ) JMP ;


现在,FORT已完成。我知道。我可以更快地编写代码,并且效率更高,更可靠。而且,它是便携式的。我继续对DDP-116和HP mini进行重新编程,DDP-116的重点是指向300英寸的Green Bank望远镜,而HP mini则以非常长的基础射电天文学(VLBI)开始。 George给了我ModComp,然后我对傅里叶变换进行了编程,以用于干涉测量和脉冲星搜索(基于64K数据集)。我什至证明了IBM 360在FORT中的复杂乘法比汇编程序中的速度快20%。

NRAO感谢我写的内容。他们与一家咨询公司达成协议,以确认抵押技术。 FORT专利问题已经讨论了很长时间。但是由于软件专利是自相矛盾的,并且可以在最高法院的介入下解决,因此国家自然保护局拒绝处理这一问题。结果,版权归我所有。我认为这些想法不应获得专利。回顾过去,应该同意FORT的唯一机会是保留在公共领域。然后他在那里繁荣昌盛。

缝制的代码更改了结构性单词(例如DO LOOP IF THEN)。他们在编译时使用了数据堆栈中的地址,得到了一个优雅的实现。

现在,堡垒的每个实现都有用于其计算机体系结构的汇编程序。他使用后缀表示法的操作码,并在数据堆栈中生成地址,并使用类似于FORT的结构化单词进行分支。汇编助记符使用CODE定义为单词类。一天之内就可以全部编码。

不寻常的算术运算符也证明了自己的价值。

M*  */  /MOD  SQRT  SIN.COS  ATAN  EXP  LOG


M *是将两个16位数字乘以32位乘积(参数当然是在数据堆栈中)的常规硬件乘法。* /后跟除法以实现分数算法。/ MOD同时返回商和余数,非常适合在文件中查找条目。SQRT从32位参数返回 16位结果。SIN.COS立即返回正弦和余弦,这对于矢量和复数运算(FFT)很有用。ATAN是逆运算,没有象限歧义。EXPLOG以2为基数计算。

在这些函数中,使用了定点算法-三角函数在二进制点右边14或30位,对数为10位。这已成为FORT的标志,因为这种算法比浮点数更简单,更快和更准确。但是,如有必要,您可以轻松实现带有浮点数的硬件和软件。

我赞扬哈特所做的宝贵工作,他以不同的准确性编制了函数近似表。他们使应用程序程序员摆脱了现有库的限制。

单词DOES>出现了(它写为; :)。它定义了一类单词(例如; CODE),确定在引用单词时应解释该定义。这很难实现,但事实证明它对于定义操作代码特别有用。

但是,我无法说服Charlottesville FORT适合他们。我不允许编写VLA。在任何一组程序员中,有25%的人喜欢Fort,而有25%的人讨厌它。争端很棘手,很少达成妥协。结果,前25%的人联手创立了Forth,Inc.。但这是另一个故事。

道德


FORT的历史具有一定的道德风范:一个执着的年轻程序员与冷漠作斗争,以发现真相并挽救他受难的同志。情况越来越好:观察Forth,Inc.在法国银行系统中与IBM并驾齐驱。

我知道FORT仍然是最好的编程语言。我对他的成功感到高兴,特别是在人工智能的超保守领域[回顾,1991-大约 翻译]

我担心的是那些不应该欣赏FORT如何体现自己对理想编程语言的描述的人。

但是我仍在未经许可的情况下进行研究。FORT导致了一种架构,该架构有望实现硬件和软件的惊人组合。以及另一个新的编程环境。

All Articles