我问这个是因为我对解释器开发比较陌生,我想在重新发明轮子之前了解一些基本概念。
我想到了存储在构成当前范围的数组中的所有变量的值,在输入函数时,数组被交换,原始数组被放在某种堆栈上。当离开函数时,“范围堆栈”的顶部元素被弹出并再次使用。
- 这基本上是对的吗?
- 交换数组(这意味着移动大量数据)不是很慢,因此现代解释器不使用吗?
我问这个是因为我对解释器开发比较陌生,我想在重新发明轮子之前了解一些基本概念。
我想到了存储在构成当前范围的数组中的所有变量的值,在输入函数时,数组被交换,原始数组被放在某种堆栈上。当离开函数时,“范围堆栈”的顶部元素被弹出并再次使用。
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.
Python 使用 C 堆栈来跟踪其范围。每次进入一个新的范围时,都会进行一个新的函数调用,以便范围的数据始终保存在堆栈上的局部变量中。
对于其他一些解释器,所有内容都保存在堆栈中,就像您的建议一样。然而,解释器就地作用于栈顶。由于只有一份副本,因此无需来回复制内容。