Строки в Форте и в СПФ в частности
By Oleg Minin. Thursday, 22. March 2007, 18:15:28
Есть очень много маленьких и,якобы, интуитивно-понятных вещей, без действительного понимания которых можно все время наступать на грабли. Представление строк в Форте одна из таких граблей 8) Поэтому...
Существует два общеизвестных типа представления строк. Это, так называемые, asciiz строки и строки паскалевского типа.
Существует два общеизвестных типа представления строк. Это, так называемые, asciiz строки и строки паскалевского типа.
Так выглядит строка паскалевского типа:
Так выглядит asciiz строка:
где # - счетчик строки, а 0 - это тот самый Z ограничитель конца строки.
У каждого из указанных типов строк есть преимущества и есть недостатки.
Основным недостатком у строк паскалевского типа является ограничение по длине строки, равное 255 байтам (сама же строка может занимать 256). Основным преимуществом является возможность моментально определить длину строки. У asciiz строк преимуществом является неограниченность длины строки, а к недостаткам можно отнести очень медленную работу с такими строками и невозможность хранить 0 внутри такой строки. И те и другие строки занимают в памяти одно и то же пространство и для работы с такими строками достаточно только одной адресной ссылки на них.
Наиболее распространенные языки программирования кроме такого представления строк не знают ничего. Более того, наибольшее распространение получили asciiz (самый неудобный тип строк).
У форта все из покон веков выглядит немного не так, как у других языков. Возможность возвращать из функции произвольное количество параметров позволяет делать чуточку меньше работы, оперируя со строками при помощи адреса и длины строки в явном виде, например слово TYPE (выводит содержимое строки на экран) получает два параметра asc # - адрес строки и ее длину. То есть имеется еще и промежуточное представление строк. Поэтому часто можно встретить последовательность COUNT TYPE или ASCIIZ> TYPE - в одном случае печатается содержимое строки паскалевского типа, то есть со счетчиком, а в другом случае содержимое asciiz строки.
В памяти строки хранить удобнее всего в виде строки со счетчиком. При обращении к API функциям приходится работать со строками завершаемыми нулем. Поэтому необходимо уметь (желательно быстро) конвертировать строку из одного типа в другой. В первое время форт содержал несколько примитивов для этого:
>ASCIIZ - слово копировало строку куда-то в буфер и дописывало в конец 0 либо же сдвигало всю строку на один символ влево, и -нуль в конец.
ASCIIZ> - слово преобразовывало строку из asciiz во внутреннее представление, то есть к адресу строки добавлялся счетчик длины строки, для чего требовалось посчитать длину строки.
Все бы хорошо, да получается медленно. Удобнее и быстрее всего работать со строками, когда и адрес начала и длина строки сразу известны, то есть так, как это делает TYPE. В памяти строки хранить удобно в виде паскалевских строк, а обращаться во вне необходимо с нулем завершенными строками. И тогда решили, а почему бы не скомбинировать несколько типов строк, то есть иметь дело не с asciiz строками и не с паскалевскими, а с их гибридом:
и хранить этот самый гибрид в памяти, а со строками работать наиболее удобным образом, то есть таким, когда явно заданы и начало и размер строки, что и сделано в СПФ.
Для того чтобы перевести паскалевского типа строку во внутреннее представление нужно использовать, как и ранее COUNT
Для того, чтобы преобразовать строку из внутреннего представления в asciiz строку достаточно удалить всего один верхний параметр - то есть сделать DROP
Ну, а работать с получаемыми извне asciiz строками таки придется по-старинке с помощью слова ASCIIZ>
Таким образом в СПФ достаточно мирно уживаются три варианта представления строк, и еще есть вариант в библиотечке ~ac/lib/str5.f (основы работы с которой были затронуты раньше)
Об asciiz строках очень хорошо написано в статье:
http://russian.joelonsoftware.com/Articles/BacktoBasics.html







Azamadt Smaguloff # 22. March 2007, 20:10
Иногда: