М. В. Ломоносова Факультет вычислительной математики и кибернетики В. Г. Баула Введение в архитектуру ЭВМ и системы программирования Москва 2003 Предисловие Данная книга

Вид материалаКнига
Подобный материал:
1   ...   29   30   31   32   33   34   35   36   37
все модули, вызов которых возможен при счёте программы, может оказаться весьма трудоёмкой операцией. Дело в том, что эти модули могут, в принципе, находится где угодно, например, в сетевой (удалённой) библиотеке объектных модулей на другом конце Земли.

1 Точнее, как мы уже говорили, ищется объектный модуль, в котором расположена эта процедура.

1 Эта схема может быть неприемлема, например, для так называемых программ реального времени, которые предназначены для управления быстрыми внешними устройствами (ракетой, химическим или ядерным реактором и т.д.).

1 Как мы узнаем позже, на однопроцессорной ЭВМ в каждый момент времени компилируется только одна программа, но по сигналам прерывания от внутренних часов компьютера может производиться быстрое переключение с одной программы на другую, так что создаётся впечатление, что компилируются (хотя и более медленно) сразу несколько программ.

2 Макросредства могут использоваться также и в формальных языках, не являющихся языками программирования, но этот вопрос далеко выходит за рамки нашего курса.

1 В наших программах мы выделяли имена макрокоманд жирным шрифтом (finish,inint и т.д.), хотя это, конечно, не совсем правильно, так как это не служебные слова Макроасемблера.

2 Если у макрокоманды есть метка, то считается, что эта метка задаёт отдельное предложение Ассемблера, состоящее только из данной метки. Другими словами, макрокоманда с меткой:

<метка>[:]<имя макрокоманды> [<список фактических параметров>]

эквивалентна двум таким предложения Ассемблера:

<метка>[:]

<имя макрокоманды> [<список фактических параметров>]

1 Это несколько упрощённое описание действий Макропроцессора при передаче параметров, позже мы сделаем существенные уточнения.

1 Вообще говоря, на самом деле Макропроцессор и Ассемблер обрабатывают программу одновременно, предложение за предложением. Как мы вскоре узнаем, первыми каждое предложение обрабатывают специальные программы Ассемблера, которые называются лексическим и синтаксическим анализаторами, а затем, если нужно, это предложение обрабатывает Макропроцессор. Однако конечный этап компиляции – генерация объектного модуля – выполняется Ассемблером уже после полного завершения работы Макропроцессора.

1 Точнее, директива exitm производится выход вниз за ближайшую директиву endm, которая, как мы вскоре узнает, может задавать конец не только макроопределения, но и макроциклов. Таким образом, exitm прекращает обработку той части макроопределения, которая ограничена ближайшей вниз директивой endm.

2 Вообще говоря, во время компиляции стандартный вывод stdout должен быть связан с файлом листинга, а стандартный вывод об ошибках stderr – с экраном дисплея. Однако некоторые Ассемблеры (и среди них, к сожалению, MASM-4.0) могут во время компиляции связывать стандартный вывод stdout тоже с экраном, а вывод в листинг производить путём указания имени конкретного файла. В этом случае диагностика, заданная директивой %out в макрорасширение (и в листинг) не попадёт, а будет дважды выведена на экран.

3 Заметим, что в языках высокого уровня обычно есть далеко не все из рассматриваемых нами макросредств.

1 Для простоты наше макроопределение никогда не задаёт второй параметр макрокоманды outint – ширину поля для вывода целого числа.

1 В стандарте Паскаля можно попытаться сделать элементы массива записями с вариантами, в Турбо-Паскале – использовать так называемые безтиповые массивы. Однако во всех этих случаях, даже если не принимать во внимание отсутствие контроля и понижение надёжности программы, нам придётся передавать в функцию дополнительный параметр, задающий тип элемента массива, а внутри функции будет по-существу находиться оператор case, разветвляющий вычисление по разным типам данных. Не спасают здесь положение и объектно-ориентированные языки, всё равно придётся реализовать в программе несколько функций с одинаковым именем, компилятор лишь автоматически выберет одну из них, соответствующую типу элементов массива, переданного как фактический параметр.

1 Тот факт, что короткие алгоритмы иногда выгоднее реализовывать не в виде процедур и функций, а в виде макроопределений, нашёл отражение и при разработке языков высокого уровня. Так, в некоторых языках высокого уровня, существуют так называемые встраиваемые (inline) процедуры и функции, вызов которых во многом производится по тем же правилам, что и вызов макроопределений.

1 Термин транслятор обозначает программу-переводчика с одного языка на другой. Трансляторы делятся на компиляторы, которые переводят программу целиком, и интерпретаторы, которые выполняют построчный перевод и исполнение каждой переведённой строки программы. Хорошим аналогом является писменный (всего текста) и устный (синхронный, по одному предложению) перевод с иностранного языка.

2 Как вы узнаете из курса "Системное программное обеспечения" выдача листинга и аварийных диагностик производится на разные устройства – так называемое стандартное устройство вывода (stdout) и стандартное устройство для выдачи сообщений об ошибках (stderr).

3 В отличие от Паскаля, в Ассемблере нет стандартных имён (напомним, что стандартное имя имело заранее определённый смысл, но эти имена можно было переопределить).

1 Здесь надо сказать, что компилятор не предполагает глубокого знание программистом теории компиляции, поэтому в дистинге такие ошибки называются общим термином "синтаксические ошибки", хотя, как мы узнаем немного позже, "настоящие" синтаксические ошибки определяются другой частью компилятора – синтаксическим анализатором.

1 Исключением из этого правила, как мы знаем, являются имена сегментов и имена процедур, которые должны встретиться в поле метки два раза.

2 Эти программы могут присутствовать в оперативной памяти не целиком. Во-первых, они могут использовать схему динамической загрузки, и, во-вторых, работать на так называемой виртуальной памяти, при этом некоторые части программы могут временно отсутствовать в оперативной памяти.

3 На ЭВМ первых поколений пользователям разрешалось писать свои собственные процедуры-обработчи­ки прерываний, однако в операционных системах современных ЭВМ это, как правило, запрещено. Причина такого запрета будет понятна из нашего дальнейшего изложения мультипрограммного режима работы ЭВМ.

1 Даже если не принимать во внимание "вредных" программистов, которые специально захотят испортить или незаконно прочитать данные других программ, всегда существуют вероятность таких действий из-за ошибок в программах даже у "добропорядочных" программистов.

2 В архитектуре нашего компьютера регистр режима работы содержит два разряда и может принимать значения 0,1,2 и 3. Практически всегда, однако, используются только два из этих четырёх значений (0 и 3).

1 Способы задания таких полномочий Вы будете изучать в следующем семестре на примере операционной системы Unix.

1 Конечно, существуют привилегированные команды для работы с кэшем как с единым целым, это, например, команда очистки кэша от всех команд и данных.

2 Как видно из этого алгоритма работы кэша, от весьма "болезненно" реагирует на прерывания, так как при этом производится переключение на другую программу, и данные в кэше необходимо полностью сменить.

3 За одно обращение из памяти теперь читается не одна команда, а в среднем две последовательные команды, поэтому можно считать, что среднее время выполнения команды будет ещё меньше: 1+2+2=5 нс.

1 Такие компиляторы называются оптимизирующими компиляторами, оптимизация на машинном языке выполняется обычно на одном или нескольких дополнительных проходах программы перед получением объектного модуля.

2 На супер-ЭВМ для этих целей обработку большинства прерываний обычно поручают одному из каналов ввода/вывода (периферийных процессоров), что позволяет не прерывать работу конвейера центрального процессора. Архитектуру ЭВМ с каналами ввода/вывода мы будем изучать далее.

1 Это яркий пример того, как макросредства повышают уровень языка: макрокоманда вывода символа оказываеся для Петрова по внешнему виду (если отвечься от деталей синтаксиса), очень похожа на соответствующие операторы языков высокого уровня.

1 Предполагается, что компьютер работает в простейшем (как говорят, незащищённом) режиме.

2 Мы рассматриваем, естественно, работу дисплея только в стандартном текстовом режиме.

1 Естественно, что немедленное продолжение выполнения программы пользователя возможно только в том случае, если ей не требуется сразу обрабатывать данные, которые должен предоставить канал. Например, если программа обратиласть к каналу для чтения массива с диска в свою оперативную память, и пожелает тут же начать суммировать элементы этого массива, то такая программа будет переведена в состояние ожидания, пока канал не закончит чтения заказанного массива в память. Аналогично программа будет переведена в состояние ожидания, если она обратиласть к каналу для записи некоторого своего массива из оперативной памяти на диск, и пожелала тут же начать присваивать элементам этого массива новые значения. Эти примеры, в частности, показывают, насколько усложняются большинство программ операционой системы в архитектуре с каналами ввода/вывода.

1 Для полноты классификации можно упомянуть и архитектуру МКОД (MISD), при этом один поток данных обрабатывается многими потоками команд. В качестве примера можно привести специализированную ЭВМ, управляющую движением самолётов над аэропортом. В этой ЭВМ один поток данных от аэродромного радиолокатора обрабатывается многими параллельно работающими процессорами, каждый из которых следит за безопасностью полёта одного закреплённого за ним самолёта, давая ему при необходимости команды на изменение курса, чтобы предотвратить столкновение с другими самолётами. С другой стороны, однако, можно считать, что каждый процессор обрабатывает свою копию общих данных и рассматривать это как частный случай архитектуры МКМД.