пятница, 28 ноября 2008 г.

А что там с этими зарезервированными именами файлов типа NUL и CON?

Это перевод What's the deal with those reserved filenames like NUL and CON? Автор: Реймонд Чен.

Установите свою машину времени на времена DOS 1.0.

DOS 1.0 не поддерживала каталоги и имена файлов в нижнем регистре или длиннее 8 + 3 (8 символов на имя и 3 на расшрение - прим. пер.).

Когда вы запускали свой ассемблер (или компилятор, если у вас был богатый папа), то общение с ним шло примерно так:
    A>asm foo                   расширение ".asm" для "foo" подразумевается по-умолчанию
    Assembler version бла-бла-бла
    Source file: FOO.ASM
    Listing file [FOO.LST]:     можно просто нажать Enter для умалчиваемого выбора 
    Object file [FOO.OBJ]:      можно просто нажать Enter для умалчиваемого выбора 
    Убран ассемблерный мусор

Вам можно было вводить только базовое имя файла "foo". Все расширения типа ".LST" и ".OBJ" вводились автоматически. Вообще-то, я даже не думаю, что вы могли полностью убрать расширения; они добавлялись всегда.

Но что если вам не нужен был файл листинга? Ассемблер требовал вводить имя файла, а если бы вы просто ничего не ввели, то он создал бы файл с тем же именем, что и имя базового файла.

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

Но ассемблер ничего не знает ни о каких волшебных именах файлов. Поэтому ассемблер создаёт файл с именем "PRN.LST" и начинает в него писать. Ассемблер даже не осознаёт, что при этом весь его вывод фактически идёт на принтер.

А если вам не нужен был этот вывод, вы, конечно же, могли написать "NUL". А если вы хотели вывести его на экран, то вы писали "CON".

А сейчас, если вы внимательно следили за историей, то вы уже самостоятельно сможете объяснить две вещи:

- Почему волшебные имена остаются волшебными, даже если я добавляю расширение?

Ответ: если бы расширение убивало всю магию, тогда ассемблер добавил бы расширение ".LST" к волшебному имени файла, и оно перестало бы работать как волшебное, убивая этим весь смысл введения волшебных имён.

- Почему волшебные файлы существуют в каждом каталоге?

Ответ: потому что в DOS 1.0 не было каталогов. Был только один каталог, который мы называем сегодня корневым каталогом, но в те дни, поскольку никаких каталогов не было, то не было нужды было вообще говорить о каталогах, и называть так корневой каталог. Корневой каталог был просто "файлами на вашем диске". Если бы магия не работала бы в подкаталогах, и если бы вы попробовали, например, перейти (chdir) в подкаталог и запустить оттуда ассемблер, то вы не смогли бы напечатать "NUL" чтобы получить свою порцию магии.

Но почему же эти волшебные имена живы ещё до сих пор?

Потому что все вокруг продолжают их использовать. Посмотрите только на все эти командные файлы (bat) - они же постоянно делают такие вещи, как редирект "> NUL", или проверяют существование каталога командой "if exist directoryname\nul"; да даже документация говорит создавать файлы командой "copy CON ..."...

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

Отправить комментарий

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

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

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

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

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