Forth
http://fforum.winglion.ru/

Форт и форт-процессор
http://fforum.winglion.ru/viewtopic.php?f=3&t=2826
Страница 1 из 4

Автор:  WingLion [ Чт мар 22, 2012 19:24 ]
Заголовок сообщения:  Форт и форт-процессор

Столкнулся с довольно странной ситуацией...

При попытке реализовать форт на форт-процессоре в результате появляется как бы два форта.

Внутренний и внешний...
Внутренний - это по сути ассемблер для форт-процессора, а внешний - это тот Форт, который видится программисту.

Из-за ограниченности стеков первый не может стать вторым.
И тогда получается, что примитивы верхнего форта представляют собой подпрограммы (или кусочки кода) на нижнем форте, но при этом у них разные стеки и разные способы связывания кусочков кода...

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

Вот пример:

Код:
DUP: \ это примитив верхнего форта
     DP@ \ берем адрес стека (верхнего!)
     DUP @ \ получаем верхний элемент
     OVER INC \ следующий адрес стека
     ! \ сохраняем новую вершину стека
     INC DP! \ обновляем адрес стека
     RET


Такая вот заноза....

Конечно, на нижнем уровне все ок. И все быстро, но на верхнем получается бяда!..

Сижу и думаю, как же этот узел разрубить?..

Автор:  gudleifr [ Чт мар 22, 2012 19:57 ]
Заголовок сообщения:  Re: Форт и форт-процессор

А для кого я писал, что Forth на Forth не реализуется? Обязательно наступать на все грабли самим? Простите.

Автор:  WingLion [ Чт мар 22, 2012 20:15 ]
Заголовок сообщения:  Re: Форт и форт-процессор

gudleifr писал(а):
А для кого я писал, что Forth на Forth не реализуется?

На что спорим, что я его сделаю?

Автор:  gudleifr [ Чт мар 22, 2012 20:25 ]
Заголовок сообщения:  Re: Форт и форт-процессор

WingLion писал(а):
На что спорим, что я его сделаю?
"- А ты знаешь, Вася, с этого моста прыгать нельзя. - Это почему, еще?!"
Нельзя не в смысле "невозможно", а в смысле "ничего хорошего из этого не выйдет".

Автор:  WingLion [ Чт мар 22, 2012 20:30 ]
Заголовок сообщения:  Re: Форт и форт-процессор

gudleifr писал(а):
Нельзя не в смысле "невозможно", а в смысле "ничего хорошего из этого не выйдет".


Не доказано... Про Форт, а не про мост...

Автор:  gudleifr [ Чт мар 22, 2012 20:58 ]
Заголовок сообщения:  Re: Форт и форт-процессор

WingLion писал(а):
Не доказано... Про Форт, а не про мост...
Доказывается элементарно. Forth - простейший способ написать проблемно-ориентированный язык. Ели на одном Forth (1) надстроен другой Forth (2). То либо (1) не Forth, либо (2) не простейший.
В переводе на русский: что есть целевая компиляция? Это сборка чего-то нового из фрагментов двух типов: разработанных заново и копируемых из родителя. Так вот, вторые собираемому Forth противопоказаны. Если их много, то целевая компиляция бессмысленна (Если только речь не идет об обрезании полной системы до решателя частной проблемы. Впрочем, здесь их тоже необходимо минимизировать, так что принцип работает).

Автор:  Гость [ Чт мар 22, 2012 21:55 ]
Заголовок сообщения:  Re: Форт и форт-процессор

WingLion писал(а):
Сижу и думаю, как же этот узел разрубить?..

Следить и не допускать переполнение стеков или наращиваить их глубину.
Ещё вариант перегруппировывать вычисления на стеке на небольшую глубину.

P.S. Общие рекомендации.

Автор:  вопрос [ Чт мар 22, 2012 22:03 ]
Заголовок сообщения:  Re: Форт и форт-процессор

WingLion писал(а):
На что спорим, что я его сделаю?

А в чём конкретно проблема?
Т.е. из кода непонятно, чем проблематична ситуация
Слишком медленно? Форт на форте избыточно сложен?
Некрасиво делать элементарную операцию из 10 других элементарных операций?

Ведь где-то было автоматический анализ глубины стека (параллельно) и свопинг-подгрузка без потери скорости / без программных усилий?

Автор:  вопрос [ Чт мар 22, 2012 22:20 ]
Заголовок сообщения:  Re: Форт и форт-процессор

Кстати, возможно, очень хорошо ложится на "редуцированный форт" - на трёхместные-программируемые операции

Рассмотрим...
Пусть у нас процессорно есть трехместная комманда перемещения-арифметики
одна-единственная редуцированная из А, В и С
А. взять по адресу 1
В. произвести операцию с адресом 2 (или NOOP - тогда без второго адреса)
С. положить по адресу 3
при этом, какую операцию производить в п. В. - решает некий флаг

DUP при этом будет выглядеть так
добавим переменную TEMP
1. А. взять указатель стека В. NOOP С. положить в TEMP
2. А. взять указатель стека В. увеличить на 1 (флаг?) С. положить обратно
3. А. взять по адресу TEMP В. разыменовать (тоже операция) С. положить по адресу указателя стека
DUP состоит из 3 редуцированных операций, каждая как бы из 3 частей, но все 3 части можно реализовать в железе (это экономно - напомним - эта трехчастная операция нужна всего одна)
и всё остальное так же, TEMP можно реализовать даже в железе ( ro2 показывает, что достаточно 2 таких переменных), но можно и в памяти

Автор:  Hishnik [ Чт мар 22, 2012 23:05 ]
Заголовок сообщения:  Re: Форт и форт-процессор

WingLion писал(а):
Внутренний и внешний...
Внутренний - это по сути ассемблер для форт-процессора, а внешний - это тот Форт, который видится программисту.

Речь о модели форт-процессора на PC-Форте, или о кросс-компиляции? Кросс-компиляцию удобно сделать в другом словаре.
gudleifr писал(а):
А для кого я писал, что Forth на Forth не реализуется?

"А мужики-то не знают"... :)

Автор:  WingLion [ Пт мар 23, 2012 05:06 ]
Заголовок сообщения:  Re: Форт и форт-процессор

Хищник писал(а):
Речь о модели форт-процессора на PC-Форте, или о кросс-компиляции?


Речь о Форте на встроенном процессоре, который на нем же и будет работать.
Чтобы потом на нем программы для прибора писать.
Не для галочки, а для реальной работы с прибором в живую.

Пишется он, разумеется, в кросс-компиляторе на PC. В качестве кросс-компилятора использую TASM с подключенным файлом макросов для форт-команд процессора.

Автор:  WingLion [ Пт мар 23, 2012 05:23 ]
Заголовок сообщения:  Re: Форт и форт-процессор

вопрос писал(а):
Некрасиво делать элементарную операцию из 10 других элементарных операций?


Больше всего смущает именно это.

вопрос писал(а):
Ведь где-то было автоматический анализ глубины стека (параллельно) и свопинг-подгрузка без потери скорости / без программных усилий?


Это следующий шаг для форт-процессора, а пока он "маленький и нестрашный" (с)...

вопрос писал(а):
Кстати, возможно, очень хорошо ложится на "редуцированный форт"


Возможно. Если я правильно понял:

А@ B@ OPERATION C! \ взять две переменные провести операцию, сохранить в третьей.

DP@+ DP@+ ADD DP-! \ взять два элемента верхнего стека, сложить положить обратно в верхний стек

При этом, надо иметь в прямой досягаемости несколько локальных регистров в процессоре - это собирался делать в ближайшее время.

Автор:  Mihail [ Пт мар 23, 2012 10:59 ]
Заголовок сообщения:  Re: Форт и форт-процессор

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

Если не ошибаюсь, я понял проблему так: существует 2а стека - один быстрый но маленький, другой большой но медленный.
Хочется их объединить в один большой и быстрый.
Я предлагаю сделать быстрый стек в виде циклического буфера. Если размер буфера есть степень двойки,
то указать, разрядность которого, равна этой степени - автоматом становится циклическим.
Один указатель для работы с вершиной стека. Другой, указывает на дно этого фрейма стека для обмена
данными с вершиной большого стека. Для быстродействия, между ними понадобится еще один указатель,
которой разделит сохраненную и несохраненную на большом стеке области.

Автор:  chess [ Пт мар 23, 2012 13:01 ]
Заголовок сообщения:  Re: Форт и форт-процессор

WingLion писал(а):
Конечно, на нижнем уровне все ок. И все быстро, но на верхнем получается бяда!..

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

Автор:  WingLion [ Пт мар 23, 2012 17:57 ]
Заголовок сообщения:  Re: Форт и форт-процессор

Mihail писал(а):
Я предлагаю сделать быстрый стек в виде циклического буфера.


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

Более того, можно сказать, смешно, но в многоядерном варианте и с внутренней памятью проблема сама собой разрешается... ибо для процессора внутренняя память оказывается виртуально однотактовой. Мало ее, вот проблема!..

А с форт-процессором, как я понял, сия проблема разрешается, если он одиночный. Для одного, имеющихся в той же EP3C40 128 килобайт памяти уже вполне достаточно для приличных вещей.
В случае же нескольких ядер, как у меня, каждое ядро никак не получит столько памяти... Разве что во внешнюю SD-RAM свопить, но тогда весь цимес от многоядерности пропадает...

Посему и поднял сей топик... Выкручиваться надо иначе как-то... на том, что имею, не стараясь наворачивать железо, запутывая все окончательно...

Страница 1 из 4 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/