Структура стека вызовов Вызывающие последовательности Передача параметров Языки программирования и методы трансляции Подпрограммы Языки программирования и методы трансляции Структура стека вызовов Вызывающие последовательности Передача параметров Подпрограммы и абстракция управления потоком Подпрограммы позволяют скрыть код за интерфейсом, который может быть использован независимо от реализации. Такая абстракция управления потоком необходима при проектировании и поддержке сколько-нибудь сложных программных систем. Языки программирования и методы трансляции Структура стека вызовов Вызывающие последовательности Передача параметров Стек вызовов При вызове подпрограммы в стек помещается новый стековый кадр (запись активации) Регистр указателя стека содержит адрес последней занятой ячейки стека или первой свободной ячейки. Регистр указателя кадра содержит адрес ячейки кадра. Языки программирования и методы трансляции Структура стека вызовов Вызывающие последовательности Передача параметров Стратегии размещения в памяти Статическое Код Глобальные переменные Статические переменные Явные константы (строки, множества, ...) Малые значения скалярных типов могут храниться вместе с инструкциями Языки программирования и методы трансляции Структура стека вызовов Вызывающие последовательности Передача параметров Вложенные подпрограммы Из B, C, D видны все пять подпрограмм. Из A, E видны A, B и E, но не C и D. Последовательность вызовов: A, E, B, D, C Языки программирования и методы трансляции Структура стека вызовов Вызывающие последовательности Передача параметров Содержимое стекового кадра Учетная информация адрес возврата (динамическая ссылка) содержимое регистров номер строки элементы дисплея статическая ссылка аргументы и возвращаемые значения локальные переменные временные значения Языки программирования и методы трансляции Структура стека вызовов Вызывающие последовательности Передача параметров Вызывающие последовательности За поддержание стека в нужном состоянии отвечают вызывающая последовательность, пролог и эпилог подпрограммы. Для экономии памяти все, что можно, помещают в пролог и эпилог. Иногда можно сэкономить время, поместив что-то в вызывающую подпрограмму, в которой может быть доступно больше информации. Например, в момент вызова может использоваться меньше регистров, чем в вызываемой подпрограмме ⇒ достаточно сохранить только значения используемых регистров. Языки программирования и методы трансляции Структура стека вызовов Вызывающие последовательности Передача параметров Сохранение и восстановление регистров Обычно регистры разделяют на две группы: регистры вызывающей подпрограммы и регистры вызываемой подпрограммы. Вызывающая подпрограмма использует регистры вызываемой подпрограммы — сначала регистры вызывающей подпрограммы — при необходимости С локальными переменными и аргументами связаны фиксированные отступы относительно указателя стека или указателя кадра, определяемые во время компиляции. В некоторых реализациях используется отдельный указатель на аргументы. Языки программирования и методы трансляции Структура стека вызовов Вызывающие последовательности Передача параметров Статическая цепочка Состояние статической цепочки зависит от глубины вложенности вызывающей подпрограммы. Вызывающая программа вычисляет адрес статической ссылки и передает его как дополнительный скрытый параметр в вызываемую подпрограмму. Два случая: Вызываемая подпрограмма вложена в вызывающую. Статическая ссылка — указатель кадра вызывающей подпрограммы. Вызываемая подпрограмма находится на k ≥ 0 уровней «выше». Статическая ссылка — разыменованная k раз статическая ссылка вызывающей подпрограммы. Языки программирования и методы трансляции Структура стека вызовов Вызывающие последовательности Передача параметров Стековый кадр Языки программирования и методы трансляции Структура стека вызовов Вызывающие последовательности Передача параметров Оптимизация Подпрограмма, не вызывающая другие подпрограммы, может не копировать адрес возврата и статическую ссылку из регистров в стек. Подпрограмма без локальных переменных иногда может обойтись без стекового кадра. Простейшая подпрограмма (например, sqrt) может работать (почти) не обращаясь к памяти, получая параметры, производя вычисления и возвращая значение в регистрах. Языки программирования и методы трансляции Структура стека вызовов Вызывающие последовательности Передача параметров Параметры, доступные только для чтения Параметры READONLY в языке Modula-3 Эффективность передачи по ссылке и безопасность передачи по значению Компилятор запрещает применение к таким параметрам операторов присваивания, чтение их из файла, передачу в другую подпрограмму по ссылке. Передача небольших значений параметров READONLY реализована как передача значения, больших — как передача адреса. Языки программирования и методы трансляции Структура стека вызовов Вызывающие последовательности Передача параметров Режимы передачи параметров в языке Ada В языке Ada используется семантический подход: in: вызванная подпрограмма только читает out: вызванная подпрограмма записывает и затем может читать (формальные параметры не инициализированы); изменение значений действительных параметров in out: вызванная подпрограмма читает и записывает; изменение значений действительных параметров В языке Ada режим in out реализован передачей параметров по значению и результату для скалярных типов и по значению и результату или по ссылке для структурных объектов. Языки программирования и методы трансляции Структура стека вызовов Вызывающие последовательности Передача параметров Передача параметров В языках, использующих переменные-ссылки (Lisp, Clu), передача по ссылке (совместное использование) — очевидный подход к передаче параметров. Передается ссылка; действительный и формальный параметр ссылаются на один объект. Значение действительного параметра копируется (как при передаче по значению), но изменения объекта видны в вызывающей подпрограмме (как при передаче по ссылке). Языки программирования и методы трансляции Структура стека вызовов Вызывающие последовательности Передача параметров Передача параметров Fortran — по ссылке При передаче константы компилятор создает для нее временное хранилище. Изменение значения во временном хранилище не влияет на работу программы. Передача параметров по имени — метод языка Algol. Грубо говоря, текстуальная подстановка (процедура со всеми именованными параметрами работает как макрос) — осуществляется передача скрытых процедур (thunk) Языки программирования и методы трансляции Структура стека вызовов Вызывающие последовательности Передача параметров Режимы передачи параметров по значению Языки C/C++, Pascal, Java/C# (нессылочные переменные) Механизм реализации по значению Допустимые операции чтение, запись Изменение действительных параметров? нет Альтернативные имена? нет Языки программирования и методы трансляции Структура стека вызовов Вызывающие последовательности Передача параметров Режимы передачи параметров in, const Языки Ada, C/C++, Modula-3 Механизм реализации по значению или по ссылке Допустимые операции только чтение Изменение действительных параметров? нет Альтернативные имена? возможны Языки программирования и методы трансляции Структура стека вызовов Вызывающие последовательности Передача параметров Режимы передачи параметров out Языки Ada Механизм реализации по значению или по ссылке Допустимые операции только запись Изменение действительных параметров? да Альтернативные имена? возможны Языки программирования и методы трансляции Структура стека вызовов Вызывающие последовательности Передача параметров Режимы передачи параметров по значению и результату Языки Algol W Механизм реализации по значению Допустимые операции чтение и запись Изменение действительных параметров? да Альтернативные имена? нет Языки программирования и методы трансляции Структура стека вызовов Вызывающие последовательности Передача параметров Режимы передачи параметров var, ref Языки Fortran, Pascal, C++ Механизм реализации по ссылке Допустимые операции чтение и запись Изменение действительных параметров? да Альтернативные имена? да Языки программирования и методы трансляции Структура стека вызовов Вызывающие последовательности Передача параметров Режимы передачи параметров совместное использование Языки Lisp/Scheme, ML, Java/C# (ссылочные типы) Механизм реализации по значению или по ссылке Допустимые операции чтение и запись Изменение действительных параметров? да Альтернативные имена? да Языки программирования и методы трансляции Структура стека вызовов Вызывающие последовательности Передача параметров Режимы передачи параметров in out Языки Ada Механизм реализации по значению или по ссылке Допустимые операции чтение и запись Изменение действительных параметров? да Альтернативные имена? возможны Языки программирования и методы трансляции Структура стека вызовов Вызывающие последовательности Передача параметров Режимы передачи параметров по имени Языки Algol 60, Simula Механизм реализации замыкание (thunk) Допустимые операции чтение и запись Изменение действительных параметров? да Альтернативные имена? да Языки программирования и методы трансляции Структура стека вызовов Вызывающие последовательности Передача параметров Режимы передачи параметров по необходимости Языки Haskell, R Механизм реализации замыкание (thunk) с использованием мемоизации Допустимые операции чтение и запись* Изменение действительных параметров? да* Альтернативные имена? да* Языки программирования и методы трансляции