Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 101
Текст из файла (страница 101)
Здесь предполагается, что целочисленные и действительные переменные занимают одинаковый объем памяти. Это может иметь смысл, только если блок ВЬОСК1 является просто совместно используемой памятью, а не хранит совместно используемые данные. Совместно используемая память — главная причина того, что допускается такое изменение списков переменных. Простое нарушение порядка в списке переменных оператора СОММОМ может привести к тому, что одна и та же область памяти будет совместно использоваться переменными разных типов, порождая ошибку, которую трулно обнаружить. Описание языка РОКТКАХ90 указывает, что оператор СОММОМ относится к "нежелательным свойствам".
Это означает, что он может быть включен только в следующую версию языка гОКТКАМ, а впоследствии будет из этого языка исключен. Оператор ЕО01ЧАЬЕМСЕ также является нежелатЕльным свойством языка гОКТКАХ 90. 810СК! !60 и~ 1и и1 Рис. 8.3. Две точки зрения на блок СОММО)ч' В.11.2. Внеидние обьяяления и модули Языки Моди!а-2 и Аг)а используют статический обзор как средство совместного использования данных программными модулями. В обоих этих языках прелусмотрен также альтернативный метод совместного использования данных. Он заключается в том, что в программных модулях разрешается указывать внешние модули, к которым требуется доступ. С помощью этого метода в каждом модуле можно точно указать другие модули, к которым нужен доступ, не больше и не меньше. В языке Мос)н)а-2 этот доступ может быть открыт только к указанным процедурам, переменным и типам данных из заданного внешнего модуля. В языке Аг)а программист может указывать только имя внешнего модуля, который затем обеспечивает поступ ко всем своим типам, переменным и процедурам.
Этот метод также возможен и в языке Моди)а-2, Указывать каждую сущность, к которой требуется доступ, очевидно, слишком утомительно, поскольку список необходимых типов, переменных и процедур может быть очень длинным. Однако этот метод более безопасен, чем простое указание имени модуля. Глава 8. Подпрограммы Язык РОКТКАМ 90 также содержит модули, которые могут поддерживать выборочное совместное использование нелокальных данных, предусматривающее проверку совчестичости типов.
Этн языковые свойства более тщательно рассматриваются в главе 1О в связи с абстгзк ней данных. В таких объектно-ориентированных языках, как С++ и )ача, можно использовать з:с дзя инкапсулирования наборов данных, используемых совместно с другими клас- Классы детально обсуждаются в главе 11. Я языке С нет вложенных подпрограмм, поэтому существует только один уровень об-е .озпрограмм.
Глобальные переменные можно создавать, помещая их объявления :. - г: лрезеления функций. Доступ к переменной, объявленной в функции как внешняя, :;-ечнвается с помощью оператора ехгегпе1. Все функции, определения которых ют за объявлениями глобальных переменных в исхолном файле, имеют доступ к .- " переменным без объявления их в качестве внешних. Этот метод элегантен, но не.: ласен. и обеспечивает намного больше доступа, чем это обычно требуется. . лобальные переменные, определенные в других файлах программы на языке С, мо— — также быть доступными функциям, объявившим их в качестве внешних переменных.
з.ич образом, путем раздельной компиляции модулей можно создать отдельные, не сесекаюшиеся между собой области видимости переменных. С помощью этого метода с: ст) п к переменным в этих раздельно компилируемых модулях ограничен только теми = чкциямн, в которых эти переменные объявлены как внешние. 8.12. Перегруженные операторы, определяемые пользователем 3 программах на языках Аба и С++ программист может перегружать операторы. -естве примера рассмотрим функцию на языке Аба, перегружаюшую оператор ум- ения (*) лля вычисления скалярного произведения двух векторов.
Скалярное произ-.-.::чне двух векторов представляет собой сумму попарных произведений соответст-" нх элементов этих векторов. Предположим, что переменная АРЕСТОВ ТУРЕ была --е елена как массив, содержащий элементы типа 1ИТЕСЕА. апокьоп "*"(А, В : Еп ЧесСог ТУРЕ) гекигп 1ИТЕСЕЯ ье ЯОМ: 1ИТЕСЕР := 0; Ьедхп аког 1ЫОЕХ ьп А'гепде 1оор ЯСМ := ЯОМ + А(1ИОЕХ) * В(1ИРЕХ)г епб 1оор; — Еог 1пбех гегигп ЯОМг епс( "*"; :;ярное произведение, как указано в этом определении функции, будет вычислено, как -.
- ко звездочка появится между двумя операндами типа ЧЕСТОВ ТУРЕ. Звездочка да:= чожет перегружаться сколько угодно раз, поскольку определение функции имеет -, кхзьный протокол. Функция вычисления скалярного произведения, приведенная выше, также может ': -ь написана на языке С++. Прототип такой функции может иметь слелующий вил: .
12. Перегруженные операторы, определяемые пользователем зпц орегассг *(соавк чессог аа, сопев честог Ы», как 1еп) Естественно, возникает вопрос: насколько можно перегружать оператор и нельзя лн его слишком перегрузить? Ответ таков: оператор можно перегружать значительно, это — дело вкуса.
Аргумент против слишком сильной перегрузки операторов сводится в основном к снижению надежности программы. Во многих случаях гораздо более читабельной является программа, в которой лля выполнения некоторой операции вызывается функция, чем та, в которой используется оператор, часто применяемый к операндам других типов. Даже в скалярном произведении не ясно, что именно умножается в простом операторе присваивания: С:=А* В; Легко ошибочно предположить, что переменные А, В и С представляют собой скалярные величины.
Кроме того, системы программного обеспечения обычно конструируются из модулей, создаваемых разными группами разработчиков. Если разные группы перегрузили один и тот же оператор разными способами, эти различия обязательно нужно исключить, перед тем как объединять модули в единую систему. ВЛ 3. Сопрограммы Сопрограммы (согоцбпез) — это специальная разновидность подпрограмм. В отличие от отношения "главный — подчиненный", обычно сушествуюшего между вызываюшей и вызываемой подпрограммами, вызываюшая и вызываемая сопрограммы равноправны.
Механизм управления сопрограммой часто называют моделью управления симметричными модулями. Действительное происхождение концепции управления симметричными модулями трудно определить. Одно из наиболее ранних опубликованных применений сопрограмм относилось к синтаксическому анализу (Сопжау, 1963). Первым языком высокого уровня, имевшим средства поддержки сопрограмм, был язык 81МОЕА 67. Напомним, что исходной целью языка ЯМ0ЕА было моделирование систем, часто требующее моделирования независимых процессов. Это стало причиной, по которой в языке 51МОЕА 67 были разработаны сопрограммы.
Другие языки, полдерживаюшне сопрограммы, — языки ВЕБЕР (%ц!Ге! а!., 1971), ПЧТЕйь(БР (Тебе)пзап, 1975) и Моди!а-2 (%1п)з, 1985). Сопрограммы имеют несколько входных точек, которые управляются самими сопрограммами. Онн также имеют средства поддержки своего состояния между вызовами. Это означает, что сопрограммы должны зависеть от своей предыстории и, следовательно, иметь статические локальные переменные. Повторные выполнения сопрограмм часто начинаются с точек, не совпадающих с их началом.
Вследствие этого процесс активации сопрограмм называется возобновлением (гезиае), а не вызовом. Сопрограммы обладают одним свойством подпрограмм: одновременно может выполняться только одна сопрограмма. Однако вместо выполнения операций вплоть до конца сопрограммы часто выполняются частично и передают управление другой сопрограмме. При повторной активации сопрограмма возобновляет выполнение с оператора, непосредственно следующего за точкой, из которой в предыдуший раз управление было передано в другую сопрограмму. Этот вид последовательности выполнения сопрограмм связан с особенностями работы многопроцессорных операционных систем. Даже при Глава 8. Подпрограммы . -зльзоваиии одного процессора в таких системах все выполняющиеся программы эа:хзются параллельно, совместно эксплуатируя ресурсы процессора.
При работе с со. -раммами такой вид выполнения программ иногда называют квазипараллельиостью. >оычно сопрограммы создаются в приложениях программным модулем, который на. -зется главным модулем (щаыег цпп) и не является сопрограммой. После своего соз..-,.я сопрограммы инициализируют свой код и возвращают управление в главный мо.; После создания всего семейства сопрограмм главный модуль возобновляет выпол..-ие одной из сопрограмм, а затем члены семейства сопрограмм возобновляют друг . - .
а в некотором порядке, пока их работа ие завершится, если она действительно может .-:ршиться. Если выполнение некоторой сопрограммы достигает конца ее кола, управ: —,м передается главному модулю, который ее создал. Это — механизм завершения . - г элнения набора сопрограмм по требованию. В некоторых программах сопрограммы ° . золияются, пока работает компьютер. х1олелирование карточной игры представляет собой пример задачи, которую можно ...ить с помощью некоторого набора сопрограмм. Предположим, что в игре участвуют .