OberonCore
https://forum.oberoncore.ru/

Модификация механизма исключений для PureBuilder
https://forum.oberoncore.ru/viewtopic.php?f=93&t=3195
Страница 2 из 3

Автор:  Сергей Прохоренко [ Суббота, 29 Январь, 2011 13:57 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Alexey Veselovsky писал(а):
Также в Ada исключения чудо как хороши.


Может быть, не столь уж хороши, если в SPARK (подмножество Ada для критических приложений) не попали (см. NASA Software Safety Guidebook, стр. 210-211):
Цитата:
One Ada subset of note is the SPARK language (http://www.sparkada.com/spark.html), which is designed to support the development of software used in applications where correct operation is vital either for reasons of safety or business integrity. A SPARK program has a precise meaning which is unaffected by the choice of Ada compiler and can never be erroneous. SPARK includes Ada constructs regarded as essential for the construction of complex software, such as packages, private types, typed constants, functions with structured values, and the library system. It excludes tasks, exceptions, generic units, access types, use clauses, type aliasing, anonymous types, default values in record declarations, default subprogram parameters, goto statements, and declare statements. SPARK was designed for use in high integrity applications; it is therefore essential that it exhibits logical soundness, simplicity of the formal definition, expressive power, security, verifiability, bounded space and time requirements, and minimal runtime system requirements.

Автор:  Alexey Veselovsky [ Суббота, 29 Январь, 2011 14:29 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Сергей Прохоренко писал(а):
Alexey Veselovsky писал(а):
Также в Ada исключения чудо как хороши.


Может быть, не столь уж хороши, если в SPARK (подмножество Ada для критических приложений) не попали

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

Автор:  Сергей Прохоренко [ Суббота, 29 Январь, 2011 20:29 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Мне кажется, что лучше заимствовать механизм обработки исключений из функциональных языков, чем из императивных языков, включая Ada. По большому счету механизмы обработки исключений в императивных языках мало отличаются друг от друга и от унифицированного механизма обработки исключений в платформе .NET.

Вот обоснование (см. источник) такого выбора функциональных языков в качестве образца:
Цитата:
связи между функциями – прекрасное место для работы с ошибками


В частности, я вижу две возможности привязать обработку исключений к функциям/процедурам в структурном редакторе:
  • можно предусмотреть стандартное задание условий вызова обработчиков исключений при табличном описании входных и выходных параметров и возвращаемого значения функции/процедуры;
  • можно предусмотреть вызов обработчиков исключений непосредственно в синтаксисе оператора вызова процедуры, оператора присваивания и операторов ввода/вывода, а не в блоке try:


set variable to expression
catch()
...
catch()
...


call procedure()
catch()
...
catch()
...


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

Автор:  Alexey Veselovsky [ Суббота, 29 Январь, 2011 20:33 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Посмотрите как исключения сделаны в Haskell'e. В языке их нет. Это библиотечная штука.

Автор:  Сергей Прохоренко [ Суббота, 29 Январь, 2011 20:40 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Alexey Veselovsky писал(а):
Посмотрите как исключения сделаны в Haskell'e. В языке их нет. Это библиотечная штука.


У вас есть хорошая ссылка "под рукой"?

Автор:  Alexey Veselovsky [ Суббота, 29 Январь, 2011 20:43 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Сергей Прохоренко писал(а):
Alexey Veselovsky писал(а):
Посмотрите как исключения сделаны в Haskell'e. В языке их нет. Это библиотечная штука.


У вас есть хорошая ссылка "под рукой"?

Не знаю хорошая или нет, но есть: http://www.haskell.org/haskellwiki/Exception
Также посмотрите сюда: viewtopic.php?f=72&t=3177

Автор:  Сергей Прохоренко [ Суббота, 29 Январь, 2011 20:46 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Спасибо! :D Обязательно посмотрю.

Автор:  Валерий Лаптев [ Воскресенье, 30 Январь, 2011 11:32 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Alexey Veselovsky писал(а):
Посмотрите как исключения сделаны в Haskell'e. В языке их нет. Это библиотечная штука.

Кстати, при разработке MFC исключения тоже были реализованы не как часть языка. Хоть и макросы, но ведь от языка - независимо. Мысль хорошая!

Автор:  Сергей Прохоренко [ Воскресенье, 30 Январь, 2011 13:03 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Валерий Лаптев писал(а):
Alexey Veselovsky писал(а):
Посмотрите как исключения сделаны в Haskell'e. В языке их нет. Это библиотечная штука.

Кстати, при разработке MFC исключения тоже были реализованы не как часть языка. Хоть и макросы, но ведь от языка - независимо. Мысль хорошая!


Чем она хорошая? Следованием модной тенденции "вынесем в стандартную библиотеку всё, что только возможно"? В PureBuilder нет никакой границы между встроенным языком и стандартной библиотекой. Если бы это была многоязыковая система (а-ля .NET), то тогда это имело бы хоть какой-то смысл.

Автор:  Сергей Прохоренко [ Воскресенье, 30 Январь, 2011 13:12 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Сергей Прохоренко писал(а):
... я вижу две возможности привязать обработку исключений к функциям/процедурам в структурном редакторе:
  • можно предусмотреть стандартное задание условий вызова обработчиков исключений при табличном описании входных и выходных параметров и возвращаемого значения функции/процедуры;



Сюда стОит добавить и независимые от параметров условия нормального завершения функции/процедуры, при несоблюдении которых в точку вызова возвращаются порожденные исключения.

Автор:  Владислав Жаринов [ Воскресенье, 30 Январь, 2011 14:04 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Видимо, в совокупности эти два случая:
Сергей Прохоренко писал(а):
Сергей Прохоренко писал(а):
...
  • ...задание условий вызова обработчиков исключений при табличном описании ... и выходных параметров и возвращаемого значения функции/процедуры;

...и независимые от параметров условия нормального завершения функции/процедуры, при несоблюдении которых в точку вызова возвращаются порожденные исключения.
образуют аргументы оператора КОН "школьного" алгоязыка (показанного как операторы 32Д, 33Д здесь)?

Автор:  Валерий Лаптев [ Воскресенье, 30 Январь, 2011 14:37 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Сергей Прохоренко писал(а):
Валерий Лаптев писал(а):
Alexey Veselovsky писал(а):
Посмотрите как исключения сделаны в Haskell'e. В языке их нет. Это библиотечная штука.

Кстати, при разработке MFC исключения тоже были реализованы не как часть языка. Хоть и макросы, но ведь от языка - независимо. Мысль хорошая!


Чем она хорошая? Следованием модной тенденции "вынесем в стандартную библиотеку всё, что только возможно"? В PureBuilder нет никакой границы между встроенным языком и стандартной библиотекой. Если бы это была многоязыковая система (а-ля .NET), то тогда это имело бы хоть какой-то смысл.

Хороша тем, что не входит в язык и тем самым не усложняет компилятор.

Автор:  Сергей Прохоренко [ Воскресенье, 30 Январь, 2011 14:46 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Просто эта сложность переносится в стандартную библиотеку, без которой обойтись невозможно.

Автор:  Илья Ермаков [ Понедельник, 31 Январь, 2011 00:35 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Александр Шостак писал(а):
Илья, а вам не кажется, что это, как бы это сказать лучше, неправильно. Сперва использовать команды аварийного останова по условию (ASSERT), то есть схалтурить на обработке ошибок, а потом их перехватывать и продолжать работу? Имеем ту же лень и те же проблемы, что и в мейнстриме.


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

Тут есть грань между софтом, работающим в режиме "отказ - это нештатная ситуация" и "облом может произойти в любой момент, ждите его всегда".

Даже в клиент-серверном ПО недоступность центрального сервера с БД, например, это нештатная ситуация.

А вот в сервисно-ориентированном софте, где куча распределённых "контрагентов", 50 на 50 - обломится транзакция или завершится.

Автор:  Сергей Прохоренко [ Понедельник, 31 Январь, 2011 11:41 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Сергей Прохоренко писал(а):
  • можно предусмотреть вызов обработчиков исключений непосредственно в синтаксисе оператора вызова процедуры, оператора присваивания и операторов ввода/вывода, а не в блоке try:


Сюда следует добавить операторы выделения памяти new.

Автор:  Сергей Прохоренко [ Вторник, 01 Февраль, 2011 00:03 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Обработка исключительных ситуаций в PureBuilder

Раздел про обработку исключительных ситуаций добавлен на сайт PureBuilder.

Прошу высказывать замечания и предложения.

Автор:  Владислав Жаринов [ Четверг, 03 Февраль, 2011 17:05 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Сергей Прохоренко писал(а):
Для замечаний и предложений:

Обработка исключительных ситуаций в PureBuilder

Механизм исключений должен быть удобен для обработки ожидаемых аварийных событий во время выполнения программы. Но в PureBuilder механизм исключений модифицирован, чтобы его невозможно было применять для штатного алгоритма, что нарушало бы структурную парадигму программирования.
...
Вот такой вопрос возникает (как обычно, с позиции "предметника", взаимодействующего с программистом/аналитиком). На рисунке показан сценарий работы с "активным документом", записанный на языке "лист-силуэтов" (в принципе тот же Д2М-язык, только "положенный на бок" :D ). Предполагается, что его можно непосредственно выполнить в режиме интерпретации документа.
Вложение:
Комментарий к файлу: Фрагмент РДП-документа (графит-представление).
Лист8_РДП-макет_А2LS_Очередь(пример+опрос)10_2.png
Лист8_РДП-макет_А2LS_Очередь(пример+опрос)10_2.png [ 207.76 КБ | Просмотров: 8392 ]
Сочинитель предусмотрел в строке 3.7 инициируемое пользователем обновление некоей ДМ-схемы (её можно найти на этом рисунке) - скажем, чтобы отразить изменения состава процедур с момента последнего обновления, что не суть важно. Важно, что схема должна умещаться в формат, заданный для содержащего её жёсткого поля (возможно, он превышает размер контура поля - который в этом случае становится "окном прокрутки" по формату - но всё же формат конечен, а схема по правилам ДМ-языка неделима). Посему сочинитель предусмотрел при обновлении схемы также обработку ситуации, когда схема вышла за границы формата - очевидно, смысл обработки можно понять из схемы.
Вот что есть эта ситуация - исключение? если нет, то что? и как в Вашем представлении она обрабатывается (имея в виду, что Вы предназначаете механизм исключений "не для штатного алгоритма")?

Понятно, что граф-схемная форма здесь не суть важна - для меня это равноправная форма представления с текстовой (а если уместна табличная - то и с ней тоже) - поэтому смысл графа должен переводиться в текст и наоборот. Только какой смысл у данного случая?

Автор:  Сергей Прохоренко [ Пятница, 04 Февраль, 2011 10:48 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Драконограф писал(а):
Вот такой вопрос возникает...


Делать ли такую ситуацию исключением - решает программист.

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

Если программист хочет, чтобы нештатно завершившаяся процедура Б вернула какие-то значения, то он не сможет воспользоваться механизмом исключений. Чтобы всё же использовать механизм исключений, ему придется разбить свою процедуру Б на две. Нештатная процедура Б2 вызовет исключение и бесследно завершится, а другая процедура Б1 обработает исключение и вернет какие-то параметры в вызывающую процедуру А.

Автор:  Madzi [ Пятница, 04 Февраль, 2011 13:07 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Сергей Прохоренко писал(а):
Драконограф писал(а):
Вот такой вопрос возникает...


Делать ли такую ситуацию исключением - решает программист.

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

Если программист хочет, чтобы нештатно завершившаяся процедура Б вернула какие-то значения, то он не сможет воспользоваться механизмом исключений. Чтобы всё же использовать механизм исключений, ему придется разбить свою процедуру Б на две. Нештатная процедура Б2 вызовет исключение и бесследно завершится, а другая процедура Б1 обработает исключение и вернет какие-то параметры в вызывающую процедуру А.


Фактически предлагаемая вами система --- система обработки кодов возврата ошибки, но вы её зачем-то стараетесь усложнить и обособить.
У меня есть серьёзные сомнения по поводу её необходимости и эффективности.
Во-первых, часто просо кода ошибки (названия исключения) не достаточно, а требуется ещё некоторая дополнительная информация. В случае необходимости "ручной" обработки программисту придётся эту дополнительную информацию передавать и обрабатывать, а что делать с "автоматической"? Когда данные о процедуре, вызвавший исключение теряются.
Во-вторых, пример:
Код:
PROCEDURE Proc1 ();
BEGIN
    throw MyFavoriteException;
END Proc1;

call Proc1 ();
catch (MyFirstException)
...
catch (MySecondException)
...
endcall

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

Сейчас поясню для чего я спрашиваю.

Хотите обеспечить удобства программистам?
Вот в Java есть IOException у него есть потомки FileException , StreamException, и я могу обрабатывать только исключения IOException, при этом будут обработаны все исключения, которые являются его наследниками, если для них не предусмотренно специальных обработчиков. Это позволяет создавать независимые компоненты, которые не требуется перекомпилировать при изменении других компонент.

Предположим, что в моём примере Proc1 расположена в одном модуле (mod1), а вызывающая процедура в другом (mod2). В таком случае изменения модуля (mod1) будут требовать обязательной перекомпиляции модуля (mod2).

Автор:  Сергей Прохоренко [ Пятница, 04 Февраль, 2011 15:45 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Madzi писал(а):
Фактически предлагаемая вами система --- система обработки кодов возврата ошибки, но вы её зачем-то стараетесь усложнить и обособить.


Я недвусмысленно написал, что это гибрид. Сейчас никакой "системы обработки кодов возврата ошибки" просто нет - каждый программист ваяет что-то свое, не имея необходимого синтаксиса в языке программирования. Я же ее создаю и встраиваю в структурный редактор PureBuilder в качестве "конструктора", готового к употреблению. Кроме того, прерывания не создают кодов ошибки, а в предложенном модифицированном механизме исключений такая возможность это есть.

Madzi писал(а):
Во-первых, часто просо кода ошибки (названия исключения) не достаточно, а требуется ещё некоторая дополнительная информация. В случае необходимости "ручной" обработки программисту придётся эту дополнительную информацию передавать и обрабатывать, а что делать с "автоматической"? Когда данные о процедуре, вызвавший исключение теряются.


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

Madzi писал(а):
...что будет происходить, когда в вызывающей процедуре не предусмотрена обработка вызванного исключения?


Это должно быть сделано физически невозможным. В вызывающей процедуре должна быть предусмотрена обработка всех возможных исключений вызываемой процедуры (т.е. все необходимые ветви catch). Их не должно быть много, поскольку исключения локализованы на самом нижнем уровне, а не являются глобальными в программе. Если соответствующая ветвь catch пуста (программист не заполнил), то программа будет выполняться дальше без каких-либо значений параметров из зевершенной нештатно процедуры. Если в дальнейшем произойдет обращение к неинициализированной переменной, то это должно вызвать исключительную ситуацию.

Madzi писал(а):
В таком случае изменения модуля (mod1) будут требовать обязательной перекомпиляции модуля (mod2).


Никакая перекомпиляция вызывающей процедуры не требуется, если только не поменялся перечень возможных исключений в вызываемой. Это как с количеством параметров в вызывающей и вызываемой процедурах. Если оно поменялось - надо перекомпилировать, а то глупый компьютер не поймет, чего хотел программист. :wink:

Страница 2 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/