OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 09:25

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




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: VAR vs IN OUT
СообщениеДобавлено: Пятница, 23 Октябрь, 2009 16:54 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
В языке Oberon-2 параметры в процедуры можно передать с указанием VAR и без VAR. Когда переменная передается без VAR, то в процедуру фактически передается копия переменной. Если, например, это массив, то копирование, может занять относительно большое время. Если же передавать с помощью VAR, то это означает, что переменная может измениться.
В языке Component Pascal появились еще 2 возможности передать при помощи IN и OUT.
Меня интересует, почему Вирт и другие разработчики языка Oberon-2 не предусмотрели такую возможность? Может быть тогда просто эти IN и OUT не были изобретены или Вирт преднамеренное не внес эти фичи, считая их "синтаксическим сахаром".
Действительно, допустим мы пишем программу на Oberon-2 и нам надо передать массив в процедуру. Массив не должен изменяться. Но мы не хотим чтобы выполнялось копирование, так как это затратная операция, а также не хотим писать перед массивом слово VAR, так как массив не должен изменяться, а написав VAR мы тем самым запутываем программиста. Я думаю, что надо передавать эту переменную без VAR, чтобы не запутывать программиста, а компилятор просто должен соптимизировать вызов функции: проверить, что массив не может измениться и не выполнять его копирование при вызове функции, а просто использовать оригинальный массив.
Возможно, что Вирт думал о том, что копировать массив или нет, это должна быть забота компилятора и он должен это делать автоматически и не следует вносить в язык IN и OUT, так как в этом случае программист делает работу вместо компилятора.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: VAR vs IN OUT
СообщениеДобавлено: Пятница, 23 Октябрь, 2009 18:18 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
IN и OUT действительно не были добавлены в язык именно потому, что это вопрос оптимизации, который должен бы решаться на уровне компилятора, а не языка. Правда, я с этим не вполне согласен. Я бы хотел иметь возможность указать IN и OUT не только для того, чтобы дать подсказку компилятору по оптимизации кода, но и для того, чтобы он проверил, действительно ли я не пытаюсь изменить значение IN-параметра или использовать OUT-параметр до инициализации. Ведь случаи могут быть нетривиальными - например, если я передаю IN-параметр в другую процедуру, то компилятор должен это позволить только в том случае, если в той процедуре он тоже будет воспринят как IN или value:
Код:
PROCEDURE Out (OUT param: ARRAY OF CHAR);
BEGIN
   (* инициализация param новыми значениями *)
END Out;

PROCEDURE In (IN param: ARRAY OF CHAR);
BEGIN
   Out (param); (* ошибка компиляции: нельзя изменять IN-параметр! *)
END In;
Предположим, процедура Out сначала была реализована с IN-параметром, а потом переделана на VAR. Если описанного выше механизма контроля в компиляторе нет, то можно получить побочные эффекты, какие и бывают при переходе с value-параметров на VAR и обратно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: VAR vs IN OUT
СообщениеДобавлено: Пятница, 23 Октябрь, 2009 19:28 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Rifat писал(а):
Меня интересует, почему Вирт и другие разработчики языка Oberon-2 не предусмотрели такую возможность? Может быть тогда просто эти IN и OUT не были изобретены или Вирт преднамеренное не внес эти фичи, считая их "синтаксическим сахаром".

В Ада-83 уже были IN и OUT -- вряд ли Вирт мог не знать об этом...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: VAR vs IN OUT
СообщениеДобавлено: Пятница, 23 Октябрь, 2009 19:35 
Модератор
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: VAR vs IN OUT
СообщениеДобавлено: Пятница, 23 Октябрь, 2009 19:49 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
И в Оберон-07 появились CONST-параметры.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: VAR vs IN OUT
СообщениеДобавлено: Пятница, 23 Октябрь, 2009 21:01 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Александр Ильин писал(а):
... действительно ли я не пытаюсь ... использовать OUT-параметр до инициализации.
Александр, хочу обратить внимание на терминологическую неточность, которая поначалу даже ввела меня в заблуждение, когда я читал Ваш пост. Применительно к параметрам процедуры, термин "инициализация" означает действия компилятора, которые заключаются в том, чтобы присвоить параметрам начальные, заранее известные (до выполнения процедуры) значения. Это значения ноль и NIL, как определено в отчёте о языке КП. Параметры OUT как раз отличаются тем, что компилятор не выполняет их инициализацию, и до первого присваивания их значение не определено. В этом есть определённый смысл, оправдывающий введение OUT-параметров, ведь инициализация может быть слишком затратной.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: VAR vs IN OUT
СообщениеДобавлено: Понедельник, 09 Ноябрь, 2009 05:51 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
igor писал(а):
Параметры OUT как раз отличаются тем, что компилятор не выполняет их инициализацию
Для указателей - выполняет: присваивает NIL.
igor писал(а):
В приведённой выше цитате я бы заменил "до инициализации" на "до вычисления". То есть в OUT-параметры должны быть записаны значения, которые станут известны только после выполнения процедуры.
В OUT-параметры могут быть записаны и промежуточные значения, используемые далее для вычислений. Например:
Код:
PROCEDURE ... (OUT res: BOOLEAN);
BEGIN
   res := ...;
   IF res THEN
      res := ...;
      IF res THEN
         res := ...;
      END
   END
END...
Под инициализацией я имел в виду первое присваивание OUT-переменной, совершённое внутри процедуры.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: VAR vs IN OUT
СообщениеДобавлено: Вторник, 05 Февраль, 2013 16:33 

Зарегистрирован: Суббота, 02 Февраль, 2013 16:19
Сообщения: 17
В последней редакции Оберона-07 (язык эволюционирует — Вирт периодически правит сообщение о языке) уже нет CONST-параметров, вместо этого все параметры структурных типов без модификатора VAR передаются как константы (IN-параметры). Точнее, сформулировано несколько иначе. Все не-VAR параметры являются константными, за исключением параметров базовых типов — они считаются локальными переменными.

P.S. Прошу прощения за некропостинг.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: VAR vs IN OUT
СообщениеДобавлено: Вторник, 05 Февраль, 2013 19:31 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Ну да - и это разумно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: VAR vs IN OUT
СообщениеДобавлено: Среда, 06 Февраль, 2013 16:59 

Зарегистрирован: Суббота, 02 Февраль, 2013 16:19
Сообщения: 17
Geniepro писал(а):
Rifat писал(а):
Меня интересует, почему Вирт и другие разработчики языка Oberon-2 не предусмотрели такую возможность? Может быть тогда просто эти IN и OUT не были изобретены или Вирт преднамеренное не внес эти фичи, считая их "синтаксическим сахаром".

В Ада-83 уже были IN и OUT -- вряд ли Вирт мог не знать об этом...

В Algol-W (1966 год), разработанном Виртом и Хоаром (буква W от Wirth :wink:) были символы value и result, примерно соответствующие ключевым словам IN и OUT.

Семантика символа result подразумевает, что для данного формального параметра неявно создаётся локальная переменная, с которой работает код процедуры. Затем, после завершения процедуры, значение этой неявной переменной присваивается фактическому параметру. Аналогично для value — тоже неявная локальная переменная, соответствующая фактическому параметру, создаётся перед выполнением тела процедуры и инициализируется значением фактического параметра. Однако, для IN-, OUT- и VAR-параметров подразумевается передача в процедуру указателя на переменную (в т.ч. на компонент массива или записи), и при работе с формальным параметром подразумевается неявное его разыменование.

Таким образом value точно соответствует передаче по значению, result примерно соответствует OUT, value result примерно соответствует VAR-параметрам.

Формальные параметры без символов value и result передавались по наименованию. Передача параметра по наименованию — это такая особая алгольская магия, на сколько мне известно, нигде кроме Алгола-60 и Алгола-W не использовалась.

Да, «вряд ли Вирт мог не знать об этом…».


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

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


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

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


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

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