§23. Кодирование в знаковые системы

ПримерОсновываясь на определении языка (см. предыдущий параграф), можно заметить, что кодирование (или конвертация, см. §21) всегда есть процесс перевода с одного языка на другой. При этом нужно понимать, что символы далеко не всегда представляются знаками, но могут быть в виде изображений, звуков, вкуса, запаха, ощущения и т. д., а также комбинаций этих явлений (т. е. комбинацией физических явлений).

Такая интерпретация позволяет нам создавать описания языков, основанные именно на знаковом алфавите, в котором каждому знаку будет сопоставлен определённый символ в более общем понимании этого слова.

Алфавит языка — конечная символьная (или, в частном случае, знаковая) последовательность, в которой каждому символу (знаку) соответствует определённый номер.

Мощность алфавита — величина, показывающая, какое число символов, составленных из знаков алфавита, можно использовать.

Применительно к наиболее распространённым алфавитам естественных языков и алфавитам, содержащим в качестве знаков цифры, понятие мощности можно отождествить с количеством знаков этих алфавитов.

Известно, что радиоактивное излучение распадается в магнитном поле на три составляющих — потоки ядер гелия, электронов и электромагнитные волны с очень малой длиной. Каждому типу излучения соответствует свой символ, заимствованный из греческого алфавита: α, β и γ. Эти символы используются и при записи ядерных реакций, т. е. в условиях формального языка.

Остановимся для более подробного определения знака и символа в графической интерпретации.

Знак — это изображение, являющееся элементом алфавита, рассматриваемое как единое целое, а не как состоящее из отдельных изображений элементов того же алфавита.

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

В определении показано, что символ — это совокупность знаков (изображений). Но если в эту совокупность входит только один знак (одно изображение), то она тоже, естественно, может называться символом.

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

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

Любой элемент алфавита является знаком.

Итак, вникая в определения, делаем вывод: элемент алфавита всегда можно назвать символом, но символ, составленный из элементов алфавита по правилам грамматики, может не входить в него в виде знака. Даже если он, согласно изображению, является элементом алфавита, ещё требуется исследовать, как он составлен (см. Пример 3).

Чаще всего под символом понимается такой набор знаков, который занимает одно знакоместо: если бы на его месте оказался любой другой знак из алфавита, использованного для создания символа, то на него было бы выделено то же самое пространство.

Может наблюдаться ситуация, при которой символы алфавита построены на основе другого, заимствованного алфавита, и при этом каждый символ алфавита не обязательно состоит из одного символа заимствованного алфавита. Тогда применительно к символу такого алфавита можно говорить о длине последовательности символов заимствованного алфавита. Такой символ алфавита будет занимать не одно знакоместо, а столько, сколько в нём символов заимствованного алфавита (см. Пример 11).

В некоторых алфавитах есть знаки, которые не применяются отдельно от других знаков, потому что сами по себе не имеют смысла в рамках грамматики языка, несмотря на то, что являются самостоятельными элементами алфавитов.

Диакритические знаки (символы) — такие, которые в рамках грамматики языка не применяются без совмещения с другими знаками (символами) в один символ.

Два совмещённых в один символ диакритических знака (символа) также не образуют самостоятельно применяемого в языке символа. Совмещать диакритический знак имеет смысл только с не-диакритическим.

К диакритическим относятся, например, такие знаки: тупое и острое ударения (ò, ó соответственно), умлаут (ü), циркумфлекс (î), кружок (å), несамостоятельная тильда (õ) и т. д.

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

Буква — символ, являющийся элементом алфавита или составленный из знаков алфавита, используемый для построения строк.

Цифра — элемент алфавита, используемый для построения чисел (всегда знак).

Говоря о букве, мы понимаем под этим термином прежде всего изображение, не задумываясь о том, каким способом оно составлено. А вот если бы цифра не была знаком, такого понятия (цифра) вообще не существовало.

В алфавитах естественных языков отсутствуют диакритические знаки, они лишь заимствуются из набора символов, содержащего общеязыковые знаки, и входят в состав некоторых (не всех!) собственных символов, образуя знаки алфавитов, в соответствии с грамматикой языков.

Прежде всего по причине отсутствия в собственных алфавитах естественных языков такой категории знаков как диакритические, возможно, кажется не слишком внятным определение мощности алфавита в том виде, как оно представлено (см. выше). Поэтому обратим внимание на одно важное обстоятельство: если в алфавите имеется хотя бы один диакритический знак, то он может совмещаться с другими (основными) знаками, образуя новые символы, следовательно, количество используемых символов алфавита (включая, разумеется, так называемые составные) может быть не равно числу его знаков, а различие может оказаться весьма существенным (см. Примеры 1 — 3).

Мощность алфавита определяется не только особенностями знаков его самого, но и грамматикой языка, в рамках которого применяется данный алфавит.

Рассмотрим примеры, из которых видно, когда мы наблюдаем при записи отдельные знаки, а когда — совокупности знаков в виде символов (Примеры 1 — 3).

Пример 1

Пример 2

Пример 3

Иногда (в некоторых языках) изображения диакритических знаков оформляют самостоятельно используемыми символами алфавитов, и тогда об этих изображениях уже нельзя говорить как о диакритических знаках (ведь они в этом случае не должны и не могут совмещаться с другими знаками). Это означает, что в рамках данного языка использование подобного символа алфавита как самостоятельного разрешено.

А вот как выглядит пронумерованный алфавит, — из Примеров 4 и 5 можно это увидеть. Обратите внимание, что чаще всего нумерация в алфавитах, предназначенных для построения чисел, начинается с нуля, а в алфавитах, предназначенных для построения строк — с единицы. Обработка строк техническими средствами может подразумевать наличие нулевого символа в алфавите, но его значение — «отсутствие символа».

О порядке следования символов в алфавите принципиально необходимо знать для того, чтобы правильно произвести простое сравнение слов или чисел, т. е. восстановить их алфавитную последовательность, осуществить сортировку. Грамматика языка должна показывать, как из символов алфавита можно составить две принципиально различные конструкции: строки и/или числа.

Будем считать, что если предлагается не пронумерованный алфавит, то его символы расположены по порядку, от самого первого (нулевого для числовых и первого для строковых алфавитов) до последнего (имеющего максимальный порядковый номер).

Пример 4

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

Таким образом, при наличии алфавита и грамматики — логической языковой основы — каждое явление из некоторой совокупности, для которой строилась эта основа, может быть описано символами (знаками). Для этого даже не надо изобретать новые знаки — достаточно использовать те, которые входят в алфавиты, например, естественных языков. Заметим сразу, что эти знаки в новом алфавите могут следовать друг за другом совсем не в том порядке, какой наблюдался в исходном алфавите (см. Пример 5).

Пример 5

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

Пример 6

Если слово, представленное первой строкой, целиком является частью другого слова, представленного второй строкой, и вторая строка длиннее первой, то считается, что второе слово больше первого. Располагается оно, соответственно, после первого при создании последовательности в алфавитном порядке (Пример 7).

Пример 7

Заметим, что нулевой (т. е. отсутствующий) символ можно вставить в любое место строки и в любом количестве, и от этого строка нисколько не изменит своего представления. Но пользоваться этим символом следует лишь при необходимости, когда его наличие обретает некий смысл (как было показано в Примере 7). К тому же нужно помнить, что нулевой символ используется преимущественно техническими средствами, выполняющими анализ строковых выражений, для которых он может иметь ещё один смысл: «конец чтения строки»… По этой причине не сто́ит перегружать этими символами строки без необходимости.

Подобной особенностью нулевого символа алфавита строки отличаются от чисел (являющихся совокупностями цифр — знаков), для которых имеет смысл любая цифра, находящаяся в определённой (а не в другой) его части. Однако есть и некоторое сходство: ведь неважно, сколько лидирующих (предваряющих) нулей содержит целая часть числа, как неважно, сколько нулей находится на конце его дробной части!

Чтобы принцип сравнения чисел стал таким же, как принцип сравнения строк, т. е. их сравнение осуществлялось бы слева направо, требуется выровнять числа относительно десятичной запятой вправо нулями так, чтобы в их целых частях оказалось одинаковое количество разрядов, т. е. дописать необходимое количество лидирующих нулей (см. Пример 8). Дробные же их части анализируются точно так же, как и строки.

Пример 8

Если выравнивание вправо нулями не сделать, а просто воспользоваться принципом сравнения строк применительно к числам, то мы можем получить, что, например, 17 > 1597! Кстати, если рассматривать данные числа как строки, то мы придём как раз к такому выводу: действительно, ’17’ > ‘1597’.

Не любой язык предполагает обязательный порядок следования знаков алфавита. В этом случае говорят, что такой язык сам по себе не позволяет осуществить сравнение строк. Для кодирования в такой язык ограничиваются транслитерацией, после осуществления которой сравнение строк становится бессмысленным.

Транслитерация — процесс перевода с одного языка на другой, заключающийся в замене символов исходного алфавита символами (или их последовательностями) другого алфавита, поставленными в соответствие.

Будем называть символы или последовательности символов алфавита, поставленного в соответствие исходному алфавиту, идентификаторами символов исходного алфавита. Проще говоря, в данном контексте идентификатор — это символ или последовательность символов, по которому (или которой) впоследствии можно восстановить символ исходного алфавита в процессе обратного кодирования (декодирования). Если идентификаторы можно интерпретировать как числа, то иногда возможно сказать, что они образуют и новый порядок следования символов исходного алфавита — это явление часто используется для кодирования информации в компьютерной технике, при котором идентификаторами исходных алфавитов являются битовые последовательности (см. Примеры 9 и 10).

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

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

Пример 9

Пример 10

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

Транслитерация более привычна нам, когда используется при представлении слов, записанных символами кириллического алфавита, в виде латинской строки (Пример 11).

Пример 11

При работе с компьютерной техникой используются одновременно несколько (и даже много) языков, основанных на относительно небольшом числе основных и бесконечном числе локально задаваемых алфавитов. Идентификаторами символов этих алфавитов являются не десятичные числа (хотя их тоже можно иметь в виду), но битовые (двоичные) последовательности, и иногда они имеют разную длину (см. Примеры 9 и 10).

Код — последовательный набор символов алфавита языка или их идентификаторов.

Поскольку идентификаторы символов алфавита используются для перевода на другой язык, то можно сказать, что код — это представление информации на данном языке.

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

Возможно ли, что изображения разных знаков в одном и том же алфавите совпадают? Да, безусловно. Но о том, в каких случаях может использоваться тот или иной знак алфавита, должна говорить грамматика языка, ведь эти знаки отличаются лишь номерами!..

Последнее утверждение касается распознавания символов в «понятии компьютера» и понятии человека. Компьютер отличает символы по их номерам (битовым идентификаторам), а совсем не по изображениям; человек — как раз наоборот. Кстати, именно поэтому некоторые читатели, видя квадратики (или прямоугольники) вместо определённых символов на страницах нашего сайта, могут подумать, возможно, что это — изображения одного и того же символа; компьютер «понимает» эту ситуацию совсем иначе! (В этом случае можно констатировать, что на компьютере пользователя не установлена часть таблицы символов, так что компьютер просто не имеет информации, какие изображения поставить в соответствие указанным номерам.) Однако технологии распознавания символов «ставят компьютер в положение человека»: при оцифровке печатного или рукописного текста компьютер подбирает, более или менее удачно, для выделяемых из общего рисунка изображений битовые идентификаторы тех символов, которые (как «он считает») могут быть эквивалентами этих изображений (подробнее об оцифровке см. §20).

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

Распознаваемым кодом на формальном языке будет такой, который можно преобразовать обратно к описываемому явлению (исходной форме представления информации, исходному коду) посредством сравнения с идентификаторами символов исходного алфавита без каких-либо искажений. Преобразование в распознаваемый знаковый код (обратимое кодирование) называется кодированием в знаковую систему с использованием распознаваемой грамматики. Транслитерация, использованная при таком кодировании, называется обратимой.

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

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