博文
Forth 这个东西(1)(2005-08-05 15:15:00)
摘要:Forth 这个「东西」
整理:william@cis_nctu ----------------------------------
发信人: ajax@phoenix (ajax), 信区: programming
标 题: About 第四代计算机语言 FORTH??
发信站: 交大资工凤凰城信息站 (Thu Mar 17 09:26:20 1994)
转信站: cis_nctu!bbsroute!phoenix
==> 在 Xilinx@phoenix (SASIMI) 的文章中提到:
> What is 第四代计算机语言??
> 有何特点....???跟一般写的 C ,PASCAL ,FORTRAN, ASSEMBLY 有何不同????
你问的是一般所谓的 4GL 或 FORTH ?
4GL 大多是 database 的程序产生器, 至于 Forth吗, 由于是在 DEC上发展的, 据说当时的文件名限定 5个字母, 它的发明人虽然想取个 Fourth 来代表它是第四代语言,但不得已只有将 'u' 给去掉. 现在似乎没有人将 Forth视为第四代语言.
Forth 现在还有一些玩家在使用, 并且很狂热的喜爱它, 有一句话形容,
C 让你以为认为 C 是世界上最好的语言,
Forth 则让你认为自己是世界上最好的程序员
本来有个 Forth Workshop 的 BBS站, 但不知为何关了, 现在倒希望在 Internet 上有个 Forth 园地, 可交换一下心得, 或流通一下信息. 因为它真的是很好的程序语言,至少它是 Sun workstation 的 boot firmware 的语言, 而且也将成为一个 IEEE 的boot firmware 标准, 想在这领域混口饭吃的人, 可以快研究一下.
==========================......
Forth 语言概要(4)(2005-08-05 14:12:00)
摘要:13. 多任务
多任务在 Forth 中从一开始时就有了。这些系统不仅仅是语言处理器,而且包含操作系统的特点,许多集成系统完全是独立运行的,执行所有操作系统的功能。
Forth 的操作环境运行速度快,所以基于 Forth 的系统就能够支持多用户和多任务,甚至在那些看似不能实现这些功能的计算机硬件上也是这样。例如,一个电话交换板的生产商在一个 Z80 上执行 50 个任务。在 IBM PC 上也有几个多任务产品,有些甚至能够支持多用户。在一般支持多用户操作的计算机上,可以支持的用户数就更多了,一个运行在单个 MC68000 处理器上的数据库应用系统能够支持 100 个终端更新和数据库请示,而运行速度却没有明显的降低。
多用户系统可以支持多个程序员同时工作,每个程序员都有自己的私有字典、堆栈和一系列变量来控制任务。私有字典连接到一个共享的、可再入的、包含全部标准 Forth 功能的字典。私有字典可以用来开发应用程序代码,这些代码以后可以加入到共享字典中。
图 6 给出了 Forth 系统实现多任务的典型方法。这是一个“轮循调度算法” 调度器,是 Forth 系统中实现多任务最常用的方法。然而,有一些实现使用时间片调度或者基于优先级的调度以及其它可剥夺的算法,在这样的系统中每个任务都有自己的用户区以保存控制变量、私有字典和堆栈。用户区的第一个字段是 STATUS 变量。这个变量有两个可能的值:唤醒或者休眠。
图 6 在循环调度队列中的 4 个任务
可以被选择调度执行的任务必须处于唤醒状态。当任务被选择执行时它的状态就被复位到休眠状态。任务一直执行直到调度器执行到字 PAUSE ,这将把任务的状态置为唤醒,控制重新返回到调度器。当调度器再次轮循到这个任务时,将从 PAUSE 的指令之后继续执行。
除了 PAUSE 字之外,任务也可以执行 STOP 字将控制返回到调度器。这与 PAUSE 类似,但是任务的状态并不切换到唤醒状态。这样,当调度器再次轮循到这个任务时,当前的状态仍然是休眠。这意味着这个任务不能再被执行了,除非它的状态被另外的任务或者中断设置为唤醒。
系统以这种方式编程并允许中断。当一个中断发生时,......
Forth 语言概要(3)(2005-08-05 14:12:00)
摘要:8. 汇编器
大多数 Forth 系统都包含一个宏汇编器,为它们所在的 CPU 进行汇编语言编程。通过使用定义字 CODE ,程序员可以创建由实际的机器代码组成的定义。 CODE 定义可以用来完成 I/O 、算术原语和其它依赖机器(时间紧迫)的处理功能。当程序员使用 CODE 时,他就和使用其它汇编器一样对 CPU 有完全的控制能力, CODE 定义的字以机器速度全速运行。
这是 Forth 的一个重要特点。它允许那些明显地依赖机器的代码通过机器无关接口变换成为可管理的片断。当需要把应用移植到不同的处理器上时,我们仅仅需要重新编写 CODE 字,这些 CODE 字就可以严格地按相同的方法与其它 Forth 字进行交互。
Forth 汇编器本身也是极其紧缩的(典型地为 1K 字节),它们可以和编译器、编辑器以及其它编程工具一起驻留在系统中。这就意味着程序员可以打入很短的 CODE 定义,然后立即执行它们,这个能力在调试客户硬件时特别有用。
9. 虚拟存储
Forth 最后一个独特的组成元素是它按数据和源程序虚拟存储器的方式使用磁盘(或者其它海量存储器)。在地址解释器的情况下,这种方法在历史上是典型的 Forth 方式,但现在并不通用。磁盘被分成 1024 字节大小的块,在内存中则准备两个或者多个缓冲区,数据在引用时被自动读入缓冲区。每个块有固定的块号,直接对应于本地存储系统的物理位置。任何时候程序需要访问时,它都会在内存中找到数据,并不需要显式的读写操作。
这样一个面向块的磁盘管理方法对于 Forth 独立系统的实现是简单和高效的,结果是块为独立和协同驻留 Forth 实现中的源程序和数据处理提供了一个完全透明的机制。
在源程序块中的定义通过 LOAD 命令编译到内存中。许多系统包含一个编辑器,它把每个块组织成 64 字符 16 行的显示模式并提供命令来修改源程序。
源块在历史上曾经是 Forth 风格的一个重要组成元素。就像 Forth 的定义可以被视为自然语言中的句子,一个块相当于是一个段落,通常包含有与一个主题相关的定义,比如“向量处理”。在块文本的顶行含有这个主题的注释说明,应用程序可以按实际需要来选择装入块。
......
Forth 语言概要(2)(2005-08-05 14:09:00)
摘要:5. 字典
Forth 程序存储在字典中。字典占据了系统存储器的很大部分,它由一个串线链接的可变长度的项目组成,每个项目定义了一个字。每个定义的内容根据字的类型(数据项、常数、操作序列等)而有所不同,字典是可扩展的。
字是由“定义字”加入字典的,最常用的定义字是:(冒号)。当冒号执行的时候,它为后面的字建立一个字典项,然后进入“编译”模式。有许多不同的编译方法,最常用的是“串线编码”,这种方法把定义编译成一系列以前定义字的地址引用。定义由;(分号)结束。下面就是一个定义:
: NETWORK ( -- ) OPEN LINK TRXT. ECHO CLOSE LINK ;
图 1 编译的字典项
当一个名字项被编译到字典中的时候(称为定义的首部),它包含一个指向字典中前一个首部的指针。新字的名字加入字典(这里就是 NETWORK ),接着一个指向名字为“( : )”子程序调用的指针编译到字典中作为定义的第一部分,这个指针指向一段在解释定义体时需要执行的代码。当然,这里所说的不是唯一的编译技术,但它的应用最为普遍,这种技术称为间接串线编码,因为定义中的第一个项目是一段代码的引用,这段代码知道如何解释定义的其它部分。
定义的其它部分称为这个定义的体。在编译模式下,系统将依次寻找每个字的首部。每个首部地址依次放到定义体中,这样就产生了一个地址列表。最后在到达;时,一个称为“EXIT”的子程序地址被编译进定义。 EXIT 子程序用来将控制返回到调用字,就像一个子程序返回一样。
6. 堆栈
Forth 维护两个下推式堆栈,下推式堆栈也称为后进先出列表,它们提供了 Forth 字之间通信以及逻辑控制的有效机制。
尽管两个堆栈的结构是相同的,但它们的用途却大不相同。与用户/程序员关系最为密切的是数据栈,它保存有调用字之间传递的参数,以替代传统语言的参数列表,同时也是一个实现定义重用的有效内部机制。第二个堆栈是返回栈,用于保存嵌套定义的返回地址,偶尔也用于临时保存其它的数据。
数据栈的使用导致了一种操作数位于操作符后面的“后缀”表示方法,这种后缀表示方法常常被称为 RPN 或者“逆波兰表......
Forth 语言概要(1)(2005-08-05 14:07:00)
摘要:
原作者 Peter Knaggs
原文标题《 Forth: An underview 》
原文链接:
http://dec.bournemouth.ac.uk/forth/forth.html
/* 原文中的图片无法在此BLOG中显示,请参考原文中的有关内容 */
本文的目的是给出 Forth 编程系统的一个整体轮廓,包括语言的历史、突出的特点和使用方法,讨论了最常用的实现方法,但更重要的是讨论了 Forth 编程的方法和哲学思想。
1.Forth 的来历
按照 Forth 语言的发明人 Charles Moore ( Chuck )的说法:
我第一次把各种想法组合成一个整体之后,它在“第三代计算机” IBM1130 上工作得如此有效,以致于我认为它是“第四代语言”,理所当然地应该被称为 FOURTH 。不过,当时的 IBM 计算机只允许 5 个字符的标识符。所以 FOURTH 变成了 Forth ,这是一个非常好的的文字游戏。
2. 历史
Forth 语言是 60 年代发明的,当时 Moore 在斯坦福线性加速器中心做计算机程序员工作,后来变成了一个自由工程师。当时的工程技术人员为了控制编译程序必须学习大量的方法,包括连接器、汇编器、伪指令以及高级语言,开发这个新工具的目标就是为了克服这些问题。
第一个称为 Forth 的程序大约是在 1970 年编写的。第一个完整的实现是 1971 年在一台 PDP-11 上完成的,用于亚利桑那州国家射电天文台的 11 米射电望远镜。这个系统的责任是定向和跟踪望远镜,收集数据并记录到磁带上,支持一个交互式的图形终端,供天文学家分析以前记录的数据。系统的多任务特点允许这些功能同时执行,没有时间上和其它方面的冲突。
这个系统取得了巨大的成功,世界各地的天文学家开始请求提供软件拷贝。Forth的使用范围迅速也扩大,国际天文学会于 1976 年接受了 Forth 作为标准语言。
这个应用的成功还促使 Moore 和 Elizabeth Rather ( ("Bess") 于 1973 年成立了 F......
1x Forth (3)(2005-08-05 13:29:00)
摘要:我希望我告诉你的话能够使你写出好的 Forth 。我可以证明。我已经证明了应用程序代码可以减少 90% ,在某些情况下可以减少 99% ,我可以做,但是需要一个案例一个案例地做。我一直找不到一般性的原理。
(Jeff) 我有一个问题是有关你 COLOR Forth 屏幕的。人们已经注意到你在屏幕上使用了很大的字体,但是只有较少的信息。它多少是由于你的视力?你每次看的时候有多少的信息受到限制?
(Chuck) 我对小字体越来越没有耐心,几乎不能阅读网页。直接去看那些字符模糊不清,戴上眼镜看,它们还是模糊不清。如果加大字体,这有时能够做到,有时做不到,会失去一些上下文。这是一个问题,可能对于大众中不断增加的群体来说都是一个问题。所以我尽量地使用大的字符,但是如果你把它们弄得太大,那你就会丢失信息。
现在一个用于设计幻灯片翻页的经典规则是你拾取一帧然后在其中放入一些主题,你不能在一张幻灯片上放太多的内容,否则你的听众就会糊涂,如果你使用太小的字符,人们就不可能阅读这些内容。
在 COLOR Forth 的情况下,我想字符也可能太大了。我可以一次在一个屏幕上得到 256 个字符。根据所使用计算机的不同,我可以得到 20x14 或者有时是 24x15 。这就足够了。在 256个字符中,我得到的信息大约与过去 1024 字节得到的信息一样多,因为我没有进行格式化,甚至没有任何的换行。在我的屏幕上充满字符。
一个原因是我想探究彩色字的价值,如果我有一些带颜色的字,那么不同的颜色将如何工作?我发现它们做得好极了,我不需要用定义字来格式化它们。当然,实际上并不好看,因为在屏幕的左边好象有一个红墙,如果你也使用这种方式,那就不一定非使用红色不可。
我觉得你在做一个网页时也应该使用这种哲学。在网页上放入尽量少的信息,只要能把你想告诉人们的事情说清楚就可以了,不要弄得费话连篇。另一方面是不要在页面上放一个索引。你只应该放入真实的信息,你需要把重要的信息加亮,你需要使它清晰和可读。
要改变我的字体比较困难。我使用 32x32 像素点。下一次我可以使用 24x24 像素点试一试。
这种格式的应用程序很少是一个屏幕。一个应用程序大约是 2 ......
1x Forth (2)(2005-08-05 13:28:00)
摘要:还有循环,有许多循环结构。原来我使用的结构来自于其它的语言,我想事情就是这样发展的。它们是
DO LOOP 还有
FOR NEXT 还有
BEGIN UNTIL
DO LOOP 来自于 FORTRAN 语言, FOR NEXT 来自于 BASIC 语言, BEGIN UNTIL 来自于 ALGOL 语言。
我们在 Forth 中选择哪一个?这个 (DO LOOP) 有两个循环控制参数,太复杂了。这个 (FOR NEXT) 有一个循环控制参数,非常便于硬件实现,如果有足够的硬件实现时它本身也非常简单。这个 (BEGIN) 有可变数目的参数。不幸的是……(录像带杂音)
我们正在使用 iTV 的记录设备,这是它的拱顶 (vault) 。如果你听到了一个回音,那是什么?那就是拱顶。
我得到了一个新的循环结构,它在 COLOR Forth 中使用,我觉得它比另外的那些都好。这种方法是:如果我有一个字 WORD ,我可以实现对这个字 WORD 的某种有条件的引用。这就是我的循环方式。
WORD ~~~ IF ~~~ WORD ;
THEN ~~~ ;
我回到当前定义的开始 , 这就是我现在使用循环的唯一方法,它是足够而方便的。它还有两个边际影响:一个就是它要求一种递归版本的 Forth, 这个字必须在当前的定义中被引用,而不能够要求被预先定义。这就省去了 SMUDGE/UNSMUDGE 概念, ANS 正准备为这个概念找一个合适的名字。但是最终的结果是它更简单了。
对于嵌套的循环这种方法当然很不方便,但是嵌套的循环毕竟是一个不确定的概念。你也可以有嵌套定义。你应该条件化地执行一个字,还是应该有某种像 IF THEN 这样的结构?这个问题我们已经讨论 15 年了。这里有一个例子,我想它说得很明白,唯一的循环是必须重复一个字。
WORD ~~~ IF ~~~ WORD ;
THEN ~~~ ;
如果你这样坚持做下去,能够实现更彻底的因子化。这是我头脑中的 Forth 的关键,你因子化、再因子化、再因子化,直到你的大多数定义......
1x Forth (1)(2005-08-05 13:26:00)
摘要:Charles Moore, April 13, 1999
这篇文章是 Jeff Fox 根据 Charles Moore 谈话录音所写。
/* 文中提到的ColorForth指令在原文中是彩色的,但在这个BLOG中我无法做到。因此,你还可以查看我在CSDN BLOG上转贴的原文:
http://blog.csdn.net/wxj729/services/trackbacks/313656.aspx
*/
我请求 Chuck Moore 允许我对这次关于 15 年来 Forth 语言变迁的谈话进行录像。我们安装了摄像机,他谈论了我在这个网站上提出的问题,但是这一次我们不再把焦点集中在固体物理、 VLSI 或者芯片和调试方面的经验,而是 Forth 语言。我觉得他谈论了这些年来的 Forth 语言,但是相比我所关心的、 30 年前发明的语言来说,他谈及了更多的方面。
我介绍 Chuck.
(Jeff Fox) 今天,我请 Chuck Moore 对 Forth 做一个介绍,我想请他谈一谈对于自己发明的语言在最近 15 年里的经验。现在我们请 Charles Moore 。
(Charles Moore) 这可是一个大话题,我们谈多长时间?
(Jeff) 磁带只有一个小时。
(Chuck) 15 年,那差不多是我用计算机面对软件的整个经历。回想 15 年前,把重点从 Forth 语言转向 Forth 微处理器的动机主要有两个。
首先是软件的问题已经解决了。编写应用程序很容易,不用费太大的劲。所有的问题都是硬件,硬件笨拙、零乱、可靠性差,特别是你需要为客户的硬件而编写客户化的软件时。如果你想调试硬件那就更是一个大麻烦。这些都说明硬件工程师并没有做出出色的工作,当然,他们比工业界的软件工程师做得好,但是没有 Forth 软件工程师做得好。因此我想看看我能够在这些硬件问题方面做些什么。这可能是个错误。 Forth 有许多有趣的事情可做,硬件可就不这么有趣了。
我不知道你是不是听过这些历史,第一个 Forth 处理器是 Novix ,它也可能是所有这类处理器中的第一个。它是一个 ......
Forth 常见问题解答(4)(2005-08-05 13:18:00)
摘要:
为什么使用 THEN 来结束一个 IF 结构 ?
什么是串线编码?不同的串线编码技术之间有什么差异?
有没有人写过把 Forth 编译成 Java 字节码的程序?
能够把 JAVA 字节码翻译成 Forth 吗?
没有操作系统的 Forth 怎么运行?
为什么不用 Forth 来编写一个操作系统呢?
为什么使用 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 字节码的程序?
-----------......
Forth 常见问题解答(3)(2005-08-05 13:17:00)
摘要:
哪些观点是口水大战?
商业化的还是自由软件的 Forth 系统?
自由软件的 Forth 是很差的 Forth ?
块还是文件?
我从哪里能够找到 C-to-Forth 编译器 ?
从哪里可以找到 Forth-to-C 编译器 ?
Forth 中有记录类型吗?
哪些观点是口水大战?
----------------------------------------------------
有些观点引起了长久和热烈的争论,参加的双方都在重复自己的观点而从来都想听别人是怎么说有,我希望你不要陷入其中。
这里我列出了一些针锋相对的观点,作为你阅读的起点,这样可以避免像他们一样地投身到战斗中去。
商业化的还是自由软件的 Forth 系统?
----------------------------------------------------
“付出什么,你就会得到什么。使用一个商业化的 Forth 系统,你可以得到商业化的文档和支持,我们需要一个商业化的系统,否则 Forth 就是死路一条”。
“我使用自由软件方式的 Forth 系统有良好的经验。我没有钱付给商业 Forth 系统。我想要源代码(有些商业系统不提供整个系统的源代码),文档和支持很差的商业软件开发者也不乏其例。没有自由软件方式, Forth 就是死路一条 ” 。
自由软件的 Forth 是很差的 Forth ?
----------------------------------------------------
“任何人都可以写一个很坏的 Forth ,然后没有文档和支持地发布出来;使用了这样的系统之后,没有人再想用 Forth 做任何工作。自由的 Forth 败坏了 Forth 的名声,自由的 Forth 抢了开发者的生意。 ”
“许多人通过 fig-Forth 学习 Forth ,确实有优秀的自由软件 Forths 。许多成功的语言开始都(并且现在仍然)提供自由软件版本。没有自由......