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

Языки программирования. Концепции и принципы

.pdf
Скачиваний:
2
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
Два альтернативных принципа создания ЯП
261
• убрано даже понятие программы – пользователь видит на экране меню, со
ставленное из спецификаций нужных ему модулей, – это и есть перечень
предоставляемых ему услуг. В самом начале – предопределенное меню.
12.9.2. Управление сетями на Обероне
Приведем переписанный на Обероне пример УправлениеСетями с краткими ком ментариями, подчеркивающими отличия Оберона от Модулы2. Для удобства со поставления сохранены старые номера строчек (отсутствие номера означает, что соответствующая строчка убрана совершенно). Так как в Обероне нет поддиапа зонов, структура объявлений типа упрощена, но эквивалентных проверок мы в программу не вставляем для простоты. Ясно, что надежность страдает. Вирт, по видимому, руководствовался таким принципом: затраты должны быть видимы программисту (должны требовать и его усилий – записывая явные проверки, про граммист лучше чувствует их стоимость, чем в случае автоматических проверок, вставляемых компилятором). Подобные соображения (с учетом упрощения транс лятора) и привели к удалению поддиапазонов из Оберона.
1. DEFINITION ПараметрыСети; (* это заголовок спецификации (сопряжения) модуля *)
3. CONST МаксУзлов = 100;
4. МаксСвязей = 8;
5. END ПараметрыСети; (* Списка экспорта в Обероне нет. Клиентам модуля ПараметрыСети доступны все имена, объявленные в его спецификации *)
1. DEFINITION УправлениеСетями;
2. IMPORT П: ПараметрыСети; (* МаксУзлов, МаксСвязей убраны; в списке импорта – только имена модулей; "П" – локальное имя; список экспорта не нужен *)
4. TYPE Узел = SHORTINT; (* встроенный тип *)
7. ПереченьСвязей = ARRAY П.МаксСвязей OF Узел;
(* индексы всегда целые, нижняя граница – 0, верхняя – МаксСвязей-1 *)
8. Связи = RECORD
9. Число : SHORTINT;
10. Узлы : ПереченьСвязей;
11. END;
12. Ñåòè = RECORD END;
(* Аналог объявления приватного (закрытого, непрозрачного) типа *).
(* 13. PROCEDURE Создать(VAR Сеть : Сети); Как и в Аде, снова необязательна процедура динамического создания сетей – закрытые типы реализуются тем же аппаратом, что и обогащаемые, – за счет встроенных указате­лей; объекты таких типов могут быть и статическими. *)
14. PROCEDURE Вставить(X : Узел;
VAR ВСеть : Сети);
262
(* Обратите внимание на режим второго параметра! *)
15. PROCEDURE Удалить(X : Узел; VAR ИзСети : Сети);
16. PROCEDURE Связать(АУзел, ВУзел : Узел; VAR ВСети : Сети);
17. PROCEDURE Присвоить(VAR Сеть1,
(* В Аде последней процедуры не было. Как и в Модуле-2, во внешнем контексте операцию содержательного присваивания сетей описать невозможно из-за отсутствия информации об их строении. Присваивать (полные) значения объектам таких типов, которые объявлены в видимой части модуля, в Обероне нельзя. Так что тип Сети – аналог ограниченных приватных Ады. Поэтому приходится определять специальную процедуру для присваивания содержательных сетей. *)
18. PROCEDURE Узел Есть(X : Узел; VAR ВСети : Сети) : BOOLEAN;
19. PROCEDURE ВсеСвязи(X : Узел;
VAR ВСети : Сети; VAR R : Связи);
(* В Обероне, как и в Паскале, результат функции – только скаляр. *)
20. END УправлениеСетями;
DEFINITION Клиент; (* программы – главного модуля в Обероне нет! *) IMPORT У: УправлениеСетями; PROCEDURE ПостроениеСетей; END Клиент;
Современное состояние языков программирования
Ñåòü2 : Ñåòè);
MODULE Клиент; IMPORT У: УправлениеСетями; PROCEDURE ПостроениеСетей;
VAR Сеть1, Сеть2 : У.Сети; (* объявление переменных типа Сети *)
BEGIN
У.Вставитъ(33, 13, Сеть1);
У.Присвоить(Сеть1, Сеть2); END ПостроениеСетей; END Клиент;
Вопрос. Как же воспользоваться таким модулем?
MODULE УправлениеСетями;
IMPORT П: ПараметрыСети;
TYPE
Узел = SHORTINT; ПереченьСвязей = ARRAY П.МаксСвязей OF Узел; Связи = RECORD
Число : SHORTINT; Узлы : ПереченьСвязей;
END;
ЗаписьОбУзле = RECORD
Включен : BOOLEAN; Связан : Связи; END;
Два альтернативных принципа создания ЯП
Сети = RECORD С: ARRAY П.МаксУзлов OF ЗаписьОбУзле
END; (* Приходится так определять тип Сети, чтобы можно было скрыть поле С; другого способа строить закрытый тип в Обероне нет! *)
PROCEDURE УзелЕсть(X : Узел; VAR ВСети : Сети) : BOOLEAN; BEGIN
RETURN ВСети.С[X].Включен; (* вместо указателя – поле С *) END УзелЕсть;
Вопрос. Зачем второй параметр получил режим VAR?
Подсказка. Нужно ли копировать сеть?
PROCEDURE ВсеСвязи(X : Узел; ВСети : Сети;
VAR R : Связи);
BEGIN
R := ВСети.С[X].Связан;
END ВсеСвязи;
PROCEDURE Вставить(X : Узел;
VAR ВСеть : Сети);
BEGIN
ВСеть.С[Х].Включен := TRUE; ВСеть.С[Х].Связан.Число := 0;
END Вставить;
263
PROCEDURE Присвоить(VAR Сеть1,
Ñåòü2 : Ñåòè);
BEGIN
Сеть2.С := Сеть1.С; (* вне модуля такого не сделаешь *)
END Присвоить;
PROCEDURE Есть_связь(АУзел, ВУзел : Узел,
VAR ВСети : Сети): BOOLEAN;
VAR i : 1..П.МаксСвязей;
z : Связи;
BEGIN
z := ВСети.С[АУзел].Связан;
(* вместо присоединяющего оператора *)
i:=0; REPEAT (* цикла FOR в Обероне нет *) IF z.Узлы(i)= ВУзел THEN
RETURN TRUE; END; i :=i + 1; UNTIL i < z.Число RETURN FALSE;
END Есть_связь;
264
PROCEDURE Установить_связь(Откуда,
Куда : Узел; VAR ВСети : Сети);
VAR z: Связи; BEGIN
z:= ВСети.С[АУзел].Связан; (* вместо присоединяющего оператора *)
z.Число :=z.Число+1;
z.Узлы(z.Число):= Куда; END Установить связь; PROCEDURE Связать(АУзел, ВУзел : Узел;
VAR ВСети : Сети);
BEGIN
IF ~ Есть_связь(АУзел, ВУзел, ВСети) THEN
(* «~» – отрицание *)
Установить_связь(АУзел, ВУзел, ВСети); IF АУзел #ВУзел THEN (* «#» в Обероне – знак неравенства *)
Установить_связь(ВУзел, АУзел);
END;
END; END Связать;
PROCEDURE Переписать(ВУзле : Узел;
VAR j : SHORTINT; BEGIN (* присоединяющий оператор в Обероне отсутствует *)
j:= После;
WHILE j > ВСети.С[ВУзле].Связан.Число-1 DO
ВСети.С[ВУзле].Связан.Узлы [j] :=ВСети.С[ВУзле].Связан.Узлы [j+1]; j:= j+i;
END END Переписать;
Современное состояние языков программирования
После : SHORTINT; VAR ВСети : Сети);
PROCEDURE Чистить(Связь, ВУзле : Узел;
VAR ВСети : Сети); VAR i : SHORTINT; BEGIN
i:=0; REPEAT
IF ВСети.С[ВУзле].Связан.Узлы [i]= Связь THEN
Переписать (ВУзле, i, ВСети); ВСети.С[ВУзле].Связан.Число := ВСети.С[ВУзле].Связан.Число-1; EXIT;
END; i := i+1;
UNTIL i < ВСети.С[ВУзле].Связан.Число
END Чистить;
Два альтернативных принципа создания ЯП
(* Мы сознательно программируем близко к А- и М-программам, хотя можно было бы действовать рациональнее. Видно, что отсутствие присоединяющего оператора мешает – мы использовали два варианта его замены. *)
PROCEDURE Удалить(X : Узел;
VAR ИзСети : Сети);
VAR i : SHORTINT;
BEGIN
ИзСети.С[Х].Включен := FALSE; i := 0; REPEAT
Чистить(X, ИзСети.С[Х].Связан.Узлы[i], ИзСети); i:= i+1;
UNTIL i < ИзСети.С[Х].Связан.Число
END Удалить;
END УправлениеСетями;
265
Итак, задача полностью решена. Обеспечена аналогичная А и Мслучаям це
лостность сетей и модифицируемость. Надежность программирования несколько пострадала.
Вопрос. Чем это может повредить при управлении сетями? Подсказка. Не всякий недостаток ЯП должен сказываться на любой программе.
Как и в случае с Модулой2, можно заключить, что обычные программы можно
писать на Обероне почти с тем же успехом и комфортом, что на Аде или на Моду ле2. Вместе с тем удалось почувствовать и неудобства от ликвидации присоеди няющего оператора и привычных циклов.
Закончим краткое знакомство с ЯП Оберон утверждением, что при всей своей
«аскетичности» он вполне пригоден для выполнения роли монопольного языка персональной рабочей станции в основном за счет двух мощнейших средств – высокоразвитой модульности, опирающейся на идею экспортного окна и обога щаемых типов. Работа первого из них показана, а вторым займемся в разделе о наследуемости.
Интересно (и поучительно) отметить, что оба этих средства суть два взаимно до полнительных (дуальных) проявления одного и того же известнейшего математи ческого понятия, оказавшегося, как недавно выяснилось, полезным для понимания «момента истины» в самых современных концепциях программирования. Такое понимание позволяет отделять «зерна от плевел», принимать решения при развитии и стандартизации ЯП. Подробнее об этом сказано в разделе о наследуемости в ЯП.
Упражнение (повышенной трудности). Попытайтесь самостоятельно догадаться, о каком математическом понятии идет речь.
Часть II
Перспективы языков программирования
Глава 1. Перспективные
модели языка........................... 269
Глава 2. Функциональное программирование
(модель Б) ............................... 289
Глава 3. Доказательное программирование
(модель Д) ............................... 315
Глава 4. Реляционное программирование
(модель Р) ............................... 339
Глава 5. Параллельное программирование в Оккаме!2
(модель О) ............................... 353
Глава 6. Наследуемость (к идеалу развития
и защиты в ЯП)......................... 391
Глава 7. Объектно! ориентированное
программирование.................. 415
Глава 8. Заключительные
замечания................................ 439
Перспективные модели языка
1.1. Введение ................................ 270
1.2. Операционное программирование – модель
фон Неймана (модель Н) ............... 271
1.3. Ситуационное программирование – модель
Маркова!Турчина (модель МТ) ...... 273
Глава 1
270
Перспективы языков программирования
1.1. Введение
Если в первой части книги мы стремились дать представление по возможности о всех аспектах современного языка индустриального программирования, то во второй части наша главная цель – дать представление о перспективах и тенденци ях развития ЯП. Конечно, и в первой части нас интересовали прежде всего поня тия, принципы и концепции фундаментального характера, которые могут претен довать на долгую жизнь в области ЯП. Мы особенно подчеркивали ситуации, когда такой подход позволял прогнозировать развитие ЯП.
Вместе с тем в целом мы сознательно ограничили себя рамками одного стиля программирования, часто называемого операционным (операторным, фонней мановским, традиционным, классическим и т. п.), представителями которого выс тупают практически все упоминавшиеся нами ЯП. Такая ограниченность была оправдана, пока нас интересовали по возможности все аспекты практического программирования в их взаимно согласованном воплощении в целостной знако вой системе. Именно поэтому был выбран и единый язык примеров – Ада, а все сопоставления обычно делались с ЯП аналогичного стиля, тем более что операци онный стиль явно доминирует в ЯП массового программирования.
Однако рамки одного стиля становятся тесными, если нас интересуют тенден ции и перспективы развития ЯП. Маловероятно, что в ближайшей перспективе какойлибо иной стиль программирования вытеснит операционный. Отсутствует и пример современного; ЯП, который вобрал бы в себя практически все накоплен ное богатство в этой области. Однако в ЯП практического программирования попадает лишь то, что предварительно проверено в теории и эксперименте. По этому знать иные стили и подходы полезно каждому, кто желает понимать, чего можно ждать от будущих ЯП. Наконец, знакомство с нетрадиционным подходом и оригинальным взглядом на казалось бы хорошо знакомые сущности доставляет ни с чем не сравнимое удовольствие.
За некоторыми стилями программирования закрепились вполне определен ные названия, другие общепринятых названий не имеют. Мы позволим себе упот реблять те названия, которые, по нашему мнению, в достаточной степени отража ют суть рассматриваемого подхода. Вместо слов, например, «операционный стиль программирования» иногда говорят короче: «операционное программирование». Будем поступать аналогично по отношению ко всем стилям.
Рассмотрим несколько моделей ЯП, представляющих операционное, ситуаци онное, функциональное, доказательное, реляционное, параллельное и объектно ориентированное программирование.
Первая из них играет чисто историческую роль «начала координат». Вместе с тем она предоставляет возможность на содержательно хорошо знакомом мате риале познакомить с весьма общими понятиями, характерными для математиче ской позиции. В дальнейшем эти понятия применяются к менее знакомому мате риалу при рассмотрении других моделей.
Остальные модели непосредственно предназначены для представления опре деленных перспективных тенденций в области ЯП и программирования в целом.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]