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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 175 ]  На страницу Пред.  1 ... 8, 9, 10, 11, 12  След.
Автор Сообщение
 Заголовок сообщения: Re: Форт-транслятор в Ассемблер
СообщениеДобавлено: Сб дек 13, 2014 15:32 
Ethereal писал(а):
...
Во-во, 60 строк сюда, 60 - туда (на EMIT, например)... Причем их надо обдумывать для всякого железа. А сам оставшийся FORTH: WORD FIND NUMBER ENTRY , . OK ERROR EXECUTE EXIT - и все.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Форт-транслятор в Ассемблер
СообщениеДобавлено: Сб дек 13, 2014 16:05 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Какие-то неверные оценки на порядок. EMIT - это 9 строчек, а не 60. EMIT по готовности, а не по прерываниям и это вполне естественно.
Код:
EMIT:      mov   r15,   r14      // EMIT      CORE
      ldw   r14,   (r0)
      addi   r0,   4
_EMIT:      lrw   r13,   [SCICR]
__EMIT:      ldb   r12,   (r13, 7)
      btsti   r12,   7
      bf   __EMIT
      stb   r15,   (r13, 0xB)
      NEXT

А вот та часть Форта, что написана на Форте и скармливается ассемблерной состоит из гораздо большего количества слов HEX IMMEDIATE \ PAD */ C, CREATE ' COMPILE, [COMPILE] 0 -1 CHARS CHAR+ CHAR [CHAR] ['] >MARK <MARK <RESOLVE >RESOLVE AHEAD AGAIN IF THEN ELSE BEGIN UNTIL WHILE REPEAT DO LOOP +LOOP I ?DO FOR NEXT CASE ENDCASE OF <=OF< ENDOF N>LINK NAME> >NAME HOLD SIGN <# # #> #S U>D D>S D. . U. (") ", C" REFILL S" ." MOVE SOURCE POSTPONE RECURSE (;CODE) DOES> ABORT" VARIABLE ( D.R .R U.R .( VALUE QUAN CONSTANT TO AT FROM :NONAME VOCABULARY EVALUATE 2VARIABLE 2CONSTANT M+ .S ID. NLIST WORDS SLITERAL /STRING VECT SWITCH -- ORDER [ELSE] [IF] [THEN] U.0 DUMP FENCE FORGET UNUSED плюс я выкинул, хотя поначалу были SPAN CONVERT ? и совсем забыл про MARKER Причем я запихал в ассемблер ВСЕ, что существенно влияет на быстродействие. Сюда можно было натащить из ассемблерной части еще слов. Да и еще. Половина же слов, что в ассемблерной части написана шитым кодом, а не ассемблером. А это по сути тот-же Форт, только вместо DUP DROP пишем
.long DUP, DROP
gudleifr писал(а):
Причем их надо обдумывать для всякого железа.
А что с этим какая-то проблема ? Проверил бит готовности, запихал байт в регистр данных. Какое тут обдумывание ? Собственно работа программиста и состоит в обдумывании.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Форт-транслятор в Ассемблер
СообщениеДобавлено: Сб дек 13, 2014 16:25 
Ethereal писал(а):
А вот та часть Форта, что написана на Форте и скармливается ассемблерной состоит из гораздо большего количества слов
Мы, как бы, обсуждали именно ассемблерную часть. То, что написано на FORTH, уже по большей части переносимо само по себе.
gudleifr писал(а):
Собственно работа программиста и состоит в обдумывании.
Именно. А ядро FORTH уже обдумывать не надо. Поэтому не стоит на нем концентрироваться. Если одно ядро FORTH отличается от другого - то по вине ОС (ее отсутствия), или требования задачи, написанной на FORTH. Требования самого FORTH тривиальны.

P.S. У меня в Win32-FOBOS ядро (до слов INTERPRET и Цикла Управления) - 1000 строк с копейками.
На макросы - 100 строк, на шитые слова - тоже 100, остальное - таблицы и кодовые слова (причем, с жутким избытком, в новой версии уйдет больше половины).
Из них - на интерфейс с OS - нужные вызовы API (в т.ч. диагностический вывод), работа с командной строкой, общий интерфейс с API - 150 строк.
Самый монстрообразный (потому что на все случаи жизни, в новой версии упрощен) кусок в 150 строк - NUMBER (в. т.ч. конечный автомат, который используется и в других местах - 30 строк).

P.P.S. Вообще, же мы с Вами говорим об одном и том же. Если в чем и есть разночтение, так это в моем стремлении добавить в обсуждение некоторую обобщенность, вывести FORTH из его ниши "среды-затычки" в "большое программирование".


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Форт-транслятор в Ассемблер
СообщениеДобавлено: Вс дек 14, 2014 16:56 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
gudleifr писал(а):
FORTH не может быть оптимизирован для систем с малым количеством памяти.
А мне кажется - может! ;)
Но интересна ваша точка зрения - почему не может?
- ограничения языка
- ограничения реализации

gudleifr писал(а):
Вы путаете: не проблемно-ориентированный FORTH, а проблемно-ориентированный, написанный на FORTH.
Не путаю, имелось ввиду как раз проблемно-ориентированный язык, написанный на FORTH.

_________________
With best wishes, in4.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Форт-транслятор в Ассемблер
СообщениеДобавлено: Вс дек 14, 2014 18:04 
in4 писал(а):
Но интересна ваша точка зрения - почему не может?


1. Слишком большая фрагментация. Рассмотрим, например, арифметическое выражение. На языке ассеблера - по коду на операцию (после оптимизации на C - тоже). В FORTH - один код (плюс NEXT, плюс, часто, операция выравнивание стека) на каждую операцию, плюс по адресу на каждое вхождение. С условными выражениями - хуже, каждая проверка требует двух JMP - в формировании условия и в IF, плюс операции со стеком. В случае нетривиальных кусков все еще хуже:
Например, реализация WORD на языке ассемблера (моя):
Код:
   Header 4, 'WORD', @WORD   ; c -- ca
   push esi
   push edi
   mov al, bl
   mov edi, hMem      ; ПОЗИЦИОНИРОВАНИЕ
   mov ecx, [edi - 4]
   add edi, @3EIN@
   sub ecx, @3EIN@      ; ИСЧЕРПАНИЕ?
   jg @F      
   sub ecx, ecx
   jmp lWORD9
@@:   cmp al, 20h      ; РАЗДЕЛИТЕЛЬ - ПРОБЕЛ?
   jnz lWORD5
@@:   cmp [edi], al      ; НАЧАЛО СЛОВА?
   ja @F
   inc edi         ; СПЕЦСИМВОЛЫ ПЕРЕД СЛОВОМ
   dec ecx
   jnz @B
   mov esi, edi      ; СЛОВО ТАК И НЕ НАЧАЛОСЬ
   mov ecx, edi
   jmp lWORD8
@@:   mov esi, edi      ; НАЧАЛО СЛОВА
@@:   cmp [edi], al      ; КОНЕЦ СЛОВА?
   jbe @F
   inc edi
   dec ecx
   jnz @B
   mov ecx, edi      ; СЛОВО ДО ИСЧЕРПАНИЯ
   jmp lWORD8
@@:   mov ecx, edi      ; СЛОВО КОНЧИЛОСЬ
   INC EDI
   jmp lWORD8
lWORD5:   mov esi, edi      ; НАЧАЛО СЛОВА (БЕЗ ПРОПУСКА ПРОБЕЛОВ)
   repnz scasb
   mov ecx, edi
   jnz lWORD8
   dec ecx         ; ДЛИНА ОСТАТКА
lWORD8:   sub edi, hMem      ; НОВАЯ ПОЗИЦИЯ
   mov @3EIN@, edi
   sub ecx, esi
   cmp ecx, 255
   jbe lWORD9
   mov ecx, 255      ; ОБРЕЗАНИЕ ДЛИННОГО СЛОВА
lWORD9: pop edi         ; ПЕРЕНОС СЛОВА
   mov [edi], cl
   push edi
   inc edi
   rep movsb
   sub al, al
   stosb
   pop edi
   pop esi
   mov ebx, edi
   Next

А вот, оно прошито "по Баранову и Ноздрунову":
Код:
: WORD ( C->T ) BLK @ IF BLK @ BLOCK ELSE TIB THEN
     >IN @ + SWAP ENCLOSE >IN +!
     HERE >R OVER - >R + ALIGNH HERE 1+ R@ CMOVE
     HERE R> 1+ ALLOT ALIGNH HERE OVER - 2- OVER C! R> DP! ;

Видно, что все прошитость касается только работы с переменными - указателями потока, а всю работу делает кодовое ENCLOSE.
Разбить WORD на более мелкие кирпичи, конечно можно, но ценой лишних операций и создания слов, которые никому более не будут нужны.

2. В случае наличия в системе полной FORTH-системы, очевидно будет присутствовать код, который никогда никому не понадобится. Но может понадобиться в дальнейшем - некоторые части интерпретатора (например, я для полноты в первую версию Win32-FOBOS научил NUMBER распознавать вещественные числа) и многие стандартные слова.

3. Как ни крутись, стека часто не хватает и приходится вставлять операции по его перетасовке. Стремление многих современных фортеров писать на FORTH в C-стиле проблему усугубляет.

4. Самое главное. Само языкотворческое назначение FORTH требует создания удобного, а не "оптимизированного по памяти" проблемно-ориентированного языка.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Форт-транслятор в Ассемблер
СообщениеДобавлено: Пт дек 19, 2014 15:53 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
gudleifr писал(а):
Разбить WORD на более мелкие кирпичи, конечно можно, но ценой лишних операций и создания слов, которые никому более не будут нужны.
Стандарт ANSI-Forth именно такое разбиение по сути предписывает. Стандартное слово WORD должно строиться на основе более мелкого кирпича - стандартного слова PARSE , а иначе зачем это PARSE введено в стандарт ?

Слово WORD с двумя кирпичами и именно-что "прошитое"
(идея расколоть WORD на SKIP и PARSE благополучно позаимствована у Андрея Черезова) :
Код:
: SKIP ( char "<chars>ccc" -- )
  BEGIN
    >IN @ #TIB @ U<
    WHILE
      TIB >IN @ + C@ OVER =
  WHILE
      >IN 1+!
  REPEAT
    THEN
  DROP
;

\ Выделить ccc, ограниченное символом char.
\ c-addr - адрес (внутри входного буфера), и u - длина выделенной строки.
\ Если разбираемая область была пуста, результирующая строка имеет нулевую
\ длину.
: PARSE ( char "ccc<char>" -- c-addr u )
  >R >IN @ TIB OVER + SWAP
  BEGIN
    >IN @ #TIB @ U<
    WHILE
      >IN @ >IN 1+! TIB + C@ R@ =
  UNTIL
      1+
    THEN
    RDROP >IN @ - NEGATE
;

\ Пропустить ведущие разделители. Выбрать символы, ограниченные
\ разделителем char.
\ Исключительная ситуация возникает, если длина извлеченной строки
\ больше максимальной длины строки со счетчиком.
\ c-addr - адрес переменной области, содержащей извлеченное слово
\ в виде строки со счетчиком.
\ Если разбираемая область пуста или содержит только разделители,
\ результирующая строка имеет нулевую длину.
\ В конец строки помещается пробел, не включаемый в длину строки.
\ Программа может изменять символы в строке.
: WORD ( char "<chars>ccc<char>" -- c-addr )
  DUP SKIP PARSE [ HEX 1F DECIMAL ] LITERAL UMIN
  NP @ OVER 3 OR 1+ - DUP >R 2DUP C! CHAR+ SWAP CMOVE R>
;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Форт-транслятор в Ассемблер
СообщениеДобавлено: Пт дек 19, 2014 16:26 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
gudleifr писал(а):
in4 писал(а):
С условными выражениями - хуже, каждая проверка требует двух JMP - в формировании условия и в IF, плюс операции со стеком.

В формировании условия с такой уж непреклонностью не требует :
Код:
U<
      POP   BX
      CMP   BX, AX
      SBB   AX, AX
U>
      POP   BX
      CMP   AX, BX
      SBB   AX, AX
0=
      CMP   AX, 1
      SBB   AX, AX
0<>
      NEG   AX
      SBB   AX, AX
0<
      CWD
      MOV   AX, DX
0>
      DEC   AX
      CMP   AX, 7FFFh
      SBB   AX, AX


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Форт-транслятор в Ассемблер
СообщениеДобавлено: Пт дек 19, 2014 17:08 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
gudleifr писал(а):
Стремление многих современных фортеров писать на FORTH в C-стиле проблему усугубляет.
Во во. Главная проблема Форта в реально существующих программистах. Потому он и не подходит для систем с малым объемом памяти, что не способны они.
А по моему так Форт, махом отожрав ядром 3 килобайта, дальше будет шитым кодом расти так медленно, что в 64 кило можно запихать чудовищную функциональность. Кроме того словарь и ту часть Форт-системы, что относится к компилятору и интерпретатору, можно сделать отсекаемой, расположив ее по отсекаемым адресам. Тогда останутся только реализация базовых низкоуровневых слов и шитый код приложения.
gudleifr писал(а):
4. Самое главное. Само языкотворческое назначение FORTH требует создания удобного, а не "оптимизированного по памяти" проблемно-ориентированного языка.
Ну а если создавать удобный, но не в ущерб расходу памяти удобный ? Т.е удобный до тех пор, пока удобство не стало слишком расточительным ?


Последний раз редактировалось Ethereal Пт дек 19, 2014 17:34, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Форт-транслятор в Ассемблер
СообщениеДобавлено: Пт дек 19, 2014 17:30 
Ethereal писал(а):
зачем это PARSE введено в стандарт ?
Исключительно, по дурости. Ошибка с "ненужностью пропуска чего-либо впереди идущего, кроме пробелов" удобнее исправляется в самом WORD, чем добавлением никому не нужного PARSE.
Кстати, не увидел в Вашем листинге (пропустил?) расширения списка искомых символов в случае пробела (до всех пробельных).
И зачем исключение, если конец строки по жизни обрабатывается штатно?
Ethereal писал(а):
Слово WORD с двумя кирпичами и именно-что "прошитое"
Разложение не на "кирпичи", а на совсем уж универсальные "атомы" смысла не имеет. Понятности не добавилось. Размер вырос.
Например, у Вас около 70 прошитых кодов. У меня - 121 байт в (32-х разрядном режиме).
Но даже в таком простом примере видно, что найти полезное применение всего двум кирпичам трудно.
Ethereal писал(а):
В формировании условия с такой уж непреклонностью не требует :
Изящно, по крайней мере, если не короче, то быстрее. Но требуется обычно только "<".
Ethereal писал(а):
Ну а если создавать удобный, но не в ущерб расходу памяти удобный ?
А Вы посмотрите на WORD. Удобный язык требует разбиения программы на удобные куски, а не SWAP и DUP, перемежаемых R@. Например, в приведенный Вами код всяко просится создание "цикла с двумя выходами".


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Форт-транслятор в Ассемблер
СообщениеДобавлено: Пт дек 19, 2014 17:45 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
gudleifr писал(а):
добавлением никому не нужного PARSE.

PARSE идет с пользой в реализацию слов :
\ в форме "код_непечатного_символа" PARSE
." ABORT" в форме [CHAR] " PARSE
( .( в форме [CHAR] ) PARSE
Код:
: \  1 PARSE 2DROP  ; IMMEDIATE

: .(                                                    \ CORE EXT
  [CHAR] ) PARSE TYPE
; IMMEDIATE

: (                                                     \ CORE
  BEGIN
    [CHAR] ) PARSE + TIB >IN @ + =
  WHILE
    REFILL 0=
  UNTIL THEN
; IMMEDIATE

: ."                                                    \ CORE
  COMPILE (.")
  [CHAR] " PARSE DUP C,
  HERE OVER ALLOT SWAP CMOVE ALIGN
; IMMEDIATE


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Форт-транслятор в Ассемблер
СообщениеДобавлено: Пт дек 19, 2014 17:48 
Ethereal писал(а):
PARSE идет с пользой в реализацию слов
Я и говорю: дурость. Проще исправить изначальную ошибку в WORD: пропускать ведущие пробельные символы только если введен пробел.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Форт-транслятор в Ассемблер
СообщениеДобавлено: Пт дек 19, 2014 17:50 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
gudleifr писал(а):
Кстати, не увидел в Вашем листинге (пропустил?) расширения списка искомых символов в случае пробела (до всех пробельных).
Вот только во встроенной системе дополнительной обработки табуляции, как тоже пробела, нам и не хватало. Ну вот не могли мы без нее прожить.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Форт-транслятор в Ассемблер
СообщениеДобавлено: Пт дек 19, 2014 17:52 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
gudleifr писал(а):
Ethereal писал(а):
PARSE идет с пользой в реализацию слов
Я и говорю: дурость. Проще исправить изначальную ошибку в WORD: пропускать ведущие пробельные символы только если введен пробел.
И 5 слов \ ." ABORT" ( .( залепить на ассемблере ?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Форт-транслятор в Ассемблер
СообщениеДобавлено: Пт дек 19, 2014 17:54 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
gudleifr писал(а):
И зачем исключение, если конец строки по жизни обрабатывается штатно?
Кроме многострочных комментариев по слову (


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Форт-транслятор в Ассемблер
СообщениеДобавлено: Пт дек 19, 2014 18:00 
Ethereal писал(а):
\ ." ABORT" ( .( залепить на ассемблере ?
Они прекрасно работают с WORD.
Напомню изначальная ошибка состояла в том, что выражение пустого комментария
Код:
( )

вдруг оказалось работающим неправильно (закрывающая скобка распознавалась как ведущая).
Дыру заткнули PARSE. Однако, как писал выше, проще исправить WORD. Я встречал в своей практике требование "пропустить не-пробелы" не более двух раз.
Ethereal писал(а):
Кроме многострочных комментариев по слову (
Вводить игнорируемый комментарий с консоли? Да Вы, батенька, извращенец. А из файла все прекрасно читается и без исключений.

P.S. По сути, это ответ на Ваш вопрос: "Зачем нужна операционная система?"


Вернуться к началу
  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 175 ]  На страницу Пред.  1 ... 8, 9, 10, 11, 12  След.

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


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

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


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

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