Forth http://fforum.winglion.ru/ |
|
Минимальный набор слов Форта http://fforum.winglion.ru/viewtopic.php?f=9&t=100 |
Страница 5 из 9 |
Автор: | Hishnik [ Ср июл 26, 2006 00:40 ] |
Заголовок сообщения: | |
oleg писал(а): Во-первых, у меня есть подозрение, что стек до упора заполнен быть не должен, вероятно это стоило бы предусмотреть. можно написать слово nop и его вызывать. Формально - вполне может. Иначе зачем бы мы ему выделяли NNN ячеек? То есть такая реализация, конечно, "не смертельна", но некрасива. oleg писал(а): Да и не идет речь об очень мощьном процессоре и тот же ret ну будет он выполняться за 6 тактов, а не за два?
Форт как раз очень интенсивно использует пары call/ret. Хороший форт-процессор должен делать все это быстро. |
Автор: | WingLion [ Ср июл 26, 2006 00:43 ] |
Заголовок сообщения: | |
oleg писал(а): Ладно. Надо прикинуть, как это в железо будет ложиться. Тогда может набор изменится Cool
Вот от железа и надо плясать начинать Для начала сделать не весь проц, а исполнительное устройство, которое выполняет 16 команд, подаваемых ему потоком на вход. (Откуда они будут браться - потом можно решить.) |
Автор: | mOleg [ Ср июл 26, 2006 00:44 ] |
Заголовок сообщения: | |
Хищник писал(а): oleg писал(а):
Да и не идет речь об очень мощьном процессоре и тот же ret ну будет он выполняться за 6 тактов, а не за два? Форт как раз очень интенсивно использует пары call/ret. Хороший форт-процессор должен делать все это быстро. Ну хорошо! Уговорил пусть будет ret. Остается одна свободная команда - swap ? тогда nop = swap swap и глубину стека на затрагиваем! |
Автор: | Hishnik [ Ср июл 26, 2006 00:47 ] |
Заголовок сообщения: | |
oleg писал(а): Остается одна свободная команда - swap ? тогда nop = swap swap и глубину стека на затрагиваем!
За исключением того, что перед вызовом swap на стеке должны лежать ДВА числа! |
Автор: | mOleg [ Чт июл 27, 2006 02:04 ] |
Заголовок сообщения: | |
Хищник писал(а): За исключением того, что перед вызовом swap на стеке должны лежать ДВА числа!
Да. Не подумал. Хотя обычно два верхних числа должны находится в регистрах, а значит ничего страшного не произойдет - просто ничего поменяестя ни с чем. Ну или остается вариант с dup drop - который тоже плохо работает, если стек переполнен Вобщем в любом случае nop не самая часто используемая команда. |
Автор: | forther [ Чт июл 27, 2006 03:17 ] |
Заголовок сообщения: | |
oleg писал(а): Остается одна свободная команда - swap ? тогда nop = swap swap и глубину стека на затрагиваем!
swap swap = nop nop |
Автор: | WingLion [ Чт июл 27, 2006 08:17 ] |
Заголовок сообщения: | |
А теперь попытаемся что-нибудь этакое сделать с железкой, где нужны тонкие задержки. Вот так: Код: 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 [ Чт июл 27, 2006 08:46 ] |
Заголовок сообщения: | |
чистый 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 определить. |
Автор: | Hishnik [ Чт июл 27, 2006 19:10 ] |
Заголовок сообщения: | |
oleg писал(а): Хотя обычно два верхних числа должны находится в регистрах, а значит ничего страшного не произойдет - просто ничего поменяестя ни с чем.
Вобщем-то на такой случай хорошо работают аппаратные исключения по исчерпанию. Мало ли что ничего меняется ни с чем. Если мы отменяем проверку по исчерпанию, чтобы иметь возможность делать swap swap, мы не поймаем ошибочные исчерпания, допущенные по невнимательности. А оно помогает. |
Автор: | mOleg [ Чт июл 27, 2006 23:24 ] |
Заголовок сообщения: | |
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 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 бита Хищник писал(а): oleg писал(а):
Хотя обычно два верхних числа должны находится в регистрах, а значит ничего страшного не произойдет - просто ничего поменяестя ни с чем. Вобщем-то на такой случай хорошо работают аппаратные исключения по исчерпанию. Мало ли что ничего меняется ни с чем. Если мы отменяем проверку по исчерпанию, чтобы иметь возможность делать swap swap, мы не поймаем ошибочные исчерпания, допущенные по невнимательности. А оно помогает. Ок. Я согласен. Пусть будет nop! вместо ret == r> dup If кстати r> будет единственной командой, способной снять данные с вершины стека возвратов. |
Автор: | WingLion [ Чт июл 27, 2006 23:50 ] |
Заголовок сообщения: | |
oleg писал(а): Так, во-первых никаких портов нет. Есть только работа с памятью. Во-вторых, сколько тактов будет занимать выполнение команды? Когда нет прямых портов, они делаются отмапленными в память. Так что, работа с памятью в данном случае и есть работа с такими портами. oleg писал(а): По-моему не стоит. swap в принципе можно прооптимизировать: over do_something drop А как же реализация стандартных слов Форта? И использование старых наработок, где swap-ы напрямую используются? oleg писал(а): сложнее получается. И набор команд уже не влазит в 4 бита Cool Имхо, не сложнее, чем затем операции выписывать макросами по 3-4 (а то и больше!) команды... В конце концов, 4 бита на команду - это не самоцель... oleg писал(а): Пусть будет nop! вместо ret
Вот только не вместо ret! Лучше что-нибудь другое заменить длинной цепочкой команд, чем ret. Это ж какие тормоза будут, если ret вместо 0 тактов будет исполняться целых 3!? Кстати, pre op - это тот же двухкомандный макрос, только сделанный в железе, и выполняющийся быстрее |
Автор: | mOleg [ Пт июл 28, 2006 00:07 ] |
Заголовок сообщения: | |
WingLion писал(а): Когда нет прямых портов, они делаются отмапленными в память. Так что, работа с памятью в данном случае и есть работа с такими портами. Просто порты-вв это придумка интеля, которая предполагает наличие еще одного адресного пространства. WingLion писал(а): oleg писал(а): По-моему не стоит. swap в принципе можно прооптимизировать: over do_something drop А как же реализация стандартных слов Форта? И использование старых наработок, где swap-ы напрямую используются? все верно. Но выкинуть нечего 8( А добавлять можно много чего. swap можно реализовать через over >r >r drop r> r> а можно и прооптимизировать: swap - == over - >r drop r> тоже не красиво, но жить можно. насчет выделения префикса для работы с арифметикой идея вроде как логична. Но алу в таком случае становится как-бы внешним устройством по отношению к процессору. WingLion писал(а): oleg писал(а): сложнее получается. И набор команд уже не влазит в 4 бита Cool Имхо, не сложнее, чем затем операции выписывать макросами по 3-4 (а то и больше!) команды... В конце концов, 4 бита на команду - это не самоцель... да как сказать очень хочется, по крайней мере посмотреть, что получится, так как 5 бит на команду уже есть WingLion писал(а): oleg писал(а):
Пусть будет nop! вместо ret Вот только не вместо ret! Лучше что-нибудь другое заменить длинной цепочкой команд, чем ret. Это ж какие тормоза будут, если ret вместо 0 тактов будет исполняться целых 3!? а почему 0? в любом случае нужно перенести адрес со стека возвратов в IP. Откуда берется 0? если речи не шло ни о каких оптимизациях? |
Автор: | WingLion [ Пт июл 28, 2006 01:17 ] |
Заголовок сообщения: | |
oleg писал(а): а почему 0? в любом случае нужно перенести адрес со стека возвратов в IP. Откуда берется 0? если речи не шло ни о каких оптимизациях? Если иметь дело с железом, то в нем команды попадают на исполнительное устройство потоком, а значит следующую команду можно видеть раньше, чем она исполняется, а значит, если обнаружится, что это ret, ее можно исполнить вместе с предыдущей (разумеется, только если она не манипулирует стеком возвратов или еще какой изврат не делает). oleg писал(а): да как сказать Smile очень хочется, по крайней мере посмотреть, что получится, так как 5 бит на команду уже есть Cool
Кстати, испытать это дело совсем не сложно. На том же форте можно легко написать "полубайт-интерпретатор" На быстродействие забить, поставив целью испытание: "можно ли вообще на таком наборе что-то делать?" |
Автор: | mOleg [ Пт июл 28, 2006 04:10 ] |
Заголовок сообщения: | |
WingLion писал(а): oleg писал(а): а почему 0? в любом случае нужно перенести адрес со стека возвратов в IP. Откуда берется 0? если речи не шло ни о каких оптимизациях? Если иметь дело с железом, то в нем команды попадают на исполнительное устройство потоком, а значит следующую команду можно видеть раньше, чем она исполняется, а значит, если обнаружится, Ну да prefetch. но это уже усложнения. WingLion писал(а): что это ret, ее можно исполнить вместе с предыдущей (разумеется, только если она не манипулирует стеком возвратов или еще какой изврат не делает). Как минимум - выкидывает верхнее значение со стека возвратов в ip. WingLion писал(а): Кстати, испытать это дело совсем не сложно. На том же форте можно легко написать "полубайт-интерпретатор"
На быстродействие забить, поставив целью испытание: "можно ли вообще на таком наборе что-то делать?" Набор не самый удобный, но для работы достаточный. А вот в какой обьем он влезет в плисе интересно8) |
Автор: | WingLion [ Пт июл 28, 2006 04:23 ] |
Заголовок сообщения: | |
oleg писал(а): Набор не самый удобный, но для работы достаточный.
А вот в какой обьем он влезет в плисе интересноCool В зависимости от разрядности данных, думаю, от 500 до 1000 LCELL |
Страница 5 из 9 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |