Программирование в ОС UNIX Обзор СОДЕРЖАНИЕ 1. Введение 2 1.1. Предистория 2 1.2. Простая формулировка философии системы UNIX 4 2. Инструментарий ОС UNIX. Где о нем можно прочитать 5 2.1. Какие инструменты описываются в данном Руководстве 5 2.2. Shell как средство изготовления прототипов 6 3. Три вида программистов 8 3.1. Программисты-одиночки 8 3.2. Прикладные программисты 9 3.3. Системные программисты 9 1. ВВЕДЕНИЕ В 1983 году Кен Томпсон и Деннис Ритчи были удостоены Премии Тьюринга Ассоциации Пользователей Вычислительных Машин (ACM) за разработку операционной системы UNIX. В аннотации, в частности, говорилось: Успех системы UNIX основывается на удачном выборе нес- кольких ключевых идей и их элегантной реализации. Бла- годаря системе UNIX появилось поколение разработчиков программного обеспечения с новой идеологией программи- рования, основой которой является многократное исполь- зование имеющихся программ. Должны ли программисты, использующие ОС UNIX, интересоваться тем, что делали Томпсон и Ритчи? Имеет ли это сегодня какой-ли- бо смысл? Это необходимо, поскольку понимание идеологии, зало- женной в проект системы, а также знание атмосферы, в которой проходила ее реализация, способствует наиболее быстрому ее ос- воению. 1.1 Предистория Возможно, Вы уже читали о том, что первоначально реализация но- вой операционной системы, впоследствии названной UNIX, проводи- лась группой Кена Томпсона и Денниса Ритчи на неиспользуемом компьютере DEC PDP-7, стоявшем в коридоре AT&T Bell Laboratori- es. Причем целью этих работ было построение удобного окружения для собственного использования. Никто не собирался разрабаты- вать операционную систему, способную завоевать мировую извест- ность. Интересно проследить последовательность, в которой реализовыв лись различные элементы операционной системы. Сначала была построена простая файловая система, не имеющая древовидной структуры. Затем она была организована как система каталогов и файлов. Говоря о файлах, необходимо подчеркнуть две основные идеи. Во-первых, в ОС UNIX данные, программы, каталоги и даже физические устройства рассматриваются как файлы того или иного типа. Во-вторых, сам файл понимается как одномерный массив байт, лишенный какой-либо другой структуры. Очевидность и прос тота такого подхода способствовали построению удобного окруже- ния как для программистов, так и для других пользователей. Следующая идея состояла в том, чтобы рассматривать выполняющие- ся программы как процессы. При этом каждый процесс может порож- дать другой и обмениваться с ним информацией. В результате та- кого подхода стало естественным разделение сегментов команд между несколькими процессами (это является характерной особен ностью ОС UNIX). Наконец, когда были реализованы команды для различных действий с файлами и ассемблер для генерации выполняемых программ, сис тема уже могла автономно функционировать. Следующим важным шагом было приобретение компьютера DEC PDP-11 и установка на нем новой операционной системы. По мнению Ритчи это была большая удача, поскольку PDP-11 была очень хорошей ма- шиной и успех самого компьютера в определенной степени спо- собствовал признанию операционной системы, ставшей известной под названием UNIX. К 1972 году в системе была реализована возможность организации межпроцессных каналов (такого способа связи, при котором вывод одного процесса становится вводом другого). Операционная систе ма была переписана на языках более высокого уровня (сначала на языке B, затем C) и получила название UNIX, придуманное Брай- аном Керниганом. Таким образом, задача, поставленная Томсоном и Ритчи, то есть построение удобного программного окружения, была выполнена. Стоит отметить, что реализация ОС UNIX проходила в атмосфере, существенно отличающейся от той, в которой разрабатывается большинство операционных систем, имеющих коммерческих успех, когда дюжины талантливых программистов напряженно работают в обстановке абсолютной секретности, причем сроки завершения ра- бот бывают очень жесткими. В противоположность такому подходу, ОС UNIX созревала примерно в течение десяти лет. С самого нача- ла она привлекла внимание большого числа замечательных специа- листов, многие из которых использовали систему для проведения собственных разработок, с одной стороны, и внесли свой вклад в ее развитие, с другой стороны. Начиная с 1971 года система стала использоваться внутри AT&T Bell Laboratories, а вскоре (в 1974 году) стала продаваться колледжам и университетам, причем цена была невысокой и никакой поддержки не предполагалось. Эти, так называемые исследователь- ские версии, нумеровались арабскими цифрами, начиная с 7. Иног- да они самостоятельно развивались и обогащали систему новыми элементами. Например, широко известный экранный редактор vi был добавлен к системе Уильямом Джоем из Университета Беркли. В 1979 году, согласно коммерческим требованиям, AT&T начала пос- тавлять поддерживаемые версии ОС UNIX. Они нумеровались римски- ми цифрами, и кроме того, часто снабжались номером модификации. Например, текущая версия называется UNIX System V Release 3.1. Версии ОС UNIX, поставляемые AT&T сейчас, разрабатываются в обстановке, более типичной для промышленного производства прог- раммного обеспечения. Совершенствование системы происходи ответ на требования рынка. Тем не менее, система по-прежнему выражает передовую идеологию ее разработчиков, и несет отпеча- ток университетской атмосферы, в которой они работают. Это свойство системы часто называют ее философией, имея в виду спо соб использования UNIX'а опытными программистами. 1.2. Простая формулировка философии системы UNIX В течение всего времени разработки программ в операционной сис- теме UNIX держите в поле зрения девиз: | * * * * * * * * * * * * * * * * * * * * * * * * * * | * * | * Используйте труд других программистов! * | * * | * * * * * * * * * * * * * * * * * * * * * * * * * * В отличие от компьютерных окружений, в которых разработка новых проектов обычно начинается с нуля, в ОС UNIX значительная часть работы уже проделана и хранится, ожидая использования, в ката- логах /bin, /usr/bin, а также /etc. Особенности ОС UNIX (каналы, процессы, устройство файловой сис темы) способствуют многократному использованию программ, что подтверждается историей разработки самой системы, восходящей к 1969 году. Вы рискуете не понять сути системы UNIX, если не бу дете в своей работе использовать эти ее особенности. 2. ИНСТРУМЕНТАРИЙ ОС UNIX. ГДЕ О НЕМ МОЖНО ПРОЧИТАТЬ Термин инструментарий ОС UNIX требует некоторого уточнения. В наиболее узком смысле он означает фрагменты существующего прог- рамного обеспечения, используемые как компоненты для построения новых программ. В более широком смысле этим термином может обозначаться совокупность самых различных элементов ОС UNIX, таких как утилиты, программы, команды, языки, функции и т.д. Путаница может возникнуть, и часто возникает, из-за того, что многие из упомянутых элементов системы действительно могут ис- пользоваться как компоненты для построения новых программ. 2.1. Какие инструменты описываются в данном Руководстве В Руководстве программиста описываются инструменты, используе- мые для создания программ в окружении ОС UNIX. Заметим, что в руководстве описываются не все имеющиеся инструменты. Возможно, что неописанные инструменты окажутся даже более важными для Вас, тем не менее у нас нет возможности написать обо всем. Кратко перечислим, что именно будет описано, а что - нет. Не описанные в данном руководстве инструменты: Процедура входа в систему. Редакторы ОС UNIX. Организация файловой системы. Программирование на shell'е. Информацию об этом можно найти в Руководстве пользователя, а также в других доступных книгах. Описываемые в руководстве инструменты можно классифицировать следующим образом: Утилиты для получения выполняемых программ. Утилиты для организации разработки программного проек- та. Специализированные языки. Инструменты для отладки и анализа программ. Компоненты языков высокого уровня, не являющиеся частью их синтаксиса, например, стандартные библиотеки, сис- темные вызовы и функции. 2.2. Shell как средство изготовления прототипов Всякий раз, когда Вы входите в ОС UNIX, Вы используете shell. Shell - это интерактивный интерпретатор команд, позволяющий взаимодействовать с ядром ОС UNIX. Но это лишь одно из примене- ний shell'а. Shell может быть использован как язык программиро- вания. Программы на этом языке в дальнейшем будут называться shell-процедурами. Shell-процедуры могут иметь разветвленную структуру, из них можно запускать процессы. В языке имеются средства для обработки исключительных ситуаций, а также для пе- реназначения ввода и вывода. Таким образом, shell является пол- ноценным языком программирования. Одним из достоинств shell'а является возможность организации так называемых конвейеров - цепочек команд, которые будут вы- полняться одна за другой таким образом, что вывод предыдущей команды является вводом следующей. В конвейерах может использо- ваться большинство команд, описанных в Справочнике пользовате- ля, поэтому время, затраченное Вами на изучение Справочника пользователя, безусловно окупится. Просмотрите этот Справочник, и, возможно, Вы найдете команду, которая, будучи употребленной с нужными опциями, решит трудную программистскую проблему. Чем больше команд станет Вам известно, тем в большей степени Вы сможете воспользоваться возможностями ОС UNIX. В данный момент мы не будем заниматься обучением программирова- нию на shell'е. Подчеркнем лишь ту важную роль, которую может играть shell при разработке макетных образцов крупномасштабного программного обеспечения. Действительно, несмотря на то, что изучение shell'а со всеми его нюансами является достаточно сложной задачей, на получение shell-программ требуется гораздо меньше времени, чем на разработку программ на обычных языках высокого уровня. Благодаря возможности быстрого получения работающих программ, shell является мощным инструментом при разработке программного обеспечения. Применение shell'а позволяет использовать труд других в максимальной степени, так как при программировании на shell'е можно легко и эффективно комбинировать различные компо ненты. На shell'е часто удается запрограммировать даже большие прикладные программные системы. Даже если такое программирова ние выполняется с целью получения макетного образца программной системы, предназначенного лишь для проверки ее целей, могут быть сэкономлены многие месяцы работы. Действительно, имея та- кой макетный образец, можно определить диапазон возможных поль- зовательских ошибок, что не всегда легко проделать на стадии проектирования программной системы. Кроме того, макет позволяет отработать реакцию системы при некорректном вводе пользователя. Таким образом, можно избежать большого объема работ по исправ- лению ошибок, возникших на стадии проектирования разрабатывае мой программной системы. В заключении заметим, что из shell-процедур можно обращаться как к программам, написанным на обычных языках программирова- ния, так и к стандартным командам ОС UNIX. Это удобно, так как часто с помощью имеющихся инструментов можно выполнить какие- либо действия, записав всего пару строк вместо полуторастранич- ной программы на каком-либо языке. 3. ТРИ ВИДА ПРОГРАММИСТОВ Как уже говорилось, мы будем различать три категории UNIX-прог- раммистов, используя в качестве критерия вид разрабатываемых ими программ. Заметим, что эта классификация не основана на квалификации или опыте программистов. Действительно, высококва- лифицированные программисты, имеющие многолетний опыт, могут быть иногда отнесены к категории программистов-одиночек. С дру- гой стороны, программисты с относительно небольшим опытом рабо- ты могут участвовать в коллективах, создающих прикладное или системное программное обеспечение. 3.1. Программисты-одиночки Программисты этой категории пишут программы только для того, чтобы облегчить выполнение своей основной работы. Полученные ими результаты могут быть помещены в фонд программ, доступных коллективу, в котором данный программист работает. Это похоже на то, как развивалась сама ОС UNIX: кто-то изготавливает по- лезный инструмент и затем использует его совместно с остальными членами организации. Программисты данной категории могут не иметь внешних требований к программам, работать без соавторов и без какого-либо управления их деятельностью. На процесс созда ния программы влияет только сама задача, решаемая программис- том. Одним из факторов, способствующих наличию программистов данной категории, является то, что ОС UNIX является системой с разделением времени. Действительно, сотрудники, умеющие раммировать, могут решать свои проблемы, минуя процедуру офици- ального одобрения их проектов и не ожидания в течение месяцев, когда штатные программисты напишут программы. Программистам данной категории необходимо знать, как: Выбирать подходящий язык программирования. Компилировать и выполнять программы. Использовать системные библиотеки. Анализировать программы. Отлаживать программы. Отслеживать версии программ. Большая часть информации, необходимой для выполнения этих дей- ствий, содержится в следующей главе. 3.2. Прикладные программисты Программисты данной группы разрабатывают программные системы, которыми будут пользоваться непрограммисты. Разработка крупной прикладной системы требует участия целых коллективов програм- мистов. Членами таких коллективов могут быть сотрудники как фирмы-заказчика, так и фирмы-разработчика. Заметим, что некото- рые программисты, занятые разработкой прикладного программного обеспечения, в большей степени занимаются организацией процесса разработки программ, а не собственно программированием. Информация, необходимая программистам данной категории, включа- ет все темы следующей главы, а также: Системы управления программным обеспечением. Блокировку файлов и сегментов. Межпроцессное взаимодействие. Разделяемую память. Усовершенствованные методы отладки программ. В этой связи настоятельно рекомендуем изучить том, посвященный Интегрированной Среде Разработки Программ (ИСРП). 3.3. Системные программисты Это программисты, занятые в разработке программных средств, яв- ляющихся частью операционной системы, или тесно с ней связан ных. Такая деятельность может включать создание драйверов новых физических устройств, разработку систем управления базами дан- ных или совершенствование ядра системы. Программистам этой ка- тегории, кроме знания исходных текстов операционной системы, необходимо тщательно изучить всю доступную документацию по ОС UNIX.