[Из песочницы] Программирование на кириллице может повысить производительность

Привет, Хабрахабр. Как известно, технический английский — язык мира информационных технологий. Основная документация, все стандарты программирования представлены на английском языке. В числе прочих, главная кодовая страница ASCII и переносимый набор символов включают 26 латинский символов, с которыми не возникает проблем при использовании разных кодировок. Исторически так сложилось благодаря международному уровню английского языка и лидерству США в области информационных технологий. Это обстоятельство позволяет добиться максимальной совместимости техники в эпоху Интернета и глобализации. В данной статье я не ставлю цель менять стандарты, а просто хочу показать альтернативный подход к IT на русском языке.

Изначально мне просто ради спортивного интереса захотелось построить похожую на ASCII 7-битную таблицу символов, включающую весь русский алфавит, 10 цифр и все знаки пунктуации из переносимого набора символов стандарта POSIX. В процессе все больше всё больше выяснялось, что такая таблица гораздо удобнее ASCII из-за чёткого определения её подразделов. Я знаю, что есть Юникод, но здесь рассматривается именно возможность однобайтового кодирования. В процессе создания находились дополнительные преимущества, таблица много раз полностью переписывалась, появились управляющие символы, далее представлен один из получившихся конечных результатов.

af24a91f0cf1.png

В чём же преимущества? Разберём по частям.

1. Очевидно, литеры в полном составе занимают всю вторую половину таблицы. Не хватило места только для буквы Ё, не критично, все давно привыкли к её особому статусу «дальнего родственника», хотя лично я вынес бы из списка твёрдый знак Ъ, непонятно зачем оставленный лингвистами вместо более нужной Ё. Но такое решение будет совсем бунтарским, поэтому, как в ISO 8859–5 и Win-1251, ей отведено место отдельно от алфавита, заглавный и строчный вариант в соседних ячейках. Без этой хорошей буквы русский алфавит состоит из 32 букв, добавив второй регистр, получаем 64 символов, или 2^6. Таким образом, один бит может определять, является ли символ буквой и применим ли к нему средний регистр (о котором позже). Как положено настоящему буквенному ряду, он идёт в алфавитном порядке, при этом сначала все строчные, затем все заглавные. Почему не наоборот, скажу после, сейчас главное, — что благодаря степени двойки границы обоих алфавитов совпадают с границами строк шестнадцатеричной таблицы, а это просто замечательно. Двоичный индекс каждой буквы в массиве равен числу последних 5 битов на кодовой странице, регистр определяется шестым, а сама буквенная природа символа — седьмым.

2. В первой половине множество не-букв так же поделено надвое, причём дважды: здесь действует та же адресация, и добавлен дополнительный регистр, я назвал его «средним». Верхнюю строку занимают управляющие символы, здесь они прописаны на русском, потому что что наличие латиницы в православной русской картинке вопреки всем правилам выглядело топорно. Их назначение не важно, я не мастер ассемблера и тем более машинных команд. С момента создания ASCII технологический прогресс ушёл далеко вперёд, и большинство управляющих символов 70-х более не актуальны. С такой кодировкой не смогут работать телетайпы и многие коммутаторы, но для использования компьютера с современной архитектурой 16 команд вполне достаточно, если нужно ещё, в конце специально отведена специальная команда «УПР», при получении которой устройство иначе воспримет следующий байт.

Если кратко: ПУС — \0, БИП — \a, НАЗ — \b, ТАБ — \t, НОВ — \n, АБЗ — \v, ПОД — \f, ВОЗ — \r, РАЗ — пробел, КОН — сигнал об окончании, СТО — команда остановки, ВЕР — верхний регистр, shift, ФИК — фиксировать регистр, caps lock, АЛЬ — средний регистр, альтернативное назначение литер, alt, ОТМ — отмена, esc, УПР — управление, начало команды, ctrl. Команды отобраны не самые лучшие, в частности, нет нужной команды ДЕЛ — delete, запроса отклика процесса, но УПР решает вопрос. К тому же, в данной статье не рассматриваются тонкости работы процессора. Важно, что набор управляющих символов целиком расположен в первой строке и соответствует стандарту POSIX. Для управляющих команд не действуют регистры, первые 4 нулевых бита в начале отключают любые переключения остальных.

3. На вторую строку действуют два регистра. Первый, верхний, меняет значение третьего бита слева с 0 на 1 и переводит чтение на четвертую строку. Второй, средний, меняет третий и четвертый биты и переводит на третью. Можно поменять вторую строку с четвертой, тогда «средний» регистр назовётся скорее «нижним», а переключение будет осуществляться одной подменой. Но я расставил строки так как расставил для лучшей читаемости. Для неё же, кстати, левую половину 3 и 4 строк занимают арифметические знаки, а правую — пунктуация. Если кто-то решил с особой тщательностью рассмотреть таблицу, уже заметил отсутствующие в ASCII полезные символы ¬ (логическое НЕ, весьма нужная вещь) и ¤ (знак валюты, для финансовой документации), а ещё родная буква Ё, скрытая без определенной клавиши и два резервных знакоместа.

Порядок символов в строке также имеет значение: один столбец — одна клавиша. То есть, кодирование клавиш клавиатуры полностью соотносится с таблицей. Да, механическая раскладка клавиатуры здесь обычная, но функциональная тоже своя, дело в том, что стандарт QWERTY был разработан для максимального замедления печати. В 1870-х ещё не существовало метода слепой печати, а пишущая машинка Ремингтон 1 уже успели приобрести коммерческий успех. На её предшественниках не было единой раскладки, и при работе на них часто происходило сцепление рычагов друг с другом. Кристофер Шоулз постоянно экспериментировал, стараясь как можно больше нагрузить мизинцы и замедлить скорость печати текста, тем самым предотвратив сцепление. Часто используемые буквы и знаки препинания оказались труднодоступны. С тех пор реалии изменились, современные клавиатуры не страдают механическими болезнями, а стандарт остался, ведь переучиваться печатать на новой раскладке — все равно что поставить клавиши фортепиано в обратном порядке. Впрочем, альтернативы всё же существуют, например, раскладка Дворака. Русская раскладка изначально проектировалась, основываясь на десятипальцевом методе, нам повезло больше. Но знаки препинания всё равно частично унаследовали QWERTY, а запятая и вовсе оказалась в верхнем регистре. В клавиатуре представленной в статье кодировки цифровые клавиши, а потому и знаки арифметики и пунктуации, идут слева направо, При этом учитывается частота их использования.

5316a3e93921.png

Возвращаясь к открытым вопросам, вот почему заглавные буквы следуют после прописных, — команда ВЕР опускает нас на две строки ниже для всех строк, кроме первой. Поскольку адресация знаков 3 и 4 строк происходит через регистры второй строки, для них повторное применение регистра обычными методами невозможно (клавиша shift или alt либо нажата, либо нет, увеличение давления пальцев сверху бесполезно). Большую роль играет и восприятие правила: если третий бит слева равен 0, — значит регистра нет, 1 — включен верхний регистр, маленькие буквы сменяются большими.

Благодаря этим правилам, таблицу можно восстановить по памяти буквально после первого прочтения, а свойства попадающего в поток нового символа определяются уже при считывании первых битов, что можно использовать для значительного увеличения производительности. Вряд ли эта кодовая страница найдёт какое-либо применение, программисты всего мира давно привыкли к английскому, а для обычных пользователей существует Юникод, над фундаментальным программированием и архитектурой ПК — работают американские корпорации. Данная статья носит чисто неформальный характер, хотя шустрый интерпретатор ЯП высокого уровня (да и низкого тоже) на русском всё же можно создать. А для ещё большей производительности, в ущерб удобочитаемости, представляю второй вариант таблицы, где средний регистр определяется одним четвёртым слева битом, и оба регистра включаются нулём, а не единицами.

01a594a98059.png

© Habrahabr.ru