суббота, 20 июня 2009 г.

Триграфы

Недавно отлаживал один алгоритм, делал это "вживую", в частности, используя контрольную печать ;-)
В какой-момент сработал ::OutputDebugStringA("WTF??!"), вот только в отладочный поток вывелось неожидаемое "WTF|"...

На первый взгляд случилось Что-то Ужасное, правда, после некоторого скрипения мозгами я все-таки вспомнил про дела "давно минувших дней" - это триграфы :-)

Собственно, причина их появления достаточно банальна - много-много лет назад семибитная кодовая страница (я еще помню закат тех терминалов) предусматривала на местах некоторых символов типа {}[] наличие букв локальных европейских алфавитов, типа немецких умляутов.
В результате программы могли выглядеть достаточно экзотично...

Чтобы этого избежать, в Си как раз и ввели триграфы - комбинации из трех символов, которые заменяли "потерянные" лексемы.
Быстрая справка в Википедии:

Триграф Эквивалентный символ
??= #
??/ \
??' ^
??( [
??) ]
??! |
??< {
??> }
??- ~

То есть программа будет выглядеть так:

??=include <stdio.h>

int main(int argc, char* argv??(??))
{
if(argc < 1)
??<
return 1;
??>

int mask = atoi(argv??(1??))&??-0xFF00;
....
}


В общем, читаемость у кода получается еще та...
В этой связи, кстати, помучавшись, народ обратился к диграфам - это такая же "красивая" вещь, только из двух символов, которая поддерживается в режиме компиляции, совместимом со стандартом ISO C 99.

Кстати, о семибитных терминалах...
Карьера моя начиналась как раз за таким ВТ-52 от СМ-4(PDP-11), и, в отличие от европейцев, проблем у нас было куда больше - поскольку знаков в кириллице, э..., несколько поболее :-)
Короче, все строчные буквы были заменены на знаки кириллицы прямо в знакогенераторе терминала.
В результате этого программа выглядела очень мило (кстати, только сейчас начинаю понимать, что компилятор был все-таки "подхачен" на предмет чувствительности к регистру):

#INCLUDE <STDIO.H>
MAIN(ARGC, ARGV)
INT ARGC;
CHAR *ARGV[];
Ш
PRINTF("HELLO, WORLD\N");
Щ


Дальше, CC HELLO.C, а в ответ сакральное "SЫНТАИ ЕППОП" :-)

Кстати, однажды видел совершенно шикарный терминал, который обладал просто-таки роскошной возможностью - сбоку был приделан обычный переключатель (выглядело, кстати, как творчество местных Самоделкиных), который мог переключать отображение верхней половины таблицы на ASCII (какие "сопли" пришлось навесить внутри, чтобы подключить дополнительную микросхему ПЗУ для знакогенератора + схему коммутации не знаю - меня по малолетству внутрь не пускали, да я и не интересовался).
Зато результат был "налицо" - "SЫНТАИ ЕППОП" моментально превращался в банальный "Syntax error"...

Комментариев нет: