Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Сб дек 15, 2018 10:35

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 46 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Вс янв 24, 2010 23:54 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4956
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
danbst писал(а):
В режиме интерпретации интерпретатор берет слово, ищет в словаре и исполняет его.

передает ему управление( вызывает).

danbst писал(а):
В режиме компиляции интерпретатор берет слово, ищет в словаре его адрес и дописывает к текущей словарной статье в виде cfa (вроде так).

добавляет ссылку(вызов) в конец текущего опеделения.
Вобщем правильно 8)

danbst писал(а):
Код:
:NEW-WORD 1 [ VARIABLE NEW-VAR ] . ;

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

danbst писал(а):
Продолжаю дальше разбирать FreeForth...

возможно не очень удачный для разбора Форт, кстати, он у вас хоть запустился? У мя нет 8(

danbst писал(а):
Все никак не мог понять - переменные повсеместно создаються в режиме интерпретации ( в тех программах, которые я видел), а в FreeForth нету режима интерпретации.

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

danbst писал(а):
Только сейчас обнаружил, что :, CREATE, VARIABLE являются как-бы словами одной группы - создающие заголовки, тоесть каждое из них относится скорее к режиму компиляции, чем интерпретации.

Они добавляют новые данные и код в пространство кода и данных.
А вообще есть главное слово, создающее заголовок для любого слова: HEADER, или SHEADER, остальные слова вызывают это слово при создании нового имени.

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

эм, есть два вида интерпретации в Форте, их можно спутать в начале:
1) адресная интерпретация - это методика исполнения скомпилированного кода, она зависит от типа шитого кода
2) текстовая интерпретация - то есть разбор входного текстового источника.
Это раз. Второе, переключение режимов не отменяет самого факта интерпретации текста. Она, эта интерпретация продолжается в любом случае, только приводит к несколько отличному эффекту. Те же слова, создающие заголовки могут быть скомпилированы.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс янв 24, 2010 23:56 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Цитата:
Код:
: NEW-WORD 1 [ VARIABLE NEW-VAR ] . ;


Обьясните пожалуйста, 1) почему SP-Forth не видит слова NEW-WORD и 2)что находиться в памяти словаря (какие данные) после статьи NEW-VAR.
Видимо, потому. что внутри компиляции слова нельзя произвожить операции с памятью (кодофайлом) и системными переменными, каковые операции были произведены включением в квадратные скобки слова VARIABLE


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс янв 24, 2010 23:58 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Цитата:
вах, такое обычный Форт не проглотит. Так делать нельзя.
Если брать СПФ, то слова добавляются всегда в конец пространства выделенного под код и данные, каждый раз увеличивая это пространство.
ваш пример приведет к перемешиванию кода и данных разных слов, то есть непредвиденной ситуации, с неожиданным эффектом.
Тут объяснять по сути нечего, просто нельзя так делать!
упомянутый gforth различает, кстати, ошибки
Код:
Gforth 0.6.2, Copyright (C) 1995-2003 Free Software Foundation, Inc.
Gforth comes with ABSOLUTELY NO WARRANTY; for details type `license'
Type `bye' to exit
: N 1 [ VARIABLE NN ] . ;  ok
N
*the terminal*:2: Invalid memory address
N
^
Backtrace:



NNN
*the terminal*:3: Undefined word
NNN
^^^
Backtrace:
$E850B4 throw
$E90B10 no.extensions



как видим, слово, неправильно определенное, вызвало не такую ошибку, как слово просто отсутсвующее


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 25, 2010 00:18 
Не в сети

Зарегистрирован: Пн ноя 23, 2009 16:12
Сообщения: 64
Откуда: Київ, Івано-Франківськ
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
mOleg писал(а):
вах, такое обычный Форт не проглотит. Так делать нельзя.

То, что он не проглотит - я уже увидел )) Мне интересно, что именно происходит с памятью.

Код:
: NEW-WORD \ создать заголовок новой статьи NEW-WORD - в память записываются параметры и имя
1 \ еем..
[
VARIABLE NEW-VAR \ создать заголовок статьи NEW-VAR
]
. \ дописать в последнее слово ссылку на . ? в какое слово допишется? и как это сделается?
; \ а что сдесь происходит?

1 NEW-VAR ! NEW-VAR @ . \ выведет 1, тоесть, переменная определена нормально
NEW-WORD \ почему сдесь ошибка - статья не найдена? разве мы уже не создали заголовок?


mOleg писал(а):
возможно не очень удачный для разбора Форт, кстати, он у вас хоть запустился? У мя нет 8(

.exe-шник запустился, да. Windows Server 2008.

mOleg писал(а):
А вообще есть главное слово, создающее заголовок для любого слова: HEADER, или SHEADER, остальные слова вызывают это слово при создании нового имени.

значит : не есть базовым словом? ухты! А где можно посмотреть на приблизительный список базовых слов?

mOleg писал(а):
эм, есть два вида интерпретации в Форте, их можно спутать в начале:

Я спутал немножко другое - возможность взаимодействия с пользователем и интерпретацию слов в Форте.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 25, 2010 00:35 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4956
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
danbst писал(а):
То, что он не проглотит - я уже увидел )) Мне интересно, что именно происходит с памятью.


итак, стандартная процедура создания нового определения по пунктам:
1) создать в текущем словаре заголовок слова с указанным именем
2) скрыть заголовок от поиска (чтобы можно было переопределять уже существующие имена с их использованием)
3) выделить место под код и данные (опционально)
3) собрать слово
4) зафиксировать размер полученного слова (опционально)
5) сделать слово доступным поиску.

это нормальный порядок действий. Заметь, что слово становится видимым только в случае успшного завершения всех операций!
для того, чтобы помнить, какое определение сейчас создается существует специальная переменная LAST (или LATEST).
в LAST сохраняется адрес при выполнении пункта 1, и все последующие действия работают с ней
если ты создаешь подряд два имени, то LAST хранит адрес только последнего, поэтому предыдущее никогда не открывается для поиска.
просто операция "открытия" дважды производится над последним определенным словом (в твоем случае), а значит NEW-WORD не виден.

danbst писал(а):
значит : не есть базовым словом? ухты! А где можно посмотреть на приблизительный список базовых слов?

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

danbst писал(а):
Я спутал немножко другое - возможность взаимодействия с пользователем и интерпретацию слов в Форте.

а это по сути одно и то же 8)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 25, 2010 00:37 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1256
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
danbst писал(а):
: NEW-WORD 1 [ VARIABLE NEW-VAR ] . ;

Такая запись некорректна: создание словарной статьи еще не завершено и тут же начинается определение нового слова, как результат в середине определения слова NEW-WORD сразу после литерала 1 будет расположен код слова NEW-VAR.
danbst писал(а):
В режиме компиляции интерпретатор берет слово, ищет в словаре его адрес и дописывает к текущей словарной статье в виде cfa (вроде так).

Да, примерно так: только он еще и проверяет признак немедленного исполнения слова - и если он есть, то вместо компиляции происходит выполнение слова.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 25, 2010 00:51 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1256
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
: NEW-WORD \ создать заголовок новой статьи NEW-WORD - в память записываются параметры и имя
1 \ еем..
Буквально: "разместить код, кладущий на стек 1"
[ - Переход в режим интерпретации
VARIABLE NEW-VAR \ создать заголовок статьи NEW-VAR
И зарезервировать ячейку памяти под хранение числа.
] \ Переход в режим компиляции
. \ дописать в последнее слово ссылку на . ? в какое слово допишется? и как это сделается?
В следующую свободную ячейку памяти или в текущее определяемое слово.
; \ а что сдесь происходит?
Компиляция кода возврата.
NEW-WORD \ почему сдесь ошибка - статья не найдена? разве мы уже не создали заголовок?
Да, заголовок создан, и вызов первого слова - литерала 1 производится успешно, а вот далее вместо исполнимого кода размещаются служебные данные, описывающие словарную статью - её имя и другие служебные параметры. Это и вызывает исключение.
Слова просто компилируются линейно, по мере поступления кода в интерпретатор.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 25, 2010 01:05 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
danbst писал(а):
Код:
: NEW-WORD 1 [ VARIABLE NEW-VAR ] . ;

Обьясните пожалуйста, 1) почему SP-Forth не видит слова NEW-WORD и 2)что находиться в памяти словаря (какие данные) после статьи NEW-VAR.


В ему слово HIDE в : изменило первую букву на код 12 (специально чтобы скрыть)
SMUDGE восстанавливает первую букву. Смотри src\compiler\spf_defwords.f
И еще: В основном SP-Forth не отделены области кода от области словаря (в моей модификации отделен) .
Т.ч. нужно позаботится о том, чтобы не передать управление в область словарной статьи слова NEW-VAR
В общем:
Код:
: NEW-WORD 1 0 IF [ SMUDGE VARIABLE NEW-VAR ] THEN . ; SMUDGE


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 25, 2010 01:11 
Не в сети

Зарегистрирован: Пн ноя 23, 2009 16:12
Сообщения: 64
Откуда: Київ, Івано-Франківськ
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
VoidVolker писал(а):
Да, заголовок создан, и вызов первого слова - литерала 1 производится успешно,

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

кстати да, опять просветление )
mOleg писал(а):
Стоит вспомнить, что есть слова, которые всегда исполняются, вне зависимости от режима! Вот с помощью их можно обойтись вообще без переключения режимов.

теперь я понял эту фразу )
Код:
: A ;
42 .
: B ;

данный код синтаксически правильный и для SPF и для FreeForth, тоесть режим "интерпретации" (как я его понимал раньше) там присутствует. Но..

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 25, 2010 01:27 
Не в сети
Аватара пользователя

Зарегистрирован: Пн ноя 27, 2006 22:09
Сообщения: 115
Откуда: Ростов-на-Дону
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
А можно я дам ссылку на главу из книжки про лисп, но зато по теме?

2. Намылить, смыть, повторить: знакомство с REPL

Это про диалог с системой, как замену подхода "написал, потом долго отлаживаю"

А так никто не мешает в форте определить слово main (ну или как ты его назовёшь) а потом его вызвать. При создании EXE-шной программы в SPF используются переменные <MAIN> и MAINX для определения точки входа соответственно в консольное и гуёвое приложение.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 25, 2010 01:44 
Не в сети

Зарегистрирован: Пн ноя 23, 2009 16:12
Сообщения: 64
Откуда: Київ, Івано-Франківськ
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Так REPL это совсем другое! Конечно, при написании программы я так и делаю (иногда =) ). Но если я написал программу и считаю ее завершенной, наличие таких вот между-вставок раздражает (поскольку так насадили мировосприятие мне учебники по паскалю в былые времена). Хочу узнать, правильно-ли то, что они меня раздражают.

be_nt_all писал(а):
А глобальные переменные и константы определяются вне слов.

да, тут согласен. к глобальным переменным претензий не имею )


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 25, 2010 01:50 
Не в сети
Аватара пользователя

Зарегистрирован: Пн ноя 27, 2006 22:09
Сообщения: 115
Откуда: Ростов-на-Дону
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Ну так : A ; 42 . — это чистой воды REPL, в готовом коде если и есть смысл что то печатать в режиме интерпретации, то только в духе

Код:
.( идёт компиляция блока #1024, пристегните ремни безопасности )


:). А так в этом режиме определяются глобальные переменные и константы.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 25, 2010 02:12 
Не в сети

Зарегистрирован: Пн ноя 23, 2009 16:12
Сообщения: 64
Откуда: Київ, Івано-Франківськ
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
be_nt_all писал(а):
.( идёт компиляция блока #1024, пристегните ремни безопасности )

понятно показано :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 25, 2010 02:19 
Не в сети
Аватара пользователя

Зарегистрирован: Пн ноя 27, 2006 22:09
Сообщения: 115
Откуда: Ростов-на-Дону
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Посмотрел на твой код. Если ты таким образом хотел создать локальную переменную, то ты неправ. Для работы с local'ами есть отдельные словари/библиотеки. Маленький нюанс в том, что при стандартизации ANSI 93 стандартизировали что то явно не то, поэтому в стандарте не смотреть. Для SPF смотри intro.ru.html или (чуть подробнее) найди в папке devel locals.pdf от pretorian'а. Для gforth почти также, но отличия есть (если английский знаешь, вообще шикарная документация, с учебником вместе).


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 25, 2010 02:23 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Цитата:
Для gforth почти также, но отличия есть (если английский знаешь, вообще шикарная документация, с учебником вместе)
Разница в том, что gforth создаёт локальную переменную где попало а не в начале слова


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

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


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

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


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

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