Оберон-клуб «ВЄДАsoft» https://zx.oberon.org/forum/ |
|
Игнорировать результат процедуры https://zx.oberon.org/forum/viewtopic.php?f=46&t=158 |
Страница 1 из 2 |
Автор: | Len [ 20 ноя 2013, 15:30 ] |
Заголовок сообщения: | Игнорировать результат процедуры |
В архиве S.Atan`а в файле Console.mod есть вызов процедуры Код: "OBERON"
Я так понимаю, это и выводит сообщение в консоль, но как это работает? SYSTEM.PUTREG это какой-то регистр? И почему первый параметр 0? |
Автор: | Zorko [ 21 ноя 2013, 05:20 ] |
Заголовок сообщения: | Re: Игнорировать результат процедуры |
Как мы знаем, в Си (и в Object Pascal) можно вызвать функцию с игнорированием её результата. Это часто используется, например, при работе с WinApi, где многие функции принято вызывать таким способом, ибо их результаты иногда побочные и поэтому не нужны в вызывающем коде. Оберон в этом смысле является более строгим: он считает, что раз в процедуре предусмотрен результат, то уж пусть программист не забудет его получить и проанализировать, чтобы избавиться от всевозможных потенциальных проблем. Впрочем, ETH Oberon (OPCL), насколько я помню, тоже разрешает игнорировать результат процедур. Просто замените код на Windows.WriteFile(hout, str, n, n, NIL), должно работать. Так что SYSTEM.PUTREG — это просто уловка, которая придумана для Компонентного Паскаля (в реализации BlackBox) чтобы не использовать таких лишних переменных: Код: "OBERON"
В рассылке по BlackBox предложили ещё и такой вариант: Код: "OBERON"
SYSTEM.PUTREG(0, ...) же говорит компилятору, что результат нужно поместить в регистр EAX (кодируется значением 0). А поскольку в реализации BlackBox для возвращения 32-битных значений и так используется регистр EAX, мы имеем самый оптимальный код. Так что это просто эффективный способ проигнорировать результат процедуры. Конечно, способ системный и не очень в духе Оберона, но для низкоуровневых применений вполне годится. Другой вопрос: правильно ли сделал профессор Вирт, что не разрешил игнорирование результата? Я уверен, что это оправданное решение. В Обероне есть такие фишки, которые на взгляд опытного сишника покажутся неудобством, т.к. принуждают более продуманно писать код, но как итог — экономится много времени на отладке. Ведь явно использованный SYSTEM.PUTREG говорит о принятом программистом решении проигнорировать результат, а не о том, что, возможно (а часто и случается при работе на Си), программист просто о нём забыл. |
Автор: | Jordan [ 21 ноя 2013, 05:42 ] |
Заголовок сообщения: | Re: Игнорировать результат процедуры |
Не знал о такой особенности КП. Zorko писал(а): но мною экспериментально было выяснено, что компилятор не оптимизирует это выражение, генерируя проверку и пустой переход. SYSTEM.PUTREG(0, ...) же говорит компилятору, что результат нужно поместить в регистр EAX (кодируется значением 0). Всё же это преждевременная оптимизация, да ещё и не переносимая. |
Автор: | Zorko [ 21 ноя 2013, 05:48 ] |
Заголовок сообщения: | Re: Игнорировать результат процедуры |
А Windows.WriteFile(...) переносимое? Вобщем-то никто не мешает и компилятор BlackBox'а усовершенствовать, чтобы IF Windows.WriteFile(...) = 0 THEN END оптимизировал. Тогда и будет переносимо. Просто OMinc очень маленькая компания. Им не хватило на это ресурсов. |
Автор: | Jordan [ 21 ноя 2013, 06:00 ] |
Заголовок сообщения: | Re: Игнорировать результат процедуры |
Zorko писал(а): Вобщем-то никто не мешает и компилятор BlackBox'а усовершенствовать, чтобы IF Windows.WriteFile(...) = 0 THEN END оптимизировал. Хорошо бы если бы компилятор умел это оптимизировать. Но лучше об этом не беспокоиться. То есть при написании программ на обероне, не следует задумываться о такой "узкой оптимизации". Всё это имхо. Zorko писал(а): libc даёт возможность делать GUI-программы? GUI библиотек полно, к примеру самая минимальная CGUI. libc я рассматриваю как эталонную стандартную библиотеку, которая есть во всех системах. Или по вверх данной либы реализовать для оберона. Zorko писал(а): А в Linux'е можно пользоваться Wine. Всё это относительно. Костыль, хоть и работающий. Мне больше импонирует ваш компилятор, чем целая среда ББ. Так как компилятор перенести легче. Внешних редакторов кода куча, бери и пиши. |
Автор: | geniepro [ 21 ноя 2013, 07:25 ] |
Заголовок сообщения: | Re: Игнорировать результат процедуры |
Zorko писал(а): Как мы знаем, в Си (и в Object Pascal) можно вызвать функцию с игнорированием её результата. ... ... SYSTEM.PUTREG — это просто уловка, которая придумана для Компонентного Паскаля (в реализации BlackBox) чтобы не использовать таких лишних переменных: Код: "OBERON"
Ведь явно использованный SYSTEM.PUTREG говорит о принятом программистом решении проигнорировать результат, а не о том, что, возможно (а часто и случается при работе на Си), программист просто о нём забыл. В языках Ocaml/F# для такой цели есть функция-процедура, которая так и называется: ignore. Она просто игнорирует переданное ей значение. Почему в КП/ББ не ввели аналогичную процедуру? А то ведь это совсем не очевидно, что "явно использованный SYSTEM.PUTREG говорит о принятом программистом решении проигнорировать результат"... |
Автор: | Zorko [ 21 ноя 2013, 07:32 ] |
Заголовок сообщения: | Re: Игнорировать результат процедуры |
geniepro писал(а): Почему в КП/ББ не ввели аналогичную процедуру? Из соображений минимализма. А то на каждый чих не наздравствуешься. ![]() geniepro писал(а): А то ведь это совсем не очевидно, что "явно использованный SYSTEM.PUTREG говорит о принятом программистом решении проигнорировать результат"... Использовать SYSTEM.PUTREG чтобы заныкать результат — это конечно трюк. И непереносимый. Но код, который работает напрямую с регистрами, выглядит иначе, поэтому здесь трудно перепутать.
|
Автор: | geniepro [ 21 ноя 2013, 07:52 ] |
Заголовок сообщения: | Re: Игнорировать результат процедуры |
Zorko писал(а): geniepro писал(а): Почему в КП/ББ не ввели аналогичную процедуру? Из соображений минимализма. А то на каждый чих не наздравствуешься. ![]() При чём здесь минимализм??? Добавить одну процедурку -- это лишний чих??? Малозначительное языковое средство??? (язык тут вообще при чём?) Неужели оберонщиков и правда устраивает такая ситуация, при которой приходится плодить тонны невнятного говнокода? И всё из-за соображений какого-то там минимализма... |
Автор: | Jordan [ 21 ноя 2013, 10:36 ] |
Заголовок сообщения: | Re: Игнорировать результат процедуры |
Зачем игнорировать возвращаемое значение функции? Есть функция WriteFile - возвращает количество записанных байт. Нужно же проверить, данные записались или нет. Или программа будет падать при записи данных? Ещё есть функция getlasterror для уточнения ошибки. К примеру может закончится место на диске, файл помечен как только чтение и ещё, что то. Пользователя нужно известить о ошибке или по определённому сценарию обработать. Вывести сообщение, мол таки капуть. В идеале нужно написать обёртку для данной функции, где бы в одном месте учитывались данные условия. |
Автор: | Jordan [ 21 ноя 2013, 10:40 ] |
Заголовок сообщения: | Re: Игнорировать результат процедуры |
geniepro писал(а): Неужели оберонщиков и правда устраивает такая ситуация, при которой приходится плодить тонны невнятного говнокода? И всё из-за соображений какого-то там минимализма... Я сам пока не разобрался, данный минимализм это техническая потребность или идеологическая. |
Страница 1 из 2 | Часовой пояс: UTC + 2 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |