Forth 常见问题解答

Forth 常见问题解答

本文译自 comp.lang.forth Frequently Asked Questions (1/6): General/Misc

原文整理 M. Anton Ertl, anton@mips.complang.tuwien.ac.at

Forth 是什么?

Forth 是怎么来的?

Forth 用在什么地方?为什么要使用 Forth?

Forth 过时了吗?

Forth 比 C 语言还要小、还要快吗?

Forth 有哪些标准?

什么是 RFI ?

Forth 有编码规范吗?

我在管理堆栈时遇到了麻烦,是不是应该使用全局变量?

什么是 Forth 兴趣组织?

Chuck Moore 是谁?他现在做什么?

哪些观点是口水大战?

商业化的还是自由软件的 Forth 系统?

自由软件的 Forth 是很差的 Forth ?

块还是文件?

我从哪里能够找到 C-to-Forth 编译器 ?

从哪里可以找到 Forth-to-C 编译器 ?

Forth 中有记录类型吗?

为什么使用 THEN 来结束一个 IF 结构 ?

什么是串线编码?不同的串线编码技术之间有什么差异?

有没有人写过把 Forth 编译成 Java 字节码的程序?

能够把 JAVA 字节码翻译成 Forth 吗?

没有操作系统的 Forth 怎么运行?

为什么不用 Forth 来编写一个操作系统呢?

 

Forth 是什么?

Forth 是一个基于堆栈的、可扩展的、没有类型检测的语言,可能最有名的是它的“逆波兰”(后缀)算术表达法,使用过 HP 计算器的人应该对这种方法比较熟悉:在 Forth 中把两个数相加,你需要输入 3 5 + 而不是 3 + 5 。

在 Forth 中,基本的程序单位是“字”:字可以是一个命名的数据项、子程序或者操作符。 Forth 的编程就是用已经存在的字来定义新的字。

Forth 语句:

: SQUARED DUP * ;

定义了一个新的字 SQUARED ,它的功能是对一个数求平方(通过自身相乘)。由于全部的语言结构都是由字组成的,应用程序员可以根据需要“扩展” Forth 以加入新的操作符、程序结构或者数据类型。 Forth 的“内核”包含了用于整数、地址、字符和布尔值的操作符,字符串和浮点操作可以选择加入。

返回常见问题列表

Forth 是怎么来的?

Forth 这个名字的本意是想说明这个软件是为第四代(下一代)计算机设计的,那正是 Moore 通过分布式小型计算机所看到特色。不过,当时他使用的操作系统限制文件名只能少于 5 个字符,所以字母 'U' 就被去掉了。

直到 70 年代未期,还是使用着 FORTH 这种全部大写的字母,因为那个时候流行着只支持大写字母的 I/O 设备。随着小写 I/O 设备的普及, Forth 这种拼写方法被广泛接受,因为它毕竟不是几个单词的缩写。

参见 Rather, Colbourn, and Moore: The Evolution of Forth

<http://www.forth.com/Content/History/History1.htm>, in: History of Programming Languages (HOPL-II), ACM Press/Addison-Wesley 1996.

注意: Forth 不是 4GL (用于数据库应用开发的语言)

返回常见问题列表

Forth 用在什么地方?为什么要使用 Forth?

Forth尽管早在 1970 年就出现了,但是在个人计算机时代才变得广为人知,它的高性能和存储器的经济性很有吸引力,这些优点还使得 Forth 在嵌入式系统中应用得很普遍,包括从航天飞机到联邦快递的条码阅读器驱动器。 Forth 交互式的特点使得新硬件的测试和开发流畅自如。增量式开发、快速的程序调试周期、对任何级别程序的完全交互式访问,很高“抽象级”的工作能力,所有这些都使 Forth 拥有一个高程序生产率的好名声。再加上语言的灵活性和可扩展性,是嵌入式系统选择 Forth 的主要理由。

返回常见问题列表

Forth 过时了吗?

这个问题最好的答案之一来自 Brad Rodriguez(mailto:bj@forth.org) ,可以在 http://www.complang.tuwien.ac.at/forth/faq/why-forth 找到一个完整的版本。一句话, Forth 的优点是它的可理解性、短小、交互式、快速、可扩展性和很容易使它在一个高级别抽象上工作。

顺便说一句,提出这个问题的人可能是把十几年以前的 Forth 系统与最新版本的 Borland C++ 进行了比较。不过,他使用的系统实在是太过时了,虽然也具有现代 Forth 系统的许多方面。

返回常见问题列表

Forth 比 C 语言还要小、还要快吗?

不一定,如果你把一个 C 语言程序一对一地转换成 Forth ,你会发现程序变得很慢(比如使用串线编码的 Gforth 系统,大约慢 4-8 倍,如果使用典型的本地码编译器,则大约慢 1-3 倍)。同样,你看不到 Forth 中固有的代码大小方面的优点。详情可参见

<http://www.complang.tuwien.ac.at/forth/performance.html>.

然而,许多开发案例都说明 Forth 在尺寸和/或速度方面胜过了其它语言。我猜想这是 Forth 所附加的灵活性帮助程序员产生了更快和/或者更小的程序。

返回常见问题列表

Forth 有哪些标准

Forth 的美国国家标准是 ANSI X3.215-1994, 作为一个权威的 Forth 标准在国际上被广泛接受 ("ANS Forth") 。 这个标准也被国际标准化组织所接受 (ISO/IEC 15145:1997).

IEEE Standard 1275-1994, 称为“开放式固件”标准,派生于 Forth ,已经被 Sun Microsystems 、 HP 、 Apple 、 IBM 等公司做为编写引导程序和固件的公司遵循标准。参见 <http://playground.sun.com/1275/home.html>.

早先的 Forth 标准包括 Forth-83 Standard 和 Forth-79 Standard ,这些都是 Forth Standards Team 提出的,而更早的 FIG-Forth 标准没有像这样正式发布,但它却是许多年里 Forth 的“事实标准”。

Forth STANDARDS 自 1978 年以来 Forth Standard Team 发布了 Forth 79 和 Forth 83 标准, ANS Forth 文档 X3.215-1994 是 X3J14 技术委员会发布的。最近的标准 ANS Forth 定义了一系列的核心字,并给这些字的实现方式以很大的自由度。 ANS Forth 可以支持的硬件范围比以前的任何 Forth 标准都大,可能也比任何其它程序设计语言大,参看 <ftp://ftp.uu.net/vendor/minerva/uathena.htm> 得到最新信息。标准的拷贝为 193 美元,但是 ANS Forth 草案是免费的(有一些版权的限制),可以通过 FTP 得到。

ANS Forth 文件可以从下面网站得到

<http://www.taygeta.com/forthlit.html>

<ftp://ftp.uu.net/vendor/minerva/x3j14/>.

最好的 HTML 格式是 <http://www.taygeta.com/forth/dpans.html>.

为了把自己的加入到 ANS-Forth 邮件列表中,可以参考不同的 README 文件,这些文件在 ftp://ftp.uu.net/vendor/minerva/x3j14/ 上 .

有两个非官方的网站可以检查与 ANS Standard Forth 的一致性 :

•  John Hayes 编写的测试站点 <http://www.taygeta.com/forth.html>.

•  JET Thomas 编写的测试站点 <ftp://ftp.forth.org/pub/Forth/ANS/stand4th.zip>

还有 ANS Forth FAQ <http://dec.bournemouth.ac.uk/forth/ans/faq.html> ,它解释了标准化的过程。

返回常见问题列表

什么是 RFI

RFI 是解释请求( A Request For Interpretation )。如果你发现标准文本中有不清楚或者不明确的地方,可以发一个 RFI ,发布标准的 TC (技术委员会)将负责给出一个解释。

你可以通过电子邮件把请求发送到 greg@minerva.com 上,写明邮件的主题是 RFI 。

以前的 RFI 列表可以通过 ftp://ftp.uu.net/vendor/minerva/x3j14/queries/ 得到,也集中到标准的 HTML 版本中, <http://www.taygeta.com/forth/dpans.html>.

返回常见问题列表

Forth 有编码规范吗?

在 Leo Brodie 的书《 Thinking Forth 》中给出了一些建议;这些建议的摘录可在 http://www.forth.org/forth_style.html 得到。 Forth 在各个公司中有一些它们自己的编码标准。 Paul Bennet 发布了他自己公司的标准 <http://www.forth.org/forth_coding.html>.

返回常见问题列表

我在管理堆栈时遇到了麻烦,是不是应该使用全局变量?

不。这里有更好的方法,那就是坚持使用堆栈,重新组织(重新因子化)所定义的字,直到有一天你找到了使用堆栈的诀窍。 Elizabeth Rather<mailto:erather@forth.com> 写到:

舒适而自然地编写 Forth 程序的一个基本技巧就是良好的堆栈管理。对于一个初学者来说这是有困难的,因为其它的语言对使用堆栈并没有要求,其它的语言都通过使用变量来实现所有的事情。经过了 25 年几百次教学,我觉得初学者对此很是茫然,所以我就开发了一些练习(就像 Starting Forth 书一样)来帮助他们。这个过程有点儿像骑自行车:开始的时候慌慌张张而且摇摇晃晃,但是突然有一天,你头脑中的一个开关打开了,从那以后就变得又舒适又自然了。

Andrew Haley 写到:

试着把你的定义全部写成只有一行、最多两行。为每个字写一个堆栈图释并画出它的输入和输出。如果你还要有一个“中间的”堆栈图释才能够明白做了什么的话,就在这一点上把你的字分裂成两个。这样,你就可以在命令行上测试字的一半,每一次都检查堆栈。不要使用 PICK 和 ROLL. 。

当你坚持这样编写代码之后,有些规则就可以放松,但是一开始必须按这样的风格去做。

•  使用返回栈;

•  使用局部变量;

•  使用存储器中的数据结构,在堆栈上传递指针;

公认的经常遇到麻烦的领域是图形处理。我们可以看看 Postscript 是怎么做的:它们确实是使用全局状态变量以避免麻烦,但是只能通过特定的字来访问这些状态。

返回常见问题列表

什么是 Forth 兴趣组织?

Forth 兴趣组织 Forth Interest Group ( FIG )成立于 1978 年,它的目的是发布信息、普及 Forth 语言,也是 Forth 专业程序员最早机构。 Forth 兴趣组织目前还维护一个网页

http://www.forth.org/forth.html

其中有 Forth 语言更完整的介绍和许多 Forth 开发者的链接。

返回常见问题列表

Chuck Moore 是谁?他现在做什么?

Chuck Moore 发明了 Forth 语言,有关 Forth 的历史信息可以参看

<http://www.forth.com/Content/History/History1.htm>).

最近他用自己的哲学思想来设计硬件,并且已经设计了几个能够很好地运行 Forth 语言的处理器 : Novix 4016 、 Shboom 、 uP20 、 uP21 、 F21 、 i21 …… .

他还不断地探索新的思想,更新他早先关于软件和 Forth 的思想:他为 Novix 实现的 cmForth 非常有影响力,最近的开发成果是 Color Forth 和 Machine Forth 。

Machine Forth 是一个只有 27 条指令的简单虚拟机,这个机器通过硬件在 uP21 和后续的处理器上实现,但是也通过软件在 386 处理器上以简单本地代码的方式实现。它与 ANS Forth 的差别是:每个堆栈顶都包含一个扩展的进位 CARRY 位,有一个寄存器 A 用于存储器访问(替代通过栈顶元素作地址指针访问存储器的寻址方式)。

返回常见问题列表

哪些观点是口水大战?

有些观点引起了长久和热烈的争论,参加的双方都在重复自己的观点而从来都想听别人是怎么说有,我希望你不要陷入其中。

这里我列出了一些针锋相对的观点,作为你阅读的起点,这样可以避免像他们一样地投身到战斗中去。

返回常见问题列表

商业化的还是自由软件的 Forth 系统?

“付出什么,你就会得到什么。使用一个商业化的 Forth 系统,你可以得到商业化的文档和支持,我们需要一个商业化的系统,否则 Forth 就是死路一条”。

“我使用自由软件方式的 Forth 系统有良好的经验。我没有钱付给商业 Forth 系统。我想要源代码(有些商业系统不提供整个系统的源代码),文档和支持很差的商业软件开发者也不乏其例。没有自由软件方式, Forth 就是死路一条 ” 。

返回常见问题列表

自由软件的 Forth 是很差的 Forth ?

“任何人都可以写一个很坏的 Forth ,然后没有文档和支持地发布出来;使用了这样的系统之后,没有人再想用 Forth 做任何工作。自由的 Forth 败坏了 Forth 的名声,自由的 Forth 抢了开发者的生意。 ”

“许多人通过 fig-Forth 学习 Forth ,确实有优秀的自由软件 Forths 。许多成功的语言开始都(并且现在仍然)提供自由软件版本。没有自由软件式的实现(就像 Ada、Eiffel 和 Miranda ),一种语言就不能普及(现在也有了自由软件的 Ada 和 Eiffel 实现).”

返回常见问题列表

块还是文件?

“每个人都使用文件,所有的第三方工具都是使用文件来进行设计的。文件浪费的空间更少。块导致水平的、不可读的代码。块使得 Forth 很可笑。”

“我们并不总是在操作系统的支持下工作,在有些机器上我们就没有文件。我们已经有了非常优秀的块编辑器和其它工具以及与块一起工作的编码标准(比如 shadow screens )。”

返回常见问题列表

我从哪里能够找到 C-to-Forth 编译器 ?

Parag Patel <mailto:parag@pinhead.parag.codegen.com> 写到 :

我们 (CodeGen, Inc. <http://www.codegen.com>) 销售 C-to-Fcode 编译器。它实际产生 IEEE-1275 Forth 并以 token 化方式运行。

但它产生的 Forth 代码真的是很难看。产生不好的代码比较容易,而产生清晰的代码则非常困难。 C 和基于堆栈的语言不能很好地混合在一起,我最后通过使用 Forth $frame 变量用于局部变量而实现 C 语言的变量栈帧。

Stephen Pelc <mailto:sfp@mpeltd.demon.co.uk> 写到:

MPE 生产 C 语言到堆栈机器的编译器,它为两个堆栈的虚拟机器产生 TOKEN 化的代码。这种代码质量好, TOKEN 所占用的空间情况比我们测试的商业化 C 语言编译器要好,这是虚拟机设计的结果。当然,需要的改进是虚拟机可以支持局部变量。

tokens 可以由编译器后端进行解释,也可以翻译到一个 Forth 系统中去,所以大部分是可移植的,只有与目标体系结构相关的部分除外。

这个软件是收费的,支持一个二进制兼容系统。

返回常见问题列表

从哪里可以找到 Forth-to-C 编译器 ?

一个没有技术支持的原型 Forth-to-C 编译器在

<http://www.complang.tuwien.ac.at/forth/forth2c.tar.gz>.

有关它的描述在 EuroForth'95 paper

<http://www.complang.tuwien.ac.at/papers/ertl&maierhofer95.ps.gz>.

另一个 Forth-to-C 编译器由 Rob Chapman编写:

<mailto:rc@compusmart.ab.ca> Timbre

<http://www.compusmart.ab.ca/rc/Timbre/timbre.htm> system.

返回常见问题列表

Forth 中有记录类型吗?

许多软件包提供了像 Pascal 的 RECORD 和 C 的 struct 一样的数据结构,比如 Forth

Scientific Library ( <http://www.taygeta.com/fsl/fsl_structs.html>) 或者

<http://www.complang.tuwien.ac.at/forth/struct.fs>.

返回常见问题列表

为什么使用 THEN 来结束一个 IF 结构 ?

一些人认为 Forth 使用 THEN 很别扭,而另一些人则不以为然。

按照 Webster's New Encyclopedic Dictionary 解释, then (adv.) 有以下的意义:

2b: following next after in order ...

3d: as a necessary consequence (if you were there, then you saw them).

Forth 的 THEN 具有 2b 的意义(接着、然后),而 Pascal 和其它程序设计语言则引用了 3d. 的意义(那么就、则)。

如果你不喜欢这样来使用 THEN ,可以按下列方式定义一个 ENDIF 替代:

: ENDIF POSTPONE THEN ; IMMEDIATE

返回常见问题列表

什么是串线编码?不同的串线编码技术之间有什么差异?

串线编码是实现虚拟机解释器的一种方法,你可以从下列站点得到关于串线编码的更深入的解释:

<http://www.complang.tuwien.ac.at/forth/threaded-code.html>.

返回常见问题列表

有没有人写过把 Forth 编译成 Java 字节码的程序?

Paul Curtis <mailto:paul.curtis@ra-ltd.demon.co.uk> 写到:

尽管 JVM 是一个堆栈机,但是并不能有效地编译 Forth 程序,下面是一些原因: ,

•  一个调用方法的最大堆栈深度必须是已知的,见 JVM Spec, p. 111

•  JVM 方法只能为调用者返回一个单一的对象,这样的堆栈结果就不可能实现: ( n1 n2 -- n3 n4 )

•  对于无符号数没有直接的支持;

•  CATCH 和 THROW 不能很容易地实现,你需要通过异常表来俘获异常,这不能够很好地匹配 Forth 模型,见 JVM Spec, p. 112

•  你不得不扩展 Forth 以便为 JAVA 方法产生所要求的属性;

•  没有指针运算一类的事情;

•  你不能把一个东西放到堆栈上然后强制地把它转为另一种类型;

•  你不能在原始字节码之外产生一个对象,这是由于安全的原因;

这就是说,你可以使用 JVM 的字节码来产生一些类似 Forth 的东西,但是不能用 JVM 来实现 Forth 的堆栈。

如果你对这个答案不满意,应该使用 Jasmin 来直接编写 JVM 的程序。

返回常见问题列表

能够把 JAVA 字节码翻译成 Forth 吗?

把 JAVA 字节码翻译成 Forth 需要处理许多琐碎的事情:

•  垃圾收集

•  线程

•  控制结构 (branches->ANS Forth's 七个通用的控制结构字 )

•  异常

•  子程序 (JavaVM 码不指定一个子程序返回到它的调用者 )

•  JavaVM 与直到 Forth-83 的标准 t 都犯了同样错误:它指定类型的大小,比如 JavaVM int 总是 32-bit ,为了支持这些必须增加几个操作符

•  本地库(没有它们则 JavaVM 不能做任何事情)

返回常见问题列表

没有操作系统的 Forth 怎么运行?

在裸机硬件上运行的 Forth 系统被称为独立系统(与协同系统相比:协同系统在一个操作系统上运行)。注意不要把独立系统与本地码系统相混(后者指的是把 Forth 代码编译成机器码的系统);独立系统以本地串线编码方式存在。

Forth 系统从一开始就是独立系统,它执行操作系统的功能(从硬件到多用户多任务), 现在的嵌入式 Forth 系统通常都是独立系统。

服务器和桌面系统通常是协同系统,这样做是为了避免本来在这些系统已经可以使用的大量设备再重新编写驱动程序,同时也方便了 Forth 用户和其它软件用户。

返回常见问题列表

为什么不用 Forth 来编写一个操作系统呢?

独立 Forth 系统可以被看成是一个用 Forth 语言编写的操作系统,所以用 Forth 来写一个操作系统当然是可能的。有些人多次建议用 Forth 来开发一个操作系统,但是反对者也列出了这样一些理由:

•  如果你是在计划为台式机或者桌面系统编写一个操作系统的话,我们将面临与独立 Forth 系统同样的问题,当然这也是任何一个新操作系统所必须面对的问题:我们需要为那些广泛使用的各种硬件编写驱动程序,需要为新操作系统编写新的应用程序;

•  为了解决应用程序编写问题,有些开发者建议可以让我们自己开发的操作系统与某个现有的操作系统比如 Linux兼容,包括API 甚至 ABI 兼容,不过我们还应该明确开发这个操作系统的目的:

•  如果这是一个练习,则项目可能太大;

•  如果仅仅是为了得到一个操作系统,这可能没有什么意义,因为现有的系统已经工作得很好了;

•  如果是为了显示 Forth 的某些优点,比如代码特别小等,似乎有更简单的办法。而为了保持与旧操作系统的兼容,这些优点可能会荡然无存,再说了,究竟有多少人真的关心一个操作系统核心代码的大小呢?

返回常见问题列表

 
 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值