Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 03:15

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 132 ]  На страницу Пред.  1 ... 5, 6, 7, 8, 9  След.
Автор Сообщение
 Заголовок сообщения: Re: обсуждение наброска стандарта
СообщениеДобавлено: Сб июн 22, 2013 12:43 
Хищник писал(а):
Здесь же не Дейкстра поднял вопрос о принципиальном различии Форт-машины и эмулятора
Дык, яблоко тоже только подняло вопрос, а объяснил Ньютон.
Хищник писал(а):
Из определения не следует, что такой код не может быть создан из текста, например, на Паскале.
Паскаль позволяет свободное обращение с адресами процедур, невзирая на их тип?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: обсуждение наброска стандарта
СообщениеДобавлено: Сб июн 22, 2013 12:50 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
gudleifr писал(а):
Хищник писал(а):
Из определения не следует, что такой код не может быть создан из текста, например, на Паскале.
Паскаль позволяет свободное обращение с адресами процедур, невзирая на их тип?

Таким образом, определение должно быть дополнено требованиями к семантике слов, адреса которых мы таким образом указываем? :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: обсуждение наброска стандарта
СообщениеДобавлено: Сб июн 22, 2013 12:57 
Хищник писал(а):
определение должно быть
Речь не об определении, а о характеристическом признаке. Умеет программа свободно комбинировать свой код для получения новой семантики по запросу пользователя? Является ли адрес кода такими же данными, как и остальные? Имеют ли все куски кода одинаковый тип (ROUTINE по Муру - понятно как запустить, не имеет параметров, возврат в одно фиксированное "место")? Значит, похоже на Forth. Имеется четкое разграничение в обработке данных и кода? Скорее, эмулятор.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: обсуждение наброска стандарта
СообщениеДобавлено: Сб июн 22, 2013 13:06 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
gudleifr писал(а):
Речь не об определении, а о характеристическом признаке. Умеет программа свободно комбинировать свой код для получения новой семантики по запросу пользователя? Является ли адрес кода такими же данными, как и остальные?

Ну так я уже сколько времени назад указал на стек и словарь как механизмы обеспечения такого поведения.
gudleifr писал(а):
ли все куски кода одинаковый тип (ROUTINE по Муру - понятно как запустить, не имеет параметров, возврат в одно фиксированное "место")?

То есть, к примеру, все функции являются void() ;) Кто ж это пенял мне на "запрет функциям возвращать значения" :))
Потратьте, пожалуйста, немного времени на разбор предлагаемых примеров, чтобы получался диалог. Я не к тому, что все тотально неправильно, а к тому, что приходится каждое Ваше утверждение сопровождать примерами ситуаций, которые приводят к его уточнению и доведению до более понятного вида.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: обсуждение наброска стандарта
СообщениеДобавлено: Сб июн 22, 2013 13:15 
Хищник писал(а):
Ну так я уже сколько времени назад указал на стек и словарь как механизмы обеспечения такого поведения.
Наконец-то! Именно для "обеспечения такого поведения" они и нужны, а не для упражнений в стековой арифметике.

Хищник писал(а):
То есть, к примеру, все функции являются void()
Еще немного, и Вы догадаетесь, как устроен Forth. Т.е. поймете, что (*void)() можно класть на стек.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: обсуждение наброска стандарта
СообщениеДобавлено: Сб июн 22, 2013 14:03 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
gudleifr писал(а):
Хищник писал(а):
То есть, к примеру, все функции являются void()
Еще немного, и Вы догадаетесь, как устроен Forth. Т.е. поймете, что (*void)() можно класть на стек.

А может так:
Ещё немного, и Вы догадаетесь, Т.е. поймете, что на (*void)() можно класть:) и не только на (*void)()


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: обсуждение наброска стандарта
СообщениеДобавлено: Сб июн 22, 2013 21:36 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
gudleifr писал(а):
Именно для "обеспечения такого поведения" они и нужны, а не для упражнений в стековой арифметике.

Они нужны именно для данных, обрабатываемых словами. Для компиляции стек может быть использован постольку, поскольку он есть. Если FIND оставит адрес найденного слова на стеке, то CALL, скомпилирует вызов этого слова. Без проблем. Только вот стек именно в качестве хранилища данных неизвестного заранее объема в таком случае не используется. Нет его, неизвестного заранее объема, адрес только один, и его надо один раз положить и один раз снять. С тем же успехом можно для его хранения использовать глобальную переменную или HERE. С точки зрения конечного результата, нет разницы, используем ли мы написанные для Форта слова FIND CALL, и им подобные, или же пишем для основного цикла монолитную функцию на инструментальном языке. Поэтому стек тут не обязателен (а вот для передачи данных вглубь цепочки подпрограмм - обязателен). В качестве примера см. MSIL и машину .net - там dup и drop впрямую присутствуют в системе команд, причем именно в этом виде. А вот swap там нет, потому что да, лишнее стековое жонглирование. Незачем класть параметры на стек в неправильном порядке, а потом перекладывать.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: обсуждение наброска стандарта
СообщениеДобавлено: Сб июн 22, 2013 21:45 
Хищник писал(а):
...
Нет, про (*void)() в стеке для Вас пока рано... Проехали.

Может проще Вам будет рассуждать так: процедуры обмениваются параметрами через стек, интерпретация, компиляция и выполнение с точки зрения Forth являются обычными процедурами. Так что странного в том, что свои параметры (адреса слов/кода) они держат в стеке?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: обсуждение наброска стандарта
СообщениеДобавлено: Сб июн 22, 2013 22:04 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
gudleifr писал(а):
Может проще Вам будет рассуждать так: процедуры обмениваются параметрами через стек, интерпретация, компиляция и выполнение с точки зрения Forth являются обычными процедурами. Так что странного в том, что свои параметры (адреса слов/кода) они держат в стеке?

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: обсуждение наброска стандарта
СообщениеДобавлено: Сб июн 22, 2013 22:10 
Хищник писал(а):
Я именно это подробно расписал постом раньше.
Где?
В основном, Вы отстаивали обратную точку зрения:
Хищник писал(а):
Монолитный Evaluate на ассемблере или ЯВУ не задействует...

Хищник писал(а):
... Поэтому стек тут не обязателен...


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: обсуждение наброска стандарта
СообщениеДобавлено: Сб июн 22, 2013 22:24 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
"Для компиляции стек может быть использован постольку, поскольку он есть. Если FIND оставит адрес найденного слова на стеке, то CALL, скомпилирует вызов этого слова. Без проблем. Только вот стек именно в качестве хранилища данных неизвестного заранее объема в таком случае не используется."

Еще раз. Раз уж стек данных (!) есть, им можно вполне пользоваться. Но не надо с водой выплескивать ребенка, выкидывая манипуляции с данными как таковые, и оставляя только манипуляции с адресами. Это адреса на стеке "гости". А обрабатываемые данные - коренное население.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: обсуждение наброска стандарта
СообщениеДобавлено: Сб июн 22, 2013 22:41 
gudleifr писал(а):
... интерпретация, компиляция и выполнение с точки зрения Forth являются обычными процедурами. Так что странного в том, что свои параметры (адреса слов/кода) они держат в стеке?

Хищник писал(а):
Для компиляции стек может быть использован постольку, поскольку он есть.

Это как бы не одно и то же.
Хищник писал(а):
Это адреса на стеке "гости". А обрабатываемые данные - коренное население.
Адреса - и есть данные. Обрабатываете их "специальным образом", как "гостей", - имеете эмулятор.

Как родился Forth?
Дейкстра (выделение мое):
Цитата:
Как видно из примера, машина начинает с того, что переписывает в верхние ячейки стека текст программы слово за словом. Рано или поздно этот процесс должен быть прерван, в противном случае наша машина была бы просто переписывающей машиной. В приведенной системе процесс переписывания прерывается, когда в тексте программы встречается символ какой-либо операции. Следовательно, символ операции выполняет двойную функцию: во-первых, он указывает на то, что процесс переписывания должен быть прерван на некоторое время, так как теперь должна быть выполнена операция; во-вторых, он определяет эту операцию.
Я предлагаю разделить эти две совершенно различные функции: мы будем обращаться с символами арифметических операций совершенно так же, как с числами, т.е. слова-операции также будут переписываться в стек.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: обсуждение наброска стандарта
СообщениеДобавлено: Вс июн 23, 2013 00:50 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Ффууух! А я-то думаю, где там скачут Ваши мысли! Вы же перепутали автомат с магазинной памятью (т.е стеком), который годится для разбора языков с контекстно-свободной грамматикой, и стековую машину, работающую в рантайме. Дейкстра не родил Форт, и стек был известен еще до Мура. Просто в процессе разбора выражений языка приходится запоминать какие-то части выражения для последующей компоновки. Для разбора c = a + b последовательность операций процессора не соответствует последовательности символов. Надо как раз по-фортовски:
A @
B @
+
C !
Просто Форт ничего не автоматизирует и оставляет эту последовательность на усмотрение программиста. А компилятор Си вынужден, видя c, а после него =, уже начинать что-то компоновать, потому что лексемы-то идут, а код пока создать нельзя. Ну и получается, страшно сказать, СТЕК :) Только это стек компилятора, куда заталкиваются операнды и операции, которые пока еще не могут быть скомпилированы. Это не стек программы, которую этот компилятор создает (этот стек тоже есть, и через него передаются параметры). А у Форта стек относится как раз к уже работающей программе. И через него тоже передаются параметры. Мур создал язык, в котором не надо заботиться о совместном существовании параметров подпрограммы и адреса возврата, поскольку параметры лежат совершенно отдельно.

Резюмируя: Вы открыли для себя процесс компиляции для грамматик, более сложных, чем регулярная. Этот компилятор может быть написан и на Форте, пользуясь его стеком как готовым инструментом. Да, стек для этого процесса нужен (хотя, afair, есть и альтернативные варианты, но это уже высший пилотаж и я не готов навскидку дать какой-то обзор). Но не отбирайте этот стек в эксклюзивное пользование :) Он нужен еще и для других вещей.



За это сообщение автора Hishnik поблагодарил: zehotello
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: обсуждение наброска стандарта
СообщениеДобавлено: Вс июн 23, 2013 09:48 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Хищник писал(а):
Резюмируя: Вы открыли для себя процесс компиляции для грамматик, более сложных, чем регулярная. Этот компилятор может быть написан и на Форте, пользуясь его стеком как готовым инструментом. Да, стек для этого процесса нужен (хотя, afair, есть и альтернативные варианты, но это уже высший пилотаж и я не готов навскидку дать какой-то обзор). Но не отбирайте этот стек в эксклюзивное пользование :) Он нужен еще и для других вещей.

Из одного обсуждения в c.l.f.
как Форт текст можно превратить в инфикс (но вроде есть вероятность сайд эффектов в "произвольном" случае)
Код:
x 0.5 - dup * y 0.5 - dup * + 0.25 / 1 swap -

The stack at each point would be:

x
x 0.5
(x-0.5)
(x-0.5) (x-0.5)
((x-0.5)*(x-0.5))
((x-0.5)*(x-0.5)) y
((x-0.5)*(x-0.5)) y 0.5
((x-0.5)*(x-0.5)) (y-0.5)
((x-0.5)*(x-0.5)) (y-0.5) (y-0.5)
((x-0.5)*(x-0.5)) ((y-0.5)*(y-0.5))
(((x-0.5)*(x-0.5))+((y-0.5)*(y-0.5)))
(((x-0.5)*(x-0.5))+((y-0.5)*(y-0.5))) 0.25
(((((x-0.5)*(x-0.5))+((y-0.5)*(y-0.5)))/0.25)
(((((x-0.5)*(x-0.5))+((y-0.5)*(y-0.5)))/0.25) 1
1 (((((x-0.5)*(x-0.5))+((y-0.5)*(y-0.5)))/0.25)
(1-(((((x-0.5)*(x-0.5))+((y-0.5)*(y-0.5)))/0.25))

Дальнейшая "агрессивная" оптимизация "стороннего" компилятора должна "вычистить" этот код.

P.S. Классический процесс компиляции неплохо проилюстрирован в книге
"Язык Си для профессионалов" по материалам книги Г.Шилдта И.В.К. - СОФТ 1992г. (в моём в бумажном варианте)
Именно так, как и описал Хищник:)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: обсуждение наброска стандарта
СообщениеДобавлено: Вс июн 23, 2013 10:39 
Хищник писал(а):
...
После выкидывания слов, которые Вы использовали неправильно, остается:
Хищник писал(а):
Просто Форт ничего не автоматизирует и оставляет эту последовательность на усмотрение программиста.

Хищник писал(а):
А у Форта стек относится как раз к уже работающей программе.

Как Вы правильно заметили в первой фразе, "эта последовательность" и составляет "работающую программу" Forth.
И как правильно сказали во второй, для этого нужен стек.
С чем спорите?


Последний раз редактировалось gudleifr Вс июн 23, 2013 11:36, всего редактировалось 1 раз.

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

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


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

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


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

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