【问题标题】:Would C/C++/Pascal/etc. be substantially slower if it was a stackless language? [closed]将 C/C++/Pascal/等。如果它是一种无堆栈语言,会大大慢吗? [关闭]
【发布时间】:2012-04-08 13:37:27
【问题描述】:

还有一个相关的问题:堆栈跟踪/类似的调试功能会是什么样子?

如果这是一个愚蠢的问题,请原谅,但我对低级编程知之甚少。我知道大多数 CPU 都有与堆栈相关的指令,但是经过适当优化的无堆栈语言真的会慢很多吗?

【问题讨论】:

  • C、C++ 和 Pascal 语言本身是无堆栈的,它们没有任何直接与堆栈相关的编程结构。它是由利用堆栈操作的编译器生成的目标 x86 机器语言。
  • 不,这些语言有基于堆栈的子例程调用。我不明白它们中的任何一个如何被认为是无堆栈的。然而,Watcom C 编译器使用寄存器作为其堆栈的顶部,只是为了使调用/返回更快。
  • @shawnhcorey:只有实现才有; C 和 C++ 标准都不需要基于堆栈的实现。

标签: performance language-design stackless


【解决方案1】:

简短的回答:如果您的问题需要一个堆栈,那么语言/硬件中内置的堆栈可能会比您编写的堆栈快很多。

让我们想想“无堆栈语言”会是什么

最初的 Fortran 语言没有堆栈的概念。你能写的只是一个大的 MAIN 程序。 然后发现能够编写子例程并调用它们非常有用,因此添加了它以及返回值的函数。 然而,正如我个人发现的那样,如果你让 MAIN 调用了一个子例程 A,然后它调用了 B,然后 B 会发现自己再次调用了 A,你猜怎么着? 机器会“挂在返回循环中”,因为当 A 试图返回 MAIN 时,它会返回到 B,而 B 又会返回到 A,依此类推。 它无法记住不止一件要返回的东西。

所以对于某些问题,在那个 Fortran 中,如果不编写自己的堆栈,就无法解决问题。 也就是说,您将有一个数组和一个整数变量,通过索引该数组来跟踪下一步要做什么, 你最终会做一些后来被称为“push”和“pop”的事情。

这被发现非常有用,它被内置到后来的语言中。 有多种方法可以做到这一点。 在机器开始有内置堆栈之前,像 PL/1 这样的语言会有效地创建一个堆栈,其形式为不断分配和删除的激活记录的链表。 (效率不是很高,但确实有效。)

因此,如果您的语言没有堆栈,并且您尝试解决某些问题,那么您将不得不从活的语言中凿出自己的堆栈,因为问题只是需要它。 此类问题的一个示例是深度优先树行走。

如果你能做到这一点,语言是否“无堆栈”?

【讨论】:

  • 那么执行堆栈没有什么好的替代方案了吗? Stackless Python呢?
  • @Asmageddon:我确定这意味着每个“线程”都有自己的堆栈实现为列表结构,不一定使用机器堆栈。这就是通常实现并行性的方式。每个并行进程或线程,或任何你称之为的东西,都有自己的东西,与堆栈同构。
猜你喜欢
  • 2012-12-29
  • 2018-01-08
  • 2012-11-19
  • 2017-10-06
  • 2011-09-25
  • 2018-02-22
  • 2014-12-18
  • 2015-02-13
  • 2010-12-22
相关资源
最近更新 更多