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

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

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

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

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

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

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

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

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

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

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

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

Недостатки

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

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

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

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

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

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

Недостатки

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

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

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

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

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

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

  • В первых языках программирования вообще не было строкового типа; программист должен был сам строить функции для работы со строками того или другого типа.
  • В Си используются нуль-терминированные строки с полным ручным контролем со стороны программиста.
  • В стандартном Паскале строка выглядит как массив из 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

Read other articles:

Emma dari NormandieEmma menerima Encomium, dalam The Encomium Of Queen Emma, British Library MS 33241.Permaisuri InggrisPeriode1002 – musim panas 10133 Februari 1014 – 23 April 1016 Juli 1017 – 12 November 1035Permaisuri DenmarkPeriode1018 – 12 November 1035Permaisuri NorwegiaPeriode1028 – 12 November 1035Informasi pribadiKelahiranskt. 985NormandieKematian6 Maret 1052 (usia 66–67)Winchester, Hampshire, InggrisPemakamanOld Minster, Winchester. Jenazahnya sekarang di Katedral Winche...

 

本條目存在以下問題,請協助改善本條目或在討論頁針對議題發表看法。 此條目需要补充更多来源。 (2018年3月17日)请协助補充多方面可靠来源以改善这篇条目,无法查证的内容可能會因為异议提出而被移除。致使用者:请搜索一下条目的标题(来源搜索:羅生門 (電影) — 网页、新闻、书籍、学术、图像),以检查网络上是否存在该主题的更多可靠来源(判定指引)。 �...

 

  ميّز عن نهائي دوري الأمم الأوروبية 2019. دوري الأمم الأوروبية 2018–19تفاصيل المسابقةالتواريخ5–9 يونيوالفرق4الأماكنالبرتغال (في مدينتين مضيفتين)المراكز النهائيةالبطل البرتغال (أول لقب)الوصيف هولنداالمركز الثالث إنجلتراالمركز الرابع  سويسراإحصائيات ا�...

Sungai PuteSalo Pute, Sungai Rammang-RammangEtimologiPute dalam Bahasa Bugis artinya putihRammang-Rammang dalam Bahasa Makassar artinya kabut yang tebalLokasiNegara IndonesiaProvinsiSulawesi SelatanKabupatenMarosKecamatanBontoaCiri-ciri fisikHulu sungaiTaman Nasional Bantimurung Bulusaraung - lokasiLeang-leang, Kabupaten Maros - koordinat4°57′51″S 119°41′53″E / 4.9642895°S 119.69799°E / -4.9642895; 119.69799 - elevasi200&#...

 

City in Chūbu, JapanAwara あわら市CityAwara City Hall FlagSealLocation of Awara in Fukui PrefectureAwara Coordinates: 36°12′40.7″N 136°13′44.3″E / 36.211306°N 136.228972°E / 36.211306; 136.228972CountryJapanRegionChūbu (Hokuriku)PrefectureFukuiArea • Total116.98 km2 (45.17 sq mi)Population (March 1, 2021) • Total27,107 • Density230/km2 (600/sq mi)Time zoneUTC+9 (Japan Standard Time)City...

 

Peta kekuasaan Amerika Spanyol Bagian dari seri artikel mengenaiKolonisasi Eropa di Amerika Kontak Pra-Columbus Penemuan Benua Amerika Gelombang pertama kolonisasi Kolonisasi Britania Kolonisasi Belanda Kolonisasi Denmark Kolonisasi Hospitaller Kolonisasi Italia Kolonisasi Jerman Kolonisasi Kurlandia Kolonisasi Nordik Kolonisasi Prancis Kolonisasi Portugis Kolonisasi Rusia Kolonisasi Skotlandia Kolonisasi Spanyol Kolonisasi Swedia Dekolonisasi  Portal Sejarahlbs Kolonisasi Spanyol di...

Stasiun Semarang TawangBank Jateng BL02KS02KD01JS22 Tampak depan Stasiun Semarang Tawang, 2024Nama lainStasiun TawangLokasiJalan Taman Tawang 1Tanjung Mas, Semarang Utara, Semarang, Jawa Tengah 50174IndonesiaKoordinat6°57′52″S 110°25′40″E / 6.96444°S 110.42778°E / -6.96444; 110.42778Koordinat: 6°57′52″S 110°25′40″E / 6.96444°S 110.42778°E / -6.96444; 110.42778Ketinggian+2 mOperator Kereta Api IndonesiaDaerah Operasi IV S...

 

Physiological state of dormant inactivity in order to pass the winter season For the power-management process in computing, see Hibernation (computing). Hibernate redirects here. For the Java database library, see Hibernate (framework). Northern bat hibernating in Norway Bats hibernating in a silver mine Hibernation is a state of minimal activity and metabolic depression undergone by some animal species. Hibernation is a seasonal heterothermy characterized by low body-temperature, slow breath...

 

Andrew GarfieldGarfield tahun 2023LahirAndrew Russell Garfield20 Agustus 1983 (umur 40)Los Angeles, California, Amerika SerikatWarga negaraInggrisAmerika SerikatPekerjaanAktorTahun aktif2004–sekarang Andrew Russell Garfield (lahir 20 Agustus 1983) adalah aktor asal Inggris dan Amerika Serikat.[1][2][3] Ia telah menerima berbagai penghargaan, termasuk Tony Award, BAFTA TV Award dan Golden Globe Award. Time memasukkan Garfield ke dalam daftar 100 orang palin...

Artikel ini membutuhkan penyuntingan lebih lanjut mengenai tata bahasa, gaya penulisan, hubungan antarparagraf, nada penulisan, atau ejaan. Anda dapat membantu untuk menyuntingnya.Artikel ini membahas mengenai bangunan, struktur, infrastruktur, atau kawasan terencana yang sedang dibangun atau akan segera selesai. Informasi di halaman ini bisa berubah setiap saat (tidak jarang perubahan yang besar) seiring dengan penyelesaiannya. Informasi lebih lanjut: Jalur kereta api Trans-Sulawesi Jalur ke...

 

Глюкоза и глюкуроновая кислота (ациклические формы, проекция Фишера) Уроновые кислоты (глюкуроновые кислоты) — монокарбоновые кислоты общей формулы OHC[CH(OH)]nCOOH, формально являющиеся продуктами окисления терминальной гидроксиметильной группы альдоз в карбоксильную г�...

 

American football player (born 1987) American football player Colin KaepernickKaepernick with the 49ers in 2012No. 7Position:QuarterbackPersonal informationBorn: (1987-11-03) November 3, 1987 (age 36)Milwaukee, Wisconsin, U.S.Height:6 ft 4 in (1.93 m)Weight:230 lb (104 kg)Career informationHigh school:Pitman (Turlock, California)College:Nevada (2006–2010)NFL draft:2011 / Round: 2 / Pick: 36Career history San Francisco 49ers (2011–2016) Car...

Земская почтаУезды Алатырский Александрийский Ананьевский Ардатовский Арзамасский Аткарский Ахтырский Балашовский Бахмутский Бежецкий Белебеевский Белозерский Бердянский Бобровский Богородский Богучарский Борисоглебский Боровичский Бронницкий Бугульминский Бу�...

 

Голубянки Самец голубянки икар Научная классификация Домен:ЭукариотыЦарство:ЖивотныеПодцарство:ЭуметазоиБез ранга:Двусторонне-симметричныеБез ранга:ПервичноротыеБез ранга:ЛиняющиеБез ранга:PanarthropodaТип:ЧленистоногиеПодтип:ТрахейнодышащиеНадкласс:ШестиногиеКласс...

 

此條目可能包含不适用或被曲解的引用资料,部分内容的准确性无法被证實。 (2023年1月5日)请协助校核其中的错误以改善这篇条目。详情请参见条目的讨论页。 各国相关 主題列表 索引 国内生产总值 石油储量 国防预算 武装部队(军事) 官方语言 人口統計 人口密度 生育率 出生率 死亡率 自杀率 谋杀率 失业率 储蓄率 识字率 出口额 进口额 煤产量 发电量 监禁率 死刑 国债 ...

Town in Rhineland-Palatinate, GermanyOberwesel Town Coat of armsLocation of Oberwesel within Rhein-Hunsrück-Kreis district Oberwesel Show map of GermanyOberwesel Show map of Rhineland-PalatinateCoordinates: 50°06′40″N 7°43′17″E / 50.11111°N 7.72139°E / 50.11111; 7.72139CountryGermanyStateRhineland-PalatinateDistrictRhein-Hunsrück-Kreis Municipal assoc.St. Goar-OberweselSubdivisions4Government • Mayor (2019–24) Marius Stiehl[1] (C...

 

Family of aquatic microorganisms Collodictyonidae Collodictyon triciliatum Scientific classification Domain: Eukaryota Clade: Opimoda Clade: Podiata Clade: CRuMs Class: DiphyllateaCavalier-Smith 2003 Order: DiphylleidaCavalier-Smith 1993 Family: CollodictyonidaeBrugerolle et al. 2002 Genera Collodictyon Diphylleia Sulcomonas Synonyms Diphylleidae Cavalier-Smith 1993 Anisomonadea Cavalier-Smith 1993 emend. 2000[1] Collodictyonidae (also Diphylleidae) is a group of aquatic, unicellular ...

 

Economy of Guinea-BissauCentral Bank of Guinea-Bissau in BissauCurrencyCFA francFiscal yearCalendar YearTrade organisationsAU, African Development Bank, ECOWAS, World Bank, IMF, WTO, Group of 77StatisticsGDP $3.821 billion (PPP) (2019 est.)[1]GDP growth 5.9% (2017) 3.8% (2018) 4.6% (2019e) 4.9% (2020f)[2] GDP per capita$1,989 (PPP) (2017 est.)Rank: 214 (2017 est.)GDP by sectoragriculture (50%) industry (13.1%) services (36.90%) (2017 est.)Inflation (CPI) 0...

Questa voce sull'argomento centri abitati del Rio Grande do Norte è solo un abbozzo. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. Extremozcomune Extremoz – Veduta LocalizzazioneStato Brasile Stato federato Rio Grande do Norte MesoregioneLeste Potiguar MicroregioneNatal AmministrazioneSindacoKlauss Francisco Torquato Rego TerritorioCoordinate5°42′15″S 35°17′28″W5°42′15″S, 35°17′28″W (Extremoz) Altitudine44 m s.l.m. Superfici...

 

El extranjero de Albert Camus Género Novela filosóficaTema(s) Filosofía del absurdoAmbientada en Argelia Edición original en francésTítulo original L'ÉtrangerPaís Francia Fecha de publicación 1942 Premios Los 100 libros del siglo según Le Monde Edición traducida al españolTítulo El extranjeroEditorial Éditions GallimardPaís FranciaFecha de publicación 1942Páginas 184Ciclo del absurdoEl extranjeroEl mito de Sísifo[editar datos en Wikidata] El extranjero (en fra...