2

我有一个我一直在设计的小型编程语言,我想要一个相对简单的后端选项。由于所有通常的原因(例如“我不能遵循好的建议”和“我不知道汇编”),C 是一个相对不错的选择,更重要的是,我的语言中并没有太多的事实不能轻易地用 C 表示(更多的是关于类型检查器,没有 GC 或重型运行时来适应) - 除了一件事:优化的尾调用。

这不是一个交易破坏者:我真的不需要它,因为该语言具有循环结构,但它也应该是功能性的,所以如果可能的话,TCO 似乎是一个有价值的东西。Trampoline 或lazy-thunk 解决方案会起作用,但似乎(从文献中,我还没有分析过,而且无论如何也没有任何使用信息)对性能有明显的影响。不希望实现阻止用户以有效的方式表达问题。

这个问题让我认为应该可以创建一个相对简单的特定于平台的“tailcall”块,以替换“return”并强制执行我想要的行为。但是,由于对 x86 不够熟悉,我不知道如何控制 C 的自动堆栈操作,我应该将跳转的目标放在哪里等等。(在我看来,它在函数启动后扩展了堆栈。 ..所以我需要在尾调用之前缩小堆栈,这有点不必要,或者在堆栈操作之后以某种方式瞄准目标主体的开头,这听起来几乎不可能编辑:对于静态未知目标 ..?)

所以:

  • 可以这样做吗?
  • 可以安全地完成吗?
  • 这是否明智?

我应该重复一遍,我知道可以实现在 C 中工作的尾调用消除(也就是说,我的高级语言,而不是 C 语言),我只想添加一个编译器和平台特定的优化,以帮助它或多或少与“真实事物”无法区分。而且我主要想使用 C,因为我对它非常有信心,而我从未使用过 LLVM,并且只有最基本的 x86 阅读知识,所以我希望跳过这一步并让输出正常工作。我知道在将来的某个时候我将不得不正确地学习这两者,但是......

(即我问这个是因为这个想法卡在我的脑海里,它让我觉得可能有更好的方法来做它(tm),而不是因为我需要解决方案来获得一个工作后端。)

4

1 回答 1

1

可以这样做吗?

是的。

可以安全地完成吗?

是的。

这是否明智?

不。gcc 已经为您做了 TCO,并且还支持计算 goto,所以绝对没有理由这样做。

于 2012-09-30T15:44:04.793 回答