Cтраница 1
Правило копирования дает основание смотреть на подпрограмму, просто как на удобное обозначение. Практически удобно написать подпрограмму один раз и вызывать ее из нескольких различных точек программы, а не копировать инструкции вновь и вновь. Кроме того, при выполнении программы имеется выигрыш в памяти, так как выполняемую форму инструкций требуется записывать только один раз. Вероятно, еще важнее то, что подпрограммы являются сильным организующим средством. При разработке вызывающей программы нам не нужно одновременно детально разрабатывать подпрограммы, достаточно вставить вызов подпрограммы и определить аргументы и результаты. Детально подпрограмму можно составить позднее. [1]
![]() |
Моделирование простого механизма вызовов-возвратов. [2] |
Правило копирования подпрограмм включает в себя много неявных предположений, которые требуют детального рассмотрения. [3]
Неточность формы заготовки, по правилу копирования погрешностей, передается детали. [4]
Наиболее извеотная форма связи программ и подпрограмм по управлению объясняется часто правилом копирования: эффект выполнения вызова подпрограммы тот же самый, кик золи бы этот вызов перзд выполнением был заманен копией тела подпрограммы с соответствующими подстановками для параметров и совпадающих идентификаторов / 13 /, Практически же бывает целесообразно хранить определение подпрограммы в одном экземпляре, а в точках вызова организовать переход на начало подпрограммы о возвратом в ту же точку. Таким образом, копирование оказывает то же действие, чго и вызо-ь подпрограммы, Эффективность использования о точки зрения памяти id времени выполнения этих способов управления различна. [5]
![]() |
Моделирование простого механизма вызовов-возвратов. [6] |
Однако если некоторая подпрограмма оказывается очень короткой ( например, одна или две инструкции), то мы можем явно применить правило копирования и во время трансляции заме-нить вызов подпрограммы на вставляемые команды. [7]
При каждом вызове подпрограммы должны выполняться до конца. В правило копирования неявно включено предположение, что каждая подпрограмма, при каждом вызове выполняется от начала и до логического конца. Вызванная второй раз, подпрограмма начинает выполняться заново и, прежде чем вернуть управление, доходит до своего логического конца. [8]
Требуются явные инструкции вызова. Чтобы можно было применить правило копирования, все точки вызова подпрограммы в предназначенной для трансляции программе должны быть явно указаны. [9]
Среди языков, обсуждаемых в части II, только Фортран и Кобол рассматривают подпрограммы непосредственно с позиций правила копирования. Все остальные языки допускают более гибкие структуры и, таким образом, требуют в какой-то степени программного моделирования структуры вызовов подпрограмм во время выполнения. В дальнейшем мы по очереди рассмотрим те структуры управления подпрограммами, которые получаются в результате ослабления каждого из пяти приведенных выше требований. [10]
Это различие становится очень важным, когда мы обращаемся к рекурсивным подпрограммам и другим более общим структурам управления подпрограммами. Предположим, что имеется подпрограмма А, которая вызывает подпрограмму В, которая затем рекурсивно вызывает А. В существуют две активации А. При выполнении этой активации происходит вызов В, и выполнение А приостанавливается. Аналогично в момент рекурсивного вызова А приостанавливается выполнение активации В. Рекурсивный вызов А создает новую активацию А, совершенно независимую от первоначальной. Можно мыслить эту вторую активацию как абсолютно новую копию А, однако эта копия создается динамически в момент вызова, а не во время трансляции, как в нашем первоначальном правиле копирования. После завершения выполнения второй активации А управление возвращается в Б и затем, вероятно, в первую активацию А. Вызовы подпрограмм во второй активации А могут привести к дальнейшим рекурсивным активациям как А, так и В. Итак, во время выполнения может существовать много различных активаций подпрограммы, каждая из которых образуется как независимая копия одного и того же определения подпрограммы в исходном тексте программы. [11]
Правило копирования дает основание смотреть на подпрограмму, просто как на удобное обозначение. Практически удобно написать подпрограмму один раз и вызывать ее из нескольких различных точек программы, а не копировать инструкции вновь и вновь. Кроме того, при выполнении программы имеется выигрыш в памяти, так как выполняемую форму инструкций требуется записывать только один раз. Вероятно, еще важнее то, что подпрограммы являются сильным организующим средством. При разработке вызывающей программы нам не нужно одновременно детально разрабатывать подпрограммы, достаточно вставить вызов подпрограммы и определить аргументы и результаты. Детально подпрограмму можно составить позднее. Подпрограммы, очевидно, неоценимы даже как удобное обозначение; тем не менее имеющееся в правиле копирования требование, в соответствии с которым вызов подпрограммы во время трансляции всегда можно ( хотя часто не нужно) заменить на тело подпрограммы, приводит к излишнему упрощенчеству. В правиле копирования неявно содержится ряд предположений о структурах управления последовательностью действий и о подпрограммах. Эти предположения слишком ограничительны и могут быть с пользой для дела ослаблены. Рассмотрим некоторые из них. [12]
Правило копирования дает основание смотреть на подпрограмму, просто как на удобное обозначение. Практически удобно написать подпрограмму один раз и вызывать ее из нескольких различных точек программы, а не копировать инструкции вновь и вновь. Кроме того, при выполнении программы имеется выигрыш в памяти, так как выполняемую форму инструкций требуется записывать только один раз. Вероятно, еще важнее то, что подпрограммы являются сильным организующим средством. При разработке вызывающей программы нам не нужно одновременно детально разрабатывать подпрограммы, достаточно вставить вызов подпрограммы и определить аргументы и результаты. Детально подпрограмму можно составить позднее. Подпрограммы, очевидно, неоценимы даже как удобное обозначение; тем не менее имеющееся в правиле копирования требование, в соответствии с которым вызов подпрограммы во время трансляции всегда можно ( хотя часто не нужно) заменить на тело подпрограммы, приводит к излишнему упрощенчеству. В правиле копирования неявно содержится ряд предположений о структурах управления последовательностью действий и о подпрограммах. Эти предположения слишком ограничительны и могут быть с пользой для дела ослаблены. Рассмотрим некоторые из них. [13]