OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 17 Июнь, 2021 11:58

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




Начать новую тему Ответить на тему  [ Сообщений: 169 ]  На страницу Пред.  1 ... 3, 4, 5, 6, 7, 8, 9  След.
Автор Сообщение
СообщениеДобавлено: Пятница, 09 Декабрь, 2011 12:59 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Александр Шостак писал(а):
Как в такой парадигме простейшую функцию random реализовать? А любую другую, которая зависит от ранее рассчитанного результата?


"Состояние" вызываемой процедуры должно храниться в вызывающей процедуре. При очередном вызове процедуры ей передается ее текущее "состояние", а затем в вызывающую процедуру возвращается обновленное "состояние" вызываемой процедуры.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 09 Декабрь, 2011 14:58 

Зарегистрирован: Четверг, 23 Апрель, 2009 18:01
Сообщения: 219
Очень хотелось бы когда-нибудь попробовать в процедурном языке построить каркас без глобальных переменных, чтобы практически оценить пользу/вред от такого решения.

Ваш совет, кажется, тоже не лишён недостатков. Модуль Random должен быть один, иначе последовательность генерируемых значений для разных клиентов будет одинакова. Два разработчика пишут модули А и Б, используя Random. Значит они должны хранить у себя его состояние. А следовательно, передавать и своё состояние на уровень выше. Бррр...Просто мрак сплошных иерархических передач состояний получается.


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

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Илья Ермаков писал(а):
Это в точности подход функционального программирования.
Например, на Эрланге дело обстоит именно так. Всё по значению. Любой поток при ошибке просто убивается. Он не изменял данных, поэтому может быть перезапущен безболезненно.
Глобальные изменяемые данные хранятся только в СУБД - в рантайме Эрланга есть стандартная СУБД Mnesia.

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


Erlang произвел на меня неизгладимое впечатление, хотя недостатки тоже бросаются в глаза. Я решил добавить некоторые его черты в PureBuilder:

PureBuilder писал(а):
Функции, процедуры и объекты (в парадигме ООП) являются легковесными процессами, имеют отдельные "кучи" в памяти с отдельной "сборкой мусора" и могут исполняться параллельно на разных ядрах процессора или разных компьютерах, объединенных в сеть.

PureBuilder имеет собственную виртуальную машину, подобно BEAM в языке Erlang.


Насчет способа реализации обмена сообщениями пока раздумываю.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 11 Декабрь, 2011 21:33 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Александр Шостак писал(а):
Очень хотелось бы когда-нибудь попробовать в процедурном языке построить каркас без глобальных переменных, чтобы практически оценить пользу/вред от такого решения.
Но это же противоречит природе взаимодействия с компом: редактор должен помнить уже набитый текст :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 11 Декабрь, 2011 22:56 
Аватара пользователя

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


А что мешает редактору помнить уже набитый текст?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 12 Декабрь, 2011 08:53 
Модератор
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 12 Декабрь, 2011 11:42 
Аватара пользователя

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

Природу не обманешь 8)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 12 Декабрь, 2011 15:10 
Аватара пользователя

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

Природу не обманешь 8)


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 12 Декабрь, 2011 17:00 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Info21 писал(а):
Александр Шостак писал(а):
Очень хотелось бы когда-нибудь попробовать в процедурном языке построить каркас без глобальных переменных, чтобы практически оценить пользу/вред от такого решения.
Но это же противоречит природе взаимодействия с компом: редактор должен помнить уже набитый текст :)


Текст засовывается внутрь объекта "Редактор". Объект "Редактор" засовывается по указателю внутрь объекта "Редакторы". Указатель на объект "Редакторы" якорится в локальных переменных процедуры c главным циклом приложения (например в процедуре main). Таким образом статических переменных нет.

Запрет статических переменных, кстати, чуток облегчает выгрузку модулей, так как не надо чистить сектор data (его просто нет).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 12 Декабрь, 2011 17:13 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Лично я препочитаю не кидаться из одной крайности (императивной) в другую (функциональную). Думаю что будущее (а местами уже и настоящее :) ) за симбиозом этих двух парадигм.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 12 Декабрь, 2011 17:56 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
igor писал(а):
Лично я препочитаю не кидаться из одной крайности (императивной) в другую (функциональную). Думаю что будущее (а местами уже и настоящее :) ) за симбиозом этих двух парадигм.


А разве тут кто-то с этим не согласен? Внутри прицедуры (на нижнем уровне) императивная парадигма. Связи между процедурами (на среднем уровне) - функциональная парадигма. На верхнем уровне - модульная парадигма. Главное - не смешивать. :wink:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 12 Декабрь, 2011 19:07 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Сергей Прохоренко писал(а):
А разве тут кто-то с этим не согласен?
Полный отказ от глобальных переменных, на мой взгляд, выглядит несколько экстремистским.
Коллеги здесь пытались намекнуть, что есть задачи, когда такой подход является противоестественным. :wink:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 12 Декабрь, 2011 21:46 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
igor писал(а):
Сергей Прохоренко писал(а):
А разве тут кто-то с этим не согласен?
Полный отказ от глобальных переменных, на мой взгляд, выглядит несколько экстремистским.
Коллеги здесь пытались намекнуть, что есть задачи, когда такой подход является противоестественным. :wink:


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 12 Декабрь, 2011 23:49 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Сергей Прохоренко писал(а):
igor писал(а):
Сергей Прохоренко писал(а):
А разве тут кто-то с этим не согласен?
Полный отказ от глобальных переменных, на мой взгляд, выглядит несколько экстремистским.
Коллеги здесь пытались намекнуть, что есть задачи, когда такой подход является противоестественным. :wink:


А без всяких намеков ясно показываю, что указанные задачи не имеют никакого отношения к глобальным переменным, без которых вполне можно и нужно обойтись. Эти задачи касаются внешних ресурсов, которые не являются глобальными переменными, а являются особого рода объектами, против которых никто не возражает.
Переменная -- это ячейка памяти :)

Просто некоторые можно втыкать-вытыкать, а другие нельзя :D


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 06:55 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Info21 писал(а):
Переменная -- это ячейка памяти :)
Точнее, переменная - это именованная ячейка памяти :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 07:05 

Зарегистрирован: Воскресенье, 01 Ноябрь, 2009 05:13
Сообщения: 2046
И имя переменной - тоже ячейка... :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 09:27 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Владислав Жаринов писал(а):
И имя переменной - тоже ячейка... :)
Точнее, имя переменной - это её "высокоуровневый адрес ячейки" :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 12:36 
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 14:15 

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 14:33 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
igor писал(а):
Полный отказ от глобальных переменных, на мой взгляд, выглядит несколько экстремистским.
Коллеги здесь пытались намекнуть, что есть задачи, когда такой подход является противоестественным. :wink:
Коллеги не поняли, что Александр Шостак под глобальными переменными имел ввиду статические переменные. Отказ от статических переменных совершенно не означает отказа от глобальных переменных, которые просто переезжают из статического размещения в поля объекта-модуля указатель на который передаётся всем заинтересованным лицам.

Для обращения к глобальной статической переменной надо написать Module1.Variable1 (здесь Module1 - имя модуля), то же самое можно сделать не используя статического размещения: module1.Variable1, здесь module1 - указатель на объект-модуль. При этом упрощается процедура выгрузки более ненужных модулей - она делается автоматически сборщиком мусора.


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

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


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

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


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

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