Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 102
Текст из файла (страница 102)
-ыре игрока, использующие одну и ту же стратегию игры. Такую игру можно молели- -.- ть с помощью главного модуля, создающего семейство сопрограмм, каждая из кото- имеет свой набор карт. В таком случае главная программа может начать моделиро-ие. возобновив выполнение сопрограммы одного из игроков, которая в свою очередь, .: ззв ход, может возобновить выполнение подпрограммы следующего игрока, и так да:;. пока игра ие закончится. 5 же форму возобновления можно использовать и лля начала, и для продолжиения : зознения сопрограмм. допустим, что программные модули А и В являются сопрограммами. На рис.
8.4 по. чы два способа последовательного выполнения модулей А и В. На рис. 8.4, а выполнение сопрограммы А инициируется главным модулем. После не- -. рого периода выполнения сопрограмма А передает управление сопрограмме В. Косопрограмма В иа рис. 8.4, а впервые передает управление сопрограмме А, это озиа.;-. что сопрограмма А продолжает свое выполнение с того места. где она закончила . -. е предыдущее выполнение. В частности, ее локальные переменные сохраняют свои -э~ения, полученные ими во время предыдущего выполнения.
На рис. 8.4, б показана .:тернативная последовательность выполнения сопрограмм А и В. В этом случае глав.: ы модулем инициируется выполнение сопрограммы В. 3 отличие от образцов, показанных на рис. 8.4, сопрограмма часто имеет цикл, со.:гжаший возобновление. На рис. 8.5 показана последовательность выполнения при . ч сценарии. В этом случае сопрограмма А запускается главным модулем. Внутри .: . его основного никла сопрограмма А возобновляет выполнение сопрограммы В, кото:.
в свою очередь, возобновляет выполнение сопрограммы А в своем основном цикле. 3. Сопрограммы за аоаоаноата нз главного модуля а) б) Рис В.4. Две возлгожные поеаедоватезьноспги выпол- нения двук сопрограчч без циклов ° азоааампа — а нз глазного модуля Рис. В,В. Последоватезьноснгь выпглзненил сопрограмм с цикзачи звв Глава 8. Подлраграмаи Лроцесс абстрагирования прелставлен в языках программирования подпрограммами. -гезеление подпрограммы описывает действия, которые выполняет подпрограмма. =: г эв подпрограммы приводит к выполнению предусмотренных ею действий. Формальные параметры — это имена.
которые используются в подпрограмме лля .: = эок на фактические параметры, полученные при вызовах подпрограммы. Подпрограммы могут быть либо функциями, которые моделируют математические «кони и используются для определения новых операций, либо процелурами. опреде'. шими новые операторы. Локальные переменные в подпрограммах могут размещаться динамически в стеке, е'печивая поддержку рекурсии, или статически, обеспечивая эффективность и зависи:;ть локальных переменных от своей предыстории. Есть три основные семантические модели передачи параметров — режим ввола, реи вывода и режим ввода-вывода — и большое количество подходов к их реализации. При использовании параметров, передаваемых по ссылке, возникает совмещение ; еи между несколькими параметрами, а также между параметром и видимой нелокаль-.п переменной.
Доступ к нелокальной переменной обеспечивается несколькими разными способами: -:гез внешние объявления. блоки глобальных данных, внешние модули, а также через . -=тический и динамический обзор. Параметры, являющиеся именами подпрограмм, обеспечивают необходимый сервис, днако их иногда трудно понять. Непрозрачность заключается в среде ссылок, доступной -си выполнении подпрограммы, передаваемой в качестве параметра. В языках Ада и С++ допускается перегрузка подпрограмм и операторов.
Подпро—.зимы можно перегружать, поскольку их различные версии различаются между собой - лами параметров или типами возвращаемых значений. Определения функций можно . гользовать дяя приписывания операторам нового смысла. Подпрограммы в языках Айа и С+я могут быть настраиваемыми и использовать па-зчетрический полиморфизм, так что компилятору для построения модулей, соответст-., ющих требуемому типу данных, можно передавать объекты нужного типа. Сопрограммы — это специальные подпрограммы, имеющие несколько входов. Их . жно использовать для перемежающегося выполнения подпрограмм.
Каковы три основные характеристики подпрограмм? Что означает выражение "активная подпрограмма'"? Что представляет собой параметрический профиль". Что такое протокол подпрограммы? Что такое формальные параметры? Что такое фактические параметры? Какие достоинства и недостатки имеют ключевые параметры? 389 Вопросы б. 8. 9. 1О. 390 Глава 8. Подпрограммы 11. 12. 13. 14. 15.
16, 17. 18. 19. 20. 21. Какие проблемы связаны с разработкой подпрограмм? Какие достоинства н недостатки имеют динамические локальные переменные? Каковы три основные семантические модели передачи параметров? Что такое режимы, концептуальные модели передачи, достоинства и недостатки методов передачи параметров по значению, по результату, по значению и резуль- тату, по ссылке и по имени? Каким образом возникают альтернативные имена при передаче параметров по ссылке? . В чем состоит отличие способов, которыми исходная версия языка С н язык АН$1 С работают с фактическим параметром, тип которого не идентичен типу соответ- ствующего формального параметра? В чем заключается проблема, связанная с подходом, использованным в языке Аба, позволяюшим разработчикам средств реализации языка самим решать, какие па- раметры передавать по ссылке, а какие — по значению и результату? Назовите два основных вопроса, связанных с методами передачи параметров.
Сформулируйте два основных вопроса, возникаюших при передаче имен подпро- грамм в качестве параметров. Дайте определение понятий теневое и глубокое связывание для сред ссылок под- программ, передаваемых в качестве параметров. Что такое перегруженная подпрограмма? Что такое параметрический полиморфизм? Что приводит к созданию экземпляров шаблонной функции в языке С++? Дайте определение понятий раздельная и независимая компитлция. Какие вопросы связаны с разработкой функций? Чем сопрограммы отличаются от обычных подпрограмм? Приведите аргументы "ы" и "против" пользовательской программы, создающей дополнительные определения для существующих операторов, как зто сделано в языках Ада и С++. Считаете лн вы такую определяемую пользователем перегрузку операторов хорошим или плохим способом программирования? Обоснуйте ваш ответ, В большинстве реализаций языка гОйТКАХ 1Ч параметры передавались по ссылке с использованием исключительно передачи пути доступа к данным.
Укажите достоинства и недостатки этого проектного решения. Приведите аргументы в поддержку решения разработчиков языка Ада 83 позволить создателям средств реализации языка самим делать выбор между реализацией режима зп оцп передачи параметров с помощью копирования или с помощью ссылок. Язык РОКТКА)Ч имеет две слабо отличающиеся разновидности блоков СОММОРп пустой и именованный.
Одно различие между ними заключается в том, что пустой блок СОММОМ не может быть инициализирован во время компиляции. Можете ли вы определить причину, по которой пустой блок СОММОМ разработан именно таким образом? Подсказка: это проектное решение было сделано в самом начале разраоотки языка ГОКТКА)ч, когда память компьютеров была довольно маленькой. Допустим, вы хотите написать подпрограмму, печатающую заголовки на новых страницах вывола вместе с номерами страниц, начиная с ! при первом вызове и увеличивая номер на 1 при каждом последующем выюве. Можно ли это сделать в языке Рааса) без параметров и без ссылок на нелокальные переменные? Можно ли это сделать в языке ГОКТКА)ч? Можно ли это сделать в языке С? В языке ГОКТКА)ч подпрограммы могут иметь несколько входных точек. Когда это свойство бывает ценным? Напишите на языке Рааса! процедуру АООЕК, складывающую два целочисленных массива.
Она должна иметь только два параметра, означающих два складываемых массива. Второй массив также должен содержать результат, полученный на выходе. Оба параметра должны передаваться по ссылке. Проверьте процедуру АВАЕВ с помощью вызова АВАЕВ(А, А). Здесь переменная А — это массив, который складывается сам с собой. Объясните результаты выполнения этой программы. Решите задачу 7 с помощью языка С. Рассмотрите процедуру В16ЯОВ, из раздела 8.5.2.5. Замените два оператора присваивания значений элементам массива В1ЯТ следующими: :1ЯТ [1]: = 3 1ЯТ [2]: = 1 Выполните новую программу вручную при следующих предположениях и сравните с результирующими значениями в массиве 11ЯТ в подпрограмме В16ЯОВ после возвращения из подпрограммы ЯОВ.
9.!. Параметры передаются по значению. 9.2. Параметры передаются по ссылке. 9.3. Параметры передаются по имени. 9.4. Параметры передаются по значению и результату. Рассмотрите следующую программу, написанную с использованием синтаксиса языка С: .а и() [ Епп ча1ие = 2, 11лт[5] = (1, 3, 5, 7, 9); анар(ча1пе, 11вт[0)); виар(11ат[0] 11вт [1] ] г анар(ча1пе, 11эт [ча1ие) ) Г чоЫ виар( Епс а, Дпс Ь) ( 1пт теврг гетр = а; а = Ь 39з ° "ппжнения 11.
12. 13. 14. 15. Ь = гетр! ) Каковы все значения переменных на1ие и 11вс при каждом из трех вызовов функции в;. ар для каждой из следующих моделей передачи параметров? 10.1. Передача по значению. 10.2. Передача по ссылке. 10.3.