正文

FORTH这个东西2005-08-05 15:51:00

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

分享到:

Forth 简介

Forth 语言是一种发展性很高的计算机语言而且提供了交谈式 (Interactive)
程序发展环境,给使用者使用。原本 Forth 只被发展且用在小型计算器的系统上,你可以看到几乎所有的各型微处理机上均有各型各色的 Forth 系统被发展出来。Forth 也可以被用在更宽广的应用上如 Spread Sheet,Expert Systems 和多任务的 database 上等。


Forth 是拥有两堆栈的虚拟机器

在表面上 Forth 是拥两个堆栈可以直接执行的计算机程序语言。在实质上这个虚拟机器是由程序计数器 (Program Counter),Memory (内存), ALU
(数学计算单元) 和 FILO (first-in, Last out),数据堆栈 (Data Stack及 FILO 回返堆栈 (Return Stack) 所构成的,是一套完整的 CPU 结构 。


Data Stack (数据堆栈)

Forth 指令或程序均可自数据堆栈获得参数并将其结果放回数据堆栈中。此数据堆栈可视为以先进后出 (FILD) 方式的缓存器组,专门处理 Forth 指令所需的参数及结果。
举例而言,若要计算 3+ 4 * 5,所需指令为 "+" 及 "*"。
因Forth指令均为后运算符法 (Post fix notation),上述计算变成
从键盘输入 3 4+5*
从屏幕输出 35 Ok

。 3 先被放入数据堆栈中
。接着 4 被放入数据堆栈,而 3 被挤入数据堆栈下层中
。接着 + 指令自数据堆栈中取得两个数据产生的结果 7,放入数据堆栈中
。接着 5 亦放数据堆栈中,而 7 被挤入下一层数据堆栈中
。接着 * 指令自数据堆栈中取得两个数据产生的结果为 35,放入数据堆栈中。
。接着 .指令自数据堆栈变成空的。
。"ok" 是 Forth 的提示字符。


要了解 Forth 语言,看得懂所设计的程序,首要的事,即要很清楚数据堆栈的运做,并时时清楚它的状态及内容。另外 Forth 有维护数据堆栈的指令如 :

DUP (Duplicate) - 复制数据堆栈最上层的一个数据。
SWAP -- 数据堆栈最上面二层的数据互相交换位置。


回返堆栈及 Forth 程序

Forth 的程序和一般的计算机语言不太一样。一般 Forth 的程序其实是一段 "定义",一个子程序会以一个字或指来代表或呈现。而所有字(子程序库)的集合,我们称之为字典(Dictionary) 所以 Forth 的程序是由一些在字典的 "字" (子程序),所组成一个新的 "定义",新的 "字" (子程序),如此结构化一层一层组成的。

在 Forth 中子程序呼叫和回返 (Return) 是相当频繁且重要的。此呼叫和回返所需的地址Forth 以透过回返堆栈 -- 另一个类似缓存器文件的机构来完成。回返堆栈亦是一个 FILO (first-in Last out) 结构的堆栈,此特性刚好可以完全符合子程序呼叫和回返的需求。

举例说明:如我们要计算 C = a^2 +b^2 以 Forth 程序来完成首先我们会用到堆栈指令。

DUP (数据迭复制指令 Ex: 3 DUP ‧‧结果 3 3
SWAP (数据迭交换指令 Ex: 12 SWAP ‧‧结果 1 2

此程序会为
: SUM-OF-SQUARE (a b --c) 此为说明数据堆栈之变化
| | ( (
| | ( ( 此定义字 (副) 程序之
开始一个定义 ← ↓结果会放在数据堆栈上
新定义名字(子程序) (( 需从数据堆栈获得之参数


DUP * SWAP DUP * + ; ( 定义字结束或子程序结束
S0 b b^ a a a^2 a^2+b^2
S1 b a b^2 a b^2
S2 b b^2

所以会得到 C = a^2 +b^2其结果在数据堆栈上。


此程序SUM-OF-SQUARE我们可以把它视为

(呼叫DUP子程序,此时会有一个回返地址被放在回返堆栈上,
Dup结束时用掉此回返地址。
(再呼叫 * 。
(再呼叫 SWAP
(再呼叫 DUP
(再呼叫 *
(再呼叫 + 结束

我们可以将程序重写成二段式呼叫如下:
: SQUARED ( n -- n** 2 ) \ 将n变成n**2
Dup * ;
: SUM-OF-SQUARES ( a b -- c ) \ 计算c=a**2+b**2
SQUARED SWAP SQUARED + ;

此程序 (SUM-OF-QUARES) 运作如下:
一、呼叫SQUARED (呼叫 Dup ---此时回返堆栈有两层回返地址
(呼叫 * ---此时回返堆栈有两层回返地址
二、呼叫SWAP-----此时回返堆栈只有一层回返地址
三、呼叫SQUARED (呼叫 Dup ---此时回返堆栈有两层回返地址
(呼叫 * ---此时回返堆栈有两层回返地址

    如此你应已暸解回返堆栈在Forth语言的作用和重要性,因回返堆栈和程序流程、控制权移相当有关系,绝对不可能破坏,否则会有当机的可能性。有一原则要谨守--- 尽量少用回返堆栈来做数据转换。

    一个好的Forth式设计师会努力的把每一个定义字的长度控制在很短的情形下(通常只有一行的长度)。并且选一个适当的名称做为定义字的名字。这会使得
Forth程序口语化/可读性的程度大为提高,这是Forth语言极值特色。

    在此提一下金城先生在他的"Forth 的襌思"一书中无上心法第二篇---如何在心中建一个计算机"有一段说明他刚学Forth时,也时,日日怨,夜夜愁,直到一年后发觉自己在写程序,口中顺口说出的就是程序句子,心中凝想着两个堆栈的上下起伏毫无半点刻意,是下意识的反应。
这也正说明一个 Forth 的高手他的境界为何?

    程序口语化,对两个堆栈的变化了然于胸毫无半点刻意。

阅读(4681) | 评论(0)


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

评论

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