lekcii2 (522346), страница 5
Текст из файла (страница 5)
Абсолютная вычислимость в машине фон Неймана заменена частичной. Вычислимым по фон Нейману считается все то, что может быть получено за прил млемое время на доступных ресурсах памяти и, весьма часто, в пределах ограниченного бю,чжета имек>щихся средств. В настоящее время ълашина фон Неймана уже не имеет чисто аппаратных ассоциаций. Она чаще всего предоставляется программисту в виде многослойной надстройки 118 программных средств ~22~, последним из которых является языковый пропессор высокого уровня. 119 Глава 3 Концепция языка программирования для машины фон Неймана Лекция 16 3.1 Элементы дейкстровской нотации 3.1.1 Требования к структуре программ для машины фон Нейма- на Машина фон Неймана состоит из управляющего устройства, включающего управляющую нрограмллу и микропрглрамгиы операций машины, памяти и регистров.
Для обеспечения работы машины фон Неймана необходимо поместить в ее память следующие объекты: программу, таблицу имен и все данные, которые должна обработать программа. Каждый об ьект размещается в одной или нескольких ячейках памяти и, следова.е.ьноо, связывается с определенными адресами памяти. Мы сконструировали память машины фон Неймана как хранилище произвольных слов без какой-либо интерпретации. Это означает, что ответственность за правильное использование слов лежит па программисте. Именно он должен позаботиться о том, чтобы слова с программой и с данными не были бы перепутаны, т, е. чтобы данные ошибочно нс трактовались как программа, и наоборот.
также необходимо следить за правильной интерпретацией слов данных. Слово, содержаьцее целую единицу, при непосредственном выводе не даст изображения единицы (знак '1'). В соответствии с одним из принципов фон Неймана, программа и данные помещаются в одном и том жс устройстве памяти. И только на регистрах процессора слова с командами программы и данными существенно различаются. Этот принцип позволил упростить конструкцию первых ЭВМ и был назван принстонской архитектурой по названию университета, где работал фон Нейман, Кроме простоты реализации принстонская архитектура позволила немедленно выполнять только что сгенерированнук> в памяти программу, которая еще мгновение назад была выходными данными другой программы, облегчив тем самым построение операционных систем, систем программирования и отладчиков.
Недостатком принстонской архитектуры является ее небезонасность, поскольку этими же возкюжностями могут воспользоваться вирусы, трояны и прочие программные паразиты. Альтернативная гарвардская архитектура, основана на раздельной реализации памяти для 120 прОГрамм и памяти для даннеях., что пОВышае'1' безОпаснОсть ценОй дополнитсле~ных (ЕИ- паратурных затрат. Таблица имен, программа и данные могут быль записаны в виде, непосредственно переносимом в память машины. При этом все заботы об установлении соответствия между именами и адресами, размещении да,нных в памяти, определении начальных значений некоторых данных полностьн> ложатся на программиста. Процесс составления таблицы имен и размещения данных в памяти маслины может быть автоматизирован.
Необходимая для этого информация обычно содержится в тексте программы. Для полнс>й автоматизапии процесса реп>ения текст программы должен быть дополнен информацией о том, каким процессором должны быть обработаны эти данные, так как операции машины фон Неймана определены над данными, допустимыми соответствующими процессорами. Следовательно, возможна система программирования, в которой составление таблицы имен и размещение данных в памяти машины выполняются автоматически некоторой специальной программой. Для упрощения процесса составления таблицы имен имеющуюся в каждой программе обработки данных информацию о свойствах ооьектов будем в явном виде помещать в начало программы.
Эта информация, в частности, позволяет назначить процессор для обработки поименованного объекта программы. Каждый объект, используемый для полу (ения значений других объектов при выполнении программы обраоотки данных, должен иметь определенное значение, отличное от Обьекты программы, как правило, получают свои значения в результатс, вычислений над другими обьектами, ранее заданными в тексте программы.
Из этого следует, что могут существовать обьекты, которые должны получить значения до начала выполнения программы. Началы(ые значения таких объектов могут быть заданы либо при размещении их в пал(яти машины (инициализация самоопределенными константами (в Паскале и Си) и значениями по умолчанин> (в Си)), .либо путем выполнения инструкций ввода данных.
Кроме того, некоторые компиляторы автоматически инициализируют память, выделяемую переменным, нулями, пробелами или шрами, Инструкции ввода данных могут, в принципе, содержаться в лн>бом месте текста, программы. Однако важно, чтобы определение нача>>ьен~>х значений объектов логически предшествовало их использованию для получения значений друтих объектов. В противном случас( вес вычисления, послс>довавшие за употреблением неопрсделенного значения, будут некорректными и, следовательно., нс должны выполняться.
Рассмотрим средства описания объектов программы и с>пределсния начальных значений нс которых из них. Языки программирования Паскаль и Си требун>т обязательного описания всех объектов, кроме предопределенных. ~аг 1, 1, 1(: 1ПФедег; Языки Бейсик и Фортран с самого начала были ориентированы на употребление неописанных скалярных объектов; процессор для обработки таких обьектов выбирался компилятором исходя из контекста или по умолчанию (правило первой буквы). Одним из способов задания начальных значений обьектов является их инициализация непосредственно в тексте программы самоопределенпыми термами словами, изображающими конкретные зна (ения, допустимые соответствующими процессорами.
121 сопв$ 1п$1 -- О, 1 О, 1~ 0; сопв$1 0; 1 --0; 1с 0; или 1п$1 0,) О, 1с О; айаг 1, .1, .1с: 1пФекег; 0; о; 1с:-- 0; Вспомним также, что данные в памяти машины фон Неймана непосредственно недоступныы восп1п1ятию ~еловском (та.кое представление будем для к1заткости пазы~ать вя ршренним). Для непосредствонного использования данных необходимо преобразовать их во свис'шнсе вредставлеяие.
Процесс преобразования внутреннего представления информации во внешнее представление и реализацию этого внешнего представления на доступном для человека носителе (например, печать на листе бумаги или изображение на экране монитора) будем называть вьсводол данны. В результате вывода данные преобразуются в форму текстовых, графических, звуковых или иных сообщений, непосредственно доступных органам чувств человека. Для указания необходимого вывода данных в языке описания программ имеются специальные инструкции (инструкции вывода). Инструкции вывода данных могут, в принципе, так же как и инструкции ввода данных, содержаться в любом месте текста программы.
Однако важно, чтобы гюлучение значений обьектов (как результат обработки данных) логически предшествовало их выводу. Инструкции вывода также будут рассмотрены позже. Таким образом, программа для машины фон Неймана представляет собой текст, обязательно включающий в себя инструкции описания объектов (данных. которые обраба; тывает программа), инструкции ввода данных (они могут отсутствовать, если необходимые для вычислений начальные значения объекты получают при размещении их в памяти машины), инструкции обработки данных и инструкции вывода значений объсктоврезультатов.
В данном разделе мы рассмотрим простые программы, которые в своем большинстве име1от структуру, представленную на следующей схеме. 122 Символы НАЧАЛО и КОПЕЦ указывают начало и конец текста программы и границы действия описаний и обьектов. 3.1.2 Обобщенная инструкция присваивания Согласно одному из принципов фон Неймана вычислительная машина должна осуществлять покомандную обработку данных. Операнды каждой команды вызываются на регистры из памяти., после чего эта команда выполняет необходимое действие пад ними, оставляя результат также на регистрах. Для сохранения результата он должен быть скопирован в память, поскольку регистры требуются для следующей команды.
Поэтому программная версия машины фон Неймана должна содержать аналог цепочки «загрузка операндов выполнение команды сохранение результата». В любом языке программирования фон Неймановского типа основной элементарной инструкписй обработки данных является инст1Екйил. трнсооинпнпя.. .которая и является таким аналогом. Инструкция присваива; ния имеет вид Х: — А; где символ: = является знаком присваивания: Х обозначает имя объекта (простой, ипдексированной или квалифицированной переменной, либо, иногда, массива), а выражение, задающее последовательность действий над операндами. В языке Си все, что может стоять в леьой части приваивапия, называется Ьи1не. В простейшем случае, когда Х и А простые переменные или константы, действие инструкции присваивания сводится к перезагрузке значения переменной А в переменную Х через регистр.
В явном виде это выражается так Х:= АДР(РИМ(АЯ что имеет следующий императивный смысл: сделать адрес объекта с именем Х адресом значения обьекта А. Графически выполнение инструкции присваивания в этом случае можно изобразить так (здесь и далее на схемах запись Х означает имя объекта, а запись <Х> -- значение объекта с именем Х): ПАМЯТЬ РКГИСтРЫ Значение <А> переменной с именем А из памяти машины сначала переносится (копируется) на свободный регистр, а затем с регистра копируется в ячейку памяти, сопоставленную с именем Х. Переменная А должна иметь определенное значение; применение функции РИМ к неопределенному значению ь должно приводить к отказу машины (исключительной ситуации выполнения программы~.
На практике одним из либерализмов фон Неймана стало отсутствие проверки на неопределенность как на аппаратном, так и на программном уровнях. Это было сделано для обеспечения быстроты исполнения программы, ответственность за корректность использования датшых перекладывалась па программиста. Действительно, аппаратная поддержка даже одного дополнительного бита определенности значения многобайтового машинного слова усложняла бы оборудование и замедляла бы выполнение программ не на несколько процентов, как могло бы казаться, а в несколько раз. Чисто программная поддержка проверки неопределенности значений используется некоторыми компиляторами для предварительной инициализации неопределенными начальными значениями, которые вылавливаются в процессе выполнения программы специально расставленными контрольными инструкциями. В резульгате выполнение программы существенно замедляется и становится фактически интерпретативным.
Обьем программы также существенно возрастает. Кроме того, гюд неопределенное значение приходится занимать одну из допустимых кодовых комбинаций слова, что тоже не есть хорошо. 8 некоторых случаях цена та,кого контроля является оправданной. В частности, Паскаль-компиляторы обычно имеют ключи типа. — С, .задающие такого рода проверки. Указанный порядок выполнения инструкции присваивания определяется требованием нормированного выполнения вычислений.
Рассмотрим более общий случай инструкции п1п1сваивания, когда А — выражение. Если это выражение содержит одну операция> машины фон Неймана с необходимыми операндами, то инструкция присваивания в точности повторяет вышеописанный порядок выполсния одиночной машинной операции. Н программных версиях ма|пины фон Неймана обычно позволяется строить более сложные, аналогичные математическим, выраэкения. Эти выражения содержат целые последовательности операций и, как правило, снабжены скобочными структурами. Пусть, например, выражение в правой части имеет вид В э С + В и Х вЂ” - имя объекта, получающего значение результата вычисления выражения.