OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 29 Март, 2024 02:16

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




Начать новую тему Ответить на тему  [ Сообщений: 52 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: Суббота, 29 Январь, 2011 13:57 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
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.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 29 Январь, 2011 14:29 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Сергей Прохоренко писал(а):
Alexey Veselovsky писал(а):
Также в Ada исключения чудо как хороши.


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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 29 Январь, 2011 20:29 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Мне кажется, что лучше заимствовать механизм обработки исключений из функциональных языков, чем из императивных языков, включая Ada. По большому счету механизмы обработки исключений в императивных языках мало отличаются друг от друга и от унифицированного механизма обработки исключений в платформе .NET.

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


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


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


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


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


Последний раз редактировалось Сергей Прохоренко Суббота, 29 Январь, 2011 20:50, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 29 Январь, 2011 20:33 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Посмотрите как исключения сделаны в Haskell'e. В языке их нет. Это библиотечная штука.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 29 Январь, 2011 20:40 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Alexey Veselovsky писал(а):
Посмотрите как исключения сделаны в Haskell'e. В языке их нет. Это библиотечная штука.


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 29 Январь, 2011 20:43 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Сергей Прохоренко писал(а):
Alexey Veselovsky писал(а):
Посмотрите как исключения сделаны в Haskell'e. В языке их нет. Это библиотечная штука.


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

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


Последний раз редактировалось Alexey Veselovsky Суббота, 29 Январь, 2011 21:04, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 29 Январь, 2011 20:46 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Спасибо! :D Обязательно посмотрю.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 30 Январь, 2011 11:32 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Alexey Veselovsky писал(а):
Посмотрите как исключения сделаны в Haskell'e. В языке их нет. Это библиотечная штука.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 30 Январь, 2011 13:03 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Валерий Лаптев писал(а):
Alexey Veselovsky писал(а):
Посмотрите как исключения сделаны в Haskell'e. В языке их нет. Это библиотечная штука.

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


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


Последний раз редактировалось Сергей Прохоренко Воскресенье, 30 Январь, 2011 13:13, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 30 Январь, 2011 13:12 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Сергей Прохоренко писал(а):
... я вижу две возможности привязать обработку исключений к функциям/процедурам в структурном редакторе:
  • можно предусмотреть стандартное задание условий вызова обработчиков исключений при табличном описании входных и выходных параметров и возвращаемого значения функции/процедуры;



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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 30 Январь, 2011 14:04 

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 30 Январь, 2011 14:37 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Сергей Прохоренко писал(а):
Валерий Лаптев писал(а):
Alexey Veselovsky писал(а):
Посмотрите как исключения сделаны в Haskell'e. В языке их нет. Это библиотечная штука.

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


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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 30 Январь, 2011 14:46 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Просто эта сложность переносится в стандартную библиотеку, без которой обойтись невозможно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 31 Январь, 2011 00:35 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Александр Шостак писал(а):
Илья, а вам не кажется, что это, как бы это сказать лучше, неправильно. Сперва использовать команды аварийного останова по условию (ASSERT), то есть схалтурить на обработке ошибок, а потом их перехватывать и продолжать работу? Имеем ту же лень и те же проблемы, что и в мейнстриме.


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

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 31 Январь, 2011 11:41 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Сергей Прохоренко писал(а):
  • можно предусмотреть вызов обработчиков исключений непосредственно в синтаксисе оператора вызова процедуры, оператора присваивания и операторов ввода/вывода, а не в блоке try:


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 01 Февраль, 2011 00:03 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Обработка исключительных ситуаций в PureBuilder

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

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


Последний раз редактировалось Сергей Прохоренко Среда, 09 Февраль, 2011 10:35, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 03 Февраль, 2011 17:05 

Зарегистрирован: Воскресенье, 01 Ноябрь, 2009 05:13
Сообщения: 2046
Сергей Прохоренко писал(а):
Для замечаний и предложений:

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 04 Февраль, 2011 10:48 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Драконограф писал(а):
Вот такой вопрос возникает...


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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 04 Февраль, 2011 13:07 
Аватара пользователя

Зарегистрирован: Суббота, 12 Июль, 2008 22:49
Сообщения: 575
Откуда: Россия, Санкт-Петербург
Сергей Прохоренко писал(а):
Драконограф писал(а):
Вот такой вопрос возникает...


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

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

Если программист хочет, чтобы нештатно завершившаяся процедура Б вернула какие-то значения, то он не сможет воспользоваться механизмом исключений. Чтобы всё же использовать механизм исключений, ему придется разбить свою процедуру Б на две. Нештатная процедура Б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 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Madzi писал(а):
Фактически предлагаемая вами система --- система обработки кодов возврата ошибки, но вы её зачем-то стараетесь усложнить и обособить.


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

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


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

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


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

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


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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 52 ]  На страницу Пред.  1, 2, 3  След.

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


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

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


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

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB