Forth
http://fforum.winglion.ru/

представление строк
http://fforum.winglion.ru/viewtopic.php?f=36&t=1850
Страница 1 из 6

Автор:  mOleg [ Вс янв 04, 2009 20:37 ]
Заголовок сообщения:  представление строк

и каким, по-вашему, оно должно быть?

Автор:  WingLion [ Вс янв 04, 2009 20:45 ]
Заголовок сообщения: 

mOleg писал(а):
ага, вот сразу возник у меня вопрос каким в стандарте должно быть представление строк?


Ясень пень, - оно должно соответствовать платформе!
Для винды одно для юникса другое.

фиксировать в стандарте, какой чертик на конце строки должен сидеть, имхо - не то время!

а сам форт должен воспринимать оба конца строки одинаково.
В крайнем случае, 0D0A принимать как две строки. Хотя, экономить на этом смысла нету.

Автор:  WingLion [ Вс янв 04, 2009 20:49 ]
Заголовок сообщения: 

можно еще извернуться - завести в словаре слово с именем в один байт 0D - которое будет заканчивать трансляцию строки. И считать концом строки байт 0А. Но это явный изврат.

Автор:  mOleg [ Вс янв 04, 2009 20:51 ]
Заголовок сообщения: 

вопрос понят не правильно.
под представлением строк понимается то:
- как они хранятся в памяти, (AsciiZ, Pascal, др.)
- какой может быть максимальная длина строки
- как хранить unicode строки
и прочие подобные вопросы.

Автор:  WingLion [ Вс янв 04, 2009 21:01 ]
Заголовок сообщения: 

упс...

я сделал бы так
разделил бы строки с разным представлением символов.
для байтовых - строки двух типов - строка со счетчиком или asciiz одна в другую конвертится легким перемещением строки на 1 байт с удалением байта-счетчика в начале и записью нуля в освободившееся место на конце.
Аналогично для строк с двух(четырех)байтовыми символами - только счетчик у них 2(4)-хбайтовый и нуль тоже.

А строка - без начала (счетчика) и конца(нуля) - строкой не считается, а считается массивом или блоком данных.

максимальная длина строки, соответственно, для байтовых 255, для словных - 65534, для 4-хбайтовых - 4Gb

Автор:  WingLion [ Вс янв 04, 2009 21:03 ]
Заголовок сообщения: 

6 вариантов строк - многовато - но что имеем то и имеем.
Зарывать голову в песок или выбирать на все случаи жизни одно представление смысла нету.

Автор:  Hishnik [ Вс янв 04, 2009 21:05 ]
Заголовок сообщения: 

mOleg писал(а):
- как они хранятся в памяти, (AsciiZ, Pascal, др.)

Так и хранятся - ASCIIZ, Pascal, др. :)
mOleg писал(а):
- какой может быть максимальная длина строки

Какая указана в документации на систему. Как вариант - какая хранится в системной константе.
mOleg писал(а):
- как хранить unicode строки

В Unicode.

Автор:  WingLion [ Вт янв 06, 2009 09:24 ]
Заголовок сообщения: 

Еще одно предложение:
строка с условным счетчиком переменной длины:

Цитата:
0nnnnnnn строка -- однобайтовый счетчик, строки длиной от 0 до 127 байт

10nnnnnn NN строка -- двухбайтовый (14 bit) счетчик, строки длиной от 0 до 16383 байт

110nnnnn NN NN NN -- четырехбайтовый (29 bit) счетчик, строки длиной от 0 до 2<sup>29</sup>-1 байт

1110nnnn NN NN NN NN NN NN NN -- для извращенцев - восьмибайтовый (60 bit) счетчик

и так далее до 128-байтового -- для супер-извращенцев


Первый байт получается старший, но это вряд ли должно смущать.

Можно еще признак zip-сжатия строки втюхать в первый байт, если хочется экономии на спичках.
Или добавить признак размера символа.

Автор:  Hishnik [ Вт янв 06, 2009 15:18 ]
Заголовок сообщения: 

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

Код:
N  <- N байт счетчик -> <- строка ->


А то и так

Код:
xxxx yyyy  - два битовых поля по 4 бита


xxxx - размер символа в байтах (1-16)
yyyy - длина счетчика в байтах (1-16)

Строка "на всякий случай" завершается нулем, чтобы быть еще и ASCIIZ.

Автор:  вопрос [ Вт янв 06, 2009 16:35 ]
Заголовок сообщения: 

Цитата:
xxxx - размер символа в байтах (1-16)
yyyy - длина счетчика в байтах (1-16)

Строка "на всякий случай" завершается нулем, чтобы быть еще и ASCIIZ.
вот, лучше всего, а при компиляции слов, работающих со строкой компилируется в работу только та часть структуры, которая необходима

Автор:  WingLion [ Вт янв 06, 2009 17:30 ]
Заголовок сообщения: 

Хищник писал(а):
yyyy - длина счетчика в байтах (1-16)


вот, почему-то кажется, что от 0 до 15. 0 байт длины - значит 2<sup>0</sup>=1 - чисто односимвольная строка.

Может, оно и смешно, но получается еще и просто кодировка символа вида
xxxx 0000 код-символа где xxxx - размер символа в байтах.
Можно в xxxx закодировать даже не размер, а тип кодировки: - dos866 win1251, КОИ, UTFxx
и т.д. и т.п.

Автор:  mrack [ Вт янв 06, 2009 20:03 ]
Заголовок сообщения: 

использовать восемь представлений строк по моему не менее накладно чем одно универсальное
ну и плюс не побоюсь быть побитым :) но понятие "строка" в данном случае не строка из файла,
а просто выделенная область память с данными
а что там в реале, строка из Пушкина, или полностью стихотворение или бинарник прочтенный из
файла -- не суть важно, поэтому строка со счетчиком без альтернативна вопрос лишь в организации
оного, отдельнае ли переменная в для "двухзначное переменной" или первые n байт в "строке"
вариант со счетчиком переменной длины
(по моему первый раз здесь предложенный mOleg в другой ветке)
это подходящий компромис для тех кто стремится экономить каждый байт и тех кто желает
оперировать метровыми "строками" со свободным содержанием,
вот только предусматреть сразу с расчетом на будущее, (время то бежит фиг догонишь)
не ограниченость счетчика, ну тоесть чтоб через пару тройку лет не вставал вапрос как мне
оперировать терробайтной строкой, или через еще пару лет "теромегабайтной" фоткой со свадьбы ... :)
ну вот примерно так имхо маё на это смотрит
ну и конечно в своем стремлении к универсальности кодировку уникодную я выбираю... по возможности,
а так CP866 использую :)

Автор:  mOleg [ Вт янв 06, 2009 20:08 ]
Заголовок сообщения: 

я хочу только заметить, что согласно АНС94 над счетчиком строки позволительно производить операцию C@ и С! , что приводит к неприятному, на мой взгляд, последствию - нельзя менять формат строки. У меня в форке строки представлены различным образом (от опций сборки зависит) и анси тест идет только при условии, что длина счетчика строки будет созразмерна С@ , который в реальности B@. Поэтому, мне кажется, что даже добавление ряда слов для поддержания стандарта не будет результативным по целому ряду причин.
То есть обратная совместимость не очень-то и нужна.

Автор:  WingLion [ Вт янв 06, 2009 20:17 ]
Заголовок сообщения: 

неужели история с майкрософтом и обратной совместимостью ничему не учит?

Автор:  mOleg [ Вт янв 06, 2009 20:19 ]
Заголовок сообщения: 

WingLion писал(а):
неужели история с майкрософтом и обратной совместимостью ничему не учит?

ну и к чему это?

Страница 1 из 6 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/