OberonCore
https://forum.oberoncore.ru/

Оберон-07
https://forum.oberoncore.ru/viewtopic.php?f=115&t=615
Страница 8 из 12

Автор:  Valery Solovey [ Вторник, 28 Октябрь, 2008 15:55 ]
Заголовок сообщения:  Re: Оберон-07

AVC писал(а):
Valery Solovey писал(а):
Во-первых, результат, передаваемый функцией, всё равно должен где-то храниться. Поэтому, использование явной переменной не приносит дополнительных расходов.
Как правило, функция возвращает результат в определённом регистре, так что дополнительной переменной не требуется.
Тем более в Обероне, где функции возвращают только значения скалярных типов.
Нет проблем связать единственную переменную, содержащую результат функции, не с адресом в памяти, а с регистром. Или есть проблемы?

Автор:  Valery Solovey [ Вторник, 28 Октябрь, 2008 16:05 ]
Заголовок сообщения:  Re: Оберон-07

AVC писал(а):
...И вот теперь Вирт вдруг принимает обратное решение, без нового обоснования (всё это обсуждалось и раньше). Причём выбранное слово CONST, IMHO, неудачно, т.к. константы и read-only переменные разные сущности.
Лично у меня сложилось впечатление, что Вирт просто не любит Оберон-2 и избавляется от сходных с ним черт в новом Обероне. В т.ч. от удачных. :(
Приглядевшись по-внимательнее, я понял, что всё логично: CONST и VAR. Если вместо CONST использовать "-", тогда надо и VAR заменить на "*".

CONST и VAR используются для объявления переменных внутри области, а "-" и "*" - для фиксации характеристик объекта вне пределов области. И значение "-" для параметра процедуры не очень логичное : ).

Автор:  Info21 [ Вторник, 28 Октябрь, 2008 19:08 ]
Заголовок сообщения:  Re: Оберон-07

Vlad писал(а):
А зря. Лучше один раз увидеть. Или боитесь, что там окажется все намного проще, чем вы думаете? :)

Нет, я просто вспомнил анекдот про выдающегося математика И.М.Гельфанда:
Читал он лекцию.
Рассказал доказательство какой-то теоремы.
Повернулся к аудитории: "Ну что, понято?"
В ответ молчание.
Тогда он со вздохом: "Ну, значит, не дадено."

Автор:  Vlad [ Вторник, 28 Октябрь, 2008 19:28 ]
Заголовок сообщения:  Re: Оберон-07

Info21 писал(а):
Тогда он со вздохом: "Ну, значит, не дадено."


Да, не всем выдающимся математикам дадена еще и педагогика...

Автор:  Александр Ильин [ Вторник, 28 Октябрь, 2008 20:41 ]
Заголовок сообщения:  Re: Оберон-07

Vlad писал(а):
Info21 писал(а):
Тогда он со вздохом: "Ну, значит, не дадено."
Да, не всем выдающимся математикам дадена еще и педагогика...
А-а-а! Так вот за счёт чего вы число отправленных сообщений набираете! А я-то придумываю какие-то аргументации, идеи пытаюсь генерировать, обогащать форум невысказанными наблюдениями. Оказывается, проще надо быть... : )

Автор:  Vlad [ Вторник, 28 Октябрь, 2008 20:56 ]
Заголовок сообщения:  Re: Оберон-07

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


Ну извините, просто inf21 окончательно утомил своими замечаниями не по теме.

Автор:  bohdant [ Вторник, 28 Октябрь, 2008 21:23 ]
Заголовок сообщения:  Re: Оберон-07

Vlad писал(а):
Ну извините, просто inf21 окончательно утомил своими замечаниями не по теме.


Сегодня начал пробовать использовать Оберон-07. Ни каких затруднений описаных выше не ощутил.
С типами - все нормально.
"Проблемы с циклами" - вырезал бы все сообщения выше :twisted: .

Люди добрые - это специализированный язык! Не нужно раздувать вселенскую проблему!!!
Он тупоориентирован на микроконтроллеры(если кто то соблаговолит посмотреть исходники, то сразу согласится).
Не нужно с пеною у рта доказывать прописные истины, что 2х2=4;

Я скажу прямо, тут теории = НЕТ. Главное практика!

Если у вас генерится "плохой" код, то грош-цена компиллеру! Потому, что это микроконтроллеры!!!
Т.к. вы тут не только по байтам можете "не вписаться" но и по тикам и фиг вам typeguard поможет ;)

Автор:  Geniepro [ Среда, 29 Октябрь, 2008 08:05 ]
Заголовок сообщения:  Re: Оберон-07

bohdant писал(а):
Не нужно с пеною у рта доказывать прописные истины, что 2х2=4;
Верно, как сказал старик Лао: "Знающий не доказывает, доказывающий не знает." Эта фраза заставила меня пересмотреть некоторые мои жизненные позиции... :mrgreen:

Автор:  AVC [ Среда, 29 Октябрь, 2008 23:01 ]
Заголовок сообщения:  Re: Оберон-07

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

Автор:  Александр Ильин [ Четверг, 30 Октябрь, 2008 06:38 ]
Заголовок сообщения:  Re: Оберон-07

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

Автор:  AVC [ Четверг, 30 Октябрь, 2008 11:55 ]
Заголовок сообщения:  Re: Оберон-07

Александр Ильин писал(а):
Импортируется что-либо внутрь, а экспортируется - наружу. Зачем же инвертировать понятия?
C точки зрения импортёра - внутрь, с точки зрения экспортёра - наружу. А на самом деле - это два взгляда на одно и то же явление. :)

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

Если Вы не хотите передавать переменную по ссылке (VAR), в Обероне есть возможность передать её по значению.
Давайте рассмотрим, как компилятор Оберона (обычно) реализует передачу по значению аргумента структурного типа.
При вызове процедуры этот аргумент передаётся по ссылке, а затем при необходимости копируется в стек вызываемой процедурой.
Если этот аргумент используется только для чтения, то второй шаг (копирование) является лишним и просто исключается оптимизирующим компилятором. Т.е. это вопрос оптимизации.
Единственная проблема - как осуществить эту оптимизацию с помощью однопроходного компилятора. Вот и изобретаем всякие разновидности "подмигивания" компилятору: аргументы с минусом или ключевым словом CONST.

Автор:  Trurl [ Четверг, 30 Октябрь, 2008 12:57 ]
Заголовок сообщения:  Re: Оберон-07

А давайте поставим вопрос по-дугому. С какой стати разрешать изменение параметра, переданного по значению?

Автор:  AVC [ Четверг, 30 Октябрь, 2008 13:08 ]
Заголовок сообщения:  Re: Оберон-07

Trurl писал(а):
А давайте поставим вопрос по-дугому. С какой стати разрешать изменение параметра, переданного по значению?
А почему бы и нет?

Автор:  Comdiv [ Четверг, 30 Октябрь, 2008 13:48 ]
Заголовок сообщения:  Re: Оберон-07

Trurl писал(а):
А давайте поставим вопрос по-дугому. С какой стати разрешать изменение параметра, переданного по значению?


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

Автор:  AVC [ Четверг, 30 Октябрь, 2008 13:52 ]
Заголовок сообщения:  Re: Оберон-07

AVC писал(а):
Trurl писал(а):
А давайте поставим вопрос по-дугому. С какой стати разрешать изменение параметра, переданного по значению?
А почему бы и нет?
Я отталкиваюсь от примера из Differences between Oberon-07 and Oberon (pdf):
Код:
PROCEDURE F(x, y: INTEGER): INTEGER;
BEGIN
    IF x < y THEN x := y – x
    ELSE x := x – y
    END ;
RETURN x END F
Но идея запретить (без всяких "-" и CONST) изменять аргумент, переданный по значению, интересна. Может быть, так и надо сделать.

Автор:  Vlad [ Четверг, 30 Октябрь, 2008 15:55 ]
Заголовок сообщения:  Re: Оберон-07

AVC писал(а):
Но идея запретить (без всяких "-" и CONST) изменять аргумент, переданный по значению, интересна.


Подкину еще один аргумент в пользу запрета: постусловие (в виде ASSERT), зависящее от аргументов, будет более читабельным, если есть уверенность, что аргументы неизменны.

P.S. В своей практике всячески избегаю изменения аргументов. Но везде писать "const" - лишний мусор. Предпочел бы иметь такое поведение по умолчанию.

Автор:  Илья Ермаков [ Четверг, 30 Октябрь, 2008 16:28 ]
Заголовок сообщения:  Re: Оберон-07

Я вообще не представляю, для чего может понадобиться изменение аргументов-копий. Запретить - и точка.

Автор:  Vlad [ Четверг, 30 Октябрь, 2008 16:30 ]
Заголовок сообщения:  Re: Оберон-07

Илья Ермаков писал(а):
Я вообще не представляю, для чего может понадобиться изменение аргументов-копий. Запретить - и точка.


Есть тут оптимизаторы, которых парит количество локальных переменных ;)

Автор:  AVC [ Четверг, 30 Октябрь, 2008 17:11 ]
Заголовок сообщения:  Re: Оберон-07

Илья Ермаков писал(а):
Я вообще не представляю, для чего может понадобиться изменение аргументов-копий. Запретить - и точка.
Всё же стоит подумать.
Мне кажется, для аргументов неструктурных (базовых) типов изменения вполне допустимы.
Вот (глупый) пример:
Код:
PROCEDURE RepeatSomething(times: INTEGER);
BEGIN
    WHILE times > 0 DO
        DoSomething;
        DEC(times)
    END
END Times;
Неструктурные аргументы располагаются в стеке или в регистре; если мы их изменим, ничего не испортим.
А вот со структурными иначе. К тому же, переданные по значению, они вообще имеют право быть расположеными в памяти "только для чтения".

Как поступать с переданными по значению указателями?
Их можно использовать для указания объекта (в Обероне-1 это основной способ):
Код:
TYPE
    Object = POINTER TO ObjectDesc;
...
PROCEDURE handle(me: Object; VAR msg: Message);
...
    object.handle(object, message);

Автор:  AVC [ Пятница, 31 Октябрь, 2008 12:32 ]
Заголовок сообщения:  Re: Оберон-07

По поводу передачи по значению записей я, может быть, погорячился. :oops:
По меньшей мере, при этом пропадает информация о расширении типа.
В XDS просто происходит проекция (т.е. копирование :) ) расширенного типа на тип аргумента.
А в КП, кажется, передача по значению расширяемых (EXTENSIBLE) записей вообще невозможна...
В таких обстоятельствах модификатор CONST, возможно, вполне разумен.

Страница 8 из 12 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/