使用内联asm强制C中的尾调用消除

时间:2012-09-30 15:13:02

标签: c gcc assembly x86

我有一个我一直在设计的小编程语言,我想要一个相对简单的后端选项。由于所有常见原因(例如“我不能遵循良好的建议”和“我不知道集会”),C脱颖而出是一个相对不错的选择,更重要的是,我的语言并不是很多不能用C表示(它更多地是关于类型检查器,没有GC或重载运行时间来容纳) - 除了一件事:优化尾部调用。

这不是一个交易破坏者:我真的不需要它,因为语言有循环结构,但它应该也是功能性的,所以如果可能的话,TCO似乎是一个有价值的东西。蹦床或懒惰的解决方案可行,但出现(从文献中我已经描述,并且无论如何没有任何使用信息)对性能有显着影响。不希望实施阻止用户以有效的方式表达问题。

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

所以:

  • 可以这样做吗?
  • 可以安全地完成吗?
  • 是否合情合理?

我应该重复一遍,我知道可以在C中实现工作的尾调用(即我的高级语言,而不是C语言),我只是想添加特定于编译器和平台的优化,以帮助它与“真实的东西”或多或少无法区分。我主要想使用C,因为我对它非常有信心,而我从未使用过LLVM,只有最简单的x86读取知识,所以我希望跳过这一步并让输出工作。我知道将来我必须在适当的时候正确地学习,但是......

(也就是我问这个因为这个想法一直困扰着我,这让我觉得可能有更好的办法(tm),不是因为我需要解决方案得到一个工作的后端。)

1 个答案:

答案 0 :(得分:1)

  

可以这样做吗?

  

可以安全地完成吗?

  

是否合情合理?

没有。 gcc已经TCO for you并且另外支持computed goto,所以绝对没有理由这样做。