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 的高手他的境界为何? 程序口语化,对两个堆栈的变化了然于胸毫无半点刻意。

评论