Как таблица символов связана со статическими цепочками и областью видимости? - PullRequest
6 голосов
/ 02 августа 2010

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

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

Мой профессор также говорил о таблице символов.Мой вопрос: для чего используется таблица символов?Как это связано со статическими цепями?

Я приведу некоторые сведения (пожалуйста, исправьте меня, если я ошибаюсь).


(я собираюсь определить несколько вещей, чтобы облегчить объяснение)

Предположим, у нас есть этот код:

main(){
    int i;
    int j;
    int k;
    a(){
        int i;
        int j;
        innerA(){
            int i = 5;
            print(i);
            print(j);
            print(k);
        }
    }

    b(){
        ...
    }
    ...
}

И этот стек:

| innerA  |
| a       |
| b       |
| main    |
-----------              

Краткое описание статических цепей в качестве переподготовки.

Статические цепочки используются, чтобы найти, какую переменную следует использовать, когда переменные переопределяются внутри внутренней функции.В показанном выше стеке каждый кадр будет иметь указатель на метод, который его содержит.Итак:

| innerA  | \\ pointer to a
| a       | \\ pointer to main
| b       | \\ pointer to main
| main    | \\ pointer to global variables
-----------        

(Предполагая статическую область видимости, для динамической области видимости я думаю, что каждый кадр стека будет просто указывать на тот, что ниже него)мы выполняем print(<something>) внутри метода innerA, это произойдет:

currentStackframe = innerAStackFrame;
while(true){ 
    if(<something> is declared in currentStackFrame)
        print(<something>);
        break;
    else{
        currentStackFrame = currentStackFrame.containedIn();
    }
}

Быстрое обновление таблицы символов

Я не совсем уверен, чтотаблица символов предназначена для.Но вот как это выглядит:

Index is has value, 
Value is reference.
 __
|  |
|--|                        --------------------------------------------------
|  | --------------------> | link to next | name | type | scope level | other |
|--|                        --------------------------------------------------
|  |                              |
|--|                ---------------
|  |                |    
|--|                |             --------------------------------------------------
|  |                 ------->    | link to next | name | type | scope level | other |
|--|                              --------------------------------------------------
|  |
|--|
  • ссылка на следующую - если более чем одна вещь имеет одинаковое хеш-значение, это ссылка
  • name - имяэлемент (примеры: i, j, a, int)
  • тип - что это такое (примеры: переменная, функция, параметр)
  • уровень области действия - не уверен на 100%, как это определено,Я думаю, что:
    • 0 будет встроенным
    • 1 будет глобальным
    • 2 будет основным методом
    • 3 будет a и b
    • 4 будет внутренним А

Просто чтобы повторить мои вопросы:

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

Ответы [ 2 ]

5 голосов
/ 02 августа 2010

Обратите внимание, что «таблица символов» может означать две разные вещи: это может означать внутреннюю структуру, используемую компилятором для определения, какой псевдоним переменной имеет область видимости, или это может означать список символов, экспортируемых библиотекой в ​​еепользователи во время загрузки.Здесь вы используете предыдущее определение.

Таблица символов используется для определения того, на какой адрес памяти ссылается пользователь, когда использует определенное имя.Когда вы говорите «x», какой псевдоним «x» вам нужен?

Причина, по которой вам нужно сохранять как статическую цепочку, так и таблицу символов, заключается в следующем: когда компилятору необходимо определить, какие переменные видныв определенной области он должен «демаскировать» переменные, ранее наложенные псевдонимом во внутренней области.Например, при переходе от innerA обратно к a переменная i меняет адрес своей памяти.То же самое происходит снова при переходе от a к main.Если компилятор не поддерживает статическую цепочку, он должен пройти через всю таблицу символов.Это дорого, если у тебя много имен.В случае статических цепочек компилятор просто просматривает текущий уровень, удаляет последнее определение каждой переменной, содержащейся в нем, а затем переходит по ссылке на одну область видимости.Если, с другой стороны, у вас не было таблицы символов, то при каждом доступе к переменной, не входящей в локальную область, компилятору придется обходить статическую цепочку.

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

Кстати, если вы еще не используете Язык программирования Майкла Скотта *1014*Прагматика , вы должны взглянуть на это.Это лучший учебник по этой теме, который я когда-либо видел.

1 голос
/ 02 августа 2010

Это, очевидно, относится к какой-то конкретной реализации класса, и чтобы понять это, я настоятельно рекомендую поговорить с кем-нибудь, связанным с классом.

Таблица символов - это то, что переводит идентификаторы исходного кода во что-то компиляторможешь использовать.Хранит необходимые описания.Как правило, он используется на протяжении всего процесса компиляции.Упоминаемый вами «тип» выглядит так, как будто он предназначен для синтаксического анализа, и, несомненно, будет больше записей (в «другом») для более поздних этапов.

Трудно понять, как это связано со статическими цепочками.или зачем они нужны, поскольку вы даже не знаете, что такое «уровень охвата».Тем не менее, обратите внимание, что и a(), и b() могут иметь переменную i, вы, кажется, думаете, что они имеют одинаковый уровень области видимости, поэтому вам нужно что-то различать.

Кроме того,Статическая цепочка часто является оптимизацией, поэтому компилятор знает, какие записи таблицы символов следует принять.Без статической цепочки компилятор должен был бы выполнить некоторые поиски, чтобы отклонить запись в b для чего-то, что встречается в innerA.

Чтобы получить что-то более полезное, вам придется объяснить большео том, что происходит (я настоятельно рекомендую поговорить с инструктором или ТП или что-то еще) и, возможно, есть более конкретные вопросы.

...