问题标签 [stack-based]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
8 回答
31214 浏览

language-agnostic - 寄存器与堆栈

使用基于寄存器的虚拟机与使用基于堆栈的虚拟机相比,究竟有哪些优缺点?

对我来说,基于寄存器的机器似乎更易于编程和更高效。那么为什么 JVM、CLR 和 Python VM 都是基于堆栈的呢?

0 投票
2 回答
540 浏览

factor-lang - 使用 Factor 构建 Web 应用程序

有人用Factor构建了一个 Web 应用程序吗?在此过程中,您遇到了哪些绊脚石或问题?

0 投票
5 回答
2497 浏览

c++ - 我需要 C++ 数组类模板,它是固定大小、基于堆栈且不需要默认构造函数

所以,我一直在研究 boost::array 但它确实需要定义默认构造函数。我认为用数据填充这个数组的最好方法是通过 push_back(const T&) 方法。调用它的次数超过 SIZE(在编译时已知)将导致断言或异常,具体取决于构建配置。这样,它将始终包含有意义的数据。有谁知道这个概念的高效、便携、可靠的实现?

0 投票
3 回答
1306 浏览

.net - 为什么微软的开发人员选择让.NET 成为基于堆栈的机器?

今天我在VS2008提供的工具之间找到了Disassembler IL。我试图反汇编一个程序并查看结果。操作码并不难理解,但有一件事让我感到惊讶:.NET 是基于堆栈的?!阅读“编写出色的代码,第二卷”时,我没有很好地了解基于堆栈的机器,因为它们非常慢。它们也很容易实现,但我不认为 MS 开发人员选择这种方法是因为它简单,毕竟代码必须被翻译成真正的机器代码,这样他们才能解决问题。
你们中的任何人都可以解释这个奇怪的选择吗?

PS
我在这里发布我读到的关于这个主题的内容:

13.1.1 基于堆栈的机器 基于 堆栈的机器使用内存进行大多数计算,在内存中使用堆栈来保存所有操作数和结果。与其他架构相比,采用堆栈架构的计算机系统具有一些重要优势:

  • 这些指令通常比其他体系结构中的指令更小(每条指令消耗更少的字节),因为指令通常不必指定任何操作数。
  • 为堆栈架构编写编译器通常比为其他机器更容易,因为将算术表达式转换为一系列堆栈操作非常容易。
  • 在堆栈架构中很少需要临时变量,因为堆栈本身就是为这个目的服务的。
不幸的是,堆栈机器也有一些严重的缺点:
  • 几乎每条指令都引用内存(这在现代机器上很慢)。尽管缓存可以帮助缓解这个问题,但内存性能仍然是堆栈机器上的主要问题。
  • 尽管从 HLL 到堆栈机器的转换非常容易,但与其他架构相比,优化的机会更少。
  • 因为堆栈机器不断地访问相同的数据元素(即堆栈顶部的数据),所以很难实现流水线和指令并行(有关流水线和指令并行的详细信息,请参见编写出色的代码,第 1 卷)。
堆栈是一种数据结构,它只允许对堆栈的少数有限元素(通常称为堆栈顶部和堆栈上的下一个)进行操作。对于堆栈,您通常会做以下三件事之一:将新数据压入堆栈,从堆栈中弹出数据,或对当前位于堆栈顶部的数据(可能还有紧接其下方的数据)进行操作。

13.1.1.5 现实世界的堆栈机器
堆栈架构的一大优点是很容易为这样的机器编写编译器。为基于堆栈的机器编写模拟器也很容易。由于这些原因,堆栈架构在虚拟机 (VM) 中很流行,例如 Java 虚拟机和 Microsoft Visual Basic p-code 解释器。一些现实世界中基于堆栈的 CPU 确实存在,例如 Java VM 的硬件实现;但是,由于内存访问的性能限制,它们并不是很受欢迎。尽管如此,了解堆栈架构的基础知识还是很重要的,因为许多编译器在翻译成实际机器代码之前会将 HLL 源代码翻译成基于堆栈的形式。事实上,在最坏的情况下(虽然很少见),

编辑:我刚刚在@EricLippert 的博客中找到了一篇文章,回答了这个问题并确认了@Aaron 的回答

0 投票
3 回答
103 浏览

c - 无法将 char 复制到 char* ( string ) 的最后一个地址?

我想将数据复制char*到另一个最后地址char*

插图

第一步

复制var2var1

结果

var1 -> OK

书面代码

问题

为什么我的代码不起作用?或者是否已经存在任何功能来执行这些,但我还不知道?

感谢您的关注

0 投票
1 回答
76 浏览

javascript - 识别基于堆栈的语言

有谁知道这可能是什么语言?

0 投票
1 回答
185 浏览

objective-c - Objective-C中基于堆栈的数组声明?

在 Objective-C 中,我声明一个 C 数组,如下所示:

整数长度 = 10;
int [长度];

这不会在 Xcode 中导致任何错误,但在 Visual Studio 等其他编译器中不会导致任何错误。请告诉我它是如何工作的。我应该使用它还是使用 malloc/calloc 代替?

0 投票
1 回答
1453 浏览

language-agnostic - 为什么基于寄存器的虚拟机优于基于堆栈的虚拟机?

为什么基于寄存器的虚拟机优于基于堆栈的虚拟机?

具体来说,在Parrot VM 的文档中,设计者解释了注册机的好处:

[...] 许多高级语言程序由嵌套的函数和方法调用组成,有时使用词法变量来保存中间结果。在非 JIT 设置下,基于堆栈的 VM 将多次弹出然后推送相同的操作数,而基于寄存器的 VM 将简单地分配正确数量的寄存器并对其进行操作,这可以显着减少操作量和 CPU 时间。

但是为什么相同的操作数被推了很多次?

0 投票
2 回答
247 浏览

javascript - 类似于 c++ 中用于 javascript 的基于堆栈的对象

在 javascript 中寻找一个结构,其工作方式类似于基于堆栈的析构函数或 c++ 中的本地对象,例如

所以这意味着我正在寻找一个在其范围结束时(当它“超出范围”时)执行操作的构造。它应该是健壮的,因为它不需要在作用域结束时进行特殊操作,就像 c++ 中的析构函数(用于包装 mutex-alloc 和释放)一样。

干杯,毫克

0 投票
2 回答
5030 浏览

parsing - 我将如何实现一个简单的基于堆栈的编程语言

我有兴趣通过实现基于堆栈的编程语言来扩展我的计算机编程知识。我正在寻求关于从哪里开始的建议,因为我打算让它具有像“ pushint 1”这样的函数,它将一个值为 1 的整数推到堆栈的顶部,并通过像“ L01: jump L01:”这样的标签进行流控制。

到目前为止,我已经实现了我希望我的语言行为的 C# 实现(想要链接到它,但 IDEOne 被阻止),但它非常混乱,需要优化。它将输入转换为 XML,然后对其进行解析。我的目标是使用较低级别的语言(可能是 C/C++),但我的问题是实现一个可以容纳各种数据类型并且没有固定大小的堆栈。

最终我还想实现数组和函数。此外,我认为我需要一个更好的 Lexer,我想知道解析树对于这种简单化的语言是否是一个好主意。

欢迎任何建议/批评,并请考虑到我对编程仍然相当陌生(我刚刚完成了 AP CompSci I)。此外,欢迎提供基于开源堆栈的语言的链接。

这是一个我想尝试解释/编译的基本程序(其中[this is a comment]):

预期的输出将是: