Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вт мар 19, 2024 12:17

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 172 ]  На страницу 1, 2, 3, 4, 5 ... 12  След.
Автор Сообщение
 Заголовок сообщения: Разработка "сверху вниз"
СообщениеДобавлено: Вт фев 07, 2012 20:16 
Первоисточники
1) Д.Кнут "Искусство программирования, т.I". Кнут определил типовую схему разработки алгоритма:
0. Постановка задачи.
1. Проход сверху-вниз.
2. Проход снизу-вверх.
3. Повторное рассмотрение (с возможностью вернуться к 1).
4. Начальные установки.
5. Отладка.
Такой подход подразумевает два вывода:
a. Чем позже программист перейдет с псевдокода на конкретный язык программирования, тем лучше. Forth в этом случае мощнее, т.к. его "псевдокод" практически является тем же Forth. По сути, книга "TF" Броуди этому и посвящена.
b. Неявно подразумевается, что более высокие "уровни" являются носителями логики, а нижние - почти чисто вычислительные. В этом убеждении выросло целое поколение структурных программистов. Вирт, например, превратил в искусство изобретение специальных структур данных, делающих прозрачными связи между уровнями и логику их согласования.
Однако, жизнь показала, что это не так:
i. Логика верхнего уровня программы может навязываться нам не программой, а операционной системой. Это происходит, например, в Windows, где верхий уровень зарезервирован под цикл обработки сообщений и создание главного окна приложения.
ii. В случае ООП дополнительно к иерархии программы существуют иерархии классов объектов, причем, очень часто эти иерархии друг другу "перпендикулярны".
iii. В случае многопоточного приложения, если и существует какой-то "сервер-менеджер процессов", то он никак не может располагаться "выше" управляемых процессов. Он "где-то рядом".
Т.о. идея прохода "сверху-вниз" в толковании Кнута канула в Лету вместе с возможностью описать программу классической блок-схемой.
2) Выход из создавшегося положения показал Э.Дейкстра в своей статье "Заметки по структурному программированию". Он показал, что для сохранения управляемости кода уровни должны представляться как отдельные виртуальные машины. Каждая из них должна быть связана с соседними только именами команд, которые она может исполнить по запросу верхней машины, или рассматривает как атомарные запросы к нижним машинам. Машины совершенно не обязаны знать устройства соседей. В такой трактовке описанные выше шаги 0-5 могут быть пройдены для каждой машины независимо от других. И сбудется великая мечта программистов - замена отдельных машин без переписывания всей программы.
К сожалению, структурные программисты поняли из всего Дейкстры отказ от оператора GO TO. А подхватившие их знамя борьбы за Серебряную пулю ОО-программисты, окончательно похоронили его идеи.
Вот, наверное, и все про теорию разработки сверху-вниз. Разве, что надо упомянуть, что в других своих статьях Дейкстра прикинул, как можно обвесить эти межмашинные связи семантическими предикатами, позволяющими доказывать, что вся эта конструкция когда-нибудь успешно завершиться.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Разработка "сверху вниз"
СообщениеДобавлено: Ср фев 08, 2012 09:22 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
gudleifr писал(а):
К сожалению, структурные программисты поняли из всего Дейкстры отказ от оператора GO TO. А подхватившие их знамя борьбы за Серебряную пулю ОО-программисты, окончательно похоронили его идеи.

Собственно основной проблемой создания ПО является проблема рациональной декомпозиции задачи на подзадачи, которая в свою очередь есть ничто иное как попытка описать задачу минимальным набором понятий. Программисты предпочитают более конкретные рецепты декомпозиции менее конкретным. Концепция ОО была более конкретной ее и предпочли. Форт же изначально был ориентирован на создание DSL, поэтому концепция ООП для него слишком конкретна и узка, поэтому не может быть встроена в ядро, хотя для отдельных задач может быть применена в качестве отдельного DSL.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Разработка "сверху вниз"
СообщениеДобавлено: Чт фев 09, 2012 00:49 
Не в сети
Аватара пользователя

Зарегистрирован: Вт авг 12, 2008 03:18
Сообщения: 327
Откуда: Москва
Благодарил (а): 36 раз.
Поблагодарили: 7 раз.
А есть ли реализации модульного форта?
Состоящий например, модуль обработки и хранения строк, ФВМ,
модуль, реализующий сам язык Форт.
Причем способ реализаций конкретных модулей не имеет значения,
хоть на ассемблере, хоть динамическая библиотека,
главное, совместимость межмодульных связей?

_________________
Линукс решает, винда глотает.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Разработка "сверху вниз"
СообщениеДобавлено: Чт фев 09, 2012 12:29 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июн 25, 2009 11:12
Сообщения: 412
Благодарил (а): 41 раз.
Поблагодарили: 8 раз.
gudleifr писал(а):
2) Выход из создавшегося положения показал Э.Дейкстра в своей статье "Заметки по структурному программированию". Он показал, что для сохранения управляемости кода уровни должны представляться как отдельные виртуальные машины. Каждая из них должна быть связана с соседними только именами команд, которые она может исполнить по запросу верхней машины, или рассматривает как атомарные запросы к нижним машинам. Машины совершенно не обязаны знать устройства соседей. В такой трактовке описанные выше шаги 0-5 могут быть пройдены для каждой машины независимо от других. И сбудется великая мечта программистов - замена отдельных машин без переписывания всей программы.

Но в пределах-то каждой машины снова окажутся уровни.
Так что низы (подсчет единиц, например) и верхи (использование низов более-менее произвольным образом) всегда будут, никакого "выхода" Дийкстра не дал.

ЗЫ Проход "сверху вниз", мне кажется, относится к проектированию, а "снизу вверх" - к кодированию.
Учитывая, что для отладки ВУ надо иметь хоть какую-то реализацию НУ, я кодирую "снизу вверх".


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Разработка "сверху вниз"
СообщениеДобавлено: Чт фев 09, 2012 12:51 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
dynamic-wind писал(а):
Но в пределах-то каждой машины снова окажутся уровни.

По Дейкстре в пределах каждой машины нет уровней. Есть только ее набор команд.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Разработка "сверху вниз"
СообщениеДобавлено: Чт фев 09, 2012 13:26 
vikt писал(а):
А есть ли реализации модульного форта?
Исторически, как и в любом Algol-подобном языке образовалось большое количество библиотек, которые можно вызывать по потребности. Чем не модули? О связанных с этим проблемами - напишу позже.
Самым воистину модульным является, раэумеется, win32 версия моего FOBOS - два совершенно разнотипных модуля. Один - ассемблерный: только необходимое дле INTERPRET. Второй (который можно заменить на другой) - чисто текстовый. Кстати, DLL у меня устроены также.
dynamic-wind писал(а):
никакого "выхода" Дийкстра не дал
Об этом - дальше.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Разработка "сверху вниз"
СообщениеДобавлено: Сб фев 11, 2012 17:57 
Воистину, кто не умеет работать, тот учит. Работа застопорилась и тянет пофлудить.
Хочется, конечно, еще поспорить о терминах, мол, ООП - это прием чисто дедуктивный а декомпозиция, определенная выше - прием чисто индуктивный, и прочее бла-бла-бла... Но не будем. Как правильно заметил коллега, понятия хорошо бы минимизировать.
Нас интересует только, есть ли прок от прохода сверху вниз, если да, то есть ли в Forth средства его поддержки, и, если нет, то как их добавить.
Итак, вернемся к Forth. Все помнят картинку из "TF" - иерархия лексиконов робота. Вот только как ее понимать? Что вся иерархия лексиконов родится естественно, путем углубления в суть задачи, и все большей детализации/формализации первоначального человеческого описания? Или, что удачна иерархия может быть порождена только всплесками программистской гениальности на ключевых уровнях?
Там же очень красиво сказано: "На самом деле Вам не стоит писать каких-либо серьезных задач на Форте; как язык, он просто недостаточно мощен. Вам "следует" писать на Форте свои собственные языки (лексиконы) для моделирования Вашего понимания проблемы, на которых Вы можете элегантно описать ее решение".
Может это ключ?
Самое смешное, для простых задач срабатывают все эти приемы: и дедукция, и индукция, и даже ООП, которое, подобно Prolog, до сих пор упивается красотой записи формулы: "Бобик - сын Шарика".
Можно не только разобрать простую задачу на детали, можно даже обвесить эти детали предикатами, обосновывающими правильность разборки.
Со сложными задачами сложнее. Интуитивно понятно, что хорошо бы иметь иерархию языков (лексиконов), просто и элегантно, описывающую все уровни модели решаемой задачи. Возникает два вопроса:
1) Должны ли эти языки быть связанными только именами предоставляемых интерфейсов? Например, машина управляющая файлами, должна понимать только команды open, close, read, write, ioctl. Свое внутреннее слово "+" она может понимать совершенно не так, как это же слово будет понимать построенная над ней машина форматного ввода-вывода. Красиво и логично.
Однако, это противоречит нашему языковому опыту. Ведь, даже говоря о какой-то сложной философской проблеме, мы наряду со специфическими терминами используем и слова общечеловеческие, а иногда простонародные и матерные. Нечто подобное мы встречаем и в математике. Даже в сложных языках комбинаторики и матричного счисления мы используем язык арифметики. "+" обозначает нечто отличное от банального сложения только в языках, разработанных для анализа алгебр, но там речь идет, скорее, не о поднятии на уровень, выше, а, наоборот, о построении метаязыка, описывающего внутреннее устройство арифметики.
Итак, нужен ли язык, понимаемый всеми машинами, независимо от их уровня?
2) Разбивая задачу на уровни, мы, как писал уважаемый коллега, должны действовать рационально. Что это значит? Эта задача сродни такой же, нерешаемой в общем случае, задаче, как организация работы человеческой бригады: будут ли они всем миром таскать доски или двое таскать, двое - пилить, один - строгать...
Очевидно, есть какое-то конечное множество частных задач, на которые можно разбить исходную задачу. Насколько эти подзадачи непересекающиеся? Вроде бы, в каждой должны быть какая-то логика, какая-то арифметика... Алгоритмы, например, работы с множествами общеизвестны и постоянно востребованы, хотя и достаточно сложны. Зачем каждой из машин уметь хэшировать, сортировать, искать локальные оптимумы? А, ведь, так и будет, если программист будет делить задачу на части по-человечески.
Надеяться, что все случаи применения какого-либо алгоритма можно учесть заранее (и вынести в отдельную машину) не приходится, это возможно только в простой задаче.
Возможно ли разбиение задачи не с точки зрения программиста, но с точки зрения минимизации машинных и межмашинных операций? Можно ли предложить для этого какие-нибудь методики?
Визуальное программирование это отрицает. Структуру кода определяют интерфейсные объекты, т.е. в конечном итоге логика человека-пользователя. (Надо заметить, что этот последний совсем необязательно оказывается доволен результатом.) Аналогично, согласно человеческим понятиям, сформированы и библиотеки подпрограмм языков высокого уровня.
...


Последний раз редактировалось gudleifr Сб фев 11, 2012 19:20, всего редактировалось 2 раз(а).

Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Разработка "сверху вниз"
СообщениеДобавлено: Сб фев 11, 2012 19:03 
gudleifr писал(а):
Воистину, кто не умеет работать, тот учит.
...

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

P.S. Но чувствую, что всё более запутаннее:)


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Разработка "сверху вниз"
СообщениеДобавлено: Пн фев 13, 2012 18:54 
Не в сети
Аватара пользователя

Зарегистрирован: Чт апр 26, 2007 21:09
Сообщения: 303
Благодарил (а): 12 раз.
Поблагодарили: 10 раз.
gudleifr писал(а):
Воистину, кто не умеет работать, тот учит. Работа застопорилась и тянет пофлудить....

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Разработка "сверху вниз"
СообщениеДобавлено: Пн фев 13, 2012 19:16 
Wlad писал(а):
Я так понимаю, что более полувека развития отрасли, поисков и исследований, вам - не указ и не повод поучиться и поразмыслить над тем, что делалось и сделано?
Я так понимаю, что не мне одному. Ни Дейкстру, ни Брукса эти модные "инновации" не убедили.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Разработка "сверху вниз"
СообщениеДобавлено: Чт фев 16, 2012 01:11 
Попробуем как-то вернуться к Forth. Всем уже надоели попытки сравнить его как с языками ассемблеров, так и с Algol-подобными. А если сравнить с другим интерпретаторами? Тут где-то промелькнуло упоминание Perl, а, ведь, есть еще и Python... В чем-то очень мощные, местами забавные... Не говоря уже о том, что когда мне надо срочно слепить что-то работающее, без раздумий беру Perl.
Вот, от последнего факта и оттолкнусь. Быстро слепить что-то по-быстрому, пожалуйста... И Perl, и Python... Даже, если кажется, что быстро написать не удастся, т.к. требуется изобрести какой-то механизм, то очень вероятно, что кто-то его уже реализовал и оформил в виде библиотеки. Получается очень быстро и удобно.
А если задача большая? Ну, не заложен в язык или библиотеку алгоритм того, что нам нужно. А он сложный... Смогут ли наши чемпионы программирования "на коленке" помочь написать большую программу своим "особым" "патентованным" методом?
Все большие программы на Perl и Python, которые я видел были написаны на "обычном C++", с редкими вкраплениями программистских лингвистических выпендрежей и хитрыми заплатками в тех местах, где Perl (Python) слишком уж сильно отличался от C++. Вклад всяких ассоциативных массивов, тьюплов, "маленьких машинок", декораторов и прочего с ростом программ становился все меньше и меньше... Не верите?
1) Сам не верил. И, начав писать интерпретатор языка Trac (основанного на макроподстановках), думал, что Perl-овские регулярные выражения мне помогут. Нифига. В конечном варианте я практически от всех вызовов "маленькой машинки" избавился.
2) Проведите эксперимент. Прочтите, какие замечательные структуры данных предлагает Perl/Python. А теперь возьмите книгу Кнута или Ахо и компании и прочтите про то, какие структуры данных обычно могут необходимы программисту. Не правда ли, люди говорят на разных языках?
Т.о. эти два самых популярных интерпретатора удобнее для маленьких задач, чем для больших. А Forth? Буквально недавно я понял, откуда исходит раздражение этими вечными Forth-несуразностями: лишними стековыми операциями и проверками уже проверенных условий. Forth не предназначен для маленьких задач! Вот, возьмем, например, мою задачу про "переправу". Увидев решение, я ломанулся к нему, оставляя за собой слова уродцы с невнятными именами. Цель оправдывает средства! Forth такого не признает. Нужно было усложнить задачу, тогда можно было бы спокойно изобрести пару-другую лексиконов и решение производило бы впечатление основательности и внутренней завершенности. Для маленькой задачи нам жалко тратить время на подобные раздумья, хочется побыстрее. Но Forth не Perl/Python, никто не позаботился снабдить его тысячей мелочей на все случаи жизни, и красиво быстро не получается.
Все это, конечно, разговор "за жизнь". Есть ли что-то кроме "понравилось/не понравилось"? Есть. Главное отличие - в доступности ядер этих языков для программиста. Нет, конечно исходники доступны, для Python так просто рекомендовано их изучить. Однако, я как-то долго и безуспешно пытал всех подряд питонистов, в каких таблицах и в каком порядке ищутся программой идентификаторы. "А зачем это знать?" - спрашивают. Наоборот, большинство из них оказалось совершенно неготовыми к тому, что в новой версии некоторые системные списки стали тьюплами, а некоторые тьюплы - итераторами.
В Perl то же самое. Почему столько описаний, как заставить "маленькую машинку" что-то сделать, вместо того, что бы открыть этот конструктор конечных автоматов программисту?
Вот и получается, что внутренности Perl/Python никому не интересны, т.к. пишущиеся на них задачи такого копания не окупают, а Forth, наоборот, провоцирует на адаптацию своего нутра для облегчения условий работы над проектом. Более того, т.к. задача большая, а Forth маленький, написание своего Forth часто оправдано. "Полдня потерять, потом за пять минут долететь".
Последнее замечание будет совсем уж философским. Почему машина построенная человеком, всегда хуже живого организма? Даже если мы боги био- и нано-технологии... Дело в том, что перед организмом стоит одна задача - выжить, а перед машиной две - выжить и сделать для нас что-то полезное. А за двумя зайцами... Посмотрим на Forth. Какая самая красивая программа на нем написана? Он сам... И кто-то до сих пор считает его не системой, а, всего лишь, языком?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Разработка "сверху вниз"
СообщениеДобавлено: Чт фев 16, 2012 06:03 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
вот блин... жабы рыбы и хвосты!
А кто-то до сих пор считает, что у Форта нет синтаксиса...

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Разработка "сверху вниз"
СообщениеДобавлено: Чт фев 16, 2012 08:17 
В Форт системе необходимые структуры тоже создаются и используются, по необходимости.
https://sites.google.com/site/forthtoychest/
[url]http://sourceforge.net/projects/socdl/[url]

Код:
This SOC Description Language is a tool for generating register interfaces and supporting infrastructure from a master register description. From a single point-of-edit, many files useful to SOC hardware design are generated. By changing template files, any base design may be defined, which the SOCDL automatically adds modules to...


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Разработка "сверху вниз"
СообщениеДобавлено: Чт фев 16, 2012 09:54 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
gudleifr писал(а):
Forth не предназначен для маленьких задач!

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

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Разработка "сверху вниз"
СообщениеДобавлено: Чт фев 16, 2012 11:33 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7958
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
chess писал(а):
Вывод неверный, так как ни на чем не основан. Форт-система располагает исходным минимумом функционала для решения задач, зато располагает максимумом функционала, чтобы этот минимум расширить ровно до того уровня, который необходим для решения любой задачи, как простой так и сложной. Если исходить из того, что решение любой задачи должно быть предварительно записано
на каком-то языке, то форт-система предоставляет средства для создания такого языка и его обработки. Сами эти средства можно с натяжкой назвать метаязыком, с натяжкой потому, что форт-система в состоянии и эти средства менять.

Я это все прочитал так, что "ни на чем не основан, но вот вам обоснование" :) Потому что когда язык предоставляет средства для расширения, это означает, что надо потратить время на расширение, а потом сэкономить его, реализуя собственно задачу. Причем чем больше объем кода для задачи, тем больше будет выигрыш от предварительного создания удобного расширения.


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

Часовой пояс: UTC + 3 часа [ Летнее время ]


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

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


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

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB