...when altering one's mind becomes as easy as programming a computer, what does it mean to be human?..
суббота, 29 мая 2010 г.
Почему в DOS разделителем пути стал "\"?
Много, много месяцев назад 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" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку.
Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.
Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.
Примечание. Отправлять комментарии могут только участники этого блога.
Забавно
ОтветитьУдалить