Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 20 июн 2025, 15:31

Часовой пояс: UTC + 2 часа




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Процедурные типы
СообщениеДобавлено: 23 ноя 2013, 08:26 
Не в сети

Сообщения: 116
Откуда: Каменск-Уральский
Что такое процедурные типы, как их применять и зачем они нужны?


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Процедурные типы
СообщениеДобавлено: 23 ноя 2013, 08:55 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Это такие типы, с помощью которых можно описать прототипы процедур. И потом объявить процедурные переменные данных типов и вызывать непрямым способом процедуры, на которые они указывают, что позволяет, например, быстро переключать разные реализации процедуры, присваивая процедурной переменной, через которую происходит вызов, других значений. Ближайший аналог из ООП — виртуальные методы классов.

Здесь в коде показано всё. И как описать прототип, и как работать с такой процедурной переменной. Это совершенно реальный и рабочий пример — процедура Is64BitWindows, проверяющая, на 32-битной или 64-битной винде запущена программа:
Код: "OBERON"
  1. (* Copyright (C) 2012-2013 Oleg N. Cher, VEDAsoft Oberon Club *)
  2.  
  3. MODULE XDevMisc;
  4. IMPORT
  5. SYSTEM, WinApi;
  6.  
  7. PROCEDURE Is64BitWindows* (): BOOLEAN;
  8. CONST
  9. False = 0;
  10. TYPE
  11. Bool = WinApi.BOOL;
  12. Handle = WinApi.HANDLE;
  13. ISWOW64PROCESS = PROCEDURE(hProcess: Handle; OUT Wow64Process: Bool): Bool;
  14. VAR
  15. IsWow64Process: ISWOW64PROCESS; wow64Process: Bool;
  16. BEGIN
  17. IsWow64Process := SYSTEM.VAL(ISWOW64PROCESS, WinApi.GetProcAddress(
  18. WinApi.GetModuleHandle("Kernel32"), "IsWow64Process"));
  19. RETURN (IsWow64Process # NIL)
  20. & (IsWow64Process(WinApi.GetCurrentProcess(), wow64Process) # False)
  21. & (wow64Process # False)
  22. END Is64BitWindows;
  23.  
  24. END XDevMisc.
Если бы мы вызывали процедуру IsWow64Process статически, то могли бы прогореть на том, что она присутствует не в каждой версии Kernel32, о чём предупреждает Microsoft. В этом случае наша программа отвалилась бы со страшным сообщением типа: "Точка входа в процедуру IsWow64Process не найдена в библиотеке kernel32.dll". Динамически же мы сперва проверяем, существует ли точка входа в эту процедуру. И только потом, если да, вызываем её. А если нет, то делаем предположение, что винда таки не 64-битная.

Работа с процедурными переменными имеет смысл не только в системном программировании. В прикладной области этому подходу тоже можно найти применение. А вот что говорит документация ББ по данному вопросу:
Docu/ru/CP-New писал(а):
Процедурные типы

Процедурные типы обладают меньшей гибкостью, чем объекты с методами. Даже в обычных примерах использования процедурных типов в ПО для числовых расчетов можно получить выигрыш, моделируя их посредством объектов. Объекты расширяемы, а процедурные типы — нет. Процедурные типы могут создавать значительные трудности для безопасной вы­груз­ки модулей. Пока что они сохранены для обратной совместимости, а также для реа­ли­за­ции низкоуровневого интерфейсного кода (обратные вызовы, callbacks). В перспективе поддер­жка процедурных типов может быть уменьшена.
Почему так? Потому что в компонентной среде с динамической загрузкой/выгрузкой модулей "на лету" есть проблемы с процедурными переменными, когда модуль, реализующий процедуру, на которую указывает переменная, уже выгружен, а программист процедуру вызвал (и потерпел крах). Поэтому парни из Oberon Microsystems советуют вместо процедурных переменных использовать методы объектов.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Процедурные типы
СообщениеДобавлено: 25 ноя 2013, 18:12 
Не в сети
Администратор
Аватара пользователя

Сообщения: 273
Откуда: Россия
Процедурные типы имеют (имели) большое значение в Оберон-1, т.к. именно через них были реализованы методы объектов. В первой версии Оберона у объектов вообще не было методов как отдельной сущности. У объектов (вернее у записей - RECORD) наряду с полями целого, вещественного, символьного и пр.типов могли быть поля процедурных типов. Вот через них и предлагалось реализовать методы - при инициализации объекта, нужно было связать эти процедурные поля с соответствующими процедурами просто выполнением присваивания. Однако такая гибкость провоцировала на трюки (ведь можно было переприсвоить эти поля в любой момент), усложняла инициализацию и наследование (надо вручную делать эти присваивания), усложняла синтаксис при вызове метода ("obj.proc(obj,...)").
Поэтому начиная с Оберона-2 введены "настоящие методы": привязка процедур к объектовому (записевому - RECORD) типу осуществляется статически - указанием типа объектового параметра при описании процедуры, а не динамически - присваиванием во время выполнения программы.
Сравнение ООП в Оберон1 и КП см на форуме http://forum.oberoncore.ru/viewtopic.php?f=8&t=2121

Для совместимости эти возможности оставлены, технически можно и в Oberon-2 и в КП не использовать методы, а пользоваться в записях полями процедурного типа. Но делать этого не следует из-за указанных выше недостатков. А также потому, что "В перспективе поддер­жка процедурных типов может быть уменьшена". Это уже история, "настоящие методы" удобнее, надежнее и нагляднее. Слова из документации об устаревании и постепенном "сокращении" процедурных типов относятся, думаю, в большей мере именно к их использованию в ООП.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Процедурные типы
СообщениеДобавлено: 25 ноя 2013, 19:38 
Не в сети

Сообщения: 203
Не могу согласиться с тем, что процедурные типы так уж бесполезны.
Конечно, первый пример их использования, приходящий в голову императивному программисту, -- это те самые колбеки (например, прорисовка прогресс-бара во время передачи файла по сети -- классика жанра).
Но есть и другие примеры, когда проще передать процедуру, чем оборачивать её в объект-пустышку только для того, что бы соблюсти каноны ООП. Правда, все эти примеры, что приходят мне в голову -- из мира ФП, а с поддержкой ФП у оберонов довольно печально...


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Процедурные типы
СообщениеДобавлено: 25 ноя 2013, 20:04 
Не в сети
Администратор
Аватара пользователя

Сообщения: 273
Откуда: Россия
geniepro писал(а):
Не могу согласиться с тем, что процедурные типы так уж бесполезны...
Ни в коей мере не утверждал, что бесполезны. Просто их роль уменьшилась в связи с появлением в Оберон2 "статически задаваемых" методов. И вместо таких методов процедурные типы использовать не следует.

В случае же callback или "проще передать процедуру, чем оборачивать её в объект", действительно удобнее использовать процедурный тип. Но ведь если не обёрнут в объект, тогда это и не метод, правда? Вот поэтому и думаю, что замечания об устаревании и сокращении поддержки касаются только ООП, а для прочего процедурный тип останется.


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 2 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club