Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Стили и методы программирования. Учебное пособие для СПО

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
быть достигнута. В типичной ситуации в поле зрения имеются также данные, необходимые для достижения цели, в простейшем случае таких данных не нужно. Вызывается стандартная функция, которая печатает строку и исчезает. Недостигнутых целей более не остается, программа завершает работу.
На этом примере можно заметить общие черты языков Prolog и Рефал. Оба они имеют дело сразу со сложными данными и не связаны напрямую с физическим строением машинной памяти.
Мы видим, что действия, предписываемые языком, совершенно по­разному достигают одних и тех же целей. С чем это связано? Каждый язык определяет свою модель вычислений. Иногда эти модели довольно близки, несмотря на существенные различия в изобразительных средствах языков. Для таких языков программист, по существу, пишет одно и то же, и функции систем программирования близки. Различия в оформлении связаны, в частности, с тем, как соотносится программа с ее окружением и как задаются общие для всех программ действия. Именно поэтому мы внесли наиболее распространенные языки, имеющих близкие модели вычислений, в список традиционных языков.
Существенные различия моделей вычислений возникают в случае разного устройства данных, с которыми работают программы (сравните, например, C и Рефал). Но стоит помнить, что одна и та же модель вычислений на разных вычислительных машинах и в разных операционных средах реализуется по-разному. Могут быть различны разрядные сетки, способы представления чисел и способы вызова процедур. Пожалуй, учет операционной среды для переносимости программного обеспечения осуществлен лишь в языке Ada, который является стандартом для Министерства обороны США.
1)
Конечно же, и здесь могут быть исключения, но это верно
практически для всех так называемых языков высокого уровня
2)
В литературе и в обыденной речи программистов все время допускается двусмысленность. Программа - с одной стороны, то, что исполняется машиной, но практически никогда не читаемое и не исправляемое человеком (просматривать и корректировать файл
program.exe будут лишь законченный хакер либо человек, у которого
не остается другого выхода); с другой стороны, структура, которая
Стили и методы программированияНепейвода Н.Н.
11
понятна и человеку, и машине ( program.cpp ). В данной книге программа понимается лишь во втором смысле, файл program.exe называется исполняемый код либо машинная программа.
3)
Мы специально не воспользовались здесь расширениями, предлагаемыми, например, Delphi, чтобы четко представить разницу между эталонным, или стандартным, языком и его диалектами. Диалекты существуют лишь в контексте данной машины и транслятора .
Стили и методы программированияНепейвода Н.Н.
12
Модели вычислений
Традиционная архитектура вычислительных машин. Первое понятие о стилях программирования. Модификации традиционной архитектуры. Нетрадиционные архитектуры. Сети данных и параллелизм. Эмуляция и машина программы.
Традиционная модель
Из материалов предыдущего раздела видно, что подходы к решению программистских задач при использовании различных языков отличаются друг от друга. Иногда эти различия непринципиальны и сводятся лишь к текстовому представлению программы, а иногда они довольно существенны. Если различия непринципиальны, то мы говорим, что языки имеют сходную модель вычислений.
Модель вычислений языка не обязательно совпадает с моделью вычислений, заложенной в оборудование. Эти модели расходятся, если сама машина имеет традиционную архитектуру. Более того, даже машины другой архитектуры программно моделируются на машинах традиционной архитектуры. В дальнейшем мы будем пользоваться термином традиционные языки, понимая под этим языки, модель вычислений которых унаследована от традиционной архитектуры
машин. Архитектура, впервые использованная Конрадом фон Цузе
1)
еще на рубеже 30-40-х гг. XX в., в несколько модифицированной форме до сих пор принята почти для всех вычислительных машин.
В этой архитектуре вычислительной системы имеются следующие три элемента:
1. Память,предназначенная для хранения произвольных значений. Значения на аппаратном уровне представляются как последовательности битов.
2. Процессор, способный выполнять команды, т. е. интерпретировать последовательности битов как инструкции для активизации предписываемых этими инструкциями действий.
3. Управляющее устройство, способное указывать команды, которые должен выполнять процессор (иногда управляющее устройство
Стили и методы программированияНепейвода Н.Н.
13
рассматривается как составная часть процессора).
Эти элементы обладают следующими особенностями.
1. Однородность памяти. Память машины рассматривается как вектор, состоящий из одинаковых ячеек, способных принимать (от процессора) любые значения.
Значение в ячейке, с точки зрения процессора, является последовательностью битов фиксированной длины без каких бы то ни было ограничений.
2. Линейная адресация. Ячейки памяти идентифицируются адресами: числами от нуля до максимально возможной для данной машины величины (обозначающей последнюю ячейку). Адреса служат указателями для процессора, откуда следует извлекать или куда помещать значение.
Из однородности памяти следует, что команды и данные (перерабатываемые значения) располагаются в единой общей памяти и одинаково адресуются.
3. Пассивность памяти. Ячейка памяти всегда содержит какое-то значение. Полученное ячейкой значение не может быть изменено иначе как при выполнении специальной команды процессора, предназначенной для этого действия, - команды засылки, или присваивания, значения. Изменяемая ячейка указывается своим адресом.
4. Активность процессора. Процессор всегда выполняет некоторую команду, закодированную последовательностью битов в ячейке и извлеченную из памяти. Команды могут иметь операнды, т. е. в них, как правило, указываются адреса ячеек, над которыми выполняются предписываемые действия. Именно процессор, в соответствии с тем, какую команду он должен выполнить, интерпретирует значение ячейки-операнда как число, символ, адрес в памяти и др. Число операндов команды называется ее адресностью, а адресность большинства команд - адресностью машины. Различаются одно-, двух- и (в настоящее время реже) трехадресные машины, а также машины с нефиксированной
Стили и методы программированияНепейвода Н.Н.
14
адресностью.
5. Централизация управления. Управляющее устройство содержит адрес команды, назначаемой для выполнения процессором. Если эта команда является командой передачи управления, при ее выполнении определяется адрес ячейки, содержащей команду, которая должна выполняться после текущей, и этот адрес становится новым содержимым устройства управления. В противном случае адрес команды, назначаемой процессором для выполнения следующей, есть текущее содержимое устройства управления, увеличиваемое на единицу (очередная выполняемая команда содержится в ячейке памяти, следующей за текущей). Таким образом, управляющее устройство можно моделировать как регистр, называемый счетчиком команд. Этот регистр модифицируется автоматически либо командами передачи
управления
2)
.
6. Наличие канала связи между памятью и процессором. Для передачи данных или команд между памятью и процессором используется специальное оборудование, называемое каналом связи. Работа канала осуществляется в случаях, когда требуется:
1. подать очередную команду процессору для выполнения (активизируется управляющим устройством);
2. получить операнды для выполнения команды (активизируется процессором);
3. изменить значение ячейки при выполнении команды (активизируется процессором).
Такую архитектуру будем называть традиционной.
Традиционная архитектура машины конкретизируется для соответствующей среды применения. В частности, она всегда дополняется устройствами ввода и вывода данных.
На рис. 2.1
показано взаимодействие устройств традиционной машины.
Стили и методы программированияНепейвода Н.Н.
15
Рис. 2.1. Схема выполнения двухадресной команды на машине традиционной архитектуры
В команде КО1О2 К — код операции, O1 и O2 — адреса операндов. Команда размещена по адресу 3. Сплошными стрелками отмечена
передача информации по каналу. Пунктирные стрелки обозначают действия, которые осуществляются непосредственно до исполнения команды (запрос кода команды по адресу 3) и после нее (указание на необходимость запроса команды, следующей в памяти за исполняемой).
Традиционная архитектура ЭВМ сформировалась в условиях ненадежности физических элементов. В частности, по этой причине выбран довольно примитивный способ управления: переход к следующей команде или к команде по принудительно задаваемому адресу. А в дальнейшем, несмотря на появление качественно новой элементной базы, стремительный рост производства машин такого типа препятствовал смене архитектуры.
Есть причина, из-за которой увеличение эффективности традиционных машин принципиально ограничено. Повышение быстродействия процессора как активного элемента оборудования приводит к росту
Стили и методы программированияНепейвода Н.Н.
16
скорости счета лишь в пределах, определяемых скоростью канала связи между процессором и памятью: если она невысока, то процессор будет простаивать, ожидая очередной команды, операндов или окончания
выполнения присваивания
3)
. Темпы роста скорости процессора выше,
чем у канала связи.
На эти принципиально непреодолимые ограничения классической модели вычислений указал Бэкус еще в середине семидесятых годов (Тьюринговская лекция Бэкуса [35]
), назвав канал связи памяти с процессором узким местом (буквально bottleneck ) традиционной модели.
Традиционная архитектура машин менее всего связана с конкретным классом решаемых задач. Она скорее связана с двумя наиболее распространенными и наиболее низкоуровневыми стилями программирования: структурным и автоматным программированием.
Под стилем программирования мы понимаем внутренне концептуально согласованную совокупность средств, базирующуюся на некоторой логике построения программ. Теоретические исследования последних десятилетий показали, что различным классам задач и методов соответствуют различные логики построения программ, и эти логики несовместимы друг с другом. Логики (и, соответственно, стили программирования) дают самую общую оболочку, не зависящую от конкретных предметных областей и даже от конкретных методов. Как только мы уясняем себе особенности методов, стили начинают конкретизироваться далее. Так, известный Вам (поскольку именно он преподается в качестве единственно существующего во всех современных учебных пособиях по началам программирования) структурный стиль конкретизируется в циклический либо рекурсивный варианты (ипостаси).
Для разных стилей логики построения несовместимы, поэтому прежде чем обсуждать стили в системе, мы познакомимся с примерами реализации различных стилей. Но еще до этого целесообразно рассмотреть другие архитектуры машин.
Модификации традиционной архитектуры
Стили и методы программированияНепейвода Н.Н.
17
После того, как выяснилось, что традиционная архитектура препятствует повышению производительности, она стала изменяться. Ниже приведены самые распространенные ее модификации:
1. Вводятся ячейки внутри процессора со специальной адресацией, не требующие обращения к памяти. С их помощью можно уменьшать адресность команд машины, передавать промежуточные результаты вычислений от команды к команде, выполнять иные локальные действия. Они называются быстрыми регистрами процессора.
2. Появляются команды, кодирующие довольно сложные действия над операндами.
3. Процессор снабжается памятью для команд ( кэш команд ) и для данных ( кэш данных ). Кэш команд заполняется одновременно с выполнением текущей команды теми командами, которые, как кажется процессору, будут выполняться после текущей. В кэш данных дублируются значения, которые, как кажется процессору, будут операндами следующих команд.
4. Память разбивается по уровням доступа: регистры процессора; область быстрого доступа с непосредственной адресацией; область, адресация которой требует предварительного указания некоторого сегмента, ячейки которого адресуются непосредственно, и т. д.
Полезность подобных модификаций очевидна. Но кэширование, прочие изменения классической канонической модели, и даже многопроцессорность, - это лишь полумеры, позволяющие расширить, но никак не ликвидировать узкое место.
Внимание!
Важным следствием традиционной структуры компьютера является следующее: в машинной программе все действия и условия локальны.
Для повышения эффективности в оборудовании порой отказываются от принципа однородности памяти. Упомянем две архитектурные модификации традиционной машины.
В некоторых (в первую очередь специализированных) машинах
Стили и методы программированияНепейвода Н.Н.
18
предусмотрено явное выделение в памяти областей данных и областей команд. В обычном режиме выполнения программ процессору не разрешается записывать что-либо в область команд, в результате повышается надежность программ. Для записи чего-либо в область
команд нужно аппаратно включить соответствующий режим
4)
.
Но разделение между командами и данными достаточно грубое. Полезно рассмотреть архитектуру, в которой предлагается так называемое тегирование. Смысл его заключается в том, что в ячейках (основной памяти) выделены специальные разряды, именуемые тегом, которые указывают тип хранимого в остальной части значения (см. рис.
2.2).
Рис. 2.2. Структура ячейки при тегировании
Тегирование, реализованное аппаратно, дает следующие преимущества.
На аппаратном уровне происходит дополнительный контроль корректности вычислений и улучшается диагностика ошибок. Элементарные операции становятся более адекватными данным (например, сложение модифицируется в соответствии с типами операндов: целые, действительные, ссылки). Время выполнения программ сокращается по сравнению с традиционными машинами соответствующей мощности.
В языковых терминах тегирование выражается как динамическая (определяемая при выполнении программы) типизация данных. В этом отношении тегирование в аппаратуре лет на десять опередило первые экспериментальные попытки динамической типизации в языках программирования. Сейчас динамическая типизация, с логической точки зрения полностью аналогичная тегированию, является одним из инструментов объектно-ориентированного программирования.
Стили и методы программированияНепейвода Н.Н.
19
В языке C тегированное данное соответствует описанию структуры, подобному этому:
struct tagged { int type_tag; union { int x; float y; } }
В языке Pascal тегированная ячейка может быть представлена следующей вариантной структурой:
record case tag : Boolean of true: (i :integer); false: (r :real) end;
Тегирование великолепно сочетается со структурным программированием, и поэтому практически всегда используется вместе с модификацией адресации и структуры памяти, называемой стековой архитектурой. При реализации языков высокого уровня на современных системах программирования практически всегда создается структура контекстов.
В стековой архитектуре машины уже физическая память организована как структурированный стек контекстов (см. рис. 2.3
).
Стили и методы программированияНепейвода Н.Н.
20