解释器如何切换范围?

发布于 2024-09-03 06:15:12 字数 218 浏览 9 评论 0原文

我问这个问题是因为我对解释器开发比较陌生,我想在重新发明轮子之前了解一些基本概念。

我想到了存储在数组中的所有变量的值,该数组构成当前作用域,在进入函数时,数组将被交换,并将原始数组放入某种堆栈中。当离开函数时,“范围堆栈”的顶部元素将被弹出并再次使用。

  • 这基本上是正确的吗?
  • 交换数组(这意味着移动大量数据)不是很慢,因此不被现代解释器使用吗?

I'm asking this because I'm relatively new to interpreter development and I wanted to know some basic concepts before reinventing the wheel.

I thought of the values of all variables stored in an array which makes the current scope, upon entering a function the array is swapped and the original array put on some sort of stack. When leaving the function the top element of the "scope stack" is popped of and used again.

  • Is this basically right?
  • Isn't swapping arrays (which means moving around a lot of data) not very slow and therefore not used by modern interpreters?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

锦爱 2024-09-10 06:15:12

为什么要交换数组?只需查看堆栈顶部的数组即可。此外,在大多数语言中,当您想要交换数组时,不必复制数组,只需交换引用或指针即可。

这也是口译员可能会做的事情。另一种方法是为当前作用域提供一个特殊的数据结构,该结构显式地保存对其父框架的引用。

Why swap the array? Just look at the top array on your stack. Furthermore, in most languages you don’t have to copy the array when you want to swap it, you can just swap references or pointers.

This is also what an interpreter might do. An alternative is having a special data structure for the current scope which holds a reference to its parent frame explicitly.

难忘№最初的完美 2024-09-10 06:15:12

Python 使用 C 堆栈来跟踪其范围。每次进入新的作用域时,都会进行新的函数调用,以便作用域的数据始终保存在堆栈上的局部变量中。

对于其他一些解释器,所有内容都保存在堆栈中,就像您的建议一样。然而,解释器就地作用于堆栈顶部。由于只有一份副本,因此无需来回复制。

Python uses the C stack to keep track of its scope. Everytime a new scope is entered a new function call is made so that the scope's data is always held in the local variables on the stack.

For some other interpreters, everything is kept on the stack something like your suggestion. However, the interpreter acts on the top of the stack in-place. There is no need to copy things back and forth since there is only one copy.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文