OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 11 Август, 2025 19:26

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




Начать новую тему Ответить на тему  [ Сообщений: 178 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7, 8, 9  След.
Автор Сообщение
СообщениеДобавлено: Среда, 22 Октябрь, 2008 17:01 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Хорошо хоть, в примере, разработчик поставил проверку контракта :) По имени процедуры, в которой стоит ASSERT, я смогу хотя бы определить вычислительную ситуацию, и что же неправильно подаётся этому модулю на вход. Ну а если даже проверки контракта нет, то нафик сдался глючный модуль? Какой смысл подавлять его ошибку, если он не выполняет возложенную на него задачу. Не надо выдумывать сферического коня в вакууме: купить модуль без исходников, потом потерять связь с разработчиком (умер, поменял веру, украли инопланетяне), и надеяться на лучшее, подавляя исключения глючного модуля - это, по меньшей мере, безответственно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 17:24 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Vlad писал(а):
Тогда это опять противопоставление "реальной жизни" и идеализиолванного мира оберона :) Ну вот дали вам обероновский модуль, без исходников, работает хорошо, только раз в сутки у клиента он падает с ASSERT'ом с номером 123.
Ну ну. ASSERT с номерм ... это похоже на Access violation ... или еще какой экскепшен.

Общее в том, что:
- запрашиваемая пользователем функция программой не выполнена из-за ошибки в коде;
- некая информация выводится пользователю;
- эту информацию обычно предлагается отправить разработчику;

Разница:
- в этой информации. В ББ по окну указывается место ошибки в коде и значения переменных. В винде предлагается отправить дамп и адрес в экзешнике;
- ББ работает дальше как и работал (не работает 1 функция), прочие программы могут падать целиком.

Возможность проглотить ошибку (с обработкой или без) есть и там и там, от разработчика зависит, будет он ёё использовать или нет.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 17:24 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Иван Кузьмицкий писал(а):
Хорошо хоть, в примере, разработчик поставил проверку контракта :) По имени процедуры, в которой стоит ASSERT, я смогу хотя бы определить вычислительную ситуацию, и что же неправильно подаётся этому модулю на вход.


Блин! Ну что за наивность такая. Ну будет называться функция "f123". И будет она в стэке десятая по счету от интерфейса модуля. Это сильно поможет? На вход подается все правильно. А падает оно, например, потому, что булевская переменная непроиничена и чаще всего там оказывается false и все работает, но иногда (в зависимости от содержимого мусора в стэке) там оказывается true и все падает.

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


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 17:32 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Евгений Темиргалеев писал(а):
Возможность проглотить ошибку (с обработкой или без) есть и там и там, от разработчика зависит, будет он ёё использовать или нет.


Ну вот и покажите, как в обероне штатными средствами обработать такой ASSERT. Стандартными обероновскими средствами нельзя, ладно. Покажите в BB как диагностировать такую ситуацию, перегрузить упавший модуль (или даже весь BB), повторить поптку, и все это без вмешательства пользователя. Да, я верю, что это можно сделать, поковырявшись в Kernel. Претензия только к тому, что хочется обычные ситуации обрабатвать штатными (документированными) средствами, а не изобретать велосипед.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 17:35 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
AVC писал(а):
Евгений Темиргалеев писал(а):
В КП память собирает сборщик мусора (100% гарантия сборки, программист ничего не пишет для этого); прочие ресурсы типа файлов закрываются в FINALIZE (программист реализует метод; вызовов не пишет; гарантия освобождения 100%).
Это всё верно.
Но остаются вопросы:
  • о своевременности возврата ресурсов;
  • о том, в каком месте программа реагирует на ошибку.

  • Про своевременность возврата ресурсов info21 писал, как сделать, если оно надо.
  • Это зависит от разработчика. Где ему надо, он там и поставит обработку кода ошибки/исключительной ситуации.
Лично я не вижу смысла в этих обсуждениях, т. к. имеющихся в ББ средств вполне достаточно для разработки качественного ПО.

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


Последний раз редактировалось Евгений Темиргалеев Среда, 22 Октябрь, 2008 17:48, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 17:45 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Vlad писал(а):
Ну вот и покажите, как в обероне штатными средствами обработать такой ASSERT.
Уже говорили выше про
Код:
MODULE Kernel;
...
   PROCEDURE InstallTrapChecker (h: Handler);
   PROCEDURE InstallTrapViewer (h: Handler);
   PROCEDURE InterfaceTrapHandler (excpRec, estFrame, context, dispCont: INTEGER): INTEGER;
Использование этих готовых средств не есть изобретение велосипеда. Если Вам надо, как использовать, разберётесь. Мне было пока не надо. И вообще, лучше Вы мне покажите, что в ББ нету средств, которые позволят обработать ASSERT.
Vlad писал(а):
Покажите в BB как диагностировать такую ситуацию, перегрузить упавший модуль (или даже весь BB), повторить поптку, и все это без вмешательства пользователя.
Повторить попытку выполнения ошибочного кода, чтобы он снова упал?? Умно. :twisted:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 17:55 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Евгений Темиргалеев писал(а):
[list][*]Про своевременность возврата ресурсов info21 писал, как сделать, если оно надо.


info21 говорил не про своевременность, а про порядок. То, что он предлагает слишком сложно даже для mainstream языков ;) Еще он предлагал вешать на таймер принудительную сборку мусора - тоже не самое элегантное решение даже для mainstream и имеет принципиальные недостатки.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 18:07 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Vlad писал(а):
info21 говорил не про своевременность, а про порядок.
Да, ошибся. Своевременность, если она нужна, достигается явным вызовом сборщика мусора.
Vlad писал(а):
То, что он предлагает слишком сложно даже для mainstream языков ;).
А что значит "даже"? Не вижу никаких проблем реализации предложенного info21 в ББ, во-первых. Во-вторых, задачи часто решаются сложные. Вопрос в том, реальные эти задачи или надуманные.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 18:34 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Евгений Темиргалеев писал(а):
Своевременность, если она нужна, достигается явным вызовом сборщика мусора.


Т.е., после каждого захвата ресурса насильно звать сборщик мусора? А если ссылка на объект все еще присутствует? А если в силу консервативности сборщика в BB именно этот важный ресурс именно на этом космическом корабле именно в этот момент времени не соберется GC? Не слишком ли много "если" для надежного языка?

Евгений Темиргалеев писал(а):
Vlad писал(а):
То, что он предлагает слишком сложно даже для mainstream языков ;).
А что значит "даже"?


"Даже" значит, что для "простого" оберона это вообще не приемлемо.

Евгений Темиргалеев писал(а):
Не вижу никаких проблем реализации предложенного info21 в ББ, во-первых.


А вы попробуйте. Не реализовать, а пользоваться возможной реализацией.

Евгений Темиргалеев писал(а):
Во-вторых, задачи часто решаются сложные. Вопрос в том, реальные эти задачи или надуманные.


Это да... Еще задачи бывают разные. Одно дело символьную алгебру упрощать (или чем там info21 занимается), а другое дело обеспечить работу системы 24*7 в реальной ОС с реальными ошибками. В одном случае можно отбиться ASSERT'ми от всех ошибок и вообще не думать о ресурсах, а в другом требуется уметь правильно обработать любую ошибку (и свою, и внешней среды).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 18:48 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Vlad писал(а):
Блин! Ну что за наивность такая. Ну будет называться функция "f123". И будет она в стэке десятая по счету от интерфейса модуля. Это сильно поможет? На вход подается все правильно. А падает оно, например, потому
Ещё раз повторяю - если нарушен контракт, то я об этом узнаю. Если проверка контракта не делается, а внутри модуля навоз, то заворачивать его в ексепшн - да хоть обзаворачивайся, гниль всё равно вылезет не тут, так здесь. Понимаю, это реальность майнстрима, но на то он и майнстрим. Я не за отрицание ексепшнов, я за "поправить в консерватории".

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


Это не сферический конь, это вполне заурядная ситуация. Да, лучше иметь все в исходниках, но не всегда это возможно. Сферический конь - это один язык, все в исходниках, и все написано идеальными программистами.
Один язык - это хорошо! Это удобно и надёжно. Почему бы при этом не иметь исходников? Жадные авторы не дают, а глупые менеджеры не смогли договориться. Проблема глючной функции в модуле без исходников и без автора, вовсе не в отсутствии эксепшнов, я считаю.

Да, и начал-то я, мысль высказывать, не про чей-то сто лет назад написанный убогий модуль, а про процесс разработки уже сейчас, чтобы не надеялся разработчик на эксепшны "потом", и сразу делал как надо - "сейчас". А Вы разворачиваете совершенно другую ситуацию, и опять, что характерно, в оппозиции "оберон vs суровая реальность". Извините. Спасибо.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 19:02 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Vlad писал(а):
Ну вот и покажите, как в обероне штатными средствами обработать такой ASSERT. Стандартными обероновскими средствами нельзя, ладно. Покажите в BB как диагностировать такую ситуацию, перегрузить упавший модуль (или даже весь BB), повторить поптку, и все это без вмешательства пользователя. Да, я верю, что это можно сделать, поковырявшись в Kernel. Претензия только к тому, что хочется обычные ситуации обрабатвать штатными (документированными) средствами, а не изобретать велосипед.
Пока что вижу только один простой способ: задействовать Services.Action для вызова процедуры и последующей проверки флага ошибки.
В случае ошибки действительно вызвать Services.Collect.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 19:26 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Vlad писал(а):
Это да... Еще задачи бывают разные. Одно дело символьную алгебру упрощать (или чем там info21 занимается), а другое дело обеспечить работу системы 24*7 в реальной ОС с реальными ошибками. В одном случае можно отбиться ASSERT'ми от всех ошибок и вообще не думать о ресурсах, а в другом требуется уметь правильно обработать любую ошибку (и свою, и внешней среды).
info21 пишет себе символьную алгебру для решения своих физич. задач. И успешно их решает при помощи неё. А Вы, наверное, сначала упрощали символьную алгебру и решали схожие с info21 задачи, что знаете как там можно думать/не думать про ресурсы; а теперь пишете реальные ОС? Вот и докажите нам. Что это не возможно сделать без исключений.... Мммм а как раньше делали ОС реального времени? Механизм исключений наверно был изначально?

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

Пора бы прирезать в духе Оберона* эти все обсуждения и перейти к решению реальной задачи. Например, viewtopic.php?p=19952#p19952, если действительно нужна реализация на ББ.

*Простота вместо избыточной сложности <=> решение реальных задач вместо надуманных.
В смысле избыточная сложность в ИТ сфере является в основном результатом решения надуманных задач, имхо.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 20:54 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
AVC писал(а):
Vlad писал(а):
Ну вот и покажите, как в обероне штатными средствами обработать такой ASSERT. Стандартными обероновскими средствами нельзя, ладно. Покажите в BB как диагностировать такую ситуацию, перегрузить упавший модуль (или даже весь BB), повторить поптку, и все это без вмешательства пользователя. Да, я верю, что это можно сделать, поковырявшись в Kernel. Претензия только к тому, что хочется обычные ситуации обрабатвать штатными (документированными) средствами, а не изобретать велосипед.
Пока что вижу только один простой способ: задействовать Services.Action для вызова процедуры и последующей проверки флага ошибки.
В случае ошибки действительно вызвать Services.Collect.
Я выразился туманно. Вот (очень грубый) набросок.
Код:
MODULE AlexTrap;

   IMPORT Log, Services;
   
   TYPE
      CatchAction = POINTER TO RECORD (Services.Action) END;
      SomeResource = POINTER TO RECORD END;
      
   VAR
      n, err: INTEGER;
      a: CatchAction;
      
   PROCEDURE Work;
      VAR p: SomeResource;
   BEGIN
      NEW(p); (* для работы нужен ресурс *)
      INC(n); (* напряженная работа *)
      Log.Int(n); Log.Ln; (* выдача/сохранение важных результатов *)
      (* вах, ошибка! *)
      IF n < 8 THEN
         err := 1; (* да, ошибка *)
         HALT(128);
      END;
   END Work;
   
   PROCEDURE (a: CatchAction) Do;
   BEGIN
      IF err # 0 THEN
         (* работа незавершена, надо продолжить *)
         Log.String("Cought!"); Log.Ln;
         err := 0;
         Services.Collect;
         Services.DoLater(a, 0);
         Work
      ELSE
         Log.String("URA! Work is done!!"); Log.Ln; (* работа с боями завершена *)
      END
   END Do;

   PROCEDURE (p: SomeResource) FINALIZE;
   BEGIN
      Log.String("Release resource"); Log.Ln; (* освободим ресурс *)
   END FINALIZE;

   PROCEDURE Run* ; (* обёртка для процедуры work *)
   BEGIN
      n := 0; (* инициализация *)
      Services.DoLater(a, 0);
      Work;
   END Run;
   
BEGIN
   err := 0;
   NEW(a);
END AlexTrap.
:!: AlexTrap.Run


Последний раз редактировалось AVC Среда, 22 Октябрь, 2008 21:33, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 21:26 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
А то уж поправлять собрался...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 21:27 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
AVC писал(а):
Вот (очень грубый) набросок.


Да, постоянный pull это конечно кривовато, но соглашусь, что это возможное решение.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 21:30 

Зарегистрирован: Четверг, 18 Сентябрь, 2008 18:31
Сообщения: 36
Vlad писал(а):
Откуда такое противоставление "жёстких проверок пред- и постусловий" и исключений?

Vlad, для пред- и постусловий есть математический аналог.
Вспоминаем школьный курс математики, раздел - функции:
[*]Область определения - вот Вам предусловие
[*]Область значений - вот Вам постусловие
Если сработал ASSERT на предусловие - это Ваш косяк, если сработал на постусловие - это косяк разработчика. (и пинать его в данном случае следует сильно и нещадно :))
А какой есть аналог у исключений?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 21:38 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Евгений Темиргалеев писал(а):
А Вы, наверное, сначала упрощали символьную алгебру и решали схожие с info21 задачи, что знаете как там можно думать/не думать про ресурсы;


Ну серьезно, какие там ресурсы? Файл с результатами не забыть закрыть? Да если и забыть - ничего страшного, всегда можно ручками вмешаться.

Евгений Темиргалеев писал(а):
а теперь пишете реальные ОС? Вот и докажите нам. Что это не возможно сделать без исключений.... Мммм а как раньше делали ОС реального времени? Механизм исключений наверно был изначально?


ОС реального времени меня мало интересуют. Ну возьмите самый обычный connection к базе и расскажите жабистам, что вы его будете закрывать при сборке мусора. Засмеют...

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


Ну как хотите...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 21:45 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Neus писал(а):
А какой есть аналог у исключений?


Лучше покажите, что ASSERT не может быть исключением.

#define ASSERT(condition) if (!condition) throw assert_t()


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 21:49 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Vlad писал(а):
Да, постоянный pull это конечно кривовато, но соглашусь, что это возможное решение.
Да, (и для меня) выглядит как-то непривычно.
Насчет постоянного pullа: CatchAction вызывается ровно столько же раз, сколько и Work.
В принципе, можно создать модуль Wrapper (можно и по другому назвать).
Вызов будет выглядеть примерно так: Wrapper.Wrap(Work) или Wrapper.Try(Work). :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 23 Октябрь, 2008 06:16 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2463
Откуда: Россия, Томск
AVC писал(а):
Wrapper.Wrap(Work) или Wrapper.Try(Work). :)
Kernel.Try и Kernel.TrapHandler - пожалуйста. Аналогичным образом можно реализовать любую работу с исключениями внутри BlackBox - библиотечными средствами. Тема, я так понимаю, о том, надо ли это всё в языке. Я по-прежнему считаю, что нет.


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

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


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

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


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

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