Текст
                    . -м-
\
эна:>
m-e§?mm-s22 т-ш -т-ъятт
ш —ш


йй Ф К. Фути, Н. Судзукм Языки программирования» и схемотехника СБИС Перевод с японского канд. техн. наук А. С. Чупахина под редакцией д-ра техн. наук А. Б. Фролова
ББК 32.973 Ф96 УДК 681.3 V@ М :■■ . V4* Фути К., Судзуки Н. Ф 96 Языки программирования и схемотехника СБИС: Пер. о япон. — М.: Мир, 1988. — 224 с, ил. ISBN 5—03—000399—1 Квига является переводом седьмого тома П-томной серии по микроэлектро- микроэлектронике, написанной видными японскими специалистами. Оиа посвящена созданию системного программного обеспечения ЭВМ пятого поколения с использованием элементов искусственного интеллекта. Особое внимание уделено сопоставлению языков логического программирования Лисп, Пролог с новым языком, близким к языку объектио-ориеитированного типа. Реализация языка рассмотрена на уров- уровнях архитектуры виртуальной Смолток-машины н микропрограмм. Описаны также СБИС, реализующие эти микропрограммы. Для научных работников и инженеров, создающих информационно-программ- информационно-программное обеспечение, а также студентов, специализирующихся в области вычислитель- вычислительно! шинки. Редакция литературы по информатике и робототехнике ISBN Б—03—000399—1 (русск.) © Кадзухиро Фути, Норихиса Судзуки. Iwanami Shoten, Publishers, Tokyo, 1985 ISBN 4—00—010187—0 (японск.) © перевод на русский язык, «Мир», 1988
, ... Предисловие редактора перевода В настоящее время методология математического моделирова- моделирования распространяется на сферы проектирования, обучения и управления. Необходимы математические модели объектов, имеющих сложную структуру, и методы принятия решений на их основе. Универсальные технические и программные средства, созданные для решения задач численного характера, оказыва- оказываются малопригодными для представления и обработки моделей. В связи с этим возрастает интерес к моделям и методам дис- дискретной математики и математической логики. Неизбежность участия человека в принятии решений требует создания эффек- эффективных диалоговых систем реализации вычислительного экспе- эксперимента, удобных средств формирования, изменения и анализа моделей сложных систем. Пользователь должен иметь возмож- возможность, обращаясь к модели, указывать, что следует получить, не заботясь о том, как это сделать; нужные методы и алгоритмы должны выбираться автоматически. Эту возможность предостав- предоставляют создаваемые в последнее время так называемые объектно- ориентированные языки программирования. Программная еди- единица такого языка является математическим представлением объекта, т. е. моделью, и включает описание математических методов ее преобразования и анализа. Реализация объектно-ориентированных языков с использо- использованием учитывающих их особенности аппаратных средств, а также специализированных рабочих мест программиста поз- позволяет существенно повысить производительность труда как программистов, так и пользователей. Поэтому в нашей стране и за рубежом в качестве одного из направлений современного программирования развивается концептуальное, или объектно- ориентированное, программирование. Его актуальность возра- возрастает с расширением производства персональных компьютеров. Представление и обработка знаний — одна из проблем, ре- решаемых в Японии по программе создания ЭВМ пятого поколе- поколения. Новый подход к программированию (от объекта, а не от ЭВМ, на которой реализуется программа) потребовал и нового подхода к разработке технических средств, а именно, к созда- созданию машины, учитывающей особенности объектно-ориентиро- объектно-ориентированного языка и обеспечивающей необходимое быстродействие при организации диалога с пользователем.
6 Предисловие редактора перевода В предлагаемой советскому читателю книге на примере объ- объектно-ориентированного языка Смолток-80 показан современный подход к реализации подобных языков с использованием сверх- сверхбольших интегральных схем. Особую ценность при этом имеют гл. 3—5. Первые две главы являются энциклопедическим введени- введением в современное программирование. Здесь рассмотрено множест- множество характерных идей и подходов, дана характеристика многих языков программирования и приведены примеры их использова- использования для решения задач представления и обработки знаний. При- Примечания редактора и переводчика отсылают читателя к работам, где соответствующие понятия рассматриваются более подробно. Данная книга входит в цикл учебных пособий и убедительно демонстрирует системным программистам необходимость овла- овладения схемотехникой и даже физикой сверхбольших интеграль- интегральных схем, а специалистам по микроэлектронике — методологией современного программирования. Как те, так и другие должны знать модели и методы дискретной математики и математиче- математической логики. К сожалению, математический аппарат в книге представлен лишь отдельными определениями и примерами. Методология параллельных вычислений, функционального, логического и объектно-ориентированного программирования развивается и в нашей стране. Из отечественных реализаций языков программирования, используемых в системах представ- представления знаний, следует отметить реализацию Лиспа на БЭСМ-6 и на ЕС ЭВМ, а также реализации FRL/Лисп. Последние включают в себя элементы объектно-ориентированного про- программирования. В СССР создан и реализован язык концепту- концептуального программирования Утопист. Настоящая книга будет полезна широкому кругу читателей, желающих ознакомиться с проблематикой современного про- программирования. Специалисты же получают представление об одном из перспективных языков Смолток-80 и методе его реа- реализации с использованием средств микроэлектроники. ;,_ ;,..,,■ - . __,} ( (, А. Б. ФРОЛОВ "~<>Т"- H,8t, ■ " \ :•• г fir C.^i.OOJ •- . i Hi t-Ч к '.н. ''f>4 .
Предисловие Микроэлектронику можно определить как технологию "впека- "впекания" разнообразных функций переработки информации в по- поверхность миниатюрных чипов. Уже сейчас предложено множе- множество разнообразных функциональных микросхем, в первую оче- очередь микропроцессоров, выполняющих функции вычислительных машин. Однако все это-—лишь начало новой эпохи. По мере своего развития микроэлектроника вырастет в одну из основных отраслей технологии, на которую будет опираться все обще- общество. Современный период развития микроэлектроники знаме- знаменует собой начало эпохи микроаппаратов. При этом наряду с развитием технологии изготовления са- самих микросхем важным является ответ на вопрос: какими функ- функциями наделить эти микросхемы? До сих пор функции перера- переработки информации реализовывались главным образом путем создания программного обеспечения для уже имеющихся уни- универсальных вычислительных машин. Такое разделение труда от- отражало существующий уровень развития технологии производ- производства элементов, реализующих встроенные структуры, и основы- основывалось на ограничениях, накладываемых современным уровнем производства. Значительное повышение функционального уров- уровня встроенных структур должно оказать существенное влияние на распределение функций между программным и аппаратным обеспечением. Уже начинается новый этап: образно говоря, про- программное обеспечение начинает "рельефно обозначаться". Современная методика построения программного обеспече- обеспечения не должна быть достоянием лишь узкого круга программи- программистов, а ее обязаны унаследовать специалисты в области микро- микроэлектроники. Конечно, понятия, используемые в программиро- программировании, должны претерпеть значительные изменения, прежде чем они войдут в обиход специалистов по аппаратному обеспечению. Эти понятия должны пережить второе рождение с учетом тех новых возможностей, которые предоставляют современные ап- аппаратные средства. Существующая методика построения про- программного обеспечения должна послужить основой для выра- выработки новой многообещающей методики. Данная книга как раз и призвана помочь подготовке к выработке такой методики. Гл. 1 и 2 знакомят читателя с основными понятиями совре- современной теории программирования. На современном этапе эти понятия вряд ли освоены до конца, однако авторы надеются,
8 Предисловие что предложенный материал отражает общую картину теоре- теоретических основ программирования и сможет служить руковод- руководством к действию. В гл. 1 рассмотрены концептуальные машины, причем глав- главное место занимает выработка методики программирования пу- путем развития "снизу вверх". В гл. 2, наоборот, главное место занимают понятия, связанные с программированием "сверху вниз", т. е. понятия, возникающие при рассмотрении структур задач и структур знаний. Разумеется, эти два типа понятий тес- тесно связаны между собой, и в будущем появятся новые связи, которые прояснят подход к построению машин нового типа. В гл. 3—5 описывается один из путей аппаратной реализа- реализации программного обеспечения. В качестве одного из объектно- ориентированных языков программирования рассматривается язык Смолток. Подробно освещен ряд вопросов, вплоть до соз- создания конструкции Смолток-машины, реализующей язык высо- высокого уровня. Это — один из практических примеров исследова- исследования перспективных методов реализации языков на основе апна- ратного обеспечения. Его можно считать одним из примеров связи практики с теорией, изложенной в гл. 1 и 2. Авторы надеются, что материал, изложенный в данной книге, связан с идеями, развиваемыми в других томах данного курса лекций. Гл. 1, 2 написаны К. Фути, гл. 3—5 — Н. Судзуки. Кроме того, большую помощь при написании ряда разделов оказали Масакио Оути [разд. 1.25, 2.3 и 2.4], Курогава Тосиаки [разд. 1.1 и 1.2 (за исключением 1.2.5)] и Миядзаки Сюкей (разд. 2.2). Авторы выражают благодарность профессору Мотоока Ита- ру и редакционному отделу издательства «Иванами» за внима- внимание и поддержку, оказанные при издании книги. Кадзухцро Фути Норихиса Судзуки ib 1988 а ■■ у, Г. М '.!■, ; \ t~<' I i ! Н ' '■ ' '.">:.■ V !■ ■ .' ■К/.:Ь~. ;■ к, -,...■: •■*■■■ • ■• ■ .'■-■': *".' •"*■.' Л'СИНи: П: ' д-1.!' z~'t : ;Vui ,-'П .■••.л-.-' ■•, ^ '.-ли -{;■.:, F. и н на-' .•л.лОО ЗТЭОИЖ -'■' Т ,! !. •р вш1 ) o';Oi. Гювои ■ SHSSf- ':; ц ' . tt'i ' ' ■■ V у. ['■l f. 1 '1 Г, ' (/.;■,-■ »■■::
' Структуры данных ; ^1 структуры управлении к!1«г):.-:л. •.?:!;■;:) ■■■'!>: ис' Системное программное обеспечение ЭВМ формируется из комп- комплексов программ. Эти программы записываются на некоторых (машинных) языках. Таким образом, основные идеи системно- системного программного обеспечения отражаются в построении языков программирования. Во-первых, в языках программирования должна существо- существовать возможность отображения структур данных, являющихся объектами обработки. Во-вторых, язык программирования должен обладать изоб- изобразительными средствами для представления методов обработки этих данных, т. е. алгоритмов. Эти изобразительные средства называют структурами управления. Структуры данных и струк- структуры управления тесно связаны между собой и являются двумя важнейшими элементами программирования, относительно которых группируются функциональные возможности языков программирования и концепции программного обеспечения. Современная ЭВМ состоит из запоминающего устройства (памяти) и устройства управления вычислениями. Запоминающее устройство, в частности оперативная память, обычно имеет однородную структуру, состоящую из ячеек, со- содержащих некоторое фиксированное количество битов. С абст- абстрактной точки зрения память — это одна (возможно очень боль- большая) цепочка. Для указания элементов этой цепочки служат адреса (указатели). Это означает, что в своей основе память ЭВМ обладает лишь простейшей структурой данных, реализованной аппаратным путем. Программа, записанная на некотором языке, представляет
10 Глава 1 собой на первый взгляд последовательность битов1'. Если по- посмотреть на нее с позиций функционирования устройства управ- управления вычислительным процессором, то она обеспечивает два типа деятельности: выполнение операторов данных и управления. Язык описания данных в зависимости от выполняемых команд может интерпретировать числовые данные (с фиксиро- фиксированной и с плавающей точкой), символьные данные и другие. Кроме того, в некоторых языках можно описывать адреса (ука- (указатели). Все это —базовые типы данных, которыми располага- располагает ЭВМ, однако при этом, пользуясь указателями, можно созда- создавать сложные концептуальные структуры данных. Разумеется, в арифметическом устройстве определены четы- четыре арифметических действия и другие вычислительные опера- операции, причем типы используемых операций зависят от конкретной машины. Совокупность команд, включающая команды ветвле- ветвления и организации их последовательного выполнения по про- программе, и представляет собой структуру управления ЭВМ. Все это — наиболее определяющие и простейшие элементы ЭВМ. Более сложные концептуальные структуры управления формируются путем сочетания этих базовых элементов (при участии памяти). Первичные программы системного программного обеспечения записываются именно на машинном языке (и исполняются на нем же), однако программирование на машинном языке тре- требует чрезвычайно много времени. Перед декомпозицией задачи на машинные команды мы обычно пользуемся некоторыми об- образами функций, которые для своей реализации требуют выпол- выполнения нескольких машинных команд. Такой способ программи- программирования называют способом "снизу вверх". Существует проти- противоположный способ программирования: "сверху вниз", когда речь идет о реализации некоторых понятий, промежуточных между машинным языком и поставленной задачей, и использо- использовании этих понятий при решении задачи. В зависимости от со- состава таких понятий к настоящему времени предложено множе- множество различных языков. Эти языки выполняют свои задачи с точки зрения практики их применения, и в то же время отра- отражают ряд концепций создания программного обеспечения. Эти концепции делятся на две большие группы: концепции структур данных и управления. ' s а 1J Эта последовательность образуется двоичными кодами команд машинного языка. Они содержат обычно адресную и управляющую части. Одной из функ- функций последней является управление выполнением операций в арифметико-ло- арифметико-логическом устройстве и обменом между его регистрами и памятью. Имеются также команды ветвления, позволяющие выбирать порядок выполнения команд программы в зависимости от результатов операций. — Прим. ред.
Структуры данных и структуры управления 11 Следующая возникающая проблема состоит в том, как на данной машине эффективно (с точки зрения затрат времени и объема памяти) построить сложные структуры, группируя бо- более мелкие встроенные структуры. 1.1. Структуры данных В данном разделе рассматриваются структуры данных, а так- также обсуждаются способы абстрактного и конкретного представ- представления данных. Кроме того, приводятся примеры основных абст- абстрактных типов данных. 1.1.1. Абстрактные типы данных Теории, касающиеся различных структур данных, будут рас- рассмотрены несколько позднее. Здесь же мы остановимся на абст- абстрактном и конкретном подходах к данным. Эти подходы носят общее название: "Абстрактные типы данных" и были выдвину- выдвинуты впервые в 1970 г. Эти идеи получили широкое распростране- распространение и на их основе был создан язык CLU и др. Абстрактные ти- типы данных вошли в состав различных систем описания ситуа- ситуаций, они же оказали влияние на разработанный в самое послед- последнее время и нашедший широкое применение язык программиро- программирования Ада и др. Основной идеей в абстрактных типах данных является раз- различение двух вещей: а) вида представления данных пользователю; б) вида организации данных из структур данных, встроен- встроенных во внутримашинное представление. Другими словами, вид структуры данных не должен зависеть от конкретных прило- приложений. К формальной записи абстрактных структур данных можно применить алгебраический подход. Он проявляется в том, что задается множество операций над данными. Данные определя- определяются как структуры, порождаемые этими операциями. Использование выразительных средств алгебры связано с возможностью применения к данным математических методов, в частности с перспективами применения к данным теории ассо- ассоциативных и коммутативных групп. В качестве примера рассмотрим тип данных "список". В ка- качестве операций над списками возьмем операцию создания спис- списков cons, операции декомпозиции списков саг и cdr, операцию null, дающую возможность определить: пуст список или нет, а также операцию nit, задающую пустой список1*. ■> Операцию nil можно по форме записи отождествить с конкретными данными, которые обозначают функцию, дающую пустой элемент.
12 Глава 1 Эти операции записываются следующим образом: BXtA-TYPE LIST IS '"" • ; NIL-.-+LIST CONS.aXLIST-yLIST ' CAR:LlST-+a CDR:LIST->~L1ST . . С,,Л„ 4. NULL:LIST^-BOOLEAN " END Символом а в приведенных выше выражениях обозначается тип данных для каждого непустого элемента списка1). Если использовать только эти определения, то остаются не- неясными связь между операциями cons, car и cdr, а также вид выражения null. Поэтому помимо задания операций записыва- записываются выражения (называемые обычно аксиомами), которым должны удовлетворять эти операции, , ; л1, -, Имеются три аксиомы списков: .,- • , . , AXIOMS X:LIST,Y:a ' -■ '■ ' CONS(CAR(X),CDR(X))=X ' NULL{NIL)=TRUE NULL(CONS(Y,X))=FALSE С помощью определенных таким образом операций и аксиом формально определяется абстрактный тип данных: "список". Создание конкретных списков осуществляется таким образом, чтобы удовлетворять этим правилам. В большинстве случаев списки создаются с помощью указателей, о которых речь пойдет ниже, и часто на практике оперируют лишь образами списков. При этом существуют другие способы организации списков и примеры практической реализации этих способов. Если говорить конкретно о списках, то в системе DEC-10 Prolog использован другой способ для организации списков. Тем не менее независимо от варианта реализации, на ко- котором мы остановились, действует правило замены, показанное на рис. 1.1. Этот пример иллюстрирует лишь малую часть тех возможностей, которые обеспечивают абстрактные определения. 1.1.2. Базовые типы данных Вообще говоря, часто при абстрактном подходе сначала выдви- выдвигаются некоторые посылки, а затем на их основе ведется рассуждение. Точно так же при рассмотрении типов данных сначала аксиоматически задаются некоторые исходные их типы '> Тип данных "список" называют полиморфным типом данных, посколь- поскольку он может содержать внутри себя переменные для типов, как, например, о.
Структуры данных и структуры управлении 13 (их можно называть также примитивными, базовыми или же элементарными типами данных). Например, такими данными могут быть следующие: 1) бит (bit); ' ' "'; ' !; I-'":/'"'-"-''.. 2) булевский (boolean); • ■ ■•> •■ . • >.,-■•., •-• 3) символьный (character); * ч г - ' %'lV- 4) целый (integer); 7 '"'" ' '• ! V1- * 5) вещественный (real). >'"' :; ":>f! Абстрактный тип данных „список Списки, по- построен, с помощью термов (способреал. Прологе) Списки, постро- построенные с помощью указателей Рис. 1.1. Абстрактное и конкретное определения списков. 1, / — два способа реализации; f — отображение, задающее переход от способа реализа- реализации, списков с помощью указателей к способу с помощью термов. Поскольку выполняет- выполняется условие l=i'f. способ реализации с помощью термов можно ие рассматривать (он рас- рассматривается в разделе 1.1.5). Им также можно дать абстрактные опрьАСления, Например, определение типа " булевский" может иметь вид DATA_TYPE BOOLEAN IS OPERATIONS: TRUE-.-^BOOLEAN ;« . FALSE-.-+BOOLEAN • . ••■;-,. "' '• •-. NOT:BOOLEAN-^BOOLEAN -\ » u' ; ■:.- AND:BOOLEANxBOOLEAN^BOOLEAN ■:■'. . : OR:BOOLEANxBOOLEAN->BOOLEAN AXIOMS: ~* NOT {TRUE) = FALSE NOT{FALSE)=TRUE AND(TRUE,TRUE)=TRUE ;-' " ' '". AND (TRUE,FALSE)= FALSE »- AND (FALSEJRUE) = FALSE AND(FALSE,FALSE) = FALSE N s ' \» ' OR(TRUEJRUE)=TRUE ' "* \ г , * и .?>П'4;>-'. OR(TRUE,FALSE)=TRUE ' , K, ( -tVv . , > rf . OR(FALSE,TRUE) = TRUE -{ T , ,^-r^ OR(FALSE,FALSE)= FALSE , ,щ Л»./Н'^ END BOOLEAN .t, ,,« - ','- ,n -- vt
14 Глава 1 Короче говоря, это определение задает логическую таблицу истинности. Двоичные нуль и единица удовлетворяют указанно- указанному выше абстрактному определению, и поэтому представляют собой конкретную реализацию истинностных значений. Это — упрощенный способ объяснения смысла абстрактных типов дан- данных. Другой пример: в языке Лисп для реализации значений истинности используют элемент nil и любой другой. Важное значение имеет понимание того, что базовые типы данных также имеют абстрактные определения и для них можно сформулировать различные виды конкретной реализации. 1.1.3. Списки Выше уже давалось определение списка, однако здесь для пол- полноты понимания мы приведем его вновь. л DATA-TYPE LIST(a)IS OPERATIONS CONS:aXLIST(a)^-LIST{a) CAR: LIST (а)-кзс CDR:LIST(a)-<-LIST{a) NULL: LIST (a)-*-BOOLEAN AXIOMS: CONS(CAR(L),CDR(L))=L ; .^ ,«,, «: i NULL(NIL) = TRUE ■ "л " ■ ' - • ' NULL(CONS(X,L))= FALSE END LIST В качестве одного из методов реализации списков исполь- используют указатели. В данном случае указатель представляет собой структуру, с помощью которой реализуется ссылка на адрес в машине; nil Рис. 1.2. Реализация списков с помощью ячеек н указателей. *{г «О, # 3456, # 1214 — указатели адресов. -^ конкретно это — просто указатель адреса. На рис. 1.2 они по- показаны стрелками. Хранилища для этих указателей называют ячейками. В случае списков ячейка состоит из частей саг и cdr, каждая из которых хранит соответствующий адрес.
Структуры данных и структуры управления 15 Для части nil используется особый атом (адрес). Указатель,, показывающий на него, изображен на рис. 1.2. Например, в язы- языке Лисп, впервые разработанном в Массачусетском технологиче- технологическом институте, атом nil выражался нулевым адресом. Операция cons соединяет два указателя, из которых в одной ячейке формируются части саг и cdr. Операции саг и cdr воз- возвращают содержимое саг- и cdr-областей ячейки соответственно. Операция null реализует сравнение произвольного указателя ячейки на предмет, является ли он указателем nil или нет. Посмотрим, удовлетворяет ли такая реализация аксиомам списков. Можно говорить, что в выражении cons (car (L), cdr(L)) = L siV1. фактически задается отношение эквивалентности списков ("="), В конкретной реализации (рис. 1.3) указатель ячейки, Новая ячейка (М) К части сат К части dr Рис. 1.3. Реализация операции cons с помощью указателей. M=cons(car(L), cdr(L))-L полученной в результате операции cons, может не совпадать с исходным указателем L. С помощью этой аксиомы скорее за- задается эквивалентность двух списков L и М по эквивалентности пар результатов саг и cdr для каждого из них. Далее, очевидно, что nul(nil) = true и null(cons(X, L)) = false, поскольку результатом операции cons не будет указатель, рав- равный nil: nil не реализуется в качестве специальной ячейки. Теперь поговорим о трудностях, которые возникают в языке Лисп и других языках при взятии функций саг и cdr от nil. В абстрактном определении объекты (можно называть их списками), задаваемые функциями саг и cdr в аксиоме cons(car(L), cdr(L))=L, могут быть лишь списками, созданны- созданными с помощью функции cons. Короче говоря, имеют смысл лишь списки, для которых функция null возвращает значение false. Помимо этого, в конкретных реализациях специально не огова- оговариваются значения функций саг и cdr от nil. Если считать, что все операции, определяемые абстрактно, являются математическими отображениями, то необходимо, что- чтобы операции саг и cdr были определены для произвольного списка. Если это так, то необходимо определить функции саг.
16 Глава 1 cdr и для элемента nil. В первом из приведенных определений об этом ничего не говорится. Следовательно, ничего необычного не будет, если в реализа- реализациях принять car(nil) = nil, cdr (nil) = nil. Это не противоречит определению cdr: list (a) ► list (a). Чтобы подчеркнуть это в явном виде, необходимо отдельно ввести множество непустых списков и множество списков, содер- содержащее пустой список, (nil), следующим образом: DATA_TYPE NON-EMPTY-LIST (я) IS OPERATIONS: CONS-.aXNON-EMPTY-LIST {a)^-NON-EMPTY JLIST (a) CAR-.NON-EMPTY-LIST(а)-к* ?i CDR:NON-EMPTY-LIST(a)-+LIST(a) NULL-.NON-EMPTY-LIST {a)-+BOOLEAN AXIOMS: VAR X:a,M:NON-EMPTY-LIST(a) CONS (САЩМ), CDR (M))=>M NULL(M)*= FALSE END NON-EMPTY-LIST DATA-TYPE-LIST(a)IS OPERATIONS: NlL:-yLIST(a) CONS:aXLIST(a)-+NON-EMPTY-LIST(a) ■;.r. : NULL:LIST(a)-+BOOLEAN -.■•>,-T ;, . ■ AXIOMS: .. VAR X:a,L:LIST(a), M: NON-EMPTY-LIST (%) CONS(CAR{M),CDR(M))=M . . • , NULL(NIL)=TRUE , ; . ,. ,, NULL(CONS(X,L))= FALSE . , ■ CDR(CONS(X,L))=L л ; CAR(CONS{X,L))=-X . ,;, . ," END LIST . Теперь рассмотрим еще одну реализацию списков, о кото- которой упоминалось в разд. 1.1.1; а именно метод термов. В этом случае операция cons из двух элементов образует но- новый терм, т. е. cons(X,L) => X'L. Здесь знак "." является конструктором терма. Возможна и та- такая запись. .(X, L). Функции саг и cdr представляют собой операции, возвра- возвращающие соответственно левую и правую части терма, созданно- созданного упомянутой операцией cons (в языке Пролог это возврате-
Структуры данных в структуры управления 17 ние реализовано через операцию унификацииI' Атом nil выра- выражается термом: nil. Функция null определяет, является ли воз- возвращаемое значение термом или нет. Посмотрим, удовлетворяются ли при этой реализации аксио- аксиомы списков: cons (car (L), cdr(L)) = L. , • Если положить L=M.N, то получим cons (car (L), cdr (L)) = cons (M, ff). ■ = M-N 'Y•'■ = L. ■•■•.-. *' = ■' Далее, очевиднЬ|чтб''ч'чи V,r:- ,\\>. null (nil) = true, ;,.-л<!> -:. . *ш;,;-■.;.■•■ ■ -■ ■ а также, что . null (cons (X, L)) = false. На практике в методе термов абстрактные определения спис- списков реализуются в универсуме самих этих термов. . 1.1.4. Деревья ■ ■ "> . Структуры данных типа дерева (tree) сначала мы дадим здесь общее определение. DATA-TYPE TREE IS ,. /OPERATIONS: . . } CONS:MODEXTREES->TREE .-;; „■;' NIL:^TREE CHILDREN-.TREE-+TREES ,MODE:TREE-^NODE ■■ ■ .,.,,, LEAF?:TREE-yBOOLEAN . , ;i AXIOMS: VAR N-.NODE, C.TREESJ:TREE ■ ,- ,• , . LEAF?(NIL)=TRUE - , .f,.,,,,,'... LEAF? (CONS (N,C))= FALSE . »',, CONS(NODE(T),CHILDREN(T))=T:: '' END Г#££ ,,■ DATA-TYPE TREES IS ...i ') Автор здесь мимоходом упоминает важную особенность языка Про- Пролог, а именно: возможность задания инструкций процедурного (или в данном случае функционального) языка через операторы представления знаний непро- непроцедурного на первый взгляд языка, каким является Пролог. Эта возможность как раз и обеспечивается упомянутым механизмом унификации. — Прим. пе- пере в. 2—НИ
18 Глава ) .. OPERATIONS: *% HEAD :TREES->~T REE ' TAIL-.TREES-+TREES . NILSEQ-.-+TREES NULL-.TREES-+BOOLEAN CONS: TREE TREES^-TREES AXIOMS: VAR T:TREES,E:TREE CONS(HEAD(T),TAIL(T)) = T NULL(NILSEQ)=TRVE - Ar[/LZ, (COWS (E,T))= FALSE END Здесь тип node и list указываются в виде параметров. Кроме того, здесь используются наименования операций (функций), совпадающие с наименованиями cons, null, nill и т. д., участ- участвующими в определении списков. В принципе это —случайное совпадение и можно считать, что эти операции полностью отлич- отличны от одноименных им в случае списков. Одинаковые наимено- наименования используются по той причине, что одноименные операции в обоих случаях схожи по смыслу. Использование одних и тех наименований в разных, не вполне тождественных случаях ни- ничем не отличается от общепринятой практики словоупотребле- словоупотребления в естественных языках. Аналогичной полисемией (много- (многозначностью) обладает, например, фраза: "модульный подход" (подробнее об этом см. разд. 2.5). Таким образом, мы получили определение деревьев, однако при внимательном рассмотрении операции и аксиомы в этом определении совпадают с операциями и аксиомами списков. Главным отличием является то, что дерево превращается в спи- список деревьев: структура данных trees становится структурой данных list (tree). Этот факт на уровне абстрактных типов данных указывает на возможность реализации одной структуры данных через дру- другую. Это — не что иное, как практический метод реализации конкретных структур данных. В системе OB.I2 указывается подобное соотношение между структурами данных с использованием механизмов наследова- наследования и подстановки (так называемого механизма перспективы). Схожий с ним метод описания выглядит следующим образом:0 VIEW TREES-AS-LIST IS L1ST{TREE) '-,- '• WITH HEAD=CAR, '""■ " ' ' • l3'rf ') Разумеется, приводимый здесь способ описания не является способом. реализованным в системе OBJ2.
Структуры данных и структуры управления 19 TAIL=CDR, NILSEQ=N1L .'■■A END TREES-AS-LIST Само дерево можно описать, с помощью списка (например в этом случае необходимо с привлечением функции cons списков создать функцию cons дерева). Таким образом, эти две функции будем различать, используя в качестве индексов слова tree и list. Операции дерева можно определить следующим образом: CONStrEE=CONSust CHILDREN =CDR ^3 NODE=CAR -i :?i. ■ „-v \, . - ,.,■./■•-■ л ' №< NILTREe=NILust ■ t; , •.■» : - ;--ы^,\< •.•'-'. ■> • >'■■ LEAF} = NULL В этом случае также можно использовать определение спис- списков без изменений. Здесь предполагается, что в этом определе- определении структура trees реализуется как структура list (tree). Структура tree определяется как структура list (node), одна-' ко, строго говоря, этот случай не совсем совпадает со случаем trees. В общем случае дерево имеет структуру, представленную на рис. 1.4, однако на практике часто используют деревья с фик- фиксированным числом ветвлений: я-ричные, деревья, или деревья я-ro порядка. В частности, широко используют простейшие, двоичные деревья (рис. 1.5). Корень Узел Рис. дерева. Лист 1.4. Графическое изображение Рис. 1.5. Двоичное дерево. Определение двоичного дерева содержится в определении дерева как частный случай, однако это определение можно вы- выделить в самостоятельное, тогда оно примет следующий вид: DATA-TYPE BINARY-TREE IS . . , OPERATIONS: 4 ~ (' \ Яi ? /'. CONS: NODExBlNARY-TREpxQNWiYuTREE-»- -^BINARY-TREE
20 Глава 1 LEFT-.BINARY-TREE^BINARY-TREE R1GHT-.BINARY-TREE-+BINARY-TREE NIL:^-B1NARY-TREE LEAF) :B1N ARY-TREE-yBOOLEAN >:i MODE-.B1NARY-TREE-+MODE У ■>:~ VAR:T,R,L:TREE,N:NODE ;> :' "■ : CONS(NODE(T),LEFT(T),RIGHT(T))-T ■■ . ■'- LEAF? (NIL) =TRUE LEAF?(CONS) (N,R,L))= FALSE END BINARY-TREE Попробуем переписать это определение в таком виде, чтобы оно не содержало элементов node, а в качестве элемента leaf содержало бы произвольную структуру данных а. Такое двоич- двоичное дерево обозначают sbt (simplified — binary — tree) и опреде- определяют следующим образом: DATA-TYPE SlMPLlFlED-BINARY-TREE(a)IS OPERATIONS: '; CONS:SBT(a)XSBT(a)-+SIMPLlFlED-BlNARY-TREE(a) LEFT-.SIMPLIFIED-BINARY-TREE(a)+SBT(a) , RIGHT:SIMPLIFIED-BINARY-TREE(a)-*-SBT(a) , NlL:->SIMPLIFIED-BINARY-TREE(a) ' '' LEAF?:SBT(a)->-BOOLEAN AXIOMS: ■ ' ' : ; VART-.SIMPLIFIED-BINARY-TREE ' ' CONS (LEFT{T)RIGHT{T))=*T END SIMPLIFIED-BINARY-TREE Здесь запись sbt соответствует выражению a' simplified — bina- binary— tree (a). Определения функций cons и leaf? даются нац.sbt. DATA-TYPE SBT (a) IS OPERATIONS: CONS: SBT (a) XSBT(a)-+SIMPLIFIED-BlNARY-TREE(*) LEAF?:SBT(a)->~BOOLEAN AXIOMS: '^!J *■■•■ -<-^'-.-•■> ■'■' VAKT:SIMPLIFIED-BINARY-TRBB,Xim&i'iSBF ,.;, vm CONS (LEFT) (T),R1GHT\T)) = T ■'"' ' ~Kf LEAF7(NIL)=TRUE ' ( ' " ... \i LEAF?(X)=TRUE .'< С L;": '"■ LEAF(X)=TRUE LEAF?(CONS(R,L))=FALSB> ' ° ' 3 * • < LEFT (CONS (R,L))=R If' , RIGHT (CO NS(R,L))=L "?>> '^ END SBT
Структуры данных и структуры управления 21 Используя это sbt, можно определить через него и списочную структуру. В этом случае cons = cons, - '" car = left, ■ ■ 4 •''* cdr— right, , . i а для операции null вновь введем соотногйеМЦ!, определяемые следующими аксиомами: , J ""'-" ', '■■■■• •>!• ' С '; null (nil) = true, • . ;,-., - null (X: а) = false, ■'•-?.-&•>■ V» null (cons (R, L)) = false. Поскольку для функции leaf? выполняется условие: leaf? (X : a) —true, то при использовании ее в описании списоч- списочной структуры возникает избыточность. На практике лисповские списки реализуются в виде этих упрощенных двоичных деревьев. В позиции cdr в ячейке на рис. 1.2 может находиться и тип данных а. В лисповской нотации операции leaf? соответствует предикат АТОМ. Здесь возможности использования в программировании на языке Лисп предиката АТОМ р. вместо функции leaf? соответст- * ' вуют соотношению между leaf? и null». 1.1.5. Графы Более сложной структурой дан- данных по сравнению со списками и деревьями являются графы. Об- Общий вид графа представлен на рис. 1.6. Узловые точки графа называют вершинами, между двумя вершинами можно провести произвольное количество дуг или стрелок. В графах могут быть изолированные вершины, а также .дуги, направленные к той же вершине, из которой они исходят. Как правило, дугам графа задается направление, однако это направление может быть и не определено (считают, что при этом определены оба направления). В отдельных случаях их на- рэр У Прим. ред. Вопросы, связанные t языком Лисп изложены, Например^в книге Мау- . Введение в программнровйнпе на языке Лисп.— Мд. Мир, 1976.—
22 Глава 1 зывают ориентированным графом (орграфом) и неориентиро- неориентированным графом соответственно. Абстрактное определение графа выглядит следующим обра- образом: DATA-TYPE GRAPH IS OPERATIONS: VERTICES: GRAPH—SET (VERTEX) ARROWS-.GRAPH-SET (ARROW) ADD^NODE:VERTEXxGRAPH—GRAPH ADD-ARROW:ARROWxGRAPH—GRAPH DELETE-NODE-.VERT EXXGRAPH—GRAPH DELETE-ARROW: ARROWXGRAPH—GRAPH END GRAPH DATA-TYPE VERTEX IS OPERATIONS: CREATE-.IDENTIFIER-VERTEX ' CHILDREN: VERTEX—SET (VERTEX) ARROWS-.VERTEX-SET (ARROW) IDENTITY: VERTEXXVERTEX—BOOLEAN END VERTEX DATA-TYPE ARROW IS OPERATIONS: CREATE.DESCRIPTIONxVERTEXxVERTEX—ARROW '' SOURCE: ARROW—VERTEX DESTINATION:ARROW—VERTEX END ARROW Здесь тип данных set обозначает тип данных "множество". В общем случае списки и деревья являются частными примера- примерами графов! В качестве метода реализации используют матрицы смежно- смежностеи, указатели и другие методы. Чтобы практически реализо- реализовать определенный здесь граф общего вида, необходимо соз- создать базу данных, в которой отдельно описывать вершины и дуги. На рис. 1.7 представлено описание графа с помощью матрицы смежностеи. В этом случае размер матрицы опре- определяется количеством вершин графа. При добавлении произ- Рис. 1.7. Представление графа с по- вольного числа вершин доста- щочи , 1 "*> i"t ! Ч ' 1 : i п 1 2 - ■ £.1 п *•: ,-<■ ■« т ■ к > п мощью матрицы смежностеи. (i, /)—3 означает, что из вершины i в вер- вершину / проведено три ребра. точно продолжить матрицу, однако при удалении вершины
Структуры данных и структуры управления 23 необходимо менять расположение элементов матрицы смежно- стей. Количество дуг, идущих из вершины i в вершину /, заносится в ij-й элемент матрицы. Полный граф, изображенный на рис. 1.8, представляется с помощью матрицы, показанной на рис. 1.9, в которой все элементы являются единицами. В этом методе нельзя с каждой дугой связывать какую-либо информацию. Как и в изображении списков, при использовании указателей стрелка выражается адресом. Обычно в этом случае количество дуг, выходящих из одной вершины, определяет число следующих за ней вершин, однако в каждом случае необходимо фиксировать верхнюю границу этого числа. (\ 1 1 1 1\ lllil llili lllil Vi 1 1 1 1/ Рис. 1.9. Матрица графа, изо- изображенного на рис. 1.8. Рис. 1.8. Полный граф с пятью вершинами. Все вершины связаны между собой. В случае использования ориентированных дуг или стрелок вершину, в которую входит дуга, называют концом или стоком дуги, а вершину, из которой она выходит, — началом или исто- истоком дуги. В методе указателей вместо дуг используется множество вершин, являющихся непосредственными потомками данной вер- вершины. При использовании данного метода легко удалять и добав- добавлять вершины. Дело с удалением и добавлением дуг также об- обстоит просто, если при этом не превышать максимальное коли- количество последующих вершин. Как и в случае матриц, здесь нет возможности связывать с дугами какую-либо информацию. Исследования в области графов, включая и прикладные во- вопросы, чрезвычайно широки. Они составляют раздел математи- математики, называемый теорией графов1^ 2). Ч Вопросы теории графов достаточно полно изложены в книге Berge С, Graphes et Hypergraphes, Dunod, 1970. ..... 2> См. также Харафи Ф. Теория графов. — М.: Мнр, 1973. — Прим. ред.
24 Глава 1 ■-' 1.2. Структуры управления , В данном разделе рассмотрены структуры управления в их со- соотнесенности со структурами данных. Управление можно раз- разделить на две группы: последовательное и параллельное. В дан- данном случае рассматриваются лишь последовательные структуры управления, используемые в традиционных, так называемых фон-неймановских машинах, и их обобщения. 1.2.1. Структуры управления и циклы в блок-схемах Классической структурой последовательного управления явля- является блок-схема, пример которой приведен на рис. 1.10. На нем показаны группировка управления, условные ветвления, цикли- циклическое выполнение операций с помощью передачи управления и безусловный переход. Основным элементом в этой структуре является счетчик команд. Он осуществляет управление выпол- #1 #2 #3 #4 #5 #6 #7 Лй-10; F*-l IF JV=O THEN GOTO 6 ELSE GOTO 3 F*-H»F N*-N—l GOTO 2 PRINT F ; • END Рис. 1.10. Пример блок-схемы. Рис. 1.11. Некоторая условная про- программа, соответствующая блок-схеме, представленной на рнс. 1.10. нением программы, задавая конкретное место (адрес) команды, которая должна выполняться. Типичными для рассмотренной блок-схемы могут служить некая условная программа, представленная на рис. 1.11, и соот- соответствующая блок-схема, приведенная на рис. 1.10. Исходя из рис. 1.10 и 1.11, можно считать, что счетчик команд задает но- номера операторов (рис. 1.11), а блок-схема на рис. 1.10 иллюст-
Структуры данных и структуры управления 25 рирует порядок исполнения программы, изображенной иа рис. 1.11. Степень подробности структуры, задаваемой счетчиком команд, зависит от уровня языка программирования. На уров- уровне машинного языка или микропрограмм нижнего уровня эта структура задается чрезвычайно подробно, однако при исполь- использовании языков высокого уровня такое структурирование, есте- естественно, оказывается слишком мелким. Самым большим преимуществом изображения структур уп- управления в виде блок-схемы является то, что при этом становит- становится весьма наглядной структура управления. Например, ту же самую программу (рис. 1.11) (т. е. выполняющую те же опера- операции) можно представить в виде, показанном на рис, 1.12, При #1 ЛЛ<-10 ,.-.„■• . . ч #2 F4-1 #3 IFtf=0THENU6TO7ELSEGOTO5 #4 END #5 PRINT F #6 GOTO 4 #7 F*-N»F #8 n+-n—i ^ -■■ '-- ■ ■ ■"■ ■-//' ■ .-; #9 GOTO3 "" '" ' ' " Рис. 1.12. Программа, эквивалентная программе, представленной на рис. 1.11. этом из сравнения текстов не сразу становится понятным, что суть обеих программ одна и та же, однако изображенные в виде блок-схемы они имеют одну и ту же структуру, что и делает эквивалентность этих программ очевидной. Конкретная работа счетчика команд состоит в том, что при выполнении линейных участков программы сверху вниз его зна- значение после выполнения каждой команды увеличивается на еди- единицу. При выполнении команд, указываемых операторами goto в программах, изображенных на рис. 1.11 и 1.12, ему присваи- присваивается значение, соответствующее адресу требуемой команды. Основная причина того, что блок-схемы понимаются легче программ, заключается в подобных изменениях значения счетчи- счетчика команд, т. е. в выполнении команд, указываемых операто- оператором goto. В связи с этим существует методика структурирования про- программ, т. е. структурное программирование. При таком струк- структурировании благодаря ограничению, накладываемому на изме- изменения содержимого счетчика команд, появляется возможность с помощью текста программы добиться такой же эффективно-
26 Глава 1 ' сти в изобразительных средствах, какая достигается с помощью блок-схемы. Изменение значения счетчика команд происходит главным образом при условных ветвлениях и в циклах. Таким образом, структурирование касается именно этих частей программы. Для записи команды условного ветвления используется следующий оператор: if С then S[ else S% fi (Условный оператор). Здесь С выражает условие, а на местах S[ и S2 непосредственно записываются выполняемые операции. Для записи циклов предложено несколько форм. Хорошо известны формы о»Ч while С do S (Ожидающий оператор цикла) и repeat S until С (Итерационный оператор цикла), ; "• а кроме того конструкции с условным ветвлением. В ожидающем операторе цикла сначала проверяется усло- условие, а затем в течение всего времени, пока оно проверяется, вы- выполняется некоторое действие. В итерационном операторе цикла сначала выполняется дей- действие, а затем проверяется условие; при его выполнении насту- наступает выход из цикла. Таким образом, выполнение заданного оператора продолжается до тех пор, пока не выполнится пред- предписанное условие. Кроме этих двух операторов существует еще так называемый замкнутый оператор цикла, в котором выход из цикла осущест- осуществляется по специальному указанию. Этот оператор имеет вид loop Si; S2;...; Sn end-loop (Замкнутый оператор цикла). При появлении среди выполняемых операторов ключевого слова exit выполнение цикла прекращается и происходит выход из него. Как правило, слово exit используется в сочетании с услов- условным оператором. Например, ожидающий и итерационный операторы цикла записываются с помощью замкнутого оператора цикла следую- следующим образом: ,,... ,. ■ ,. LOOP IF С THEN S ELSE EXIT END_LOOP ■'[ \* '*-.A , \ ^1. ■ LOOP S; IF С THEN EXIT END-LOOP . - Поэтому, используя структурирование, блок-схему, изображен- изображенную на рис. 1.10, можно представить в виде программ, пока- показанных на рис. 1.13 (ожидающий оператор цикла) или рис. 1.14 (замкнутый оператор цикла). Здесь ключевые слова begin и end соответствуют словам НАЧАЛО и КОНЕЦ блок-схемы. Они используются для обозна-
Структуры данных и структуры управления 27 BEGIN JV-<-10; F—1; WHILE N=#=0 DO BEGIN F+-N*F; . ■ ь. ..... .. N*-N—l - '■'■I'.},- END - '.. * PRINT F." ", • , END Рис. 1.13. Структурированная программа с использованием ожидающего опе- оператора цикла. BEGIN N+-W; F+-1; .^sr : , ....,.,-,: LOOP IF JV=O THEN EXIT FI „. !..'.'■■ F^-N'F; , .. - ''"".".'■'•', N+-N—\ ,r '4L ' ,Jfi' ' """'",, END-LOOP "' " '"" / : "' "r/: ':'-)'"i -f':H^"""-r" " PRINT F -S■"■ 'H Цч% *'• '"ЙЛ "-."^ ^■*я. END Рис. 1.14. Структурированная программа с использованием замкнутого опе- оператора цикла. чения одного программного блока. На некотором более высоком уровне ожидающий и замкнутый операторы цикла могут рас- рассматриваться как "один оператор". Поэтому на таком уровне можно считать, что счетчик команд получает единичное прира- приращение на весь оператор цикла. 1.2.2. Структура вызова процедур и возврата "Общий" подход, рассмотренный в предыдущем разделе в виде блок-схем, обеспечил высокий уровень наглядности при про- просмотре структуры программ в целом. Была рассмотрена пробле- проблема циклов с тех же структурных позиций. При этом возникает понятие подпрограмм, т. е. "структурно- выделенных цепочек формальных процедур". В частности, важ- важными вопросами являются присвоение имен выделенным таким образом процедурам и передача связанной с ними информации через параметры. При этом применяется такое хорошо извест- известное в математике понятие, как функция. Процедура вызывается с участием двух элементов: ее имени и передаваемых ей значений (имен) параметров. После выпол- выполнения необходимых действий происходит возврат в вызываю- вызывающую программу. Некоторый типичный вид вызова процедуры и возврата из нее показан на рис. 1.15. Для счетчика адреса команд вызов процедуры эквивалентен переходу по команде goto. При возврате из процедуры в вызы- вызывающую программу (называемую главной программой) значе-
28 Глава 1 р(х,у) Рис. 1.15. Типичный вид вызова процедуры и возврата из нее. ние счетчика команд также вос- восстанавливается с увеличением на единицу, поскольку на вызов про- процедуры в вызывающей програм- программе отводится одна команда. И в данном случае на некоторой более высоком уровне процедура может рассматриваться как опе- оператор, соответствующий одной команде главной программы. За- Затем осуществляется переход к вы- выполнению следующей команды. Строго говоря, существуют различия между процедурой и функцией: процедура может не возвращать значение. Однако можно считать, что как та, так и другая работают одинаково. Вызов процедур, который имеет вид, показанный на рис. 1.15, за исключением процесса передачи информации через пара- параметры, можно считать одним из вариантов работы с использова- использованием оператора goto. Однако существует следующая особая форма вызова про- процедур: factorial(nKsifn=0 thenl else n-factorial(n—\) Эта функция в своем определении содержит вызов самой себя. Такой вызов называют рекурсивным. С рекурсивным вызовом также связана следующая более сложная форма: ACK(M,N) IFM=0 THENW+l ELSEIFW=0 THEN ACK(M~ 1,1) ELSEACK(M-l,ACK(M,N-l)) При обработке такого рекурсивного вызова необходима спе- специализированная структура управления. Если при выполнении программы происходит прерывание какой-либо деятельности, то после устранения причины преры- прерывания, например окончания исполнения прерывающей програм- программы, необходим возврат к той деятельности, которая была пре- прервана1'. 1) Особенность рекурсивного вызова состоит в том, что процедура вызы- вызывает саму себя. Обычная программа существует лишь в одном экземпляре. Поэтому если прн рекурсивном вызове устанавливать счетчик команд на нача- начало процедуры, то такое выполнение будет не рекурсивным, а циклическим. Обращаясь к примеру с факториалом, можно увидеть, что выход из процеду- процедуры произойдет лишь при обращении к факториалу от единицы; если не ис- использовать механизм прерывания (восстановления), а лишь оператор goto, то в ответе получим единицу независимо от значения, с которым было обра-
Структуры данных и структуры управления 29 В качестве управляющей структуры данных, пригодной для реа- реализации управления прерыванием (восстановлением), использу- используют стек. Для стека определены следующие операции: push:a*stack(a)->~stack(a) ■' ' ■■ ' ■ pop: stack (a)-Ka, stack (а)> - ' Действие этих двух операций push и pop протрвооолозкно, друг другу и удовлетворяет следующим аксиомам: , и ж- : X:a,S:stack(a) ■■..•*•■.<-■ ->. В управляющий стек помещаются значения счетчика команд, параметры и другая информация о локальной вычислительной среде. Обозначив их соответственно через PC {program counter) и env (enviroment), вызов процедуры можно описать следую- следующим образом: PC:PC,E:ENV.S:STACK(PC\iEMV) PC-«-CURRENT_/3C+1; Присвоение очередного значения счетчику команд E-^-CURRENT-ENVIRONMENT; Текущая вычислительная среда S-*-PUSH(E,S); Помещение в стек S+-PUSH(E,S); . .- ... S+-PUSH(PC,S); " <с.Ч>: E+-PARAMETERSET (PROCEDURE-CALL) PC+-START-ADDRESS (PROCEDURE-CALL) -*№ : •■ it>u v, ■-•Г1:' ■■{•' i ' Здесь ключевое слово procedure — call соответствует вызову процедуры и при нем задаются значения параметров и началь- начальный адрес процедуры. При возврате из процедуры выполняются следующие опера- операции: Ч Г' '•:.--•{ (PC,S}+-pop(S); При вызове функции ее значение можно передать нескольки- несколькими способами. При передаче через верхушку стека в самом на- начале выполняются следующие действия: <.Value,S}*-pop(S); В записи для операций push и pop можно явно не указывать стек и описывать их в сокращенной форме: push(X) и pop. Вместо занесения в стек и выталкивания из стека значений локальной вычислительной среды можно активно использовать щение к процедуре. Этого можно избежать, создавая каждый раз при вызове новую копию вызываемой процедуры, однако такое решение на практике ока- зывавтся малопригодным.
30 Глава 1 содержимое стека в качестве такой вычислительной среды.. В этом случае стек становится не только объектом операций push и pop, ио и представляет из себя некую сложную конфигу- конфигурацию, т. е. списочную структуру. Другими словами, существо- существование указателя стека р обеспечивает с помощью функции p[N] возможность доступа к N-му элементу из р1'. Для задания указателя стека существует специальная операция, которую можно записать, например, в виде setstaek-pointer(S,P) * ■ В этих обозначениях вызов процедуры можно записать Сле- Следующим образом: :'-ъш^ ;; \ PC:PC,V:VALUE,SP:STACK-POINTER,S:STACK ' ' ' '■ S+-PUSH (SP.S); ' ; SETSTACK-POWTER(S,SP); \^ARGUMENT{\); ) „ , S+_PUSH(V S)- I "исл0 повторений равно числу аргументов S+-PUSH (PC+A.S); PC*-START-ADDRESS (PROCEDURE-CALL); {РС+Д указывает на продолжение программы} <V,SW>0P(S) {V —значение} (SP,S)-<-PОP(S) с восстановлением SP происходит восстановление локальной вычислительной среды При этом обрабатываемые значения в качестве параметров передаются в вызываемую программу с помощью SP и после обработки посредством операции <.PS,S>*-Pop(S) из стека выталкивается значение счетчика команд и происходит возврат к участку программы, выполнявшемуся перед этим. 1.2.3. Управление бэктрекингом Использование управляющих структур данных в виде стеков для управления процедурами, содержащими рекурсивный вызов в общем виде, позволяет реализовать основные виды управле- управления. Однако, как это имеет место в языках логического програм- программирования, на уровне языка появляются управляющие струк- структуры, содержащие не только последовательную обработку, но 1> Можно строго определить операцию: access(Stack,Polnter,Bia$). По- скольку существует возможность записи в стек, можно, естественно, опреде- определить операцию: assign(Stack,Pointer,Bias,Value).
Структуры данных и структуры управления 31 н обработку, допускающую распараллеливание, и при этом тре- требуются иные структуры управления. В качестве примера языка логического программирования рассмотрим язык Пролог. Например, программа на нем может иметь вид p:-r,t. *** ■ - --..■■ Эту программу с использованием понятия процедуры можно прочитать следующим образом. При выполнении процедуры р выполняются процедуры q и s. Если они завершаются успешно, то и процедура р считается успешно завершенной. Если это не так, то выполняются процедуры г и t. В этом случае процедура считается успешно завершенной, если обе процедуры заверша- завершаются успешно. В противном случае процедура р терпит неудачу. Такой алгоритм обработки можно реализовать на дереве спе- специального вида: И-ИЛИ-дереве (AND-OR-tree), которые мож- можно изобразить в виде, показанном на рис. 1.16. В каждой своей вершине И-ИЛИ-дерево имеет метку И или. метку ИЛИ. Вершина И успешно разрешима только в том слу- случае, когда ее вершины-потомки успешно разрешимы. Вершина типа ИЛИ успешно разрешима в том случае, когда хотя бы одна из ее вершин-потомков успешно разрешима. При возможности параллельного выполнения этого И-ИЛИ- дерева легко удается реализовать распараллеливание, которое подробнее будет рассмотрено ниже в разд. 1.2.5 и о котором мы здесь вкратце упомянем. Метод такого распараллеливания со- состоит в том, чтобы, начиная с корня дерева (самая верхняя вер- вершина р на рис. 1.16), вести ветвящийся процесс относительно каждой точки ветвления. При этом результаты выполнения вер- вершин-потомков следует анализировать следующим образом. Если мы находимся в вершине типа И, то следует проверить, не тер- терпит ли хотя бы одна из вершин-потомков неудачу, а если мы на- находимся в вершине типа ИЛИ, то проверить, не завершается ли хотя бы одна из вершин успехом. В случае, приведенном на рис. 1.16, сначала можно прове- проверять на успех или неудачу листья дерева (терминальные вер- вершины), а затем, поднимаясь обратным ходом вверх по дереву, проверить, как сочетаются между собой результаты. Если распараллеливание невозможно, то применяется после- последовательная обработка вершины И-ИЛИ-дерева, при этом про- процедуры (q, s\ г, t) вызываются, как описано в разд. 1.2.2. К идеальному случаю последовательного выполнения прин- принципиально параллельного И-ИЛИ-дерева относится поиск по нему без потерь. Под идеальным здесь понимается тот случай, когда при рассмотрении И-вершины, если хотя бы одна из вер-
32 Глава 1 шин-потомков терпит неудачу, при поиске мы сразу выходим на нее, а при рассмотрении ИЛИ-вершины мы также сразу выхо- выходим на успешную дочернюю вершину, если таковая имеется. В общем случае идеальной стратегии поиска вершин не сущест- существует. Рассмотрим две стратегии поиска по И-ИЛИ-дереву: страте- стратегии поиска в глубину и в ширину. При поиске в глубину ведется последовательный обход И-ИЛИ-дерева сверху вниз слева направо, как показано на рис. 1.17. Если при обходе дерева какой-либо потомок вершины Рис. 1.16. И-ИЛИ-дерево. Л — узел ИЛИ; А — узел И. Ч S г Рис. 1.17. Поиск в глубину. типа ИЛИ разрешается успешно, то обработка остальных до- дочерних вершин (поддерева, находящегося справа) приостанав- приостанавливается и считается, что данная ИЛИ-вершина разрешилась успешно. Если какой-либо из потомков И-вершины терпит неудачу, то обработка остальных ее потомков полностью прекращается и считается, что данная вершина терпит неудачу. Следует за- заметить, что обработка ИЛИ-вершины не прекращается, а лишь приостанавливается. Это связано с тем, что впоследствии воз- возможно повторное обращение к этой вершине, и тогда оставшие- оставшиеся про запас ветви, которые еще не обрабатывались, могут по- повторно привести к успеху этой вершины. Этот процесс называет- называется бэктрекингом. В простом примере, приведенном на рис. 1.16, существо бэктрекинга просматривается не очень наглядно. По- Поэтому разберем более сложный пример (необходимость в бэк- бэктрекинге возникает тогда, когда переменные получают значения в результате унификации). Рассмотрим следующую программу: P(X):-Q(X),S(X) P(X):-R(X),T(X). "' _Ч ' с ,\i) ^£' Q(B). R(A). • i
Структуры данных и структуры управления SLQ. S[D). '.:■ :.:: Г'.: v ='k' ■.'•-■ :»коя- .(•. - ' >:.,- -л kv Ш-.О' . ik'.••(•■ TLD). ;.. ■",'■ Эту программу можно изобразить в виде дерева, показанного на рис. 1.18. Оно напоминает дерево, изображенное на рис. 1.16. ?{а) 5(*J s(c) s(d) т[а) r(d) ЦЬ) t(d) . Рис. 1.18. И-ИЛИ-дерево для программы 2. Важным элементом в поиске по И-ИЛИ-дереву является спо- способ задания значений переменной X в выражении р(Х). Напри- Например, если ведется проверка выполнимости выражения р(а),каж- р(а),каждому вхождению переменной X сопоставляется значение а, в выполнимость проверяется вне связи с бэктрекингом (рис. 1.19). q(a) q(b) s(c) s(d) r(a) r(d) t(b) t(d) Рис. 1.19. Определение выполнимости выражения р(а). />■". •, i; j Т — выполняется; F — не выполняется. '' "' Если же необходимо установить выполнимость предиката р\Х), т. е. определить, существует ли подходящее значение X, достав- доставляющее истинное значение предикату р(Х), то можно выпол- выполнять следующую процедуру. 3—1428
34 ;"r -- -i fc("i Глава 1 ^нн- *-O«4 4T> В общем случае неизвестно, конечна ли область значений X. В случае данной программы она конечна, и достаточно прове- проверить четыре значения: Х=а, X—b, X=c, X=d. При последовательном поиске по И-ИЛИ-дереву программы переменной X присваиваются значения и проверяется, приводят ли они к успеху рассматриваемой в данный момент вершины. На рис. 1.20 показано место, где при поиске в глубину впер- впервые задается значение Х=а. При этом часть потомков ИЛИ-вер- шины, оставшаяся после присвоения q(X)<=q(a), а именно часть q(b), не проверяется и оставляется в резерве. Вершина ИЛИ удовлетворяется одним только значением q(a). Однако при этом, как показано на рис. 1.21, в части дерева, соответствующей присвоению s(X)<=s(a), все потомки ИЛИ- вершины терпят неудачу, и сама вершина тоже терпит неудачу. Это приводит к тому, что И-вершина с дочерними вершинами q(X) и 5(Х),при присвоении Х=а окончательно терпит неудачу. Теперь, возвращаясь к сохраненной ветви q(b), можно сде- сделать еще одну попытку. При этом переменная X теряет ранее полученное значение а (происходит возврат назад), и в этом случае производится попытка присвоить ей значение Ь. На рис. 1.22 показано, что при присвоении переменной X значения Ь также имеет место неудача в s(X)<=s(b). Поскольку вершина, связанная с q(a), при этом сразу терпит неудачу, там стоит литера, обозначающая неудачу. При этом исчерпываются все возможности для успешного означивания q(X). Поэтому все левое поддерево ИЛИ-вершины р(Х) терпит неудачу. Теперь впервые происходит обращение к правому поддереву вершины р(Х). Вначале здесь также испытывается Х=а, и это означивание приводит к неудаче. X=d приводит к успеху. На рис. 1.23 показано успешное означивание X=d. Выше было описано управление бэктрекингом, сопровождаю- сопровождающим поиск в глубину по И-ИЛИ-дереву. Простейшим способом реализации такого управления бэк- бэктрекингом является непосредственное использование И-ИЛИ-де- рева. При создании реальных систем метод непосредственной ра- работы с И-ИЛИ-деревом неэффективен. Фактически в реальных Пролог-процессорах, например в Пролог-процессоре системы DEC-10 [9], вместо И-ИЛИ-дерева используется сложный стек, обеспечивающий высокую скорость обработки. Вопрос в том, как в этом случае реализовать управление сложного стека, по- построенного, исходя из И-ИЛИ-дерева. 90Ш! V, ВЗШСУ.ЙГ. -..;■—г.
Структуры данных и структуры управления ..к ::•!:; -r.r<v W:^:5fi-J ?(Х)Ф?(а) Рис. 1.20. Присвоение значения Х = а. ♦— часть дерева, оставленная в резерве. \ у .;г;и :;.•.-зн е ■ j," ^""Г^У : ?fa) ^ 5^j s(d) r('a) Рк. 1.2t. »(Х) терпит неудачу при Х = а. л<* ~' ■ffl%bi'i«! i. " я j rрешена ,'k«s, > ,%S,..OI ^а) ?^-> *(с) s(d) r(a) r(d) t(b) t(d) Рис. l.SS&'fefX) терпит неудачу при X=b. "'■** >*" * 3* •LI?
36 -'••■■■ - Глава !---■ ''■■<■■-• .■ >~! 1.2.4. Прерывания и процессы При анализе управления бэктрекингом в разд. 1.2.3 было рассмотрено, как можно последовательным путем реализовать недетерминированный параллелизм. Помимо параллелизма та- такого рода существует параллелизм, необходимый для работы последовательных структур. Примером такого параллелизма является параллелизм процессов, организуемых операционными системами. qla) q(b) sic) s(d) r(a) r(d) t/b) Рис. 1.23. При X=d на вершине р(Х) достигается успех. Операционные системы выполняют несколько заданий поль- пользователей как бы "одновременно". Другими словами, активно используя высокое быстродействие ЭВМ, система в некотором промежутке времени выполняет последовательно несколько за- заданий. В общем случае такие системы называют системами с мультипроцессироваиием, а каждую программную единицу, требующую обработки, — процессом'). На рис. 1.24 представлена схема одновременного существова- существования нескольких процессов: р\-±-рп. Машина передается в поль- пользование этим процессам на некоторый фиксированный интервал времени в соответствии с некоторой заданной дисциплиной об- обслуживания. Система, управляющая этими процессами, называется пла- планировщиком или супервизором. Смену процессов, требующих обработки, называют переклю- переключением процессов. Для повышения эффективности работы всей системы в целом в условиях мультипроцессирования эти пере- переключения необходимо выполнять за минимальное время. При управлении системой с мультипроцессированием следу- ет принимать во внимание следующее: !) Обращаясь вольно с русским языком, слово "процесс" можно употреб- употреблять в смысле "обработка". Однако онтологически оно относится скорее к со- совокупности нескольких единиц обработки. — Прим. перев.
Структуры данных и структуры управления 37 1) В силу важности операций ввода-вывода необходимо во- вовремя принимать заявки на их обработку. 2) Операции ввода-вывода выполняются на порядок мед- медленнее вычислительных операций в процессоре. 3) При выполнении операций с равными приоритетами опе- операции, начатые раньше, следует и раньше завершать. Первый пункт особенно важен в проектировании так назы- называемых систем реального времени. Известно, что быстродействие человека значительно ниже быстродействия операций ввода-вы- ввода-вывода, обслуживающих вычислительную машину. Однако если реакция системы на запросы требует некоторого времени (по- (порядка 2—3 с), то у человека пропадает желание продолжать взаимодействие с такой системой. Поэтому, как правило, наи- Одновременно сущест- существующие процессы Рис. 1.24, Схема мультипроцесснрования. Единственный вычис- вычислительный процессор более срочными являются процессы, связанные с устройствами ввода-вывода (по аналогии с человеческим организмом с рецеп- торными органами). Эти процессы не являются компонентами вычислительной системы и запускаются человеком в результате изменения окру- окружающей среды. Их называют процессами обработки прерыва* ний, а явления, в результате которых запускаются данные про- процессы, — прерываниями или событиями. Например, может возникнуть прерывание в результате нажа- нажатия человеком клавиши на клавиатуре. Вслед за этим запус- запускается процесс считывания с клавиатуры одного знака, который и является процессом обработки прерывания. Прерываниям, как правило, присваивают приоритеты, и при обработке предпочтение отдается прерываниям с более высо- высоким приоритетом. Прерываемый процесс в момент прерывания переводится в состояние ожидания. После окончания процесса, запущенного
38 K>.s or-:. .-■. ;nv i.-.-v. Глава 1 с г. нах«йся в состоянии учитывать времени, затрачиваемого на обработку прерываний то работа программы распараллеливается рчшьании, панииИСвяРГ^еЙСТВИе °ИСТеМЫ обРаб°тки банковских счетов ог- виши f, скоростью, с которой человек нажимает на кла- IZ'olZl^T" ******** П°РЯДКа Н6СКОЛЬКИХ МИНУТ на «Дин счет, однако за это время вычислительная система выполняет ZZZue операции для нескольких десятков «- ппишрл Реа*изащш принципа FIFO (first-in, first-out - первым пришел - первым обслужен), упомянутого в п 3 необходима структура данных, называемая очередью ' нео0ходима Как указывалось в разд. 1.2.3, для обработки Поступление заяВ- Очередь ки вконец очереди -о о - о- Выход заявки из . начала очереди _,, * Рас. 1.25. Схема очереди. enqueue: queueXa-+queue dequeue:queue-+<.a,queue> ifr%ftr ,.;*"'. ^"' В отличие от стеков соотношение '^^Г^3 ;i 'мэ ие выполняется. hI1H H 2 к
Структуры данных и структуры управления 391 первый элемент будет началом очереди, а L-й элемент — ее концом. Если переменной INDEX присвоить значение длины L цепоч- цепочки, то при выполнении операции enqueue (постановки заявка в очередь) будут выполняться следующие действия: INDEX-*-lNDEX+\ "См"^ eV; « q[index}<-x, ■,..:?""'.,; где X — элемент, добавляемый к очереди (например, процесс). В этом случае добавление элемента к очереди осуществляет- осуществляется очень просто, однако при удалении элемента из очереди в ней многое меняется. При выполнении операции dequeue удаления заявки из очереди необходимо выполнить следующие действия: одному Q[INDEX- 1]<-Q[1NDEX]; INDEX+-1NDEX-1 Таким образом, сокращение цепочки, состоящей из людей, выполняется просто, однако та же самая операция со структу- структурами данных, находящимися в машине, весьма обременительна. Упростить работу с очередями позволяет способ, показанный на рис. 1.26. В этом случае данные объединены в кольцо, начало и конец очереди помечены с помощью указателей. При этом опе- операции enqueue и dequeue значительно упрощаются. ч-< ENQUEUE(Q,X) = TA1L+-TA1L+1; ь ^ ч,ц -.' i J^-[ т Q[TAIL\+-X; r »■ ти; 1Н HEAD-t-HEAD+l; у,, r/J п На первый взгляд кажется, что образование кольцевых струк- структур в памяти машины представляет собой сложную задачу, однако ее можно осуществить, например, взятием индексов эле- элементов очереди по модулю длины очереди, т. е. значение индек- индекса определять в виде index mod length. В этом случае при пре- превышении длиной очереди значения length, индекс принимает значение нуль, что эквивалентно "закольцовыванию". В очередях могут выполняться не только операции поста- постановки в очередь и удаления из нее, т. е. enqueue и dequeue; ее элементам могут устанавливаться различные приоритеты в зави- зависимости от содержательной стороны заявок. При этом полу- получается очередь с приоритетами. ' .}оа
40 Глава 1 Коней, очереди 1.2.5. Управление конкурирующими процессами - ~ •..>< и их синхронизация : Методы управления и синхронизации обрабатывающих единиц (процессов), находящихся между собой в конкурентных отноше- отношениях, делятся на две большие группы. Одна из них включает в себя методы, основанные на общих переменных, вторая — на посылке заявок. Ниже изложены оба этих метода. 1) Методы управления и синхронизации, основанные на об- общих переменных. Существуют несколько методов управления и синхронизации, основанных на общих переменных. Одним из них является метод семафоров Дейкстры, о котором и пойдет речь ниже. Для реализации механизма семафоров используют перемен- переменные семафоров и функции р и v. Обозначим переменную семафора через s. Ее значениями могут быть целые неотрицательные чис- числа. Если при выполнении p(s)- функции в работающем в дан- данный момент процесс значение пе- переменной s окажется равным ну- нулю, то процесс останавливается, переводится в состояние ожида- ожидания, ставится в очередь, связан- связанную с данным семафором, и бу- будет находиться в этом состоянии до тех пор, пока начнет выпол- выполняться условие s>0. Если при этом имеется какой-либо другой процесс, готовый к выполнению, то он выполняется. Если s>0, то оператор p(s) уменьшает значе- значение s на единицу. Разумеется, проверка значения s и вычитание единицы выполняются нераздельно. Соответствующую команду можно записать как test & set. Если выполняется оператор v(s), то к значению переменной s прибавляется единица, и если в очереди к семафору s имеют- имеются процессы, то один из них берется из этой очереди, делается активным, а от значения переменной отнимается единица. Опе- Операции р и v называют взаимоисключающими, они должны быть доступны внешним прерываниям. Таким образом, через посредство внешней переменной осу- осуществляется управление конкурирующими процессами и нх синхронизация. 2) Управление и синхронизация посредством посылки зая- заявок. Начало очереди Рис. 1.26. Организации кольцевой структуры данных с перемещени- перемещением указателен.
Структуры данных и структуры управления 41 Метод посылки заявок, как следует из его названия, наряду с механизмами синхронизации имеет также механизмы передачи данных. При использовании для связи и синхронизации метода по- посылки заявок процесс вместо записи в общую переменную (се- (семафор) и считывания из нее выдает и получает сообщения. Если какой-то процесс получает сообщение, то тем самым реализует- реализуется связь по информации: сообщение не могло бы быть получе- получено, если бы его не посылали, а этим как раз и реализуется син- синхронизация. Для передачи сообщений используются методы: — назначения канала связи, — синхронизации обмена; ^имеются различные пути их реализации, о которых речь пой- пойдёт ниже. 1) Метод назначения канала связи. Для указания источника сообщения и процесса, выполняемо- выполняемого перед его посылкой, используется канал связи. Функция канала связи состоит в посылке сообщений — от одного процесса к одному процессу, — от одного процесса к нескольким процессам, — от нескольких процессов к нескольким процессам. В данном разделе мы рассматриваем посылку сообщений от одного процесса к одному процессу. В каналах типа "один процесс — один процесс" допускается посылка сообщений лишь от одного источника сообщений (т. е. процесса, порождающего сообщения) к одному процессу, полу- получающему и использующему для своей работы посланное сооб- сообщение (т. е. процессу — потребителю сообщения). Существуют несколько способов назначения имен каналу связи при исполь- использовании этого метода. Одним из них является присвоение име- имени самому каналу связи, используемому между источником и потребителем. Он используется в языке Оккам, описываемом ниже. Пусть каналу связи между источником Р и потребите- потребителем С присвоено имя channel 1. В процессе-источнике при вы- выполнении channelUX '■-'■ значение X может быть направлено в канал связи channel 1, а при выполнении в процессе-потребителе С channeim значение, посланное по каналу channel 1, попадает в перемен- переменную У. 2) Синхронизация с помощью канала связи. Посылка заявок по каналам связи может быть асинхронной и синхронной.
42 ►• ,o ,v;;;; .• у- Глава 1 .-,■„ и-:, *..,-,:>;,. Если предположить, что между процессом-источником и про- процессом-потребителем, соединенными между собой каналом, име- имеется бесконечной длины буфер, то процесс-источник не будет находиться в ожидании при посылке сообщения. Поэтому этот процесс может продолжать свою работу независимо от про- процесса-потребителя. Такую посылку заявок называют асинхрон- асинхронной, и именно этот метод используется в конкурентном Прологе. С другой стороны, если предположить, что между процес- процессом-источником и процессом-потребителем, соединенными меж- между собой каналом связи, отсутствует какой бы то ни было бу- буфер, то тогда процесс-источник должен подождать с посылкой заявки до тех пор, пока процесс-потребитель не будет готов к ее приему. Иными словами, посылка заявки от источника к потребителю будет возможна лишь тогда, когда откроется об- обмен между источником и потребителем по их совместной готов- готовности. Такую посылку сообщений называют синхронной; она при- применяется в языке Оккам. 3) Язык Оккам. Одним из языков, снабженных функцией обмена-синхрониза- обмена-синхронизации на основе посылки заявок, является язык Оккам. Его мы и рассмотрим. Язык Оккам был спроектирован и разработан английской фирмой Inmos на основе идей профессора Оксфорд- Оксфордского университета Хоара о "последовательных процессах, взаи- взаимодействующих через обмен информацией". В языке Оккам отразилась философия самого профессора Хоара, нацеленная на создание простого и ясного языка программирования. В этой связи уместно вспомнить, что Оккам — имя средневекового фи- философа, прославившегося своим принципом: "Не увеличивать число сущностей сверх необходимого". Программы на языке Оккам состоят главным образом из примитивов, т. е. базовых процессов, конструкторов, допустимых выражений и формул. Существуют три примитива. Один из них — процесс подста- подстановки, соответствующий постановкам в формулы в существую- существующих языках программирования. Два других процесса являются процессами ввода-вывода, характерными для языка Оккам. На- Например, процесс вывода с\е выводит значение формулы е в канал связи с. •■" Далее, процесс ввода . %^г ■ civ • р..» ' - присваивает введенное из канала значение переменной v. Конструкторы используются для связывания процессов друг с другом, образуя, таким образом, более крупные процессы* '■'
Структуры данных и структуры управления 43 '-' Рассмотрим основные конструкторы языка Оккам: — конструктор SEQ. Процессы, связанные конструктором SEQ, выполняются последовательно; — конструктор PAR. Все процессы, связанные конструкто- конструктором PAR, выполняются параллельно. Этот конструктор являет- является одной из разновидностей оператора управления параллель- параллельным потоком, рассматриваемого ниже (разд. 2.4а). — конструктор WHILE. Процессы, соединенные конструкто- конструктором WHILE, образуют структуру вида ШШ.£<ФОРМУЛА><ПРОЦЕСС> Здесь ПРОЦЕСС выполняется до тех пор, пока не станет лож- ложным результат выполнения ФОРМУЛЫ. Рассмотрим на примере программы, изображенной на рис. 1.27, обмен и синхронизацию на языке Оккам. PROC GENERATE(Vi4LI/£ INI, CHAN OUT)=- 4 ,HMS' -A •-'3*1 ■c SEQ * ::<>) N—INI • - L> '. WHILE TRUE SEQ OUT 1 N N:=N+1 >UTSTREAM(C///W IN)=. VAR I: WHILE TRUE ..•■--. < seq " ' • ;- IN? I • WRITE(I): " ;'•"; * : chan Chi -4" •■ ■'' ' ; ; '; ' . ;;; .;." ' • par " '"' ' \ ' ''" ,..';: ''"' '':b: \, GENERATE A.CHI) " . ' '''. '.. i.. .^,, OUTSTREAM(CHl) ' Рис. 1.27. Пример программы. •' f ' '- ~ ; В этой программе имеются два процесса. Процесс generate выводит в канал целые числа, начинающиеся со значения Ш. Процесс outstream выводит на устройство вывода значения, по- получаемые из канала. Поскольку среди процессов, связанных конструктором PAR, находящимся в конце программы, имеется процесс generate (l.cftl) то процесс generate передает через канал ch\ процессу outstream целые числа, начиная с единицы.
44 Глава 1 Поскольку, как уже говорилось выше, передача сообщений в языке Оккам осуществляется синхронно, процесс generate пе- передает одно целое число, процесс outstream принимает его и после этого процесс generate порождает очередное целое число с помощью оператора. Часть программы, начинающаяся термином PROC, является идентификатором процесса. Кроме него в программе имеются идентификатор переменной (VAR), идентификатор значения {VALUE), идентификатор канала (CHAN). Write (i) представляет собой процесс вывода на выходное устройство целого числа i. Будем считать, что он определен в другом месте. Поскольку значение формулы, находящейся в операторе, на- начинающемся с конструктора WHILE, равно TRUE, эти два про- процесса generate и outstream не заканчиваются, а продолжают со- совместно работать. Так, в языке Оккам с помощью различных конструкторов задается поток управления и осуществляется син- синхронизация и обмен через канал между конкурирующими про- процессами. •Т.': ■■ *.Г bs ))Г " J'l , V ,4 H ^klf *?'»< y'ff ft "
<■ ,. s - t • Отношения 1 I и объекты J ( . ,,»<) гн I . Г . .1 В данной главе мы рассмотрим вопросы построения информа- информационной модели окружающего нас мира, связывая эту задачу не только с концепциями, изложенными в предыдущей главе, но и с архитектурой новой (не фон-неймановской) машины, позво- позволяющей более естественно реализовать эти концепции. 2.1. Модель мира : : г _ .■■ 2.1.1. Вещи и отношения Окружающий нас мир предельно конкретен, однако если абстрагировать его с позиций познания1', то мы придем к поня- понятиям "вещей" (объектов) и отношений, существующих между ними. Эти два типа понятий весьма глубоки и признаны как бы "атомарными", т. е. не допускающими дальнейшего дробления. Таким образом, основываясь на базовых понятиях объектов и отношений, можно (по крайней мере с позиций задач обработ- обработки информации) построить некоторую модель мира. При этом существуют две основные точки зрения, различающиеся между собой по тому, что считать более важным: вещи или отношения. Одна точка зрения заключается в том, что вещи обладают внутренней структурой и связаны с другими вещами посредст- посредством различных отношений. Это хорошо согласуется с нашими непосредственными наблюдениями. Расчленяя эти вещи на их составные части, мы видим, что казавшиеся единичными объекты имеют сложную структуру, , q ') О категориях абстрактного н конкретного в дшииклгоскоД ШЯт ср, Э. В. Ильенков. Диалектическая логика: Очеркн истории н теории. —.Ж: По- Политиздат, 1984. — Прим. ред. ^-" "' ^^ .- *■ -ц^ ■ ."Tv^ ' .,
46 Глава 2 * распадающуюся на ряд отношений, существующих между этими более простыми компонентами. Продолжая расчленение, мы в конце концов приходим к простейшим "вещам", которые уже в данной теории не обладают внутренней структурой и сущест- существуют в виде "точечных" объектов, связанных отношениями с другими объектами. От этой точки зрения можно перейти к другой, ставящей в центр внимания отношения. Те же самые две точки зрения существуют и у программи- программистов. Точка зрения, рассматривающая в качестве основы вещи, проявляется в объектно-ориентированном программировании, а точка зрения, рассматривающая в качестве основы отноше- отношения, — в логическом программировании. Однако по сути своей эти две точки зрения не противоречат друг другу. Следует понимать, что они взаимно дополняют друг друга в постижении окружающего нас мира. Представления, ос- основанные на обеих точках зрения, должны переходить одно в другое путем взаимных преобразований. Однако исследования в этой области пока еще не доведены до уровня технической реализации методов таких преобразований. Поэтому в настоя- настоящее время выбор делается на основе индивидуальных приорите- приоритетов и порой ведутся жаркие дискуссии о том, какая точка зре- зрения предпочтительнее. По-видимому, по мере развития исследо- исследований острота этих дискуссий будет спадать. 1ШОНМ i-i $ 2.1.2. Исчисление предикатов ;;: Hi{ лгяи .-v/q В исчислении предикатов1' за основу берутся отношения. По- Построение логики предикатов характерно для всей логики в це- целом, а разные логические системы строятся на основе разных формул. Предложено много различных логических систем. Уста- Установление соотношений между ними является одной из задач логики как науки. Какова же причина того, что логика предикатов продолжает занимать особое место в логических системах? Скорее всего это связано с тем, что в качестве элементов этой логики, т. е. исчис- исчисления предикатов, используются простые формулы, а правила вывода, используемые в качестве логических операций, выража- выражаются четко и определенно. Можно рассмотреть также и объектно-ориентированные ло- логические системы. По сравнению с исчислениями предикатов они обладают более сложными синтаксисом и правилами вывода. Исторически сложилось так, что логика Аристотеля, положив- '> См. Мендельсон Э. Введение в математическую логику. — М.: Наука, 1984. — Прим. ред.
Отношения и объекты 47 шая начало теории правильных рассуждений, была объектно- ориентированной. Построенная им система силлогизмов из трех суждений (большой посылки, малой посылки и заключения) от- отличается большой сложностью. Однако, после того как были разработаны исчисления отношений, стало ясно, что многочис- многочисленные сложные фигуры силлогизмов по трем суждениям явля- являются лишь различными модификациями базовых правил вы- вывода. Если исходить из задач математического исследования ло- логических систем, то желательно, несколько абстрагируясь от действительности, располагать простыми и ясными формулами. Однако если исходить из задач программирования, то следует иметь в виду необходимость обеспечения доступности системы пользователю, а также то, что объектно-ориентированный под- подход больше соответствует обыденным человеческим взглядам. Конечно, при этом возникает множество разных проблем, требующих исследования, которые включают в себя также и технические аспекты, однако при этом общая картина могла бы иметь такой вид. Элементами, образующими исчисление предикатов (для одной формулы), являются: 1Ч UJO: !,.;Н:„!С:1 1) константные термы С\, с2) ...; . 2) переменные термы х\, х2, ...; •»' ■ 3) функциональные буквы fu f2, ...; 4) предикатные буквы ри р2, ...; лн er.:jasqii Mqq 5) логические символы -»-, Я ...; ннтон г нлэатэзг.жот пг.оз 6) специальное высказывание П. . *-£. гйги/жкчр вннитум ■>.» Число термов для каждого предиката фиксировано и назы- называется его арностью. Термы определяются следующим образом: I 1) константный терм есть терм; 2) переменный терм есть терм; 3) для функциональной, а также для предикатной буквы оп- определена арность как целое неотрицательное число. Если ар- арность функциональной буквы f есть п, a tu t2, ..., tn — термы, то (U, t2, ..., tn) также терм. Приписывая термы предикатным буквам, получаем следую- следующие формулы: 1) □ есть формула; 2) если арность предиката р есть п, то -формула - -—; ^.Ж 3) ДЛЯ ДВуХ формуД^! И Рг рГ*Фмгг формула»та йянэ:>в«?. Ж
48 Глава 2 4) если формула р содержит свободную переменную х, то — формула1'. При этом х в этой формуле называют связанной переменной. Не связанные переменные являются свободными леременными. Формулу, не содержащую свободных переменных, называют замкнутой формулой или высказыванием. Замкнутая формула может быть истинной или ложной. Символ □ является ложной замкнутой формулой; он выражает понятие "противоречие". Формула p{U tn) говорит о том, что между термами U, .... tn выполняется "отношение". А-уВ означает, что если истинно А, то истинно В. А-+П оз- означает, что А ложно. Это записывается как:~1 А. Среди формул выделяются тождественно истинные формулы или аксиомы. Примеры аксиом ~~\~\А эквивалентно Л А —*■ (В —*■ С) эквивалентно В —»■ (Л —»■ С) и т. д.2). Последняя аксиома, например, говорит о независимости порядка следования посылок, что позволяет записать: Примером правила вывода является правило modus ponens: если тождественно истинна формула Л и при этом тождествен- тождественно истинна формула: А-*В, то формула В тождественно истин- истинна. Кроме этого правила, существуют правила вывода, учиты- учитывающие наличие квантора существования. Существуют также аксиомы, содержащие квантор Я. Строгое описание манипуля- манипуляций с формулами и правилами вывода дается в учебниках по логике. Здесь же мы дадим графическое представление формул. Его называют диаграммами Пирса. В его обозначениях формула ~~| А, т. е. А-*~П, изображается ввиде: . - , w , .. wi " Формула Ядс.р(дс) читается так: "существует х, при котором выпол- выполняется р(х)". — Прим. ред. 2> Эквивалентность в данном случае означает, что левая и правая части формулы принимают одинаковые логические значения при одинаковых набо- наборах значений входящих в них переменных. — Прим. ред.
Отношения и объекты Таким образом, рисунок вида 49 есть А соответствует формуле А. Формула А-+В изображается (в соответствии с формулой Л &П В) в виДе A \B Если выпойЯимо Л, то, согласно правилу вывода, выполнимо В. Эта операция изображается в виде иг- А В (Здесь А, находящееся вне прямоугольника, стирает А, нахо- находящееся внутри прямоугольника.) Поскольку несколько посылок можно записать подряд, то возможна также запись вида An [В Запись без рамки AtA2...An выражает тот факт, что выполняется Каждая из формул: Аи А2, ..., Ап, т. е. имеет место конъюнкция. Это можно счи- считать сокращенным видом записи . * < Ах Аг Дизъюнкция имеет изображение (соответствует формуле 1ПЛ&Л&-1Л)) ШШИ0ШШ> выражается в виде дереве- • Р ^ ' f >R Г. '\?J - 4 ll 4—1428
50 Глава 2 Переменные термы изображаются кружочками, что дает ри- рисунок вида Г< '. Например, формулуYx. р(х) (т.е. для всеххвыполняется р(х)) можно задать в виде 1 3.x. ~] р(х), и потому она может быть изображена на диаграммах Пирса в виде ,Рч S'hxlti Эти графические представления являются одцой из разно- разновидностей так называемых семантических сетей. Пусть имеется несколько истинных высказываний, задавае- задаваемых (трехместным) предикатом р (а{, Ьи с% — константные термы). Р(ат,Ьт,Ст) Эту запись можно сделать в виде таблицы. В ней сведены вместе элементы отношения, задаваемого предикатом р и спра- справедливого для а, Ь, с и других троек термов. р: < 1 2 3 : ат Ъг •: Ьт сг : Cm U ... ) Полная таблица, выражающая истинные высказывания, назы- называется базой данных. Поскольку в ней основным понятием яв- является понятие отношения, ее называют реляционной базой данных. В качестве языка программирования можно рассматривать логическую систему Хорна, являющуюся частью исчисления
Отношения и объекты 51 предикатов. Ее так и называют языком логического программи- программирования. Вкратце об этом написано в разд. 2.3. Одним из при- примеров языков подобного типа является язык Пролог. Логика Хорна шире теории реляционных баз данных. При этом языки логического программирования естественным обра- образом включают в себя (как часть) реляционные базы данных (разд. 2.2). Языки программирования можно строить на основе поня- понятия функции (общепринятого в математике). Функцию можно рассматривать как особый вид отношения, на которое наложе- наложены некоторые ограничения. В этом смысле языки функциональ- функционального программирования можно считать особым видом языков логического программирования. Функциональное программиро- программирование также кратко рассмотрено в разд. 2.3. тс. on 2.1.3. Объектно-ориентированное программирование Отношения, как правило, выполняются между двумя объекта- объектами. Однако в исчислении предикатов и в реляционных базах данных это понятие расширено и считается, что отношение вы- выполняется между п объектами. Такое отношение называют л-арным. Обычное же отношение является бинарным отноше- отношением. С другой стороны, существуют и унарные отношения. Унарное отношение обычно называют «свойством». Например: МУЖЧИНА -{ИМЯ МУЖЧИНЫ} н, dfl ЖЕНЩИНА -{ИМЯ ЖЕНЩИНЫ} '.,..-" ~*?г приятный -{имя мужчины или женщины} r.T^o-w с< УПОРНЫЙ ■ -{ИМЯ МУЖЧИНЫ ИЛИ ЖЕНЩИНЫ} , ,,о^ОКУГ5 Пусть - ОТЕЦ-ДОЧЬ {ИМЯ МУЖЧИНЫ, ИМЯ ДОЧЕРИ} — схемы бинарного отношения. Зафиксируем один из элемен- элементов первого домена. Тогда получим унарное отношение ОТЕЦ-ДОЧЬ {ТАРО, ИМЯ ДОЧЕРИ} Оно может быть пустым или содержать несколько элементов — имена всех дочерей ТАРО, если у него есть хотя бы одна дочь. Отношение ОТЕЦ-ДОЧЬ {ИМЯ МУЖЧИНЫ, ХАНАКО} ^dO'lufl' м!»№ имеет единственный элемент. 1дл*г> нннеяон! Так из л-арных отношений извлекаются обобщенные^зависи-5 мости, и, если имеется несколько отношений, где в качестве имени атрибута входит "Имя мужчины", аналогичным образом
$2 Глава 2 можно получить всю информацию, имеющуюся^ ю Таро в следующих отношениях: , .. • _..; я:.л>' * ТАРО-МУЖЧИНА, .: : ,,иг во;. ТАРО-ОТЕЦ (ХАНАКО), . > ; ,-f qoX . ТАРО-УПОРНЫИ к :-- - ,.,э: .лс■■ : ■И Т. Д. Реляционные базы данных составляются, таким образом, •из множества отношений-таблиц. В такой базе данных, напри- например, имя лица, именуемого Таро, разбросацо по различным таблицам. Если база данных обладает цельностью, то она долж- должна отражать всю информацию о Таро. Однако может потребо- потребоваться собрать воедино всю информацию о Таро. При этом всю информацию, извлеченную из реляционных таблиц, можно 'Собрать в одно место, как описацо выше, и создать базу дан- данных по отдельным лицам. Тогда свойства соберутся следующим образом: ,;;: ri * ТАРО —МУЖЧИНА, — УПОРНЫЙ ■> \>:,- ■и т. д. , Для n-арных отношений (включая сюда и бинарные) можно •ввести обобщенные "свойства" (зависимости). Например, на ос- основании отношения ОТЕЦ-ДОЧЬ (ТАРО, ХАНАКО) можно •сказать, что Таро имеет свойство ОТЕЦ-ДОЧЬ (>)<, ХАНАКО), ■ или это можно переписать в виде ОТЕЦ (ХАНАКО). Таким образом, для индивида по имени Таро можно собрать труппу соответствующих ему свойств. (Существует и такое фи- .лософское учение, согласно которому индивид полностью зада- <ется совокупностью его свойств.) Это — объективно-ориентированный подход; он, дополняет ■реляционный подход. Категории свойств в объектно-ориентированном представле- представлении знаний часто выражают в явном виде. Например: ТАРО-пол: МУЖСКОЙ, : ' характер: УПОРНЫЙ. -п.У. С Это соответствует присвоению имен ролям термов в отно- -шении. При этом сведения о конкретном индивиде не записываются ■непосредственно в базу данных, а выводятся из знаний общего чвида, подобно знаниям, понимание которых реализуется на ос- шовании общих законов. « Например, если ввести для человека общие категории: ;— -ЧЕЛОВЕК ~ число рук 2, ".'. si,, . 'число ног.2
Отношения и объекты 53 и если справедливо утверждение "Таро — человек", иными сло- словами, если можно записать формально ТАРО—ЧЕЛОВЕК, то в базу данных уже можно не заносить сведения о количестве рук и ног у Таро. Таким образом, разбив всех индивидов на классы, можно записать в обобщенном виде категории для каж- каждого класса. Индивид, принадлежащий некоторому классу, наследует свойства из этого класса. Классы можно также классифицировать и структурировать по-разному. Например, можно указать, что человек является живым существом. Таким образом, объективно-ориентированные •структуры данных представляют собой более структурирован- структурированные образования, чем модели, построенные просто на основе реляционных баз данных. Однако если пополнить реляционную модель общими законами, то и та и другая модели станут экви- эквивалентными. При рассмотрении логических программ, содержащих в себе реляционные базы данных, можно установить соответствие их с объектно-ориентированными моделями. Хотя в этих двух подходах нет существенной разницы, их особенности обусловлены по крайней мере традицией научных исследований в этой области. В объектно-ориентированных языках есть возможность выражать не только статические свойства индивидов и классов, но и учитывать их динамику. Одни объекты могут посылать сообщения другим объектам. Благодаря этому удается построить модели с изменяющимся внутренним состоянием. Обычное A порядка) исчисление пре- предикатов отражает статическую сторону упрощенной модели мира. Однако ведутся исследования по обобщению логики пре- предикатов, позволяющему моделировать динамические свойства. Примерами могут служить логические системы, называемые временными логиками и т. д. Механизмы (интерпретации), позволяющие осуществлять обмен сообщениями, вводятся и в языки логического програм- программирования. 2.2. Реляционные модели кн < г -- <-.,<■ :'Ч iff'1'". 2.2.1. Реляционное представление знаний Реляционная модель была предложена Коддом в 1970 г.. Она представляет собой модель данных, в которой база дщнных. представлена набором n-арных отношений. ... - . .<«.*. . л"
54 ' Глава 2 n-арным отношением R называют произвольное подмножест- подмножество декартова произведения D\*D2*...*Dn множеств Du D2, ..., Dn (я>1). При этом Du D2, ..., Dn называют доменами, а элемент отношения — кортежем <vu v2, ..., и„>е/?(а,-Д-, t=l, ... лI'. С математической точки зрения отношение может быть беско- бесконечным множеством, однако в реляционных моделях его пред- предполагают конечным. Домены Di и Dj(i^j), которые служат основой для задания одного отношения, могут быть одним и тем же множеством. Например, при моделировании расписания авиарейсов естест- естественно предположить, что среди множеств <"номер рейса", "аэропорт отправления", "аэропорт назначения", "время от- отправления") и т. д. в качестве множеств D2 и D3 взять множе- множество АЭРОПОРТ. Чтобы различать эти множества А, им при- присваивают имена и называют их именами атрибутов (или просто атрибутами). Множество имен атрибутов {Аи А2, ..., Ап} отно- отношения R (в порядке их следования) называют схемой отноше- отношения. Схему отношения записывают также в виде R{AU Л2, .... Ап}., Отношения удобно изображать в виде таблиц, как пред- представлено в табл. 2.1. Данная таблица представляет отношр- (< , .Таблица 2.1. Отношение: «Места, посещаемые туристами» ,,г х,. Наименование местности Центр префектуры Расстояние от То- Токио, км ' "' ~х ' Камакура Атами Ито Симода Канагава Сндзуока Сндзуока Сидзуока 51 105 ;•• 122 'i1 135 а&' ..ли - ^ <Л :,сгйИ ОТ;!;;; ние: "Места, посещаемые туристами", состоящее из трех атри- атрибутов: "наименование местности", "наименование центра пре- префектуры", "расстояние от Токио". При изображении отношений с помощью таблицы ее строки соответствуют кортежам, а ее столбцы — атрибутам. Поскольку отношение было определено как подмножество, порядок следо- следования кортежей, т. е. положение строк в таблице, роли не иг- играет. По сравнению с ним порядок следования атрибутов (столбцов) входит в схему отношения. Можно определить отно- отношение независимо от порядка следования атрибутов, однако для сохранения связей с логическим программированием будем '> При я=2 отношение называется бинарным, а при л=1—унарным от- отношением.— Прим. ред. - •' , ..„....-
Отношения н объекты 55 считать существенцым порядок следования атрибутов в отно- отношении. Подмножество K={Aiv Л,-2, ..., Л,к} заданной схемы {Аг, Лг, ..., Ап} отношения R будем называть ключом, если в двух различных кортежах отношения R значения в каждом атрибуте из К не все одинаковы, и ни одно собственное подмножество К этим же свойством не обладает. Другими словами, ключ — это такое множество атрибутов, ко- которое при заданных значениях этих атрибутов однозначно определяет кортеж (и при этом не содержит лишних атрибу- атрибутов). В обычных языках программирования файл часто считают множеством записей, а запись — множеством полей. Отношение можно представить файлом, кортежи отношений — записями ■файла, атрибуты кортежа — полями записи, таким образом, от- отношение можно считать строгим определением файла. Посколь- Поскольку понятия записи, файла и т. д. используются в других моде- моделях данных, одно только задание отношений нельзя считать достаточным для определения реляционной модели. Как прави- правило, базу данных считают собранием файлов (отношений), одна- однако при отображении реального мира посредством базы дан- данных файлы не следует помещать на диски беспорядочно, их необходимо организовать в виде некоторого набора файлов, органически связанных между собой. Модель данных приобре- приобретает свою индивидуальность именно в зависимости от того, ка- каким образом установлены эти связи. В реляционной модели базу данных рассматривают как на- набор файлов. Структура базы данных выражается набором схем отношений и называется схемой базы данных. В схеме реляци- реляционной базы данных в отличие от других моделей данных связи между отношениями не записываются в явном виде (за исклю- исключением ограничений на целостность базы данных), о чем гово- говорится в разд. 2.2.5. Таким образом, структура реляционной ба- базы данных выражается чрезвычайно просто. Операции над базой данных выполняются с помощью одной или нескольких реляционных операций над отношениями. В других моделях данных операции выполняются над отдельными записями, а особенностью реляционных операций является то, что они вы- выполняются над множествами в целом. Теория реляционных баз данных является частью исчисле- исчисления предикатов. Совокупность операций, порождающих новые таблицы из совокупности существующих таблиц, задающих отношения, определяет реляционную алгебру. Реляционные операции делятся на две большие группы: поиск (запрос) и обновление данных. Метод формирования
56 «; ; Глава 2 '■"•' '■ поисковых предписаний изложены в следующем разделе. При- Примерами методов могут служить реляционная алгебра, представ- представляющая собой систему операторов, задающих операции над мно- множествами, а также реляционное исчисление, основанное на ис- исчислении предикатов первого порядка. Обновление же базы данных, как правило, задается операциями, ограничивающи- ограничивающимися одиночными отношениями. При этом возникает ряд проб- проблем, одной из которых является опасность нарушения целост- целостности базы данных в случае, когда производится обновление нескольких отношений. ■:: .,, ;;<: ■,,.,, п<? К операциям обновления относятся: ' ,' ;<;-. ■-.', а) операция добавления; ■; ;;: ' •: : б) операция модификации кортежей, удовлетворяющих поиско- поисковому предписанию; в) операция удаления кортежей, удовлетворяющих поисковому предписанию. Все эти три операции выполняются над отдельно взятым от- отношением. Что касается объекта, над которым выполняется обновление, то в качестве источника формирования поискового предписания может быть взято другое отношение. 2.2.2. Первый вид операций над отношениями: с >т: реляционная алгебра ■ <:г нч;: : 1С' Поскольку отношения являются множествами, одним из есте- естественных способов выполнения операций над отношениями яв- является использование системы операций над множествами. В качестве такой системы операций была предложена реляци- реляционная алгебра. Важной особенностью реляционной алгебры является простое соответствие между выразительными возмож- возможностями различных языков формирования запросов и процеду- процедурами, реализующими эти запросы. Таким образом, если еще можно отстаивать выразительные возможности языков запросов, в которых не используется реляционная алгебра, то возможности выполнения запросов чаще всего реализуются с помощью языков, использующих реляционную алгебру. Реляционная алгебра включает пять основных операций и четыре вспомогательных: сумму, разность, пересечение, декар- декартово произведение, выборку, проекцию, в-соединение, обыкно- обыкновенное соединение и деление. 1. Сумма. Суммой отношений R и 5: R[)S является множе- множество всех кортежей, содержащее кортежи из R и S. 2. Разность. Разностью отношений R и S:R—S является множество всех кортежей, содержащее кортежи из R и не со- содержащее кортежи из S.
', Отношения и объекты 57 3. Пересечение. Пересечением R(]S отношений R и 5 явля- является множество кортежей, одновременно содержащихся в отно- отношениях R и S. 4. Декартово произведение. Декартовым произведением R*S отношений R и S является такое множество кортежей t = <Ju r2, .... rm, su s2, ..., sn>, что <гь r2, .... rm>e/? и <s1( s2, .... Четыре перечисленных выше операции совпадают с обычны- обычными операциями над множествами. Операции суммы, разности и пересечения выполнимы лишь тогда, когда отношения R и S являются подмножествами декартовых произведений одних и тех же доменов. Кроме того, для пересечения R(]S можно за- задать соотношение: = R-(R-S). Имеются также особые операции над отношениями. 5. Выборка. Выборкой <xf(R) из отношения R является мно- множество всех кортежей отношения R, для которых истинен пре- предикат F. Если мы будем называть компаративными термами вычислительные операторы сравнения ( = , >, <, ^, Ф) атри- атрибутов с константами, либо атрибутов с атрибутами, то преди- предикат F выразится комбинацией булевских операторов (Д. \Л ~1 } над такими термами. 6. Проекция. Пусть R^AiXA2X...XAn — n-арное отноше- отношение. Проекцией nx{R) отношения на множество X—{Atlt ..., Aik) доменов называется такое множество всех кортежей что существует кортеж * f = (fi,r2,...,rm) . ?. отношения R, в котором r,y = «j (/=1, 2 k). Vi ■•*:,>'.• . Другими словами, проекция представляет собой операцию создация множества кортежей путем отбора из каждого кор- кортежа отношения R указанных атрибутов. При этом могут воз- возникнуть кортежи, у которых все значения атрибутов полностью совпадают. Поскольку отношение определено как множество, все повторения в этом случае удаляются. Комбинированием ос- основных операций реализуют ряд других операций реляционной алгебры. 7. 6-соединение. в-соединение R P.^ S отношений R и S, где т — число доменов в R, определяется так: пусть в — вычис- вычислительный оператор сравнения; Л/ — имя атрибута с t-м номе- номером в отношении R; А/ — имя атрибута с ;-м номером в отно-
58 "':'''' Глава 2-l шении S. Тогда R $$ S=aAi*A m+.(R*S). Здесь Ат+1 — имя атрибута с номером /га + / в /?*S, где /га — число доменов в /?. Частный случай в-соединения, когда в представляет собой равенство, называется эквисоединением. 8. Обыкновенное соединение. Обыкновенное соединение R t><\ S отношений R и S определяется следующим образом. а) Пусть количество одинаковых имен атрибутов в R и S равно й. Чтобы различать атрибуты того и другого отношения, будем обозначать их точечной записью в виде: R.Aie . „_ . Обозначим тс- г.- ■■■ 1=aR'Ai1=SA '*■■■№At =S'Aj (R*S)> !i k k где R.Aie и S.Aje (/= 1 ft)—имена одинаковых атрибутов отношений R и S соответственно. б) Если обозначить количества атрибутов в отношениях R и S через man соответственно, то количество имен атрибутов среди S.A/, не равных именам атрибутов из R, будет равно п—k. Обозначив их через S.ASl%..., S.Asn_k, получим R>< S = nR.Al K-Am,S-An S-As J- n—я Как видно, при заданных R и S выражение /?[><] S опре- определяется однозначно, и поэтому, как и в эквисоединении, нет необходимости указывать атрибуты, по которым выполняется соединение. Обыкновенное соединение играет важную роль при создании отношений. 9. Деление. Пусть количества атрибутов в отношениях R и 5 равны т + п и п соответственно. Обозначим кортеж из R че- через г=(и, у>. Здесь и — сокращенная запись для тх. ..., rm; v — сокращенная запись для rm+\, ..., rm+n. Аналогично обозна- обозначим кортеж из S через <ш>. Тогда частным от деления R иа S, R-i-S, будет такое множество <и>, что для всех кортежей <ш> из 5 существует кортеж (и, w} из R. Деление можно выразить через базовые операции реляционной алгебры Я-^'Ч Am(R)-nAl,..,Am((nAl,...Am(R)*S)-R). ., Данную операцию называют делением в связи с тем, что= для нее выполняется условие и<,Л _е (r*s)+s=r. .ел. При этом соотношение (R+S)*S = R не выполняется. Итак, мы ввели девять операций реляционной алгебры. При определении этих операций и в комментариях к ним были показаны способы образования всех остальных из пяти база*
Отношения и объекты 59 вых операций. Среди них особенно важным является понятие соединения, в частности эквисоединения, часто используемого при формировании запросов. Помимо этих существуют также и другие операции, напри- например полусоединение, используемое в связи с оптимизацией об- обработки запросов. При формулировании реляционных опера- операций с помощью реляционной алгебры одних и тех же резуль- результатов можно добиться путем сочетания различных операторов. Это происходит в силу ряда причин, например использования в определении операции выборки операции соединения, реализо- реализованной через булевские операторы над компаративными тер- термами. В частности, выполняются соотношения: , . ... f o Эти свойства, а также свойство коммутативности, выполняе- выполняемое для некоторых операторов, используются для оптимизации обработки при запросах. 2.2.3. Второй вид операций над отношениями: ,■--,■. ;го{.,г.яр. гш реляционное исчисление Реляционное исчисление является одним из видов исчисления предикатов первого порядка, используемого в качестве основы для создания языка запросов к базе данных. В реляционной алгебре операции над отношениями выражаются в виде комби- комбинации нескольких операторов. В реляционном же исчислении задаются формулы исчисления, которым должны удовлетворять отношения, являющиеся результатами операций. Существуют два вида реляционных исчислений: реляционное исчисление кор- кортежей, в котором используются переменные для кортежей, а также реляционное исчисление доменов, в котором использу- используются переменные для доменов. Начнем с реляционного исчис- исчисления кортежей, предложенного Коддом. В реляционном исчислении кортежей (для краткости будем его называть исчислением кортежей) запрос имеет вид {'If @>. где / — переменная для кортежей; f — формула исчисления. Смысл данного запроса состоит в том, чтобы найти множество кортежей, для которых формула f истинна. Вначале введем элементы исчисления, а затем определим понятие формулы ис- исчисления кортежей. ,, , , ; , ,v<,. . , ;
60 iT,iSJ Глава 2 1. Если t — переменная для кортежей, то R(t) обозначает, что / принимает значения из множества кортежей отношения К. t[i] обозначает t-ю компоненту кортежа / (значение атрибута). 2. Если t и и — переменные для кортежей, а 6 — знак вычис- вычислительной операции сравнения, то монадические термы объеди- объединения будут определяться одним из следующих способов: а) /Г(|8<константа> и <константа> Эф'], б) t[i]Qu [/]. •■ ■ .. Тогда правильно построенная формула (ППФ) исчислвввя кортежей рекурсивно определится следующим образом: ,.,«., 1. R(t) есть ППФ. л л;; 2. Терм объединения есть ППФ. 3. Если 1 — ППФ, то (/) и (If) — ППФ. ] 4. Если f и g — ППФ, то (fA§) —ППФ и (fV£) — ЯЯФ. 5. Если f — ППФ и t — свободная переменная в f, то .t(ft кУг({)ППФ 6. Других ППФ нет. Здесь переменные в ППФ могут быть свободными или свя- связанными. Свободные и связанные переменные определяются согласно следующим правилам. 1. Переменные для кортежей в R(t) ив термах объедине- объединения являются свободными переменными. 2. Переменные для кортежей в формулах: (/) и (~)f) явля- являются свободными или связанными переменными в зависимости от того, являются ли они свободными или связанными в фор- формуле f. В формулах (fAg) и (Л/#) переменные для кортежей являются свободными или связанными в зависимости от того, связаны ли они в формулах f и g. 3. Переменная для кортежа /, свободная в формуле /, явля- является связанной в формулах C/) (f) и (Yt)(f). Связанные пере- переменные, отличные от t, связаны в формулах (Я/) (/) и (V/) (/) в зависимости от того, связаны ли они в формуле f. Если f(t)—ППФ, в которой / — единственная свободная переменная для кортежей, то выражение называют формулой исчисления кортежей. Запросы к базе дан- данных выражают в виде формул исчисления кортежей, например' в виде ПРИМЕР СУММА * RUS:{T\R(T)\/S(T)} ПРОИЗВЕДЕНИЕ " R П S: {T\R{T)AS{T)} РАЗНОСТЬ /?—S: {Г|/?(Г)Л~|5(Г)} ! -V ПРЯМОЕ ПРОИЗВЕДЕНИЕ RxS:{T\ CG) (ZV) (R(U)A
Отношения и объекты 61 Аналогично можно определить проекцию и выборку и та- таким образом выразить все пять базовых операций реляци- реляционной алгебры через формулы исчисления кортежей. Ясно, что с помощью только что определенных формул ис- исчисления кортежей можно выражать запросы, однако всегда ли этими формулами можно выразить отношения? Например, ка- какой смысл имеет формула Рассмотрим, в каких же случаях формулы f(t) исчисления кор- кортежей соответствуют отношениям, т. е. в каких случаях запро- запросы имеют смысл. Прежде всего, чтобы {t\f(t)} становилось множеством, при значении t0 переменной t значение f{t0) формулы f(t) должно быть истинным или ложным. Например, в формуле i(t)°= = (Vu) ЦФи) область значений переменной и явно не задана, и значение истинности формулы не определено. В формулах f(t) вида )ntf()V(^«) или область значений и, доставляющих истинное значение форму- формуле f(t), ограничена, и поэтому задание значений t определяет истинность или ложность всей формулы. Следовательно, необ- необходимо задавать области значений как связанных, так и сво- свободных переменных. Если в качестве областей значений переменных кортежей взять множества, задаваемые декартовым произведением до- доменов, то формула {^|/@} соответствует, как правило, множест- множеству, однако если это множество не является конечным, то при реальной работе с базой данных оно теряет смысл. Поэтому области значений переменных для кортежей всегда ограничива- ограничивают с помощью специально заданных выражений в явном виде. Обозначим через DOM(f) объединение множества констант в формуле f и множества компонент кортежей, фактически су- существующих в отношениях, входящих в формулу f. Поскольку отношения являются конечными множествами, то DOM(f) — также конечное множество. Если при этом выполняются сле- следующие три условия, то формула {t\f(t)} называется соответ- соответственной диапазонной ППФ. 1. Если функция f(t) истинна, то каждая компонента корте- кортежа t должна быть элементом DOM(f); для кортежа t с компо- компонентами, значения которых не являются элементами множества DOM(f), формула f(t) не должна быть истинной. 2. Некоторая подформула формулы /, имеющая вид C3.u)(g(u)), истицна, если подформула g(u) истинна для лю-
62 ,,7.: Глава 2 irr, бых значений свободных переменных иных, нежели и, при не- некотором значении и, которое должно быть элементом множест- множества DOM(f). 3. Если некоторая подформула формулы f имеет вид ,(Vu) (g(u)), то ее можно преобразовать к эквивалентному виду ~ (Яы) (#(")); при этом для подформулы C3.u)(g(u)) выпол- выполняется условие 2. Условие 1 является ограничением на свободные переменные, а условия 2 и 3 — ограничениями на связанные переменные. Например, формула {*|~!^@} противоречит условию 1, а фор- формула {t\R(t)Л(Vu) AФи)}—условию 3. Поэтому обе они не являются соответственными диапазонными ППФ. Известно, что соответственные диапазонные ППФ исчисле- ция кортежей по своей выразительной силе эквивалентны ре- реляционной алгебре. Кроме реляционного исчисления и исчисления кортежей известно исчисление доменов. В исчислении доменов вместо переменных для кортежей используются переменные для доме- доменов, определяемые почти так же, как в исчислении кортежей. К настоящему времени введено три типа исчислений доменов, эквивалентных исчислению кортежей; все они по выразитель- выразительной силе эквивалентны друг другу. Языки запросов, обладаю- обладающие по крайней мере эквивалентной им выразительной силой, называют реляционно-полными. Среди языков, основанных на исчислении кортежей, имеют- имеются такие языки, как Alpha, QUEL и т. д. Языком, основанным на исчислении доменов, является язык QBE. Кроме того, су- существует язык SQL, который сочетает в себе свойства исчисле- исчисления кортежей и реляционной алгебры. В реляционных операциях, имеющих самое непосредствен- непосредственное отношение к реляционному исчислению, используется фор- форма Хорна. В основу ее применения положен единый взгляд на два факта: истинность предиката г(хи ..., хп) и принадлежность кортежа (хи ..., хп} множеству кортежей отношения R. Напри- Например, если выполняется условие r(X,Y):-p(X,Z)q{Z,Y), то существуют отношения Р и Q, соответствующие предика- предикатам р и q. При этом множество всех кортежей, являющихся результатом поиска по запросу [:—г(Х, У)], совпадает с ре- результатом эквисоединения R = Pt><3 Q. Способ выражения Аа=Ах множества реляционных операций через формы Хорна позво- позволяет выразить пять базовых операций реляционной алгебры (а следовательно, и все составные операции), и поэтому он ре- ляционцо-полон. Он позволяет также выражать рекурсивные
Отношения и объекты t 63 операции и поэтому обладает большей выразительной силой по сравнению с реляционным исчислением. Если в этом методе форму Хорна считать дедуктивным правилом, то обработку запроса можно мыслить себе как процедуру дедукции. Следовательно, СУБД, в которых реализован этот метод, можно называть дедуктивными СУБД [19]. 2.2.4. Управление реляционной базой данных [!f ^ В реляционных СУБД необходимы специальные механизмы управления, чтобы избежать противоречий, которые могут воз- возникать при порче содержимого отношений. Имеются следующие четыре важные функции управления: 1. Управление целостностью. 2. Восстановление данных (при сбоях и т. д.). 3. Синхронизация выполнения процессов, имеющих общие ресурсы. 4. Разграничение прав доступа к данным. Эти функции необходимы не только в системах, которые ис- используют реляционную модель данных, но и в системах с дру- другими моделями данных. Обеспечение целостности базы данных накладывает ограни- ограничения на отношения (называемые правилами целостности). Функцией системы обеспечения целостности является недопуще- недопущение противоречий в данных относительно этих условий (проти- (противоречия могут возникать в результате ошибок пользователей при вводе данных путем модификации базы данных). Восстановление данных представляет собой функцию приве- приведения данных в некоторое исходное состояние при опасности возникновения противоречий в данных. Это может произойти при ошибках пользователя или при незавершенных операциях модификации по причине сбоев в системе. Синхронизация процессов, претендующих на общие ресурсы, представляет собой функцию управления, используемую для предотвращения противоречий в данных, которые могли бы воз- возникнуть в результате конкуренции процессов обработки при одновременной работе нескольких пользователей с базой дан- данных. Разграничение прав доступа есть функция, не допускающая изменения данных посторонними лицами и чтения ими секрет- секретных данных. В этой книге мы остановимся главным образом на представлении реляционной модели и на операциях с ней. Основными ограничениями, накладываемыми функцией обеспечения целостности данных, являются следующие. 1. Однозначность кортежей: в одном отношении недопусти- недопустимо существование одного или более кортежей, все значения
64 Глава 2 . ^ атрибутов которых одинаковы. Это — естественное ограничение при определении отношений как множеств. 2. Выше уже говорилось, что множество атрибутов, одно- однозначно определяющих кортеж, называется ключом. Ключ, ис- используемый для выделения кортежей, называется главным клю- ключом. Он должен удовлетворять следующим требованиям: 2. а) однозначность ключа: значения ключа для двух или более кортежей отношения должны быть различными; б) непустое значение главного ключа: даже в тех системах, где допускаются пустые значения атрибутов (незаданные или неизвестные), главный ключ не должен иметь пустых значений. Ограничение 2 вытекает из ограничения 1. 3. Существуют также ограничения на связи между отноше- отношениями. Главными доменами называются домены, присутствую- присутствующие в главных ключах нескольких отношений. 3. Целостность связей заключается в том, что в атрибутах над главными доменами не должно появляться значений, от- отличных от значений главных ключей в кортежах, фактически существующих в отношениях (в том числе пустых значений). В качестве примера целостности по связям приведем три отно- отношения: отношение "ТОВАР" (номер_товара,...), которое приво- приводится в разд. 2.2.5 в качестве примера проектирования базы данных, отношение "ПОСТАВЩИК" (номер-поставщика...), отношение "ПОСТАВКА" (номер_поставщика, номер_товара...). Здесь номер_товара и номерлоставщика являются главными ключами отношений ТОВАР и ПОСТАВЩИК соответственно. Если при этом номерлоставщика (либо номер_товара) в отно- отношении ПОСТАВЛЕННЫЕ ТОВАРЫ принимает значения, не со- содержащиеся в кортежах отношения ПОСТАВЩИК (либо отно- отношения ТОВАР), то это означает, что имеется поставщик (или товар), не существующий на самом деле. Однозначность кортежей в сочетании с ограничениями на ключ называют существенной целостностью. Если язык запро- запросов к СУБД реляционно-полон, и при этом обладает функциями, позволяющими реализовать существенную целостность и це- целостность по связям, то такую СУБД называют полностью ре- реляционной. Помимо основных ограничений существуют еще и дополни- дополнительные ограничения. Они обычно задаются в виде дополнитель- дополнительной информации к схеме базы данных. Вот некоторые из них. 1. Перечисление значений для тех атрибутов, значения ко- которых ограничены некоторой областью. 2. Указание отношения < между атрибутами или задание арифметического выражения для них, например: ,  \ > "I "Г ^2 "Г ^8 == ' •
Отношения и объекты 65 3. Указание связей между значениями, существовавшими до модификации базы данных, и значениями после модификации базы данных, например: .,;;| . ■ v (Новая) зарплата» (Старая) зарплата •'"'"' <'• - '>'••'■' -i.''1*;.-i- :l. (Новая) зарплата<(Старая) зарплата*2 >'*!! -> * !'Г:''-'■•- ■ '■ '- "*'--~ь 4. Задание условий, которым должны удовлетворять корте- кортежи при модификации, например "при выполнении операции за- заведения нового кортежа должно выполняться условие: "Ai = 0" или "Нельзя вычеркивать кортежи, у которых не выполняется: Л1 = 0" и т. д. Важное значение имеет проверка выполнимости ограниче- ограничений. Это связано с тем, что при сложной модификации базы данных не удается модифицировать все связанцые данные сра- сразу, и поэтому в отдельные моменты времени они могут оказать- оказаться противоречимыми. Однако по завершении обработки все условия могут выполняться. Бывает и так, что значения, удов- удовлетворяющие ограничениям, получают в результате работы про- процедур, которые поступают в систему и регистрируются в ней тогда, когда возникают какие-либо условия на данные. При этом .проверка данных на непротиворечивость по отношению к ограничениям не производится. Пусть, например, в базе дан- данных существуют атрибуты, определенные в виде суммы и сред- среднего значения атрибутов некоторого отношения. Тогда при из- изменении значений исходных атрибутов должны автоматически вноситься изменения в сумму и среднее. Проблема восстановления данных связана с понятием транз- транзакции. Транзакция представляет собой связанную последова- последовательность реляционных операций, которые, однажды начав- начавшись, должны выполняться без перерывов. При прерывании транзакции могут возникнуть противоречия в базе данных. На- Например, при переводе денег с одного счета на другой операции по снятию денег с одного счета и помещению этих денег на дру- другой счет представляют собой одну транзакцию, которая приоб- приобретает смысл лишь после того, как завершены обе операции: снятие денег и помещение денег. Если по каким-либо причинам продолжение транзакции прерывается и ее продолжение с прерванного места не представляется возможным, то данные с помощью функции восстановления приводятся к состоянию, предшествовавшему транзакции. Для реализации функции вос- восстановления данных используются файлы частичных измене- изменений, вспомогательные файлы текущего дублирования и т. д. Управление одновременно выполняющимися процессами осу- осуществляется в многопользовательском режиме, когда имеет место конкуренция за выполнение операций над одними и теми 6—1428
66 :;'я' Глава 2 же отношениями. В принципе эта проблема аналогична той, которая возникает в операционных системах при управлении конкурирующими процессами. Однако в базах данных имеются свои особые методы, связанные, с тем, что объемы ресурсов велики и конкурирующие процессы представляют собой транз- транзакции, которые не должны прерываться в течение сравнительно длительного времени. Примерами могут служить методы, осно- основанные на последовательности начал транзакций, например метод, использующий механизмы захвата, и метод меток вре- времени. Функция разграничения прав доступа к данным использует, как правило, методы назначения паролей пользователям анало- аналогично файловой защите. В этом случае защита распространяет- распространяется как на отношения в целом, так и на отдельные его атрибу- атрибуты. При этом доступ ограничивается лишь тем множеством кортежей, которые удовлетворяют некоторому заданному усло- условию. В системах обработки статистических данных использу- используются специальные методы защиты, поскольку, объединяя ре- результаты статистической обработки таких множеств кортежей, можно до некоторой степени восстановить исходные данные. 2.2.5. Создание отношений ' Ко При проектировании схемы базы данных главной проблемой является выбор отношений и их атрибутов. В хорошо спроекти- спроектированной схеме структура базы данных оказывается легко доступной для анализа и при модификации базы не возникает противоречий в данных. В данном разделе мы рассмотрим сле- следующие вопросы проектирования баз данных: 1. Методы создания множества отношений, отображающих окружающий мир. 2. Методы оценки качества заданной схемы отношений и ее совершенствования в случае, если в ней легко возникают противоречия (методы нормализации). В качестве метода проектирования множества отношений ис- используют модель связей сущностей. Эта модель формируется из множества сущностей окружающего мира и связей, отра- отражающих взаимоотношения элементов этого множества сущно- сущностей. Сущностями называют объекты, отделимые от других объектов либо существующие независимо. Для примера рассмотрим задачу проектирования базы дан- данных для магазина детской одежды. В качестве рассматривае- рассматриваемых сущностей возьмем какой-либо товар, например детское платье. Атрибутами товара будут наименование-товара, раз- размер, цвет. Далее, естественно, также принять за сущность из- изготовителя (поставщика) платья. В качестве атрибутов изго-
Отношения и объекты 67 товителя возьмем наименование-фирмы, адрес, телефон, ответ- ственное_лицо. Между детским платьем и изготовителем суще- существует связь "поставка-товара". Кроме этих можно рассмотреть еще много различных сущностей. Часть из них представлена на рис. 2.1. На основе этой схемы формируется схема отношений. Для облегчения работы с базой данных возьмем в качестве ключей индивидуальные номера. При этом появляются "номер-товара" (наименование moSapaj Товар .9 ,Т:,.а'К>ОГ<Ц$: (Наименова\ \ние фирмьу таВ- тай FS Рис. 2.1. Схема связей сущностей "детское платье" и "изготовитель — постав- поставщик". i—i — сущности; О — связи; О — атрибуты. и "номер-поставщика". Задавая в качестве отношений множест- множество сущностей и множество связей, получим следующую неслож- несложную реляционную схему: ТОВАР. {Номер-товара, наименование-товара, размер, цвет} Далее рассмотрим нормализацию, с помощью которой оце- оценивается качество полученной схемы базы данных и произво- производятся преобразования с целью ее совершенствования. При нор- нормализации важную роль играет понятие функциональной зави- зависимости. Пусть в реляционной схеме R.{AU Л2, ..., Ап} имеются подмножества X и У. Если при этом в двух произвольных кор- кортежах из R с одинаковыми значениями компонент X значения компонент Y также равны, то говорят, что "У функционально за- зависит от X", и обозначают это как X-+Y. При этом X называют определяющим подсписком. Например, в отношении ТОВАР от атрибута "номер-товара" функционально зависят все атрибуты. Функциональная зависимость есть свойство реляционной схемы, которое определяется во время ее формирования и вы- выполняется для любого состояния отношений. Можно считать функциональную зависимость одним из ограничений на целост- целостность базы данных; при сложной функциональной зависимости управление базой данных значительно усложняется. Поэтому
68 Глава 2 прибегают к нормализации базы данных, разбивая реляцион- реляционную схему с целью получения одних лишь простых функцио- функциональных зависимостей. Предложено несколько нормальных форм, основанных на понятии функциональной зависимости. Самой важной из них является третья нормальная форма. Говорят, что отношение находится в третьей нормальной форме, если все, говоря крат- кратко, дескрипторы являются ключами. Для пояснения процедуры нормализации верцемся к примеру с детской одеждой. Ниже перечислены все функциональные зависимости рас- рассмотренной реляционной схемы: для отношения ТОВАР: номер_товара->-наименование_товара, размер; для отношения ИЗГОТОВИТЕЛЬ: номер-изготовителя-^-наз- номер-изготовителя-^-название-фирмы (двусторонняя функциональная зависимость, т. е. взаимно однозначное соответствие); номер-изготовителя-^адрес (будем считать, что адрес единст- единственный); название-фирмы-^адрес; для отношения ПОСТАВКА: номер-изготовителя, номер_това- ра->-количество. В приведенной реляционной схеме все дескрипторы являют- являются ключами, и поэтому эти отношения находятся в третьей нор- нормальной форме. Рассмотрим отношение 7?.{номер_изготовителя, наименова- наименование-фирмы, адрес, номер_товара, количество}, полученное объединением отношений ИЗГОТОВИТЕЛЬ и ПОСТАВКА. Ключом отношения R является подмножество {номер_изготови- теля, номер_товара}. Поскольку при этом указанные зависимости сохраняются, номер-изготовителя и наименование-фирмы оста- остаются дескрипторами, однако их комбинация не является клю- ключом отношения R. Таким образом, R не находится в третьей нормальной форме. При внесении изменений в отношения, не находящиеся в нормальной форме, могут возникать нежелатель- нежелательные эффекты. Например, в отношении R один изготовитель вхо- входит в несколько кортежей. Следовательно, при изменении адре- адреса изготовителя соответствующие изменения необходимо внести во все кортежи. В случаях когда происходит удаление ненуж- ненужных кортежей, например по причине того, что годовой объем поставок оказался равным нулю, может оказаться, что одно- одновременно количество всех товаров, выпускаемых какой-либо фирмой, также равно нулю, и тогда будут удалены все кортежи, но при этом потеряется информация о наименовании фирмы и ее адресе. Если же разделить отношение R на два отношения (ИЗГОТОВИТЕЛЬ и ПОСТАВКА), то этой проблемы не воз- возникнет.
Отношения и объекты 69 Если отношение не находится в третьей нормальной форме, то его можно нормализовать, расщепляя (разбивая) (как было показано в примере) на два отношения, у которых часть атри- атрибутов является общей. Это разбиение можно провести путем выполнения операции проекции. Наоборот, из двух отношений, полученных путем разбиения, можно получить исходное отно- отношение путем выполнения операции обыкновенного соединения. При этом информация не теряется. С момента появления реляционных моделей было предло- предложено несколько нормальных форм (среди них первая нормаль- нормальная форма и вторая). Третья нормальная форма определяется на базе понятия функциональной зависимости, и поэтому она накладывает самые сильные ограничения. Предложены также сильные нормальные формы, основанные на понятиях много- многозначной и связной зависимостей. При проектировании отношений не все они обязательно должны быть нормализованы. Поскольку переход расщеплен- расщепленных при нормализации отношений к исходным отношениям пу- путем выполнения операций соединения обладает большой трудо,- Товар HDMfp Haa"eHfa- Размер ,." ... Номер то дара Наименова- Наименование товара Размер Изгото- Изготовитель номер изго- изготовителя Наименова- ние фирмы Адрес Количество пос- поставок (в год) Рис. 2.2. Пример иерархической базы данных для магазина детской одежды. емкостью, то отношения часто хранят в нерасщепленной форме. Если при модификации базы данных проблем не возникает» выигрыш, получаемый от нормализации, невелик. 2.2.6. Другие модели данных ', Реляционные модели нашли широкое применение благодаря простоте анализа модели и работы с языком запросов. Как мо- модель данных для систем с базами данных реляционная модель, сравнительно нова. Находит применение и ряд других моделей. Примерами могут служить иерархическая и сетевая модели. В иерархической модели база данных представлена в виде дерева. Другими словами, некоторый тип записей считается корнем дерева, и с ним в подчиненной связи находятся другие типы записей. Поэтому пример с магазином детской одежды, описанный в разд. 2.2.5, мог бы иметь вид, показанный на рис. 2.2. В этом примере запись "ТОВАР" является корнем, содер»
70 Глава 2 жащим п записей, где п — количество изготовленных товаров. С каждой из записей типа "ТОВАР" связана запись об изго- изготовителях, которые этот товар поставляют. Таким образом, получается п экземпляров дерева. Если один и тот же товар поставляют несколько фирм-изготовителей, то с одной корневой записью связано несколько записей. Наобо- Наоборот, если один поставщик поставляет несколько товаров, то су- существует несколько записей для этого поставщика, и они свя- связаны с записью для соответствующего товара. В данном приме- примере имеются два уровня, однако их может быть и больше. Иерар- Иерархическая модель данных обладает следующими особенностями. 1. В дереве с отношениями "отец-сын" доступ к записи-сыну возможен только через запись-отца. В приведенном примере невозможен непосредственный доступ к записи "изготовитель". К ней можно обратиться лишь через родительскую запись "то- "товар". Таким образом, отсутствует симметрия в доступе к за- записям разного типа. 2. Благодаря древовидной структуре удается хорошо выра- выразить связь: "один ко многим", однако, как видно из предыду- Товар Изготовитель номер товара Нл именова- именование товара Размер Поставка Номер по С- Номер из го- количество ,, ва тобителя поставок Рис. 2.3. Пример сетевой модели для магазина детской одежды. -«■ — цепь «товар — поставка»; »■ — цепь «производитель — поставка». щего примера, связь типа многие ко многим" оказывается не- неориентированной. Если, например, в приведенном примере в записях "изготовитель" вычеркнуть те из них, поставки которых равны нулю, то исчезнут все записи "изготовитель", не имею- имеющие поставок ни по одному товару. 3. Поскольку метод моделирования не является объектно- ориентированным, то время реакции очень сильно зависит ог типа запроса. В сетевых моделях база данных создается путем связыва- связывания всех записей между собой. В отличие от иерархической базы данных в данном случае возможна не только древовидная структура. Поэтому можно реализовать связь "многие ко мно- многим". Пример с детским магазином можно представить в виде, показанном на рис. 2.3. В данном примере имеются две связи: одна, когда отцом является товар, а сыном — поставки товара, и другая, когда отцом является производитель, а сыном — поставки. Эти связи
Отношения и объекты 71 играют почти ту же самую роль, что и в двухуровневой иерар- иерархической модели. Если в данном примере мы захотим узнать имя фирмы-изготовителя, поставляющей товар № 1, то мы должны войти в запись "поставка", связанную с экземпляром записи "товар", имеющим номер, равный 1, по цепочке товар- поставка. Далее, из найденной записи "поставка" по цепочке "изготовитель-поставка" необходимо найти запись "изготови- "изготовитель" и извлечь из нее необходимую информацию. Получив название одной фирмы, можно по цепочке "товар-поставка" перейти к следующей записи типа "поставка" и повторить ана- аналогичные операции. В сетевых моделях, как показано в примере с записями "товар" и "изготовитель", записи различных типов обрабатыва- обрабатываются симметрично. При наличии связей "многие ко многим" трудностей с модификацией базы данных не возникает, как это имеет место в иерархических структурах. При этом логическая структура базы данных и реализующая ее физическая структу- структура оказываются сложнее иерархической модели. Как в иерархической, так и в сетевой моделях структура связей между записями выражается на логическом уровне, и пользователь при доступе к базе данных должен в явном виде указывать операции перехода по этим связям. Следовательно, схема данных, предоставляемая пользователю, в этом случае оказывается сложнее реляционной модели. Для повышения эффективности в системах с базами данных на основе реляци- реляционной модели часто используют внутренние структурные свя- связи, однако пользователь, выполняющий запросы или модифи- модификацию базы данных, может об этой структуре не знать1*. Помимо названной здесь модели данных предложено много других. Одна из них — модель связей сущностей, упомя- упомянутая в разд. 2.2.5, посвященном проектированию отношений в реляционной схеме данных. 2.2.7. Реляционные СУБД-машины Поскольку работа с базами данных занимает значительное мес- место в общем объеме работ, проводимых средствами вычисли- вычислительной техники, разработаны специализированные СУБД-ма- СУБД-машины, ведущие работу с базами данных. Они подключаются к обычным вычислительным машинам, в результате чего улуч- улучшаются характеристики всей системы в целом. Большинство из предложенных и реализованных в настоящее время СУБД- машин представляют собой реляционные СУБД-машины, в ко- !) Подробнее об иерархических и сетевых моделях см. Атре Ш. Струк- Структурный подход к организации баз данных. — М.: Финансы и статистика, 1983. — Прим. ред. , ...... • '
72 Глава 2 торых используются реляционные модели. Причины, по кото- которым именно реляционные модели, а не какие-либо другие мо- модели данных стали предметом особого внимания со стороны создателей СУБД-машин, состоят в следующем. 1) Поскольку язык запросов представляет собой язык высо- высокого уровня, допускается большая свобода в выборе методов выполнения запросов. Отсюда и большая свобода в проекти- проектировании специализированного аппаратного обеспечения, что поз- позволяет повысить эффективность системы. 2) На языке запросов легко выразить сложные запросы. Это приводит к увеличению количества сложных запросов, зна- значительно повышающих трудоемкость обработки, и растет по- потребность в повышении эффективности. Кроме того, СУБД-машина с любой моделью данных обес- обеспечивает следующие преимущества: а) распределение обработки по нескольким процессорам повышает эффективность обработки; б) легко организуется совместное использование общей ба- базы данных несколькими главными машинами; в) поскольку база данных отделена от всех других данных, доступ к ней в обход методов доступа затруднен; кроме того, уменьшается влияние на базу данных ошибок и в программах, не связанных с базой данных. С другой стороны, до сих пор при обработке информации сохраняется дополнительный обмен между СУБД-машиной и центральной машиной, и поэтому время реакции увеличивается, однако интенсивность обмена с главной машиной невысока, « недостатки последней проявляются незначительно. Реляционные СУБД-машины делятся на две большие группы. 1. СУБД-машины аппаратного типа, имеющие специализи- специализированное оборудование для обработки реляционной информа- информации. 2. Специализированное программное обеспечение, при кото- котором для работы с базой данных используется универсальная ЭВМ. Специализированное программное обеспечение уже посту- поступает на рынок, а аппаратные СУБД-машины пока находятся на этапе исследований. Существует мнение, что СУБД-машиной следует называть только машину аппаратного типа. Направление развития исследований СУБД-машин тесно связано со снижением стоимости аппаратного обеспечения, что обусловлено развитием больших интегральных схем. Исследо- Исследования по снижению стоимости аппаратного обеспечения ведут- ведутся по следующим направлениям:
Отношения и объекты 73 а) распараллеливание обработки путем использования большого количества однородного аппаратного обеспечения; б) повышение степени интеграции и быстродействия аппа- аппаратного обеспечения; в) разработка архитектуры аппаратного обеспечения, до- допускающей его простую реализацию на больших и сверхболь- сверхбольших интегральных схемах. В первых работах по реляционным СУБД-машинам, прове- проведенных в середине 70-х гг., в основном рассматривалась архи- архитектура с параллельной работой ассоциативного процессора, синхронизирующего выполнение реляционных операций (в осо- особенности операций выборки), с памятью на дисках ассоциатив- ассоциативного поиска, устройствах с зарядовой связью, на пузырьковых, магнитных доменах и т. д. Архитектуры, в которых использо- использовались устройства с зарядовой связью и магнитная пузырьковая память, не имели возможностей к повышению степени интегра- интеграции по сравнению с магнитными дисками, и по мере снижени» стоимости обычной памяти, а также по ряду других причин они. утратили свои позиции. Для современных исследований по реляционным СУБД-ма- СУБД-машинам характерно: 1) использование дисков для размещения базы данных; 2) использование больших объемов памяти в качестве бу- буферов и пулов памяти для ускорения доступа к данным; 3) надстраивание многопроцессорных систем над большими объемами памяти путем соединения их через общую шину или через организацию их в сеть и распараллеливание таким обра- образом их работы. По параллельной работе процессоров исследования ведутся в двух направлениях, объединяющих в себе а) использование нескольких процессоров по одному на каждую операцию, либо с универсальным набором функций; б) создание специализированного аппаратного обеспечения, либо процессора общего назначения. В программных СУБД-машинах разрабатываются архитек- архитектуры, позволяющие повысить эффективность обработки путем объединения нескольких программных надстроек над штатным математическим обеспечением. 2.3. Языки программирования логического ^!^ и функционального типов В основе языков программирования функционального типа ле- лежит понятие функции в математическом смысле, а в основе логических языков программирования лежит понятие отноше- отношения, восходящее к предикатным логикам.
74 Глава 2 Если исходить из отношений, то функция1 •: 's f:(xi,x2,...,xn) —»■ у представляет собой отношение -г R(xt, x2,..., хп, у), которое для наборов значений (хи х2 хп) однозначно задает значения y(=f(xu x2, ..., хп)). Наоборот, если исходить из функций, то отношение Л (Xit X2t-'-t Хп) ^ i - - ■ можно считать функцией * "■■ #:(*1,*2,..,*,,ЖИСТИНАили ЛОЖЬ, " которая для наборов значений (хи х2,..., хп) задает логические значения "ИСТИНА" или "ЛОЖЬ". Таким образом, тот и дру- другой подходы в некотором смысле взаимно дополняют друг друга и не противоречат один другому. В данном разделе рас- рассматриваются языки обоих типов. 2.3.1. Языки программирования логического типа <• г: ■ ?■ Во всей предшествующей истории культуры наиболее точная формализация человеческой мысли, хотя и в простейших фор- формах, осуществлялась в математической форме, в частности в логической форме с использованием логической дедукции с четким выделением объектов мышления. Одним из основанных на этом подходов является создание языков программирования по типу предикатных логик. Примером такого языка является Пролог (programming in logic), разработанный в 1972 г. Коль- мерауером в Марсельском университете (Франция). В следую- следующих разделах на примере языка Пролог будут рассмотрены процедуры унификации и параллелизм. Рассмотрим некоторые преимущества, обусловливающие перспективу использования языков программирования логического типа. Во-первых, логика предикатов является в некотором роде формализацией человеческого мышления, в частности форма- формализацией доказательств в математике, поэтому полагают, что основанные на ней языки программирования логического типа будут более пригодны в будущем для обработки информации, в особенности для работы со знаниями, нежели существующие языки последовательного типа. Во-вторых, существует проблема верификации программ: исследования того, удовлетворяют ли они предъявляемым тре- требованиям, а также проблема того, как, исходя из предъявляе-
Отношения и объекты 7$ мых требований, составить нужную программу. Для решения этих проблем желательно осуществить взаимодействие языт ков, на которых записываются требования к программам, и языков программирования. Кроме того, необходимо исхо- исходить из одних и тех же посылок при выполнении операций по верификации и составлению программ. Понятие языков прог- программирования логического типа позволяет использовать единую основу — исчисление предикатов для решения всех этих задач. В-третьих, если обратиться к проблеме отображения моде- моделей предметных областей в базах данных, то можно с уверен- уверенностью говорить о том, что характер базы данных определяется структурой хранимого в ней множества фактов, а также мето- методами доступа к ним. В языках программирования логического типа факты представляются выражениями, в которых констан- константы играют роль термов. Следовательно, множество этих выра- выражений можно рассматривать как базу данных, и теорию реля- реляционных баз данных, как отмечалось выше, можно считать одним из разделов логики предикатов. Видимо, должно происходить постепенное объединение язы- языков программирования логического типа и теории реляционных баз данных на общей основе логики предикатов. По-видимому, в исследованиях распределенных баз данных как множества моделей предметных областей следует двигаться в этом же на- направлении. Языки программирования логического типа связаны и с естественными языками. Одним из истоков символической логики была формализация естественного языка. Логика преди- предикатов как форма выражения этого формального смысла явля- является первым приближением. В качестве семантики естествен- естественного языка можно назвать теорию, выдвинутую Монтегю, и хо- хотя эта теория дает формализм перевода предложений естест- естественного языка в формулы интенсиональной логики, в результа- результате их можно свести к предикатному формализму. В последнее время и в области лингвистики ведутся исследования преди- предикатных логик в условиях их семантической интерпретации. Можно считать, что эти работы вливаются в русло языков программирования логического типа. Успехи в этих исследо- исследованиях могли бы породить новые успехи в развитии языков описания спецификаций на основе естественного языка. В области экспертных систем, использующих методы работы со знаниями, активно применяются языки программирования, называемые производственными системами, однако эти языки носят сугубо эмпирический характер и в настоящее время подвергаются существенному пересмотру. По-видимому, в бу- будущем развитие этой семантической теории и других исследо- исследований будет все больше склоняться к логике предикатов. »
76 ЫЛ1 Глава 2 ;-i:; ..-.- ; Перед тем как начать разговор о том, что такое языки программирования логического типа, рассмотрим принцип ре- резолюции и метод унификации. ,,.м„ . , , 2.3.2. Принципы резолюции и метод унификации ; ' В 1965 г. Дж. А. Робинсон предложила так называемый прин- принцип резолюции, в котором используется регулярная процедура последовательного сопоставления с образцом. Этот метод со- сопоставления с образцом получил название алгоритма унифика- унификации. При наличии нескольких переменных или логических фор- формул, содержащих функции, эти переменные или функции выде- выделяются, часть из них подвергается процедуре унификации и производится их подстановка в исходные формулы. Если при этом среди них оказываются тождественно истинные формулы вида: "А или НЕ-А" (А\/~[А), то они удаляются. Метод резо- резолюции состоит в том, чтобы, повторяя эту операцию, показать невыполнимость множества ис- (cl) Лтап{х)чmortaKz) Ходных логических формул. (с2) man (Сократ) Поясним на примерах принцип (сЗ) ~[mortai (Сократ) . ; резолюции и унификацию. За- Запишем выражение: "х— чело- Рис- 2Л- .. век" в виде тап(х). Здесь man — предикатная буква, х — терм (в данном случае терм-переменная). Кроме того, запи- запишем выражение "х смертен" в виде mortal(x). Таким образом, выражение "Человек смертен" можно записать в виде man(x)-+mortal(x) Попробуем теперь, задав выражение "Сократ — человек", т. е. man (СОКРАТ), где СОКРАТ — константный терм, доказать методом резолю- резолюции выражение mortal (СОКРАТ). Прежде всего добавим к исходному множеству формул отри- отрицание того утверждения, которое мы хотим доказать 1 mortal <СОКРАТ), как показано на рис. 2.4, cl—сЗ. Формула ^тап(х)\'mortal(x) логически эквивалентна формуле man(x)-*-mortal(x). Поэтому необходимо осуществить унифи- унифицирующую подстановку *-СОКРАТ относительно формулы cl или с2. В результате удаляется тождественно истинная формула 1 man (СОКРАТ) \/тап (СОКРАТ) и остается лишь выражение mortal (СОКРАТ) (рис. 2.5). После этого, присоединив к нему через связку "ИЛИ" формулу сЗ, снова получим тождественно истинное выражение mortal (СОКРАТ) У "\ mortal (СОКРАТ), которое также удаляется, давая при этом пустое множество
Отношения и объекты 77 формул (рис. 2.6). Это показывает невыполнимость фор- формул cl—сЗ. Отсюда методом обоснования вывода выводится формула mortal (СОКРАТ). ., 2.3.3. Выражения Хорна Логика создана для того, чтобы четко выражать человеческую мысль, однако если использовать в языках программирования исчисление предикатов A порядка) в непосредственном виде, то это приведет к чрезвычайно большим объемам вычислений, что неприменимо на практике. Поэтому разработан язык программирования Пролог, в котором ограничиваются специ- специальными выражениями, называемыми выражениями Хорна, и только к ним применяют описанный выше метод резолюции. В данной книге на примере языка Пролог мы будем рассматри- рассматривать суть языков логического программирования, а также па- ~ (clVc2) lman(x)Vmortal(x)\/man (Сократ) '-■ - ' | Унификация х и Сократ (clVc2) Лтап (Сократ) V mortal (Сократ) V man(CoKjtam) ,.... (clVc2) mortal (Сократ) t ., '. ,;./.(',. f' rt.., .'.„ .... \ ,|Г,-,. Рис. 2.5Д- ' ' ' i'l! ■'•■:•/: ';..': -i ,. . (civc2vc3) mortal (Сократ) УЛтогШ (Сокрш) ■ ■ 't ц | Удаление истинной и ложной формул .,,... , . ., . , ;■;■-•,-: ■•■; , (clV c2V^сЗ) пустой дизъюнкт н г, .,";-!;, :; ; РИС. 2.6. • '•'- -.■!'., -• "•- ..-. ,;/ раллелизм, существующий в языке Пролог (И- и ИЛИ-парал- лелизм). Выражение Хорна имеет вид Как видно из этого выражения, в нем имеется единственная логическая формула без отрицания, и все формулы связаны знаком логической суммы (ИЛИ). Это можно описать в другом виде Это выражение читается так: "Из Pi и Рг и так далее до Рп следует Рт"- Здесь слово "и" соответствует английскому ело-
78 : Глава 2 ву "AND". На языке Пролог в синтаксисе снсГвйыОЕС-Ю Прф лог это записывается в другом виде £'■>&■ • м Пример с Сократом из предыдущего раздела (формулы cl—сЗ) выразится в следующем виде1': . ^ , ,,,. ;■ .- - mortal (x):— man (х) man (СОКРАТ) . , ; -,> ••.,,-.; ,-v ?v;.<)V. ?-mortal (СОКРАТ) .,--..• ;, ,.-,,--:., ■•-,.гъг ■■;- - -f.'-.M.-'. <*-Ч Выражение man (СОКРАТ) говорит о том, что предикат man (СОКРАТ), безусловно, выполним (является фактом). Вы- Выражение 1-mortal (СОКРАТ) w-:ti\;-:. .: ;.fr > является сокращением выражения t ,', ',<■'!' J T П:- mortal (СОКРАТ) Это означает, что если выполняется mortal (СОКРАТ), то не выполняется ничего, следовательно, не выполняется и само вы- выражение mortal (СОКРАТ). Это говорит о том, что в языке Пролог, так же как и в методе резолюции, взяв за отправную точку отрицание формулы mortal (СОКРАТ), можно методом обоснования вывода доказать утверждение mortal (СОКРАТ). Прежде всего в левой части ищется предикат, совпадающий с (целевым) утверждением mortal (СОКРАТ), и производится унификация переменной х и константного терма СОКРАТ. Затем ищется выражение, содержащее в левой части предикат, совпа- совпадающий с новой целью (в данном случае man (СОКРАТ)), об- образующейся в правой части текущего выражения в результате его унификации, и затем аналогично производятся дальнейшие унификации. Программа на языке Пролог представляет собой некоторое множество выражений Хорна, и выполняется она пу- путем проведения рассуждений от целевого утверждения в об- обратном направлении. Если логических формул, подлежащих унификации, много, то производится унификация для одной из них. Если эта унификация удовлетворительна, то программа выполняется дальше. Если унификация оказывается неудовлет- неудовлетворительной, то происходит возврат (бэктрекинг) и выполня- выполняются другие возможные унификации. Таким образом, в языке Пролог рассуждение ведется в обратном направлении методом проб и ошибок. '> В алфавите языка Пролог нет ни кириллицы, ни катаканы. Поэтому, следуя авторам книги, мы используем там, где нам удобно, кириллицу для обозначения предметных переменных в операторах языка Пролог. — Прим. иерее.
Отношения и объекты 79 2.3.4. Параллелизм Рассмотрим прологовский параллелизм. Обратимся вначале к ИЛИ-параллелизму. Как следует из предыдущего примера, при существовании нескольких логических формул, в которых об- общим переменным можно придать значение, это делается лишь для одной из них. Однако если используется не один процессор, а несколько, то замену общих переменных некоторым значением можно вы- выполнить над несколькими такими формулами одновременно, т. е. над формулами с одинаковыми предикатными буквами и одинаковыми термами. В языке Пролог все логические формулы (члены формы Хорна) находятся в отношении ИЛИ, тогда параллельное вы- выполнение операций по приписыванию значений общим перемен- переменным над несколькими формулами, находящимися в отношении ИЛИ, является ИЛИ-параллелизмом. С другой стороны, прологовское правило-оператор имеет следующий вид: р . р р р и его правая часть читается как Pi и Р2 и ... и Рп- Таким обра- образом, подцели в правой части связаны отношением И. При этом можно выполнять Pi, P2, ..., Рп параллельно, а не в порядке следования слева направо. В этом случае, поскольку Рь Р2> ..., Рп находятся в отношении И, необходимо проверять непротиво- непротиворечивость Р\, Р2, ..., Рп (например, непротиворечивость пере- переменных с одинаковыми именами). Таким образом, параллель- параллельную обработку подцелей в правой части прологовского прави- правила-оператора можно назвать И-параллелизмом. Можно одно- одновременно реализовать И- и ИЛИ-параллелизм. В настоящее время ведутся активные исследования параллельных Пролог- машин различного типа. 2.3.5. Языки программирования функционального типа Под влиянием теоремы Гёделя о неполноте, опубликованной в 1931 г., было осуществлено уточнение важного понятия, связан- связанного с алгоритмами1'. Это — определение класса целочислен- целочисленных функций, носящих название рекурсивных функций. '> Проблемой, впервые потребовавшей уточнить понятие алгоритма, была десятая проблема Гильберта A900 г.). Отправляясь от идей Гильберта, Гё- дель впервые описал класс всех рекурсивных функций как класс числовых функций, определенных в некоторой формальной системе (см. А. И. Мальцев. Алгоритмы и рекурсивные функции. — М: Наука, 1986). — Прим. ред.
80 Глава 2 А. Чёрч, создавший с помощью ^.-формализма и р-преобразо- вания новый универсум, названный им К-исчислением, устано- установил, что так называемые ^-определимые функции эквивалентны рекурсивным функциям. Независимо от этого А. Тьюринг уста- установил, что так называемые "функции, вычислимые на машине Тьюринга", также эквивалентны рекурсивным функциям. Кро- Кроме них многие другие исследователи разными способами дава- давали определения вычислимых функций, однако все они, как ока- оказалось, также эквивалентны рекурсивным функциям. В этих условиях к 1936 г. Чёрч выдвинул тезис о том, что все функции, которые мы можем интуитивно рассматривать как вы- вычислимые, являются рекурсивными. Для любой рекурсивной функции существует алгоритм ее вычисления, с другой стороны, числовая функция, имеющая общий алгоритм ее вычисления, является рекурсивной функцией. Таким образом, языки функционального программирования подводят практическую основу для идеи Я,-исчисления, упоми- упоминавшегося выше. Одним из них является язык Лисп (на самом деле, язык Лисп дополнен возможностями, ухудшающими его качества как языка функционального программирования). Существует несколько языков функционального программи- программирования, отличающихся по конструкции, идеологии и т. д. Из них трудно выделить какой-нибудь один (кроме Лисп Мак- Карти, примерами могут служить Лисп KRC Тэрнера, FP Бэкуса и др.). 2.3.6. Логические и функциональные машины Можно рассмотреть архитектуру машин нового типа, в основу которых положены языки программирования логического и функционального типов. Для обычных машин это — языки вы- высокого и даже сверхвысокого уровней, однако они же являются машинными языками в рассматриваемых здесь машинах ново- нового типа. На современном уровне развития техники и эти машины, видимо, будут последовательными, однако при этом по край- крайней мере будет доказана их осуществимость. В т. 9 настояще- настоящего курса лекций, озаглавленном "СБИС-машины", рассмотре- рассмотрены два примера реализации: Лисп- и Пролог-машины. Смолток- машина, описанная в гл. 3—5 настоящей книги, является маши- машиной подобного же типа. При рассмотрении архитектур машин параллельного типа, превосходящих по своим возможностям последовательные ма- машины и являющихся машинами будущего, этими языками можно руководствоваться при исследовании архитектур. В сле- дуюшем разделе мы коснемся этого вопроса.
Отношения и объекты 81 2.4. Параллельные структуры управления н ns^v ,i> t 2.4.1. Поток управления и поток данных 1. Поток управления. Нам уже хорошо известно понятие потом- потомка управления. Примером такого понятия может служить тра- традиционный (фон-Неймановский) поток управления. В последо» вательном потоке управления передача управления неявно и притом единственным образом определяется счетчиком команд по принципу: "От команды, исполняемой в настоящий момент* к очередной исполняемой команде". Разумеется, есть возмож- возможность задать передачу управления в явном виде (с помощыа команд типа GOTO). С другой стороны, вводя операторы параллельной передачи управления, можно организовать параллельный поток управле- управления, т. е. организовать одновременную активизацию нескольких потоков. Среди операторов параллельного потока управления есть, например, такие, как FORK-оператор (оператор разветвле- разветвления), JOIN-оператор (команда синхронизации разветвленных потоков управления), а также ряд других операторов. 2. Поток данных. Как указывалось выше, в параллельных по- потоках управления возможна организация параллельного выпол- выполнения команд, однако для этого в программе должны быть явно указаны операторы параллельного выполнения команд. С дру- другой стороны, в условиях быстрого развития элементной базы и перехода с БИС на СБИС и появления при этом возможности одновременной работы многих процессоров в настоящее время интенсивно развиваются исследования по организации потоков данных. Потоки данных организуются таким образом, чтобы при накоплении всех данных, необходимых для выполнения какого-либо вычисления, оно выполнялось бы немедленно (его называют спонтанным вычислением). Результат данной опера- операции передается следующим операциям. Другими словами, пото- потоки данных организуются таким образом, что вычислительные операции запускаются под действием пересылаемых данных. По этой причине вычисления, организуемые через потоки дан- данных, называют также вычислениями, управляемыми данными* Главной особенностью вычислений в потоках данных является то, что параллельное выполнение вычислений не задается явно с помощью операторов параллельного управления, как это де- делается при организации вычислений через потоки управления, а процессы, допускающие параллельное выполнение, выполня- выполняются параллельно при наличии соответствующих данных. 6—1428
«2 Глава 2 :Q 2.4.2. Языки и графы потоков данных Многие идеи организации потоков данных — согласно которым по накоплении данных, необходимых для выполнения вычисли- вычислительной операции, происходит спонтанное ее выполнение и ре- результат пересылается очередной вычислительной операции — становятся реальностью с разработкой новых языков (потоков данных и машин потоков данных). Программа, написанная на языке потоков данных, после компиляции преобразуется в граф потоков данных. Устройство, непосредственно выполняющее этот граф, называется машиной потоков данных. В данном разделе речь пойдет о языках и о графах потоков данных. После этого мы рассмотрим машины потоков данных. 1. Языки потоков данных. Главной особенностью языков потоков данных является правило единственной подстановки. Попросту говоря, это правило означает, что засылка значения в переменную разрешается единственный раз. Поясним это на следующем примере. Х:=5 •. Пример программы 1. : ; '"' . .■■.-; ;■?■•-•■'■ Х:=Х+\ г ' В традиционных языках программирования подстановки, по- показанные в примере программы 1, допустимы и часто исполь- используются. Смысл этих подстановок в том, что производится за- запись в ячейку памяти, выделенную под переменную X, и счи- считывание из нее. Другими словами, при выполнении оператора Х: = 5 в ячейку X записывается значение 5. При выполнении действия Х+1 из ячейки памяти, отведенной под переменную X, считывается значение 5. К нему прибавляется единица и ре- результат, равный 6, вновь записывается в ячейку памяти, отве- отведенную под переменную X. При организации же вычислений по методу потоков данных понятие ячейки отсутствует, и поэтому не допускается более одной подстановки значения переменной, как это имеет место в примере программы 1. При этом следует поступать, например, как показано в примере программы 2. ' !1 'ill »-i • . i'i ., il_j. j i \, - ■ • ''К ' ir,S}, чф' ".' ,?«&!! Пример программы % ч
Отношения и объекты 83> • Уровень Т • Уровень Z Другими словами, переменные в языках потоков данных не являются указателями ячеек памяти, как это принято в тради- традиционных языках программирования, а указывают назначение результата выполненной операции. При организации вычисли- вычислительного процесса через потоки данных отсутствие понятия ячейки памяти приводит к серьезной проблеме сохранения ретроактивного следа вычислений. 2. Графы потоков данных. Программа, записанная на язы- языке потоков данных, преобразуется в граф потоков данных. Например, рассмотрим формулу А:= E+1)* (В—С). Граф» этой формулы представлен на рис. 2.7. Элементы графа, обозначенные кружочками, называют узлами, а отрезки прямых, соединяющие il' узлы, — дугами. Как видно из ри- ь' сунка, узлы соответствуют опера- операциям, а дуги — потокам данных. ? Число дуг, входящих в один узел, представляет собой число операндов операции. В данном примере все операции имеют по два операнда, например при совместном попадании Рис. 2.7. Граф потока данных., значения В и значения С в узел происходит спонтанное выполнение вычитания и результат вы- выдается по выходной дуге. Кроме того, модули, находящиеся на том же уровне, могут выполняться параллельно. При этом следует обратить внимание на то, что в формуле А:= (В+1)*(В—С) не указывалось явно, какие ее части могут выполняться параллельно. Из графа, полученного в результате компиляции этой формулы, становится ясно, что при наличии данных, необходимых для вычислений и соответствующего чис- числа процессоров (в данном случае двух), узлы ® и © могут выполняться параллельно. Другими словами, программист может представлять себе, какие участки в его программе будут выполняться параллель- параллельно; явно он их не указывает, однако в результате преобразова- преобразования программы в граф потока данных возможность параллель- параллельного выполнения становится ясной на основании взаимосвязей между данными. Можно также сказать, что при организация вычислений по методу потоков данных параллелизм, содержа- содержащийся в программе, извлекается из нее естественным об- образом. Кроме четырех действий арифметики в графе потоков дан- данных могут быть и следующие узлы: "-." ■*•- — операция сравнения (рис. 2.8). ■ : 'А- • ц В данном примере показан граф потока данных ДЛИ 6»
84 Глава 2 мулы А>В. Операция сравнения Л и В на больше-меньше вы- вырабатывает результат ИСТИНА или ЛОЖЬ. ,.. .' п — переключатель типа ИСТИНА-ЛОЖЬ (рис. 2.9). _г ,,,,г А . ■ ■■ ч ■ I- - ; ий- ■; А В ■ ■:. . I •. !;,-,л,- , . . „-. Рис. 2,8. Узел операции сравнения. /Л v».k*4i ■■"•• Т F • -> Рис. 2.9. Узел переключателя "исти- "истина — ложь". В данном примере А — значение данных, С — управляющая информация (значением является ИСТИНА или ЛОЖЬ). При значении ЛОЖЬ значение данных выдается по дуге F. 2.4.3. Архитектура потоков данных В процессе исследования языков функционального программи- программирования, теоретической базой которых является ^-исчисление, и исследования архитектуры потоков данных выяснилось, что эти два направления связаны между собой. Например, связаны независимости вычисления функций и выполнения операций, запускаемых при накапливании необходимых данных в пото- потоках данных. Архитектура организации вычислений в потоках данных предлагается как одна из эффективных кандидатур для реали- реализации Пролог-ориентированных архитектур, поскольку при этом 1 L Элементы на- накопления Операцион- Операционная часть I Структурная память Блок обработки , ., Рис. 2.10, Элементы архитектуры вычислительного процесса в потоках данных. параллелизм, содержащийся в алгоритме, извлекается из него естественным образом независимо от того, виден он програм- программисту или нет. В данном разделе мы рассмотрим наиболее общие структу- структуры при организации вычислений в потоках данных. Архитектура подобного типа содержит два основных элемен- элемента: блок обработки и структурную память (рис. 2.10). Искусство создания такой архитектуры проявляется в том, в каком количестве выбрать элементы этих двух типов и. как связать их между собой. ; b.,.. j, .,г,,,., .-. -■. - ^Г! v-.uhb1-
Отношения н объекты 85 Блок обработки содержит загружаемую память и операци- операционную часть. Загружаемая память управляет процессом накоп- накопления данных. По накоплении комплекта данных, удовлетво- удовлетворяющего условиям спонтанного вычисления, эти данные и команда пересылаются в операционную часть (бывает и так, что при поступлении хотя бы одного элемента данных осуще- осуществляется спонтанное вычисление с опережением). В операционной части производится выполнение команды над данными и результат вновь пересылается в загружаемую память. Команда в случае работы со структурированными данными вместе с данными (на самом деле вместе с указателем на структурную память) пересылается в структурную память. При организации потоков данных в чистом виде сами дан- данные передаются по дугам, однако структурированные данные имеют тенденцию к большим объемам и передавать их непо- непосредственно по дугам неэффективно, для этого и вводится структурная память, играющая роль общего поля памяти для структурированных данных. Структурная память служит для размещения структурированных данных, их хранения и мани- манипулирования ими. Поэтому по дугам передаются либо непо- непосредственно значения, либо указатели на область структурной памяти. 2.5. Объектно-ориентированное программирование ' О структурах данных уже говорилось в разд. 1.1, посвященном абстрактным типам данных. В анализе структур данных и управления ими центр внимания можно перевести со структур управления на структуры данных. Если при таком переносе отойти от проблем описания дан- данных и перейти к действиям по созданию программ, т. е. приме- применить этот подход к программированию, то мы получим объект- объектно-ориентированное программирование, о котором и пойдет речь в данном разделе. Практическая сторона объектно-ориентированного програм- программирования рассматривается в данной книге (начиная с гл. 3) на примере конкретных систем и языка программирования. По- Поэтому в данном разделе мы рассмотрим теоретические модели, исторические сведения и конкретные примеры. 2.5.1. Модели объектно-ориентированного программирования ■"-■ Основными особенностями объектно-ориентированного програм- программирования являются: 1) описание внутреннего содержания объекта; ,-01с.;-."
86 '-•■' Глава 2 :',; 2) описание действий объекта; 3) формирование объектов путем наследования. Здесь выражение "действия объектов" можно понимать аналогично выражению "операции над объектами". В абстракт- абстрактных типах данных сам характер этих данных выражался через множество таких операций. Слово "операции" неявно предполагает наличие операций,, которые можно выполнять. Если исключить эту предпосылку и от "объекта, над которым производятся действия", перейти к рассмотрению объектов, "меняющихся под действием внут- внутренних причин", то аналогично можно сформировать внешний взгляд на всю систему в целом. Так, от описания факта: "Я уронил чашку со стола и разбил ее" можно перейти к описанию факта: "Я передвинул свою ру- руку и чашка поехала по столу, упала на пол и сама собой раз- разбилась". Точно так же вычислительные модели сильно меняются при перемене взгляда на объекты, согласно которому они движутся под влиянием внешних воздействий, на ту точку зрения, что объекты движутся самостоятельно. Одной из методик моделирования, построенной на этом под- подходе, является теория акторов1). С другой стороны, существуют два способа описания внутреннего содержания объектов: све- сведение всех описаний содержания к описанию "действий" и опи- описание "содержания" независимо от описания действий. Описание содержания объектов без учета действий весьма напоминает описания типа "записей", используемые в языках. Паскаль, Ада и т. д. Что касается механизмов формирования объектов, то здесь мы определенно выскажемся лишь о меха- механизмах наследования. Наследование как метод формирования объектов можно проиллюстрировать таким упрощенным при- примером: "Из объектов А к В можно получить объект С". В этом выражении мы не будем касаться вопроса о том, что при этом получается и как из исходных объектов получается новый объект. При практическом использовании метода наследования вы- выразительная сила его проявляется в опускании мелких подроб- подробностей при передаче информации через связи наследования. В конкретных системах семантика и работа процедур наследо- наследования должны быть точно определены. В описательной классификации методы наследования делят- делятся на единичное и множественное наследования. В общем слу- случае множественное наследование включает в себя единичное. " Целью теории акторов Является не просто самодвижение объектов.
Отношения и объекты 87 creature (живые существа) plant (растения) у mammal {.млекопитающие) 1 bird (птицы) artwdactyla accipitrid penguin (парнокопытные) (ястребиные) (пингвины) (крупный (орел) (ястреб) рогатый скот) aptenodytes endyptes spheniscus (большой) (золотоволосый) (галапагосский) s \ \ \ forsteri patagonica crestatus mendicalus ••• (императорский) (королевский) (кохолковый) Рис. 2.11. Наследование свойств в классификации живых существ. На практике множественное наследование можно реализо- реализовать через единичное. По семантической классификации существуют наследования свойств и элементов. Используются также термины таксономия (taxonomy) и партномия (partnomy). При наследовании свойств наследуются существенные свойства объекта, а в иерархии наследований они уточняются. С другой стороны, наследование элементов называют наследованием частей. При этом наследу- наследуются сами объекты. При многократном наследовании наследуе- наследуемые объекты усложняются. Например, в классификации живых существ, показанной на рис. 2.11, используется наследование свойств, а в структурном описании велосипеда, изображенном на рис. 2.12, — наследова- наследование элементов. При этом наследование свойств является насле- наследованием единичного типа, а наследование элементов представ- представляет собой множественное наследование. Существуют различные мнения о том, является ли метод формирования объектов главным вопросом в объектно-ориен- объектно-ориентированном программировании, ставящим объект во главу угла. При рассмотрении объектно-ориентированных языков с позиций
88 Глава 2 построения вычислительных моделей можно также считать, что существенным моментом является посылка сообщений как механизм организации вычислительного процесса. Однако в моделировании при решении задач создания реального математического обеспечения большую известность по сравнению с методом посылки сообщений получил метод генерации объектов, основанный на наследовании как разно- разновидности одного из методов модуляризации. В данном разделе в качестве основного содержания объектно-ориентированного программирования мы смело назовем наследование1)-2'. Велосипед Переднее колесо Основная часть Заднее колесо Седло Руль Педали Покрышка Спицы Покрышка Спицы Рис. 2.12. Наследование элементов в структурном описании велосипеда. 2.5.2. История объектно-ориентированного программирования Считается, что первоначальные формы объектно-ориентирован- объектно-ориентированного программирования были воплощены в языке Симула, пред- представляющем собой язык моделирования, разработанный в Нор- Норвегии Далом и др., и имеющем синтаксис, основанный на син- синтаксисе языка АЛГОЛ-60. Разработка языка Симула велась с первой половины 60-х гг. Довольно широко используется название Симула-67, в котором фигурирует год выхода руко- рукописи с описанием языка3'. Поскольку Симула является языком моделирования, он тре- требует описания объектов и их действий. Здесь уже имеются опи- описания, называемые "класс" (class), и допускаются конструкции, в которых используется наследование объектов. '> По сементике объектно-ориеитированного программирования можно ука- указать статью в журнале IEEE, SE-10, № 5 A984), pp. 519—527, основанную на упоминавшейся теории акторов. Семантика множественного наследования с точки зрения структур данных (абстрактных типов данных) обсуждается в журнале LNCS, 173 (Jun. 1984), pp. 51—67. 2) Представление о развитии в СССР объектно-ориентированного про- программирования может дать следующая работа: Э. X. Тыугу. Концептуальное программирование. — М.: Наука, 1984. — Прим. ред. 5) См. книгу: А. Н. Аидриаиов, С. П. Бычков, А. И. Хорошилов. Програм- Программирование на языке Симула-67. — М.: Наука, 1985. —Прим. ред. r,- {
Отношения и объекты 89 Наследование объектов, вообще говоря, важная идея, одна- однако помимо описаний, относящихся к объекту, в языке Симула определена операция, называемая new, которая реализует соз- создание конкретного экземпляра объекта (instantiation). Однако создание языка Симула само по себе не преследова- преследовало цели создания объектно-ориентированного языка программи- программирования общего назначения (хотя среди пользователей были люди, готовые к его широкому применению). Объектно-ориенти- Объектно-ориентированное программирование прочно утвердилось в связи с реа- реализацией функций машинной графики и нашло свое воплощение в языке Смолток, разработанном А. Кеем. Разработка языка Смолток началась с 70-х гг. По одной только литературе мож- можно проследить ряд версий: Смолток-72, Смолток-74, Смолток-76, Смолток-80, Смолток-82. В языке Смолток впервые была выдвинута идея объектно- ориентированного программирования. В нем реализованы ме- механизмы вычислений посредством описания содержания объек- объектов, описания действий, наследования и передачи сообще- сообщений. Большой интерес представляет реализация языка Смолток как конкретного примера системы объектно-ориентированного программирования в персональных компьютерах. Под влиянием языка Смолток на фирме «Ксерокс» в язык описания систем Меза были введены функции объектно-ориен- объектно-ориентированного программирования, в результате чего был разра- разработан язык Трейтс. Этот язык использовался при описании си- системы Star Workstation, разработанной фирмой «Ксерокс». С другой стороны, на основе Лисп-машины, разработанной в Массачусетском технологическом институте, была построена система Flavors, снабженная функциями объектно-ориентиро- объектно-ориентированного программирования. Вначале она была разработана для описания систем машинной графики, но затем применялась при разработке различных других систем. Существует также язык Objective-C, полученный введением объектно-ориентированных функций в язык описания систем С. В качестве языков логического программирования, наделен- наделенных чертами объектно-ориентированных языков, можно указать язык ESP, разработанный как одна из компонент в проекте ЭВМ пятого поколения, а также язык Eqlog, находящийся сейчас в стадии проектирования, однако привлекающий к себе внимание как язык описания ситуаций. Сочетание логического и объектно-ориентированного про- программирования интересно также и с точки зрения популярного в наше время соединения двух способов программирования. Представляет интерес трактовка такого соединения как связи между абстрагированием структур управления в логическом
90 Глава 2 программировании и абстрагированием структур данных в объ- объектно-ориентированном программировании. В языке Eqlog был учтен опыт создания языков описания ситуаций OBJ, 0BJ2 и в нем имеется возможность задавать свойства, которым должны удовлетворять объекты языка,, в виде конструкции, называемой theory. 2.5.3. Примеры объектно-ориентированного программирования: языки ESP и Eqlog Подробности объектно-ориентированного программирования описаны во второй части настоящей книги. В данном разделе мы проиллюстрируем основные принципы программирования на примере языков ESP и Eqlog, основанных на логическом программировании. Синтаксис логических языков программи- программирования и стиль логического программирования описаны в разд. 2.3. Вначале покажем, как можно организовать классификацию- живых существ, приведенную на рис. 2.11. Здесь мы будем использовать язык ESP. В языке ESP для описания каждого объекта используется следующий формат: class <Имя класса) ' , :: nature <Имя класса наследования) instance <Описание класса) ■ •" ' ".'"'■"''-'V ' attribute <Список имен свойств) У"'.: ~ ' ■'?'''•■ component {Список имен элементов) ' " * end {Список описаний действий) " !>... . Поскольку в языке ESP допускается множественное насле- наследование, после ключевого слова nature через запятую перечис- перечислены классы наследования. Описание класса представляет со- собой описание класса в целом и используется специальным об- образом. После ключевого слова instance идут описания отдельных объектов. В языке ESP наследование по свойствам и наследо- наследование по элементам выделяются ключевыми словами: attribute и component, и обрабатываются оба наследования. (Список описаний действий) представляет собой программу, справед- справедливую для данного объекта в конкретных обстоятельствах. Параметром к ней является объект, входящий в данный класс. Существует соглашение о предикатах, по которому перед пре- предикатной буквой ставится двоеточие (:). Итак, чтобы реализовать классификацию живых существ» представленную на рис. 2.11, пишется программа со связями наследования, показанная на рис. 2.13. Однако такая програм-
Отношения н объекты . 91 CLASS CREATURE HAS END. ■• . •.. rr- .-. ''■'-. CLASS ANIMAL HAS :. .. . . -'.]]• NATURE CREATURE; END. ; ■ CLASS PLANT HAS NATURE CREATURE; END. CLASS VERTEBRATA HAS NATURE A NIMAL;- !;'.;i. " .-n-.'.i'i Я" ..^ ;•:;..<„-с v t - END. . ,{■■-. ii,'..;,, ■Dbi:.; ... !/v:kpi.., ,;..:;; CLASS В//?Д HAS ' l: : ..чг. <:>si t,;:. ,viV-n NATURE VERTEBRATA; END. ,-/ .: ■. ■■ .. .-• , ■ -. CLASS MAMMAL HAS !-,,•:.- NATURE VERTEBRATA; ■ • ■-тЬ, END. CLASS PENGUIN HAS ' NATURE B//?D; END. CLASS KING-PENGUIN HAS NATURE PENGUIN; END.' - •.. ,;,..- CLASS EMPEROR-PENGUIN HAS r- , NATURE PENGUIN; ■:)-.■ — ' -, end. k.o;v.;:,; ;,-■.■•: i ■. CLASS ADELIE-PENGUIN HAS NATURE PENGUIN; - - - END. " ■ . CLASS ACCIPITRID HAS • , ; * NATURE В/ад; , ; END. CLASS EAGLE HAS NATURE ACCIPITRID; END. CLASS ЯЛЦ7/С HAS ;:,?.:!, .'AVd ,-..;. NATURE ACCIPITRID; :;: r; END. ' - ' - ;--r o.*m\ : У/';':\ CLASS FALCON HAS ,,',-t Л ■ ' : ; ;J •',,' NATURE ACCIPITRID; П-..:т END. ? ' j! .j,j\»/;t/ Г-ЛЛ, g^.z-.p CLASS ARTIODACTYLA HAS IVi'^ Ft(»4UU i-Alf Я^ТГЛ^ " ^-^ NATURE MAMMAL; • . м END. CLASS CATTLE HAS in ,,-,.,,. ..,. ,,.,v- ,.-.-,n г NATURE ЛЛПООДСГУЫ '"
92 -■■ - " Глава 2 ■■■;, END. ■ . ?.'-И ' ' ЛТ;Л«.-., ' •■ У; CLASS DEER HAS NATURE ARTIODACTYLA; - \ : . '-,:-; ,,,: .:<ДГ.;; END. л-". ЛКй.*.. .= -K> I /•>' Рис. 2.13. Выражение классификации живых существ с использованием язык» ESP. ма малоинтересна. Пополнив каждый вид свойствами (с ис- использованием латинских терминов), получим программу, изо- изображенную на рис. 2.14. CLASS CREATURE HAS INSTANCE <.<Л. \i.k. . , . ' - ATTRIBUTE ."\"ч\-! ?i : -ry, POSITION, BIRTH, ■ ■■ . LIFE-TIME, DEATH, PARENT, ■ CHILDREN, MORTAL (CREATURE): - TRUE. ; END. CLASS ANIMAL HAS . ' . . NATURE CREATURE.LOCOMOTIVE; . , END. -.:. ■•■• ' v »-.^ •••;;> CLASS PLANT HAS '-■ ■■"■' NATURE CREATURE; INSTANCE - , >t ■"■•'■■■ . V- .■ .■...; :PHOTOSYNTHETIC-METABOLIC(PLANT): END. . : CLASS VERTEBRATA HAS \ ,,; r . ; NATURE ANIMAL; '" ' тд/ INSTANCE -.HAS-SPINE(VERTEBRATA); , ■■., "ii 'Л'7 ■■ kb •-■"■A,; .- END. :. , ' ."■ V ;.:: CLASS B/i?D HAS .Д/л NATURE VERTEBRATA,WITH-WlNGS,OVlPmOVS< 'A .•■ , \F; END. ,K ;"v? i Г A/ .,, ■ CLASS AfAAfAf^L HAS . .,...' i,: . NATURE VERTEBRATA.VIVIPAROUS; КДдр^ал^ь ■ { ' 4Э END. ■ M 'TW'JTAV ' ' Рис. 2.14A). Программа на языке ESP с подробной классификацией сушеств. " :\ ;,"' .;■; ДИ,
Отношения и объекты J* ■ , и* CLASS PENGUIN HAS ' ~ ! ""^ • NATURE BIRD.SWIMMING; ■ INSTANCE : LIVE(PENGUIN,PLA СЕ): -MARINE (PLACE),:HEMISPHERE(PLACE,SOUTH> END. CLASS KING-PENGUIN HAS NATURE PENGUIN; i END. '•'■•■. ■ '-" CLASS EMPEROR-PENGUIN HAS \kiMi :;,П (. NATURE PENGUIN; •■ / / i>.;' i INSTANCE '-'I ''•• V^i- :LIVE(X,ANTARCTIC); '■ ■- a ' ' ':' ■.LARGESIZE(X) i/l^OO' лК«: END. :■•:■.-:••/.)<.;:;■■" .Т'.-П: CLASS ADELIE PENGUIN HAS .. ■? NATURE PENGUIN; ' :. INSTANCE '■-' " :LIVE(X,ANTARCTIC); ' "'i :MADIUMSIZE(X) END. CLASS ACCIPITRID HAS NATURE BIRD.FLYING; '"•. -' END. :"'O ••■.■.!'Г;:. . :.U: CLASS £HGL£ HAS NATURE ACCIPITRID; ■• .^\": ;'. ... INSTANCE ^/-rv: -.LARGE(EAGLE); . :LONG-BROAD(FAGLE\WINGS~SHAPE); :STRONGSOARING-FLIGHT(EAGLE); END. CLASS ЯЛГСТС HAS NATURE ACCIPITRID; INSTANCE - РИС. 2.14B). |..г;КК ,v. <:■.-. tffJH .-.«Hi-:: , -..л-., :-.^7":.' r '.«ff Пользуясь это программой, можно делать следующее1*. )Г. ?- :NEW(#K1NG-PENGUIN,KING-PENGUIN), '^ -.CAN-MOVE(KING-PENGUIN). '"* В этом примере создается экземпляр класса "Королевский пингвин" (king-penguin) и задается вопрос о том, может ли •> Имена с префиксом # в языке ESP являются именами классов. :new — предикат создания одного объекта.
04 Глава 2 -о :HASSTRONG-CLAWS(HAWK); CI, ■ vV..;; .-л .. ,-- " V ■■ END. - .■••.,>:■/•■;> .'.т,- m^-:.' CLASS FALCON HAS ' .■....;,; NATURE ACCIPITRID; ,\ ;-;> 7'>,<•,. ,-:-.•: INSTANCE :L0NG(FALC0N\WINGSHAP£): / :FLY(FALCON,SWIFT); ..;. hV .,;. end. ; ,;л.' ', • -.■;■:■'/ : CLASS ART10DACTYLA HAS ,c , NATURE МЛМЛТЛ!.; - /,{. \UUi>'/.a^ Ш = ^Л« '■ ' ' -•*.;■ instance :лгл\>л:т.:;яиг/л. attribute :r, иг/:; NUMBER-OF-TOES; .V Л : ; "Г' 'J . \. -.HAS-HOOF(X) , . ,,>",* . :TEST-T0ES(X):-EVEN(X\NUMBER-0P-T0ES)', END. = "• ■"*-.. • -- ,> • r, CLASS CATTLE HAS - • NATURE ЛЯПООДСтЛ; ■t^- :DOMESTICATED(CATTLE); END. CLASS D££# HAS NATURE ДЯГ/ООЛСГУЫ; ' . INSTANCE :!U- :HAS-ANTLER(DEER):-MALE(DEER); < END. • . -\ ' \ CLASS LOCOMOTIVE HAS У. ' / ' INSTANCE ;; ,//,-'■ ATRIBUTE . . . POSITION, VELOCITY; ■:■■ . ;/ :СЛЛ^-МОУ£(ОВ/£СГ). -/- END. Рис. 2.14C). он, этот пингвин, двигаться. Ответ на этот вопрос, естественно, положительный, однако при этом интересно, что описание: can-move отсутствует в классе king-penguin, а выдается в результате наследования по цепочке: penguin-*-bird-yvertebra- ta-*-animal-+locotnotive. Ответ на вопрос: сап — swim (King- Penguin) будет также утвердительным, однако ответ на во- вопрос: ca.nswim (Falcon) будет отрицательным, поскольку на- наследование при этом пойдет по другому пути. Таким образом, с помощью программ можно накапливать знания определенного рода. Для иллюстрации возможностей языка Eqlog рассмотрим математический пример. В этом языке аналогом объекта языка
Отношения и объекты CLASS SWIMMING HAS NATURE LOCOMOTIVE; INSTANCE -.CAN-SWIM(OBJECT). END. CLASS FLYING HAS NATURE LOCOMOTIVE; INSTANCE -.CAN-FLY(OBJECT). END. CLASS V/WP/4#Of/S HAS INSTANCE • •••а'Ч- ATTRIBUTE BABY-HOLDER; END. CLASS WITH-WINGS HAS INSTANCE ATTRIBUTE WINGS-SHAPE; COMPONENT END.b, RIGHT-WING, TAIL-WING; | HAS , INSTANCE . ;J ATTRIBUTE ,\ , EGGS; , , , .... ., , : ■ - ..,. ч END. л, ■:..... :..., ;.. . - ;.':-,, -- . • -.-.- ' . Рис. 2.14D). ESP, обозначаемого словом class, являются объекты, обозна- обозначаемые словами sort, module и theory. Объекты sort соответст- соответствуют типам данных. В языке Eqlog слова type избегают. Для описания содержания и действий объектов sort используют объекты theory и module. Наиболее близким аналогом конст- конструкции module является конструкция class из языка ESP. Конструкция theory описывает свойства, выполняющиеся для конструкции sort. Есть возможность описать эти свойства в общем виде; как и в случае ESP, нет необходимости в томг чтобы эта конструкция выполнялась сама по себе. Она слу- служит для того, чтобы, задавая совокупность логических условий,, гарантировать правильность программы. Особенностью языка Eqlog является возможность передачи конструкций theory как параметров конструкций module. Бла-
96 г:-; Глава 2 .-■;.„■ ■годаря этому можно описать выполнимость приводимой ниже конструкции module относительно конструкции sort, удовлетво- удовлетворяющей некоторой совокупности логических условий. Итак, для начала выберем математическую систему, назы- называемую кольцом (более точно, коммутативным или эбелевым ■кольцом), и зададим его свойства в виде конструкции theory (рис. 2.15). THEORY RING IS SORTS RING i FNS '' ': " ''" ■-■ + :RING,RING->RING(ASSOC COMM ID:0) ~:RING->RING *:RING,RING->RING(ASSOC COMM ID:1) VARS X.Y.Z RING AXIOMS ENDTH RING Рис. 2.15. Конструкция Theory для кольца". Здесь естественным образом различаются конструкция с именем RING, существующая как теория (theory), и конструк- конструкция с именем ring, существующая как объект. Поскольку в языке Eqlog допускается функциональная нотация, с помощью ключевого слова fns можно задавать операции. Эквивалентно- Эквивалентности, описанные в разделе теории, поименованном axioms, а так- также ключевые слова assoc, comm, id в разделе с именем fns указывают свойства объекта ring, описанного в объекте RING. Здесь assoc обозначает ассоциативность (associativity), comm — коммутативность (commutativity), id — идемпотент- идемпотентность (idempotent). После id: написаны единичные элементы, соответствующие операциям, описанным в разделе fns. Первый член раздела axioms показывает, что операция "—" дает об- обратный элемент относительно операции " + ", а второй член задает дистрибутивность, являющуюся общим свойством колец. Рассмотрим подмножество кольца, состоящего из одних только ненулевых элементов. С использованием языка Eqlog его можно задать в виде, показанном на рис. 2.16. При этом theory MULT наследует theory RING, а описанный в ней sort mult является подсортом sort-a ring. '> Подробнее о рис. 2.16 н 2.17 см. Goguen J. A., Mereguer J. Equality, Types, Modules and Generics for Logic Programming, Proc. The 2nd Int. Conf лп Logic Programming at Uppsala Univ. A984).
Отношения и объекты 97 THEORY MULT USING RING IS .. . . ...j.^vi^.. ,." ,.-... SORTS МШЛ" .Л\"ч.ч->.:; :■■ " ■■<:'■, -jw.=:.;..;: > т-r-r - .-q.. SUBSORTS >~Л'Г: ?•''."' (: ■:•..■"•'.'. nr/vi-f-f/ :;<i^r MULT<RING :-■ .fiy/-RC-je -v ■■.:• :,::Г-;-. ' VARS • ,. X,Y:RING . г ■ AXIOMS ••■:-. ■■■■'-■? ';.чтэ..-, C/t ^!-:.-- •.'• - -r/n> n Л1£/1ГA). •- ■ "-■/, MULT(X»Y):-MULT(X),MULT(Y). >- ;- ;W ,h:»ix.l ENDTH M£/Lf .,;.:'Я.-а. o;-.-».u_, v. Рис. 2.16. Определение конструкции mult, являющейся подсортом конструк- конструкции ring. Данный тип наследования является наследованием по свой- свойствам, и с теоретико-множественной точки зрения mult дейст- действительно является подмножеством множества ring. Наличие в разделе axioms одних только ненулевых элемен- элементов не отражено в явном виде, а указано существование еди- единицы и замкнутость относительно операции умножения (что дает полугруппу). Проведя указанные подготовительные операции, определим с помощью языка Eqlog дробные числа. Определение дано на рис. 2.17. Как видно из этого определения, theory MULT тре- MODULE FRACTION[M::MULT] SORTS INVERT1BLE.FRACT f SUBSORTS RING,UNVERTIBLE<FRACT FNS /:RING,MULT->FRACT *:FRACT,FRACT->FRACT(ASSOCCOMMID:0) +: FRACT.FRACT- >FRACT(ASSOC CO MM) ID: 1) -1:INVERT1BLE->INVERTIBLE VARS Y,W:MULT X,Z:RING AXIOMS ' '■'" . . J X=X/\ X/Y=Z/W:-X*W=Z*Y. (X/Y)*(Z/W)=(X*Z)/(Y*W). INQVERTIBLE(X/Y):-MULT(X). (Х/У)-' ENDMOD FRACTION Рис. 2.17. Определение дроби. 7-1428
98 -^~:, Глава 2 :лО бует, чтобы знаменатель не равнялся нулю. Поскольку MULT является параметром module FRACTION, при конкретном соз- создании модуля (объекта) FRACTION можно записать, напри- например, следующее выражение: make RAT\sFRACTION[INT]endmakt Здесь RAT—имя конкретно созданного экземпляра объекта; INT — еще один модуль, выражающий условие, которому должна удовлетворять теория MULT (в данном случае выра- выражает целочисленность). Ниже приводится более подробное описание процедуры создания экземпляра INT с описанием конструкции view на языке Eqlog. Полный вид процедуры будет следующим: , view NZINT-AS-MULT is INT as MULT by ;/ int is ring ...... , mint is mult .,'.''.' " . "'.'._ endview make RAT is FRACTION[NZINT-AS-MULT] endmake Таким образом, на языке Eqlog предполагается реализовать мощные возможности. Однако для его практической реализа- реализации требуется время. Тем не менее он весьма интересен для рассмотрения перспектив объектно-ориентированного програм- программирования1*. -vd^ ■-,-. u'. vJ." г - Ч(. ■'<Vf) ') Вопросы параметризации таких объектов изложены в $tfe(t$c1fiffl& SE-10, No. 5 (Sep. 1984), pp. 528—543. Они рассмотрены в ней в связи с так' называемым полиморфизмом типов данных. . . .. s t, ... r
u:s;r( -ллт">\\ \ ■ . Введение в Смолток , u 4 >, , . Л,*- -Л; - V Язык Смолток зародился на основе идей небольшого числа ис- исследователей1' и в течение десяти лет упорного труда вырос в большую систему. Язык Смолток разрабатывается с начала 70-х гг. в исследовательском центре автоматизации учрежден- учрежденческого труда ПАРС в Пало-Альто фирмой «Ксерокс»; с 1983 г. он был выпущен на рынок и приобрел широкую известность, однако до настоящего времени он применялся лишь на авто- автоматизированном рабочем месте фирмы «Ксерокс», обладающем высокими функциональными возможностями. Первая версия системы с учетом года разработки была названа Смолток-72, через два года была создана новая система. Такое развитие событий очень напоминает обстоятельства, при которых проис- происходило распространение системы Юникс (UNIX): ее начало также было положено идеями небольшого числа исследовате- исследователей лаборатории «Белл», а затем уже другие написали боль- большую систему. В результате использования университетами она быстро распространилась и теперь используется не только на уровне супермини-машин, но и в суперперсональных компью- компьютерах. Одной из причин широкого распространения системы Юникс является то, что она предназначена для машин, исполь- использующихся в режиме разделения времени, например PDP-11; в то время для таких машин еще не было хороших операцион- операционных систем. Смолток, подобно Юниксу, может быстро приоб- '» При его создании учитывали возможности высокоэффективного рабо- рабочего места н инструментальной операционной среды, позволяющие повысить эффективность разработки программ на этом языке. Если первоначально круг лиц, имеющих опыт работы с языком, был весьма ограничен, то теперь ввиду его использования с 1983 г. в университетах н с появлением фирм, по- поставляющих необходимое оборудование, широкое распространение этого язы- языка — лишь вопрос времени.
100 Глава 3 рести широкую популярность как система, используемая в быстро развивающихся в настоящее время суперперсональных компьютерах и благодаря активному использованию средств машинной графики. Несмотря на то что Смолток уже представлен широкой научной общественности, еще есть ряд связанных с его при- применением нерешенных проблем. Прежде всего до сих пор еще низка эффективность его работы. В настоящее время он удов- удовлетворительно работает лишь на высокоэффективных, но до- дорогих рабочих местах, производимых фирмой «Ксерокс». Одна- Однако ведутся исследования по постановке Смолтока на машины ВАКС (VAX) и МС-68 000, и постепенно появляются примеры его успешного применения. Так группа, возглавляемая автором (отделение вычислительной техники технологического факуль- факультета Токийского университета), основываясь на объектно-ори- объектно-ориентированных языках программирования, создала инструмен- инструментальную среду для разработки высокоэффективных программ. Эти технологические средства названы именем "Кику" (хри- (хризантема). Система Кику сохраняет совместимость с языком Смолток-80, кроме того, для нее создается компилятор, ориен- ориентированный на ЭВМ МС-68 000. Это позволит и в ближайшем будущем начать распространение дешевой и высокоэффектив- высокоэффективной системы. Одновременно с этим группа, руководимая автором, спроектировала микропроцессор "Катана" (меч), ориентированный на реализацию высокоэффективной системы. Ожидается, что эта система в несколько раз, может быть даже на порядок, будет превосходить по быстродействию систему Кику, реализованную на МС-68 000. Архитектура микропро- микропроцессора "Катана" описана в данной книге. 3.1. Общие сведения о языке Смолток 3.1.1. Особенности автоматизированного рабочего места : ■ АРМ ALTO было создано в 1973 г. Позднее на его основе были разработаны система STAR фирмы «Ксерокс» (Xerox) и сис- система Макинтош (Mclntosh) фирмы «Эппл» (Apple). Система ALTO была снабжена графическим дисплеем с побитовым отображением в оперативную память. Для того времени это было устройство с высокой разрешающей способностью, изоб- изображение в нем формировалось в растре 600X800 точек. Ярко- Яркостью каждой точки можно было управлять независимо. На нем легко представлялись как символы, так и графические изобра- изображения. На основе этого дисплея были разработаны многочис- многочисленные символьные редакторы и устройства машинной гра- графики.
Введение в Смолток 101 Важной особенностью графики системы ALTO является управление курсором с помощью указателя типа "мышь". По сравнению со световым пером указатель типа "мышь" имеет гораздо большую разрешающую способность. Он имеет еще и то достоинство, что его можно не держать в руке, и при этом он будет продолжать указывать нужное на экране место. Указатель типа "мышь" быстро распространился и сейчас как устройство указания места на экране используется почти на всех АРМах и персональных компьютерах. Радикальным новшеством в системе ALTO была возмож- возможность подсоединения к ней быстродействующей распределенной сети, называемой Этернет (Ethernet). Благодаря этому систе- системы ALTO получили возможность обмена файлами, что позво- позволяет организовать общее пользование дорогостоящими печата- печатающими устройствами и накопителями. Система Этернет стала основой для построения локальных вычислительных сетей. Исследования, касающиеся языка Смолток, выполнялись с целью создания системы программирования для эффективной связи человека с машиной'. При этом старались максимально использовать высокие графические и коммуникационные воз- возможности автоматизированного рабочего места ALTO. 3.1.2. Объектно-ориентированные языки Смолток принадлежит к классу так называемых объектно-ори- объектно-ориентированных языков программирования. В общем случае для выполнения начислений необходима вычислительная процедура и данные к ней. В языках Алгол, Кобол, Фортран, разработан- разработанных до начала 60-х гг., главную роль играли процедуры, и при выполнении вычислений они снабжались данными. Однако во второй половине 60-х гг. область применения вычислительных машин сильно расширилась. Стало возрастать количество ма- машин, в которых использовалась обработка символов, формул, списочных структур и т. д. Возрастало число программ, в ко- которых требовалось создавать и использовать данные сложной структуры. Стало ясно, что процесс программирования можно облегчить, если ввести абстрактное понятие объекта вычисле- вычислений, представлять эти объекты в виде программ, допускающих вычисления над ними. Это понятие может играть важную роль при построении моделей, создании прототипов и т. д. Однако существовавшие в то время языки были малопри- малопригодны для этого в силу ограниченности типов данных в них. Например, при моделировании аппаратного обеспечения ЭВМ ') Интересно, что первоначальной целью работы было развитие творче- творческих способностей детей с помощью ЭВМ.
102 Глава 3 необходимо определить непосредственно в виде структур дан- данных такие устройства, как процессор, память, устройство ввода- вывода, н описать потоки команд и данных между ними. В результате и было выработано такое понятие, как абстракт- абстрактный тип данных. Абстрактные типы данных позволяют опре- определять в программах новые типы данных и реализовать их на основе типов данных, определенных ранее. В качестве примера абстрактных типов данных чаще всего используют стек. Для реализации стека обычно используют массивы, однако, по- поскольку основными операциями над стеком являются заталки- заталкивание в стек и выталкивание из стека, можно, создав абстракт- абстрактную структуру данных типа стек, не использовать других способов доступа к элементам массива, так же как и в компи- компиляторе не иметь соответствующих механизмов доступа. Однако при этом язык может оставаться процедурно-ориентированным. Дальнейшее развитие языков программирования привело к появлению такого элемента языка, как "объект". Объект со- содержит и процедурную и понятийную части (объект=данные+ +процедуры), причем для представления понятийной части ис- используется аппарат абстрактных типов данных. 3.1.3. Сообщения Работа процедурно-ориентированных языков основана на поня- понятии вызова процедур: данные передаются в виде параметров к вызываемым для исполнения процедурам. В объектно-ориентированном языке Смолток существует понятие "посылка сообщения". Такая посылка включает в себя адресат — имя получателя сообщения и само сообщение, пред- представляющее собой требование выполнить процедуру над объ- объектом — получателем сообщения. При этом вызывается соот- соответствующая программа (метод). При описании посылок сообщений используют так называемые "селекторы". Посылка сообщения с унарным селектором может записы- записываться, например, следующим образом: stack pop. Здесь stack указывает на объект, служащий получателем сообщения, a pop является унарным селектором, который и образует сообщение. Посылка сообщения с бинарным селектором, например арифметическое выражение, записывается в виде: х+у. Здесь х — получатель сообщения, +у — сообщение. Здесь у — един- единственный параметр, а " + " — бинарный селектор. В общем случае бинарные селекторы должны оформляться специальными символами. Есть возможность создания посылок сообщения с несколь- несколькими параметрами в сообщении. В выражении, реализующем
Введение в Смолгок 103 эту возможность, используется селектор с ключевыми словами. Например, в посылке сообщения penmove:eastby:10 pen — получатель сообщения, move: east by: 10 — само сообще- сообщение. Два ключевых слова move: и by: представляют собой селекторы ключевых слов, a east и 10 — значения параметров. В селекторе с ключевыми словами каждое ключевое слово обязательно должно заканчиваться двоеточием. Таким образом, имеется возможность создания посылок сообщений без исполь- использования специальных символов селекторов. Сообщение анализируется получателем, и поэтому два син- синтаксически одинаковых предложения, будучи посланы разным получателям, могут вызвать разные действия. Например, со- согласно сообщению table moveTo: location A стол в комнате будет передвинут в положение А, а согласно сообщению window moveTo:location A выделенный фрагмент экрана будет перемещен в положение А. В некоторых случаях разбор сообщения может окончиться не- неудачей. Например, в сообщении table+ 5 к столу прибавить 5 никак нельзя: объекту table (стол) нельзя посылать сообщение + 5. Поэтому системой фиксируется ошибка по невозможности выполнения. 3.1.4. Классы . : _л. iA ,Я(,, ;- ЕЯ. ...,„Ос-.я. :.-,-^ж,^--Э>'': В предыдущем примере слово table обозначает объект, соот-. ветствующий столу, слово location A — объект, соответствую- соответствующий положению, а символ 5 указывает на объект, соответст- соответствующий целому числу пять. Таким образом, объекты имеют различные свойства, и эти свойства определяются тем, какие сообщения может получать объект. Описание совокупности со- сообщений, которые может получать объект, называют его специ- спецификацией. Спецификация объекта, зарегистрированная в систе- системе, представляет собой класс, и классы также являются объ- объектами. Существует множество объектов, соответствующих специ- спецификации одного и того же класса, их называют экземплярами данного класса. Таким образом, в окружающем нас мире су-, ществуют объекты, называемые классами, а также объекты — экземпляры классов (рис. 3.1).
1ft Глава 3 Ji! Множество экземп- экземпляров класса "стол" " Отношение Класс' "класс - экземпляр " Множество экземпляров ( класса "положение" ■ .. . . . Множество экземпляров класса "целое число" . . . >, '■ . .0": ■Л .■.--• Класс 'стоя' *'" ПЛ Т,ГЛ ,:- "целое число " Рис. 3.1. Окружающий мир состоит из объектов, образующих множества с одинаковыми описаниями. Описания объектов, зарегистрированные в системе, называются классами, и классы так- также являются объектами. Точками обозначены объекты. 3.1.5. Задание классов Если зарегистрировать в системе спецификацию экземпляра класса и спецификацию самого класса, то получим определение класса. Спецификация экземпляра состоит из объявления перемен- переменных экземпляра и объявления методов экземпляра. Специфи- Спецификация самого класса также состоит из объявления переменных класса и объявления методов класса. Переменные экземпляра определены внутри экземпляра, и прямые ссылки на них из других экземпляров не разреша- разрешаются. Объявление метода экземпляра состоит из схемы сообще- сообщения и тела метода. Схема сообщения состоит из имени сооб- сообщения и формальных параметров. Тело метода представляет собой программу, выполняемую по сообщению, посылаемому экземпляру этого класса или экземпляру подкласса. Переменные класса являются глобальными: на них разре- разрешается ссылка из всех экземпляров класса. Методы класса выполняются по сообщениям, посылаемым этому классу. Пример определения класса приведен на рис. 3.2.
class name Table * - - Имя класса "Стол" instance variable names location -- Переменная экземпляра: "location" — j class methods . . - - Начало определения методов класса instance creation ' ;■ - - Объявление протокола создания экземпляра ' fcr - - Схема сообщеиия для метода класса new v X, fsuper new setlnitialLocation ■' . i - -i.*"" _ ' -- Тело метода new. Вначале создается объект и затем ему посылается ' , _ ' ;■* - - сообщение setlnitialLocation; таким образом происходит инициали- •. - - зация - г ■ , ; Г - instance methods - - Начало определеиия методов экземпляра -.*> transfer .',..-.. , ' ; г' Г; J5 - , . moveTo:loc - '' , • . _ '■ * \ location-Hoc ~ .''"-', ^ .* й> ' private - . '' : ; ,. • setlnitialLocation . ■> ' ^ - ;_ localion-*-Point newx:0y:0 Рис. 3.2. Пример определения класса. Пример приведен в виде протокола с тем, чтобы осуществить разбивку метода класса на несколько подмножеств. Приведены краткие ком- комментарии, которые не вызывают никаких действий в системе. В данном примере определяется абстрактный объект Table, создаваемый на экране. Экземпляр стола имеет переменную «location». В создании экземпляра участвует метод «new». Методы экземпляра включают в себя moveTo, используемый для перемещения, (помещен под заголовком transfer) и setlnitialLocation, используемый при создании объекта для задания начального положения (помещен вод заголовком private). После двух дефисов записывается комментарий.
Глава 3 Класс А Отношение типа супер- суперкласса Переменные класса а,Ь,с Переменные экземпляра Методы класса и - Методы экземпляра КлассВ Переменная экземпляра Ь Методы класса f3 Методы экземпляра Рис. 3.3. Структура иерархии классов. 3.1.6. Иерархия классов В Смолтоке-80 существует возможность введения иерархии классов (class hierarchy) с целью получения более компактных описаний и облегчения понимания отношений между классами. Иерархия классов устанавливается объявлением суперклас- суперкласса (superclass) внутри описания класса. Если объявлено, что класс А является суперклассом класса В, то это означает, что спецификация класса В включает в себя как спецификацию класса В, так и спецификацию класса А. При этом говорят, что класс В наследует (inherit) спецификации из класса А. На рис. 3.3 показано описание класса А как суперкласса класса В. В данном случае реализация класса В будет содержать в ка- качестве переменных класса переменные а, Ь, с, в качестве пере- переменных экземпляра — переменные h, x, у, в качестве методов класса — процедуры fl, f2, f3, а в качестве методов экземпля- экземпляра — процедуры gl, g2, g3. Одним из положительных эффектов иерархии классов яв- является возможность объединения совпадающих по лексике объявлений методов, встречающихся в разных местах. При этом программы становятся более ясными и легко читаемыми.
Введение в Смолток Класс Number 107 Класс /Ыг&г < = , X К ч, J Класс J ■ tV. -'• '■ Float ".if'it ,• ЛП/.i c-s p .'.; ,-L 'c. i • '= 1 * »(.-Г. Рис. З.4. Используя иерархию классов, можно создать описание объектов, ис- использующих общие программы. В данном примере в связи с тем, что классы Integer и Float имеют много общего, создай суперкласс Number, общий для них обоих, куда помещены общие методы: >■ в ф. Например, предположим, что имеется класс Integer, описываю- описывающий целые числа, и класс Float, описывающий действительные числа, представимые в ЭВМ. Если при этом создать класс Number, являющийся суперклассом для них обоих, то те мето- методы, которые определены в классах Integer и Float и при этом совпадают лексически, могут быть определены в классе Num- Number, после чего их можно удалить как из класса Integer, так и из класса Float. Например, ^ можно описать в виде t (self <y) not и включить в класс Number. Здесь ключевым словом Self обо- обозначена псевдопеременная, указывающая на получателя сооб- сообщения вида: ^е (подробно об этом написано в разд. 3.1.11). Сообщение <у вызывает два разных метода в зависимости от того, на что указывает псевдопеременная Self: на экземпляр класса Integer или на экземпляр класса Float (рис. 3.4). Во многих случаях иерархия классов позволяет также легко объявлять новые классы. Это связано с тем, что часто новые классы можно создавать как подклассы уже созданных клас- классов с введением в них лишь особенностей, присущих данному подклассу. Рассмотрим, к примеру, класс "поток", используе- используемый для ввода-вывода символов и другой информации. Будем считать, что уже определен класс WriteStream, используемый только для выходного потока. При этом класс ReadWriteStre-
108 Глава 3 am, используемый и для выходного и входного потоков, мож- можно создать как подкласс класса WriteStream, определив при этом еще лишь метод чтения. 3.1.7. Вызов метода через сообщения В языке Смолток-80 сообщения анализируются их получателем. При этом в зависимости от того, посылается ли (лексически) одно и то же сообщение, например, экземпляру класса Integer или экземпляру класса String, результаты будут совершенно разными. В качестве примера рассмотрим задачу печати объекта. При этом используется сообщение print. Это — единственное сообщение, которое используется при печати как экземпляров класса Integer, так и экземпляров класса String. При этом говорят, что сообщение print — сообщение родового (generic) типа. При печати экземпляра класса Integer сообщение X print дает, например, число 159, а при печати экземпляра класса String сообщение S print дает, например, строку "abc". Это происходит из-за того, что каждый объект анализирует сооб- сообщение по-разному. Рассмотрим теперь вызов метода через сообщение подроб- подробнее. В каждом классе имеется словарь методов. Он представ- представляет собой таблицу имен сообщений и тел процедур, вызывае- вызываемых этими сообщениями. Поиск ведется по имени сообщения, и если в этой таблице это имя имеется, то результатом поиска будет тело процедуры. При посылке сообщения определяется прежде всего класс получателя. Происходит проверка того, имеется ли имя сооб- сообщения в словаре методов этого класса. Если оно имеется, то выполняется соответствующее тело процедуры. Если такого имени в словаре нет, то определяется суперкласс этого класса, и в словаре суперкласса снова ищется имя сообщения. Если и там его не оказывается, то ищется его суперкласс, и эта опе- операция повторяется до тех пор, пока система не доходит до класса, не имеющего суперклассов (класса Object). Если и в нем имя сообщения не будет найдено, то выдается диагности- диагностическое сообщение о том, что данный получатель не может разобрать это сообщение (рис. 3.5). xrsp г,:; и. 3.1.8. Простой пример ;яет,?оз о.< .... Перед тем как приступить к изложению более сложных поня- понятий, приведем простой пример. Рассмотрим помещение элементов в массив применительно к задаче поиска. Если массив отсортировать, то при использо-
Введение в Смолток 109 Класс Object-. класс А Класс Получатель -* ГлпЯпdi класса f „»г Словарь >tt класса ' "fl" "f2" "f3" 74" iV "g2" "g3" g-4" Рис. З.5. Последовательность посылки сообщений. Прн посылке получателю г сообщения print в словарях классов г и А отыскивается слово «print». Поскольку там его нет, производится поиск слова «print> в словаре клас- класса Object, являющемся суперклассом класса А. Там его тоже нет, и система выдает ■сообщение об ошибке. вании метода двоичного поиска время поиска составит величи- величину, пропорциональную log и, где п — число элементов массива. Время поиска в неотсортированном массиве пропорционально п. Для реализации быстрого поиска создадим класс SortedAr- гау (отсортированный массив), экземпляры которого всегда будут отсортированными массивами. Поскольку в момент создания массива число его элементов заранее неизвестно, определим его структуру так, чтобы его можно было увеличить до любого размера. Такие массивы называют расширяемыми (rubber band array). Добиваясь максимальной общности при определении мето- методов этого класса, мы хотим как можно больше расширить об- область его применения. Так, при сортировке необходим оператор арифметического сравнения, однако если его жестко закрепить за этим классом, то удастся создать лишь целочисленные от- отсортированные массивы. Используя возможность привлечения функции сравнения извне (в момент формирования экземпля- экземпляра) закреплением ее за этим экземпляром, можно расширить область применения метода. •class name SortedArray superclass Object - - Суперклассом класса SortedArray us - - является класс Object instance variable names array sortBlock currentSize - - Эти переменные имеются в каждом экземпляре: идентификатор array опи- - - сывает массив значений, sortBlock описывает функцию сравнения,.
ПО -л Глава 3 „F / • - currentSize указывает количество помещенных в массив элементов. class methods creation - - Объявление протокола создания массива: - - заголовок new f super new init:[:a:b|a< = b] - - Экземпляр класса SortedArray создается методом new, no - - умолчанию в качестве функции сравнении берется =. Согласно - - приведенной записи, вначале выполняется метод super new, - - который создает требующий последующей инициализации эк- - - земпляр массива; попытка создания экземпляра с помощью ; - - метода self new приводила бы к зацикливанию. Поэтому и ис- - - пользуется метод из суперкласса. Затем созданному экземпляру -- посылается сообщение для инициализации: init:[:a:b|a<=b]. ' -- Здесь [:a:b|a< = b] является невычисляемым оператором, на- . • - зываемым оператором блока; а и b являются формальными - - параметрами. После инициализации по закону созданный эк- - - земпляр возвращается как зиачеиие. sort В lock: aBlock f super new init: aBlock - - Создание экземпляра с внешней функцией сравнения. Instance methods . ,. initialisation . r ' "..-.., МЛ init: aBlock ^;...,; ^\\ '. ',' ,','' ., v.'№'i", ';[[/ ,' :/ b array-«-Array new: 10 >:i (Ущпг^и: '; .г'г("й7*■'*'* ?-'г"'^ fii-iy-n -- В массив array помещается элемент ДЛЯ сравнения!', ! currentSize-И) - ,.. ' 'J ' sortBlock-<-aBlock . "' ' .' ': '■ ' ■ - ■ <.■• Insertion insert: a >> -- Помещение в массив элемента а. Оно выполняется с упорядо»' .,„ - - чеиием. 1 |loc new Array i| --Объявление временной переменной. ' ^,, " currentSize=O ifTrue: -- Если массив пока еще пуст '_'„ *'•"' [currentSize-*-l. farray at: 1 put: a]. ,.,,' ^..'^\., .. --Условный оператор. Условие описывается получателей ,", .. ( . .. ' -- сообщения ifTrue. Параметры представляют собой испол-' 'j'*',*1 "'..'i ,\' ' -• нительную часть. Если при этом значение переменной ' ' -- равно нулю, то она получает значение 1, а переменная ■■:-'*■ - - помещается в начало массива. «irrentSize>= (array size) ifTrue: ,. {newArray^-Array new:2*currentSize. - -. newArray replaceFrom: 1 to: currentSize .•: with: array startingAt: 1.
\ Введение в Смолток 111 ; array+-newArray] ■ - - - При переполнении массива создается новый массив двойного ; - - размера, в который переписывается содержимое существую- • - щего массива. t*-currentSize. . „Л(sortBlock value: (array at: i) with: a) or: i<=0] - - sortBlock является оператором блока, значение которого может -- быть вычислено через селекторы value:, with:. - - Здесь array at: i и а являются фактическими параметрами whileFalse:[array at:i+1 put: (array at: 1). i-«—i — 1J. . • - while — оператор цикла. Условие выхода из цикла определяет- :., ..,- — • • ся получателем сообщения whileFalse. Параметром является - - тело оператора. Вычисляется условие, и если оно ложно, то • : - - вычисляется тело оператора, и затем вновь вычисляется усло- - - вне. В результате элементы, большие чем а, сдвигаются вправо \. - • на 1 поз. array at: i+1 put: a. currentSize«-currentSize+1 search - - Объявление протокола search: a - - Поиск иа наличие а. Если а имеется в массиве, то - - возвращается его индекс. Если нет, то возвращается - - нуль. | lower middle upper| -• Двоичный поиск. lower*-l „.»: Xfi.?---. г , . upper^-currentSize. , .. ,: '"'.'■;'.. ,- •• [lower < = upper] whileTrue: * .-', \,.;'...... .;• С . и'"'" . ' " [middle-*-(lower+upper) quo: 2. . . :J" ' , , ." (array at: middle) = a ifTrue:[fmiddle]. ' ' . (sortBlock value: (array at: middle) with: a) if True: flower4-middle+1] '...,, i\'".';' ifFalse:[upper-f-middle—1]]. It ";'. .'. tO ■■ Возвращается в нуль в случае отсутствия э*е- ....',".' . ■ мента а. ■ ... Определенный класс используется следующим образом. ■■" :': y<-SortedArray new. ' : fi';'i f» J^ a;^ у insert: 1; insert: 3; insert: 100; insert: 5. ; .;» : ■' -- Такую форму записи называют сцепленными сообщениями ] '•■'■ /'■'' - - (cascaded message). Она эквивалентна записи: ' ' : ; "' ■ - - у insert: 1. у insert: 3. ... -. ': "-■ ■',;^1- ': г+-у search: 6. - - Подстановка в переменную z значения 0. : •' ЛХ z<-y search: 5. -- Подстановка в переменную z значения 3. •"' * ! J Ги*л jllf.^: К >-
lie Гл#вв '*'."■' РЧ '■■: Имя класса- Integer Методы класса : fl,f2 Методы экземпляра ■. Определение класса Реализация в форме объекта Рис. 3.6. Связь классов и метаклассов. Метакласс является классом класса. Класс является экземпляром метакласса. При по- посылке классу Integer сообщения И оно анализируется метаклассом Integer. / Метакласс Словарь Я f2 Класс Словарь Integer методов Класс Integer методов 3.1.9. Метаклассы В языке Смолток-80 классы одновременно являются объекта- объектами. Таким образом, классам тоже можно посылать сообщения. Каноническим примером является сообщение new создания экземпляра. Тогда каким образом необходимо интерпретиро- интерпретировать сообщение, посылаемое классу? Поскольку сообщение, посылаемое экземпляру, анализируется этим классом, то, сде- сделав так, чтобы сообщение, посылаемое классу, анализировалось его классом, т. е. классом класса, мы получим единый меха- механизм вызова сообщений, обеспечивающий ясность программ. Этот класс классов называется метаклассом (metaclass). Клас- Классам присваиваются имена, а метаклассам — нет. При обращении к метаклассу ему посылается сообщение class. Например, пусть будет класс целых чисел Integer и ме- метакласс Integer class. В данной книге мы их будет называть класс Integer и метакласс Integer. Для каждого класса существует один метакласс. Например, классом класса Integer является метакласс Integer. Класс In- Integer является единственным экземпляром метакласса Integer. До сих пор мы рассматривали два объявления, содержащиеся в описании класса: методы класса и методы экземпляра. Одна-
\ Введение в Смолток ИЗ ко некоторые из этих методов класса могут быть зарегистри- зарегистрированы в словаре методов метакласса, а методы экземпляра — в словаре методов класса. Имя сообщения, посланного классу,, можно отыскать в словаре сообщений метакласса с помощью тех же механизмов, которые применяются для общего метода поиска. Эти связи показаны на рис. 3.6. , ..■;.. H ! Класс (_; ВТ'„ - Class ■;•}<: q ..... ! ;.>if«■-•].:, j■?г. ! ; ,..<.,, Метакласс ' • : ■'■"--i ■ ; Class J ! / ■- '■'■'; '-.ч1" j Класс ^ Metaclass It' ■ ■ Метакласс Metaclass • Класс , Integer i | Метакласс Integer i j Класс Number i ♦ Метакласс Number i i Класс "\l "Object ; i ' li | i .- Метакласс! ~~* Object ■,;. i . . j ' ' Рис. З.7. Структура классов и метаклассов. Связь вида: А-*В указывает, что В является суперклассом для A, a C-*D указывает,, что С является экземпляром D. Каждый класс является единственным экземпляром свое- го метакласса. Каждый метакласс является экземпляром класса Metaclass. До сих пор нам была известна иерархия классов, образо- образованная отношением: "суперкласс-подкласс" между классами. Между метаклассами тоже существует иерархия, образованная тем же отношением "суперкласс-подкласс". Иерархия классов- и иерархия метаклассов изоморфны (isomorphic) друг другу. Это отношение для части системы Смолток-80 показано на рис. 3.7. 3.1.10. Переменные В языке Смолток-80 существует пять типов перемйЙйЁ*** >'-»* - — временные переменные (temporary variable); ' '* ,; 1 — переменные экземпляра; .,,/, .'■ — переменные класса; .„ '^,. Vi — глобальные переменные (global variable); ' ,',,', ,.".' п — общие переменные (pool variable). ,<^; ;.V ,,,-пГ--'?.» Все они различаются временем своего8еущёСГЙОЙвЙШР 9 об* ластью действия. "'' • ■■г'-'• ■'■" •» >'■■'■ .. ь,•>>{»•:Иг;;, ■><, 8-1428
114 Глава 3 ■ ■ :■ / Временные переменные объявляются внутри/методов, созда- создаются в момент вызова метода и уничтожаются по возвращении из метода. Переменные экземпляра хранятся в памяти внутри каждого экземпляра. Ссылки на них допускаются только внутри данно- данного экземпляра, и они существуют до тех пор, пока существует экземпляр. К переменным класса, глобальным переменным и общим переменным имеется доступ более чем из одного объекта. Они зарегистрированы в общем словаре. Переменные классов реги- регистрируются в словаре по имени class, глобальные переменные зарегистрированы в словаре по имени Smalltalk, общие пере- переменные зарегистрированы в словаре, объявляемом специаль- специальным образом. Переменные класса доступны любому экземпляру этого класса для чтения и записи. Глобальные переменные доступны любому объекту для чтения и записи. Для чтения и записи в общие переменные в описании клас- класса имена словарей, содержащих эти переменные, должны быть объявлены следующим образом. CLASS NAME HUMAN SUPERCLASS ANIMAL INSTANCE VARIABLE NAMES SEX CLASS VARIABLE NAMES POPULATION SHARED POOLS BIOLOGICALFACTS При таком объявлении словарь переменных BiologicalFacts {Биологические факты) будет общим для класса Human (Че- (Человек) и все переменные из словаря BiologicalFacts будут доступны на чтение и запись из всех экземпляров класса Hu- Human. 3.1.11. Псевдопеременные Псевдопеременные аналогично переменным являются именами- указателями объектов, однако (в отличие от переменных) в них нельзя подставлять значения. Псевдопеременные могут быть указателями констант, спе- специальных объектов и формальных параметров. Псевдопеременные — указатели констант следующие: nil, true, false. Кроме того, nil является указателем объекта, ис- используемого при отсутствии подходящего значения. Этот объ- объект единственный, который не содержится ни в каком классе. Псевдопеременная true является экземпляром класса True и признаком "истина". Псевдопеременная false является эк- экземпляром класса False и представляет собой признак "ложь".
\ Введение в Смолток 11S Указателями специальных объектов являются псевдопере- псевдопеременные self и super. Они указывают получателей сообщений^ Например, рассмотрим посылку сообщения ху find, где ху указывает объект, являющийся получателем сообщения find. Если метод, вызываемый этим сообщением, определяется в виде find self search то псевдопеременная self указывает тот же объект, который указывает идентификатор ху, self и super различаются спосо- способом поиска метода. Формальные параметры аналогично временным переменным имеют значения только во время вызова методов. Поскольку ни в псевдопеременную self, ни в формальные параметры зна- значения подставить нельзя, получатель сообщения после оконча- окончания вызова метода по этому сообщению указывает тот же самый объект. При этом остается неизвестным, меняется ли era внутреннее состояние. 3.1.12. Синтаксис Синтаксис языка Смолток-80 приведен на рис. 3.8. На нем прямоугольниками обозначены выражения языка, кружками — терминальные элементы. Например, цифрой является любой элемент из диапазона 0 — 9. 3.2. Пример программы Здесь мы на примере реальной программы более подробна продолжим изложение языка Смолток-80. Главной областью применения языка Смолток-80 является моделирование. В качестве подготовки к моделированию аппа- аппаратного обеспечения ЭВМ рассмотрим пример моделирования части процессора. *~ --" 3.2.1. Пример кэш-памяти __ " т Кэш-память (cache memory) является промежуточной между процессором и основной памятью и предназначена для повы шения эффективности обращения процессора к памяти.
■- Ms.uH ' Цифра ПослеМаг.т- ность цифр -*\Цифра Числовое значение п Букба ПхлеШа- т.ельность цифр ПослеЫа- тельноапь П Гш$р „. п f \ТГ Л~^ КG)* темнеть' VeVi 1* темность ' Специаль- Специальный знак \ * (~ < > ( = I Символ ^пеи,иальный знак Рис. 3.8A). Сиитвкснс языка Смолток-80. •?- ; :• ' *
Слово Последовательности Символов Символьная константа Массив [Константа массива* t, , . , „„, . . ,. L • "~ ; , , Г" Числовое значение СлоВная константа Символьная константа Последовательность символов Константа Массива . ,. ,. [ •ее. 3.8B).
J Идентификатор^. <ыи селектор \ •{Идентификатор} I Бинарный селектору- Первичная форма \Описание унарн ильный знаку -АСпециальный зна. тлючевое слада > \ Идентификатору {Описание бинарного объекта\ « ^Леременна \ Константа Первичная ферма •унарная формах 'писание унарного объекта I- \ бинарная формат. унарная форма\ > [описание унарного объекта] < [Унарный селекторХ- \Винарная фириа[—^Описание Винарного объекта I—*\Винарный селектор U»] Описание унарного объек Форма с ключе- дыми следами -^Описаниебинарного о5ъектау^*\[1ервичная формаV*\ont шсачие бинарного объекта •ная форма Форма с ключе- ключевыми словами Ряс. 3.8C).
|Ct//w сообщения \- *№нарный селектор I \Ключевое слобоу o^l »[ffy Ч/еременнаяу Схема сообщения у- временная переменная :' м1' '. ;■■•"' ;• "■'"'- ,'r*o"' Рис.
120 Глава 3 Прежде всего для моделирования кэш-памяти определим класс CacheMemory. Функция кэш-памяти состоит в том, что при поступлении команды обращения к памяти от процессора происходит поиск требуемого адреса в кэш-памяти. Если он там есть, то происходит считывание соответствующих данных и передача их процессору. Если нет, то вначале из основной памяти считывается блок, а затем одно слово из него переда- передается процессору. При этом блок, считанный из основной памя- памяти, хранится в кэш-памяти. Для этого требуется освободить место. Оно высвобождается за счет других блоков, и в качест- качестве метода выбора этого места используется циклическая пере- перестановка. Перестановка происходит всегда на место, следующее за тем, которое переставлялось последним. Кроме того, в буфере кэш-памяти используется метод пере- перезаписи. Данные, помещаемые в буфер, накапливаются в нем. Содержимое блока, в который произошла запись, отличается от содержимого соответствующего блока в основной памяти; такой блок называется "затронутым". Поэтому при перестанов- перестановке затронутого блока вначале производится его перезапись в основную память. Если процессор выдает команду на запись в память, про- происходит поиск в буфере требуемого адреса. Если он там есть, то на соответствующее место происходит запись и команда за- завершается. Если нет, то освобождается место. Если блок, на- находящийся на этом месте, затронут, то происходит его переза- перезапись в основную память. После этого из оперативной памяти считывается блок, соответствующий адресу в команде записи, и в него вставляются данные, в команде записи. Класс CacheMemory с размером блока равным 8 слов, каж- каждое объемом по 256 блоков, запишется следующим образом: class name CacheMemory superclass Object .-...- instance variable names mainMemory blockSize cacheSize cacheA " ч cacheD •■ dirty Flag :.. ; occupied Flag - victim _;_ ■ _• j*~ -■■ — «lass methods , instance creation createWithMemory: main -- При создании кэш-памяти указывается, - - что оиа связана с основной памятью.
Введение, в, рмолток Instance methods self new unit: main г _, .v,£,jv ч|э* т,? fetch: address ., ., /,_, | block key loc | •.,' .*" key-*-(address quo: blockSize)*blockSize. loc-<-self search: cacheA for: key. 1 - - Поиск требуемого блока в кэш-памяти. 1ос= —1 ifTrue:[fself missFetch: address] ' ^ - - Если в кэш-памяти требуемого блока нет, то возвра- - - щается минус единица и выполняется обработка со- - - стояния неудачи. - - При поиске • ifFalse:[block-*-cacheD at: loc. - - В переменную block засылается значение, ука- - - зывающее координату loc в массив cacheD. fblock at: (address rem: blockSize) + l] - - Индексы массивов Смолтока начинаются с еди- - - ницы, поэтому выборка элемента по номеру, - - находящемуся в переменной block, выполняет- - - ся после прибавления к нему единицы. ..' store: address data: value | block key loc| key-<-(address quo: blockSize)*blockSize. ,-j; " , Ioc-<-self search: cacheA for: key. Joc= —1 ifTrue:[self missStore: address data: value] ifFalse:[block-*-cacheD at: loc. ' dirtyFlag at: loc put: true. -- В массив dirtyFlag, в место, указываемое lepeueraot - - loc, помещается true. ,, ,4l,». block at: (address rem: blockSize) + l put: value] - , Private init: main mainMemory-<-main. '" " ' Ло-. .■ blockSize-<-8. , .,:. , r, _ ,Ч)т О"" as cacheSize-«-256. , t,,. ,Д ' ^ • „.*; cacheA-<-Array new: cacheSize -'""■ ' cacheD-«-Array new: cacheSize t r c',- g- dirtyFlag-<-(Array new: cacheSize) atAHPut: false. ,г,4! ,.. - - Создается массив cacheSize и всем его элементам - - ся значение false. occupiedFlag-«-(Array new: cacheSize) atAHPut: false. • R: п|раи. И . ' О ■ 'Ж.
J22 Глава 3 ' missFetch: address '"■' ••'' |block key loc| key-<-(address quo: blockSize)*blockSize. loc^-self findVictim. Ы (dirtyFlag at: loc) ifTrue: [self swapOut: loc. dirtyFlag at: loc put: false]. ЫосЫ-mainMemory readBlock: key. cacheD at: loc put: block. cacheA at: loc put: key. '' ■ " occupiedFlag at: loc put: true. ; '"'" F:': fblock at: (address rem: blockSize) + l ' ' " mlssStore: address data: value : | block key loc| key-<-(address quo: blockSize) *blockSize. ■' '"'■ ■ loc-<-self findVictim. (dirtyFlag at: loc) ifTrue: [self swapOut: loc]. block-<-mainMemory readBlock: key. block at: (address rem: blockSize)+ 1 put: value. cacheD at: loc put: block. cacheA at: loc put: key. occupiedFlag at: loc put: true. - ■••'■ dirtyFlag at: loc put: true : -- ' ■ findVictim ;~ "■ -: victim-»-(victim+1 rem: cacheSize)+l. >•■*'•■ ■'-• tvictim .j;, : ■ ■ • swapOut: loc *■ • >''■-' mainMemory writeBlock: (cacheD at: loc) at: (cacheA at: loc) « i search: array for: key 1 to: cacheSize do: [:i| (occupiedFlag at: i)=false or: [(array at: i)=key ifTrue:[fi]]]. t-1 Связь между процессором, кэш-памятью и основной па- памятью показана на рнс. 3.9. При посылке сообщения из кэш- кэшпамяти в основную память необходимо знать, в какое место основной памяти посылается сообщение. Это записывается в переменную mainMemory экземпляра кэш-памяти. Вначале при описании кэш-памяти объявляется имя класса. Затем объявляется суперкласс объекта CacheMemory — класс Object. Далее объявляются переменные экземпляра: mainMe- mainMemory, blockSize, cacheSize, cacheA, cacheD, dirtyFlag, occupied- occupiedFlag, victim. Переменная mainMemory содержит указатель на
Введение в Смолток 123 экземпляр класса, идентифицирующего ту часть основной па- памяти, которая связана с данным кэш-буфером. В переменную blockSize записывается число 8, в переменную cacheSize — чис- число 256. Для реализации кэш-памяти используются четыре мас- массива, указатели которых находятся в переменных cacheA, cacheD, dirtyFlag, occupiedFlag. Переменная cacheA представ- представляет собой массив из 256 элементов, в который помещаются адреса; переменная cacheD — массив из 256 элементов, в ко- которые помещаются блоки, соответствующие адресам массива А. Каждый элемент cacheD сам состоит из 8 элементов. Иден- Идентификаторы dirtyFlag и occupiedFlag являются булевскими массивами по 256 элементов. Элемент массива occupiedFlag имеет значение: "истина" лишь в том случае, когда на соот- соответствующем месте в массиве cacheD имеется блок, а элемент массива dirtyFlag равен "истина" лишь в том случае, когда этот блок затронут. fptrh- st re; address address data: value readBlock: address writeBlock: block at address Основная память Рис. 3.9. Структура вычислительной системы, моделируемая классом Cache Memory. Из процессора в кэш-память посылаются сообщения: fetch : address, store address da- data : value; из кэш-памяти в основную память — сообщения: readBlock : address, writeblock at : address. Далее, под заголовком class method объявляются методы класса. За ним написано: instance creation. Это — заголовок, говорящий о том, что появляющиеся далее заголовки методов (в данном случае заголовок метода один) входят в группу (так называемую категорию сообщений) создания экземпляра. Категории сообщений представляют собой мнемонику, ис- используемую при создании баз данных для программ, и на вы- выполнение методов не оказывают никакого влияния. Подобные функции называют прагматикой, отвечающей синтаксису и се- семантике. Далее объявляется метод createWithMemory : main. Он соз- создает экземпляр класса CacheMemory и инициализирует пере- переменные. Для пересылки данных из кэш-памяти в основную память необходимо иметь указатель на адрес основной памяти. Он передается через параметр main. Программа — тело метода createWithMemory: main имеет вид <mov*;i. h u><v o,^ .. self new init:main. "grJ [vt-ni ьщу->а*
124 ■ Глава 3 -<• Вначале создается экземпляр методом Selfnew, а затем про- производится инициализация посылкой сообщения: init: main. Объявления методов экземпляра делятся на две категории,, озаглавленные public и private. В категорию public входят ме- методы: fetch : address, store : address и data : value. Кэш-память состоит из 256 блоков, каждый блок состоит из 8 слов и снаб- снабжен ключом, содержащим адрес первого слова блока в основ- основной памяти. Используя метод fetch: address, мы можем обратиться к слову, которое указывает параметр address. При этом вначале- в кэш-памяти происходит поиск нужного блока. Для этого из параметра address берется ключ и помещается во временную- переменную key. Затем выполняется процедура, идентифици- идентифицируемая заголовком: self: search : cache for : key, которая и оп- определяет: имеется ли в переменной cacheA адрес, записанный в переменной key. Для этого выбирают аппаратно-реализован- ные ассоциативные методы доступа, однако, поскольку у нас речь идет о моделировании, для простоты реализован линейны» поиск. Если поиск терпит неудачу, то он возвращает —1, произво- производится сравнение содержимого переменной 1ос с —1. Если есть совпадение, то обрабатывается отсутствие слова в кэш-памяти- При этом запускается метод, идентифицируемый заголовком: self missFetch : address. Если при поиске адрес найден, то 1ос содержит указатель на истинное расположение блока в кэш-памяти. Блок читается из массива cacheD, по содержимому блока вычисляется истин- истинное смещение и из блока считывается нужное смещение. Поскольку в языке Смолток-80 индексация массива начи- начинается с единицы, смещение вычисляется путем прибавления единицы к остатку от деления адреса на размер блока. С другой стороны, метод store: address data: value имеет сходство с методом fetch: address, однако в нем вначале вы- вычисляется ключ, который записывается в переменную key, а затем этот адрес ищется в массиве cacheA. Если его нет, та в переменную 1ос заносится —1 и выполняется процедура, идентифицируемая заголовком self miss Store: address data: value, '''"' ' " ;/». которая обрабатывает ситуацию отсутствия адреса. Если адрес в массиве есть, то из массива cacheD по адресу 1ос считывается блок, в него на место, указываемое смещением, записывается значение переменной value. При этом данный блок становится затронутым, и поэтому взводится соответствующий флажок массива dirtyFlag.
Введение в Смолток 12S В категории private имеются методы: init: main, missFetch r. address, missStore: address data: value, findVictim, swapOut:- loc, search : array for : key. Метод init: main инициализирует переменную экземпляра.. Метод missFetch: address в начале вычисляет ключ и под- подставляет его в переменную key. При считывании с нового места! в self посылается сообщение find Victim. Если место, с которо- которого надо читать, помечено взведенным флажком dirty flag, этот- блок опознается как затронутый и посылается сообщение- swapOut: loc, по которому этот блок записывается в основную* память, и флажок dirty flag сбрасывается. Затем выполняется, метод mainMemory readBlock : key и происходит чтение блока,, начиная с адреса, указанного в переменной key. Он записыва- записывается в массив cacheD, а в массив cacheA на соответствующее место записывается значение key и взводится флажок occupied flag. Из прочитанного блока возвращается слово, указываемое' смещением внутри блока. Из данного примера видно, что в за- заголовке временные переменные заключаются между двумя, вертикальными чертами. Присвоение обозначается знаком ■*-. Условным операторам соответствуют выражения ifTrue и ifFab se. Они посылаются объектам класса Boolean и в качестве па- параметров имеют выражения типа блок. Выражения типа блок заключаются в квадратные скобки,. и для их содержимого значение не вычисляется. В методе, ре- реализующем сообщение ifTrue при истинном значении получа- получателя сообщения, параметру посылается сообщение value,. и тогда вычисляется его значение. Оператор возврата значения' начинается со стрелки, направ- направленной вверх. Если нужно вернуть значение выражения е, то это записывается в виде f е. Метод search : array for : key с помощью линейного поиска* проверяет, имеется ли в массиве элемент, содержащий значе- значение, равное значению переменной key. Для этого используется* оператор цикла. 1TO:CACHESIZEDO:[:I1(OCCUPIEDFLAGAT:I)=FALSEOR: v »i~ [(ARRAY AT:I)KEY IFTRUE:[fI]]] Й■<>«-. В этом операторе выполняется вызов блока, стоящего после- do (по очереди для всех целочисленных значений от 1 до cacheSize). Эти целые числа являются значениями параметра при вы- вычислении значения блока и подставляются в переменную i. Созданный таким образом класс cacheMemory выполняете» в составе выражений следующего вида: ,'■ (((CACHEMEMORY CREATEWITHMEMORY:MEMORY NEW) :—r'~ STORE: 1 DATA: 1)
•26 ! Глав*'3 а ■-'• '■•'-;.. STORE:2DATA:2 ; 1<:-у,т '- ■:-.; K^O'io:*:-; К ;:-:.: ■ ' FETCH:1 •-- г- пЪ ■■:, .^w^-xi; ,л;--::-. г По адресу 1 записывается число I, по адресу 2 —число 2 л читается число по адресу 1.- - -,;f,r .i;;«, ] -: : ,. -,'■/ 3.3. Структура системы , ; f , •Смолток-80 является языком программирования, и одновремен- одновременно с этим он является большой программной системой. Ее на- называют системой виртуальных изображений". Авторскими пра- правами на эту систему владеет фирма «Ксерокс», однако в су- существующем виде ее нельзя поставить на любую из имеющихся в продаже машин. Машина, на которой можно ставить систему виртуальных изображений, должна в точности соответствовать описанию языка Смолток-80. Такую машину называют вирту- виртуальной Смолток-80-машиной. Ее описание дано в книге А. Гольдберга и Д. Робсона. Интерфейсом между системой виртуальных изображений и виртуальной машиной является система команд виртуальной машины. Каждая команда этой системы команд имеет длину один байт. Поэтому эту систему •команд называют байт-кодом Смолток-80. Специальных машин, соответствующих описанию виртуальной машины, на которой можно было бы реализовать Смолток-80, не существует. Обыч- Обычно на ЭВМ с микропрограммным управлением реализуют средствами микропрограммирования эмулятор байт-кода, вы- выполняющий байт-программу Смолток-80, в других же случаях на обычных ЭВМ на машинном языке реализуют интерпрета- интерпретатор байт-кода (рис. 3.10). Виртуальная машина состоит из трех основных блоков: интерпретатора, блока управления объектами и основного опе- операционного блока. Более подробно виртуальная машина рассматривается в гл. 4. Здесь же мы поговорим об основных элементах системы -виртуальных изображений. Система виртуальных изображений -состоит из следующих основных функциональных групп: ■.; — управление объектами; ;ih<> •:■•;• ■ л'рпо ил; с — величина объектов; t ., . а к;.1; н^кр-ю av> иЬ — количество; ,(зх1йэгЬв;;. -«; — структуры массивов данных; ^>■ ан mv. .u нтб , — потоки файлов; 0 й;.^ i "■ шш£Г.р'к:-' 5?v — булевские величины; -щт -:сйы)Э — процессы; ' ~ •: я Разработкой системы виртуальных изображений руководит автор.
Введение в Смолток т Виртуальные изображения Виртуальная машина Интерпретатор ЭВМ общего на- назначения Интерфейс с байт -кодом h..iU.ii.'а ЯЗОаГ/!. Виртуальные изображения Виртуальная машина Эмулятор Микропрогра м ми- миру емая ЭВМ Рис. 3.10. Способы построения системы Смолток-80. Слева — построение системы виртуальных изображений на машине общего назначение (например, МС-68000) путем программирования на машинном языке интерфейса с байт- кодом. Справа — реализация системы виртуальных изображений путем программирования- эмулятора байт-кода с помощью микропрограмм. — классы; —' побитовое отображение в память; — графика. ",'ЛчА .6 1:1 Архитектура системы виртуальных изображений^ Смолток- 80 в виде иерархии классов показана на рис. 3.11. /5;(>( ? 3.3.1. Булевские величины Класс Boolean реализует значения истинности. Он имеет два- подкласса: класс true и класс False. Значение true является' единственным экземпляром класса True, а значение false — единственным экземпляром класса False (рис. 3.12). Такие конструкции были введены для того, чтобы обеспечить возмож- возможность описания условных операторов и условных циклов. В Смолток-80 оператору if-then-else соответствует метод вида ifTrue : trueAlternativeBlock ifFalse : falseAlternativeBlock, и ему посылается истинное значение. Если бы структура истинного значения не была такой, как показано на рис. 3.12, то значения true и false были бы экземплярами класса Boolean. Тогда определения ifTrue и ifFalse находились бы в классе Boolean, и в программах, являющихся их телами, при- приходилось бы определять, является ли каждый очередной полу- получатель сообщения true или false: если получателем является true, то приходилось бы вычислять значения для trueAlternati- trueAlternativeBlock, а если получателем являлся бы false, то пришлось бы; вычислять значения для falseAlternativeBlock. Если же струк-
428 - Глава 3 ,„Л i. OBJECT " ' • ■ 2. MAGNITUDE ; 3. CHARACTER- , : - -.-.. \ .3, date .. ._... „.,...,.. _;,.. ;_■ . \ -3. TIME : ' -- ! 3. NUMBER . ' - .' .... .. , •'., . 4. FLOAT . •••',•'- 4. FRACTION ...... 4. ITEGER \) jj 5. LARGENEGATIVEINTEGER \ ^ —■• ~- ' 5. LARGEPOSITIVEINTEQER \i . . -.,....{■' 5. SMALLINTEGER j: '-• ' -;: 3. LOOKUPKEY ; ; ' ; : 4. association • 1~:~:г~г'~_ ;-;: .;: 2. LINK , . . ' ' 3. PROCESS ' ' ,-. ' '■" '• 2. COLLECTION ■ •• ' t . 3. SEQUENCEABLECOLLECTTOfl 4. LINKEDLIST 5. SEMARHORE 4. ARRAYEDCOLLECTION- 5. ARRAY . . • . , 5. BITMAP ■'-"'■ 6. DISPLAYBITMAP^; G ••': '■'. ■ .', ■■< . 5. RUNARRAY >:"-,-нп. и ,•,:,, ; .,,,, .,^?.i;. -..,. ,.я 5. STRING 6. SYMBOL w ,^-;<r-:S -vi=-;r^"' ' 5. NEXT " " " ' "' ~" ""' '"" *■-''- 5. BYTEARRAY : "SK; ~--v-■■<-,■},- v..'.- ,-u , ""'"■ 4. INTERVAL ' 'r.^r * - '.'r.t 'i,:-. / .^in- - 4. ORDEREDCOLLECTION ''■• : ' . ' ■■■-•'■"« • ■ '' •5;' ' 5. SORTEDCOLLECTION • •• ' ' '' : , 3. BAG r''. " '^; ' 3. MAPPEDCOLLECTION h '• ' 3. SET " ' •. 4. DICTIONARY "P I1 ' ~ч ^-"/ '- l 5. IDENTITYDICTIONARY 2. STREAM ■" ' ' ' ' ^ 3. POSITIONABLESTREAM " ' 4. READSTREAM ' ' •**'* 4. WRITESTREAM ^' - • ' "• # 5. READWRITESTREAM • ■ < ,. ' >" ?i r - r 6. EXTERNALSTREJfiW. • ' ^' <: ' 7. FILESTREAM ' ' r' ' ' ^ " 3. RANDOM '- - ^ ( ' «.FILE '-h':' %H ' 1 •
Введение в Смолток 121 2. FILEDIRECTORY 2. FILEPAGE 2. UNDEFINEDOBJECT 2. BOOLEAN 3. FALSE 3. TRUE 2. PROCESSORSCHEDUbER 2. DELAY | 2. SHAREDQUEUE } 2. BEHAVIOR -1 3. CLASSDESCRIPTION ' 4. CLASS ^ 4. METACLASS 5 ' ( *■":':'??■ *' 2. POINT •" ч — ■ 2. RECTANGLE мы лгдЬ .<x. • 2. BITBLT 3. CHARACTERSCANNER < r^'s- Э?'.*Ч r ";«?<•* -:? С 3. PEN ...0|рч..,.,. ■ 2. DISPLAYOBJECT , .. ,..,_..-, v? >.,'»^'" 3. DISPLAYMEDIUM ' ',.-/.. ;4',-c.'-.l.^j.f/,.-..- 4. FORM 5. CURSOR •Ь!П5Г.'А-:=!в1 М л S.Uo'/'.","-'^ 5. DISPLAYSCREEN .г;:-;гЛ ..,..«..,,^.. 3. INFINITEFORM ■ q4:;: _ 5йП*'-:Г.'ПИЗ jqonOT ККОТои':^ВЧ 3. OPAQUEFORM ' '■ ът■ Й9У1О!9КН ; 5. CIRCLE ГЛ1.; ••,■ ; с Г ,?-=V .С— Л JtSHHqn dv3.-t НГ/,3 4. CURVE Г . --»-r'.'.T* : *';l75; Г"9а"ЭД15(.'О0 Н St^iB?1 TS.Lv'd 4. LINE ' . »ЛеЯ Р '. ГГ,К FiJ ЭНЬЭЛЭЕЭОПО ОКЕЯНИв ТвГ /5 т 4. LINEARFIT v-^r-л <i т ^ ■о!Я^>!й«1^!А^!г' гз! гУг---и" 4. SPLINE ■"" '" ' ' '"" .«;;!г/■ЬППО^.О'.- '\':2Г',.^г. Рис. 3.11. Иерархия классов системы Смолток-80. Цифры слева от каждого класса показывают уровень данного класса относительно клас- класса Object. тура имеет вид, показанный на рис. 3.12, то сообщения ifTrue и if False определяются в классах True "и False соответственно, и тогда в теле метода, определенного в классе True, можно сразу вычислять значения для блока trueAlternativeBlock, не анализируя, имеет ли посланное сообщение значение true или false. На самом деле определение в классе True имеет вид .„ ifTrue:trueAlternativeBlock ....... .. .. .~,,-q",-K ifFalse:falseAlternaiiveBlock ..'•^«»й?Йй"ййОК9'-' Ш ftrueAlternativeBlock value, ... ,.,';.,•- s.^^Vt9 ''T-v hoV к 9—1428
130 Глава 3 Класс Boolean Подклассы Зпз*мтияр Рис. 3.12. Булевская функция. I а определение в классе False имеет вид ' -« = • ■■ 'т / IfTrueitrueAlternativeBlock ; ' ifFalserfalseAlternativeBlock /': ffalseAlternativeBlock value. Здесь trueAlternativeBlock и falseAlternativeBlock должны быть операторами блока. Рассмотрим теперь выполнение оператора посылки сообще- сообщения, имеющей вид х>у if True :[max-<-x]if False :[max-<-y]. Если здесь принять х=3, у=4, то результат вычисления х>у будет false и сообщением ifTrue :[max-<-x]ifFalse:[max-*-y] будет вызвано определение из класса False. При этом будет выполнен falseAlternahiveBlock, т. е. блоку [тах-«-у] будет послано сообщение value. 3.3.2. Оператор блока Условный оператор и оператор цикла можно определить как методы. Это позволяет сконструировать так называемый опе- оператор блока. Если оператор блока находится внутри програм- программы, то создается экземпляр класса BlockContext, и в нем на- накапливается вся необходимая информация для работы блока, однако оценка содержимого оператора блока при этом не выполняется. Чтобы она выполнялась, экземпляру класса BlockContext необходимо послать сообщение value. Оператором управления, реализуемым с помощью операто- оператора блока, является оператор while. Для двух целых чисел х и у он может быть реализован следующим образом:
Введение в Сыалток 1 " ill пн-0. г] и с,( ■■'г ,/:з;.чг.:■■-;■<'/■'. /р. [x>O]whileTrue:[m-«-m+y, х-<-х-1]. ' .oi-si-c рцнэг.г.е*- :.v- Оператору блока [х>0] посылается сообщение whileTrue: [m-<-m+y, х-*-х—1]. Вначале вычисляется значение получате- получателя. Если оно равно false, то выполнение прекращается. Если оно равно true, то вначале вычисляется значение параметра whileTrue и затем вычисляется значение свойства. В языке Смолток-80 это можно определить следующим образом:-: ^м WHILETRUE: BLOCK '■'"- ■''■"-■ SELF VALUE IFTRUE: ^ » f-i^- -HieiHV,n [BLOCKVALUE. lC^n ;/.-и^?Пдгзаг V SELF WHILETRUE:BLOCK] "/':""i":;''n№'! С помощью оператора блока можно организовать и цикл. Вычисления для определения суммы четных чисел в диапазоне 2— 100 можно организовать следующим образом: sum-«-0 2 to: 100by:2do:[:each|sum-*-sum+each]. Такой оператор блока называется оператором блока с парамет- параметрами. Слева от вертикальной черты в квадратных скобках объявлен формальный параметр. Перед его наименованием стоит двоеточие. Методы to : by : do определяются в классе Smalllnteger. Значения управляющих переменных вычисляются последовательно по мере передачи их в качестве параметров оператору блока. Поскольку при этом сообщение, необходимое для вычисления, должно передать фактические параметры, ис- используется сообщение value. Определение такого цикла имеет вид .. „ ^ ..,. ,_.., TO:LIMITBY:STEPDO:BLOCK ' '"'т'; а БТ0>3в1 ™ЧЧ' п SELF<=LIMITIFTRUE: шг..!»/0£пм:-С1: ,iv.r..--ii-y,v.C><-c-; [BLOCK VALUE: SELF. • Xli v>i (SELF+STEP)TO:LIMITBY:STEPDO:BLOCK] Ч^.-п Если внутри оператора блока имеется оператор возврата, то выполнение сообщения, определяемого этим оператором блока, заканчивается. С помощью оператора блока можно реа- лизовывать также сопрограммы, исключительные состояния, процессы и т. д. 3.3.3. Параллельная работа Нг Основной областью применения объектно-ориентированных языков программирования является моделирование. Предметом этой области является представление знаний в ЭВМ о явлени- 9*
132 ■ = Глава 3 9 ях окружающего мира и реализация в ней их динамики. Для представления знаний об объектах мира используются знания об объектах языка, а взаимодействие между объектами мира представляется посылкой сообщений. Однако объекты окружа- окружающего мира независимы и движутся параллельно. Поэтому для адекватного моделирования необходимо реализовать парал- параллельную работу системы. В языке Смолток-80 такая работа обеспечивается использованием трех механизмов: параллелиз- параллелизма (parallelism), планирования (scheduling), синхронизации (synchronisation). Параллелизм обеспечивает синхронное вы- выполнение двух и более программ, планирование — управление распределением процессорного времени между этими незави- независимо выполняющимися программами, а синхронизация — пра- правильный обмен информацией между отдельными выполняющи- выполняющимися программами. В языке Смолток-80 имеются три класса: Process, ProcessScheduler, Semaphore, которые выполняют ра- работу по организации параллелизма, планирования и синхрони- синхронизации соответственно. Параллелизм. Класс Process реализует механизм распарал- распараллеливания. В общем случае при создании экземпляра класса Process оператору блока посылается сообщение fork. Напри- Например, если программа computePi, вычисляющая значение числа я, оформляется как метод класса для класса Float и выполня- выполняется [Float computePilfork, то создается процесс вычисления значения числа я, начинаю- начинающий свою работу независимо от других процессов. Поскольку программа, породившая этот процесс, продолжает по-прежнему работать, одновременно с вычислением я может продолжаться и другая работа в этой порождающей программе. Основными сообщениями, посылаемыми другим процессам, являются сле- следующие: newProcess — создать новый процесс, но не выполнять его; resume — выполнять остановленный процесс; _ ... ■' suspend —остановить процесс; &J ! '" terminate —закончить процесс. . ' аа' "'] -.я :-В*: ,!'ч ч х д:. Например, если выполнить выражение: .щ, . PiProcess-*-[Float computePi]newProcess, то сформируется новый процесс, однако он будет находиться в состоянии ожидания и выполняться не будет. Выполнение нач- начнется только после того, как будет выполнено сообщение: .. ■■ • , PiProcess resume. „ „.. ,, . -, . . ■ ...
Введение в Смолток 133 Диспетчеризация. Система Смолток-80 построена так, что она может работать только на однопроцессорной вычислитель- вычислительной машине. Поэтому при наличии нескольких процессов (если не распределять процессорное время между ними) может воз- возникнуть такая ситуация, что нельзя будет прочитать с устрой- устройства вывода никакой информации до тех пор, пока не закон- закончится выполнение какого-либо процесса. Чтобы избежать этих трудностей, решают задачу организации вычислительного про- процесса, или, как еще говорят, диспетчеризации или планирова- планирования. Для решения этой задачи создается класс: ProcessSchedu- ler. Этот класс имеет единственный экземпляр, указателем ко- которого является глобальная переменная Processor. Алгоритм диспетчеризации реализуется через простую систему приорите- приоритетов (priority system). Каждому процессу назначается приори- приоритет. Всегда выполняется процесс, имеющий самый высокий приоритет. Если процесс, выполняющийся в данный момент, останавливается или завершается, то из процессов, находящих- находящихся в состоянии ожидания, выбирается и запускается тот, кото- который обладает наивысшим приоритетом. Чтобы остановить вьь полняющийся в данный момент процесс, посылается сообщение suspend, либо внутри самого выполняемого процесса вызывает- вызывается процедура с наименованием yield. Процедура yield представ- представляет собой метод, с помощью которого выполняется следующее. Если имеется остановленный процесс с приоритетом, равным приоритету процесса, который выполняется в настоящий мо- момент, то он запускается. Если же такого процесса нет, то про- продолжается выполнение текущего процесса. Приоритет вычисля- вычисляется системой, и если необходимо программу вычисления числа я из предыдущего примера пустить как фоновую задачу, то это запишется в следующем виде: , [Float computePi]forkAt: Processor userBackgroundPriority Синхронизация. Синхронизация между процессами осуще- осуществляется с помощью семафоров Дейкстры (разд. 1.2.5). Для реализации механизма семафоров используют переменные се- семафоров и функции Р и V. Обозначим переменную-семафор через sem. Тогда если значение переменной sem окажется рав- равным нулю при выполнении оператора P(sem) в работающем в данный момент процессе, то этот процесс останавливается, переводится в состояние ожидания и становится в очередь, свя- связанную с этим семафором. Если при этом имеется какой-либо Другой процесс, готовый к выполнению, то он выполняется. Если значение sem больше нуля, то из него просто вычитается единица. Если выполняется оператор: P(sem) •'.'•' 3Jd/i5K7 :.< ■ r/l
134 Глава 3 Начало-*. Конец то к значению переменной sem прибавляется единица, и если в очереди к семафору sem имеются процессы, то один из них берется из этой очереди, делается активным, а от значения пе- переменной sem отнимается единица. Р и V называют взаимоис- взаимоисключающими операциями. Р и V для одного семафора должны быть доступны внешним прерываниям. Аналогичный механизм реализован в объектах языка Смол- ток-80. Экземпляры класса Semaphore являются переменными семафора. Сообщение signal соответствует операции V, сооб- сообщение wait — операции Р. Создаваемому семафору присваива- присваивается значение 0. Попробуем создать кольцевой буфер с использованием се- семафоров .Этот механизм пока- показан на рис. 3.13. Этому буферу посылаются сообщения fetch и store : data. Мы хотим, что- чтобы при пустом буфере оста- останавливались все процессы, по- посылающие ему сообщения tetch до тех пор, пока в буфер не будет занесено значение, а при полном буфере — останав- останавливались все процессы, посы- посылающие сообщение store : data. Во всех остальных случаях процессы чтения и записи должны действовать независи- независимо. Для этого создаются два семафора: empty и full. Сема- Семафору empty присваивается начальное значение 0, семафору full—12. Таким образом, при сообщении fetch посылаются со- сообщения empty wait и full signal, а при сообщении store: data посылаются сообщения full wait и empty signal. В результате содержимое семафора empty оказывается равным количеству данных, содержащихся в буфере, а содержимое семафора full — количеству свободных мест в буфере. При пустом буфере процесс, пытающийся осуществить доступ к нему, останавлива- останавливается сообщением empty wait, при полном — сообщением full wait. Кроме того, нельзя допускать одновременного доступа к переменным экземпляра head н tail. Доступ должен быть взаи- взаимоисключающим. Для этого используют переменные fetchPro- tect и storeProtect. Определение класса RingBuffer имеет следующий вид: CLASS NAME RINGBUFFER SUPERCLASS OBJECT INSTANCE VARIABLE NAMES EMPTY FULL HEAD TAIL FETCHPROTECT STOREPROTECT Рис. 3.13. Кольцевой буфер на 12 ячеек. Данные записываются в место, помеченное указателем head (начало), а выбираются с места, помеченного указателем tail (ко- (конец). Заштрихованная область буфера по- показывает место, где находятся данные.
Введение в Смолток 135 CLASS METHODS INSTANCE CREATION CREATE:SIZE Pi-VTO !•■ ;•• .. ••")' ,,:j ■• v •• . :; fSELF NEW INPT: SIZE-' '"^' :i«:*'"'"ivr — INSTANCE METHODS : лтоП.-гр..;: ; j '.-•• •••:> 4 'PUBLIC ^ч-:;а-л.': ..,j,: ■ V • ?.- . • л ч - l FETCH in•:■(■»г.- ' Гь;о--.,;«;; . - ■/-; : - ».-r. |DATA| ■" " -' - ":">> '■■'■ ^""i "■•-i EMPTY WAIT. !'■■••- ■.'■-'■. ■ -i ;,^* FETCHPROTECT WAIT. DATA-«-TAIL VAL. TAIL-«-TAIL NEXT. FETCHPROTECT SIGNAL. FULL SIGNAL. fDATA * — ■ ., ,-■ STORE:DATA FULL WAIT. STOREPROTECT WAIT. HEAD PUT:DATA. -; r -- HEAD-<-HEAD NEXT. • ' STOREPROTECT SIGNAL. /;: EMPTY SIGNAL. Z-£& PRIVATE 1NIT:SIZE .. _:i HEAD-«-TAIL-«-BUFFER NEW. w " " 1TO:SIZE-1DO: < [TAIL NEXT:BUFFER NEW. TAIL-t-TAIL NEXT]. ..-,1","Д. TAIL NEXT: HEAD ,' 'f ;1'.;, EMPTY+-SEMARHORE NEW. ^1 ",/ ,;.", FULL+-SEMARHORE NEW. U "" , . . 1 TO:SIZE DO:[FULL SIGNAL]. " " ' FETCHPROTECT-<-SEMARHORE NEW SIGNAL. STOREPROTECT-<-SEMAPHORE NEW SIGNAL. CLASS NAME BUFFER SUPERCLASS OBJECT ^ "'"и"',™^^»- (■ -< • . INSTANCE VARIABLE NAMES® VAL NEXT "__„'-. Zt ч „ . ' !' ' ' INSTANCE METHODS ut n ' , ;TH PUBLIC owu'l *аг»ю£чт£г^ ж- +NFXT ' '■' VAL. /ия
136 .л.-; Хлава 3 3.3.4. Графика Главное, чем язык Смолток-80 отличается от обычных языков и систем программирования — его преимущество в графике. Вначале Смолток-80 был разработан под машину ALTO, снаб- снабженную дисплеем с побитовым отображением памяти на экран. При этом содержимое некоторой области памяти бит в бит отражается на экране в виде черно-белого изображения (рис. 3.14). Благодаря этому с помощью одних лишь программ- У).\\\У\"°У).\ л У).\>.\'.\У\ЧЛЧЛ 1 Дисплей' \ \°\"у\0\"У1\ \ \ \Ш \ H1V-" =ЛГ< Оперативная память Рис. 3.14. Вывод на экран дисплея с побитовым отображением черио-белого изображения, формируемого с помощью оперативной памяти. ных средств удается легко выводить на экран произвольные символы и изображения. Все эти программные средства имеют- имеются в Смолток-80. Подтвердилось, что наиболее приемлемым аппаратом для разработки программного обеспечения такого типа являются объектно-ориентированные языки. Главной операцией дисплея с побитовым отображением па- памяти на экран является операция бит-блит (BitBlt). Она реа- реализуется аппаратно( микропрограммно), и это — единственная аппаратно реализованная операция. Все остальные операции (графики) написаны на Смолток-80. Операция бит-блит копирует произвольный прямоугольник в произвольном месте оперативной памяти. Копируемый прямо- прямоугольник называют источником, а место, в которое заносится копия, — мишенью. Кроме копирования имеются следующие операции. 1) Ограничение (clipping). Можно ограничить область ми- мишени, если объявить некоторый прямоугольник областью огра- ограничения. Тогда часть изображения, выходящая за пределы этой
Введение в Смолток 137 области/ на экран выводиться не будет (рис. 3.15). Эта возмож- возможность удобна при создании систем с фрагментацией изображе-' ния, когда на одном экране создается несколько логических дисплеев. 2) Полутон (halftone). Эта возможность используется в слу- случае, когда необходимо заполнить сплошным тоном некоторую довольно обширную область экрана. В качестве источника полутона берется квадрат размером 16x16. При необходимости заполнения большей области экрана этот квадрат можно вос- воспроизвести несколько раз. Его называют маской. Тонирование Ограничивающий прямоугольник Мишень -т xz г US*'.cf V-'' : г ■? Источник Рис. 3.15. Результат ограничения при выполнеиии операции "бит-блит". 4, т экрана можно осуществлять не только с помощью масок, но и. путем комбинирований значений источника и значений маски. Чтобы управлять этим процессом, используют nil в качестве значения для источника и маски. В соответствии с четырьмя типами комбинаций получаются следующие значения: 0. Источник = ш1, маска = ш1 Полностью затемненная ''•*• поверхность [',,•)••■ ^^ ■ 1. Источник=пП ' р „г ,,'.'Vr,V Выдается маска .\t jf ^Й1( 2. Маска = пП '.'.„' ' .. Выдается источник. 3. Маска и источник не nil-. -qn -Г! Выдается конъюнкция» , источника и маски. 3) Правила комбинирования источника и мишени. Между соответствующими битами замаскированного источника и ми- мишени также могут выполняться логические операции. Обозна- Обозначим через S какой-либо бит источника: через D — соответству- соответствующий ему бит мишени, а через R — результат операции. Коли- Количество способов, которыми из S и D можно получить R, равно 16, т. е. числу всех логических функций двух переменных B2*= 16). н»>глг'.т-".у.:*., !.- ■ •.'■ •-:->v>-,а vi< >o»o.' ■" i^-tus"-1.' -Ь
138 Глава 3 ф функция R = S XOR D может быть за- задана в Итде следующей таблицы: > s D R 0 0 0 0 1 1 1 0 1 1 1 0 Если на значение R посмотреть как на двоичное число, по- получающееся в результате подачи на вход четырех комбинаций нуля и единицы, то получим число 6. Поэтому разделительной дизъюнкции присвоен номер 6. 3.4. Технологическая среда разработки программ Благодаря тому что технологическая среда программирования позволяет легко и быстро создавать прототипы систем, Смол- ток-80 является удобным средством описания систем моделиро- моделирования, разработки систем искусственного интеллекта и т. д. Первая особенность системы Смолток-80 в том, что всевоз- всевозможные системные функции являются объектами, а операции, с помощью которых они могут выполняться, записываются как сообщения языка. Поэтому их легко вставить в любую часть системы. Таким образом, в рамках одной системы программно- программного обеспечения автоматизированного рабочего места, пользуясь единственным языком, можно описывать действия, начиная с нижнего уровня (управления процессами) до верхнего (редак- (редактирования). Помимо этого, в системе имеется еще язык Лисп, и все это вместе служит достаточным доказательством вырази- выразительной силы и доступности пользователю языка Смолток-80. 3.4.1. Модульная структура программирования Одной из причин высокой производительности программирова- программирования в системе Смолток-80 является развитая модульная струк- структура программ, поскольку одну программу можно собрать из многих других программ, которые при этом не надо писать за- заново. Чтобы обеспечить высокий уровень модульности програм- программирования, необходима простая и ясная процедура распределе- распределения ресурсов между вызывающими и вызываемыми модулями. Для достижения высокого уровня модульности необходимо сле- следующее. 1. Уяснить, какая программа предоставляет область памяти:-1 вызывающая или вызываемая. 2. Обеспечить возможность анализа экземпляров по типам. 3. Обеспечить хорошие возможности сопоставления классов.
Введение в Смолток 139 4. Обеспечить возможность поиска ошибок с преодолением межмодульных границ. В какой же мере Смолток-80 удовлетворяет этим условиям? Рассмотрим проблему выделения области памяти. Допустим, что на языке Смолток-80 реализована процедура сборки мусо- мусора. При этом производится объединение всей необходимой памяти и не возникает необходимости в определении того, ка- какой модуль предоставляет память для промежуточных и окон- окончательных результатов: вызывающий или вызываемый. Далее рассмотрим проблему анализа интерфейса по типам. Цель этого анализа состоит в том, чтобы при выполнении в других модулях операций, зависящих от данного модуля, вос- воспрепятствовать ошибкам, возникающим из-за неправильной передачи данных. В общем случае при наличии типов данных возможен анализ данных, передаваемых как параметры, что повышает надежность работы системы. В языке Смолток-80 каждый объект принадлежит какому-либо классу. Это позво- позволяет осуществлять контроль по типам в интерфейсе, однако этот контроль выполняется при выполнении программ, поэтому сразу обнаружить все ошибки при замене формальных пара- параметров аргументами не представляется возможным. При хоро- хорошей сопоставимости интерфейсов удается обеспечить высокую степень общности процедур, зарегистрированных в библиотеке, и их легкую адаптируемость к новым приложениям. В таких языках, как Смолток-80, в котором существуют абстрактные типы данных и пользователь может определять новые типы, существует проблема, состоящая в том, что процедуры, нахо- находящиеся в библиотеках, оказываются неприменимыми к новым типам данных, определенным пользователем, и в этом случае воспользоваться ими не удается. В системе Смолток-80 типы данных в чистом виде не используются: имеет место полимор- полиморфизм, в котором один метод используется с разными типами, и вышеназванная проблема стоит менее остро. Трудности при выявлении ошибок состоят в том, что при использовании библиотечных модулей, написанных другими лицами, в случае возникновения в них ошибок приходится их исправлять, т. е. приходится искать ошибки в чужой програм- программе. Бороться с этим можно следующим образом. Необходимо обеспечить возможность указания вызывающей программой того, с какой целью вызывается данный библиотечный модуль. В системе Смолток-80 при вызове внешних процедур операторы блока могут передаваться как параметры; при возникновении в блоке ошибки в случае правильного оформления этого блока как параметра имеется возможность возврата к тому месту, где происходила передача этого блока. Это — пример применения операторов блока для обработки исключительных состояний.
140 Глава 3 3.4.2. Системный генератор путей Развитие методов повторного использования программ позволя- позволяет при составлении несложных программ, предназначенных для экспериментов, ограничиться лишь сборкой (компиляцией) су- существующих модулей. Таким образом, технологическая среда создания конечных программ должна помогать сборке про- программ, а не их написанию. По своим характеристикам Смол- ток-80 приближается к такому эталону. Если считать, что значительная часть работы по програм- программированию состоит в сборке библиотечных модулей, то важным ее этапом становится поиск в базе данных уже написанных модулей. Например, рассмотрим составление программы для эксперимента. Прежде всего проводится анализ проблемы и определяется, какой должна быть система, обеспечивающая ее Корень Категории Классы КЗ; r? V ;' :*>i'." г,д . Категории .:!«!«•■;•: .,• ■■l\:: is "■ ЧГ-'-t , " Методы Рис. 3.16. Иерархическая структура Смолток-программы. r:l " : ' ' " решение. Производя декомпозицию системы, можно выработать требования к отдельным ее элементам и перейти к поиску биб- библиотечных модулей, реализующих эти требования. При этом метод поиска должен быть таким, чтобы пользователь мог осве- осведомляться о том, какой модуль может реализовать требуемый вид деятельности. Для такого рода работы создана специаль- специальная система поиска в базе данных, составляющая особенность языка Смолток-80 и называемая системным генератором путей. В целом система Смолток-80 представляет собой четырех- четырехуровневую иерархическую структуру (рис. 3.16). 1) Категории. Категории представляют собой группу клас- классов, выделенную для некоторой области применения. Понятие
Введение в Смолток 141 лс-. Ш: Syttffi'Eiowsei ■ !,';'• О Категории и". -' » . ■; w i» 'ior; <-•/." j -:,'.Ul]; I и '- • Классы Рабочее '. t* r- : ьй - TI , W .' i ' Категории методов поле .6. г1 ' i i;- ' ' .'.си' и: Методы и .г ■:•.;: -5 .i.t Рис. 3.17. Трафарет системного генератора путей. ;::,!'^ категории в системе Смолток-80 не несет семантики с точки зрения выполнения программ. Тогда для выполнения программ не имеет значения, к какой категории принадлежит класс. 2) Классы. Классы системы Смолток-80. 3) Категории методов. Группы методов классов или методов экземпляров, выделенные для удобства по признаку примене- применения или по некоторому свойству, также не оказывают влияния на выполнение программ. 4) Методы. Методы системы Смолток-80. На дисплее системный генератор путей представлен одним фрагментом экрана. При его запуске на экране появляется изображение, показанное на рис. 3.17. Изображениям-трафаре- Изображениям-трафаретам Смолток-80 присвоены имена. В данном случае трафарету присвоено имя System Browser (системный генератор путей). Трафарет системного генератора путей разделен на пять неза- независимых фрагментов, называемых подокнами. Слева вверху расположено подокно категорий. В нем высвечиваются имена всех категорий. При выборе пользователем необходимой ему категории яркость этого имени инвертируется и в подокне клас- классов высвечиваются классы, соответствующие этой категории. Продолжая эту операцию, пользователь доходит до правого крайнего подокна методов, и при выборе нужного ему имени метода тело этого метода высвечивается на рабочей области. Содержимое рабочей области на экране можно редактировать, я, таким образом, программу можно корректировать, а затем транслировать. н дтвг.к г-гкнвг. г^яклмэ-'Яс тЭ1.;гонтп ^и*,ог
142 : Глава 3 зЯ В программном генераторе путей для каждого подокна можно заказать свои собственные вопросы и действия. Например, при работе с подокном классов для выбранного класса можно спросить, что является его надклассом, как он определен, каки- какими комментариями он снабжен и т. д. Для методов можно получить исчерпывающую информацию о том, где он используется, т. е. о том, какой файл связи в на- настоящее время активен и используется. 3.5. Описание компилятора ""' Рассмотрим на конкретных примерах, каким образом следует описывать достаточно большую систему. Для этого опишем часть компилятора системы Смолток-80 на языке Смолток-80. Будем описывать фазу компиляции, относящуюся к генерации объектного кода. Блок синтаксического анализа преобразует исходную программу в древовидную структуру, и после этого происходит генерация программы из команд виртуальной ма- машины Смолток-80. 3.5.1. Промежуточная древовидная структура На предварительном этапе компиляции работает блок грамма- грамматического разбора. Он считает программу и строит древовид- древовидную структуру в соответствии с синтаксисом языка, на котором написана программа, т. е. строит определение этой древовидной структуры. Каждый узел дерева промежуточного языка пред- представляет собой объект — экземпляр класса, соответствующего своему элементу структуры разбираемого оператора. Например, дерево, полученное при разборе оператора гее search :x, имеет вид, показанный на рис. 3.18. В данном случае класс TreeSendLiteral или, например, класс TreeVar образует узлы промежуточного дерева синтакси- синтаксического разбора и отображает соответствующие элементы опе- оператора. Ниже приведены классы, образующие промежуточное дерево синтаксического разбора. При этом формат описания следующий: <Имя класса) в ,. <Образец сообщения) <Комментарий> <Образец сообщения) (Комментарий) В это описание входит множество образцов сообщений, на ко- которые отвечает экземпляр данного класса, называемые интер-
Введение в Смолток 143 Экземпляр класса. TreeSendLiteral О Экземпляр класса ■УТИ ит тчлшлчаео?.!-( ); H.,1 RAJTF .'ОТ ^/ \ A пои!". / \ Временно Экземпляр класса TreeVar Местопо- Местоположение *..'Г TI Рис. 3.18. Оператор посылки сообщения: дерево грамматического разбора оператора. фейсом (interface) или описанием протокола (protocol descrip- description). Прежде всего имеется класс Compiler, играющий роль суперкласса, объединяющего в себе методы, общие для классов, являющихся элементами промежуточного дерева грамматиче- грамматического разбора. • гй1 COMPILER „,Mf АЧГЧн,. CREATECODE:NUMBER ^rr ■'- ',.1.^'т. с" CREATENUMBERPUSH:NUMBER 'r*Cr« Tftfio" v^yrcnw--' JUMPPLACEHOLDER:CODELENGTH BV"v> ;с'ч '"< "■" "^ icnJ" • JUMPLOCATION tt Z'nS^S'.,; X-'v! Jkco Кроме этого, имеются следующие классы. TREESENDLITERAL - - ОПЕРАТОР ПОСЫЛКИ СООБЩЕНИЯ С ИС- RECEIVER ПОЛЬЗОВАНИЕМ СЕЛЕКТОРА - - ВОЗВРАЩАЕТ ПОЛУЧАТЕЛЯ - - ВОЗВРАЩАЕТ СЕЛЕКТОР А - - ВОЗВРАЩАЕТ МАССИВ АРГУМЕНТОВ : к. --ОПЕРАТОР ПОСЫЛКИ СООВДЗШЯ ,3-гиг, КЛАССУ SELECTOR ARGS TREESENDSUPER RECEIVER SELECTOR ARGS RECEIVER SELECTOR args з^^ - - ПОСЫЛКА СООБЩЕНИЯ С АРИФ*Ш|1ЧЕ- СКИМИ ОПЕРАТОРАМИ
144 Глава 3 TREESENDSPECIAL RECEIVER SELECTOR ARGS TREEBLOCK ARGS BODY ... • treeassign"- LEFT iz"'" RIGHT TREEVAR ..,,,,.-.-• Г KIND „-:':- v4 LOCATION TREELITERAL LOCATION TREEPVAR KIND LOCATION A ■ ПОСЫЛКА СООБЩЕНИЯ СО СПЕЦИАЛЬ- СПЕЦИАЛЬНЫМИ ОПЕРАТОРАМИ - ОПЕРАТОР БЛОКА ■ - ВОЗВРАЩАЕТ МАССИВ АРГУМЕНТОВ - ВОЗВРАЩАЕТ ТЕЛО ОПЕРАТОРА БЛОКА - ОПЕРАТОР ПРИСВАИВАНИЯ -ЛЕВАЯ ЧАСТЬ ОПЕРАТОРА ПРИСВАИВА- ПРИСВАИВАНИЯ - ПРАВАЯ ЧАСТЬ ОПЕРАТОРА ПРИСВАИВА- ПРИСВАИВАНИЯ - ПЕРЕМЕННЫЕ -ВОЗВРАЩАЕТ ТИП ПЕРЕМЕННОЙ (ВРЕ- (ВРЕМЕННАЯ, ПЕРЕМЕННАЯ ЭКЗЕМПЛЯРА, ПЕРЕМЕННАЯ БЛОКА) -ВОЗВРАЩАЕТ МЕСТОПОЛОЖЕНИЕ ПЕРЕ- ПЕРЕМЕННОЙ - ЛИТЕРАЛ -ВОЗВРАЩАЕТ МЕСТОПОЛОЖЕНИЕ ЛИТЕ- ЛИТЕРАЛА -ПСЕВДОПЕРЕМЕННЫЕ • - ВОЗВРАЩАЕТ ТИП ПСЕВДОПЕРЕМЕННОИ -ВОЗВРАЩАЕТ МЕСТОПОЛОЖЕНИЕ ПСЕВ- ПСЕВДОПЕРЕМЕННОЙ ;:■ ' 3.5.2. Компилятор Помимо описанного выше интерфейса, в каждом классе про- промежуточного дерева определен метод compile. С его помощью генерируется байт-программа языка Смолток-80. Система команд, из которых составляются байт-программы, называемая байт-кодом, приведена в разд. 4.2.2, и читатель отсылается к нему. Описание метода compile имеет следующий вид: TREESENDLITERAL • COMPILE .сиСЛ . Si'A.:UaH |ARGSLSEL| !!Ш:.'-- ЯС ' " . :..-. ( ARGSL-<-SELF ARGS LENGTH. " Sf-On - - '■■■'■ SEL-i-SELF SELECTOR. . '.dl.-.i -f?N? SELF RECEIVER COMPILE. - - КОМПИЛЯЦИЯ ПОЛУЧАТЕЛЯ! ' 1 TO:ARGSL DO:[I| (SELF ARGS AT:I)COMPILE] - - КОМПИЛЯЦИЯ АРГУМЕНТОВ -,£РГ: (ARGSL=0AND:SEL<16)IFTRUE: -^-- ^IT:i ,! [tSELFCREATECODE:SEL+208].^ (ARGSL=1 AND:SEL<16)IFTRUE: 208—223 Л-Л
Введение в Смолток 145 ltSELFCREATECODE:SEL+224]. .-".'- -ГЕНЕРАЦИЯ (ARGSL=2AND:SEL<16)IFTRUE: .:dGol>;. БАЙТ-КОМАНД 224—239 . ":; :. [|SELF CREATECODE: SEL+240]. ГГ V/;--ГЕНЕРАЦИЯ " ' .;. : '(ARGSL<8AND:SEL<32),IFTRUE:, ' :Л1^;' • БАЙТ-КОМАНД : ' !i ■".-• - •■■:';;'аЫ- 240-255 ■ •-; [SELF CREATECODE: 131. ' "■ .--ГЕНЕРАЦИЯ "' "" БАЙТ-КОМАНДЫ -"■'■- 131 л'г fSELF CREATECODE:ARGSL»32+SEL]. - - ГЕНЕРАЦИЯ та УКАЗАННЫХ ,!:' ^-..и.^.- dli.:J ДВУХБАЙТОВ Т; ' SELF CREATECODE: 132. -^ -1 ~а >;: SQOD... ГЕНЕРАЦИЯ г|—^ - :..-■■- байт-команды 132 SELF CREATECODE: ARGSL. - - ГЕНЕРАЦИЯ .:..г.:?о:> я~л ДВух байтов .- ::тг^ :: ; -'~;:,у:'! ■.-.. (количество пн "-:.:£!' . . :лл:.к аргументов) . SELF CREATECODE^SBL. ''' "•'":' : ' - - ГЕНЕРАЦИЯ ТРЕХ БАЙТОВ (ПОЛОЖЕНИЕ ' ^2V 7. ■'";.';; СЕЛЕКТОРА) Семантику этой программы можно описать следующим об- образом. Вначале компилируется получатель и выдается команда помещения объектного кода получателя в стек. Затем последо- последовательно слева направо компилируются параметры и выдается команда помещения параметров в стек. Наконец, посылаются сообщения, соответствующие селекторам. В зависимости от арности селекторов выбираются различные байт-команды. По- Поэтому после этогр с помощью условных операторов определяет- определяется, какую байт-команду необходимо выдать. TREESENDSUPER k, ,,.; , >t> COMPILE n»'*'.'-'vr"prt-^?.>i • --' ■- ■*,»■■£-■ ■-. - |ARGSLSEL| ," ,i;.: "'.\\<.\>сь- ■■ ', >'1-от> .'jf ARGSL^-SELF ARGS LENGTH. --. ■ ■rL SEL-^-SELF SELECTOR. g? SELF CREATECODE: 112.--ПОМЕЩЕНИЕ В СТЕК ПОЛУЧАТЕЛЯ \j 1TO:ARGSL DO:[:I|(SELF ARGS AT: I) COMPILE]. -- КОМПИЛЯ- '-'у,л ЦИЯ АРГУМЕНТОВ SJf (ARGSL<8AND:SEL<32)IFTRUE: ' P] [SELF CREATECODE: 133.--ГЕНЕРАЦИЯ БАЙТ-КОМАНДЫ ■k . 133 «^- |SELFCREATECODE:ARGSL«32+SEL].--ГЕНЕРАЦИЯ УКА- J.j..' ■ - , ЗАННЫХ ДВУХ БАЙТОВ SELF CREATECODE: 134.--ГЕНЕРАЦИЯ БАЙТ-КОМАНДЫ 134 ... 10—1428
146 Глава 3 : SELF CREATECODE:ARGSL. - - ГЕНЕРАЦИЯ ДВУХ БАЙТОВ ■-> SELF CREATECODE:SEL.--ГЕНЕРАЦИЯ ТРЕХ БАЙТОВ Эта программа совпадает с программой TreeSendLiteral, одна- однако, поскольку получателем является здесь суперкласс, она не- непосредственно выдает байт-программу, помещающую его в стек. Программа для посылки сообщения суперклассу состоит из команд 133 или 134. TREESENDARITHMETIC COMPILE SELF RECEIVER COMPILE. 1TO-.SELF ARGS LENGTH DO:[:I| (SELF ARGS AT:I)COMPILE]. SELF CREATECODE: 176+(SELF SELECTOR).--ГЕНЕРАЦИЯ БАЙТ-КОМАНД 176—191 TREESENDSPECIAL COMPILE ,;-, - ga< SELF RECEIVER COMPILE. . 1TO:SELFARGS LENGTH DO:[:I| (SELFARGS AT:I)COMPILEl. SELF CREATECODE: 192+(SELF SELECTOR) . --ГЕНЕРАЦИЯ БАЙТ-КОМАНД 192—207 1HBBBLOCK COMPILE ,. SELF CREATECODE: 137. - - PUSHACTIVECONTEXT ,v, '.' SELF CREATENUMBERPUSH:SELF ARGS LENGTH. ^' - - ГЕНЕРАЦИЯ БАЙТ-КОМАНДЫ, ПОМЕЩАЮЩЕЙ В СТЕК КО- ■'.'., ЛИЧЕСТВО АРГУМЕНТОВ. „"/ ''. SELF CREATECODE:200. --BLOCKCOPY: SELFJUMPPLACEHOLDER:2. - - ВЫДЕЛЕНИЕ ДВУХ БАЙТОВ ПОД КОМАНДУ ПЕРЕХОДА , г| SELF BODY COMPILE. - - КОМПИЛЯЦИЯ ТЕЛА (. ,,'„ SELF JUMPLOCATION. - - ФАКТИЧЕСКОЕ РАЗМЕЩЕНИЕ КОМАНДЫ ПЕРЕХОДА. В результате трансляции оператора блока выдается байт- программа, создающая экземпляр класса BlockContext. Для этого в стек сначала помещается существующий контекст, а затем — количество параметров блока, после этого генериру- генерируется байт-программа посылки сообщения с именем ЫоскСору. Далее генерируется объектный код для тела оператора блока, и, чтобы сохранить последовательность выполнения программы, этот объектный код необходимо обойти. Однако вопрос о том, к какому байту перейти, остается открытым до тех пор, пока яе закончится компиляция тела оператора блока. Поэтому вна- вначале отводится область памяти размером в два байта, в кото- которой этот адрес запоминается. После окончания компиляции тела блока происходит возврат к его началу и туда помещается команда перехода. ■<-■
Ш Введение в Смолток 147 TREEASSIGN COMPILE SELF RIGHT COMPILE. SELF LEFT COMPILEASSIGN COMPILEASSIGN .«" ILOCI m LOC-^-SELF LOCATION. - (SELF KIND) =TEMPORARY IFTRUE ' [|LOC<8 IFTRUE:[SELF CREATECODE: 104+LOC] IFFALSE:SELF CREATECODE: 130. SELF CREATECODE:64+LOC]] Э (SELF KIND) =#INSTANCE IFTRUE: r . *„ ; ;... [|LOC<8 IFTRUE:[SELF CREATECODE:96+LOC] ^ IFFALSE:[SELFCREATECODE:130. fg SELF CREATECODE :LOC]]. (SELF KIND)-#GLOBAL IFTRUE: SELF CREATECODE: 130. SELF CREATECODE :192+LOC] ; TREEVAR -' '■■■■' ' ' -- COMPILE ■./•., .; :- (SELF KIND) =#TEMPORARY IFTRUE: ' '" > : [t(SELFLOCATION)<16 IFTRUE: ',K SELF CREATECODE: (SELF LOCATION)] ';L '■ -..•■-:"/' IFFALSE:SELF CREATECODE: 128. . >.6-dotT,o' SELF CREATECODE:64+(SELF LOCATION)]]. !-'JV'J v (SELF KIND)-#INSTANCE IFTRUE: ТГ: [|(SELF LOCATION)<16 IFTRUE:[SELF CREATECODE:SELF ; LOCATION) IFFALSE:[SELF CREATECODE: 128. ff SELF CREATECODE:SELF LOCATION]]. :•''-' (SELF KIND)=#GLOBAL IFTRUE: *r;I-.Tfe. [|(SELF LOCATION)<32 IFTRUE:[SELF CREATECODE:64+ .*'= я + (SELF LOCATION)] ;;,;:! IFFALSE:[SELF CREATECODE:192+(SELF LOCATION)]] TREELITERAL COMPILE (SELF LOCATION)<32 IF TRUE:[SELF CREATECODE:32+(SELF LOCATION)] ~эп IFFALSE:[SELF CREATECODE: 128. '■* SELF CREATECODE: 128+(SELF LOCATION)] В конце трансляции в классе Compiler, являющемся супер- суперклассом для этих классов, определяются общие методы create- Code;, jumpPlaceholder:, jumpLocation. В частности, в методе createCode: к последовательности байтов присоединяется байт- программа-^- ■- -;-- -»и ..■■., ,.^г. „. ^ ...... ,,.ь... >^< Ю* , ■ и*
£ JI' I i < : H.Uc e. Архитектура jc згл/ :l Смвятов-жрментированногв процессора Рассмотрим, какие средства необходимы для проектирования быстродействующего микропроцессора, рассчитанного на язык ■Смолток-80. В качестве одной из возможных архитектур, реа- реализующих язык Смолток-80, опубликовано описание виртуаль- виртуальной машины Смолток-80. В данной главе мы продолжим раз- разговор об этой архитектуре. На спроектированном автором микропроцессоре "Катана" •могут выполняться команды виртуальной машины Смолток-80. Это сделано для того, чтобы реализовать на нем большую сис- систему программирования, а именно систему виртуальных отоб- отображений (the Virtual Image) Смолток-80, распространяемую ■фирмой «Ксерокс». С другой стороны, автором разработан компилятор для эффективной реализации системы виртуальных ютображений на микропроцессоре общего назначения МС-68 000. Разговор об этом оптимизирующем компиляторе мы отло- отложим до более удобного случая. Виртуальная машина Смолток-80 выполняет три функции. Первая из них — функция интерпретации. Интерпретатор счи- считывает команды языка, называемого байт-кодом, и выполняет -их. Следующая функция — управление объектами. Блок управ- управления объектами создает необходимые объекты и передает их •интерпретатору, а ставшие ненужными объекты собирает и ис- использует для дальнейшей работы. Наконец, имеется система -базовых операций. В нее входят операции ввода-вывода, управ- управления процессами, а также другие базовые операции. В сис- системе также регистрируются в качестве элементарных методов -(primitive method) те операции, которые нельзя реализовать на системе Смолток (либо их реализация неэффективна) и кото- которые реализуются в виде программ вне системы Смолток-80.
Архитектура Смолток-ориентированного процессора 149 В данной главе в разд. 4.1 и 4.3 рассматривается интерпре- интерпретатор, а в разделе 4.2 — система управления объектами. Опи- Описания элементарных операций опущены. . , ^ : Ч1> 4.1. Структура управления 'т ° 'Sl Структура управления реализует последовательность, в которой должны выполняться команды языка (байт-кода) в системе Смолток-80. Система осуществляет синхронное управление, т. е. команды машинного языка считываются и выполняются после- последовательно, а также асинхронное управление, т. е. под воздей- воздействием внутренних или внешних сигналов происходит смена процессов и последовательность выполнения команд сильно ме- меняется. 4.1.1. Синхронное управление :. Синхронное управление, при котором команды языка выполня- выполняются одна за другой, определяет, какая команда должна вы- выполняться следующей, за исключением случаев условного ветв- ветвления и посылки сообщений. Имеются три типа команд: — команды выборки из памяти на регистр и засылки в память, которые всегда передают управление по очередному адресу; — команды ветвления и условного ветвления, которые пе- передают управление по адресу, указанному в команде; — команды посылки сообщений, которые также передают управление по адресу, указанному в команде, но с их помощью еще может осуществляться возврат. В языке Смолток-80 почти все операции выполняются с по- помощью посылки сообщений. Поэтому прежде всего мы остано- остановимся на таких важных для посылки сообщений понятиях, как контекст метода (method context) и контекст блока. Это два объекта, снабженные операционной средой. Контекст метода. При посылке сообщения создается объект, называемый контекстом метода. В него входит следующая ин- информация: ,,' — контекст вызова (sender); v,f,"lT>", .' . /Г ^ — адрес команды; . ^ f ' . . '-л(?г\ н.- '■■ ^ — указатель стека; :4tu£;i — обрабатывающая процедура метода ~ ~~ р рур д щ^р ^Щ^ Г$аммами); ?? -EOdr/Hq% ■•млаид, w.-mavw елог.З , - получатель;. ;; .пгл.и^п?.., ,,НЖ№, vw 'Hqn „ ,п — аргументы; ' .sTsqaeoa «лотноя вч Rr.OTr.
150 Глава 4 .•;<"- .. ... г,. /. — временные переменные; • за■.-. . "Т ."' — стек. : "'•! Эта информация необходима для выполнения метода. В ком- компиляторах Алгола ее помещают в стек и называют фреймом. На- Накапливая таким образом фреймы как объекты, можно сохра- сохранять контексты. Сохранение (retention) контекста состоит в том, что он не освобождается после того, как завершено выполнение контекста. При обычном вызове процедур контекст всегда за- завершается из вызванной процедуры в конце ее работы и необ- необходимости в его сохранении нет. Однако при совместном выпол- выполнении процессов, работе сопрограмм и прочих сложностях в работу вовлекаются сложные механизмы, для которых недо- недостаточно простых структур управления. Для их реализации в языке возникает необходимость в сохранении контекста. При этом также облегчается разработка отладчиков и других сис- системных программ. Чтобы выдавать текущее состояние отлажи- отлаживаемой программы, отладчик содержит ссылки на разные части контекста и осуществляет их преобразование. Если контекст организован как объект, то задача значительно упро- упрощается. Однако сохранение контекста снижает эффективность. Важным предметом исследования является вопрос о том, как сохранить удобства, предоставляемые возможностью оформле- оформления контекста в виде объекта, и при этом не потерять эффек- эффективности. На рис. 4.1 показана структура контекста метода. Контекст блока. В языке Смолток-80 программы как тако- таковые могут не выполняться; являясь параметрами операторов посылки сообщений, они могут подставляться в переменные. Эту возможность предоставляет оператор блока. Различные операторы управления благодаря использованию блоков могут быть реализованы как сообщения. Например, оператор while можно реализовать с помощью двух блоков следующим обра- образом: [x>y]whileTrue:[x< -x-lj. Аналогично при создании процессов блоки позволяют опи- описывать программы, выполняющиеся внутри процессов. При компиляции и выполнении такого блока создается контекст блока (block context), из блока возможен доступ ко всем вре- временным переменным, объявленным в методах, определенных в блоке. Поэтому из контекста блока, созданного из блока, необ- необходим доступ к контекстам методов, соответствующим методам, определенным в блоке. Кроме того, после окончания выполне- выполнения блока управление должно вернуться к некоторому кон- контексту, и при этом должно сохраниться правильное значение указателя на контекст возврата.
Архитектура Смолток-ориентированного процессора 151 Существуют два способа возврата из блока. Первый способ заключается в том, что после выполнения последнего опера- оператора блока блок освобождается. При этом происходит возврат в точку вызова данного блока. Второй метод заключается в том, что при выполнении оператора возврата завершается выполне- выполнение метода, определенного в блоке, и контекст метода возвра- возвращается в посылавшую его главную программу. Г 1 Контекст Вызова (отправитель) Адрес команды Указатель стека Обработчик метода Свободное место Получатель Параметры Временные пе- переменные Стек | i Рис, 4.1. Структура контекста метода. В системе Смолток-80 при посылке сообщения для контекстов методов создается спе- специальный буфер, в котором накапливается вся информация, необходимая для выполне- выполнения сообщения. Контексты методов, как и другие объекты, утилизуются при ссборке му- мусора*. Контекст блока содержит информацию, необходимую для реализации этой функции. , Контекст блока содержит информацию, необходимую реализации этой функции (рис. 4.2), а именно: — коитекст вызова (caller); • — адрес команды; f — указатель стека; - > \ >„ — число аргументов; > он-шчц-'сг;..--и глиох т<нл\'х для г
152 Глава 4 — начальное значение адреса команды; — локальный контекст; — стек. II: Л Контекст вызова создается в момент вызова (активизации) блока и при вызове посылается сообщение value. При вычисле- вычислениях внутри этого блока используются стек и указатель стека. Количество аргументов равно количеству параметров блока. Контекст вызова (отправитель) Адрес команды Указатель стека Количество параметров Начальное значение адреса команды Локальный контекст Стек Рис. 4.2. Структура контекста блока. Создается с целью реализации оператора блока в момент вызова метода, определенного в операторе блока. Что касается контекста вызова, то данный контекст блока вызывался посылкой сообщения value, и прн нормальном завершении возврат происходит в опера- тоо блока Внутренний или локальный контекст создается прн определении оператора блока. При выполнении оператора возврата (t) внутри блока выполнение локального контекста завершается. Из локального контекста возможен доступ к временным пере- переменным и параметрам. Начальное значение адреса команды запоминается, чтобы обес- обеспечить возможность повторения несколько раз контекста блока. Начальное значение адреса команды запоминается для того, чтобы иметь возможность выполнения одного блока несколько раз. Поскольку в контексте метода описан обработчик метода, доступ к нему осуществляется через локальный контекст в кон- контексте блока. Локальный контекст (home context). Он представляет собой контекст метода, определенного в блоке. В нем помещены вре- временные переменные и формальные параметры метода, к кото- которым может осуществляться доступ. Хранение параметров блока в локальном контексте сопряжено с некоторым риском, по-
Архитектура Смолток-ориентированного процессора 153 скольку они представляют собой переменные, недоступные из других локальных контекстов. Однако помещение этих перемен- переменных в локальный контекст позволяет унифицировать доступ к переменным по сравнению с контекстом блока, что избавляет от необходимости создания специализированных команд. Если компилятор генерирует правильный объективный код, то не- неправильные обращения из локального контекста не допускают- допускаются. Даже при наличии вложенных структур возможен доступ ко всем формальным параметрам, поскольку все они помеща- помещаются в локальный контекст. Посылка сообщений и возврат. Смолток-80 является языком с поздним связыванием (late binding). Для позднего связыва- связывания характерно то, что в момент компиляции не происходит установления связей между посылкой сообщений и методами. Кроме того, даже для находящихся в одном и том же месте сообщений вызываемые методы в момент посылки сообщения могут быть различными. При посылке сообщения необходимо решать вопросы, как задать его связь с методом и какую информацию передавать после того, как эта связь установлена. Алгоритм связывания при выполнении осуществляет следу- следующие операции: 1) выталкивает из стека получателя сообщения; 2) входит в хеш-таблицу (составленную для множества ме- методов) по селектору сообщения и классу; 3) если метод найден, то выполняет его; 4) иначе проводит поиск класса получателя в словаре клас- классов; 5) если класс найден, то регистрирует его в хеш-таблице и затем выполняет метод; 6) иначе проводит поиск в словаре сообщений суперкласса. Переходит к шагу 4. Если суперкласса нет, то выдает сообще- сообщение об ошибке. Структура массива методов, используемого в п. 2, представ- представлена на рис. 4.3. Если поиск в массиве методов завершается успешно, то оп- определяется объектный код, выполняемый с использованием обработчика метода и указателя примитива (primitive index). Указатель примитива используется, чтобы показать, использу- используются ли примитивы при реализации данного метода, и в случае их использования указывает на объектный код примитива. Примитивы реализуются на машинном языке или на языке микрокоманд и используются для выполнения функций, не реа- реализованных в рамках системы Смолток-80 (управление вводом- выводом, вычисления с большим быстродействием и т. д.).
154 Глава 4 Если значение указателя примитива равно нулю, то данный метод реализуется без применения примитивов, и при этом байт-программа считывается из объекта, указываемого обра- обработчиком метода, и выполняется. При неудаче поиска в массиве методов производится поиск в словаре сообщений. Его структура показана на рис. 4.4. Сло- Звго- Лдво/Г .-:яу. Селектор сообщения Класс Обработчик метода Указатель примитиба Аналогично предыдущему Чепунре слова на одно(,опц Сание метода '' слова) '• '■;' '■ЮМ о;; ■i': Н, :.пн ']?■* Рис. 4.3. Структура массива методов. При посылке сообщения происходит поиск в хеш-таблице по селектору сообщите* ■ классу получателя. Если поиск завершается удачно, то сообщение с найденными мето- методами н указателями примитивов выполняется. Прн неудаче происходит поиск по сло- варь содержит список селекторов сообщений. Производится по- поочередное сравнение с каждым элементом этого списка. Если с каким-либо из них имеется совпадение, то из соответствую- соответствующего места в списке методов выбирается обработчик метода и посылается на выполнение. При неудаче поиска происходит переход к суперклассу и поиску в его словаре сообщений. После того как метод найден, необходимо выполнить сле- следующие действия.
Архитектура Смолток-ориеитироваиного процессора 155 Вначале анализируется заголовок метода, и, если он реа- реализован как примитив, производится выполнение этого прими- примитива. При выполнении примитива контекст метода отсутствует. Заголовок метода рассмотрен в разд. 4.2.3. Если метод реали- реализуется не в виде примитива илн при выполнении примитива имели место ошибки, то этот метод выполняется с помощью процедуры, реализованной на языке Смолток-80. Для этого создается контекст метода (рис. 4.1) в следующей последова- последовательности: Суперкласс Словарь методов Класс Массив методов Селекшры сообщений Обработчики методов Массив селекторов Массив методов Рис. 4.4. Словарь сообщений. На него поступают ссылки нз класса. Словарь состоит из списков селекторов и методов. Селектор сообщения представляет собой идентификатор, т. е. объект, состоящий нз уни- уникальной последовательности символов. 1) создание экземпляра контекста метода; 2) подстановка в контекст метода в нужные места отправи- отправителя сообщения, значения начального адреса, начального зна- значения указателя стека, обработчика метода; 3) копирование из стека вызывающей программы активного контекста (activeContext) получателя и значений фактических параметров; 4) помещение в активный контекст текущих значений ре- регистров контекста (указатель команды — instructionPointer, указатель стека — stackPointer), чтение из нового контекста новых значений регистров контекста (локальный контекст — homeContext, получатель — receiver, метод — method, указатель команды — instructionPointer, указатель стека — stackPointer), изменение значений активного контекста. При завершении выполнения метода выполняется команда возврата и происходит возврат в вызывающую программу.
156 ■ .'• ■ а Глава 4 -' ' т Существуют два способа возврата. Первый способ — возврат к отправителю сообщения, указанному в локальном контексте. Это происходит при выполнении оператора возврата f и при завершении работы метода. Второй способ — возврат к вызы- вызывающей программе, указанной в активном контексте. Это про- происходит при завершении работы оператора блока. Примитивы. На языке Смолток-80 не удается описать спе- специальные команды ввода-вывода, а также методы высокого быстродействия. Такие методы зарегистрированы в таблице примитивов и вызываются из нее при посылке сообщения. Существуют два способа вызова из команд Смолток-80. Пер- Первый способ состоит в том, что, как сказано в предыдущем раз- разделе (посылка сообщения и возврат), происходит поиск метода, и в результате поиска с помощью указателя примитива опре- определяется место выполнения примитива. Этот способ не обеспе- обеспечивает экономии во времени, необходимом на поиск метода. Второй способ применяется в случае выполнения программы, написанной в специализированной системе команд. При этом примитивы вызываются непосредственно. Имеется 256 различных примитивов. Среди них 128 являют- являются примитивами общего назначения. Кроме них, существуют и специальные примитивы. Они сразу возвращают получателя или переменные экземпляра. Указатели на них помещаются в заголовке метода. 4.1.2. Асинхронное управление ; ■ ~ Для быстрого реагирования на операции ввода-вывода необхо- необходимо одновременно выполнять несколько видов деятельности. Для этой цели в системе Смолток-80 существует механизм про- процессов. Этот механизм передачи управления между нескольки- несколькими процессами называют асинхронным управлением. Асинхронная передача управления может вызываться как внешними причинами, аналогичными сигналам прерывания по вводу-выводу, так и внутренними, когда выполняемые програм- программы выполняют команды управления процессами. Внешние сиг- сигналы, поступающие в любой момент времени, называются асин- асинхронными сигналами, а внутренние, возникающие по заверше- завершении выполнения байт-программ, — синхронными сигналами. Асинхронные сигналы. При поступлении сигналов прерыва- прерывания по вводу-выводу необходимо запускать процессы, обраба- обрабатывающие их. Это связано с определенными трудностями, по- потому что прерывание происходит в произвольном месте выпол- выполнения программы. В частности, в случае когда байт-команда реализована несколькими микрокомандами, возникают трудно- трудности с переключением процессов между этими микрокомандами.
Архитектура Смолток-ориеитироваиного пррцессора 157 Переключение процессов может происходить только как пере- переход от одной байт-программы к другой, и при этом каждый раз выполняется процесс с максимальным приоритетом. Управление процессами осуществляется с помощью семафо- семафоров. Прерванный процесс ожидает сигнала семафора. При по- поступлении асинхронного сигнала семафор, управляющий про- процессом, который должен запуститься, помещается в список се- семафоров. Переключение процессов. В случае, когда происходит преры- прерывание текущего процесса и начинает выполняться другой, нахо- находящийся в состоянии ожидания, говорят, что происходит пере- переключение процессов. Всякий раз, когда завершается выполне- выполнение байт-команды, происходит проверка, не возникли ли усло- условия переключения процессов. Они возникают тогда, когда в байт-программе, выполняемой перед этим, был выработан- асинхронный сигнал и в списке семафоров имеется соответст- соответствующий семафор, либо когда в выполняемой перед этим байт- программе имелась команда типа signal, wait, resume, suspend,, запросившая переключение процесса. Анализ условий состоит в том, что вначале для каждого' семафора в списке семафоров выдается команда на выработку сигнала синхронизации и затем выбирается процесс с наиболь- наибольшим приоритетом. Если выбранным процессом является не тот, который выполняется в настоящий момент, то меняются значе- значения активного процесса и активного контекста, а кроме того,, меняются содержимые регистров контекста. Команды управления процессами. Переключение процессов может запрашиваться из процесса командами signal, wait, resu- resume, suspend. По команде signal, посылаемой семафору, запус- запускается процесс, находящийся в состоянии ожидания, если его приоритет к этому семафору выше, чем приоритет выполняюще- выполняющегося в настоящий момент процесса. По команде wait, посылаемой семафору, выполняющийся процесс останавливается и запускается тот из ожидающих про- процессов, который имеет наивысший приоритет, если значение се- семафора в этот момент равно нулю. По команде resume, посылаемой семафору, запускается про- процесс, управляемый данным семафором, если его приоритет выше,, чем приоритет выполняемого в данный момент процесса. По команде suspend прерывается выполняющийся в данный» момент процесс, затем среди ожидающих процессов выбираете» и запускается на выполнение процесс с наивысшим приори^ >Cj!i._ .- ,.. 'CUV ОТ» ,Р.ОТ>!Э<1Ч. ■■ ЙЗГЛТЁ!:..-. _ - . \iv.
158 4.2. Структура памяти ;i '■■"'•• '*■ ^^--p -л^^э^П В микроЭВМ, на которые ставится Смолток-80, часть основной памяти отводится под системную область. Сюда относятся ин- интерпретатор, блок управления объектами, программы базовых операций и данные. В оставшейся области размещаются все программы, написанные на языке Смолток-80, и данные к ним. Программы в Смолтоке-80 хранятся также в форме объектов. 4.2.1. Объекты Указатели объектов. Имеются 16-разрядные указатели объек- объектов (Оор). Если значение Оор представляет собой четное число, то оно используется в качестве уникального имени крупного объекта, размещенного в информационной области. Если зна- значение Оор — нечетное число, то им определяется экземпляр класса Smalllnteger, т. е. небольшое целое число. Таким обра- образом, в информационной области можно разместить до 215 = = 32 768 объектов. В случае когда Оор является нечетным чис- числом, его старшие 15 разрядов представляют собой целое число •со знаком. Когда Оор, в качестве дополнения до двойки, принимает значения, равные, например, —3, —1, 1, 3, 5, то это •соответствует экземплярам класса Smalllnteger: —2, —1, 0,1,2. Таблица объектов. Четное значение Оор является уникаль- уникальным именем объекта в информационной области. Однако при этом значение его 16 разрядов не является непосредственным указателем адреса объекта. Они являются указателем в струк- структуре данных, называемой таблицей объектов, состоящей из ■65К слов (одно слово содержит 16 разрядов). В таблице объек- объектов один объект обозначается двумя словами. Поэтому в указа- указателе объекта, указывающем на таблицу объектов, правый край- крайний разряд всегда равен нулю. Значение, получаемое в резуль- результате суммирования начального адреса таблицы объектов, и зна- значения указателя объекта являются физическими адресами точ- точки входа в объект. Связи между этими адресами показаны на рис. 4.5. Для доступа через Оор к содержимому объекта необ- необходимо выполнить два обращения к памяти. Таким образом, здесь введен механизм косвенных ссылок, который замедляет доступ к объектам. На это имеется несколь- несколько причин. Во-первых, длина указателя составляет всего лишь 16 разрядов, что не позволяет осуществлять адресацию боль- больших объемов памяти. Во-вторых, даже если производится уп- уплотнение основной памяти при работе с информационной об- областью, содержащей объекты, нет необходимости в изменении значений указателей объектов, что упрощает управление па- памятью. В-третьих, использование в языке Смолток-80 метода "сборки мусора" с подсчетом ссылок позволяет реализовать
Архитектура Смолток-ориентированного процессора управление объектами. Этот метод утилизирует ставшие ненуж- ненужными объекты после того, как на них не осталось ни одной ссылки с других объектов, однако при этом для каждого объ- объекта необходимо иметь индивидуальный счетчик ссылок (refe- ■ - г i"'," * Значение указателя объекта Оор i1* '<!>» J £ к 1 ' \ i К > -м» 1 1 т - 1 Указатель (Оор '. i Я£,> Н t | Г 4) 1 - \ объекта\ \ \ ) Ш > * 1 ч 1 — Таблица oSbeKmot \ / / ч 1*. df i > /, f' .] j'jC, -! Информационная ■_ область ' Рис. 4.5. Обращение к объекту через указатель объекта. Поскольку указатель объекта является четным числом, он указывает на точку входа в> таблицу объектов. rence count), в который записывается количество Оор, указы- указывающих на данный объект. Если количество ссылок равно нулю, то это значит, что на данный объект никто не указывает, и он* может быть утилизирован, т. е. занимаемая им память может быть освобождена. Для работы этого метода необходимо выде- выделять место для записи количества ссылок. Поскольку существу- существует таблица объектов, в ней можно выделить это место. Недо- Недостатком такого метода является значительное снижение быстро- быстродействия из-за двухуровневой косвенной адресации. Каждая адресуемая единица таблицы объектов (ее можно- называть записью) состоит из двух слов и указывает на один объект. Ее структура показана на рис. 4.6. Счетчик Сегмент Смещение Рис. 4.6. Одна адресуемая единица в таблице объектов, состоящая из двух- слов. В начале первого слова находится восьмиразрядный счетчик, за ним — одноразрядные признаки О, Р, F, а затем следует четырехразрядное поле сегмента. Во втором слове указывается смещение адреса.
160 Глава 4. !f/Wu/rt?( = N + 2) .Класс Поле 1 В этой записи поле счетчика используется для указания ко- количества ссылок. Поле Р показывает, является ли содержимое объекта указателем (поле Р равно 1) или нет. В случае если содержимое объекта не является указателем, оно представляет собой массив байтов, и если при этом длина массива является нечетным числом, то поле 0 равняется 1. Значение поля F, рав- равное 1, указывает, что данный элемент таблицы объектов не ис- используется. Поля сегмента и смещения, сцепленные вместе, ха- характеризуют 20-разрядный абсолютный адрес объекта. Структура объекта. Объект состоит из целого количества 16-разрядных слов. Первые два слова являются заголовком. Он состоит из указателя объекта, указывающего длину объекта и класс (рис. 4.7). Объекты делятся на группы в зависимости от того, что содержится в них, начиная с 0-го поля до N—1-го. Одна из этих групп характерна тем, что ее поля являются указателями объектов. Такие объекты называют указательными объектами (pointer object). Содержимые этих полей могут подставляться в переменные в ка- качестве указателей, однако при этом они не только могут указывать на таблицу объектов, но и являться экземплярами класса Smalllnteger, т. е. быть целыми числами. Вторую группу называют самоопре- самоопределениями объектами (nonpointer ob- object). В этом случае все поля заняты 8- или 16-разрядными значениями. Самооп- Самоопределенные объекты используются для эффективного хранения последователь- последовательностей символов и побитовых отображений экрана. Объект является указательным только в том случае, когда в таблице объектов поле Р=1. С другой стороны, существуют объекты, не являющиеся ни указательными, ни самоопределен- самоопределенными объектами. К ним относятся методы. Подробнее об этом написано в разд. 4.2.3. Сборка мусора. Одним из важных механизмов объектно- ориентированных языков является автоматическое освобожде- освобождение объектов (deallocation). Деятельность по автоматическому освобождению неиспользуемых и ставших ненужными объектов и по их утилизации называется сборкой мусора, а программы, осуществляющие эту деятельность, называют сборщиками мусо- мусора. Для сборки мусора традиционно используется метод удале- удаления меток. В этом методе ничего не делается до тех пор, пока имеется свободная память. Когда доступной памяти не остает- Поле N -1 Рис. 4.7. Структура объ- объекта. Указана полная длина объ- объекта, включая два слова за- заголовка.
Архитектура Смолток-ориеитироваииого процессора 161 ся, производится расстановка меток у используемых объектов (иа которые имеются указатели от других используемых объ- объектов). Затем вся область памяти очищается, и все объекты, не имеющие таких меток, собираются в один список. Этот метод характерен высокой эффективностью, однако как только начи- начинается сборка мусора, все прочие вычисления должны прекра- прекращаться. Поэтому он малопригоден для диалоговых систем и си- систем реального времени. При использовании его в системах с виртуальной памятью, со страничной организацией памяти и т. д. значительно снижается эффективность их работы в связи с большим количеством обращений к диску. Существует другой метод, ориентированный на работу в реальном времени, а имен- именно метод подсчета ссылок. При использовании этого метода для каждого объекта заводится свой собственный счетчик ссылок, в котором хранятся указатели на этот объект. При значении этого счетчика, равном нулю, ссылки со стороны других объек- объектов на этот объект отсутствуют, и он становится мусором. При реальных вычислениях память, занимаемая объектом, утилизу- утилизуется в тот момент, когда счетчик ссылок меняет свое значение с 1 на 0. Благодаря этому процесс освобождения памяти и ее утилизации равномерно распределен по времени течения вы- вычислительного процесса, и время реакции при вычислениях в реальном времени снижается. В том случае, когда объект располагается на диске, нет не- необходимости, в физическом обращении к объекту, и снижение эффективности за счет обращений к диску при вводе-выводе оказывается небольшим. В системе Смолток-80 важное значение придается времени реакции при работе в реальном масштабе времени, и поэтому был выбран метод сборки мусора путем подсчета ссылок, од- однако при этом общая эффективность системы все же значитель- значительно снизилась. Одним из важных предметов исследования явля- является вопрос о том, как повысить эффективность системы при применении метода подсчета ссылок. Управление свободной памятью. Поскольку данный алгоритм сборки мусора освобождает области памяти в произвольные моменты времени, свободные места в таблице указателей и в информационной области появляются в произвольных местах. Высокоэффективное выделение свободной памяти для вновь вводимых объектов требует тщательной проработки методов уп- управления этими областями. Трудной проблемой в управлении памятью в информацион- информационной области является то, что объекты имеют различные раз- размеры. Поскольку свободная память сильно фрагментирована, в ней отсутствуют большие цельные области. Одним из методов управления такой памятью является объединение ее в линей- 11—1428
162 Глава 4 -от- <>,vj ;,uvt.-..- ;» ный список. При запросе на память для объекта какой-либо личины производится поиск в этом линейном списке до тех пор, пока не встретится область свободной памяти больше требуе- требуемой. Такую дисциплину распределения памяти называют мето- методом первого подходящего (first-fit). В наихудшем случае этот метод требует времени прямо пропорционального количеству свободных областей памяти. В языке Лисп управление свобод- свободной памятью производится аналогичным образом, однако в нем размер ячейки CONS, являющейся единицей памяти, фиксиро- фиксирован, и такой проблемы, как в языке Смолток, нет. Другой метод состоит в том, что области свободной памяти ранжированы по величине и образуют двоичное дерево. В том случае, когда требуется область памяти некоторой величины. I - Заголовок свобод- ных областей памяти Ра змер= т. ii-f Таблица объектов Информацион- Информационная область Рис. 4.8. Заголовок свободных областей памяти в ьиде массива из 20 эле- ыентов. Массив содержит начала списков, свободных областей памяти размером 2—20, а также ■ачало списка свободных областей всех остальных размеров, время поиска может оказаться пропорциональным величине logAf, где W — количество свободных областей памяти. Эту дис- дисциплину называют методом наилучшего подходящего (best-fit). Однако на практике очень часто создаются объекты малого размера. Для их ускоренного создания применяется специаль* ный метод виртуальной машины Смолток-80. При этом методе прежде всего создается таблица из 20 слов, называемая заго- заголовком свободных областей. Первые 19 слов включают в себя начало списков свободных областей памяти размером 2— 20 слов. Последнее слово содержит начало списка всех осталь- остальных свободных областей памяти (рис. 4.8)."- ^->»- l--' - ■ "^ -к
Архитектура Смолток-ориентированного процессора '1бЭГ Например, если необходимо создать объект размером 7 слов, то читается шестой элемент таблицы заголовков свободных об- областей, и если в нем содержится указатель на информацион- информационную область, то берется указанный элемент. При создании объ- объектов малых размеров поиск по таблице свободных областей производится за одно обращение. Если в таблице не зарегист- зарегистрировано ни одной области памяти данного размера, то читает- читается 20-й элемент и берется область произвольного размера, от которой отделяется область в семь слов. Оставшаяся область памяти в соответствии с ее размерами регистрируется под со- соответствующим заголовком таблицы. Если такое дробление будет продолжаться долго, то весь универсум знаний системы раздробится на мелкие кусочки. Та- Такое состояние называют фрагментацией (fragmentation). При этом оказывается невозможным создание крупных объектов. В этом случае все множество раздробленных областей свобод- свободной памяти объединяют в одну большую область свободной па- памяти. Этот процесс называют уплотнением (compaction). При выполнении уплотнения все объекты, находящиеся в информа- информационной области, необходимо переписать на новые места неза- независимо от того, используются они в данный момент времени или нет. В связи с этим должны быть изменены все указатели используемых объектов, что в общем случае приводит к разра- разработке весьма сложных алгоритмов. Однако в системе Смолток-80 уплотнение выполняется просто, ■с использованием таблицы объектов. Указатели объектов (Оор) не связаны с координатами объектов в информационной области, и поэтому нет необходимости в их переписывании. Можно обойтись лишь переписыванием смещений в таблице объектов, а поскольку ссылки на перемещаемые в информаци- информационной области объекты идут только из одного места, переписы- переписывание достаточно выполнить только в одном месте. { ВЦ 4.2.2. Классы *|*л'>слг яотиэьаэ-;. уыннпесщлзль'ф ьииинглй .£ В системе Смолток-80 классы также являются объектами, и па- память для них организована так же, как для прочих объектов. Информация, необходимая для объекта, называемого клас- классом, находится в его суперклассе, словаре сообщений и в эк- экземплярах. При посылке сообщения экземпляру класса необхо- необходим поиск информации, определяющей метод, требуемый сооб- сообщением, и эта информация содержится в словаре сообщений. Информация, необходимая для создания экземпляра, содержит- содержится в описании экземпляра. Структура класса и словаря сообще- сообщений показана на рис. 4.9. Л*
164 , ... -.ш-..j/. ,. ..;;■-, Глава 4 . :,. ,■ , _-..:., ,:-;к Класс Суперкласс Словарь сообщений Спецификатор экземпляра :■;("•";/ ... , •:■".-..- 1 "лоВарь сообщений Массив методов — См»твры к: .• ■ ■ h! '!' '' К-• .-','■' МассиВ методов ' Обработчики — - -и »: — Рис. 4.9. Структура класса и словаря сообщений. Информация, необходимая интерпретатору, содержится в суперклассе, словаре сообще- сообщений и в спецификации экземпляров. Интерпретатор, обладая селектором сообщения, производит поиск в словаре сообщений; при этом поиск производится по хеш-таблице для объекта, содержащего данный селектор. Если он встречает искомое слово, то по его указателю из массива методов берется обработчик методов (указатель объекта ме- метода). Спецификация экземпляров используется в случае создания экземпляра по сообщению new или new : size. В нее входят сле- следующие сведения четырех видов. 1. Содержат ли сегменты, отведенные для экземпляра, ука- указатели объектов или же они содержат целые числа. 2. Единицы, адресации в сегментах экземпляров (слова или байты). 3. Имеется ли перед фиксированными сегментами экземпля- экземпляра сегмент, адресуемый указателем. 4. Величина фиксированных сегментов экземпляра. м ^ „ Объект- указатель -йй Н- ,ЫГ/ I ill от 0 1 f . Наличие индекса Величина фиксированной области Признак пословной адресации экземпляра Рис. 4.10. Структура спецификатора экземпляра. Структура спецификации экземпляра представлена на рис. 4.10.
Архитектура Смолток-ориентироваииого процессора 16$ Заголовок Область литералов 4.2.3. Методы - >т« В системе Смолток-80 объектный код, сгенерированный компи- компилятором, также хранится в информационной области в виде объекта. Такой объект представляет собой экземпляр класса CompiledMethod (откомпилированный метод). Таким образом, объектный код, хранящийся в виде объекта, также подвергает- подвергается процедуре сборки мусора и уплотнения. При внесении изме- изменений в программу и ее перетрансляции старый объектный код становится ненужным и является объектом процедуры сборки мусора. Преимущество такого хранения состоит в том, что не требуется написание специальной системы управления про- программами. Структура экземпляра класса CompiledMethod (откомпили- (откомпилированный метод) показана на рис. 4.11. Заголовок метода пред- представляет собой указатель объекта, являющийся экземпляром класса Smalllnteger (малое целое число). Literal frame (область литера- литералов) содержит указатели объектов: в нее входят указатели объектов, недоступные непосредственно из байт-программы. Например, в об- область литералов входят селекторы сообщений, и при выполнении байт- программы, указанной в заявке, се- селекторы сообщения выбираются с использованием области литералов. Область команд представляет со- собой массив с побайтовой адресаци- адресацией. В ней содержится байт-про- байт-программа. В method header (заголовке ме- метода) содержится информация, не- необходимая при создании контекста метода. Структура заголов- заголовка метода показана на рис. 4.12. Заголовок метода содержит 4 сегмента: "флажки", "коли- "количество временных переменных", "размер контекста", "размер области литералов". Сегмент "флажки" указывает на тип метода и интерпретиру- интерпретируется следующим образом: Значение 0—4: метод не является примитивом и имеет 0— 4 параметров; значение 5: метод является примитивом без па- параметров и в качестве результата возвращает self (получа- (получатель); значение 6: метод является примитивом без параметров, возвращает в качестве значения переменную экземпляра. В этом случае требуется информация о том, по какому адресу оно воз- ОВласть объектною Z *. кода. Рис. 4.11. Структура экземпля- экземпляра класса Compiled Method (откомпилированный метод). Программа на языке Смолток-80 представляет собой объект.
166 t, •._,.-,.rfi. . c..f,4 . Глава 4. гы7' -.-^таэтаг ' вращается, для этого используется сегмент "число временных переменных"; значение 7: в области литералов находится рас- расширение заголовка (второе слово от конца области литералов), оно содержит количество параметров и указатель примитива. Структура слова расширения заголовка показана на рис. 4.13. 1111 1 1 1 1 1 1 . . RD г. Флажки Количество временных \ Размер области литералов ,.э,, переменны? Размер контекста с,~-> Рис. 4.12. Структура заголовка метода. . У/м Он представляет собой указатель объекта. Крайний правый разряд в нем равен едини- единице. Остальные сегменты содержат информацию, необходимую для создания контекста метода. Сегмент "величина контекста" в заголовке метода состоит из одного разряда. Он указывает ту величину, которая должна быть при создании контекста метода. Малые контексты пред- представляют собой объекты размером в 20 слов, большие контекс- контексты— объекты размером в 40 слов. НОТ, 0 0 1 j Количество парамет- Указатель примитива ■ ', ► pOg ,,,, ,,-,;,:ь; Рис. 4.13. Структура слова расширения заголовка. liiti.'j/J^'v.vj Отличие экземпляра класса CompiledMethod от других объ- объектов состоит в том, что внутри объекта вперемежку идут ука- указатели объектов и последовательности байтов. Программа сборки мусора должна обращаться к объектам, на которые имеются ссылки в области указателей, и игнорировать простые последовательности байтов. Таким образом, объекты из этого класса и только они обрабатываются специальным образом. •Ч'Л , .-.a-tiiSiv ,'!:фНН !Г>! Н >! rp\n'j (IV ' ' 4.3. Система команд ' '-'*-' -ч я вне^ "Иег".-.»^ В разд. 4.2.3 было показано, что программа, написанная на языке Смолток-80, после компиляции хранится как экземпляр класса CompiledMethod. В данном разделе рассматриваются форматы и семантика системы команд. 4.3.1. Байт-код Идея реализации персонального компьютера как специализиро- специализированной машины с аппаратно реализованным языком высокого уровня впервые была воплощена Л. Петером Дойчем в Лисп-
Архитектура Смолток-ориеитироваииого процессора ' ' ' 167 машине. В этом проекте используется система команд, в кото- которой минимальной единицей является один байт, и поэтому ее называют байт-кодом. В дальнейшем эта система команд при- применялась в таких машинах с микропрограммным управлением, как Альто фирмы «Ксерокс», Дольфин (Dolphin), Дорадо (Do- (Dorado), а также в машине Perq фирмы «Три Риверс» (Three Ri- Rivers). В качестве исходных языков используются языки Лисп, Смолток, Паскаль, Меза и др. В байт-коде имеется тенденция реализовать все команды по возможности в одном байте (при высокой частоте выполнения команд), что позволяет создавать компактный объектный код. Кроме того, если не разбивать содержимое восьми разрядов байта на сегменты с их отдельным декодированием, то один байт позволяет организовать передачу управления по 256 раз- различным адресам с выполнением по каждому из этих адресов своих видов деятельности. ■i"> <~, -.■<*■ - -мт -- - ■•. 4.3.2. Форматы команд Система команд или байт-код языка Смолток-80 показана в приведенной ниже табл. 4.1. В ней в графе "Битовый формат" указан формат, состоящий из восьми символов, в число кото- которых входят нули, единицы или малые латинские буквы. При этом латинские буквы означают, что на их местах должны сто- стоять нули или единицы. В графе "Семантика" приняты следую- следующие обозначения. Например, если в ней имеются символы: #iiii, то это — указатель значения последовательности четырех двоичных разрядов, указанных в формате команды четырьмя символами iiii. Далее, если в графе "Семантика" имеется описа- описание вида: а,Ь, с, d) fii], то такая запись обозначает, что из че- четырех элементов (a,b,c,d) необходимо выбрать элемент с но- номером [И]. Если п равно Юг, то значением этого выражения является с. 4.3.3. Семантика команд£бэоЛпог*.. . « :'l$i*Vl;- Рассмотрим на примере виртуальной машины семантику ко- команд байт-кода, описанного в предыдущем разделе. 1) Проталкивание в стек переменных экземпляра-получате- экземпляра-получателя. Переменные экземпляра фиксируются для каждого экземп- экземпляра, и в каждом объекте для них отводится область памяти. Данная команда проталкивает в стек считанные переменные экземпляра, в частности получателя. Ее работа показана на рис. 4.14. Команда реализуется байт-кодами 0—15, 128. 2) Проталкивание в стек временной переменной. Временные переменные представляют собой переменные, создаваемые в
Таблица 4.1. Система команд (байт-код) языка Смолток-80 Значеяве Битовый формат Семантика 0—15 16—31 32—63 64—95 OOOOiiii OOOliiii OOliiiii OlOiiiii 96—103 104—111 OllOOiii 01101Ш 112—119 120—123 124—125 126—127 128 129 ■- 130 131 C-'b 132 '' 133 134 135 - 4 136 137 138—144 144—151 152—159 160—167 0Ш0Ш OllllOii OlllllOi 10000000 jjkkkkk 10000001 jjkkkkkk 10000010 jjkkkkkk ' ' 10000011 '■ :■ j jjkkkkk 10000100 Kkkkkkkk 10000101 jjjkkkkk •■ 10000110 / <7 kkkkkkkk ;,. " 10000111 /„ 10001000 '' 10001001 i Jit lOOlOiii ,1. Ю011Ш / 10100Ш ■^* JJJJJJJJ Помещение в стек переменной экземпляра-полу- экземпляра-получателя с номером #iiii Помещение в стек временной переменной с номе- номером #iiii Помещение в стек литерала с номером #iiiii Помещение в стек глобальной переменной, ука- указываемой литералом с номером 4Hiiii Выталкивание из стека и помещение вытолкну- вытолкнутого значения в переменную экземпляра-получа- экземпляра-получателя с номером #Ш Выталкивание из стека н помещение вытолкнуто- вытолкнутого значения во временную переменную с номером #ш Помещение в стек специального значения (полу- (получатель, true, false, nil, —1, 0, 1, 2) [iii] Возврат из метода с возвращением специального значения (получатель, true, false, nil) [ii] Возвращение верхушки стека в качестве значе- значения (метод, блок) [i] Не используется Помещение в стек (переменной экземпляра полу- получателя, временной переменной, литерала, гло- глобальной переменной, указываемой литералом) Ш1 с номером #kkkkkk Помещение верхушки стека в (переменную экземпляра-получателя, временную переменную, литерал, глобальную переменную, указываемую литералом) [jjl с номером #kkkkkk Выталкивание из стека верхушки н помещение этого значения в (переменную экземпляра-полу- экземпляра-получателя, временную переменную, литерал, глобаль- глобальную переменную, указываемую литералом) [jj] с номером #kkkkkk Вызов метода с jj параметрами с использовани- использованием селектора сообщения, находящегося в об- области литералов под номером #kkkkk Вызов метода с jjjjjjjj параметрами с использо- использованием селектора сообщения, находящегося в об- области литералов под номером #kkkkkkkk Вызов метода с jjj параметрами с использовани- использованием селектора сообщения, находящегося в области литералов под номером #kkkkk Вызов метода с jjjjjjjj параметрами с использо- использованием селектора сообщений, находящегося в области литералов под номером #kkkkkkkk -. - Выталкивание из стека Копирование верхушки стека Помещение в стек активного контекста Не используются Переход по адресу iii-fl Выталкивание нз стека, переход к iii+1 при зна- значении false вытолкнутой верхушки. Переход по адресу (iii—4) ^256+jjjjjjjj vftt, Т..-/. 168
Архитектура Смолток-ориентироваииого процессора 169 Продолжение Значение Битовый формат Семантика 168—171 172—175 176—191 192—207 208—223 224—239 240—255 101010ii JJJJJJJJ 10101Ш - JJJJJJJJ lOlliiii llOOiiii HOliiii lllOiiii Ulliiii Выталкивание из стека, переход иа f +jjjjjjjj при значении true вытолкнутой верхуш- верхушки Выталкивание из стека переход иа ii^256+ +jijjjjjj* ПРИ значении false вытолкнутой вер- верхушки. Посылка заявки на вычисления ФПН Посылка специальной заявки #Нн Вызов метода без параметров с использованием селектора сообщений, находящегося в области литералов под номером #iiii Вызов метода с одним параметром с использо- использованием селектора сообщении, находящегося в об- области литералов под номером фпИ Вызов метода с двумя параметрами с использо- использованием селектора сообщений, находящегося в области литералов под номером #iiii Указатель Стек стека * - Копирование Активный контекст Объект Рис. 4.14. Помещение в стек переменной экземпляра с номером i. (<=>) (от получателя к объекту) — еще один этап косвенного доступа, обусловленного наличием указателей объектов; (<—) — направление копирования данных; (♦-) — значе-, ние указателя (задается до начала выполнения команды); (« )—значение указате- указателя после выполнения команды. момент вызова метода. Область памяти для них выделяется в контексте. Работа данной группы команд, реализуемой байт* кодами 16—31, 128, показана на рис. 4.15.
170 Указатель стека . •• . -■ >!■■/.;.-. Л К я з mm- JtO> '■#■! .iiTVii? У;Г !'!:ч1 1 -• ,..1 Параметры Временные перемен- переменные Активный контекст; Локальный контекст Рнс. 4.15. Помещение в стек временибй переменной с номером i. Из рисунка видно, что активный контекст и контекст вызывающей программы различны. когда активный контекст является экземпляром контекста блока, и совпадают, когд« активный контекст является экземпляром контекста метода. ' 3) Проталкивание символов в стек. Символ — это селектор сообщения или константа с объектным указателем. По этой команде в стек проталкивается указатель, имеющийся в части символа. Действие этой команды показано на рис. 4.16. Она реализуется байт-кодами 32—63, 128. 4) Проталкивание в стек глобальной переменной, указывае- указываемой литералом. Область, в которую помещаются глобальные переменные, адресуется из области литералов. В данной коман- команде вначале определяется указатель области литералов, а затем производится помещение в стек значения глобальной перемен- переменной, размещенного в двух словах объекта, называемого связы- связыванием, на который указывает этот указатель. Работа этой груп- группы команд, реализуемой байт-кодами 64—95, 128, показана на рис. 4.17. 5) Засылка в переменную экземпляра-получателя значения, вытолкнутого из стека. В противоположность помещению в стек верхушка стека помещается в область переменных экземпляра- получателя. Содержимое стека перемещается вверх на один элемент. Данная функция реализуется байт-кодами 96—103,130. 6) Выталкивание из стека и помещение вытолкнутого значе- ния во временную переменную. Верхушка стека помещается в область временных переменных внутри контекста. Содержимое стека перемещается вверх на один элемент. Данная функция реализуется командами байт-кода 104—111, 130.
Архитектура Смолток-ориеитированного процессора 171 Указатель Стек стека ..J i Заголовок Область литералов Байт-программа Активный кс и те кет Рис. 4.16. Помещение в стек символа с номером i. Откомп илираванный метод 7) Проталкивание в стек специального значения. Команда помещает в стек следующие значения: значение получателя, true, false, nil, —1, 0, 1, 2. Реализуется байт-кодами 112—119. 8) Возврат из метода с возвращением специального значе- значения. Данная группа команд выполняет возврат из метода с воз- возвращением одного из специальных значений: получатель, true, false, nil. Вначале контекст, адресуемый из сегмента отправи- отправителя возвращаемого контекста, делается очередным активным контекстом, и в него помещается специальное значение. Функ- Функция реализуется байт-кодами 120—123. 9) Возвращение верхушки стека в качестве значения из ме- метода. Верхушка стека для выполняемого в данный момент кон- контекста принимается за значение и возвращается из метода. Это происходит либо при выполнении символа возврата "\" в мето- методе, либо при выполнении последнего оператора метода. Это аналогично выполнению оператора возврата, содержащегося в методе. Данная функция реализуется байт-кодом 124. 10) Возврат верхушки стека в качестве значения из блока. Верхушка стека контекста, исполняемого в данный момент, принимается за значение, возвращаемое из блока. Эта команда выполняется при выполнении оператора, для которого невоз; можен возврат после выполнения последнего оператора блока.
172 Глава 4 Указатель стека i г •■ ■ - ■ <■ Стек Активный контекст fez Метод 1 1 л^ 1 * '', Связывание парование i ,| «j ■< Заголовок Область литералов Байт - програ мма Откомпилированный метод Рис. 4.17. Помещение в стек глобальной переменной, адресуемой i-м лите- литералом. Возврат происходит в то место, откуда был активизирован блок. Эта функция выполняется командой 125 байт-кода. 11) Вызов метода с использованием селектора сообщения, находящегося в области литералов. Команда производит поиск селектора сообщения, начиная со словаря для класса получате- получателя. Если поиск успешен, то производится вызов соответствую- соответствующего метода. (На самом деле предусмотрен ускоренный метод поиска с использованием буфера методов.) Данная функция реализуется командами байт-кода: 131, 132, 134, 208—255. 12) Вызов метода из суперкласса с использованием селекто- селектора сообщения, находящегося в области литералов. Команда на- начинает поиск селектора сообщения суперкласса класса, в кото- котором определен выполняемый в данный момент метод. Данная функция реализована байт-кодом 133. 13) Выталкивание из стека и копирование верхушки стека. Команда выталкивания из стека делает его на один элемент меньше. Операция копирования состоит в помещении в стек зна- значения, равного верхушке стека. Эти функции реализуются байт- кодами 135, 136. 14) Помещение в стек активного контекста. Команда поме- помещает в поля текущего контекста значения регистров и затем
Архитектура Смолток-ориентироваииого процессора 173 помещает в стек указатель этого контекста. Команда реализу- реализуется байт-кодом 137. 15) Команды перехода и условного перехода. Реализуются байт-кодами 144—175. 16) Посылка заявки на вычисления. Команда реализует арифметические операции " + " и "—". Если получатель не явля- является целым числом, то выполняются действия, аналогичные обычной посылке заявки. Реализуется байт-кодами 176—191. 17) Посылка специальной заявки. В языке Смолток могут использоваться сообщения, реализованные как примитивы на языках, внешних по отношению к языку Смолток. Среди них. есть такие списочные операторы, как at:, at:put: и т. д. Данная, функция реализуется байт-кодами 192—207. v 'I :: xi4. . : * , ■!< j v, r >j* Й * My И' I ' '^J » 3' * '■' "> 'f'r о . - н^к, #5* ft к.»» ,» •.-•ц!*'ч4.Л Р " \r •*%. л'ft fbirnS ft Г ' • '*•'/, IK i. i /u /j»
•.•-''■; hoy-, я ■-•■■-■•л. n • Реализация •■■*. •■■• • '-П i Смолток-ориентированной MAOtHfllU «КатаН№» :*'.> Oil .'; |(J ,/,£ Описанная в гл. 4 виртуальная Смолток-машина, реализуется на спроектированном нами микропроцессоре «Катана». Она полностью совпадает с описанной в литературе машиной для языка Смолток-80. На основе этой виртуальной машины прово- проводится детальное проектирование микропроцессора «Катана».. Благодаря этой работе удается создать действующую Смол- ток-80-машину, в точности повторяющую ее виртуальный вари- вариант, задуманный первоначально. При этом обеспечиваются про- программная совместимость и технологическая инструментальная среда разработки программ. В данной главе описывается реа- реализация микропроцессора «Катана», который разрабатывается группой, руководимой автором. 5.1. Принципы проектирования Смолток-80 является объектно-ориентированным языком, а Ка- Катана — вычислительной машиной, спроектированной с целы» быстрого выполнения записываемых на этом языке операций. Поэтому все механизмы процессора рассматривались в первую- очередь с точки зрения того, какую роль они могут сыграть в скоростном выполнении операторов Смолтока-80. Самой известной машиной для объектно-ориентированных языков является модель Интел-432. Основным различием в- принципах проектирования модели Интел-432 и модели Катана является то, что в модели 432 сложные операции реализованы аппаратным путем, а в Катана — программным. В частности,, таким образом решается проблема компилятора. В процессоре «Катана» аппаратное хозяйство максимально упрощено и пред- предприняты усилия по ускорению главного машинного цикла. При- Примером того, как в рамках этих принципов упрощается аппарат- 174
\ Реализация Смолток-ориентированиой машины Катана 17S мое обеспечение и усложняется программное, может служить управление микроподпрограммами. При этом любая микроко- микрокоманда становится командой-подпрограммой, а адрес, следую- следующий за адресом выполняемой в данный момент микропрограм- микропрограммы, помещается в регистр возврата, по нему и происходит вет- ветвление. Обычно очередной адрес формируется путем прибавле- прибавления единицы к текущему адресу. Однако при этом требуется «ще один сумматор, что по ряду причин неинтересно. Если го- говорить о том, какие приемы применены в процессоре «Катана», то, например, все команды-подпрограммы размещены по чет- четным адресам. В результате все адреса возврата являются не- нечетными числами и формируются путем занесения единицы в младший разряд текущего адреса. Благодаря этому удается реализовать режим команд-микроподпрограмм без привлечения лишней аппаратуры. Платить за это приходится размещением команд микроассемблера, однако стоимость аппаратного обес- обеспечения значительно выше стоимости программного. Проявления этого подхода можно наблюдать в ряде проект- иых решений микропроцессора «Катана». 5.2. Архитектура микропроцессора Для изложения семантики микрокоманд необходимо рассмот- рассмотреть микрокоманды на уровне пересылки между регистрами. Поэтому необходимо рассмотреть регистры и другие механизмы для информационного тракта. --j_ , 1 5.2.1. Информационный тракт Информационный тракт (data path) складывается из регистров, путей межрегистрового обмена (шин) и различных операцион- операционных элементов над ними. Информационный тракт показан на рис. 5.1. АЛУ (ALU) выполняет унарные и бинарные арифметиче- арифметические и логические операции. Большинство данных содержится в регистрах-файлах. При выполнении бинарных операций из регистров-файлов берутся два операнда, над ними выполняется бинарная операция, и результат снова помещается в регистр- файл. Однако поскольку регистр-файл имеет единственный вход, то для выполнения операции в таком виде затрачиваются три машинных цикла. Если написать микропрограмму, выполнение которой всегда позволяет держать в регистре верхушку стека, то эту операцию можно будет выполнять за один машинный цикл.-- ~,^.v-... , , . ..,.,
да» iwun: - son; Глава 5 / . .-•.' RSEL I.--; f RSEL S 64 слова no DateCurSeg CodeSegj R S1! слова no 16 Сегмент -RSEL RSEL BS ,16 \Регистр сдвига на 1разряд\ устройство Вайт-оВмена\ Рис. 5.1. Информационный тракт. Регистр-файл. Процессор «Катана» построен на МОП-схе- МОП-схемах. В МОП-схемах вычисления и передача данных внутри од- одного чипа выполняются быстро, однако передача данных за пределы чипа выполняется медленно и требует большого расхо- расхода энергии. Чтобы создать быстродействующий процессор, не- необходимо, чтобы данные не выходили за пределы чипа. Для этого на чипе желательно иметь много регистров, и на этих ре- регистрах выполнять операции. На машинах с большим количеством регистров последние делятся на несколько групп в зависимости от их числа. В случае
Реализация Смолток-ориеитяроваииой машины Катана 177" если их несколько десятков, их обычно делают регистрами об- общего назначения и операции процессора выполняют с помощью межрегистрового обмена. Большая часть микропроцессоров,, имеющихся в продаже, работает по этому принципу. С росто» числа регистров до нескольких сотен одни из них можно ис- использовать в качестве стека, другие — в качестве буфера. Мы используем большое количество регистров в качестве регистр- файлов для организации стеков и регистров общего назна- назначения. Для упрощения конструкции чипа следует максимально уп- упростить геометрическую структуру трассировки на нем. Умень- Уменьшение сложности монтажа позволяет снизить площадь монта- монтажа, а также площадь чипа. Для снижения площади монтаж» можно уменьшить количество общих шин, однако при органи- организации большого количества специализированных регистров чис- число общих шин неизбежно растет. Поэтому в процессоре «Ката- «Катана» их размещают в создаваемых по мере возможности специа- специализированных регистрах-файлах. Регистр-файл микропроцессора «Катана» состоит из 128 слов* (по 16 разрядов) и делится на две части: S-стек, R-группу ре- регистров общего назначения с прямым доступом. Не все регист- регистры группы R работают одинаково. Первые 8 слов образуют ре- регистр сегментов. Его выход, как и у других регистров, поступа- поступает на общую шину процессора и одновременно в устройство па- памяти в качестве адреса сегмента. За один цикл в группе R можно осуществить только одну выборку на запись или на чте- чтение. Выборка регистра из группы R выполняется через сегмент RSEL микрокоманды. Группу S используют в качестве стека.- При использовании процессора «Катана» для реализации язы- языка Смолток-80 группа S используется для буферизации несколь- нескольких верхушек стеков. Контекст метода. Доступ к регистрам S осуществляется че- через указатель стека. В общем случае по одной команде можно либо осуществлять запись в место, указываемое указателем, стека, либо чтение из него. Одновременно с этим к значению указателя стека можно прибавлять или вычитать из него не- небольшое число. Имеются гри типа указателей стека: FP, ТР„ SP. Это позволяет реализовывать языки, в которых аналогична языку Смолток имеются временные переменные методов кон- контекста и стеки для операций. При реализации языка Смолток. в указателе FP, как правило, приводится заголовок активного контекста (находящегося в самой верхней части группы S). Указатель ТР используется для доступа к временным перемен- переменным. SP является указателем верхушки стека для вычислений (на самом деле верхушка стека размещается в буфере в регист- регистре Т, a SP указывает на один элемент ниже верхушки стека. В верхней части группы S также хранится значение верхушки. 12—1428
*78 . •: . ',-' :,:"•:• • ■ iisi>. Глава 5 Л-.-..-лО ^'lv-.^\-.-"s\ В ТР помещается сумма значения FP и малой константы. Это значение используется для доступа к стеку). В процессоре «Катана» группы S и R вместе находятся в одном регистре-файле. Поэтому каждый раз должна использо- использоваться какая-нибудь одна из них. Сегментный регистр. Поле адреса занимает от 20 до 32 раз- разрядов. В то же время разрядность общей шины составляет 16. В связи с этим предусмотрен сегментный регистр. В нем из об- общего числа 32 разрядов зарезервировано 16 старших разрядов. При обращении к основной памяти 16 разрядов сегментного ре- регистра и 16 разрядов, занесенных в переменную MAR, следуют .друг за другом и образуют 32 разряда. Скорость обращения к •основной памяти является главным фактором, характеризую- характеризующим в целом всю систему. Поэтому необходимо по возможности повышать скорость доступа к сегментному регистру. Кроме того, поскольку при выполнении одной микрокоманды происходит об- обращение к нескольким сегментам, необходимо обеспечить быст- быстрое переключение сегментных регистров. В процессоре «Катана» 8 регистров регистрового файла ис- используются в качестве сегментных регистров, и при обычном выполнении программы для выдачи адреса сегмента выбирает- <я один из них. Логика выбора сегментного регистра показана на рис. 5.1. Выход с восьми сегментных регистров выдается через мульти- мультиплексор. Управление им осуществляется с помощью двух трех- трехразрядных регистров: DataCurSeg и CodeSeg. При выполнении команд обращения к основной памяти Fetch и Store управление мультиплексором осуществляется через регистр DataCurSeg. При обращении к командам байт-кода управление мультиплек- мультиплексором осуществляется через регистр CodeSeg. Преобразование значения регистра DataCurSeg необходимо также выполнять с большим быстродействием, однако, посколь- поскольку оно заносится сюда из сегмента RSEL микрокоманды, пре- преобразование значения регистра DataCurSeg можно выполнить внутри микрокоманды, аналогичной командам Fetch и Store. При загрузке нового значения в сегментный регистр значе- значение сегмента RSEL, используемое при выборе сегментного ре- регистра, непосредственно заносится в регистр DataCurSeg. Та- Таким образом, с помощью одной команды устанавливается зна- значение сегментного регистра и начинается команда основной па- памяти. Блок сдвига. В процессоре «Катана», как и в других процес- процессорах, используемых в качестве эмуляторов языков высокого уровня, блок сдвига используется для реализации операций ум- умножения и деления, выполнения команд сдвига, декодирования команд байт-кода, кодирования и декодирования данных. ..I a
Реализация Смолток-ориентированной машины Катана В частности, если необходимо извлечь или подставить зна- значение отдельных сегментов слова, то для этого удобно исполь- использовать групповой регистр сдвига. Это устройство позволяет за один машинный цикл осуществить сдвиг слева направо на лю- любое количество разрядов. Процессор «Катана» с самого начала проектировался с рас- расчетом на групповой регистр сдвига. Однако при написании микропрограмм стало ясно, что использовать его не удастся по- последующим причинам. Прежде всего при выполнении операций умножения и деле- деления необходим сдвиг лишь на один разряд слева направо. Хот», иногда и требуется сдвиг на 17 разрядов, включая разряд пе- переноса, групповой регистр сдвига для этой цели неприменим,. и сдвиг на 17 разрядов необходимо осуществлять с помощью- специальных средств. Частота выполнения команды сдвига чрезвычайно низка,. и даже при выполнении сдвига в цикле по одному разряду это не оказывает особого влияния на эффективность. В декодировании команд байт-кода нет необходимости, по- поскольку осуществляется предварительная диспетчеризация па 256 ветвям относительно начального байта. Продолжений ко- команд дальше второго байта почти не встречается, а если и встречаются, то диспетчеризация с маскированием выполняется быстрее, и необходимость в групповом регистре сдвига отпа- отпадает. Необходимости в декодировании данных, по крайней мере в системе Смолток-80, не возникает. Если имеются типы под- поддиапазонов, как, например, в языке Меза, то их можно выра- выразить через младшие разряды. При этом в языках, реализующих почти оптимальную упаковку внутри записи, групповые регист- регистры сдвига почти не используются. В языке Смолток сложное кодирование для данных общего вида осуществляется в виде последовательностей символов и данные заносятся лишь по- побайтно. В остальных же случаях имеются таблицы объектов и; заголовки методов. Стало ясно, что для них маскирование и пе- передача управления дают достаточно хорошее время реакции. Поэтому в конце концов везде применены регистры сдвига на один разряд и устройство байт-обмена на сетке в 17 раз- разрядов. В регистре сдвига на 1 разряд сдвиг проходит всего через- один транзистор, что обеспечивает простоту и большое быстро- быстродействие. Пример приводится на рис. 5.2. На нем показан сдви- сдвиговый регистр, осуществляющий сдвиг влево и вправо на один разряд со входом и выходом на 4 разряда. Справа поступают управляющие сигналы. При поступлении сигнала lshl проис- происходит сдвиг на один разряд влево, а при поступлении сигнала 12»
180 Главп 5 rshl —на один разряд вправо. При сдвиге на один разряд вле- влево самый левый разряд входного слова записывается в регистр флага. При этом предыдущее значение регистра флага записы- записывается в крайний правый разряд выходного слова. Регистры памяти. Для связи с внешними устройствами па- памяти в тракте прохождения данных используются два типа ре- регистров: MAR и MD. В регистр типа MAR (адресный регистр) помещаются адреса, посылаемые в устройство памяти. Регист- Регистры типа MD (регистры данных) используются для пересылки данных устройству памяти. При чтении данных из устройства «амяти в адресный регистр вначале загружается результат операции в АЛУ. Одновременно с этим посылается команда Вход Выход Рис. 5.2. Регистр сдвига на 1 разряд. ^shl —сигнал сдвига на один разряд влево, rshl —сигнал сдвига на один разряд вправо. FETCH, и, таким образом, данные помещаются в регистр дан- «ых за два цикла. При записи данных в адресный регистр по- помещается результат из АЛУ и одновременно с этим посылается «оманда Store. Перед началом цикла значения, содержащиеся « адресном регистре, посылаются в устройство памяти. 5.2.2. Микрокоманды Микрокоманды представляют собой слова по 39 разрядов. <>ормат микрокоманды показан на рис. 5.3, а ниже приводятся пояснения по каждому из сегментов микрокоманды. 1) RSEL. Функциями сегмента RSEL являются выбор ре- систра внутри регистрового файла, выбор указателя стека и RSEL ALUF BS Fl F2 LL LT NEXT (?) D) D) D) E) A) 11) A3) 5.З. Формат микрокоманды.
Реализация Смолток-ориентированной машины Катана 181 наращивание его значения, выбор сегментного регистра, а так- также генерация констант. В случае когда сегмент BS указывает на область R, происходит выбор одного из 128 регистров в ре- регистровом файле. В случае когда BS указывает на область S, два правых разряда сегмента RSEL задают выбор одного из указателей стека, а затем по значению выбранного указателя •стека осуществляется доступ к области S. При этом если два младших разряда равны нулю, FP=1, TP = 2, то происходит выбор SP. Кроме того, сегмент RSEL используется, когда сег- сегмент F1 указывает на микрокоманду прибавления небольшого числа к указателю стека. В этом случае два правых разряда задают выбор указателя стека, а пять левых разрядов указы- указывают прибавляемое число. При выполнении микрокоманды за- занесения значения в текущий сегмент, указываемый сегментом F2, три правых разряда задают выбор сегментного регистра, а левый разряд в случае, если он равен единице, — сегмент DataCurSeg, а если он равен нулю, — сегмент CodeSeg. Кроме того, если сегменты F1 или F2 определяют команду выдачи константы, то разряды сегментов RSEL и BS конкатенируются, {соединяются) и в виде константы выдаются в общую шину. 2) ALUF. Сегмент ALUF указывает функцию АЛУ. Он мо- может принимать значения 0—15. При этом выполняются сле- следующие микрокоманды: 0:Bus —передача результата вычисления АЛУ в общую ' "' ■ " . шину. 1: Т >,. —загрузка регистра Т: если сегмент LT приии- ■'-' мает значение 1, то в Т после выполнения цикла загружается значение общей шины, в -Ч■■'•■•' других случаях — результат вычисления, вы- /; . полненного в АЛУ. ч! i —передача в общую шину дополнения до еди- единицы результата вычислений в АЛУ. 2: NOT Bus 3: Bus OR T 4: Bus ANDT 5: Bus+F2 6: BusXORT 7: Bus+1 8: Bus—1 9: Bus+T 10: Bus—T '" 11: Bus+T+1 12: Bus—T—1 13: Bus+flag 14: T—1 o» 16: T+l — (F2 представляет собой значение F2.) jjti • •v;<6Ut: — (flag представляет собой одноразрядный ре- гистр; взводится командой условного перехо- ' да.)
182 L/i k!4;-L>.i>M I'll Глава 5 0: None 1: : =S 2: : = 3: :=L ■''». Xit ■■. ;л.,я,-). 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: R S = StackP«Jit.'. ЛЛМЛ'- :=L 'ч>! •-) \i ■','!. ■-■■■ :=L .-;:;:6> StackP : m]f, , , : : R = IR t. RflilM = MPC ,,--,,, =r £:';' :=MD!'" S : =MD 3) BS. Сегмент BS представляет собой указатель источник» информации для общей шины. Кроме того, если F1 и F2 ука- указывают на выполнение микрокоманды выдачи константы, то сегмент RSEL и сегмент BS конкатенируются, и полученное значение выдается как значение константы в общую шину. Функции сегмента BS следующие: —значение в общую шину не поступает. —на основании значения RSEL выбирается ука- затель стека, и значение в общую шину посту- пает из регистра области S, указываемого зна- ченнем этого указателя. — источником информации в общую шину явля- является регистр данных MD. — источником является L. — если значение сегмента RSEL=O, FP=1, TP=» =2, то источником является SP. — в регистр R заносится содержимое L, при этом в общую шину поступает значение L- — в регистр S загружается содержимое L, в об- общую шину также поступает содержимое L — в указатель стека, определяемый сегментом RSEL загружается значение L. При этом в об- общую шину также поступает содержимое L. — не используется. — в общую шину поступает значение регистра команд IR. — в общую шииу поступает значение счетчика* адреса микрокоманд МРС. — в общую шину поступает значение регистра R. — в регистр R загружается значение регистра данных MD, в общую шину поступает значе- значение L. — в регистр R загружается значение регистра данных MD. В общую шииу поступает зна- значение L. — значение регистра данных MD загружается * указатель стека. В общую шииу поступает значение L. —в общую шину поступает значение счетчика адреса команд программы байт-кода. 4) F1. Сегмент F1 указывает на выполнение различных спе- специальных команд. ■p» 14: StackP : =MD ! и- 15: : =BIC 0: Noop J: L=0? й'-Э- т-проверка, является ли значение L в конце ■$""Н8моа микроцикла нулем или иет. Если оио равно- -■""- ' , нулю, то регистр-флаг устанавливается в еди- единицу, если оио равно единице, то он устаиав- ливается в нуль. . j
Реализация Смолток-ориеитироваииой машины Катана 183 2: Fetch: •3: Fetch Double : = A: Store: - 4: TP:=StackP(RSEL<5 «: StackP(R9EL<5:6»:- КГ.' HT.tO 7—9 " ' ' Л:' 10: BIC 11: [5:15]:=RSEL:BS 12: [0:10]:RSEL:BS 13: Byteswap ;, 14: Ishl with flag «S: rtbl — загрузка в адресный регистр MAR, начало цикла выполнения микрокоманды Fetch. — загрузка в адресный регистр, начало выполне- выполнения микрокоманды FetchDouble. — загрузка в адресный регистр MAR, начало вы- выполнения цикла Store. :6»+RSEL<0:4> — прибавление к значению указателя стека, за- задаваемого двумя крайними правыми разряда- разрядами сегмента RSEL, значения левых пяти край- крайних разрядов сегмента RSEL и посылка ре- результата в ТР. StackP(RSEL<5 :6»+RSEL<0 : 4> — два крайних правых разряда сегмента RSEL задают указатель стека, являющийся как опе- операндом, так и результатом данной вычисли- вычислительной операции. Левые пять разрядов сег- сегмента RSEL являются прибавляемой констаи- той RSEL<0> является знаковым разрядом, ■'!'' поэтому можно прибавлять константы от —16 до 15. к- — ие используются. — загрузка в В 1С значения общей шины. — помещение в разряды 5—15 общей шины один- одиннадцати разрядов, получающихся конкатена- конкатенацией сегментов RSEL и BS. При этом в раз- разряды 0—4 заносятся значения, равные значе- 4 нию разряда 5 (двоеточие обозначает конкате- конкатенацию разрядов). ,; —помещение в разряды 0—10 общей шины И ''' разрядов, полученных конкатенацией сегмен- сегментов RSEL, в разряды 11—15 заносятся нули. — обмен местами левого и правого байтов ре- результата вычислений в АЛУ. — циклический сдвиг влево на один разряд 17-разрядного слова, полученного конкатена- конкатенацией результата вычислений в АЛУ с регист- регистром флажка. Значение крайнего левого разря- 1 да результата АЛУ помещается в регистр флага. — циклический сдвиг вправо на один разряд 17-разрядного слова, полученного конкатенаци- конкатенацией результата вычислений в АЛУ с регистром флага. Значение крайнего правого разряда ре- результата АЛУ помещается в регистр флага. **■ 5) F2. Сегмент F2 указывает на выполнение специальных команд. С помощью сегментов F1 и F2 реализуется значитель- значительная часть параллельной обработки. О: Noop I: L=0? Лы» — эта команда общая для Fl a F2; поскольку она часто выполняется.
184 Глава 5 -Л; 2: Bus=O? . ■■■•- - ; 3: L<0? 4: ALUOdd? 5: ALUCarry?. 45: ALUOverFlow? —присвоение регистру флага значения 1, если значение общей шины равно 0, и 0 — в осталь- ных случаях. —установка регистра флага в 1, если значение L в конце выполнения микроцикла отрицательно и 0 в остальных случаях. — установка регистра флага в 1, если в данном цикле значение результата АЛУ оказываете* нечетным, и в 0, если оно оказывается четным. —присвоение регистру флага значения 1, есл» при выполнении данного микроцикла в резуль- тате вычислений возникает перенос, и значени» 0, если переноса не возникает. —присвоение регистру флага значения 1, если в результате выполнения данного микроцикла /- возникает переполнение, и значения 0, есл» переполнения не возникает. —задание адреса очередной команды дизъюнк- дизъюнкцией значений сегмента NEXT следующей команды и общей шины. Адрес используется- при передаче управления. На самом деле вет- ветвление осуществляется после следующей ко- команды. — загрузка в регистр данных MD значения об- щей шииы. —передача управления команде по адресу 1025 при возникновении внешнего сигнала прерыва- прерывания (PWR находится на верхнем уровне). (PWR — сигнал запроса на запуск процесса — ЗЗП.) —проверка того, помещен ли результат выполне- выполнения команды Fetch в регистр данных MDR (выполняется прн асинхронном вводе). [5:15]:=RSEL:BS [0:10]:=RSEL:BC Current Segment(RSEL<3>) : =R[RSEL<4 : 6>] — переключение мультиплексора сегментных ре- гистрои. Если RSEL<3>=1, то значение получа- получает сегмент DataCurSeg, если RSEL<3> = 0, то — сегмент CodeSeg. Разряды 4—6 сегмеи- ,, та RSEL указывают присваиваемое значение. '.'., —возврат из программы обработки прерывания. ч —возврат из подпрограммы. —запрет на переключение процессов. 1 —проверка значения переключателя процессов при передаче управления очередной команде байт-кода. —присвоение значения 0 регистру флажка.Т!:"-дп:* —присвоение значения 1 регистру флажка.": V.Z'A -RSEL •■•-'««• — запись значения, задаваемого сегме RSEL, в таблицу передачи управления ;p , • команд. ._ ~ .1 Л " 1^^-fle используется. 8: MD : = ■ 9: Interrupt Enable 10: DataReady? 11: 12: 13: 14: Interrupt Return 15: Return 16: ProcessSwich: =0 17: ProcessSwitch : = 18: flag : =0 ^ г, 19: flag : = 1 * • .20: SwitchMicrocode
Реализация Смолток-орйеитироваиной машииы Катаиа 18S 22: BICLow : =flag ■• —заполнение младшего разряда счетчика адре- .. „ сов команд (счетчик адресов команд для -", ' программ байт-кода должен иметь 17 разря- разрядов. Поэтому за одну команду его целиком ;' ~ " заполнить не удается. По команде В1С:=, за- v | - даваемой сегментом F1, информация, опреде- ," ( , ляемая сегментом BS, загружается в 16 стар- 1 ' • ' ' ших разрядов счетчика адресов команд, а по . • ; ■■'.-"-■''■■ данной команде — в его младший разряд. По- Поскольку в этом одном разряде часто оказыва- , i .;■•■, . ,;■; ется результат циклического сдвига, операндом , ... ..j,,.. этой команды сделан регистр флажка). 23: flag=BICl,<OT, ■» ,л. —присвоение регистру флажка значения младше- nv.fi t ..<>.< г0 разряда счетчика адресов команд програм- ■**'■- с>> . ' мы — байт-кода (в противоположность преды- ь \ ;■:,.. дущей команде). 24: PWR? - — проверка, находится лн значение сигнала PWR '-. -• -. запроса на запуск процесса на верхнем уровне (см. команду Interrupt Enable, п. 9 для сегмен- сегмента F2). '25: Test PWR and Set PWRAck — проверка сигнала PWR запроса на запуск процесса. Если он находится иа верхнем уров- уровне, то взводится регистр флажка. При этом, сигнал PWRAck тоже переводится на верхний. -•"• :: ':..;->•>. ; :! уровень. 6. LL. Сегмент LL указывает, требуется ли загружать ре- результат вычисления АЛУ в регистр L (LL=1) или нет (LL = 0) (сегмент LL состоит из одного разряда). 7. LT. Сегмент указывает, выполняется ли загрузка регист- регистра Т или нет. Информация для загрузки в регистр Т берется либо из общей шины (при ALUF=1), либо (если это не так) из АЛУ. 8. NEXT. Сегмент NEXT указывает на очередную считывае- считываемую микрокоманду. На самом деле адрес, по которому должно происходить считывание, зависит от состояния управления.-:- * к к Л 5.2.3. Команды памяти и! Имеются следующие команды блока памяти. 1) Fetch. При выполнении этой команды результат работы АЛУ заносится в адресный регистр MAR и начинается цикл работы блока памяти. 2) Store. Информация, занесенная в регистр данных MD с помощью этой команды или ранее, записывается в блок па- памяти. 3) FetchDouble. Внешняя информация для микропроцессора «Катана» размещается в 16-разрядных словах. Поэтому данная команда используется для доступа к более длинным C2-раз- C2-разрядным) словам. Она особенно эффективна для доступа к дан-
186 Глава 5 ным объектов. Если задаваемый адрес является четным числом, то второе слово берется по нечетному адресу, если нечетным числом, то второе слово будет тем же самым. 4) : = Щ. По команде чтения IR читается байт, указываемый счетчиком адреса команд программы байт-кода, и к счетчику прибавляется единица. Если результатом сложения является четное число, то счетчик начинает указывать на новое слово,, и начинается выполнение команды fetch. 5) Branch 0. Команда перехода по нулевому адресу (NEXT=0) запускает передачу управления командам байт- кода. К счетчику адреса команд байт-кода прибавляется едини- единица, и если результатом является четное число, то счетчик начи- начинает указывать на новое слово, и запускается команда fetch блока памяти. 6) В1С: = . Если в счетчик адресов команд BIC заносится значение, то обязательно начинается выполнение команды fetch блока памяти, и в регистре команд IR готовится новая команда байт-кода. Поэтому перед занесением значения в BIC должна быть выполнена команда занесения значения в BICLOW. Последовательность выполнения команд обращения к памя- памяти. Блок памяти работает синхронно. Такой тип работы блока памяти был выбран для того, чтобы ускорить к ней доступ. В частности, в объектно-ориентированных языках объем обра- обращений к памяти велик, и поэтому быстродействие обращения к памяти определяет быстродействие системы в целом. В таких специализированных микропроцессорах детальная проработка ограничений на возможности блока памяти не играет особой роли. По этим причинам и была выбрана синхронная организа- организация работы блока памяти. При синхронной организации важное значение приобретает последовательность выполнения команд. На основе информа- информации о том, когда данные поступают из блока памяти, должна быть написана безошибочная микропрограмма. Последователь» ность выполнения микрокоманд приводится ниже . 1) FETCH f'| FETCH:= „; ■X! <ОР> - - КОМАНДА, НЕ СВЯЗАННАЯ С БЛОКОМ ПАМЯТИ ' :=MD--3T0H КОМАНДОЙ НАЧИНАЕТСЯ ЦИКЛ ОБРАЩЙ* ' CfM - - НИЯ К ПАМЯТИ ' STORE: =,MD:= <Л fijOD^ <Op> -. КОМАНДА, НЕ СВЯЗАННАЯ С БЛОКОМ ПАМЯТИ KSHHSr <ОР>--ЭТОИ КОМАНДОЙ НАЧИНАЕТСЯ СЛЕДУЮЩИЙ -fBq-St --ЦИКЛ ОБРАЩЕНИЯ К ПАМЯТИ М SP*#TCHDOUBLE — >-.....■;-,, + . • ...... *<> :. - -.-•- , .<•<
Реализация Смолток-ориентнроваиной машины Катана 187 FETCHDOUBLE: = <ОР> :=MD,--ЗДЕСЬ НАЧИНАЕТСЯ ОБРАЩЕНИЕ К НАЧАЛЬНО- - - МУ СЛОВУ :=MD--ОБРАЩЕНИЕ КО ВТОРОМУ СЛОВУ. ЭТОЙ КОМАН- - - ДОИ НАЧИНАЕТСЯ ОЧЕРЕДНОЙ ЦИКЛ 4) :=IR : = IR <ОР> <ОР> - - ЗДЕСЬ НАЧИНАЕТСЯ ОЧЕРЕДНОЙ ЦИКЛ ПАМЯТИ 5) BRANCHO BRANCHO <ОР> <ОР> - - ЗДЕСЬ НАЧИНАЕТСЯ ОЧЕРЕДНОЙ ЦИКЛ ПАМЯТИ ОТСЮДА ВИДНО, ЧТО МИКРОКОМАНДАМИ ПЕРВОГО ЦИКЛА ИС- ИСПОЛНЕНИЯ байт-команд не начинается цикл обращения К ОСНОВНОЙ ПАМЯТИ <6) В1С: = В1С:= ■' <ОР> <ОР> - - ЗДЕСЬ НАЧИНАЕТСЯ ОЧЕРЕДНОЙ ЦИКЛ ПАМЯТИ S.2.4. Доступ к байт-программе В данной вычислительной системе принята побайтная адреса- адресация команд байт-программы. Область памяти для программ, как и другие области памяти, содержит 65 К слов, т. е. 128 Кбайт. Поэтому счетчик адресов команд для адресации такой области содержит 17 разрядов. Однако, поскольку все внешние шины данных имеют 16-разрядное слово, операции за- загрузки и засылки при работе с 17-разрядным словом имеют ■определенные особенности. Поэтому для организации счетчика адресов команд байт- программы используется 16-разрядный счетчик BIC и одно- одноразрядный счетчик BICLow. Они вместе как раз и дают требуе- требуемые 17 разрядов. Область памяти, занимаемая программой, определяется сег- сегментным регистром, указатель на который помещается в ре- регистр CodeSeg. Эти связи показаны на рис. 5.4. 16-разрядное слово, содержащее байт-команду, всегда счи- тывается в регистр, называемый буфером. Содержимое буфера представляет собой само слово из области памяти, задаваемое сегментным регистром, на который указывает содержимое ре- регистра CodeSeg, а также адресом, определенным в регистре счетчика адресов команд BIC. Регистр BICLow указывает на
Глава 5 sUr~ АЛ'/ J ,.; -■ • ^ ;.■ нт- --у. Сегментный регистр BIC □ BICLow(l U 1" 9 — 7~ _.,„ ) | CodeSeg • i •! . 3. 16 16 -•' > '. - £w&? адреса. команды Рис. 5.4. Регистр адресов байт-комаид. то, какой из двух байтов в буфере будет считываться следую- следующим (рис. 5.5). При выполнении команды BranchO или : = Щ байт, опреде- определяемый содержимым регистра BICLow, посылается в общую шину. К 17 байтам, получаемым конкатенацией BIC и BICLow, прибавляется единица, и если при этом новое значение BICLow оказывается равным нулю, то выполняется цикл об- обращения к памяти, и в буфер считывается одно слово. .. . 5.2.5. Организация управления ' ' В данном разделе описывается алгоритм, определяющий то, по какому адресу должна считываться очередная выполняемая микрокоманда. 1. Последовательное выполнение. При последовательном выполнении адрес микрокоманды, ко- которая должна считываться в текущем цикле, берется из сегмен- сегмента текущей микрокоманды (рис. 5.6). 2. Условное ветвление. Микрокоманды условного ветвления определяют, идти на следующую микрокоманду или нет. При выполнении этих мик- микрокоманд регистр флажка устанавливается в единицу, а если нет, то в нуль. При этом значение регистра флажка заменяет крайний правый разряд сегмента NEXT считываемой в данный момент микрокоманды. Таким образом, условное ветвление осу- осуществляется с запаздыванием на одну микрокоманду. Запаз-t
Реализация Смолток-ориентнрованной машины Катана 18» BICLow В общую шину 1 „ От внешней памяти ' Buffer ;:' _j Рис. 5.5. Структура буфера байт-комаиды. дывание при условном ветвлении показано на следующем при- примере. ALUCARRY?; - - КОМАНДА УСЛОВНОГО ПЕРЕХОДА NEXT=I-1 --B ЭТОЙ КОМАНДЕ УСЛОВНОГО ПЕРЕХО- - - ДА НЕТ , F1: --ЕСЛИ НЕТ ПЕРЕНОСА, ТО ВЫПОЛНЯЕТСЯ ЭТА КОМАН- --ДА F1 + 1: --ЕСЛИ ЕСТЬ ПЕРЕНОС, ТО ВЫПОЛНЯЕТСЯ ЭТА КОМАН- --ДА | ;;' Здесь F1 является нечетным адресом (рис. 5.7). ( 3. Вызов подпрограмм. В микропроцессоре «Катана» вызов подпрограмм разреша- разрешается на глубину до одного уровня. На самом деле при вызове- подпрограммы должен быть выполнен вызов подпрограммы, внутри микрокоманды. Однако, если сформировать специаль- специальную микрокоманду вызова подпрограммы, то при этом умень- уменьшатся количество встроенных микрокоманд и, следовательно,, быстродействие. Поэтому сделано так, что если 4 крайних пра- правых разряда сегмента NEXT представляют собой число 0001, то- вызов подпрограммы происходит автоматически. При выполнении команды вызова подпрограммы следующая микрокоманда генерируется обычным образом, а адрес возвра- возврата загружается в регистр с наименованием RETURN. При этом1- адрес возврата, как уже отмечалось, является логической сум- суммой текущего адреса и единицы. Такой способ связан с настой- настойчивыми усилиями по созданию быстродействующего микропро- микропроцессора путем снижения объема необходимого оборудования. Поэтому существуют ограничения на расположение команд вызова процедур. Команды вызова процедур должны находить- находиться по четным адресам, а следующие за ними микрокоманд!*
190 Глава 5 тг.омЭ rhjjue: £<з'\~- Цикл MIR Цикл Микро - програм- программная па- память MIR  1 NEXT Ряс. 5.6, Нормальная последовательность выполнения микрокоманд. -Н' .0" эн<--- 4i.,;i;uiV Цикл M1R Микpo- Микport роце с- сорная па- память Цикл ч MIR lit - 41 ■ !.;ПП -.>!"/) • •:ч •■ v iU! КОС до ■ ;■;; 10! ЛШСаггу ? 1 NEXT=b ■-. i "^ NEXT=a NEXT Carry = b| 1 | С' ■' г ■ ■:Я < г.:. ■ ': [ /Л- ;i Выполнение команды ALUCarrv ? л з Выполиеш! команды по адресуй gt» t> > I ' ' , Г-/ K7' Выполнение команды по адресу Ъ или ь +1 (зто и есть ветвление) . i i / 1 С Г( Ш / л; ' 'Л if 1ST • с г Рис. 5.7. ШИВ. , Последовательность выполнения микрокоманд при условном ветвле-
Реализация Смолток-ориеитированиой машины Катана 191 (т. е. микрокоманды, выполняемые после возврата из вызван- вызванной процедуры) — по адресу вызывающей команды +1. Такию образом, точка входа подпрограммы должна находиться по ад~ ресу, дающему 1, если его поделить на 16. 4. Диспетчеризация. Организация ветвления более чем по двум направлениям на- называется диспетчеризацией. При выполнении команды NEXT: = NEXT OR Bus выполняется дизъюнкция между значе- значением общей шины и значением сегмента NEXT прочитанной микрокоманды. Ее результат и является адресом, по которому должна считываться очередная команда. Так, реализуется дис- диспетчеризация. Аналогично условному переходу ветвление про- происходит с запаздыванием на одну команду. 5. Диспетчеризация в байт-программе. Диспетчеризация в байт-программе выполняется командой диспетчеризации по значению регистра команд IR в момент пе- перехода к заголовку микропрограммы, интерпретирующей! байт-код. Диспетчеризация байт-программы происходит тогда, когда» значение сегмента NEXT равно нулю. (На микроассемблере это- записывается в виде BranchO.) При диспетчеризации байт-про- байт-программы запаздывания в ветвлении не происходит. Поэтому вы- выполнение микрокоманды, соответствующей новой команде байт- кода, начинается сразу из команды, следующей за командой BranchO. При этом указателем выбранной ветви, т. е. адресом заголовка микрокоманды, исполняющей очередную байт-коман- байт-команду, является 10-разрядное слово, являющееся конкатенацией двухразрядного регистра, называемого SwitchMicrocode, и вось- восьмиразрядного регистра команд IR. Поэтому для байт-команд допустимы точки входа микропрограммной памяти с адресами О—1023. Среди них могут находиться четыре различных набора команд (рис. 5.8). Однако в двух случаях диспетчеризации в командах байт- программы прямого перехода в точку входа не происходит. Во- первых, когда имеется сигнал PWR запроса на запуск процес- процесса высокого уровня, т. е. запрос на обработку прерывания. Во-вторых, когда значения переключателя процессов (ожида- (ожидание) не задано. При высоком уровне сигнала PWR происходит переход по- адресу 1025, а в случае, когда переключатель процессов нахо- находится в состоянии ожидания, — по адресу 1024. Если в обоих случаях имеется состояние ожидания, то происходит переход по адресу 1025. Как указывалось в гл. 4, условием ожидания для переклю- переключателя процессов является либо наличие семафора, помещен- помещенного в список семафоров по сигналу внешнего прерывания, либо>
192 " i. ■ ,:<• Глава 5 SwitchMicrocodeB) IR(8) П I 10 .»-.<■; V V: 0 255 256 511 512 767 768 1023 1024 1025 Точки входа команд 1 Точки входа команд 2 набора набора Точки входа набора команд 3 Точки входа команда : Точка входа набора переклю- чателя процессов ■ Точка входа ния прершва- .-■■■ .'. ' ■ ■* '-.''<■,' : ■ <'•/ •;„.'■-•'- Микропроцессорная память , ..>)(г-,-.г, Фис. 5.8. Точки входа, используемые при диспетчеризации в байт-программе. ^выполнение перед этим в байт-программе команды, связанной -с переключением процессов. Сведения о возникновении подоб- подобных условий должны поступать в схему управления. Передача информации осуществляется через присвоение значения одно- одноразрядному регистру переключения процессов (ProcessSwitch). 'Ответственность за правильное управление этим регистром ле- лежит на программисте. 6. Возврат из подпрограмм. Если содержимое регистра F2 соответствует команде RETURN, то происходит возврат из подпрограммы. Адрес сле- .дующей выполняемой команды байт-кода поступает из регистра rRETURN. Эта команда выполняется без задержки. 7. Разрешение прерывания. Прерывание происходит по внешнему сигналу, поступающему •с вывода микросхемы RWR(ProcessWakeupRequest), т. е. по за- запросу на запуск процесса. Однако ничего нельзя сказать о том, когда произойдет прерывание. Основной стратегией при проек- проектировании микропроцессора «Катана» было стремление к тому, 'чтобы, по возможности упрощая аппаратное обеспечение, повы- повысить скорость выполнения микроцикла и, используя высвобож-
Реализация Смолток-ориентированной машины Катана i 'Л дающуюся поверхность чипа, разместить на ней как можно больше регистровых файлов. При создании схемы обработки прерываний придерживались той же стратегии. Когда бы ни приходил сигнал прерывания, чтобы прервать выполняемую программу и затем снова вернуть- вернуться к ее выполнению, необходимо хранить достаточно большое количество состояний. В условиях, когда в микропрограммах такого хранения осуществить не удается и необходима специ- специальная схема, на передний план выступает блок памяти, через который при этом проходит все выполнение команд условного перехода. Таким образом, в систему команд процессора «Катана» была включена команда InterruptEnable. Прерывания могут происхо- происходить только при выполнении этой команды, а также при вы- выполнении диспетчеризации для байт-программ. Другими слова- словами, если при выполненной команде InterruptEnable сигнал за- запроса запуска процесса PWR имеет высокий уровень, то проис- происходит выполнение микропрограммы, начиная с адреса 1025. При этом сам программист должен решать, имеет ли значение то, где произошло прерывание. При запаздывании обработки прерываний может происходить потеря данных. Поэтому вы- выполнение команды InterruptEnable необходимо распределить равномерно через одинаковые промежутки времени. При обра- обработке прерываний, как при выполнении подпрограмм, необхо- необходимо возвращаться к выполнению прерванной программы. По- Поэтому необходимо запоминать адрес возврата. Для этого су- существует регистр InterruptReturn (возврат из прерывания), в котором хранится адрес возврата из программы обработки прерывания. В него помещается значение микрокоманды из сег- сегмента NEXT при появлении команды InterruptEnable. 8. Возврат из прерывания. При выполнении команды InterruptReturn адрес следующей команды выбирается из регистра InterruptReturn. 5.2.6. Ввод-вывод В качестве метода ввода-вывода используется ввод-вывод с ото- отображением содержимого оперативной памяти. В данном методе порты ввода-вывода занимают столько же места, сколько и ос- основная память. Ввод-вывод выполняется командами read и write. 5.3. Метод реализации В данном разделе мы опустимся на один уровень ниже по от- ношеиию к архитектуре, рассмотренной в разд. 5.2, и рассмот- рассмотрим методы, с помощью которых реализованы регистры, клю-
194 Глава 5 чевые схемы, схемы управления на логических сборках. На этом уровне необходимо рассмотреть вопрос о том, по какой техно- технологии должны изготавливаться СБИС. В данной книге в основ- основном рассмотрена стандартная технология, и в аппаратном обес- обеспечении большей частью использованы схемы Мида и Конвея с устройствами НМОП-типа. 5.3.1. Тактовый генератор в|/ В качестве управляющей тактовой схемы использован двухфаз- двухфазный тактовый генератор с разделением уровней. Временные диаграммы работы этого генератора приведены на рис. 5.9. Он Рис. 5.9. Двухфазный тактовый генератор с разделением уровней. Особенностью данного тактового генератора является несовпадение фронтов для сигна- сигналов ф| И ф2. шэ.-.. 4UOi, называется также двухфазным тактовым генератором. 5.3.2. Схема типа «защелка» и мультиплексор Схема типа защелка фиксирует свой входной сигнал на момент спада тактового сигнала. Схема-защелка по <pi сохраняет то значение входного сигнала, которое имелось на момент спада тактового сигнала <рь Она сохраняет его неизменным до начала следующего тактового сигнала <pi. Имеется также схема-защел- схема-защелка по ф2. Временная диаграмма сигналов для схемы-защелки по ф! показана на рис. 5.10, а устройство самой схемы —на рис. 5.11. Рис. 5.10. Временные диаграмма входных и выходных сигналов схемы-защел- схемы-защелки по Фь Мультиплексор состоит из транзисторных схем запрета. Его схема представлена на рис. 5.12. В данном случае fl, f2, f3 — управляющие сигналы, не допускающие наложения более двух сигналов одновременно, не должны быть равны единице. t
Реализация Смолток-ортмЦЮмниой машины Катана 195 1 Рис. 5.11. Схема-защелка по <р,. •,-;j Рис. 5.12. Мультиплексор fl, f2, f3. 5.3.3. Программируемые логические матрицы и схемы логики При создании СБИС-чипов самыми простыми их узлами явля- являются схемы управления. Поскольку электрические нагрузки не- невелики, нет необходимости заботиться о подводимой мощности. С развитием автоматической трассировки стало достаточным написать управляющее логическое выражение, по которому бу- будет получена точная трассировка. Площадь этих схем по срав- сравнению с другими схемами обычно невелика, и можно обойтись без оптимизации. Так, одними из основных схем являются про- программируемые логические матрицы (ПЛМ). Реализация на них любой логической функции не составляет труда. Кроме того, из них нетрудно сделать последовательностные схемы, используя для этого диаграммы переходов. Рис. ИГ 5.13. Плоскость ■ И т Вход Конструкция ПЛМ. t • Плоскость ИЛИ 4 Выход \ ОИН ;'$О.'5 Схемы сборок иа базе (ПЛМ). ПЛМ, показанные на рис. 5.13, составляются из плоскостей типа И и плоскостей типа ИЛИ. Для изготовления ПЛМ произвольную логическую схему выра- выражают в виде логической суммы логических произведений (дизъ- (дизъюнктивной нормальной формы). Каждая элементарная конъ- конъюнкция реализуется на И-плоскости, а их логическая сумма — на ИЛИ-плоскости. Например, рассмотрим схему с двумя входами, обозначен- обозначенными через Inl, In2, и двумя выходами, обозначенными через 13*
196 bpstb'3 Глава 5 01, 02. Соотношение между входом и выходом в виде логиче- логических формул примет вид 01 —IN1+INT-IN2 O2=INl-lN2+INi-IN2 Обе формулы являются дизъюнктивными формами. При этом необходимо реализовать три элементарные конъюнкции для этих дизъюнктивных форм: In I, In Ь,1п2, In I-In2. Схема, реализующая эти формулы, показана на рис. 5.14. т- SV. л. ::<т $у.с Inl Inl-InZ т .iTOOJ ЭН-Г ■ -W\ 0 In2 = Inl + Inl-In2 +InVInZ1"'; ?• Рис. 5.14. Схема сборки, выполненной аа ПЛМ. Последовательностные схемы на базе ПЛМ. Последователь- ностные (автоматные) схемы можно создавать на базе логиче- логических матриц, вводя в них схемы-защелки и обратные связи, уп- управляемые от генератора тактовых импульсов. Общий вид по- следовательностной схемы показан на рис. 5.15. Л ~, ■■■40 С! НОЙ Кй.!. Схема -sa- Схема-за- Схема-защелка по1/>л СИорка щелка no ip t ■т~ • Выход . ЗД Я rOiF Обратные связи [f-ЛЛ ~, Рис. 5.15. Общий метод построения последовательностных схец-на бя*1.Логи- бя*1.Логических матриц. Л-'П ,inl (■;■:':'■.-• '. и Ч'З
Реализадия Смолток-ориеитироваиной машины Катана 197 Здесь каждому внутреннему состоянию соответствует своя обратная связь. Поясним на примере метод построения последо- вательностных схем. 1. Определение внешних условий. Построим последовательную схему деления на 2 частоты входных импульсов с однопроводной входной линией. Имеется также однопроводная линия установки в нуль. Таким образом, схема всегда может перейти в начальное состояние. 2. Диаграмма переходов. Внутренние состояния реализуемой схемы можно изобразить в виде диаграммы переходов конечного автомата, показанной на рис. 5.16. Здесь кружочками обозначены состояния, и внутри Reset+In '■ £г.\ ц OnJ а;г о "Х-. Рис. 5.16. Диаграмма переходов последовательиостной схемы для деления частоты входных импульсов на 2. них написаны имена этих состояний. Выходные значения для этих состояний указаны в круглых скобках. Каждая стрелка показывает переход из некоторого состояния в другое. Логиче- Логические формулы, написанные под углом к стрелкам, показывают условия, которым должны удовлетворять входные сигналы для того, чтобы переход из состояния в состояние произошел. Если, как показано на рис. 5.16, схема находится в состоянии 1п2, значение выходного сигнала 0 равно нулю. Если при этом на входе будет выполняться условие In=l, Reset = 0, то схема пе- перейдет В состояние 1пЗ. ; . , tolu;,. ..,.., ..;,;;,,, ,;(i:j,,.i -. ; ,, <■
198 -л-г.7.-» •<!-■,: :«. f, ••:■ Глава 5 отг.с-О й-л:^.:-«>с 3. Логические формулы. Преобразуем данную диаграмму переходов в удобные для работы логические формулы. Будем работать с формулами двух типов — формулами, соответствующими переходам, и фор- формулами, соответствующими выходам. Формулы, выражающие соотношения между переходами, имеют вид (Состояние А> = (Состояние В Л (Сигнал 1 > + ••■+ + (Состояние В„> (Сигнал л> s Здесь Вь..., Вп — состояния, из которых возможен переход в состояние А. Сигналы 1,..., п — сигналы, по которым проис- происходит переход в состояние А из состояний Вь ..., В„. Посколь- Поскольку в примере на рис. 5.16 переход в состояние 1пЗ возможен из состояний 1п2 и 1пЗ, то получим IN3=IN2:IN-RESET+IN3-IN-RESET Формулы, с помощью которых выражаются выходы схемы имеют вид (Выход) = (Состояние Q) (Сигнал 1 >+... + (Состояние С„> (Сигнал п> Здесь С]..., Сп — состояния, из которых осуществляется пере- переход в такое состояние, при котором выходной сигнал равен еди- единице. Сигналы 1,..., п — сигналы, надписанные над стрелками перехода в это состояние. На рис. 5.16 состоянием, в котором выход 0 равен единице, является состояние 1пЗ. Поэтому O=IN2-IN-RESET+IN3-IN-RESET Система логических формул для рассматриваемой схемы бу- будет иметь вид INIT=INIT-lN+IN3-IN-Reiit+RESET 1N1 = INIT-IN-Reset+IN1-IN-Reset IN2 = IN•lNr-Reset+IN2-!N'-Reset •> , ■ ...-.., ...,.,■ ..,:- IN3 = IN2-IN-Reset+IN3-IN-Reset ■ '«-,:■•¥,-,:.; ■-,, ....;л1.>.- ,; ; O=IN2-IN-Reset+IN3IN-Reset 5 4. Изготовление ПЛМ. * ?i Если на основании диаграммы переходов, представленной на рис. 5.16, построить асинхронную схему, то она может рабо- работать сама по себе, однако мы должны рассмотреть случай, ког- когда схема управляется двухфазным генератором тактовых им- импульсов. В этом случае для каждого состояния формируется ли- ния обратной связи, а линии обратной связи между И- и ИЛИ- плоскостями служат для передачи логических значений элемен- элементарных конъюнкций. Структура ПЛМ показана на рис. 5.17.
Реализация Смолток-ориеитированиой машины Катана 1И \ж 1,0 ОЙ' _ • - В1 Х.'.-Ь * \ — Init In j « >v;- . г 1. 1 С. . ■ •!■ ■ г 1 In2 In3 t Схемы-защелки по у t Reset Init-In Init-In-Reset Inl -In-Reset In 1-Irv Reset In2-In-Reset InZ-In-Reset I n3-In-Reset In3-In-Reset j "■C "■- — -> Г, ■ ■ л "' In3 InZ Inl Init 0 1 Схемы-защелки п \ с/. •^ In Reset О Рис. 5.17. ПЛМ, реализующая последовательностную схему деления иа 2 ча- частоты входных импульсов. 5.3.4. Конвейерный метод В вычислительных машинах высокого класса допускается либо одновременное считывание и выполнение команд, либо парал- параллельное выполнение нескольких этапов одного вычислительно- вычислительного процесса. Такую организацию вычислительного процесса на- называют конвейерной. Реализация конвейерного управления с совмещением команд оказывает большое влияние на проектиро- проектирование ряда узлов системы. Поэтому необходимо на ранних эта- этапах определить метод реализации этого типа управления. Существуют два способа реализации конвейерного управле- управления с совмещением команд на средних машинах рассматривае- рассматриваемого типа. К первому относится трехступенчатый метод совме- совмещения, выполняющий следующие функции: — считывание команды; — считывание регистров и ввод их значений в арифметиче- арифметическое устройство; г — ввод из арифметического устройства и запись в регистры. ^^Организация вычислений по этому методу показана на рис. 5.18.
2UU Глава 5 L Считывание Считывание I регистра Вычисления I j Запись 18 регистр Ступень 7 конвейера Ступень 2 Ступень 3 Рис. 5.18. Роль каждой из ступеней в организации вычислений по методу трехступенчатого совмещения команд. На рис. 5.19 показано, как фактически происходит выпол- выполнение команд в машине при конвейерной организации вычисле- вычислений. Как видно из рисунка, в течение одного цикла должны быть выполнены запись в регистр результата работы предыду- предыдущей команды и чтение из регистра информации, необходимой Сттыва-, Считывание ние изре\ команды гистра \ j Запись •в'регистр „ „ Считывал «- ниеизре\ i ^гистра; j Запись 10 регистр Sr "i ,гистра j 'Запись \врегистр СчитыЗа-* Запись врегиста ?Рис. 5.19. Перекрытие при выполнении команд. Поскольку в течение одного и того же цикла происходит запись в регистры и чтение из них, предусмотрено, что в течение первой половины цикла выполняется чтение, в тече- течение второй — запись. Поэтому, если в очередней команде происходит чтение из того ре- регистра, в который заносит значение предыдущая команда, могут быть считаны старые данные. Чтобы избежать этого, предусмотрен обход. В данном случае результат вычис- вычислений имеет более высокий приоритет по сравнению с содержимым регистра. для выполнения следующей команды. Поэтому чтение выпол- выполняется в течение первой половины цикла, а запись — в течение шторой половины цикла. Однако если при этом одна команда лишет в регистр, а другая читает из него, то читаться будет •старое содержимое этого регистра. Поэтому в машинах с трех- трехступенчатым конвейером предусмотрен обходной путь; в случае ■если на одном этапе регистры чтения и записи оказываются од- одним и тем же регистром, то результат вычислений выдается не- непосредственно из арифметического устройства, а прочитанное содержимое регистра маскируется. Ко второму способу реализации управления относится двух- двухступенчатый конвейер, выполняющий функции считывания команды и считывания регистров или считывания команды и за- записи в регистры (рис. 5.20). Таким образом, решается задача выбора одного из двух рас- рассмотренных методов управления. Главным при выборе конвей- конвейерного метода управления является сокращение времени ВЫ-
Реализация Смолток-ориеитироваиной машины Катана ЯМ 1 Считывйнив команды •■•,' ;- - Считывание из ре- регистра и Вычисления Считывание команды ■ i Запись 8 регистр Считывание команды ,. . -;И,_- Считывание из ре- гистоа и вычисления Рис. 5.20. Перекрытие команд при управлении по методу двухступенчатого совмещения. полнения каждого из элементов вычислительного процесса. В процессоре «Катана» используются регистровые файлы боль- большой емкости, что должно было бы обеспечить повышение его возможностей. Однако для обращения к регистровым файлам большой емкости, в особенности для записи в них, требуется время. С другой стороны, время вычислений сравнительно не- невелико. При выборе метода трехступенчатого конвейера в тече- течение одного цикла необходимо выполнить как считывание из ре- регистрового файла, так и запись в него. Использование медлен- медленных регистровых файлов удлинит машинный цикл. Для эффек- эффективного использования устройств с предварительным зарядом необходимо организовывать два порта. Это усложняет схему и увеличивает ее размеры. Поэтому был выбран метод двухсту- двухступенчатого конвейера. , ... >.<.;,. м ^.,; :■.■•<.■ .%'<.. si.o •■■. . > ою-. <-тл 5.3.5. Выводы микросхемы к;лГ" *' ' *г: !Г Схема выводов микросхемы для процессора «Катана» показана на рис. 5.21. Выводы микросхемы делятся на четыре большие группы. К питанию и тактовым сигналам относятся три вывода: VDD, GND и ТАКТ. С прерыванием связаны выводы PWR и, PWRACK. К микропроцессорной памяти относятся 13 выводов микроадреса и 39 выводов микрокоманды. С памятью, а именно с адресом и данными, связаны 16 выводов, размноженных по 3. Чтобы через эти 16 выводов передавать три вида информации (старшую часть адреса, младшую часть адреса и данные), осу- осуществляется внешнее управление, определяющее, какой из этих трех видов информации передается. Для этого управления ис- используются два вывода, называемые селектором общей шины памяти. Если значение сигнала селектора общей шины памяти равно нулю, то микропроцессор выдает старшую часть адреса из данных адреса памяти, если единице, то —младшую часть адреса, а если двум, то — данные. Буквы SMC (Start Memory- Cycle) означают "начало цикла памяти". Уровень этого сигнала остается высоким от начала цикла памяти до его конца. При-
Глава 5 VDD GKD Тактовый 1, сигнал PWR PWRAck Адрес памя- памяти и данные Селектор общей шины памяти Сигнал готов- ,-■■-, ногти данных •\п ■>'; ■ <:'- '}!■;•»■. •'. Тактовый Вход Выход •;• ■"'•. '' . ■' • - л ,:,'-; ...-...,., «/г«м сдвига сдвига ■„ъ,Л:/ : . . <J ■■-'■ : - ■ ^Л/гд ;■'■";_ "■ ■ " Рис. 5.21. Схема выводов микртехемы. ""V знак R/W' указывает на то, производится ли операция чтения или операция записи. Вывод сигнала готовности данных ис- используется для указания того, что поступил входной сигнал при выполнении ввода информации прямого отображения памяти. Выводы тактового сигнала сдвига, входа сдвига, выход сдвига используются при загрузке в микропроцессорную память. - 5.3.6. Информационный тракт На верхнем уровне информационного тракта происходят пере- перемещение данных в соответствии с сигналами управления и вы- выполнение вычислений. Управление движением данных осуществ- осуществляется с помощью схем типа защелка и тактовых сигналов. Схемы типа защелка и тактовые сигналы. Центральным устройством информационного тракта является арифметиче- арифметическое устройство. Оно производит вычисления над всеми данны- данными. Для обеспечения правильных вычислений входные сигналы арифметического устройства должны находиться в фиксирован- фиксированном состоянии в течение некоторого промежутка времени, а в следующей фазе вычислений должны быть зафиксированы вы- выходные сигналы, и без этого очередной цикл вычислений начи- начинаться не должен. В данном случае на верхнем уровне тракта данных находятся несколько схем типа защелка. Сигналы уп- управления ими должны чередоваться: <pi, <рг, <pi... и т. д. Кроме того, во всех замкнутых контурах должно находиться четное количество схем типа защелка, не меньшее двух (рис. 5.22).
РеалшМДОЯ Смолток-ориентированной машины КаМЯЯ Перемещение ванных Втечение Времени ipz -*• t Сумматор Перемещение данных 8течение времени у t —] , 1 f Рис. 5.22. Размещение схем типа защелка в системе, управляемой двухфазным генератором тактовых сигналов. Соседние схемы типа защелка управляются сигналами, находящимися в противофазе. Поэтому в замкнутом контуре и должно быть четное их число. В схеме, показанной на рис. 5.22, на вход арифметического устройства поступает сигнал с выхода схемы типа защелка по Фь Поэтому входной сигнал остается постоянным в течение сиг- сигнала фг- Таким образом, вычисления, имеющие смысл, выпол- выполняются во время сигнала ср2. Результат вычислений поступает на схему типа защелка, расположенную на выходе арифметиче- арифметического устройства, в момент окончания сигнала ср2. Выходной сигнал со схемы-защелки по ф2, находящейся на выходе ариф- арифметического устройства, остается постоянным в течение времени прохождения сигнала фь и поэтому данные пересылаются в схе- схему-защелку по фь находящуюся на входе арифметического уст- устройства. Если к схеме тракта данных, изображенной на рис. 5.1 на уровне архитектуры микропроцессора, добавить схемы-за- схемы-защелки и схемы тактирования, то получится схема, показанная на рис. 5.23. АЛУ. В качестве АЛУ используется арифметико-логическое устройство с микропроцессором ОМ-2, разработанным в Кали- Калифорнийском технологическом институте. Оно подробно описано в книге Мида и Конвея1'. В АЛУ с микропроцессором ОМ-2 используется сумматор, носящий наименование: «Манчестерский сумматор с цепями пе- переноса» В нем имеются три функциональных генератора обще- общего назначения, выполняющие функции продвижения переноса, остановки переноса, выдачи результата соответственно. Одно- Одноразрядный срез этого АЛУ показан на рис. 5.24. Блоки функций продвижения переноса, остановки переноса и выдачи результата однотипны и представляют собой схемы, Mead С, Conway L. Introduction to VLSI systems. Addison-Wesley, 1980.
СИ Глава 5 Г ADD Fl = 5,6 1 1 \Г ALU WE MIR ,,..-• £г. .-. ,.3 Рис. 5.23. Схема тракта данных, пополненная схемами-защелками и схемапл тактирования. ■.•'.> .'■'•■. Предваритель- Предварительный заряд Выход переноса А- А- В- POO V If V V i \ I _ Uil A- В В M R,jRxR2f V -*&m Вход переноса ''' 'гическая схема пей переноса Рис. 5.24. Схема одноразрядного среза АЛУ (Mead & Conway, p. 153). ,, , Блок функции Блок функции Логическая схема Блок функции *tA. переноса задержки цепей переноса результата ашн ;
Реализация Смолток-ориеитированной машины Катана * Выход в- в- ft НС Рис. 5.25. Общий функциональный блок, используемый в управлении АЛУ (BHXofl=G0-A-B+Gi-A-B+G2-A-B+G2-A-B+(^-A-B,jSi«Mi4 Conway, 152). Предвари- . _ . j теламый : VDD заряду VDD К 1 Р II Вход переноса Рнс. 5.26. Логика цепей переноса. ■■■; Цепь переноса создается предварительным зарядом q>i (Mead & Conway, p. 150). на которых реализуется любая логическая функция двух пере- переменных. Эта схема показана на рис. 5.25, а логика цепей пере- переноса— на рис. 5.26. Регистровые файлы. Регистровые файлы представляют собой память статического заряда. В них использованы приборы, по- показанные на рис. 5.27. Используются стандартные статические элементы памяти на б транзисторах. На вход усилителя должно поступать значение сигнала, нарастающее до уровня VDD. По-
Глава 5 Разрядная --, - — Разрядная линейка п '■ линейка п Ячейка ОЗУ Адрес к '; ~A??eck Дешифратор адреса Предварительный заряд разрядной ли- чейки Измеритель - црй усилитель Управление за- записью влинепк\ Рис. 5.27. Одна ячейка статической памяти для регистров-файлов. этому в разрядной шине стоит предварительный усилитель-огра- усилитель-ограничитель на одном транзисторе. На входе этого усилителя при наличии предварительного заряда имеется сигнал высокого уровня. 5.3.7. Система внешней памяти Система внешней памяти в явнем виде может запускаться тре- тремя командами: Fetch, FetchDouble и Store или косвенно двумя командами: командами диспетчеризации байт-программы и командой В1С: = . Временные диаграммы. При работе блока памяти на внеш- внешние устройства выдаются сигналы управления SMC (start, me-
Реализация Смолток-орвентированной машины Катана SMC RAV B) FetchDcuble FetchDouble SMC R/W" SMC RAV" Рис. 5.28. Временные диаграммы блока памяти. rnory cycle) — начало цикла памяти и R/W. Временные диа- диаграммы этих сигналов показаны на рис. 5.28. Начиная с высокого уровня сигнала <р2, для микрокоманды при выполнении команды Fetch сигнал SMC становится равным единице. Он сохраняет это значение в течение последующего микроцикла (ф1 и фг). Это сделано в связи с тем, что адрес для блока памяти определяется в конце некоторого микроцикла при выполнении команды Fetch. Поэтому, если в следующем микро- микроцикле мы хотим сразу начать чтение из памяти, оно может на- начаться на полцикла раньше. При выполнении команды Store сигнал SMC имеет аналогичную структуру. При выполнении команды FetchDouble сигнал SMC продлевается еще на один цикл. Схема интерфейса с внешней памятью. Схема управления интерфейсом с блоком внешней памяти и регистры показаны на рис. 5.29. Здесь управляющая ПЛС вырабатывает сигналы, показан- показанные в табл. 5.1. При этом код операции поступает на вход по
Глам 8 Управляющая ПЛС ? T jFDIn A ft-n> function BICLow MAF L BIC — \c 1 ,FD0ut r~ AddrSrc MD> I! SMC CijrSe П I L U и L s 1 Расширите^ инпульсоЗ , е--: ,.',D : ,1 SMC Адрес-Зан- 16 ед/f Селектор ши- 2 w/ памяти Рис. 5.29. Схема интерфейса с внешней памятью. Таблица 5.1. Входы и выходы управляющей ПЛС для блока памяти Вход Выход Функция Noop Fetch Store FetchDouble X BTC: = :=IR BICLow X X X X -'ifl X -r: ■ 0 X FDIn 0 ... 0 (r'< 0 ."< 1 0 0 FDOut 0 ■cTI 0 !■.■ "... о , ■',' ■ 1 0 >. 0 "■■■• 0 ■ AddrSrc 0 0 0 0 . 0 1 SMC ( ) R/M' 0 1 0 1 1 1 1 трехразрядной шине, а его значение определяет операции (Noop, Fetch, Store, FetchDouble, BIC: = , : = IR (включая дис- диспетчеризацию в байт-программах).
Реализация Смолток-ориеитнроваиной машины Катана 209 Расширитель импульсов увеличивает длительность выходных импульсов до половины цикла (эта длительность обязательно кратна длительности микроцикла) и выдает точные управляю- управляющие сигналы. Ои показан на рис. 5.30. ^j I - • " шш Рис. 5.30. Расширитель импульсов, увеличивающий длительность импульсов (кратную длительности микроцикла) до половины цикла. 5.3.8. Схема доступа к байт-командам Минимальная длина команды составляет один байт, а разряд- разрядность шины данных—16 разрядов. Поэтому, имея на чипе бу- буфер команд, можно за два обращения по одному байту выпол- выполнить одно чтение из памяти. Существуют два типа доступа к байт-командам. Одним из них пользуются при диспетчеризации программ, другим — при' чтении байта, являющегося операндом. Если при выполнении этих команд не предпринимается мер по их удержанию, то такой режим ничем не отличается от режима доступа к основной па- памяти. Поэтому программист, пишущий микропрограмму, обязан-: позаботиться о том, чтобы при выполнении команд доступа к: байт-командам в буфере находился байт следующей выполняе- выполняемой команды. В случае когда по команде диспетчеризации программы, на- написанной на байт-коде, или по команде чтения байт-команд считан последний байт буфера или когда заносится значение? в счетчик адреса команд байт-программы, автоматически выда- выдается команда чтения из основной памяти. Соответствующая схе- схема представлена на рис. 5.31. smc • ' ■'"■■■ -•*■" ! U а п V От основ- *Ы-Ш ной памяти,, , ■. •,;, ; шина VJ i С 10 К Рис. 5.31. Буфер команд байт-кода, 14—1428
210 Глава 5 5.3.9. Система управления Система управления представляет собой схему, определяющую, откуда читать очередную микрокоманду. В системе управления имеются следующие регистры: МРС (microprogram counter — счетчик адреса команд микропрограммы) и MIR (microinstruc- (microinstruction register — регистр микрокоманды). МРС представляет со- собой 13-разрядный регистр. Адрес загружается в него при нали- наличии тактирующего сигнала cpi. Его содержимое посылается во внешнюю микропроцессорную память. Внешняя микропроцес- микропроцессорная память представляет собой статическое ОЗУ 8x8 К, т. е. 64 К. Считанная из внешней памяти команда сразу пере- пересылается в микросхему и загружается в MIR. Такт U MIR Данная команда дыполняется в следующем такте 7 Рис. 5.32. Структурно-временная диаграмма передачи данных при обычной передаче управления. Содержимое регистра микрокоманды MIR фиксируется по тактовому сигналу фг и дает информацию, необходимую для вы- выполнения микрокоманды в момент очередного тактового им- импульса. Управление при последовательном выполнении микро- микрокоманд. В случае если не выполняется никаких специальных ветвлений, очередная выполняемая микрокоманда берется по адресу, указанному в сегменте NEXT. Управление для этого случая показано на рис. 5.32. Условное ветвление. Выполнение команд проверки состояния микропроцессора, например L = 0? или ALUCarry?, приводит к
Реализация Смолток-ориентированной машины Катана- 21В условному ветвлению. Условное ветвление реализовано как сле- следующие друг за другом команды условного ветвления. Это свя- связано с организацией считывания микрокоманд и управления им» по методу совмещения микрокоманд. Условное ветвление реали- реализуется путем подстановки крайнего правого разряда сегмента NEXT в регистр флажка, предназначенный для помещения в'. него результата проверки условия. Поскольку в микропроцессо- микропроцессоре реализован метод управления с совмещением микрокоманд,, значение сегмента NEXT микрокоманды, следующей за коман- командой условного перехода, должно быть четным числом. Это зна- значение преобразуется с использованием значения регистра флаж- флажка. Таким образом, ветвями условного перехода становятся сле- следующая команда и команда, расположенная по адресу этой команды +1. Механизм такого условного перехода, развернутый во време- времени, показан на рис. 5.33. Вызов подпрограмм. Для повышения надежности микропро- микропрограмм и для экономии памяти в процессоре «Катана» реализо- реализован механизм вызова подпрограмм. Адрес перехода при вызове подпрограммы указывается в сегменте NEXT. При этом также необходимо выделить место для размещения адреса возврата. В микропроцессоре «Катана» адрес возврата размещается в ре- регистре RETURN. Как сформировать этот адрес возврата? Обычно адрес возврата формируется путем прибавления еди- единицы к текущему адресу, однако для этого требуется сумматор, использование которого отразится на эффективности всего мик- микропроцессора в целом. В микропроцессоре Катана большую работу выполняет мик- микроассемблер. При этом микрокоманда вызова микроподпро- микроподпрограммы обязательно размещается по четному адресу. Это по- позволяет получать адрес возврата путем помещения единицы в младший разряд текущего адреса. В результате можно не при- прибегать к специализированному аппаратному обеспечению. Это приводит также к тому, что в рамках одной программы нельзя организовать выполнение вложенных процедур, однако факти- фактически это не создает никаких трудностей. Механизм вызова под- подпрограмм, развернутый во времени, показан на рис. 3.34. Как видно из рис. 5.34, значение МРС, по которому считы- вается команда вызова подпрограммы, модифицируется путем занесения единицы в его младший разряд, и полученное значе- значение заносится в схему-защелку по ф2, именуемую PrevMPC. Занесение значения в PrevMPC производится всегда при вы- выполнении любой команды. По тактовому сигналу выполнения вызова процедуры значе- значение PrevMPC фиксируется в регистре RETURN с помощью так- тактового сигнала cpi. 14*
Глава 5 ТактО MIR Команда услоВногопгрехода АШСагту?] NEXT \ 1 МРС КЗ4 Такт1: выполнение команды усло!- ного перехода Микропроцессорная память NEXT flag ''■ ": ЛИГ J МРС Такт2: 1 указатель 12 стар- старших разряда! ад- 1 ». /'frc перехода. Микропроцессорная память \ Команда условного перемда V Такт 3: выполнение команды перехода Рис. 5.33. Структурно-временная диаграмма работы системы управления при выполнении условного ветвления. Показаны причины запаздывания перехода на одни цикл. Диспетчеризация. Для организации эффективного ветвления по нескольким направлениям с использованием значений, хра- хранящихся в регистрах, используется механизм диспетчирования. Этот механизм реализуется микрокомандой NEXT: = NEXTOR Bus. В данном случае аналогично условному переходу выполне- выполнение ветвления происходит с задержкой на один цикл. Струк- Структурно-временная диаграмма работы этого механизма показана на рис. 5.35.
Реализация Сиолток-ориеитированной иашины Катана Такт -1 215 Такт О МРС Данное значение МРС четное число MIR NEXT FrevMPC 0001 Команда Вызо- да подпрограм- мы Такт 1 RETURN J МРС *— У1(МРС<10:13> = 0 В данном такте выполняется £ь-зо5 подпрограммы Рис. 5.34. Структурно-временная диаграмма работы системы управления при вызове подпрограмм. В регистр возврата заносится адрес команды вызова подпрограммы, модифицированный путем занесения в его младший разряд единицы. В конце нулевого тактового импульса микрокоманда дис- диспетчеризации загружается в регистр микрокоманды MIR. В те- течение первого тактового импульса выполняется микрокоманда диспетчеризации. При этом сначала происходит фиксирование по тактовому сигналу ф] схемой-защелкой по ф] с наименовани- наименованием Bus. Берется дизъюнкция сегмента NEXT команды, считан- считанной во время такта 1, и содержимого схемы-защелки Bus. Ре- Результат дизъюнкции заносится в сегмент NEXT регистра микро- микрокоманд MIR с помощью схемы-защелки по ф2. Это — адрес пе- перехода. Используя сегмент NEXT, во время второго тактового сигнала происходит считывание микрокоманды, а фактическое ее выполнение происходит во время третьего тактового сигнала. Диспетчеризация в байт-программах. Для быстрого выпол- выполнения команд языка Смолток (команд байт-кода) необходимо быстро выполнять чтение байт-команд. С этой целью в микро- микропроцессоре «Катана» предусмотрен специальный буферный ре- регистр с наименованием Buffer. Команды байт-кода всегда про- пропускаются через этот регистр. Доступ к байт-командам осу- осуществляется с помощью всего лишь одной микрокоманды. Од- Однако даже при минимальной эмуляции байт-кода иа это уходит
Глава 5 Такт О MIR NEXT := NEXT OR Bus NEXT Команда диспет* черизйции МРС Такт! Микропроцес- Микропроцессорная па- память MIR Т_ Bus МЕХТ мрс Адрес фактического - перехода. Выполнение 1 команды перехода В такте 3 Рис. 5.35. Структурно-временная диаграмма работы системы управления пря диспетчеризации. три микроцикла, что, однако, не снижает эффективности микро- микропроцессора. По завершении эмуляции некоторой байт-команды начина- начинается эмуляция следующей байт-команды. При этом никаких за- задержек в микропроцессоре «Катана» ие происходит. Другими словами, микрокоманда, выполняемая вслед за последней мик- микрокомандой некоторой байт-команды, является (при условии, что не происходит переключения процессов) первой микро- микрокомандой очередной байт-команды. Такое высокое быстродей- быстродействие реализуется через аппаратное обеспечение диспетчериза- диспетчеризации байт-команд. Поскольку диспетчеризация байт-команд происходит часто, а сегменты выполняемых при этом последовательных микро- микрокоманд оказываются отделенными друг от друга, загрузка микропрограмм целиком оказывается невозможной, что приво- приводит к замедлению выполнения микропрограмм. В микропроцес- микропроцессоре «Катана» иа диспетчеризацию команд байт-кода указывает значение сегмента NEXT-0. Однако это не приводит к тому, что управление передается по нулевому адресу: это значение яв- является частью таблицы входов диспетчеризации и становится точкой входа байт-команды 0. Последовательность выполнения микрокоманд при диспет- диспетчеризации байт-программы показана на рис. 5.36. В данном примере выполняются байт-команды 66 и 7. Байт- команда 66, являющаяся результатом выполнения микрокоман- микрокоманды диспетчеризации байт-программы, считывается, и выполняет-
Реалшзимш Смолток-ориеитированной машины Катана 215 66 I 7 I .01 - i r i* j - j )a 12 0 30 Список байт-команд (список слов-команд языка Смолток) £ gt • j й г > q т:.' ' Микропроцессор- . f'tjKrtM з '",-! ная память ow ЧШ* •-;!",. '•"' iwa; Hii -.nir;joB»: 1Я Последовательность Выполнения микрокоманд 66, 30, 7,12, - .ВЯТС-0 Эмуляция Эмуляция '"Й "•}'■ :'-■' ''•■:•''.riu . _ ■ байт-ко- Вайт-ко- • . • • манды 66 манды 1 Рис. 5.36. Порядок выполнения микрокоманд, соответствующий выполнению последовательности байт-команд. ся микрокоманда по адресу 66. Поскольку значение сегмента NEXT микрокоманды, находящейся по адресу 66, равно 30, вслед за ней выполняется микрокоманда, находящаяся по ад- адресу 30. Значение сегмента NEXT микрокоманды, находящейся по адресу 30, равно 0, что приводит к выполнению микропро- микропрограммы диспетчеризации байт-кода. Считывается команда 7 байт-кода, и выполняется микрокоманда, находящаяся по ад- адресу 7. Одним из важных видов деятельности, выполняемых во вре- время диспетчеризации команд байт-программы, является пере- переключение процессов. Оно может потребоваться либо по внеш- внешним, либо по внутренним причинам. Внешними причинами мо- могут быть сигналы прерывания от устройств ввода-вывода, пре- прерывания по таймеру и другие асинхронные сигналы. Они иден- идентифицируются по выводу PWR (запрос на запуск процесса) микросхемы. Обычно в микропроцессорах существует много уровней прерывания, и в зависимости от причины прерывания происходит переход по разным адресам. В микропроцессоре «Катана» существует лишь один уровень прерывания, и переход по прерыванию происходит всегда в одно место. Причина такого положения заключается в том, что принцип построения вирту- виртуальной Смолток-машины также прост. Вместе с этим в процес- процессоре «Катана» для ввода-вывода предложено использовать от- отдельный микропроцессор. Mi-J(ir,O4ia'o jsv.. ■:..:■--.- ,«:.....,.; ,иц,.
216 т-";:;.... :lm :■•:.. Глава 5 ■::,•-■' ~ . .:.:.i-;-t Как только приходит сигнал с вывода PWR микросхемы^ сразу же происходит прерывание и должна начаться работав устройства ввода-вывода или других внешних устройств. Одна- Однако в микропроцессоре «Катана» при приеме прерывания в про- произвольный момент времени текущее состояние теряется и воз- возврат к выполнению прерванной программы оказывается невоз- невозможным. Поэтому при работе микропроцессора в режиме вы- выполнения микрокоманд прерывания запрещены, а прием и обра- обработка прерываний осуществляются только при выполнении мик- микрокоманды InterruptEnable (разрешение прерывания). При завершении выполнения каждой байт-команды пере- переключение процессов может происходить в любой момент, при этом потери состояния не происходит. Поэтому в конце каждой байт-команды выполняется проверка, имеется ли запрос на переключение процессов, и если имеется, то происходит его обработка. Все изложенное выше в равной мере относится и к эмуляции байт-команд. Однако при диспетчеризации байт-команд требу- требуется время на то, чтобы определить состояние переключения процессов, и это во многом сказывается на общем быстродей- быстродействии микропроцессора. Поэтому к механизму диспетчеризации байт-команд было добавлено некоторое количество аппаратного обеспечения, реализующего механизм проверки на переключе- переключение процессов, что позволило выполнять эту проверку без до- дополнительных затрат времени. Другими словами, при отсутст- отсутствии переключения процессов задержки в выполнении не проис- происходит. Для достижения этого в процессор был введен одноразряд- одноразрядный регистр с наименованием ProcessSwitch, и если при диспет- диспетчеризации байт-программы значение этого регистра оказывается равным 1, то происходит считывание одного байта из буфера команд, и вместо диспетчеризации происходит переход по адре- адресу 1024. Кроме того, если при диспетчеризации байт-программы воз- возникает высокий уровень сигнала PWR, то происходят переход по адресу 1025 и обработка прерывания. Получение сигнала пре- прерывания происходит только при диспетчеризации байт-команд, и при этом время реакции системы снижается. Поэтому, как в случае посылки сообщений, для байт-команд с большим време- временем выполнения при выполнении микрокоманды допуска пре- прерывания происходит переход по прерыванию. Механизм диспетчеризации байт-программ поддерживает од- одновременно четыре системы команд. Когда мы говорим об од- одновременной поддержке, мы имеем в виду возможность выпол- выполнения в соседние моменты времени совместно с выполнением байт-программы Смолток выполнение байт-программ на другом
Реализация Смолток-орнеитированной машины Катана 217 гязыке, например на языке Паскаль, без переписывания содер- содержимого микропроцессорной памяти. Таким образом, поддержка нескольких систем команд может пониматься двояко. Во-первых, есть возможность записи на дру- других языках функций, невыразимых на языке Смолток, либо функций, требующих эффективного выполнения. Их называют базовыми функциями, и для их записи требуются языки С или Паскаль. Во-вторых, эффективного выполнения программ мож- можно достичь, если пользоваться двумя разными реализациями языка Смолток при выполнении его байт-программ. Например, контексты обычно выбираются из основной памяти, однако в целях оптимизации в микропроцессоре Катана для контекста можно выделить стеки внутри микропроцессора. В зависимости от того, находится контекст в основной или во внутренней па- памяти, выполняемые микропрограммы оказываются совершенно различными. Поэтому возможность выполнения микропрограмм в разных системах команд повышает быстродействие. С этой целью в микропроцессоре «Катана» предусмотрен двухразрядный регистр с наименованием SwitchMicrocode. В этот регистр заносятся значения из сегмента RSEL. Та- Таким образом, при диспетчеризации байт-команд точка входа микропроцессорной памяти определяется значением 10-разряд- 10-разрядного слова, получаемого конкатенацией регистра SwitchMicro- SwitchMicrocode и регистра команд IR. Развертка во времени работы си- системы управления диспетчеризации байт-команды совместно с работой этих механизмов показана на рис. 5.37. /at •j.r/ k.1 •Ufl S , Г.77 J . ", 7ЙЛ777/ SwitchMicrocode r' IR t8 3 . - ■■iidr.Ofi? . '"I У f *| » 1 ■—► МШ Последняя комаШ байт-программы 10Z5 1 ЧРС _| Микропро- цес "орная память \ MIR 1024 1 «■^ ■■' ,-!, . ; о NEXT 0 '•■е: *— ProcessSwitch 4v,o;in<: 'ИД »«2'" -wiO п ^ -■■) г « ;, г '■I'' PWR '■* "ОН .. i)T Первая команда микропро- - граммы v^iv кома наш по адресам ш 1,10 .Da Рис. 5.37. Структурно-временная диаграмма работы системы управления при выполнении микрокоманды диспетчеризации байт-комаид. - >■
218 Глава 5 Возврат из подпрограмм. Микроподпрограммы активизиру- активизируются микропрограммой вызова, описанной в п. "вызов подпро- подпрограмм" данного раздела. При выполнении микрокоманды воз- возврата происходит возврат к микрокоманде, следующей за мик- микрокомандой вызова. Адрес возврата находится в регистре RETURN и заносится в регистр МРС. Структурно-временная диаграмма представлена на рис. 5.38. ТактО 4 Tat <т 1 RETURN МРС MIR MIR n; Команду Ср. - '-J MUKponpQU.BC- ' мять ' 1 ■ ■ 1 ■('х !Т ■■,- '• ■■->Ч1 ■4 ■ Л 1 ■-' .■' Рис. 5.38. Структурно-временная диаграмма работы системы управления при выполнении мнкрокомаиды возврата из подпрограммы. Разрешение прерывания. Прерывание представляет собой внезапное изменение управления по сигналу извне. В микропро- микропроцессоре «Катана» аппаратное обеспечение по возможности уп- упрощено и это не позволяет помнить слишком много внутренних состояний процессора. Поэтому, если разрешить прерывания в произвольный момент времени нли в произвольном месте про- программы, внутренние состояния могут не сохраниться, и надле- надлежащая последовательность выполнения может нарушиться. Сре- Среди этих состояний может быть информация о том, что прерван- прерванной командой является команда обращения к памяти, либо о том, что прервана микропрограмма условного перехода или дис- диспетчеризации. Если до их завершения остается более двух мик- микрокоманд, то при прерывании первой команды и переходе по другому адресу (даже если в дальнейшем возврат и окажется возможным) будет забыта информация, имевшаяся в процессе в момент его прерывания.
Реализация Смолток-ориеитированной машины Катана 219 Например, предположим, что прерывание происходит во время выполнения микрокоманды ALUCarry? При том будет забыто, что был задан условный переход по текущему со- состоянию. Поэтому вопрос о том, как поступить в данном случае, был решен при проектировании микропроцессора «Катана» следую- следующим образом. Вместо введения дополнительного оборудования для запоминания состояний с тем, чтобы допускать прерывание в любом месте программы (программным путем с использова- использованием микрокоманд), указываются места, в которых допускает- допускается прерывание. Такт О M1R interruptEnable NEXT 1025 I ■PWR fnterruptRETURN IntTaken MPC Такт1. Микрапроцес - сорная память MIR Рис. 5.39. Структурно-временная диаграмма работы системы управления при выполнении команды разрешения прерывания. Еще один путь решения проблемы состоит в том, чтобы раз- разрешать прерывания во время диспетчеризации байт-команд. Однако при этом время выполнения во многом зависит от вида байт-команды, и время реакции на внешний сигнал может ока- оказаться недопустимо большим. Командой, разрешающей прерывание, является команда InterruptEnable (разрешение прерывания). Структурно-времен- Структурно-временная диаграмма выполнения этой команды показана на рис. 5.39. Как видно из этой диаграммы, прн высоком уровне сигнала PWR приходит сигнал прерывания и происходит переход по ад-
220 . . ••;,.-.-. -:-.:••. Глава 5 oircnji : --.Si- ресу 1025. При прерываниях, как при вызове подпрограмм, ад- адрес возврата помещается в регистр InterruptReturn (возврат из прерывания). Значение адреса возврата берется из сегмента NEXT команды допуска прерывания. Возврат из прерывания. После завершения обработки преры- прерывания происходит возврат к выполнению прерванных микро- микрокоманд. Это проводится путем загрузки адреса возврата из ре- регистра InterruptReturn в регистр МРС. Выше было приведено описание языка Смолток-80, структу- структуры виртуальной машины, реализующей этот язык, а также кон- конструкции микропроцессора, эффективно реализующего данную виртуальную машину. ~h \^'"*ть^ы <]<,»<t) *|ffn* ^ in!
.'ft ;:ни Предметный указатель Абстрактные типы данных 11, 102 Автоматная схема 196 Адресный регистр 180 Алгебраический подход к данным 11 АЛУ 175, 203 Асинхронное управление 156 '■ -• Асинхронные сигналы 156 Базовые операции 148 Байт-код 168 Блок памяти 185 * ° — сдвига 178 } s ,- Блок-схема 24 ' Бэктрекинг 30 ' * Ввод-вывод 193 Вещи 45 ' Виртуальная машина 126, 148, 174 Виртуальное изображение 126 Возврат 151, 153 — из подпрограмм 218 ; прерывания 193, 220 " " Временные переменные 113, 152 Выборка 57 ■■'■ Вывод микросхемы 201 i!;; — обратный 78 Вывоз процедур через посылку щений 108 ' Вызывающая программа 27 ' Выражение Хорна 77 • ; Глобальная переменная 113 ч" Граф 21 — неориентированный 22 — ориентированный 22 — потока данных 83 Графика 136 Группа регистров общего назначения 177 Группа стек-регистров 177 Двоичное дерево 19 Двухфазный тактовый генератор с разделением уровней 194 Декартово произведение — отношение 54 Дедуктивные СУБД 63 Дерево 17 Диаграмма состояний и переходов 197, 198 Дизъюнктивная форма 198 Диспетчеризация 212 — в байт-программах 191, 213 — механизм 213 Дисциплина обслуживания типа «OW- редь» 38 «стек» 38 — распределения памяти 161 Единичное наследование 87 , ч Заголовок метода 155, 165 :- — свободной области памяти 162 Задание классов 104 Запрос на запуск процесса 191, 201 Заявка на вычисления 173 Иерархическая модель 69 Иерархия классов 106 И-ИЛИ-дерево 31 ИЛИ-параллелизм 79 'л! " Интел-432 174 Интерпретатор 148, 164 Интерфейс 144 Информационный тракт 175, 202 И-параллелизм 79 Исчисление предикатов 46 Катана 174 - ' Категории 140 Категория методов 141 — сообщений 123 Класс «объект» 108 Классы 103, 163 Ключ 55 Количество ссылок 161 Команды блока памяти 185 Компилятор 144 Конвейер двухступенчатый 200 — трехступенчатый 200 Конкурирующее управление 40 Контекст блока 150 — вызова 151 lV , — метода 149, 177 , *$' ■> Лисп-машина 89 Лицензия 126 . ,' ,, Логика Хорна 50 Локальный контекст 152
222 Манчестерский сумматор с цепими пе- переноса 203 Машина Альто 100 Машинный цикл 174 Метаклассы 112 Метод 108, 123, 124, 141, 153—15Й,- 165 — класса 104, 123 ; — подсчета ссылок 161 — подходящего наилучшего 162 первого 162 — счеркивания меток 161 — экземпляра 104, 124 Механизм исключительных состояний 131 Микроассемблер 175,211 ;;.i г \ Микроподпрограмма 175, 211 Микропроцессор Катана 100, 17(^217, 218 .„. _. — ОМ-2 203 f - ..,- Модель связей сущностей 66 .,-,. Мультнпроцессирование 36 ;5- Наследование по свойствам 87 элементам 87 Начальное значение адреса команды 152 Недетерминированный параллелизм 36 Непоследовательное управление 149 Нормализация базы данных 69 Область команд 165 — литералов 165 Обработка исключительных состоя- состояний 139 — прерываний 37 Общие переменные 40 Объектно-ориентированное програм- программирование 85 Объектно-ориентированные языки 101 Объектный код 165 Одноразрядный сдвиговый регистр 179 Общая шина 177 Оператор блока 125, 130 ,','."""-', Оператор блока с параметрами..tSXv —- возврата 125, 131, 171 '."_; — сцепления сообщений 111 ' — цикла 26, 27, 125, 131 ,т,^.: Операции над списками 15 ,,-^V-'- Операционная система 36 ;,,.,,1', Отладчик 150 ' ' ' Очередь 38 Отправитель 150 ., , ,. l(i Память внешняя 206 - ,' ,. '■• ^ '::' Параллелизм 132 . ['^ . 7,...'.',,f..j,.if Параллельный И-ИЛИ-поиск 31 Параметры процедуры 27 Переключение процессов 157, 215 Переменная класса 104, 113 Переменная экземпляра 104, 113 Пересечение отношений 57 Планирование процессов 133 Планировщик 36 Подпрограмма 27 Позднее связывание 153 Поиск в глубину 32 — — ширину 32 — по И-ИЛИ-дереву 31 Полная реляционность 62 Получатель сообщения 103 Последовательное управление 24 i,\ Последовательностные схемы 196 s:; Постановка в очередь 38 rri Посылка заявки 41 — сообщения 42, 103, 153 Поток данных 81 . ; — управления 81 Правило единственного присвоения 82 Правило-оператор Пролога 78, 79 ,- Предварительный заряд 206 Прерывание 37, 192 — внешнее 215 ;: — внутреннее 215 . ~ Прагматика 123 .Jr,?.,.,, ,,,; Примитивы 156 ;_-"' saooiid Принцип резолюции 76 |>. ,, ?'.■,'[ ц Приоритет 39 !(Г , '.',.-, ... Программируемые логические М»ТВ1Р цы (ПЛМ) 195 г Проекция отношения 57 > Процесс 36, 132 ., Процесс-источник 41, 42 Процесс-потребитель 41, 42 Псевдопеременные 114 ; Л ;\ Разность отношений 56 Разрешение прерывания Регистр данных 180, 185 — памяти 180 Регистр-файл 176, 205 — флага 180, 211 Рекурсивный вызов 28 Реляционная алгебра 56 — база данных 52 — модель 53 — полнота 62 Реляционное исчисление 59'i"i доменов 59 кортежей 59 гч",; Родовое сообщение 108.,..,!"»"
223 Самоопределенный объект 160 Сборка мусора 160 подсчетом ссылок 159, 161 Сегмент микрокоманды ALUF 181 BS 182 uV F1 182 F2 183 LL 185 LT 185 NEXT 185 RSEL 180, 182 Сегментный регистр 178, 181, 187 Семантика байт-команд 167, 168, 170 Семафор 40, 153, 157 Сетевая модель 70 Сеть «Этернет» 101 Синтаксис байт-команд 168 Сигнал начала цикла обращения к памяти (НЦП) 206 — синхронизации 156 Система КИКУ 100 — памяти 185 — реального времени 37 — управления микропроцессором 210 Синхронизация 133 Системный генератор путей 140 Словарь методов 113 — сообщений 155, 163 Смолток-80 102, 174 Соединение 57, 59 9-соединение 57 1 Сообщение 102 Соответственная диапазонная ППФ 62 Сопрограмма 131 Сохранение контекста 150 Специальная заявка 173 Специальные значения 171 Список 14 Среда операционная 149 Статическая память 205 sutu, ,. Стек 29, 167 л:, ! Структурное программирование J6t, , Структуры данных 11 — управления 24, 149 . „„., СУБД-машина 71 ..т../ з:. Супервизор 36 ;,«" - Сумма отношений 56 '*""Л1''; Суперкласс 106, 163 "^я Существенная целостность 64 Схема отношения 54 /,.!.!',".' — сообщения 104 — типа «защелка» 194 Счетчик адреса команд 25 р д байт-программы 187 Таблица объектов 158 Тактовый генератор 194 4< £45 яЛ ажзоМ Теория акторов 86 Терм объединения 60 Технологическая среда программиро- программирования 138 Точка входа 191 Транзакция 65 Трассировка 177 Трафарет 141 Удаление из очереди 38, 39 Указатель 14 — объекта 158 — примитива 153 — стека 169—171 — типа мышь 101 Указательный объект 160 Унификация 76 Уплотнение объектов 163 Управление выполнением микро- микрокоманд 210 — памятью, занятой под объекты 161 — процессами 132 Уровень микроархитектуры 193 — прерывания 215 Условное ветвление 188 Условный оператор 26 Форма Хорна 50, 63, 77 Формальные параметры 131, 153 Формат бинарного селектора 102 — микрокоманды 180 — селектора ключевых слов 103 — унарного селектора 102 Фрагментация памяти 163 Фрейм 150 Функциональная зависимость 67 Хеширующая таблица 153 Целостность данных по связям 63 Частное отношений 58 Чип 177 Число аргументов \Ъ\ ../ ЭВММС 68000 100 ■-"■' Экземпляр 103 Юникс 99 ■s.n Языки логического программирования 74 .г- Язык Оккам 41 . — Пролог 74 |;' ' •■" ■ ь.1Л*о* / — Эклог 90, 94 ' ' '' "'-** — ЭСП 90, 95, 9в
i Предисловие редактора перевода . .. ,' .' 3 Предисловие .- 7 Глава I. Структуры данных и структуры управлении . . . .-.".. 9 1.1. Структуры данных .- 11 1.2. Структуры управления 24 Глава 2. Отношения и объекты 45 2.1. Модель мнра - 45 2.2. Реляционные модели 53 2.3. Языки программирования логического и функционального типов 73 2.4. Параллельные структуры управления 81 2.5. Объектно-орнентированное программирование . . ' . 85 Глава 3. Введение в Смолток 99 3.1. Общие сведения о языке Смолток . . . . ... 100 3.2. Пример программы »'-.-• • ! : 115 3.3. Структура системы '■'■. .".'"* 126 3.4. Технологическая среда разработки программ -. -.- . : . ; - 138 3.5. Описание компилятора .'■ '-; 142 Глава 4. Архитектура Смолток-ориеитированного процессора . .. .148 4.1. Структура управления (ч 149 4.2. Структура памяти ' .. . : 158 4.3. Система команд .,.,.'! 166 Глава 5. Реализация Смолток-ориентированиой машины «Капва» ' 174 5.1. Принципы проектирования ..• ..'. . . 174 * 5.2. Архитектура микропроцессора .... Ч.-'. . . 175 5.3. Метод реализации ^'■•"•'■'..• • 193 Предметный указатель ..г ■ •;. ч\ -.- . *v1! . '-'■'"* ~. . .V 7"'. .221 Научное издание . ;>; Кадзухиро Фути, Норихиса Судзуки i •'•'' ЯЗЫКИ ПРОГРАММИРОВАНИЯ И СХЕМОТЕХНИКА СБИС 31ведующий редакцией проф. Ю. И. Топчеев. Зам. зав. редакцией Э. Н. Бадихоь Старший научный редактор В. С. Соболев. Младший редактор М. Н. Стасюк Художник В. А. Стуликов. Художественный редактор Н. И. Иванов ) Технический редактор Е. С. Потапенкова. Корректор С. А. Денисова ИБ W» 6279 Сдаво в набор 16.11.87. Подписано к печати 22.03.88. Формат бОХЭО'/и. Бумага типограф- <МЯ № 1. Печать высокая. Гарнитура литературная. Объем 7,0. бум. л. Усл. печ. л. 14,0. Усл. ip.-отт. 14,0. Уч.-нзд. л. 13,94. Изд. Ns 6/5296. Тираж 40 000 экз. Зак. 1428. t :'■-.:):. Цена 1 р. 40 к. ИЗДАТЕЛЬСТВО «МИР». 129820, ГСП, Москва, И-110, 1-й Рижский пер., 2. Московская типография № 11 Союзполиграфпрома прн Государственном комитете CCCI ОО делам издательств, полиграфии и книжной торговли. 113105, Москва, Нагатинская , - . ... У"- *• '• си с с «••! |и; /