суббота, 29 мая 2010 г.

Почему в DOS разделителем пути стал "\"?

Это перевод Why is the DOS path character "\"? Автор: Ларри Остерман.

Много, много месяцев назад Declan Eardly спросил, почему символ '\' был выбран в качестве файлового разделителя пути (path separator).

Ответ на этот вопрос идёт из времён до меня, но я помню исходные причины.

Короткий ответ: потому что '/' был уже занят.

Длинный ответ: всё это проистекает из отношений Microsoft с IBM. DOS 1.0 поддерживала только дискеты (floppy disks).

Многие утилиты DOS (кроме command.com) были написаны IBM, и они использовали символ '/' для switch-символа своих утилит (switch-символ - это символ, который используется для распознавания параметра командной строки - на *nix это символ '-', на большинстве операционных систем DEC (включая VMS, DECSystem-20 и DECSystem-10), это символ '/' (примечание: я без понятия, пришёл ли символ '/' из IBM или из Microsoft - некоторые разработчики первой MS-DOS были закалёнными разработчиками DEC-20, так что возможно, что этот символ пришёл из их DEC-прошлого).

Тот факт, что символ '/' конфликтовал с разделителем пути в другой относительно популярной операционной системе, не слишком-то касался тех разработчиков - в конце концов, DOS не поддерживала каталоги. У неё были только файлы в единственном корневом каталоге.

Потом вышла DOS 2.0. DOS 2.0 была привязана к PC/XT, чьей отличительной особенностью был 10 мегабайтный жёсткий диск. IBM попросила Microsoft добавить поддержку жёстких дисков, а разработчики MS-DOS приняли это за возможность добавить поддержку современных файловых API - они добавили целую кучу API, работающих с описателями (DOS 1.0 основывалась на управляемых программой структурах, называемых FCB - File Control Block). Кроме этого, они добавили поддержку иерархических путей.

В то время исторически было несколько способов представления иерархических путей. Например, DecSystem-20 представляла каталоги как: "<диск>:"<"<каталог>[.<подкаталог>">"файл.расширение[,версия]" ("PS:<system>MONITR.EXE,4"). VMS использовала похожую схему, но вместо символов < и > она использовала [ и ] (и VMS использовала ";" для различения файлов и каталогов). *nix определяла иерархические пути как простую иерархию с корнем в '/' - в иерархии именования *nix у вас не было способа отличить каталог от файла (это не плохо, просто по-другому).

В MS-DOS 2.0 проектировщики DOS выбрали гибридный подход - они уже имели поддержку букв дисков от DOS 1.0, так что им нужно было просто продолжать их использовать. И они выбрали метод *nix именования иерархических путей - вместо явного указания каталога в пути (как в VMS и DEC-20), они просто сделали каталог и имя файла неразличимыми частями файлового пути.

Но появилась проблема. Они не могли использовать форму путей *nix с символом '/', потому что '/' был уже занят для switch-символа.

Так что они сделали? Они могли использовать символ '.', как на DEC машинах, но '.' использовалась для разделения файла от расширения. Так что они взяли следующую наилучшую вещь - символ '\', который визуально похож на '/'.

Вот так был выбран символ '\'.

Однако в MS-DOS есть небольшой секрет. Разработчики DOS не были особенно рады итоговому дизайну - чёрт, все они использовали Xenix-машины для почты и всего такого, так что они были знакомы с семантикой команд *nix. Поэтому они закодировали ОС, чтобы она принимала как '\', так и '/' в качестве разделителя (кстати, это работает и сегодня - попробуйте набрать "notepad c:/boot.ini" в Пуск/Выполнить на вашей Windows XP или Windows 7). И они пошли даже дальше. Они добавили недокументированный системный вызов для смены switch-символа. Новые системные утилиты учитывали этот флаг.

После чего они наложили последний штрих: они добавили опцию SWITCHAR= в config.sys, которая позволяла вам сменить switch-символ на что угодно - в том числе и '-'.

Что превращало MS-DOS в систему со стилем *nix, где параметры командной строки были вида "-switch", а пути были вида "C:/system/file.txt".

Я не знаю судьбу этого API switchar - оно исчезло много лет назад.

1 комментарий:

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.