Как переводчик меняет сферу? - PullRequest
3 голосов
/ 25 мая 2010

Я спрашиваю об этом, потому что я относительно новичок в разработке интерпретаторов, и я хотел бы знать некоторые основные концепции, прежде чем изобретать колесо.

Я думал о значениях всех переменных, хранящихся в массиве, который составляет текущую область, при входе в функцию массив переставляется и исходный массив помещается в какой-то стек. При выходе из функции извлекается верхний элемент «стека областей» и используется снова.

  • Это в принципе правильно?
  • Разве обмен массивами (что означает перемещение большого количества данных) не очень медленный и поэтому не используется современными интерпретаторами?

Ответы [ 2 ]

2 голосов
/ 25 мая 2010

Зачем менять массив? Просто посмотрите на верхний массив в вашем стеке. Кроме того, в большинстве языков вам не нужно копировать массив, когда вы хотите поменять его местами, вы можете просто поменять местами ссылки или указатели.

Это также то, что может сделать переводчик. Альтернативой является наличие специальной структуры данных для текущей области, которая явно содержит ссылку на родительский фрейм.

0 голосов
/ 27 мая 2010

Python использует стек C для отслеживания своей области видимости. Каждый раз, когда вводится новая область, вызывается новый вызов функции, поэтому данные области всегда хранятся в локальных переменных в стеке.

Для некоторых других переводчиков все хранится в стеке, что-то вроде вашего предложения. Однако интерпретатор действует на вершине стека на месте. Нет необходимости копировать вещи назад и вперед, так как есть только одна копия.

...