Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 13:39

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - История LITARAL
Автор Сообщение
  Заголовок сообщения:  Re: История LITARAL  Ответить с цитатой
Все равно немного не понимаю, почему бы код, пишущийся при разработке один раз, не создавать так, как это удобно. Смотреть, есть ли соответствующие слова, чтобы выразить на Форте все, что можно... была такая волна, но смысл от меня ускользает.
Сообщение Добавлено: Вт июн 09, 2020 02:57
  Заголовок сообщения:  Re: История LITARAL  Ответить с цитатой
mOleg писал(а):
Стандарт явно ориентировался на систему с косвенным ШК, причем только (без учета других вариантов) имхо
Так с прямым шитым кодом будет то-же что с косвенным.
Вот так у меня в Форте с прямым шитым кодом :
Код:
         $COLON   $IMMED+7, 'LITERAL', LITERAL
         DW   STATE, FETCH, QUERY_BRANCH, @@1
         DW   COMPILE, LIT, COMMA
@@1      DW   EXIT

Вот так в Форте с косвенным шитым кодом :
Код:
            ENTRY   7+40h, 'LITERAL', LITERAL
            DD   DoCOLON
            DD   STATE, FETCH
            DD   ZERO_BRANCH, LITERAL_-$
            DD   COMPILE, LIT, COMMA
LITERAL_    DD   EXIT

Т.е. для этих ШК абсолютно одно и то-же
: LITERAL STATE @ IF COMPILE LIT , THEN ; IMMEDIATE

А в Форте с подпрограммным шитым кодом для Atmel AVR:
Код:
LITERAL:   rcall   STATE         ;; LITERAL
         rcall   FETCH
         rcall   QUERY_BRANCH
         ret
         rcall   LIT
         .DW   2 * LIT
         rcall   COMPILE_COMMA
         rjmp   COMMA

(тут QUERY_BRANCH (по фортовски ?BRANCH) или перепрыгивает через следующую команду (которая обычно rjmp, но вот тут красиво всандалилось ret) или не перепрыгивает. Используется то, что в AVR все команды одинаковы в длину).
Что по Фортовски означает
: LITERAL STATE @ IF ['] LIT COMPILE, , THEN ; IMMEDIATE

т.е. для любых ШК этот LITERAL определяется близкими вариациями на одну и ту-же тему.

Victor__v писал(а):
:dmad; :dmad; :dmad;
Вариант 1
: LIT, COMPILE LIT , ;
Ну так тогда если идти через определение LIT,
: -1 -1 STATE @ IF LIT, THEN ; IMMEDIATE
а если идти через определение LITERAL
: -1 -1 [COMPILE] LITERAL ; IMMEDIATE
Второе-же позволяет иметь единственное ветвление по STATE внутри LITERAL
Сообщение Добавлено: Пн июн 08, 2020 21:31
  Заголовок сообщения:  Re: История LITARAL  Ответить с цитатой
Ethereal писал(а):
Victor__v писал(а):
Ну пусть будет
: LIT, COMPILE LIT , ;
: LIT, 0x68 C, , ;
Так тут ты выкрасил и выбросил. Определил LIT, а потом перекрыл.


:dmad; :dmad; :dmad;
Вариант 1
: LIT, COMPILE LIT , ;
Вариант 2
: LIT, 0x68 C, , ;

Так понятней?
Сообщение Добавлено: Пн июн 08, 2020 19:24
  Заголовок сообщения:  Re: История LITARAL  Ответить с цитатой
Стандарт явно ориентировался на систему с косвенным ШК, причем только (без учета других вариантов) имхо
Сообщение Добавлено: Пн июн 08, 2020 18:33
  Заголовок сообщения:  Re: История LITARAL  Ответить с цитатой
Victor__v писал(а):
Ну пусть будет
: LIT, COMPILE LIT , ;
: LIT, 0x68 C, , ;
Так тут ты выкрасил и выбросил. Определил LIT, а потом перекрыл.
Сообщение Добавлено: Пн июн 08, 2020 13:23
  Заголовок сообщения:  Re: История LITARAL  Ответить с цитатой
Ethereal писал(а):

Вот и вопрос ко стандарту. Почему там нет слова, которое нужно для реализации LITERAL?
Так это ОДИН ИЗ вариантов и он появится скорей всего при подпрограммном ШК.
А в случае прямого или косвенного ШК скорее будет так
: LITERAL STATE @ IF COMPILE LIT , THEN ; IMMEDIATE
В случае нативного например так
: LITERAL STATE @ IF 68 C, , THEN ; IMMEDIATE

Что тут стандартизовывать, коли в этом месте развилка на варианты, причем для разных ШК естественными будут разные ? Этот момент как раз и оставляется на усмотрение реализации. Все логично.[/quote]
Ну пусть будет
: LIT, COMPILE LIT , ;
: LIT, 0x68 C, , ;
И?
Тоже логично между прочим)
Сообщение Добавлено: Пн июн 08, 2020 13:04
  Заголовок сообщения:  Re: История LITARAL  Ответить с цитатой
Victor__v писал(а):
Вы же сами пример реализации приводите
: LITERAL STATE @ IF LIT, THEN ; IMMEDIATE

Вот и вопрос ко стандарту. Почему там нет слова, которое нужно для реализации LITERAL?
Так это ОДИН ИЗ вариантов и он появится скорей всего при подпрограммном ШК.
А в случае прямого или косвенного ШК скорее будет так
: LITERAL STATE @ IF COMPILE LIT , THEN ; IMMEDIATE
В случае нативного например так
: LITERAL STATE @ IF 68 C, , THEN ; IMMEDIATE

Что тут стандартизовывать, коли в этом месте развилка на варианты, причем для разных ШК естественными будут разные ? Этот момент как раз и оставляется на усмотрение реализации. Все логично.
Victor__v писал(а):
Код:
0 [ ' DlgProc CFA ] LITERAL

И чем это выгодно отличается от
Код:
0 [ ' DlgProc CFA LIT, ]

[ считаем_выражение ] LITERAL
Если кросс-компиляция, то считаем_выражение должно выполняться в контексте словаря host-машины, а компиляция результата этого выражения в контексте словаря COMPILER в код target-машины. ] переключит словари. Т.е. компиляция изнутри [ ] не есть гуд в свете того, что Форт до кучи кросс-компилятор самого себя. Думаю так.
Сообщение Добавлено: Пн июн 08, 2020 12:38
  Заголовок сообщения:  Re: История LITARAL  Ответить с цитатой
Цитата:
Не понятно что ты тут вытворяешь

Я вообще в качестве примера сделал слово для компиляции вызова слова с 1 аргументом по умолчанию, -1 то есть.
Вся эквелибристика с режимом компиляции, чтоб LITERAL работал как надо.

Цитата:
Как-то ты неправильно воспринимаешь стандарт.
Если в стандарте нет, то и не должно быть - совершенно неправильное понимание.

Да ну?

Вы же сами пример реализации приводите
: LITERAL STATE @ IF LIT, THEN ; IMMEDIATE

Вот и вопрос ко стандарту. Почему там нет слова, которое нужно для реализации LITERAL?
Какая-то узконаправленная хренотень есть, а так и напрашивающегося компилирующего примитива нет?

Цитата:
Так это для тебя смысл или для Мура смысл ?

А Мур-то тут причем?

Код:
0 [ ' DlgProc CFA ] LITERAL

И чем это выгодно отличается от
Код:
0 [ ' DlgProc CFA LIT, ]

???
Сообщение Добавлено: Пн июн 08, 2020 12:01
  Заголовок сообщения:  Re: История LITARAL  Ответить с цитатой
Victor__v писал(а):
Это, блин, компилирующее слово, но его хрен используешь для компилирующих связок!
Что-то вроде : -1call STATE @ -1 STATE ! -1 [COMPILE] LITERAL ' COMPILE, STATE ! ; IMMEDIATE
И вот такую херню надо делать, чтобы использовать LITERAL
Не понятно что ты тут вытворяешь. Если у тебя слово IMMEDIATE значит оно для режима компиляции. Зачем ты в нем еще раз включаешь режим компиляции, когда он итак наготово ? Чтобы работало в обоих режимах, тогда зачем режим компиляции вне зависимости от того, что был ?
Если шитый код прямой или косвенный само просится
: -1 -1 STATE @ IF COMPILE LIT , THEN ; IMMEDIATE
А LITERAL он совершенно не про это.
Victor__v писал(а):
Напоминаю, что других слов для компиляции чисел в ansi94 нет.
Ввели бы слово LIT, по аналогии с COMPILE, и проблемы бы не было.
Как-то ты неправильно воспринимаешь стандарт.
Если в стандарте нет, то и не должно быть - совершенно неправильное понимание.
В стандарте все, что относится к внутренней кухне Форта отдано на откуп разработчику.
В стандарт вынесено только то, что делает ANS-совместимые прикладные программы переносимыми. LIT и LIT, не указаны потому, что это внутренняя кухня. Разработчик может их делать, может не делать, в прикладной программе их ведь все равно не будет.
Но практическая реализация ans94 да как-же без них ?
LIT само просится для прямого и косвенного шитого кода, а LIT, для подпрограммного и нативного.
: -1 -1 STATE @ IF LIT, THEN ; IMMEDIATE

А вообще-то почему LITERAL не про это ? Если вдуматься, то про это !
: LITERAL STATE @ IF LIT, THEN ; IMMEDIATE
: -1 -1 [COMPILE] LITERAL ; IMMEDIATE
Ведь также будет верно работать и в режиме компиляции и в режиме интерпретации !
А вот так вот вообще без LIT, (32-разрядный 80x86)
: LITERAL STATE @ IF 68 C, , THEN ; IMMEDIATE
: -1 -1 [COMPILE] LITERAL ; IMMEDIATE
где 68h - опкод команды push imm32


Гы-гы (оптимизация заменой push imm32 на push imm8 при возможности) :
: LITERAL STATE @ IF DUP 80 + 100 U< IF 6A C, C, ELSE 68 C, , THEN THEN ; IMMEDIATE
Сообщение Добавлено: Пн июн 08, 2020 06:04
  Заголовок сообщения:  Re: История LITARAL  Ответить с цитатой
Victor__v писал(а):
Это слово черезчур умное.
Из-за чего оно работает в очень редких случаях.
Смысл?
Так это для тебя смысл или для Мура смысл ?
Для Мура большой смысл имело слово
: RECOVER -1 ALLOT ;
Оно на тот случай если EXIT генерируемое ; исполняться не будет.
Значит эту бесполезно занятую ячейку памяти с EXIT надо обратно пустить в дело.
Применение (FIG-Forth, ' дает адрес поля параметров) :
: MAIN
0 [ ' DlgProc CFA ] LITERAL 0 ID_Dialog 0 DialogBoxParamA \ DROP
BYE
; RECOVER
Кстати, заодно и LITERAL в примере
Сообщение Добавлено: Пн июн 08, 2020 05:18
  Заголовок сообщения:  Re: История LITARAL  Ответить с цитатой
mOleg писал(а):
оно достаточно полезное,

В каком месте?
Ну вот можно сделать так:
: test [ 10 20 + ] LITERAL ;
Или вот так.
NONAME: 10 . : test LITERAL ;
А ещё?
Это, блин, компилирующее слово, но его хрен используешь для компилирующих связок!
Что-то вроде : -1call STATE @ -1 STATE ! -1 [COMPILE] LITERAL ' COMPILE, STATE ! ; IMMEDIATE
И вот такую херню надо делать, чтобы использовать LITERAL
Напоминаю, что других слов для компиляции чисел в ansi94 нет.
Ввели бы слово LIT, по аналогии с COMPILE, и проблемы бы не было.

Ну и смысл в слове, которое годится лишь на заплатку?

mOleg писал(а):
более того, я ввел в дополнение к LITERAL еще и

Насколько целесообразны дополнения надо смотреть как сделано ядро.

Например, REGULAR , как понимаю, используется часто.
У меня в Нове всего один раз в интерпретаторе, так что потребности в слове нет.
Сообщение Добавлено: Пт июн 05, 2020 11:01
  Заголовок сообщения:  Re: История LITARAL  Ответить с цитатой
mOleg писал(а):
Безусловно можно все делать на "подпорках", можно включать в код "магические числа", но код становится менее читабелен.

Реализация на исходном языке (ассемблер, Си...) явно не относится к реализации "на подпорках". Одна строка на Форте, которая в таком составе пишется один раз, имеет хорошие перспективы попасть в ядро - кода меньше, накладные расходы на стековые операции уберутся компилятором. Если с какого-то момента слова можно описывать на Форте, это не означает, что только на Форте их и нужно описывать.
Сообщение Добавлено: Чт июн 04, 2020 19:55
  Заголовок сообщения:  Re: История LITARAL  Ответить с цитатой
Hishnik писал(а):
Это же тоже из серии "пишем один раз за время жизни этого транслятора".

Безусловно можно все делать на "подпорках", можно включать в код "магические числа", но код становится менее читабелен.
Мне хотелось, чтобы внутри система была непротиворечива и понятна, чтобы она содержала минимум трюков и магических вещей.
поэтому магический POSTPONE я исключил (из ядра по крайней мере), а понятный и имеющий собственный смысл REGULAR включил в код.
Сообщение Добавлено: Чт июн 04, 2020 19:48
  Заголовок сообщения:  Re: История LITARAL  Ответить с цитатой
mOleg писал(а):
: TO ( n / name --> ) ' TOKEN + REGULAR ; IMMEDIATE

Это же тоже из серии "пишем один раз за время жизни этого транслятора".
Сообщение Добавлено: Ср июн 03, 2020 20:28
  Заголовок сообщения:  Re: История LITARAL  Ответить с цитатой
Victor__v писал(а):
Это слово черезчур умное.

оно достаточно полезное, более того, я ввел в дополнение к LITERAL еще и
: REGULAR ( xt --> ) state IF COMPILE, ;THEN EXECUTE ;
которое удобно использовать, например так:
: TO ( n / name --> ) ' TOKEN + REGULAR ; IMMEDIATE
Сообщение Добавлено: Ср июн 03, 2020 19:33

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


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