是否有用于堆栈效应的 Forth 静态分析器?

Is there a Forth static analyzer for stack effects?

我正在因导致堆栈溢出的编程错误而失去工作效率。

例如,如果我在循环中的 IF ELSE THEN 分支中省略了 drop,并且出现堆栈溢出,我通常必须重新启动我的开发环境。我正在使用 SwapForth on the iCEstick.

是否存在预测编译字的堆栈结果的静态分析器?

就像检查代码是否始终与 (nnn nnn -- f) 文档匹配的自动化工具?

我不知道这样的工具,但我们为什么不实现它?

在一般情况下,问题没有解决方案(请参阅 Rice's theorem and the halting problem)。然而,显然可以实现一个实际有用的工具。它可以是一个独立的工具,也可以是您特定 Forth 系统的扩展,用于在编译期间即时检查代码。

关于一些示例,请参见 Peter Soviov (2003) 的 Forth Wizard。该工具在内部评估自动生成代码的堆栈效果。 另一个例子:Stack Verification Rob Chapman (1997) 的论文。 以下论文也可能有用:基于堆栈的语言中的类型推断,Bill Stoddart 和 Peter J. Knaggs,1992 (PDF); Simple Type Inference for Higher-Order Stack-Oriented Languages, Christopher Diggins, 2008 (PDF)。

也许最简单的解决方案就是动态检查堆栈效果(改变深度)并在违反堆栈签名时抛出异常(仅限开发版本)。 这个想法是重新定义 :(和可能的 ;)以从堆栈注释获得堆栈效果并编译冒号定义的 EXECUTE-BALANCED 包装器。

: EXECUTE-EFFECT ( i*x xt -- j*x n )
  DEPTH 1- >R EXECUTE DEPTH R> -
;
: EXECUTE-BALANCED ( i*x xt n -- j*x ) \ j = i + n
  >R EXECUTE-EFFECT R> = IF EXIT THEN
  -5010 THROW \ stack is unbalanced
;

显然,这样的解决方案只能捕获单词之间的错误,而不会捕获循环中遗漏的DROP

分析器需要知道所有使用的词的叠加效应,而不仅仅是标准词。实际上,这意味着必须以某种方式记录所有出现的单词的堆栈效应。我在 ciforth 中代表优化器完成了此操作,因此可以完成。我没有做的是自动将其与规范进行比较。这将需要像您提出的 (nnn nnn - f) 那样形式化规范,以及指定不确定性堆栈效应的方法。

一个折衷的解决方案是使用堆栈效果颜色编码,使堆栈错误更加突出。它使用存储在 ciforth 实现中的标志字段中的堆栈效应规范。 https://home.hccnet.nl/a.w.m.van.der.horst/forthlectureE.html

有经验的 Forthers 对此不以为然。词必须在创建后立即进行测试,这使得堆栈错误很短暂。