Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование для начинающих Выпуск 6.1


Служба Рассылок Городского Кота

Программирование для начинающих

Выпуск 6.1

25 SEP 2000

 
 
 
Ведущий рассылки: Вячеслав Мацнев
e-mail: stac@stacmv.net
Здравствуйте, друзья!

В этом выпуске читайте:

ОТСЕБЯТИНА

Вот, он, пришел тот день, когда вам пора уже начинать программировать. В других рассылках уже Паскаль давно учат, а мы еще к Бейсику не приступили :-)

Надеюсь, вы подписываетесь на все программерские рассылки? Упускать полезную информацию сейчас не в ваших интересах, поэтому проверьте состояние своей подписки.

За лето появилось много рассылок, интересных для нас с вами. Часть из них была или будет упомянута в рубрике ОКРУЖЕНИЕ, до других я не доберусь. Без вашей помощи, имеется ввиду. Если Вы подписаны на какую-нибудь альтернативную рассылку и она Вам нравится, поделитесь своими впечатлениями с остальными подписчиками, сделайте доброе дело.

ТЕОРИЯ

Как я уже сказал, сегодня мы начнем говорить о, собственно, программировании. И сейчас, я считаю, подходящее время, чтобы поговорить нам о языках.

Собственно, за чем языки нужны? Лингвисты и другие специалисты из числа подписчиков могут, несомненно, ответить на этот вопрос (и ответят, если захотят). А пока я толкну свою дилетантскую речь.

Язык - средство общения. Например, два человека могут общаться посредством какого-нибудь языка, обозначая словами этого языка различные понятия. Вот, слово "диск". Какие ассоциации у Вас вызывает это слово? Кто-то представит или вспомнит компакт-диск, кто-то маховик от МАЗовского движка, кто-то блин от штанги. Видите, простым словом заменено довольно-таки сложное явление, т.е. объект. Причем, разный для каждого человека.

Программист с компьютером тоже общается посредством языка. Вот, слово A (пусть это будет переменная). Программисту она представляется неким ящиком, в который можно что-то положить (допустим), а для компьютера это некая область в памяти, имеющая свой адрес и размер.

Знаете, общение программиста с компьютером недостаточно сравнить с общением каких-то людей, требуется уточнение. Это люди, говорящие на разных языках, а друг с другом общающиеся на третьем. Например, русская и француженка, общающиеся на английском.

Русская думает: "Меня зовут Елена", говорит: "My name is Helen".

Француженка слышит: "My name is Helen", думает: "Je m'appelle Helene".

Как видите, имеет место двойной перевод. В случае с компьютером, будет, например, так:

Программист думает: "Напечатай слово "программист", пишет на Бейсике: "print "программист" ".

Компьютер читает: "print "программист" ", думает и выполняет кучу разных действий. Для компьютера print довольно сложное понятие и на его родной язык, машинный код, оно переводится очень длинно и этого перевода я не знаю, но там, скорее всего, будут и такие буквы:"B4 09", "CD 21", "AF E0 AE A3 E0 A0 AC AC A8 E1 E2 24". Это в шестнадцатеричной системе.

Итак, подходим к сути. Каждый компьютер имеет процессор (часто,не один). Каждый процессор имеет свой набор команд, которые он может выполнять. В свою очередь, каждая команда имеет свой код. Вот этим набором команд и их кодами процессоры и отличаются друг от друга (с точки зрения программирования).

Программы пишутся в машинном коде, например:
"B7 02 80 C7 02 80 C7 30 BF 1B 01 26 88 3D B4 09 BA 17 01 CD 21 CD 20 32 2B 32 3D 20 24"
Эта программа делает очень простые с нашей точки зрения действия: прибавляет 2 к 2 и выводит на экран строку "2+2=" и сумму (в большинстве случаев это будет 4).

Эта программа предназначена для процессора семейства x86 и работает под ДОС. В принципе, можно проверить ее работу. Для этого надо создать файл с именем, например, prog.com и, используя шестнадцатеричный редактор, записать туда машинный код, приведенный выше.

Подобным образом программировали очень давно (тогда еще и ДОСа не было), но самая первая программа для процессора всегда пишется именно так. Ведь для только что изобретенного процессора еще нет Visual Basic'а:-) Сперва его надо написать.

Когда использовались перфокарты, то дырочки в них означали такие, вот, коды.

Уважаемые старшие товарищи! Если вы застали эру перфокарт и лент, расскажите, пожалуйста, об этом, всем будет интересно, а особенно мне, так как я этого времени не помню, по причине малолетства.

Итак, вроде разобрались с машинным кодом.

Домашнее задание 1: Переведите все числа из приведенной выше программы в машкоде из шестнадцатеричной системы в десятичную и двоичную (всего 20 чисел или около того).

Со временем оказалось, что таким способом (непосредственно в кодах) много не попишешь. Ну, во-первых, команд у процессора, как правило, больше сотни, а у современных и того больше. Например, только MMX добавила к списку команд 56 или 57 штук. Сложно все запомнить.

Во-вторых, не наглядно. Не поймешь сразу, где команды, а где данные. В нашей программе, B7 - команда, а 02 - данные (число "два" - наше первое слагаемое).

Так появился Ассемблер. И язык Ассемблера. Многие не видят разницы между этими понятиями, объясняю: язык Ассемблера - это язык, на котором пишутся проги, а Ассемблер - это программа, которая переводит вашу прогу с языка Ассемблера в машинный код.

Вернемся к нашей аналогии с общением. Ассемблер для компьютера это как бы навык перевода или словарь (кому как нравится).

Кстати, англо-русский словарь говорит нам, что assembler это сборщик, от assemble - собирать (в смысле, из составных частей).

Что представляет из себя язык Ассемблера?

В этом языке присутствует набор команд, уже не в шестнадцатеричном виде, а в виде кусков английских слов. И эти куски, т.е. слова выражают собой суть команды, например, ADD - сложить, MOV - поместить, SUB - вычесть и т.д.

Что характерно, нет однозначного соответствия между куском слова, который иногда называют мнемоникой, и кодом команды процессора. Т.е. команды MOV AH,7 и MOV ES,AH в коде запишутся совсем по разному, несмотря на то, что на языке Ассемблера это одна и та же команда (с разными операндами) (Следите за терминологией).

Наша программа на языке Ассемблера запишется так:

CSEG segment
org 100h
start:
mov bh,2                ;поместить 2 в регистр BH
add bh,2                ;прибавить 2 к BH (2+2=4)
add bh,30h              ;прибавить 48 к BH (4+48=52=34h) - получаем
                        ;ASCII код символа "4"
mov di,11bh             ;поместить в DI адрес, куда затем пихнем
                        ;символ "4"
mov es:[di],bh          ;поместить код символа "4" по нужному адресу
                        ;(в строку "2+2=", после знака "="
mov ah,09h              ;поместить 09h в AH
mov dx,offset result    ;поместить в dx адрес (смещение) начала строки
int 21h                 ;вызвать 9h-ую функцию 21h-ого прерывания ДОС
                        ;т.е. вывести на экран текст "2+2=4"
int 20h                 ;вызвать 20h-е прерывание ДОС, т.е. завершить
                        ;работу программы
result db '2+2= $'
CSEG ends
End Start

Программа, что называется с комментариями. Ничего, что вы ничего не поняли, я и сам здесь понимаю не все (т.е. то, что осталось без комментария). Но программу я написал самостоятельно! :-)

Дело в том, что начал учить язык Ассемблера. Кстати у меня нет, пока, ни малейшей книги по этому языку. Я только подписался на рассылку Олега Калашникова и прочел первые три выпуска.

Олег (если читаете), нутром чую, что эту программу можно написать покрасивее и покороче. Но не знаю, пока, как.
Подскажите, пожалуйста. (В рамках межрассылочного сотрудничества :-).

Вот, собственно, простая программа на Ассемблере. Вы можете ассемблировать ее программой TASM (tasm.exe prog.asm) и получить файл с объектным кодом (prog.obj), который затем скомпоновать программой TLINK (tlink.exe /t prog.obj) и получить программу в файле prog.com. Вы можете, если захотите, но вы не обязаны...

Язык Ассемблера - это язык низкого уровня. Каждая команда (строка программы) преобразуется в машинный код, что называется, "как есть". Т.е. программа делает только то, что Вы от нее хотите и ничего больше.

"А может быть иначе?", спросите вы. Да, бывает. Но об этом ниже.

Программы на Ассемблере выполняются очень быстро, с максимально возможной скоростью, скажем так. Но программирование на Ассемблере очень утомительно, потому что приходится заниматься рутиной (пересылкой байтов из одного места в другое и т.п.), следить за состоянием процессора (регистров), стека и т.п.

Именно поэтому появились языки высокого уровня (ЯВУ). Все рутинные, часто используемые последовательности команд заменили другими командами (чуете, была последовательность команд, а стала одна).

Например, наша программа на языке Бейсик запишется:

PRINT "2+2=";2+2

Да, вот, так, в одну строчку.

Теперь Вам должно быть совершенно понятно, почему популярны именно разные ЯВУ, а не язык Ассемблера. Простота - один из плюсов.
Поговорим теперь о минусах.

Возьмем, компилятор Бейсика, и скомпилируем нашу программу. Exe файл, который мы получим, будет занимать порядка 10 кило(!) байт, притом, что программа, написанная на Ассемблере занимает 29 байт. Выходит программа на Бейсике занимает более чем в 350 раз больше места, хотя делают они одно и то же.

Да, можно поднастроить компилятор, можно написать программу на Паскале (порядка 2.5 килобайт, в 90 раз больше ассемблерной проги).

Вы можете получить другие результаты, если будете использовать другие компиляторы или у вас будут другие настройки. Но идея должна быть вам понятна. Я на это надеюсь.

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

Помните, я сказал, что одна команда на ЯВУ заменяет несколько команд на Ассемблере. Так вот, это не правда. Одна команда на ЯВУ заменяет такую тучу машинных команд, что жутко становится.

Например, Бейсиковский оператор PRINT может печатать все, что угодно. Буквы, цифры, значения функций и т.п. Поэтому та туча команд, которую заменяет PRINT, включает в себя команды проверки, с чем, собственно, имеем дело (с буквами или цифрами), команды для вызова различных функций, например, математических, команды для перевода возвращаемых функциями значений и просто цифр в формат текстовой строки и т.п. и т.д. Даже, если мы печатаем только одну букву, в екзешник будут включены машинные команды "на все случаи жизни".

Компиляторы ЯВУ пишутся, как правило, для прикладных программистов. Им важна не столько скорость работы, сколько надежность, простота и малое время написания программы. И компиляторы, включают в исполняемый код программы разные штуки, о которых прикладной программист может и не знать. Это например, проверка на нажатие Ctrl-Break, проверка доступной памяти, размера стека, индексов массивов и много чего еще. Понятно, что все эти проверки занимают, кроме места еще и время. Даже, если программа не использует массивов и т.п., соответствующий код код будет включен в екзешник.

Но не надо этого пугаться. Это надо просто знать. К тому же, компиляторы имеют тучу настраиваемых опций, поковырявшись с которыми, можно уменьшить размер исполняемого файла и повысить скорость выполнения программы.

Ну, вот, вроде как, поговорили. Кое-что, надеюсь, вы запомните.

Да, кстати, вернемся к нашей программе. Вот ее варианты на

Бейсике:

PRINT "2+2=";2+2

Паскале:

begin
  write('2+2=',2+2);
end.

Си:

#include <stdio.h>
void main(void)
{
  printf("2+2",2+2);
}

Мы начнем с Бейсика, как наиболее простого языка из этих трех. Чтобы там не говорили мои оппоненты, они не правы :-)

Многие говорят о проблеме выбора языка. Проблема, действительно, существует, даже если речь идет и не о программировании. Вспомните себя в школе или в институте, когда Вам предлагали выбрать иностранный язык для изучения. А если не предлагали? То у Вас и не было проблемы выбора. В нашем случае язык выбирается не для изучения, а для написания программы, т.е. поставлена задача и надо решить, на каком языке реализовывать эту задачу. Если Вы знаете только один язык программирования, у Вас, опять же, нет проблемы выбора. А, вот, хорошо это или плохо, уже другой вопрос.

Я не стану говорить слова в поддержку или против какого-нибудь языка или среды разработки, т.к. они будут субъективны, будут основываться на моем опыте. Я предлагаю вам приобрести свой опыт, поработать с разными языками, с разными реализациями одного и того же языка.

В связи с этим, для изучения Бейсика предлагаю использовать две среды разработки: Spectra Publishing Power Basic Compiler 2.10f и Microsoft QuickBasic 4.0.

Почему я выбрал именно эти среды, а не другие? Просто потому, что они у меня есть. Вот Вам пример выбора среды разработки. Я же говорил, что все это субъективно.

Но я не ограничиваю Вашу самостоятельность, и Вы можете использовать что-нибудь другое, что Вам нравится или что удастся достать.

Домашнее задание 2: Добудьте себе одну-две (они мало занимают места, так что не пугайтесь :) среды разработки на Бейсике и изучите их системы меню. Чтобы потом не возникало вопросов как открыть файл и т.п.

Да, я тут говорю о средах разработки, может кто не знает, что это такое?

Итак, что нужно, чтобы писать программы на каком-нибудь языке программирования?

1. Редактор текста
   Здесь набирается и редактируется исходный текст программы.

2. Интерпретатор или компилятор (+ компоновщик)
   Интерпретатор  выполняет  программы,  а  компилятор  на  пару     с
   компоновщиком  позволяют получить исполняемый файл (в нашем случае,
   exe-файл).

3. Отладчик
   Отладчик предоставляет программисту ряд средств для поиска ошибок в
   программе.

4. Система помощи
   Слово "help", думаю, все знают.

5. Дополнительные инструменты.

Более подробно о компиляторах, интерпретаторах и прочих отладчиках я расскажу в другой раз.

Года четыре назад меня попросили написать несколько программ на Фортране (язык такой, в 50-е годы, кажется появился) и дали компилятор и, кажется, компоновщик (не помню, может они были объединены).

Как все это выглядело?

Я писал программы во встроенном редакторе Norton Comander'а (так, это редактор). Затем компилировал исходный текст компилятором (что-то типа fc prog.for), получал екзешник или сообщения об ошибках (это компилятор). Если надо, исправлял ошибки в редакторе (отладчика не было). В качестве хелпа использовались "Методические указания по программированию на Фортране", которые я взял в библиотеке. Вот так.
Вот была среда разработки программ.

Конечно, это не очень удобно. Поэтому фирмы производители компиляторов стали прикладывать к своим продуктам редакторы, отладчики и прочий необходимый софт. Потом все это стали интегрировать друг с другом. Т.е. стало возможным компилирование, запуск программы, использование отладчика и системы помощи непосредственно из редактора. Получилась интегрированная среда разработки. Она даже называется IDE - Integrated Development Environment. Turbo Pascal - типичный представитесь такого рода среды. О Visual Basic, Visual C++ и Delphi, вообще молчу.

ВОПРОСЫ И ОТВЕТЫ

Вопрос: Я создал bat-файл, который содержит две строки, вызывающие два других bat-файла. Но при запуске выполняется только первый из этих двух файлов. Есть ли способ выполнить оба файла?(Владимир)

Ответ: Способ есть. Надо использовать команду CALL.

Итак, наш bat-файл (nash.bat) содержал две строки:

first.bat
second.bat

Когда интерпретатор (COMMAND.COM) дойдет до первой строки, он плотно займется файлом first.bat и в nash.bat не вернется. Поэтому нам надо использовать команду CALL. Nash.bat будет таким:

call first.bat
call second.bat

В этом случае будут выполнены оба файла (first и second).

Если кому потребуются еще разъяснения, пишите.

Вопрос: Мне как-то пришлось конвертировать файлы формата GIF в формат PNG, и я заметил, что PNG-формат экономичнее в смысле размера файла. Не следует ли, что файлы PNG -формата будут загружаться быстрее GIFов? И вообще, имеются ли какие-либо способы повышения скорости загрузки страницы?(Сергей)

Ответ: Если файл имеет меньший размер, то он будет загружаться быстрее, при прочих равных (типа скорости соединения) условиях. Например, функция различных "оптимизаторов графики для WEB" сводится, как раз, к уменьшению размера файла при сохранении приемлемого качества. И способы повышения скорости загрузки страницы сводятся в основном к уменьшению размера как html-файла, так и включенной в нее графики. Пользователь также может повысить скорость загрузки страниц, используя кэширование, но это не зависит от вебдизайнера (если он, конечно, не управляет кэшированием с помощью тега META).

Вопрос: Как заставить открываться html файл в нужных мне размерах? Скажем, шириной 60 и высотой 100 пикселей? А можно ли сделать так, чтобы при загрузке определённого html файла не выводились toolbar, menubar, scrollbar?(Расим)

Ответ:Это реализуется на JavaScript. Поскольку мы его еще как бы не знаем, просто приведу пример.

<html>
<head>
<script language="javascript">
<!--
    function problem(){
    wh=window.open("1.htm","target","width=60, height=100, toolbar=no, scrollbars=no")
}
-->
</script>
</head>
<body text=blue bgcolor=white>
<center>
<h1>Решение проблем</h1>
<a href="" onclick=problem()>Вход</a>
</body>
</html>

Когда кто-то кликнет на ссылке "Вход", возникнет событие onClick этой ссылки и выполнится функция problem() (в своих проектах можете назвать ее по-другому). Эта функция только и делает, что вызывает метод open объекта window, т.е. открывает новое окно браузера.

Здесь,

wh - имя ссылки на открываемое окно из JS (придумываем сами, в данном примере оно не играет роли, т.к. на открываемое окно мы нигде не ссылаемся)

1.htm - имя файла, закружаемого в новое окно

target - имя ссылки на открываемое окно из HTML (придумываем сами, в данном примере оно не играет роли, т.к. на открываемое окно мы нигде не ссылаемся)

width=60, height=100, toolbar=no, scrollbars=no - параметры открываемого окна (некоторые или все могут отсутствовать).

Короче, разберетесь :-))

DOS

3. Файловая система ДОС

Для удобства работы с информацией при записи на диск ее размещают в файлах.
Файл - это поименованная целостная совокупность данных на внешнем носителе информации. Данные это любая информация, например, программы, тексты программ, любые другие тексты, изображения, результаты работы различных программ. Файл - это очень важное понятие, которое, между прочим, не всеми правильно понимается. Простите за каламбур. Скажу про себя. Я понял, что такое файл уже, наверное год спустя, после того как начал работать с компьютером. Не то, чтобы я такой тупой, просто в то время я работал с компьютером, который в качестве внешней памяти использовал магнитофонные кассеты (типа МК-60). Когда загружаешь с кассеты программу, трудно догадаться (не имея литературы), чем программа отличается от файла (тогда программы обычно хранились в одном файле, а не как сейчас: одна программа - 100 файлов). Но, надеюсь, у вас таких проблем не будет.

В магазинах сейчас много продается различных папок с файлами, в которые помещаются обрывки бумаги, часто с гордостью называемые документами. Можно конечно провести аналогию между этими файлами и их компьютерными тезками. И представлять, что при записи информации в файл, мы кладем эту информацию в пакетик и даем ему имя. Затем добавляем в папку к другим файлам-пакетикам. Подобное представление о файлах подставляет пользователю, например, ОС WINDOWS, с ее папками (folder(s)).

Если Вы четко представляете себе, что есть файл, хотя бы на этом уровне, то это уже хорошо. Но я искренне надеюсь, что большинство из подписчиков имеют истинное или близкое к истинному представление о файлах.

Вы, конечно, понимаете, что на диске или дискете нет никаких папок и пакетиков-файлов (кстати, почему их называют файлами, не пакетиками для документов или еще как, ведь никто же не называет папку для бумаг фолдером?). На диске мы имеем некую непрерывную область, в которую мы можем записать последовательность байтов (или битов). Если такую последовательность, имеющую смысл, например, текст, как-нибудь выделить и дать ей имя, то мы получим файл. А то, как именно выделяется та или иная последовательность из общей кучи байтов или битов и как этой последовательности ставится в соответствие некоторое имя, это уже дело файловой системы.

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

Давайте, в общих чертах, без особых подробностей, рассмотрим, как ДОС работает с файлами.

Нашу дальнейшую беседу я разобью на две части, назовем их initial и advanced соответственно. В первой части поговорим о том, что вы и так знаете, о самых основах, необходимых как программисту, так и обычному пользователю. Из второй части вы узнаете то, что обычному пользователю знать "не положено". Постараюсь без излишней конкретики рассказать вам о секторах, кластерах и прочих fat'ах.

Initial

Файл. File. Поименованная область диска (или другого носителя). Раз поименованная, значит есть имя. Так сложилось, что в современных операционных системах имена файлов состоят из нескольких частей: собственно имени и расширения. Вас это не должно смущать, так как ваши имена тоже состоят из нескольких частей: имя, отчество, фамилия. Можно провести аналогию: имя человека - имя файла, фамилия - расширение (имени) файла.

Имена файлов выполняют такую же функцию, что и имена людей. Они предназначены для идентификации определенного файла или человека. Имена, сами по себе, это условность, придуманная для удобства пользователей. Как вы можете дать имя своим детям, так вы можете назвать и свои файлы. Есть, конечно, некие правила ...

Я не очень хорошо знаком с системой регистрации новорожденных, но подозреваю, что ребенку можно дать любое имя, состоящее из букв русского алфавита. Цифры, латинские буквы и знаки препинания использовать запрещается. (Как в том анекдоте про программиста, который назвал свое чадо __MyChild. -Зачем два знака подчеркивания? -А, чтобы не было конфликта с именами библиотечных функций )

На имена файлов накладываются более строгие ограничения. Имя должно содержать не более восьми символов, а расширение - не более трех. Помните, мы говорим о ДОС, да?

В именах не разрешается использовать знаки препинания, пробел, кавычки, и некоторые другие символы, которые имеют специальный смысл (например, "*", "?" и "\"). Я же рекомендую использовать для имен только латинские буквы, цифры и знак подчеркивания (как в ДОС, так и в Windows 9х).

Вот пример имени: maillist.pfb . Как правило, имя файла говорит о чем-то его создателю, расширение нужно для того же. Впрочем, расширения у имени файла может и не быть. Расширение обычно указывает на то, что файл принадлежит определенному типу (так же как фамилия указывает, что человек принадлежит к определенной семье). Только указывает! Если я возьму паспорт Щелкунова, это не сделает меня родственником Ивана Никитича и Марии Александровны Щелкуновых. Так, если назвать файл prog.exe, это не сделает его запускаемым (executable). Да, если я наберу в командной строке prog.exe, ДОС попытается запустить этот файл и скорее всего зависнет или распознает подлог и скажет, какой вы нехороший. Заметьте, вы, а не я :-))

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

Хоть, расширения и не обязательны, их использование удобно. Например, по расширению можно вести поиск, сортировку и т.п. Например, хотите найти все midi композиции, которые у вас есть, ищите все mid файлы (*.mid).

Вот, примеры часто используемых расширений и их значения:

arj  файл архива ARJ                         exe  исполняемый файл (файл с программой)
asm  текст программы на языке Ассемблера     htm  HTML - документ
bak  резервная копия файла                   ini  файл инициализации
bas  текст программы на Бейсике              jpg  изображение JPEG
bat  пакетный (batch) файл ДОС               mp3  аудио файл в формате MPEG 1 Layer
3
bmp  изображение DIB                         pas  текст программы на Паскале
c    текст программы на Си                   rar  файл архива RAR
com  исполняемый файл (файл с программой)    txt  текстовый файл
cpp  текст программы на Си++                 xls  документ Excel
doc  документ Word                           zip  файл архива ZIP

С именами файлов пока все. Теперь зададимся вопросом, что есть каталог, директория (или директорий), папка и пр.

В незапамятные времена, все файлы хранились на диске в одном каталоге (ОС TR DOS для систем Sinclair ZX Spectrum, например). Имелся каталог, а в нем были файлы.

Файлов становилось все больше и больше и с ними трудно было работать, когда они в одной куче. Поэтому, при проектировании более современных ОС, в том числе MS DOS, заложили возможность создания как файлов, так и каталогов (подкаталогов). Такие файловые системы можно назвать иерархическими. Структура каталогов имеет иерархию: одни каталоги являются дочерними для других (подкаталоги более низкого уровня), последние, в свою очередь, являются родительскими (подкаталогами более высокого уровня). Такую структуру можно представить наглядно в виде дерева, растущего вниз:

                     корневой каталог (root) "\"
                     /           |              \
    подкаталог 1 уровня    подкаталог 1 уровня  подкаталог 1 уровня
             /      \                             /             \
подкаталог 2 уровня подкаталог 2 уровня      подкаталог 2 уровня  подкаталог 2 уровня
         /                                        /           \
подкаталог 3 уровня                     подкаталог 3 уровня подкаталог 3 уровня

В жизни такие структуры имеют какой-то смысл, например для коллекции музыкальных файлов можно применить такую структуру каталогов:

\
+- MUSIC
|  |- MIDI
|  |- MODULES
|  +- MP3
|  |  +-FOREIGN
|  |  | +-PARSONS
|  |  | | |-PYRAMID
|  |  | | +-EVE
|  |  | | | |-alan7905.mp3
|  |  | +-VANGELIS
|  |  | | |-OCEANIC
|  |  | | |-VOICES
|  |  +-OUR
|  |  | +-NAUTILUS
|  |  | | +-TITANIK
|  |  | | | |-titanik.mp3
|  |  | | |-PEREEZD
|  |  | +-KINO
|  |  | | |-45
|  |  | | |-GRUPPA
 ..................
SOMETHING ELSE

Всем, понятно, что я тут изобразил? Ок.

Подкаталоги, как видите, тоже имеют имена. Правила именования подкаталогов такие же, как и для файлов. Подкаталоги могут иметь расширение имени, например, я в подкаталоге _.bat централизованно храню bat-файлы. Могут и не иметь...

Самый главный (верхний в иерархии) каталог называется корневым (root), он имеет имя "\" и переименовать его нельзя.

Теперь усвойте понятие родительского и дочернего каталога. В выше приведенной структуре, каталоги 45 и GRUPPA будут дочерними (или подкаталогами) для каталога KINO. В свою очередь KINO - дочерний каталог для OUR, т.е. OUR - родительский каталог для KINO, а также для NAUTILUS, но не для TITANIK, PEREEZD, 45 и GRUPPA.

Каталог может иметь много дочерних каталогов, но родительский каталог всегда один. Корневой каталог не имеет родительского.

Ну и как нам идентифицировать (:-) теперь файлы? Когда они были в одном каталоге, достаточно было знать имя и расширение, а теперь?

Теперь все сложнее, и, в тоже время, все равно просто. Допустим у нас имеется песня команды Alan Parsons Project из альбома Eve, которая называется "Winding Me Up". Она записана в файле alan7905.mp3 (79 год, пятая песня по счету :). Для того чтобы точно указать на этот файл, пройдемся по структуре каталогов, начиная с корневого:

\music\foreign\parsons\eve\alan7905.mp3

(смотрите, ДОС не различает прописные и строчные буквы в именах файлов)

Все отлично, но у нас (потенциально) могут быть несколько дисков, как DOS узнает, на каком диске надо искать файл alan7905.mp3?

В ДОС (как и в Windows) все накопители имеют свое имя. Оно состоит из ОДНОЙ латинской буквы(a-z) и двоеточия(:), например, a:, c:, d: ,m:, z:.

При загрузке системы всем дискам раздаются имена, причем a: и b: соответствуют двум дисководам (даже если их вообще нет), с: - первичный раздел ДОС первого жесткого диска, d: - первичный раздел ДОС второго жесткого диска, ..., затем именуются логические диски на винчестерах, затем другие устройства, типа CD-ROM.

Что, запутались? Не беда, запомните, просто, что "а" и "бэ" - это дисководы, а "цэ" и т.д. винты и сидюки (а также, зипы, и прочая и прочая).

Пусть наш файл будет на диске c: (читается, "цэ" :-):

c:\music\foreign\parsons\eve\alan7905.mp3

Это называется спецификацией файла или путем к файлу. Конкретно, это полный или абсолютный путь к файлу. Этот путь ОДНОЗНАЧНО идентифицирует данный файл.

Чтобы вам стало СОВЕРШЕННО ПОНЯТНО можете провести аналогию между путями к файлу и почтовыми адресами людей:

страна:\область\район\улица\дом\квартира\имя.фамилия

Тезок однофамильцев может быть много, но живут они по разным адресам. Также и на диске могут быть файлы с одинаковыми именами, но они находятся в разных каталогах (здесь с этим строго).

Для примера, вот полный путь к песне "Титаник" из одноименного альбома:

c:\music\our\nautilus\titanik\titanik.mp3

Ок? Ок.

Еще пара-тройка понятий.

Текущий диск/каталог (current drive/directory). В системе один из дисков и один из каталогов на каждом диске всегда является текущим. Это тот диск (каталог) с которым мы в данный момент работаем, "на (в) котором находимся". Если вы видели приглашение ДОС (пусть даже и в Нортоне ... да это та строка в самом низу под "синими таблицами" :-), то заметили, что оно имеет вид: диск:\каталог>, например, c:\music>. Это система нам, как раз, показывает, что текущий диск - c:, а текущий каталог на нем - \music.

Какой в этом смысл? Очень глубокий... :-)

При указании спецификации файла можно опустить диск и каталог, где он находится. Нам хорошо - меньше печатать. Системе же нужен только полный путь, поэтому она дополнит недостающие компоненты пути (диск и каталог) текущими диском и каталогом.

Допустим текущий диск c:, а текущий каталог \music\our\nautilus\titanik. Чтобы он стал текущим в него надо перейти (зайти) в Нортоне или с помощью команды Change Directory (cd).

Команда: CD каталог
Делает каталог каталог текущим.

Если c: текущий диск, то команда cd \music\our\nautilus\titanik сделает этот каталог текущим (заметьте, имя диска опущено, система сама подставит текущий, т.е. c:).

Если диск c: не является текущим, то надо его таким сделать.

Команда: диск:
Делает диск диск текущим.

В этом случае надо ввести две команды:

c:
cd \music\our\nautilus\titanik

Теперь, чтобы указать на песню "Титаник", можно использовать просто имя файла titanik.mp3 . Путь дополнится текущим диском и текущим каталогом.

Допустим, у на есть плеер winamp.exe в директории c:\WINAMP. Проиграть песню "Титаник" можно введя команду:

с:\winamp\winamp.exe c:\music\our\nautilus\titanik\titanik.mp3

или

с:\winamp\winamp.exe titanik.mp3

(если текущий каталог \music\our\nautilus\titanik)

или

winamp.exe c:\music\our\nautilus\titanik\titanik.mp3

(если текущий каталог \winamp)

Суть понятна?

Полный путь (от корневого каталога) называется абсолютным путем.
Неполный путь (от текущего каталога) называется относительным путем.

Текущий каталог (какой бы он ни был) имеет в системе свое обозначение: "." (точка). Например, команда cd . сделает текущим каталогом ... текущий каталог. Точка "." редко используется при указании пути (отделение имени от расширения не считается), ее просто опускают. Так, .\titanik.mp3 эквивалентно titanik.mp3 .

Вы, наверное, заметили, что я забыл сказать о том, что подкаталоги в спецификации файла отделяются друг от друга левым (обратным) "слэшем"("\")

Знаете, родительский каталог тоже имеет свое обозначение - ".."(две точки). Введя команду cd .. , мы перейдем в родительский каталог, т.е. поднимемся на один уровень вверх в структуре каталогов. Использование двух точек - очень гибкий инструмент.

Пусть, текущим будет каталог с песней "Титаник". Мы можем отсюда (из текущего каталога) указать на песню "Winding Me Up". Как? Используя "две точки", конечно.

Относительный путь к файлу alan7905.mp3:

..\..\..\foreign\parsons\eve\alan7905.mp3

Ну как мне вам объяснить суть относительных путей? Вернемся к аналогии путей к файлам и обычных адресов.

Допустим, мы находимся сейчас в России (текущий диск), в магазинчике хозтоваров по адресу Москва, Селезневская ул., дом 30 (текущий каталог). Девушка или молодой человек (выберите сами) вас спрашивает:
- Здесь, кажется, рядом станция метро Новослободская, не подскажете где она?

А Вы ей (ему) абсолютный путь:
- Конечно, подскажу: Россия, г. Москва,пересечение Селезневской и Долгоруковской улиц.

Она (он) спасибо Вам скажет, а вот, подумает что? Что бы Вы подумали?

Поэтому лучше подсказать относительный путь:
- Конечно, подскажу! Выходите на улицу (".."), и налево до пересечения с Долгоруковской улицей, 10 минут ходьбы.
- Спасибо! - обворожительная улыбка, ...

Мы обещали только свежее дыхание :-))

Домашнее задание 3: Загрузите ДОС или "Сеанс MS DOS" в Windows и поперемещайтесь по своим каталогам с помощью команды cd. Для того, чтобы узнать какие файлы находятся в текущем каталоге, используйте команду dir. Если список файлов не помещается на экран, используйте dir /p. Почитайте справку по известным Вам командам (например, dir /?) и разберитесь со всеми параметрами этих команд. Запоминать их не обязательно, главное знать, где искать их описание.

ПРОДОЛЖЕНИЕ СЛЕДУЕТ

Вторая часть беседы по файловой системе ДОС будет во второй части :-) выпуска. Он у нас сегодня сдвоенный, т.е. наоборот, раздвоенный, состоит из двух частей.

Также во второй части читайте историю про Интерпретатор и компилятор:-)

ДО Скорого !
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

С уважением,
Вячеслав Stac Мацнев mailto:stac@stacmv.net
25.09.00.



http://subscribe.ru/
E-mail: ask@subscribe.ru

В избранное