OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 26 Апрель, 2024 12:53

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




Начать новую тему Ответить на тему  [ Сообщений: 42 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: Среда, 30 Апрель, 2008 21:25 
Модератор
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 01 Май, 2008 07:55 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Так всё-таки можно обойтись без глобальных переменных при создании конечного автомата?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 01 Май, 2008 09:18 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Сергей Прохоренко писал(а):
Так всё-таки можно обойтись без глобальных переменных при создании конечного автомата?

В С/С++/Алголе можно, так как там есть статические переменные функций, сохраняющие своё состояние между вызовами.

В чистых функциональных языках это состояние придётся держать дополнительным параметром функции, и придётся дополнительно заботиться о его временном хранении где-то. Это не совсем глобальные переменные, но что-то типа этого.
В других языках, в Оберонах, например, можно сделать так же, но это противоречит духу оберон-мышления... :о) Хотя Илья Ермаков много раз тут уже повторял, что глобальное состояние -- зло... ;о)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 01 Май, 2008 10:52 
Модератор
Аватара пользователя

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

А если речь идёт о том, чтобы заставить отдельно взятую процедуру функционировать как автомат... То неверно это, в общем случае. Процедуры лучше делать чистыми, а не флуктуирующими по своему эффекту... Допустимое исключение - если за процедурой некий общий, единый, глобальный для системы сервис. Нижележащая операционная система. Система времени выполнения. Ну и т.п.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 01 Май, 2008 11:29 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Илья Ермаков писал(а):
Сделайте состояние автомата отдельным параметром-контекстом, объектом, наконец, и не парьтесь... В Обероне можно ещё типизированные сообщения пристегнуть.
Не нужно мудрствовать лукаво. :-)

А если речь идёт о том, чтобы заставить отдельно взятую процедуру функционировать как автомат... То неверно это, в общем случае. Процедуры лучше делать чистыми, а не флуктуирующими по своему эффекту... Допустимое исключение - если за процедурой некий общий, единый, глобальный для системы сервис. Нижележащая операционная система. Система времени выполнения. Ну и т.п.


То есть, если я правильно понял, ответ такой: без глобальных объектов в конечном автомате можно обойтись (деталей я не понял), но лучше всё же их использовать, чтобы процедуры не были флуктуирующими по своему эффекту (а что здесь такого нехорошего?). Что, видимо, совпадает с мнением Вирта:

Цитата:
A better option is to allow access to strictly local and to strictly global objects. The latter are typically state variables and they retain the notion of state.


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 01 Май, 2008 11:44 
Модератор
Аватара пользователя

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

Нет, не так. Сделать КА объектом или явным параметром-RECORD - и никаких глобальных объектов...

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 01 Май, 2008 14:34 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Илья Ермаков писал(а):
Нет, не так. Сделать КА объектом или явным параметром-RECORD - и никаких глобальных объектов...

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

Согласен, что состояние КА хорошо хранить в записи (объекте -- в смысле ООП).
Мне кажется, что в этой ветке у нас немного по-разному понимается смысл выражения "глобальная переменная". Возможно, отсюда некоторые трудности со взаимопониманием.
Вот например:
Valery Solovey писал(а):
Все локальные переменные инициализируются каждый раз, когда запускается процедура. Значения пропадают после завершения работы процедуры. Есть два способа сохранения состояния, доступных непосредственно исполняющейся программе: рекурсия и глобальные переменные.

Т.е. здесь подразумевается, что все переменные не в стеке -- глобальные.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 01 Май, 2008 14:40 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Geniepro писал(а):
То что Вирт выкинул локальные модули, скорее всего вполне оправдано, а вот выкидывать локальные процедуры... Вероятно тоже только для облегчения работы создателям компиляторов, но никак не для пользователей этих компиляторов.

В принципе, это не слишком облегчает жизнь компиляторщикам, т.к. реализация локальных процедур достаточно хорошо проработана и освещена в литературе (в т.ч. в книгах самого Вирта).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 01 Май, 2008 14:44 
Модератор
Аватара пользователя

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

Ну, конечно, если мыслить категориями Фортрана...
Но ведь в современном языке на практике любая нормальная переменная где-то локализована, определена в конкретном контексте, из которого приходит в чистые процедуры через параметры...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 02 Май, 2008 07:48 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
AVC писал(а):
Т.е. здесь подразумевается, что все переменные не в стеке -- глобальные.

Ну, это не всегда так... В АО переменные модуля размещаются в "его" стеке (в самом его начале).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 02 Май, 2008 11:12 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Geniepro писал(а):
Info21 писал(а):
Еще одна глупость. Интеракторы -- как и многие другие подобные высокоуровневые вещи -- допускают такое многообразие в деталях реализации, что вмораживать конкретные формы в язык будет только человек, не понимающий законов эволюции языков на длинных временах. Короче, только молодой человек, озабоченный тем, чтобы доказать, какой он крутой и остроумный.
Ага, расскажите это Барбаре Лисков. ...

У каждого авторитета своя сфера компетенции. Сколько воды утекло с тех пор как Барбара Л. этим занималась?

Глупо вмораживать в язык то, что легко можно выразить *на* языке.
В случае сомнений действуем по принципу разделяй и управляй.
Что тут сложного...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 02 Май, 2008 15:18 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Info21 писал(а):
Глупо вмораживать в язык то, что легко можно выразить *на* языке.
Глупо вмораживать в язык операторы WHILE-DO, REPEAT-UNTIL, ведь их легко можно выразить с помощью оператора GOTO.
Глупо вмораживать в язык концепции процедур и типов данных, ведь всё это можно легко выразить сплошным ассемблерным кодом...

Изобретая очередной while-сипед для обхода списка, Вы бредёте по лезвию бритвы. Когда-нибудь, совершив нелепую ошибку по невнимательности или от усталости и уничтожив контейнер вместо простой обработки его содержимого, Вам вдруг придёт в голову крамольная мысль, что неплохо было бы всё-таки иметь в языке более удобные абстракции...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 02 Май, 2008 15:49 
Модератор
Аватара пользователя

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

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

Всё чего-то стоит. Не забывайте, что "пропасть Дейкстры" между машинами и задачами имеет два края. Можно удалиться от конкретной машины, но прилипнуть к конкретному месту на другом краю.

Что касается проблем АТД в чистом виде, то посмотрите Непейводу-Скопина "Основания программирования". Вообще хорошая книжка, передающая в том числе вот это ощущение чувства меры в программировании (а уж Непейвода о формализмах и абстракциях знает побольше любого вашего ФП-шника, и если говорит о проблемах - то послушать стоит...).

Бросайте Вы романтику сверхабстракций... Формальные модели ограничены и неполны. Нужно не прикипать сердцем к одной любимой, а знать им цену и менять сообразно с задачами с лёгкой душой... А Вы всё рвётесь их намертво в основной инструмент вкатать. Каждое такое красивое слово типа "итератор" - это некое абстрактное (т.е. в-голове-появившееся) понятие. Значит, за ним стоят некоторые допущения-предположения-упрощения_реальности (как за любым формализмом). Стоит идти от наиболее слабых допущений, усиливая их по мере реальной надобности... Иначе сами себя в лужу загоняем.


Последний раз редактировалось Илья Ермаков Пятница, 02 Май, 2008 18:01, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 02 Май, 2008 17:43 

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


Если вы об обероне (пусть даже и в лице ББ), то *далеко* не легко. Настолько нелегко, что будет легче нагородить кучу невнятных while'ов и ad-hoc структур данных, за которыми не будет видно никакой идеи.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 02 Май, 2008 17:49 

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


Итератор - эте не сверхабстракция. Это обычное для ЯВУ явление. Даже C++ поддерживает ее в стандартной библиотеке (а она у него весьма скудна, по сравнению с другими языками). Вы просто судите со сверхнизкой позиции таких языков как асм, C и оберон :)


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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Ну и пусть себе используется в библиотеке. Их там куча видов может быть сделана. Что ж, всё в язык клепать надо было?

Я не против итераторов и не считаю их супер-абстракцией (кстати, Rider в паттерне CRM BlackBox-а похожую идею выражает. Точка зрения-доступа одного из потребителей на некоторый контейнер данных). Просто к слову пришлись, в долгодлящемся споре с Geniepro :-)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 02 Май, 2008 22:39 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4695
Откуда: Россия, Орёл
Илья Ермаков писал(а):
Нужно не прикипать сердцем к одной любимой, а знать им цену и менять сообразно с задачами с лёгкой душой...

Осторожнее нужно быть со словесными оборотами такого рода.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 03 Май, 2008 15:06 
Модератор
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 03 Май, 2008 19:42 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Илья Ермаков писал(а):
AVC писал(а):
Т.е. здесь подразумевается, что все переменные не в стеке -- глобальные.

Ну, конечно, если мыслить категориями Фортрана...
Но ведь в современном языке на практике любая нормальная переменная где-то локализована, определена в конкретном контексте, из которого приходит в чистые процедуры через параметры...
Фортран здесь ни при чём.

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

Я хочу сказать, что переменные в записи нельзя назвать локальными. Даже с точки зрения создающего их модуля. Ведь, эти переменные доступны и внутри записи, и снаружи. Это начинает работать только при передаче объекта другому модулю.


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

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
А какой из этого всего вывод? Хранить состояние КА в процедурах нежелательно (Ермаков). В полях данных записей/объектов - тоже нежелательно (Соловей). Где же тогда? В глобальных переменных (Вирт)? Тоже, вроде, не лучшее решение, так как состояние КА сможет изменить, образно говоря, кто и когда угодно. :(

Наверное, лучшим решением была бы новая собственная языковая конструкция КА :idea: , куда бы можно было упаковать и передачу состояний через параметры, и инициирование событий, и таблицу переходов. Раз уж КА такая популярная вещь, то чем он хуже цикла, имеющего в Оберонах аж 3-4 разновидности.


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

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


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

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


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

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