HPUNIX Сайт о ОС и не только!

Философия UNIX либо fork() vs CreateThread()

13 августа 2012 - unix
Философия UNIX или fork() vs CreateThread()

Вот уже вторую неделю в Москве царствует нестерпимая жара. Вентиляторы и кондюки в магазинах не отыскать, прохладительные напитки не помогают. Уровень желания работать (УЖР) по десятибалльной шкале — «ноль точка ноль», мысли путаются, кодинг не идет.

Потому нынешний пост будет «на философскую тему» и практически не будет содержать кода.

Идею для этого поста дали подсказку мне вы, дорогие читатели блога. Если б не ваши вопросы в комментах (почему wget, а не LWP и почему fork(), а не pthread_*), его бы точно не было. Либо он появился существенно позднее.

Так что огромное для вас спасибо!

Наверное вы понимаете либо по последней мере слышали о философии UNIX. Но если вдруг не слышали либо подзабыли, всегда можно ознакомиться с соответственной страничкой в Википедии. Согласно ей:

Философия UNIX — это набор культурных норм и философских подходов к разработке программного обеспечения, основанных на опыте ведущих разработчиков операционной системы UNIX.

Я бы произнес, «многолетнем опыте разработчиков ПО под ОС семейства UNIX».

Философия UNIX говорит:

  • Пишите программки, которые делают что-то одно и делают это отлично.
  • Пишите программки, которые бы работали вкупе.
  • Пишите программки, которые бы поддерживали текстовые потоки, так как это универсальный интерфейс.

Звучит любопытно, но как это работает на практике? Разглядим пример. Пусть у нас есть скрипт на Perl, который тянет некоторую страничку из веба и парсит ее.

Есть по последней мере два метода сделать это — использовать или утилиту wget (либо хоть какой аналогичный даунлоадер), или perl-модуль LWP. Здесь есть над чем пошевелить мозгами, так что обратимся к долголетнему опыту unix-программистов.

Так, давайте-ка поглядим. «Работать вместе», «использовать текстовые потоки» — похоже, что по философии UNIX необходимо сделать выбор в пользу wget. И вправду, wget имеет бесспорные достоинства перед LWP. Во-1-х, загрузить файл по протоколу HTTP либо FTP при помощи wget можно, написав всего только одну строку кода:

#!/usr/bin/perl
Философия UNIX или fork() vs CreateThread()
use strict;

my $data = `wget -q http://example.ru/ -O -`;

В случае же с LWP необходимо намного больше кода:

#!/usr/bin/perl
use strict;
use LWP::UserAgent;

my $ua = LWP::UserAgent->new;
my $q = HTTP::Request->new(GET => 'http://example.ru/');
my $data = $ua->request($q);

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

У wget на оба варианта предусмотрены особый ключи командной строчки — «-i» и «-r». А в случае с LWP нам придется писать дополнительный код и достаточно много.

Но как так вышло, что в модуле LWP не оказалось подходящих нам функций? Просто разработчики этого модуля не следовали философии UNIX, а мыслили приблизительно так: «Вряд ли это кому-то пригодится, а если пригодится, напишет самостоятельно».

Смотрите-ка, что происходит. Мы используем всего только одну программку (wget), которая делает что-то одно (качает файлы) и делает это отлично (ключи «-i» и «-r»). Прямо согласно «первому правилу» философии UNIX.

Используя wget в собственной программке, мы смогли значительно уменьшить объем кода, а означает и уменьшить время разработки, время отладки, сделать программку более обычный и понятной.

Вы спросите, как же быть, если мы желаем использовать наш скрипт как под UNIX, так и под Windows? Это будет не просто, но если установить wget.exe и сделать это верно, скрипт будет отлично работать и под Windows безо всяких конфигураций. Но здесь может появиться неувязка производительности.

Дело в том, что в Windows, в отличии от UNIX, создание нового процесса — достаточно «дорогая» операция. Мир Windows — это цельные приложения, динамические библиотеки, CreateThread() и семафоры, в то время, как мир UNIX — это маленькие утилиты, fork(), сигналы и пайпы.

Да, в Windows тоже есть пайпы и дочерние процессы, ровно как и в UNIX есть нити и библиотеки, и это позволяет более-менее комфортабельно писать кроссплатформенные приложения. Но идеология остается разной.

Так какая же идеология более успешная? Что прибыльнее для программистов и юзеров? Мне больше по нраву unix way, так как он проще. И следуя ему намного проще как писать программки, так и отлаживать их.

Программку, вызываемую при помощи fork-exec и имеющую ключ «-v» просто отладить даже без помощи gdb, а вот отыскать ошибку в многопоточном windows-приложении без OllyDbg бывает ой как не просто, я инспектировал! Мне время от времени даже кажется, что ООП, UML, отладчики и все другое выдумали только для Windows.

Желаю отметить, что все написанное — это только мое мировоззрение, человека, пару месяцев вспять закончившего институт. Не исключено, что когда-нибудь оно поменяется. И пожалуйста, поймите меня верно, я не фанатик философии UNIX.

Судя по тому, что Winodws Семь и Ubuntu — полностью для себя работоспособные операционки с кучей приложений, право на жизнь имеет любой из подходов.

Дополнение: См также заметки Чем неплох и чем плох Linux? и Аналоги Windows-программ для UNIX.

Похожие статьи

Теги: ос
Рейтинг: +11 Голосов: 153 1049 просмотров
Комментарии (0)

Нет комментариев. Ваш будет первым!

Найти на сайте: параметры поиска

Windows 7

Среда Windows 7 на первых порах кажется весьма непривычной для многих.

Windows 8

Если резюмировать все выступления Microsoft на конференции Build 2013.

Windows XP

Если Windows не может корректно завершить работу, в большинстве случаев это

Windows Vista

Если к вашему компьютеру подключено сразу несколько мониторов, и вы регулярно...