Википедия

Строковый тип

В информатике, строковый тип (англ. string type) — тип данных, значениями которого является произвольная последовательность (строка) символов алфавита. Каждая переменная такого типа (строковая переменная) может быть представлена фиксированным количеством байтов либо иметь произвольную длину.

Представление в памяти

Некоторые языки программирования накладывают ограничения на максимальную длину строки, но в большинстве языков подобные ограничения отсутствуют. При использовании Unicode каждый символ строкового типа может требовать двух или даже четырёх байтов для своего представления.

Основные проблемы в машинном представлении строкового типа:

  • строки могут иметь достаточно существенный размер (до нескольких десятков мегабайтов);
  • изменяющийся со временем размер — возникают трудности с добавлением и удалением символов.

В представлении строк в памяти компьютера существует два принципиально разных подхода.

Представление массивом символов

В этом подходе строки представляются массивом символов; при этом размер массива хранится в отдельной (служебной) области. От названия языка Pascal, где этот метод был впервые реализован, данный метод получил название Pascal strings.

Слегка оптимизированным вариантом этого метода является т. н. формат c-addr u (от англ. character-aligned address + unsigned number), применяемый в Форте. В отличие от Pascal strings, здесь размер массива хранится не совместно со строковыми данными, а является частью указателя на строку.

Преимущества

  • программа в каждый момент времени содержит сведения о размере строки, поэтому операции добавления символов в конец, копирования строки и собственно получения размера строки выполняются достаточно быстро;
  • строка может содержать любые данные;
  • возможно на программном уровне следить за выходом за границы строки при её обработке;
  • возможно быстрое выполнение операции вида «взятие N-ого символа с конца строки».

Недостатки

  • проблемы с хранением и обработкой символов произвольной длины;
  • увеличение затрат на хранение строк — значение «длина строки» также занимает место и в случае большого количества строк маленького размера может существенно увеличить требования алгоритма к оперативной памяти;
  • ограничение максимального размера строки. В современных языках программирования это ограничение скорее теоретическое, так как обычно размер строки хранится в 32-битовом поле, что даёт максимальный размер строки в 4 294 967 295 байт (4 гигабайта);
  • при использовании алфавита с переменным размером символа (например, UTF-8), в размере хранится не количество символов, а именно размер строки в байтах, поэтому количество символов необходимо считать отдельно.

Метод «завершающего байта»

Второй метод заключается в использовании «завершающего байта». Одно из возможных значений символов алфавита (как правило, это символ с кодом 0) выбирается в качестве признака конца строки, и строка хранится как последовательность байтов от начала до конца. Есть системы, в которых в качестве признака конца строки используется не символ 0, а байт 0xFF (255) или код символа «$».

Метод имеет три названия — ASCIIZ (или asciz, символы в кодировке ASCII с нулевым завершающим байтом), C-strings (наибольшее распространение метод получил именно в языке Си) и метод нуль-терминированных строк.

Преимущества

  • отсутствие дополнительной служебной информации о строке (кроме завершающего байта);
  • возможность представления строки без создания отдельного типа данных;
  • отсутствие ограничения на максимальный размер строки;
  • экономное использование памяти;
  • простота получения суффикса строки;
  • простота передачи строк в функции (передаётся указатель на первый символ);

Недостатки

  • долгое выполнение операций получения длины и конкатенации строк;
  • отсутствие средств контроля за выходом за пределы строки, в случае повреждения завершающего байта возможность повреждения больших областей памяти, что может привести к непредсказуемым последствиям — потере данных, краху программы и даже всей системы;
  • невозможность использовать символ завершающего байта в качестве элемента строки.
  • невозможность использовать некоторые кодировки с размером символа в несколько байт (например, UTF-16), так как во многих таких символах, например Ā (0x0100), один из байтов равен нулю (в то же время, кодировка UTF-8 свободна от этого недостатка).

Использование обоих методов

В таких языках, как, например, Оберон, строка размещается в массиве символов определённой длины, причём её конец обозначается нулевым символом. По умолчанию, весь массив заполнен нулевыми символами. Такой способ позволяет объединить многие преимущества обоих подходов, а также избежать большинство их недостатков.

Представление в виде списка

Языки Erlang, Haskell, Пролог используют для строкового типа список символов. Этот метод делает язык более «теоретически элегантным» за счёт соблюдения ортогональности в системе типов, но приносит существенные потери быстродействия.

Реализация в языках программирования

  • В первых языках программирования вообще не было строкового типа; программист должен был сам строить функции для работы со строками того или другого типа.
  • В Си используются нуль-терминированные строки с полным ручным контролем со стороны программиста.
  • В стандартном Паскале строка выглядит как массив из 256 байтов; первый байт хранил длину строки, в остальных хранится её тело. Таким образом, длина строки не может превышать 255 символов. В Borland Pascal 7.0 также появились строки «а-ля Си» — очевидно, из-за того, что в число поддерживаемых платформ вошла Windows.
  • В Object Pascal и C++ STL строка является «чёрным ящиком», в котором выделение/высвобождение памяти происходит автоматически — без участия программиста. При создании строки память выделяется автоматически; как только на строку не останется ни одной ссылки, память возвращается системе. Преимущество этого метода в том, что программист не задумывается над работой строк. С другой стороны, программист имеет недостаточный контроль над работой программы в критичных к скорости участках; также трудно реализуется передача таких строк в качестве параметра в DLL. Также Object Pascal автоматически следит, чтобы в конце строки был символ с кодом 0. Поэтому если функция требует на входе нуль-терминированную строку, для конвертации надо просто написать PAnsiChar(строковая_переменная) или PWideChar(строковая_переменная) (для Pascal), переменная.c_str() (для Builder/STL).
  • В C# и других языках со сборкой мусора строка является неизменяемым объектом; если строку нужно модифицировать, создаётся другой объект. Этот метод медленный и расходует немало временной памяти, но хорошо сочетается с концепцией сборки мусора. Преимущество этого метода в том, что присваивание происходит быстро и без дублирования строк. Также имеется некоторый ручной контроль над конструированием строк (в Java, например, через классы StringBuffer и StringBuilder) — это позволяет уменьшить количество выделений и высвобождений памяти и, соответственно, увеличить скорость.
    • В некоторых языках (например, Standard ML) кроме этого, есть дополнительный модуль для обеспечения ещё большей эффективности — «подстрока» (SubString). Его использование позволяет выполнять операции над строками без копирования их тел посредством манипулирования индексами начала и конца подстроки; физическое копирование происходит лишь при необходимости преобразовании подстрок в строки.

Операции

Простейшие операции со строками:

  • получение символа по номеру позиции (индексу) — в большинстве языков это тривиальная операция;
  • конкатенация (соединение) строк.

Производные операции:

  • получение подстроки по индексам начала и конца;
  • проверка вхождения одной строки в другую (поиск подстроки в строке);
  • проверка на совпадение строк (с учётом или без учёта регистра символов);
  • получение длины строки;
  • замена подстроки в строке.

Операции при трактовке строк как списков:

  • свёртка;
  • отображение одного списка на другой;
  • фильтрация списка по критерию.

Более сложные операции:

  • нахождение минимальной , содержащей все указанные строки;
  • поиск в двух массивах строк совпадающих последовательностей ().

Возможные задачи для строк на естественном языке:

  • сравнение на близость указанных строк по заданному критерию;
  • определение языка и кодировки текста на основании вероятностей символов и слогов.

Представление символов строки

До появления стандарта Юникод в 1991 году, один символ обычно кодировался одним байтом из 8 двоичных битов или меньше — 7-битные, 6--битные. 8-битые кодировки позволяли представлять 256 возможных значений. Однако для полноценного представления символов алфавитов нескольких языков (многоязыковых документов, типографских символов — несколько видов кавычек, тире, нескольких видов пробелов и для написания текстов на иероглифических языках — китайском, японском и корейском) 256 символов недостаточно. Для решения этой проблемы применялись разные подходы:

  • Переключение языка управляющими кодами. Метод не стандартизирован и лишает текст самостоятельности (то есть последовательность символов без управляющего кода в начале теряет смысл); использовался в некоторых ранних русификациях ZX-Spectrum и БК.
  • Использование двух или более байт для представления каждого символа (UTF-16, UTF-32). Главным недостатком этого метода является потеря совместимости с предыдущими библиотеками для работы с текстом при представлении строки как ASCIIZ. Например, концом строки должен считаться уже не байт со значением 0, а два или четыре подряд идущих нулевых байта, в то время как одиночный байт «0» может встречаться в середине строки, что сбивает библиотеку «с толку».
  • Использование кодировки с переменным размером символа. Например, в UTF-8 часть символов представляется одним байтом, часть двумя, тремя или четырьмя. Этот метод позволяет сохранить частичную совместимость со старыми библиотеками (нет символов 0 внутри строки и поэтому 0 можно использовать как признак конца строки), но приводит к невозможности прямой адресации символа в памяти по номеру его позиции в строке.

Лексический анализ

Для проверки соответствия всех словоформ при лексическом (семантическом) анализе используются меры схожести лексем:

  • Расстояние Дамерау — Левенштейна
  • Расстояние Левенштейна
  • Расстояние Хэмминга
  • Сходство Джаро — Винклера

См. также

Примечания

  1. The Most Expensive One-byte Mistake — ACM Queue. Дата обращения: 17 сентября 2016. Архивировано 19 сентября 2016 года.
  2. Joel on Software - Назад, к основам. Дата обращения: 17 сентября 2016. Архивировано 16 сентября 2016 года.
  3. Simon St. Laurent. Introducing Erlang. — O’Reilly Media, Inc., 2013. — P. 62. — 185 p. — ISBN 978-1-449-33176-4.
  4. Bryan O’Sullivan, Don Stewart, John Goerzen, Real World Haskell. Appendix B. Characters, strings, and escaping rules Архивная копия от 26 января 2012 на Wayback Machine
  5. SWI-Prolog Manual: 5.2.2 Representing text: strings, atoms and code lists Архивная копия от 17 июля 2014 на Wayback Machine

Википедия, чтение, книга, библиотека, поиск, нажмите, истории, книги, статьи, wikipedia, учить, информация, история, скачать, скачать бесплатно, mp3, видео, mp4, 3gp, jpg, jpeg, gif, png, картинка, музыка, песня, фильм, игра, игры, мобильный, телефон, Android, iOS, apple, мобильный телефон, Samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Сеть, компьютер, Информация о Строковый тип, Что такое Строковый тип? Что означает Строковый тип?

V informatike strokovyj tip angl string type tip dannyh znacheniyami kotorogo yavlyaetsya proizvolnaya posledovatelnost stroka simvolov alfavita Kazhdaya peremennaya takogo tipa strokovaya peremennaya mozhet byt predstavlena fiksirovannym kolichestvom bajtov libo imet proizvolnuyu dlinu Predstavlenie v pamyatiNekotorye yazyki programmirovaniya nakladyvayut ogranicheniya na maksimalnuyu dlinu stroki no v bolshinstve yazykov podobnye ogranicheniya otsutstvuyut Pri ispolzovanii Unicode kazhdyj simvol strokovogo tipa mozhet trebovat dvuh ili dazhe chetyryoh bajtov dlya svoego predstavleniya Osnovnye problemy v mashinnom predstavlenii strokovogo tipa stroki mogut imet dostatochno sushestvennyj razmer do neskolkih desyatkov megabajtov izmenyayushijsya so vremenem razmer voznikayut trudnosti s dobavleniem i udaleniem simvolov V predstavlenii strok v pamyati kompyutera sushestvuet dva principialno raznyh podhoda Predstavlenie massivom simvolov V etom podhode stroki predstavlyayutsya massivom simvolov pri etom razmer massiva hranitsya v otdelnoj sluzhebnoj oblasti Ot nazvaniya yazyka Pascal gde etot metod byl vpervye realizovan dannyj metod poluchil nazvanie Pascal strings Slegka optimizirovannym variantom etogo metoda yavlyaetsya t n format c addr u ot angl character aligned address unsigned number primenyaemyj v Forte V otlichie ot Pascal strings zdes razmer massiva hranitsya ne sovmestno so strokovymi dannymi a yavlyaetsya chastyu ukazatelya na stroku Preimushestva programma v kazhdyj moment vremeni soderzhit svedeniya o razmere stroki poetomu operacii dobavleniya simvolov v konec kopirovaniya stroki i sobstvenno polucheniya razmera stroki vypolnyayutsya dostatochno bystro stroka mozhet soderzhat lyubye dannye vozmozhno na programmnom urovne sledit za vyhodom za granicy stroki pri eyo obrabotke vozmozhno bystroe vypolnenie operacii vida vzyatie N ogo simvola s konca stroki Nedostatki problemy s hraneniem i obrabotkoj simvolov proizvolnoj dliny uvelichenie zatrat na hranenie strok znachenie dlina stroki takzhe zanimaet mesto i v sluchae bolshogo kolichestva strok malenkogo razmera mozhet sushestvenno uvelichit trebovaniya algoritma k operativnoj pamyati ogranichenie maksimalnogo razmera stroki V sovremennyh yazykah programmirovaniya eto ogranichenie skoree teoreticheskoe tak kak obychno razmer stroki hranitsya v 32 bitovom pole chto dayot maksimalnyj razmer stroki v 4 294 967 295 bajt 4 gigabajta pri ispolzovanii alfavita s peremennym razmerom simvola naprimer UTF 8 v razmere hranitsya ne kolichestvo simvolov a imenno razmer stroki v bajtah poetomu kolichestvo simvolov neobhodimo schitat otdelno Metod zavershayushego bajta Osnovnaya statya Nul terminirovannaya stroka Vtoroj metod zaklyuchaetsya v ispolzovanii zavershayushego bajta Odno iz vozmozhnyh znachenij simvolov alfavita kak pravilo eto simvol s kodom 0 vybiraetsya v kachestve priznaka konca stroki i stroka hranitsya kak posledovatelnost bajtov ot nachala do konca Est sistemy v kotoryh v kachestve priznaka konca stroki ispolzuetsya ne simvol 0 a bajt 0xFF 255 ili kod simvola Metod imeet tri nazvaniya ASCIIZ ili asciz simvoly v kodirovke ASCII s nulevym zavershayushim bajtom C strings naibolshee rasprostranenie metod poluchil imenno v yazyke Si i metod nul terminirovannyh strok Preimushestva otsutstvie dopolnitelnoj sluzhebnoj informacii o stroke krome zavershayushego bajta vozmozhnost predstavleniya stroki bez sozdaniya otdelnogo tipa dannyh otsutstvie ogranicheniya na maksimalnyj razmer stroki ekonomnoe ispolzovanie pamyati prostota polucheniya suffiksa stroki prostota peredachi strok v funkcii peredayotsya ukazatel na pervyj simvol Nedostatki dolgoe vypolnenie operacij polucheniya dliny i konkatenacii strok otsutstvie sredstv kontrolya za vyhodom za predely stroki v sluchae povrezhdeniya zavershayushego bajta vozmozhnost povrezhdeniya bolshih oblastej pamyati chto mozhet privesti k nepredskazuemym posledstviyam potere dannyh krahu programmy i dazhe vsej sistemy nevozmozhnost ispolzovat simvol zavershayushego bajta v kachestve elementa stroki nevozmozhnost ispolzovat nekotorye kodirovki s razmerom simvola v neskolko bajt naprimer UTF 16 tak kak vo mnogih takih simvolah naprimer A 0x0100 odin iz bajtov raven nulyu v to zhe vremya kodirovka UTF 8 svobodna ot etogo nedostatka Ispolzovanie oboih metodov V takih yazykah kak naprimer Oberon stroka razmeshaetsya v massive simvolov opredelyonnoj dliny prichyom eyo konec oboznachaetsya nulevym simvolom Po umolchaniyu ves massiv zapolnen nulevymi simvolami Takoj sposob pozvolyaet obedinit mnogie preimushestva oboih podhodov a takzhe izbezhat bolshinstvo ih nedostatkov Predstavlenie v vide spiska Yazyki Erlang Haskell Prolog ispolzuyut dlya strokovogo tipa spisok simvolov Etot metod delaet yazyk bolee teoreticheski elegantnym za schyot soblyudeniya ortogonalnosti v sisteme tipov no prinosit sushestvennye poteri bystrodejstviya Realizaciya v yazykah programmirovaniyaV pervyh yazykah programmirovaniya voobshe ne bylo strokovogo tipa programmist dolzhen byl sam stroit funkcii dlya raboty so strokami togo ili drugogo tipa V Si ispolzuyutsya nul terminirovannye stroki s polnym ruchnym kontrolem so storony programmista V standartnom Paskale stroka vyglyadit kak massiv iz 256 bajtov pervyj bajt hranil dlinu stroki v ostalnyh hranitsya eyo telo Takim obrazom dlina stroki ne mozhet prevyshat 255 simvolov V Borland Pascal 7 0 takzhe poyavilis stroki a lya Si ochevidno iz za togo chto v chislo podderzhivaemyh platform voshla Windows V Object Pascal i C STL stroka yavlyaetsya chyornym yashikom v kotorom vydelenie vysvobozhdenie pamyati proishodit avtomaticheski bez uchastiya programmista Pri sozdanii stroki pamyat vydelyaetsya avtomaticheski kak tolko na stroku ne ostanetsya ni odnoj ssylki pamyat vozvrashaetsya sisteme Preimushestvo etogo metoda v tom chto programmist ne zadumyvaetsya nad rabotoj strok S drugoj storony programmist imeet nedostatochnyj kontrol nad rabotoj programmy v kritichnyh k skorosti uchastkah takzhe trudno realizuetsya peredacha takih strok v kachestve parametra v DLL Takzhe Object Pascal avtomaticheski sledit chtoby v konce stroki byl simvol s kodom 0 Poetomu esli funkciya trebuet na vhode nul terminirovannuyu stroku dlya konvertacii nado prosto napisat PAnsiChar i strokovaya peremennaya i ili PWideChar i strokovaya peremennaya i dlya Pascal i peremennaya i c str dlya Builder STL V C i drugih yazykah so sborkoj musora stroka yavlyaetsya neizmenyaemym obektom esli stroku nuzhno modificirovat sozdayotsya drugoj obekt Etot metod medlennyj i rashoduet nemalo vremennoj pamyati no horosho sochetaetsya s koncepciej sborki musora Preimushestvo etogo metoda v tom chto prisvaivanie proishodit bystro i bez dublirovaniya strok Takzhe imeetsya nekotoryj ruchnoj kontrol nad konstruirovaniem strok v Java naprimer cherez klassy StringBuffer i StringBuilder eto pozvolyaet umenshit kolichestvo vydelenij i vysvobozhdenij pamyati i sootvetstvenno uvelichit skorost V nekotoryh yazykah naprimer Standard ML krome etogo est dopolnitelnyj modul dlya obespecheniya eshyo bolshej effektivnosti podstroka SubString Ego ispolzovanie pozvolyaet vypolnyat operacii nad strokami bez kopirovaniya ih tel posredstvom manipulirovaniya indeksami nachala i konca podstroki fizicheskoe kopirovanie proishodit lish pri neobhodimosti preobrazovanii podstrok v stroki OperaciiProstejshie operacii so strokami poluchenie simvola po nomeru pozicii indeksu v bolshinstve yazykov eto trivialnaya operaciya konkatenaciya soedinenie strok Proizvodnye operacii poluchenie podstroki po indeksam nachala i konca proverka vhozhdeniya odnoj stroki v druguyu poisk podstroki v stroke proverka na sovpadenie strok s uchyotom ili bez uchyota registra simvolov poluchenie dliny stroki zamena podstroki v stroke Operacii pri traktovke strok kak spiskov svyortka otobrazhenie odnogo spiska na drugoj filtraciya spiska po kriteriyu Bolee slozhnye operacii nahozhdenie minimalnoj soderzhashej vse ukazannye stroki poisk v dvuh massivah strok sovpadayushih posledovatelnostej Vozmozhnye zadachi dlya strok na estestvennom yazyke sravnenie na blizost ukazannyh strok po zadannomu kriteriyu opredelenie yazyka i kodirovki teksta na osnovanii veroyatnostej simvolov i slogov Predstavlenie simvolov strokiDo poyavleniya standarta Yunikod v 1991 godu odin simvol obychno kodirovalsya odnim bajtom iz 8 dvoichnyh bitov ili menshe 7 bitnye 6 bitnye 8 bitye kodirovki pozvolyali predstavlyat 256 vozmozhnyh znachenij Odnako dlya polnocennogo predstavleniya simvolov alfavitov neskolkih yazykov mnogoyazykovyh dokumentov tipografskih simvolov neskolko vidov kavychek tire neskolkih vidov probelov i dlya napisaniya tekstov na ieroglificheskih yazykah kitajskom yaponskom i korejskom 256 simvolov nedostatochno Dlya resheniya etoj problemy primenyalis raznye podhody Pereklyuchenie yazyka upravlyayushimi kodami Metod ne standartizirovan i lishaet tekst samostoyatelnosti to est posledovatelnost simvolov bez upravlyayushego koda v nachale teryaet smysl ispolzovalsya v nekotoryh rannih rusifikaciyah ZX Spectrum i BK Ispolzovanie dvuh ili bolee bajt dlya predstavleniya kazhdogo simvola UTF 16 UTF 32 Glavnym nedostatkom etogo metoda yavlyaetsya poterya sovmestimosti s predydushimi bibliotekami dlya raboty s tekstom pri predstavlenii stroki kak ASCIIZ Naprimer koncom stroki dolzhen schitatsya uzhe ne bajt so znacheniem 0 a dva ili chetyre podryad idushih nulevyh bajta v to vremya kak odinochnyj bajt 0 mozhet vstrechatsya v seredine stroki chto sbivaet biblioteku s tolku Ispolzovanie kodirovki s peremennym razmerom simvola Naprimer v UTF 8 chast simvolov predstavlyaetsya odnim bajtom chast dvumya tremya ili chetyrmya Etot metod pozvolyaet sohranit chastichnuyu sovmestimost so starymi bibliotekami net simvolov 0 vnutri stroki i poetomu 0 mozhno ispolzovat kak priznak konca stroki no privodit k nevozmozhnosti pryamoj adresacii simvola v pamyati po nomeru ego pozicii v stroke Leksicheskij analizDlya proverki sootvetstviya vseh slovoform pri leksicheskom semanticheskom analize ispolzuyutsya mery shozhesti leksem Rasstoyanie Damerau Levenshtejna Rasstoyanie Levenshtejna Rasstoyanie Hemminga Shodstvo Dzharo VinkleraSm takzheNul terminirovannaya stroka Pustaya stroka Tekstovye dannye Leksikograficheskij poryadok Slovo matematika Teoriya posledovatelnostej Shirokij simvolPrimechaniyaThe Most Expensive One byte Mistake ACM Queue neopr Data obrasheniya 17 sentyabrya 2016 Arhivirovano 19 sentyabrya 2016 goda Joel on Software Nazad k osnovam neopr Data obrasheniya 17 sentyabrya 2016 Arhivirovano 16 sentyabrya 2016 goda Simon St Laurent Introducing Erlang O Reilly Media Inc 2013 P 62 185 p ISBN 978 1 449 33176 4 Bryan O Sullivan Don Stewart John Goerzen Real World Haskell Appendix B Characters strings and escaping rules Arhivnaya kopiya ot 26 yanvarya 2012 na Wayback Machine SWI Prolog Manual 5 2 2 Representing text strings atoms and code lists Arhivnaya kopiya ot 17 iyulya 2014 na Wayback Machine V state ne hvataet ssylok na istochniki sm rekomendacii po poisku Informaciya dolzhna byt proveryaema inache ona mozhet byt udalena Vy mozhete otredaktirovat statyu dobaviv ssylki na avtoritetnye istochniki v vide snosok 20 oktyabrya 2024

NiNa.Az

NiNa.Az - Абсолютно бесплатная система, которая делится для вас информацией и контентом 24 часа в сутки.
Взгляните
Закрыто