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

Твердыня модульных языков
Текущее время: 29 мар 2024, 00:01

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




Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: 20 ноя 2013, 15:30 
Не в сети

Сообщения: 116
Откуда: Каменск-Уральский
В архиве S.Atan`а в файле Console.mod есть вызов процедуры
Код: "OBERON"
  1. SYSTEM.PUTREG(0, Windows.WriteFile(hout, str, n, n, NIL));

Я так понимаю, это и выводит сообщение в консоль, но как это работает? SYSTEM.PUTREG это какой-то регистр? И почему первый параметр 0?


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 21 ноя 2013, 05:20 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Как мы знаем, в Си (и в Object Pascal) можно вызвать функцию с игнорированием её результата. Это часто используется, например, при работе с WinApi, где многие функции принято вызывать таким способом, ибо их результаты иногда побочные и поэтому не нужны в вызывающем коде.

Оберон в этом смысле является более строгим: он считает, что раз в процедуре предусмотрен результат, то уж пусть программист не забудет его получить и проанализировать, чтобы избавиться от всевозможных потенциальных проблем. Впрочем, ETH Oberon (OPCL), насколько я помню, тоже разрешает игнорировать результат процедур. Просто замените код на Windows.WriteFile(hout, str, n, n, NIL), должно работать.

Так что SYSTEM.PUTREG — это просто уловка, которая придумана для Компонентного Паскаля (в реализации BlackBox) чтобы не использовать таких лишних переменных:
Код: "OBERON"
  1. VAR dumb: INTEGER;
  2. BEGIN dumb := Windows.WriteFile(hout, str, n, n, NIL); (* Далее dumb не используется нигде. *)

В рассылке по BlackBox предложили ещё и такой вариант:
Код: "OBERON"
  1. IF Windows.WriteFile(hout, str, n, n, NIL) = 0 THEN END;
но мною экспериментально было выяснено, что компилятор не оптимизирует это выражение, генерируя проверку и пустой переход.

SYSTEM.PUTREG(0, ...) же говорит компилятору, что результат нужно поместить в регистр EAX (кодируется значением 0). А поскольку в реализации BlackBox для возвращения 32-битных значений и так используется регистр EAX, мы имеем самый оптимальный код. Так что это просто эффективный способ проигнорировать результат процедуры.

Конечно, способ системный и не очень в духе Оберона, но для низкоуровневых применений вполне годится. Другой вопрос: правильно ли сделал профессор Вирт, что не разрешил игнорирование результата? Я уверен, что это оправданное решение. В Обероне есть такие фишки, которые на взгляд опытного сишника покажутся неудобством, т.к. принуждают более продуманно писать код, но как итог — экономится много времени на отладке.

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


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 21 ноя 2013, 05:42 
Не в сети

Сообщения: 53
Откуда: Россия, Самара
Не знал о такой особенности КП.

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

SYSTEM.PUTREG(0, ...) же говорит компилятору, что результат нужно поместить в регистр EAX (кодируется значением 0).


Всё же это преждевременная оптимизация, да ещё и не переносимая.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 21 ноя 2013, 05:48 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
А Windows.WriteFile(...) переносимое?

Вобщем-то никто не мешает и компилятор BlackBox'а усовершенствовать, чтобы IF Windows.WriteFile(...) = 0 THEN END оптимизировал. Тогда и будет переносимо. Просто OMinc очень маленькая компания. Им не хватило на это ресурсов.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 21 ноя 2013, 06:00 
Не в сети

Сообщения: 53
Откуда: Россия, Самара
Zorko писал(а):
Вобщем-то никто не мешает и компилятор BlackBox'а усовершенствовать, чтобы IF Windows.WriteFile(...) = 0 THEN END оптимизировал.


Хорошо бы если бы компилятор умел это оптимизировать. Но лучше об этом не беспокоиться. То есть при написании программ на обероне, не следует задумываться о такой "узкой оптимизации".
Всё это имхо.

Zorko писал(а):
libc даёт возможность делать GUI-программы?


GUI библиотек полно, к примеру самая минимальная CGUI. libc я рассматриваю как эталонную стандартную библиотеку, которая есть во всех системах. Или по вверх данной либы реализовать для оберона.

Zorko писал(а):
А в Linux'е можно пользоваться Wine. Всё это относительно.

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


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 21 ноя 2013, 07:25 
Не в сети

Сообщения: 203
Zorko писал(а):
Как мы знаем, в Си (и в Object Pascal) можно вызвать функцию с игнорированием её результата.
...
... SYSTEM.PUTREG — это просто уловка, которая придумана для Компонентного Паскаля (в реализации BlackBox) чтобы не использовать таких лишних переменных:
Код: "OBERON"
  1. VAR dumb: INTEGER;
  2. BEGIN dumb := Windows.WriteFile(hout, str, n, n, NIL); (* Далее dumb не используется нигде. *)
...
Ведь явно использованный SYSTEM.PUTREG говорит о принятом программистом решении проигнорировать результат, а не о том, что, возможно (а часто и случается при работе на Си), программист просто о нём забыл.

В языках Ocaml/F# для такой цели есть функция-процедура, которая так и называется: ignore. Она просто игнорирует переданное ей значение.

Почему в КП/ББ не ввели аналогичную процедуру? А то ведь это совсем не очевидно, что "явно использованный SYSTEM.PUTREG говорит о принятом программистом решении проигнорировать результат"...


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 21 ноя 2013, 07:32 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
geniepro писал(а):
Почему в КП/ББ не ввели аналогичную процедуру?
Из соображений минимализма. А то на каждый чих не наздравствуешься. :) От раздутия языковых средств сами знаете что бывает. Да ещё и настолько (сравнительно) малозначительных.

geniepro писал(а):
А то ведь это совсем не очевидно, что "явно использованный SYSTEM.PUTREG говорит о принятом программистом решении проигнорировать результат"...
Использовать SYSTEM.PUTREG чтобы заныкать результат — это конечно трюк. И непереносимый. Но код, который работает напрямую с регистрами, выглядит иначе, поэтому здесь трудно перепутать.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 21 ноя 2013, 07:52 
Не в сети

Сообщения: 203
Zorko писал(а):
geniepro писал(а):
Почему в КП/ББ не ввели аналогичную процедуру?
Из соображений минимализма. А то на каждый чих не наздравствуешься. :) От раздутия языковых средств сами знаете что бывает. Да ещё и настолько (сравнительно) малозначительных.


При чём здесь минимализм???
Добавить одну процедурку -- это лишний чих???
Малозначительное языковое средство??? (язык тут вообще при чём?)

Неужели оберонщиков и правда устраивает такая ситуация, при которой приходится плодить тонны невнятного говнокода? И всё из-за соображений какого-то там минимализма...


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 21 ноя 2013, 10:36 
Не в сети

Сообщения: 53
Откуда: Россия, Самара
Зачем игнорировать возвращаемое значение функции?

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

Ещё есть функция getlasterror для уточнения ошибки.

К примеру может закончится место на диске, файл помечен как только чтение и ещё, что то. Пользователя нужно известить о ошибке или по определённому сценарию обработать. Вывести сообщение, мол таки капуть.

В идеале нужно написать обёртку для данной функции, где бы в одном месте учитывались данные условия.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 21 ноя 2013, 10:40 
Не в сети

Сообщения: 53
Откуда: Россия, Самара
geniepro писал(а):
Неужели оберонщиков и правда устраивает такая ситуация, при которой приходится плодить тонны невнятного говнокода? И всё из-за соображений какого-то там минимализма...


Я сам пока не разобрался, данный минимализм это техническая потребность или идеологическая.


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

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


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

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


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

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