Не трудно.
1.) Понятно, что на ассемблере можно написать что угодно. Поэтому результат
трансляции с любого языка по совместительству является и потенциальным
результатом ассемблирования некоего ненаписанного, но вполне возможного,
ассемблерного исходника. Только на этом основании можно утверждать, что
ни один язык никогда не переплюнет ассемблер. Но ! На ассемблере пишет
человек. И пишет он по человечески. А транслятор может породить код
не человеческий. Поэтому сравним человеческий стиль написания и
Фортовский нечеловеческий.
2.) Я говорил, что Форт сначала отъедает одним махом изрядный кусок,
а потом (при трансляции программы) код растет медленно. Поэтому
сравниваем только приращения при трансляции, считая начальное
отъедание форой. На большой программе фора должна перекрыться.
3.) Понятно, что искусственный пример ничего не докажет, поскольку
был создан искусственно и именно для доказывания.
Поэтому берем естественный пример уже примененный на практике.
С того сайта из примеров написания на AVR-Форте для смарт-карт.
Обработка одной из команд карты :
Код:
: INS_44 ( -- u ) LENGTH COUNT SWAP 2DUP CHAR+ -ROT CMOVE CELL- ;
Породила 9 слов, включая EXIT. Заголовков слов нет, они укладывались
отдельно и были отрезаны. Теперь пишем то-же самое по человечески,
так что код будет предельно оптимальным :
Код:
ldi YL, low(адрес)
ldi YH, high(адрес)
ld r16, Y+
mov r18, r16
метка: ldd r17, Y+1
st Y+, r17
dec r16
brne метка
dec r18
dec r18 ;Также требуемый результат на выходе, помимо копирования
ret
Придраться не к чему. Образчик ассемблирования с оптимизацией в длину.
Да только он был черезчур человеческим и занял 11 слов. А не человеческий
фортовский 9. А вот человек не умеет писать не по человечески.
И не будет писать не по человечески, коли по человечески хорошо вышло (см. код выше).
Так вот именно за счет своей не человечности Форт, в случае данной его реализации,
дает или не хуже или короче.
И это я выбрал еще хороший 8-разрядный камень. С автоинкрементом, понимаешь.
На котором ассемблер - не кошмар.