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 требует создания удобного, а не "оптимизированного по памяти" проблемно-ориентированного языка.