sicp.io
5.5.6 · Скомпилированный доступ к переменным

Лексический адрес вместо поиска по имени

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

Вопрос для размышления

Какое знание об окружении компиляция может вынести за пределы поиска во время выполнения?

  • Представление лексического адреса как глубины кадра и смещения связывания
  • Выбор кадра времени выполнения без проверки имен переменных
  • Выбор одного слота значения внутри этого кадра
  • Связывание поиска имени во время компиляции с прямым поиском во время выполнения

Адрес (depth offset) отсчитывает кадры окружения наружу, а затем позицию внутри одного кадра. Процедура lexical-ref следует только этим двум числам. Кадры времени выполнения содержат значения, а не пары имя-значение, поэтому во время выборки не происходит вызова assoc или сравнения символов.

Процедура find-address выполняет поиск имени в окружении компилятора, чьи кадры содержат имена переменных. Как только она возвращает (1 0) для x, среда выполнения может использовать этот адрес для извлечения 42 из соответствующих кадров значений. Этот пример согласовывает структуру кадров между компилятором и машиной.

Код SICP438 из 1,048,576 байт UTF-8
Примеры
Результат
Вывод
Значение
Диагностика
Трасса выполнения0 / 0 событий
    Запуски происходят внутри браузера с отображением результата программы и трассы выполнения.
    Ожидаемый результат

    Первая программа возвращает (20 30 50). Вторая программа разрешает x в адрес (1 0), после чего возвращает ((1 0) 42).

    На что обратить внимание в трассе

    При первом запуске проследите рекурсию по depth отдельно от выбора смещения через list-ref и убедитесь, что поиск символа переменной не выполняется. При втором запуске отделите поиск имени в окружении компилятора от последующего извлечения из кадра значений.

    Попробуйте сами

    Измените программу и сравните результат.

    Добавьте w после z в самый внутренний кадр времени компиляции и добавьте 11 в соответствующий кадр времени выполнения. Предскажите адрес и значение w.

    Показать подсказку

    Самый внутренний кадр имеет глубину 0. Его второй слот имеет смещение 1.

    Завершить этот урок

    В этой главе пройдено 0 из 23 урока0%