返回入门教程首页 主页 | 开发工具 | 应用芯片 | 核心模块  
 
   
 

堆栈计算机的原理和实现

作者 Philip J. Koopman, Jr.
编译 赵宇 张文翠

第九章 堆栈计算机的未来

前面几章讨论的堆栈计算机是第一代可商用的堆栈处理器,随着这些计算机的广泛应用,要求堆栈计算机重新设计以面向市场并改进效率。这一章的问题是:我们希望见到的是哪一种计算机?它们将对堆栈计算机体系结构和应用产生哪些影响?

回答堆栈计算机将会如何应用于许多不同的领域的所有问题还为时尚早,但是,我们可以思索一些重要的观点。这里的观点和推理可以形成未来对堆栈计算机概念探索的基础。不过,这一章的思想只是思索,而不是已经证明的事实。

9.1 讨论了在需要支持传统的程序设计语言时需要考虑的几个方面,正像已经说明的那样,现在的堆栈计算机设计已经能够很好地处理大部分问题。

9.2 讨论了虚拟存储器和存储器保护的方法,在现在的堆栈计算机上并没有出现虚拟存储器,因为对于大多数应用领域来说是不需要的,但是在未来的应用领域中就可能会需要。

9.3 考虑了对第三个堆栈的需要,并提出一个建议:驻留在存储器中的栈帧可以同时满足第三个堆栈和传统语言支持的需要。

9.4 讨论了迫切的问题就是存储器带宽限制,在计算机中使用分层存储器结构背后的历史。存储器计算机为存储器带宽问题提出了一个解决方案,它可以很好地适用于重要的应用领域。

9.5 介绍了两种有趣的但是没有在现有的设计中使用的堆栈计算机设计思想,一个思想是通过使用子程序条件返回来省去条件分支,另一个思想是使用堆栈来临时性地保存汇编语言代码。

9.6 提供了堆栈计算机对计算机影响的思考。

9.1 支持传统的语言

堆栈计算机最初的应用市场是实时控制,堆栈计算机高度集成可以使它作为一个低成本、高性能的协处理器而被用于个人计算机或者低端工作站的插卡,这些协处理器可以针对一个特定的应用领域进行定制,甚至是针对一个单一的重要软件包进行定制。所有这些环境都需要运行许多用传统高级语言编写的应用代码。

传统高级语言可以很容易地在堆栈计算机上实现,唯一的问题是,纯的堆栈计算机在运行使用通常程序风格编写的传统程序时可能不如寄存器机器快。这个问题主要是传统语言的要求和堆栈计算机的能力不匹配,传统程序趋向于使用很少的过程调用和大量的局部变量。堆栈计算机能够很好地运行由许多小过程和很少局部变量组成的程序,这种差异部分是由于通常程序设计语言所培养的程序设计风格和传统程序设计语言的结构所造成的。更进一步说,其中的差异是寄存器计算机能够很好地适应于通用的数据处理,而堆栈计算机在实时控制环境中表现得更好。从任何意义上讲,只要能够提供一定的硬件,传统语言在堆栈计算机上的性能在所有的应用领域中都可以与最高性能的寄存器计算机相近。当然,其思想在适当地匹配寄存器最好的方面的同时,不牺牲堆栈计算机所适应其它领域的特点。

9.1.1 栈帧

接着,我们来确定附加哪些硬件来支持高级语言的结构。奇异的是,高级语言运行时间栈竟然是纯堆栈计算机不能很地支持传统高级语言的唯一主要领域。这是由于高级语言有称为“活动记录”的结构,它是在每个子程序调用过程中建立的、位于程序存储器中的、由软件管理的“帧”。在通常的实现中,每个栈帧在子程序调用之前被一次性地分配成一个大块的存储器。这个帧包含有输入参数(它实际是被调用子程序分配的)、用户声明的局部变量、编译器按自己的需要而产生的中间变量。在子程序运行的过程中,可以在栈帧内进行任意的访问而不需要实际执行 PUSH 和 POP 。

栈帧是一个供子程序使用的临时存储器分配设备,它不是一个传统的保存连续计算中间结果的下推栈。这就意味着它与我们已经研究的、建立在堆栈计算机内部的硬件堆栈是不兼容的。修改堆栈计算机以满足这种要求的一个直观方法就是在一个帧内分配一大块存储器用于随机访问。这正是 RISC 计算机的寄存器窗口(在第二章描述成 SL2 )解决方案,但是这样做对堆栈计算机并没有什么意义,因为所有的数据访问都要付出在指令格式中提供操作数的代价。

一个变通的方法是建立第二个硬件堆栈,用很慢的速度访问局部变量,而原始的数据处理在 LIFO 硬件堆栈上进行。这让我们同时有了两个美好的世界,并这并不是没有没有成本,为了得到好的操作特性,第二个寄存器帧栈的大小通常要是数据堆栈的 5-10 倍。

9.1.2 寄存器和存储器混用

如果这样的折衷是唯一的问题,那我们可能就会试着在芯片上建立一个帧。但是,还有一个因素让我们考虑把栈帧放到程序存储器上。这个附加的因素就是传统语言的语义允许通过存储器地址来访问这些局部变量。 C 语言在这个问题上声名狼籍,它影响了堆栈计算机和寄存器计算机的相似性。

把寄存器当成存储器使用可以通过灵巧的硬件和编译器来处理,但是硬件和/或软件复杂性的成本与堆栈计算机用最小的复杂度取得最大性能的设计哲学不符。因此,对于一个堆栈计算机最好的选择是在程序存储器中维护传统语言的栈帧,并使用一个帧指针寄存器作为栈帧访问的硬件寄存器。如果有很富裕的片上空间,堆栈计算机可以提供一个片上 RAM 作为程序存储器空间的一部分来加速对栈帧的访问。

这个想法可能很吸引人:编写复杂的编译程序,努力地使传统程序执行时把大多数局部变量都放到硬件堆栈上。然而,按本书作者对一些堆栈计算机的经验来看,试图把所有局部变量都放到硬件堆栈上的 C 编译器和用一个帧指针来访问程序存储器的 C 编译器,两者的差异很小。事实上,如果计算机有一个帧指针,把帧放到程序存储器中还更快。

通常我们会这样想:把局部变量保存到硬件数据堆栈上应该比放到程序存储器中更快。但实际情况并不如此,原因是堆栈计算机访问埋藏很深的元素时效率不高,特别是在这些元素可能被分裂到程序存储器中的情况下。“全部都在硬件堆栈上”的方法使大量的时间花在查找堆栈元素上,而访问驻留程序存储器帧元素比访问硬件数据堆栈上的元素慢,但是在堆栈处理方面节省的时间使两者没有差异。

9.1.3 栈帧处理的一个策略

在处理栈帧时,可以使用一个很好的折衷方法,把程序存储器驻留与硬件堆栈数据驻留组合起来。这种方法的细节如下:所有的过程调用都把参数放到硬件堆栈上,因为这些参数或者是用于计算、或者是用于通过硬件数据堆栈在不同的栈帧位置间移动,这个过程没有浪费任何时间。然后进行过程调用,被调过程从硬件堆栈上复制参数到分配的帧位置处作为局部变量,只留下一、两个参数。编译器保证留在数据堆栈上的参数不使用地址引用,这可以通过程序员声明这是一个寄存器变量、或者编译器分析得到,最不济也可以仅仅为了安全而把所有的参数都复制到存储器中去。在数据硬件堆栈上留下一、两个数据可以使堆栈分裂最少,也提高了性能。当过程结束时,返回值被到数据堆栈上。

这种方法通过保存大量的存储器引用而提供了很好的效率,它也为不同的语言之间互相调用而提供了很好的接口,比如 Forth 语言和 C 语言,处理这些问题的编译器也相对易于编写。于是,现在的许多堆栈计算机都保存着帧指针,可以很容易实现这种策略。

9.1.4 传统语言的执行效率

从这些讨论中我们可以看到,堆栈计算机通过使用栈帧指针方法而有足够的效率支持传统语言的运行。当然,使用栈帧指针指向程序存储器不可能期望达到 RISC 机器的效率,因为 RISC 计算机有大量的片上寄存器窗口用于直接支持帧,或者通过灵巧的优化编译器来进行全局寄存器分配。

传统语言程序服从于高性能寄存器计算机使用的模型,堆栈计算机看起来性能不佳。导致这种影响的传统程序方面包括:大段的直线代码,接近 100% 的 CACHE 命中率,在长过程之间交叉引用的局部变量和那些暗中可以编译成内嵌代码的过程。

考察能够在堆栈计算机上高效率运行的程序所使用的结构,堆栈计算机就可以达到甚至超过基于寄存器计算机的程序性能。能够很好地被堆栈计算机运行的代码包括:高度模块化过程有多级嵌套或者递归;相对少量的和频繁使用的子程序、内层嵌套可以放置到快速存储器中,甚至可能提供微码支持;向下通过许多层的接口的局部变量很少;深度嵌套的子程序调用。同时,那些操作在频繁中断和上下文切换环境的程序也可以从堆栈计算机上受益。

在堆栈处理器上使用传统语言的一个实际方法是使用一种适度效率的高级语言来实现程序的大部分,然后把程序的内层循环用机器的汇编语言重新编码。这样就可以通过适当的努力而得到非常高的性能。在那些需要使用堆栈计算机优点的实时控制处理项目中,这种方法可以为程序员的时间投资获取最大的处理程序收益。

我们应该记住的是:在选择一个计算机时,除了单一程序的原始速度之外还需要考虑许多其它的因素,这些因素也许能够使天平偏向堆栈计算机:中断处理速度、任务切换速度、低的整机复杂度、支持应用程序指定的微码和/或硬件操作。在最后的分析中,堆栈计算机可能没有能够使得传统语言的程序运行得和寄存器计算机一样快,但是,其它的考虑可能消除这一缺点,特别是对于实时控制应用,使得堆栈计算机成为一个优秀的可选择对象。

9.3 虚拟存储器和存储器保护

虚拟存储器和存储器保护的概念在目前的堆栈计算机中并没有被广泛考虑,这是由于至今为止的大多数堆栈计算机应用程序相对较小,加之硬件和软件方面的严格限制而没有为这些技术留下空间。

9.3.1 存储器保护有时更重要

存储器管理可以指许多事情,但我们这里只讨论属于保护特点的那一部分。保护是存储器管理的一个重要方面,对于某些实时控制用户,特别是军事领域的用户,这就更为重要。保护是硬件所具有的能力,它可以防止一个程序在没有严格控制的条件下访问不属于它的、另外的程序存储器。一个没有被许可的、对不属于自己的存储器访问将引起一个中断,这种中断导致操作系统关闭或者复位这个不适当的任务,这就提供了一个安全的方法以防止病态的程序破坏其它的存储器。存储器保护功能通常由一个单独的、由操作系统管理的芯片来完成,堆栈计算机并没有阻止使用这种类型的芯片,相反,由于堆栈计算机的一个优点是它们都足够小,因而有可能把这样的存储器保护电路做到芯片上。

9.2.2 没有使用虚拟存储器控制器

同样,堆栈存储器也没有什么原因不提供虚拟存储器能力。使用虚拟存储器的一个问题是存储器失配的影响,它可能要求一个指令重新进入,由于堆栈计算机本质上是一个 LOAD/STORE 计算机,指令的重启并不比 RISC 计算机更困难。事实上,由于没有流水线,在堆栈计算机上处理中断的速度更快,它应该能够更好地处理虚拟存储器。

堆栈计算机不设置虚拟存储器的原因非常简单,许多堆栈计算机的目标是实时控制应用,而虚拟存储器由于需要使用大容量硬盘并导致性能波动,所以,这种技术并不能简单地适应于嵌入式实时控制环境。

9.3 使用第三个堆栈

一个堆栈计算机设计建议是使用第三个堆栈,给出第三个硬件堆栈的目的通常是存储循环变量和局部变量。

当前堆栈计算机的循环计数器通常都是作为返回栈的栈顶元素,这是由于子程序和循环能够很好地实现嵌套,但是让子程序去访问它的父程序的循环变量并不是一个很好的程序设计风格。所以,给循环变量一个自己的堆栈而避免在返回栈是混合非地址数据,当然有一些概念上的好处,但是所得到的程序执行效率与硬件所增加的成本并不一定成比例。

第三个堆栈的另一个用途是存储本地变量,甚至就是在用 Forth 编写程序时,程序员也感到编译器管理的本地变量可以使某些程序更易于编写和维护。为了高效率地实现这些能力,硬件需要访问一个按帧方式分配的堆栈,并通过帧中地址随机进行读写,这就和支持传统语言的方法相似。所以,事实上,最好的方法是不使用第三个堆栈,而是使用一个帧指针指向软件管理的程序存储器堆栈,它可以同时为高级语言和 Forth 语言局部变量提供支持。

9.4 存储器带宽的限制

可能这些年对计算机体系结构最大的挑战就是存储器带宽问题了,存储器带宽是每个时间单位里能够与存储器交换的信息数量。另一个说法就是,存储器带宽决定了可以访问多少存储器值。

问题的症结是,程序存储器通常比处理器需要更多的晶体管和其它器件,这就意味着在给定的条件下,CUP 比较容易地做得比存储器更快。下面是一个常识:使用一定的制造技术和工艺,更快的元件就更贵,消耗更多的功率等等。

9.4.1 存储器带宽问题的历史

存储器带宽限制的幽灵存在于计算机机设计的整个历史中。在开始的时候,大家都感谢计算机能够运行,那时,程序存储器的速度和处理器的速度都不是问题。随着计算机的应用,主要的计算机存储能力事实上是用磁带来保存数据文件,但也比什么都没有要好多了。

由于早期大型计算机中使用的磁芯存储器速度很慢,于是就产生了非常复杂的指令集,它们把许多工作填充在每个指令中,它也产生了很实用的微码,因为少量的微码存储器可以在所限制的范围内做得和 CPU 一样快,而这时大量的程序存储器还不可能做得到。半导体存储器出现后,捕捉重复执行的小片程序段、特别是循环代码段的 CACHE 存储器开始普遍使用。 CACHE 存储器变得越来越大,于是越来越多的程序驻留在 CACHE 存储器中,速度足以匹配处理器的速度。

接着就出现了微处理器,早期的微处理器很慢,当时的程序存储器芯片也足以匹配它的速度(于是,问题又一次变成这个样子:不是它能运行得多快,而是它是否能够运行)。存储器带宽问题暂时平息了一段时间,后来的微处理器制造商也跟随大系统并使用复杂指令集和微码。

主流微处理器开发了一段时间之后,就开始在访问存储器时使用“等待状态”。一个等待状态就是在处理器速度比存储器芯片速度更快的时候、处理器为了等待存储器响应而浪费的一个时钟周期。一个简单的解决办法是花费更多的钱去购买更快的存储器芯片,另一个简单的解决办法就是等待存储器芯片厂能够以合理的价格生产更快的存储器。最后, CISC 微处理器提出了 CACHE 和从大系统中学来的其它技术而尽量地把更多一些、再多一些的程序代码放进快速存储器中。

RISC 通过宣布传统计算机上使用的微码不好而打乱了格局,它们使用很低级的指令,能够把编译器产生的很好的微码放到程序存储器中。这种方法学说有很大的优点,但是更进一步提高了对存储器带宽的要求, RISC 计算机的性能更依赖于 CACHE 存储器。

9.4.2 当前存储器带宽的关系

对于最新一代的计算机,还有一个新问题:CACHE 存储器芯片可能不足以保持未来的处理器处于繁忙状态。当然,现在这种情况并没有发生,这是由于处理器中晶体管的开关速度比存储器芯片的速度提高得更快(也可以不是这样)。问题是处理器和存储器的引脚数成了主要的问题。

引脚成为瓶颈的原因是随着芯片密度更高,晶体管会越来越小、速度会越来越快。不幸的是,焊接和连接它们的引脚并没有变得更小,除非使用怪异的封装方式。引脚和驱动它们所必需的的电子数量与晶体管所驱动电子的相比就产生了巨大的差异,所以引脚成了瓶颈。这就更意味着任何片外存储器都要比片上存储器慢一个数量级,这是因为它们之间的延时。

现在我们所处的境况是所有的片外存储器都由于太慢而不能保持处理器繁忙。这就产生了存储器响应速度的附加层需要:片上 CACHE 存储器。不幸的是,这种方法与前面的方法相比有一个根本的问题:虽然印刷电路板可以做得很大而没有任何问题,哪怕是印刷电路板的废品率随着板上芯片的数量呈线性增长,可如果出现故障,印刷电路板还是可以修理的。不幸的是,芯片的废品率随着面积的增加按指数方式恶化,而且芯片是不容易修复的。

使用分离的 CACHE 芯片,只要在印刷电路板增加更多的芯片就可以满足合理的需要。然而,如果一个单芯片没有足够的面积用于片上 CACHE 存储器,靠增加芯片尺寸来提供更多的存储器就会使处理器因为废品率问题而无法制造。高速处理器特别是RISC 处理器对大量存储器的需要,使我们看到最好的希望是有一定数量的高速片上CACHE 存储器和低速度大容量的片外 CACHE 存储器 -- 现在我们的程序性能就靠这两种不同的 CACHE 来混日子,这是我们希望的最好结果吗?

9.4.3 堆栈计算机解决方案

堆栈计算机提供了完全不同的方法来解决问题。传统的计算机通过 CACHE 试图在程序运行时捕捉到一小段程序,这些努力是重用运行时已经读取的指令进行循环或者频繁的子程序调用。与 CACHE 接口性能有关的问题是传统的程序语言和编译器产生零乱的、随意放置的代码,而相反的是堆栈计算机鼓励编写使用进行重用的紧缩代码。

堆栈计算机程序行为方式的结果是不使用动态分配的CACHE 存储器,而代之以小的、静态分配或者操作系统管理的程序存储器用于所选定的子程序高速执行。频繁使用的子程序可以放置到这一部分程序存储器中,只要编译器或者用户知道它们需要快速运行,这部分存储器就可以自由使用。这就更加鼓励使用模块化的、重用的过程,因为这样做的结果是可以提高性能,而不是像在其它计算机上那样过多地伤害这一原则。当然,由于片上程序存储器不需要复杂的、大量的控制电路来管理 CACHE 存储器,多余的面积就可以用于另外的程序存储器。在16位堆栈处理器上,把完整的实时控制程序和它的局部变量数据存储器全部放到芯片上是合理的,随着亚微米制造工艺的出现, 32 位的处理器也开始使用同样的方案。

考虑这种方法与分层存储器结构的差异性,让我们看看微码计算机比如 RTX32P ,它有大容量的动态 RAM 可以用于保存许多程序和数据。实际上这是一个极端的情况, RTX32P 的程序很少需要比它的静态存储器更大的容量,但是让我们假设有这种情况。动态 RAM 组成了一个存储器元素,用于很高级别的、不常访问的程序,或者是很少、不经常访问的数据。

接着,静态存储器芯片加入系统中,它们用于执行频率比较高的中级程序,也可以用于程序数据,它们被频繁处理,数据可以驻留在这一片存储器中,也可以在需要的时候从动态存储器中拷贝过来并驻留一段时间。实际上,可以有两级静态存储器芯片:大容量、慢速度的和小容量、高速度的,各有不同的功耗,不同的成本、不同的印刷电路板空间等特点。

片上程序空间可以是另一个层次,程序中重要过程的内层循环可以驻留在这里供处理器快速访问。几百个字节的程序 RAM 可以很容易地放到处理器芯片中用于数据和程序。在运行特定程序的情况下(这是实时嵌入式系统常常遇到的情况),可以让几千字节的程序ROM驻留在芯片上。实际上,任何语言都可以使用许多通用的 ROM子程序以帮助程序员和编译器。

最后,微码存储器驻留在片上用于 CPU 的实际控制。按存储器分层理解,微码可以作为另一个层次的程序存储器,它为处理器保存许多频繁执行的行为,对应于所支持的机器指令,再一次, ROM 和 RAM 的混合是适当的。当然,数据堆栈作为一个快速访问的设备用于保存计算的中间结果。

于是我们就得到了一个贯穿于整个系统的存储器尺寸和速度的分层结构。分层的概念并不新,新的是它不需要在运行时的硬件进行管理,编译器和程序员可以很容易地管理它们。关键是,因为堆栈计算机程序很小,大量的代码可以驻留在静态分配的每个层次上。因为堆栈计算机支持快速的过程调用,只有内层循环和小部分频繁使用的代码才需要驻留在高速存储器中,而不需要把全部的用户定义过程都放到高速存储器中。这就意味着实际上并不是真的需要动态存储器分配。

9.5 堆栈计算机设计的两个新思想

这里有两个有趣的关于堆栈计算机设计细节的想法,它们并没有在现有的设计中使用,但是,也许能够在未来的设计中被证明是有用的。

9.5.1 条件子程序返回

实现细节是这样的: Doran (1972) 发现堆栈计算机不需要条件分支,它们只需要条件返回子程序指令。考虑一个高级语言中使用的 IF 语句,如果我们忽略可选择的 ESLE 子句, IF 语句就是“有一个入口和两个出口的一段代码”。入口代码开始这个语句,并在这里计算分支条件。当第一个出口条件为假时,其它所有的语句都不再执行。第二个出口是这个语句的结束,所有的动作都已经完成。

实现 IF 语句的通常办法是测试 IF 条件,当它为假时进行条件分支。相反,我们可以考虑让一个子程序包含整个 IF 语句, IF 语句的入口点是进入这个特殊子程序的调用,第一个出口点可以是一个条件子程序返回指令,在 IF 语句的条件子句为假时返回;第二个出口是一个无条件返回。

这种方法消除了程序中含有地址的条件分支,所需要的只是一个条件子程序返回语句。这种技术非常适合于堆栈计算机,因为进入条件子程序的调用和子程序的返回成本都很低,它可以比现在使用的条件分支方法更有效。

9.5.2 使用堆栈保存代码

另一个堆栈计算机程序执行的有趣建议是 Tsukamoto (1977) 提出的,他考察了自修改代码的相互矛盾的优点和缺点。尽管自修改代码可以非常有效,但是几乎所有的专业软件程序员都避之而恐不及,因为其中的风险太大。自修改代码破坏了程序的内容,程序员不能相信编译器或者汇编器产生的指令在整个程序执行期间是正确的。

Tsukamoto 的思想是没有缺陷地使用自修改代码,他建议简单地使用运行程序栈来存储修改的程序代码段用于执行。代码可以被应用程序产生并在运行时执行,这个过程并没有破坏程序存储器,当代码执行完后,就可以简单地 POP 堆栈而将它丢弃。

这两种技术现在都没有使用,但是它们可能在未来的应用中变得非常重要。

9.6 堆栈计算机对计算的影响

我们已经看到了,用原始的每秒执行多少指令来衡量,堆栈计算机至少与基于寄存器的计算机一样快,它们在实时控制应用中更显示出高级特点。我们还看到,只要使用小的嵌套过程调用就可以在程序中使用本地局部变量,但是,提出 CISC 、RISC 和堆栈计算机哪个最好这样的问题并不合适,因为所有这些设计技术在不同的应用中都有自己的位置。堆栈计算机好象并不能作为一个基本的 CPU 而很好地应用于工作站和小型机市场,正是由于这个原因,它们并没有得到应有重视。但是在适合的领域中,它们都真实存在并表现良好。

稍微想一下我们就可以发现,支持某种计算任务中的问题并不是堆栈计算机,而是当前的程序设计实践。考虑堆栈计算机特点适合的程序:使用许多小的、深度嵌套过程的高度模块化程序;在过程中传递少量参数、隐藏操作细节的程序;频繁再用这些小的模块以减少尺寸和复杂度的程序;由于尺寸小而很容易调试的程序;使用单一的接口来连接各种级别的模块抽象、从高级子程序到指令的程序。所有这些特点看起来都是需要的。不幸的是,它们很少用于实践中,使用堆栈计算机也许能够改变这一局面。

可能我们使用的、由寄存器计算机形成的传统程序设计语言和硬件应该对此负有责任。过程调用不能过于频繁地使用,因为它们耗费时间。因为过程相对较长,语言的语法也没有强制地进行简单的定义和引用,所以就要求不同数目的专用代码、参数列表、类型信息和其它类似的东西,甚至项目管理风格都要求在每个新的子程序创建时进行分开的文书工作和形式化的过程。由于编写和使用许多小的过程相对困难,转而只能使用更少的过程,这就形成了一个恶性循环。

堆栈计算机为改变这种循环提供了一个机会。过程调用开销很低,像 Forth 一类的语言使定义一个新过程的开销最小,实际上是提供了一个鼓励开发和测试模块化、易测试代码的环境。所有需要做的就是设计一个新的高级语言以适合高级语言计算机 (Chen et al. 1980) ,而堆栈计算机就是一个实践者。我们希望能够看到在传统语言上扩展和变化出一些控制结构,以更好地使用堆栈计算机硬件。

寄存器计算机能够给那些结构很差的程序提供一定的性能回报,但通常是更难以维护,更难以调试和更大的程序尺寸。通过对程序员编写结构良好代码的回报,堆栈计算机鼓励更好的程序实践。这可能进一步影响传统语言的变革,传统语言也倾向于提供更好的方法来创建、维护和执行程序。

 

 

   

(C) ForthChina.com 版权所有 2004-2010
Email:forthchina@163.com