博文
Forth 这个东西(4)(2005-08-05 15:23:00)
摘要:发信人: william@cis_nctu (C++/ASM/Win Master), 信区: programming
发信站: 交大资科_BBS (Apr 1 12:10:28 1994)
==>[Author]: ajax@phoenix (ajax) on board 'programming'
> Forth 为何不能像 C一样的流行? 这是许多学 Forth者的疑问.
> Forth 看似不流行, 也不尽然如此, 只是给 C比下去了, 因为在
> 世界各地都有 Forth协会的组织, 包括大陆每年都要举行研讨会.
这一点我相信。
> 可能有人觉得 Forth的 postfix语法令人难接受, 但是也因为采
> 用此语法, 所它的 compiler简单到几个 Words就可定义, 而玩 Forth
> 最喜欢的就是它的一切都在控制之下, 包括硬件, OS..., Forth 的
> 系统也都是将 Source code附上, 不喜欢那里, 就修那里, 连自己吃
> 饭的东西都要给客户, 难怪 Forth Inc. 的一套系统如此贵.
Forth 的好处之一, 似乎就在于整体语法简单, 都围绕在 stack 及 word,
所以做起来、玩起来很容易。
> 有人号称 Forth是 Programer Amplifier, 即可增加程序的产量,
> 但其含义也包括烂者益烂, 变成 write-only语言.
其它有子程序观念的高级语言应该也能达到「提高产量」的要求。
> 他的 interactive发展环境实在很棒, BASIC 虽然也是, 但只能站在一边凉
> 爽, Forth 从来就不屑与 BASIC较量,
这是无庸置疑的, 它的 interactive 环境还能自己添加东东进去。而且, 会 Forth的人似乎都很狂热... 因为 Forth 让他们能随意......
Forth 这个东西(3)(2005-08-05 15:22:00)
摘要:Board: Source Post #70 at nsysu BBS
Posted By: lmy (Daemon of Andromeda)
Date: Sat Aug 28 15:13:51 1993
Title: Re: Zilog Super-8 Forth Source with Meta-Compiler
Posted By: porco (赖唐诺)
>lmy 兄,
>
> 我在前几年听过 Charles Moore 发展了一颗专为 FORTH 跑的 CPU, 编号
> 倒是忘了, 不过它既不是 RISC, 也不是 CISC, 而是一种叫作 WISC (不太确定)
> 的可变指令集架构。虽然 clock 的速度不是挺快, 但执行起指令的速度可不含
> 糊, 详细的资料在家里, 得回去找找了。不知道您有没有听过这颗芯片?
>
> P.S.: 不知道您老有没有兴趣开个 FORTH 讲座, 也好让大家了解 FORTH 的能力。
> 有空不妨回台大 bbs 坐坐 :-)
>
> porco, 抬大电鸡所 CAD 组 因特网: r81197@cc.ee.ntu.edu.tw
> -------------------------------------------------------------------------
> "大凡优秀的学生, 都是不爱上课的!" --- 赖氏名句
该 CPU 叫 NOVIX ......
Forth 这个东西(2)(2005-08-05 15:18:00)
摘要:发信人: ajax.bbs@csie (ajax), 信区: programming
标 题: FORTH 的禅思
发信站: 交大资工凤凰城信息站 (Tue Jun 7 08:50:12 1994)
转信站: cis_nctu!news.cis!news.cc!news.csie!bbsroute!phoenix
<< FORTH 的禅思 >>
金城 编着
封面:
-- 人机合一的无上心法 --
符式如道 行之必效
柔以克刚 简洁为高
封底:
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 的关键,你因子化、再因子化、再因子化,直到你的大多数定义......