Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пн окт 14, 2019 22:37

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 88 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Ср июл 26, 2006 00:40 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6800
Благодарил (а): 16 раз.
Поблагодарили: 110 раз.
oleg писал(а):
Во-первых, у меня есть подозрение, что стек до упора заполнен быть не должен, вероятно это стоило бы предусмотреть. можно написать слово nop и его вызывать.


Формально - вполне может. Иначе зачем бы мы ему выделяли NNN ячеек? То есть такая реализация, конечно, "не смертельна", но некрасива.

oleg писал(а):
Да и не идет речь об очень мощьном процессоре и тот же ret ну будет он выполняться за 6 тактов, а не за два?


Форт как раз очень интенсивно использует пары call/ret. Хороший форт-процессор должен делать все это быстро.


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

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
oleg писал(а):
Ладно. Надо прикинуть, как это в железо будет ложиться. Тогда может набор изменится Cool

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

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4997
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 19 раз.
Поблагодарили: 58 раз.
Хищник писал(а):
oleg писал(а):
Да и не идет речь об очень мощьном процессоре и тот же ret ну будет он выполняться за 6 тактов, а не за два?


Форт как раз очень интенсивно использует пары call/ret. Хороший форт-процессор должен делать все это быстро.


Ну хорошо! Уговорил 8) пусть будет ret.
Остается одна свободная команда - swap ? тогда nop = swap swap и глубину стека на затрагиваем!

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


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6800
Благодарил (а): 16 раз.
Поблагодарили: 110 раз.
oleg писал(а):
Остается одна свободная команда - swap ? тогда nop = swap swap и глубину стека на затрагиваем!


За исключением того, что перед вызовом swap на стеке должны лежать ДВА числа! :))


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 27, 2006 02:04 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4997
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 19 раз.
Поблагодарили: 58 раз.
Хищник писал(а):
За исключением того, что перед вызовом swap на стеке должны лежать ДВА числа!


Да. Не подумал. Хотя обычно два верхних числа должны находится в регистрах, а значит ничего страшного не произойдет - просто ничего поменяестя ни с чем. Ну или остается вариант с dup drop - который тоже плохо работает, если стек переполнен 8)
Вобщем в любом случае nop не самая часто используемая команда.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 27, 2006 03:17 
Не в сети

Зарегистрирован: Сб май 13, 2006 23:37
Сообщения: 339
Благодарил (а): 1 раз.
Поблагодарили: 9 раз.
oleg писал(а):
Остается одна свободная команда - swap ? тогда nop = swap swap и глубину стека на затрагиваем!


swap swap = nop nop


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 27, 2006 08:17 
Не в сети
Administrator
Administrator
Аватара пользователя

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

Вот так:

Код:
    out (port1), data1
    nop
    out (port2), data2
    nop

что в предложенном наборе должно выглядеть так:

Код:
    lit data2 lit port2 lit data1 lit port1
    store nop store nop

// store - это ! ?

Вот, и тут уже придется извращаться непонятно как, чтобы nop заменить:
Код:
  ( data's ,условие -- data''s , если условие (не)выполнено, иначе data's )
  if
  operation // условная операция
  nop
adr: // место для перехода по if

И это все при условии, что частенько нужно выравнивание на слово в потоке 4-хбитных команд.

Так что, nop - нужен, если мы не хотим сами себе грабли подкладывать.

и and заменить на nand для полноты стоит все же, имхо:

Код:
0- nop
1- call
2- if
3- lit
4- >R
5- R>
6- ret
7- dup
8- drop
9- over
A- add
B- nand
C- xor
D- shift
E- fetch
F- store

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 27, 2006 08:46 
Не в сети
Administrator
Administrator
Аватара пользователя

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

over >R >R drop R> R> длинновато будет...

Вот, думаю, может, арифметику префиксом сделать?

типа команда:
pre: arithmetic code
Хотя оно и не по-фортовому, но можно прямо 16 команд арифметики/ логики сделать, тогда и swap можно добавить в набор:

Код:
0- nop
1- call
2- if
3- lit
4- >R
5- R>
6- ret
7- dup
8- drop
9- over
A- swap
B- pre:
C- user:
D- sys:
E- fetch
F- store


тут еще префиксы user: и sys: изображены для пользовательских и системных команд.
Их можно, например, подобно int xxx определить.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 27, 2006 19:10 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6800
Благодарил (а): 16 раз.
Поблагодарили: 110 раз.
oleg писал(а):
Хотя обычно два верхних числа должны находится в регистрах, а значит ничего страшного не произойдет - просто ничего поменяестя ни с чем.


Вобщем-то на такой случай хорошо работают аппаратные исключения по исчерпанию. Мало ли что ничего меняется ни с чем. Если мы отменяем проверку по исчерпанию, чтобы иметь возможность делать swap swap, мы не поймаем ошибочные исчерпания, допущенные по невнимательности. А оно помогает.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 27, 2006 23:24 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4997
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 19 раз.
Поблагодарили: 58 раз.
8)
WingLion писал(а):
// store - это ! ?

store == ! ( n addr --> )
fetch == @ ( addr --> n )



WingLion писал(а):
А теперь попытаемся что-нибудь этакое сделать с железкой,
где нужны тонкие задержки.

Вот так:

Код:
out (port1), data1
nop
out (port2), data2
nop

что в предложенном наборе должно выглядеть так:

Код:
lit data2 lit port2 lit data1 lit port1
store nop store nop

Так, во-первых никаких портов нет. Есть только работа с памятью.
Во-вторых, сколько тактов будет занимать выполнение команды? Насколько точно нужно формировать задержки? При условии, что все команды выполняются за два такта ( вроде как обычно для стековой архитектуры)? Не знаю. Можно ret заменить на nop 8)


WingLion писал(а):
Вот, и тут уже придется извращаться непонятно как, чтобы nop заменить:
Код:
( data's ,условие -- data''s , если условие (не)выполнено, иначе data's )
if
operation // условная операция
nop
adr: // место для перехода по if

И это все при условии, что частенько нужно выравнивание на слово в потоке 4-хбитных команд.

Так что, nop - нужен, если мы не хотим сами себе грабли подкладывать.

Насчет выравнивания на слово? я думаю можно обойтись и без него за исключением выравнивания адресов процедур и переходов на границу байта. Впрочем это то, что ты написал :) в примере.
WingLion писал(а):
и and заменить на nand для полноты стоит все же, имхо:

???

WingLion писал(а):
чистый swap все же нужен, а то:

over >R >R drop R> R> длинновато будет...

Вот, думаю, может, арифметику префиксом сделать?

По-моему не стоит.
swap в принципе можно прооптимизировать:
over do_something drop

WingLion писал(а):
типа команда:
pre: arithmetic code
Хотя оно и не по-фортовому, но можно прямо 16 команд арифметики/ логики сделать, тогда и swap можно добавить в набор:

Код:
0- nop
1- call
2- if
3- lit
4- >R
5- R>
6- ret
7- dup
8- drop
9- over
A- swap
B- pre:
C- user:
D- sys:
E- fetch
F- store


тут еще префиксы user: и sys: изображены для пользовательских и системных команд.
Их можно, например, подобно int xxx определить.

сложнее получается. И набор команд уже не влазит в 4 бита 8)

Хищник писал(а):
oleg писал(а):
Хотя обычно два верхних числа должны находится в регистрах, а значит ничего страшного не произойдет - просто ничего поменяестя ни с чем.

Вобщем-то на такой случай хорошо работают аппаратные исключения по исчерпанию. Мало ли что ничего меняется ни с чем. Если мы отменяем проверку по исчерпанию, чтобы иметь возможность делать swap swap, мы не поймаем ошибочные исчерпания, допущенные по невнимательности. А оно помогает.

Ок. Я согласен. Пусть будет nop! вместо ret == r> dup If кстати r> будет единственной командой, способной снять данные с вершины стека возвратов.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 27, 2006 23:50 
Не в сети
Administrator
Administrator
Аватара пользователя

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

Когда нет прямых портов, они делаются отмапленными в память. Так что, работа с памятью в данном случае и есть работа с такими портами.

oleg писал(а):
По-моему не стоит.
swap в принципе можно прооптимизировать:
over do_something drop

А как же реализация стандартных слов Форта?
И использование старых наработок, где swap-ы напрямую используются?


oleg писал(а):
сложнее получается. И набор команд уже не влазит в 4 бита Cool

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

oleg писал(а):
Пусть будет nop! вместо ret

Вот только не вместо ret!
Лучше что-нибудь другое заменить длинной цепочкой команд, чем ret.
Это ж какие тормоза будут, если ret вместо 0 тактов будет исполняться целых 3!?
Кстати, pre op - это тот же двухкомандный макрос, только сделанный в железе, и выполняющийся быстрее

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


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

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

Просто порты-вв это придумка интеля, которая предполагает наличие еще одного адресного пространства.

WingLion писал(а):
oleg писал(а):
По-моему не стоит.
swap в принципе можно прооптимизировать:
over do_something drop

А как же реализация стандартных слов Форта?
И использование старых наработок, где swap-ы напрямую используются?

все верно. Но выкинуть нечего 8( А добавлять можно много чего. swap можно реализовать через
over >r >r drop r> r> а можно и прооптимизировать:
swap - == over - >r drop r> тоже не красиво, но жить можно.

насчет выделения префикса для работы с арифметикой идея вроде как логична. Но алу в таком случае становится как-бы внешним устройством 8) по отношению к процессору.
WingLion писал(а):
oleg писал(а):
сложнее получается. И набор команд уже не влазит в 4 бита Cool

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

да как сказать :) очень хочется, по крайней мере посмотреть, что получится, так как 5 бит на команду уже есть 8)
WingLion писал(а):
oleg писал(а):
Пусть будет nop! вместо ret

Вот только не вместо ret!
Лучше что-нибудь другое заменить длинной цепочкой команд, чем ret.
Это ж какие тормоза будут, если ret вместо 0 тактов будет исполняться целых 3!?

а почему 0? в любом случае нужно перенести адрес со стека возвратов в IP. Откуда берется 0? если речи не шло ни о каких оптимизациях?

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


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

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
oleg писал(а):
а почему 0? в любом случае нужно перенести адрес со стека возвратов в IP. Откуда берется 0? если речи не шло ни о каких оптимизациях?


Если иметь дело с железом, то в нем команды попадают на исполнительное устройство потоком, а значит следующую команду можно видеть раньше, чем она исполняется, а значит, если обнаружится, что это ret, ее можно исполнить вместе с предыдущей (разумеется, только если она не манипулирует стеком возвратов или еще какой изврат не делает).

oleg писал(а):
да как сказать Smile очень хочется, по крайней мере посмотреть, что получится, так как 5 бит на команду уже есть Cool


Кстати, испытать это дело совсем не сложно. На том же форте можно легко написать "полубайт-интерпретатор" :)
На быстродействие забить, поставив целью испытание: "можно ли вообще на таком наборе что-то делать?"

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт июл 28, 2006 04:10 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4997
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 19 раз.
Поблагодарили: 58 раз.
WingLion писал(а):
oleg писал(а):
а почему 0? в любом случае нужно перенести адрес со стека возвратов в IP. Откуда берется 0? если речи не шло ни о каких оптимизациях?


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

Ну да prefetch. но это уже усложнения.
WingLion писал(а):
что это ret, ее можно исполнить вместе с предыдущей (разумеется, только если она не манипулирует стеком возвратов или еще какой изврат не делает).

Как минимум - выкидывает верхнее значение со стека возвратов в ip.

WingLion писал(а):
Кстати, испытать это дело совсем не сложно. На том же форте можно легко написать "полубайт-интерпретатор"
На быстродействие забить, поставив целью испытание: "можно ли вообще на таком наборе что-то делать?"

Набор не самый удобный, но для работы достаточный.
А вот в какой обьем он влезет в плисе интересно8)

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт июл 28, 2006 04:23 
Не в сети
Administrator
Administrator
Аватара пользователя

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

В зависимости от разрядности данных, думаю, от 500 до 1000 LCELL

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


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

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


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

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


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

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