Про операционные системы

В ходе обсуждения пользовательских привычек и механизмов их формирования у [info]infowatch плавненько перешли к обсуждению разнообразных принципов, реализованных внутри разных операционных систем. Мне кажется, что для ноосферы в целом будет скорее полезно описать мои взгляды на проблему.

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

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

Перейдем к более содержательным примерам. Для начала — в духе книжки 1958 года «Автоматические цифровые машины«. Ввод здесь — это записанная на перфокартах последовательность команд, вывод — распечатка с цифрами. В разделе этой брошюры, посвященном описанию процесса программирования, описывается шесть команд некоей вычислительной машины. И уже эти шесть команд, вместе с правилами их записи, называются «языком» — пока в кавычках. В более современной литературе это слово вполне заслуженно пишется без кавычек, а «классические» примеры языков, на которых пользователь общается с компьютером — это «текстовые» языки — командная строка Unix, REPL в Lisp-системах, языки программирования типа C/C++/Java/whatever. Тут комментарии, в общем, не требуются. Скажу лишь только, что эти языки пытались даже исследовать методами лингвистики — и вполне успешно. Что более сложно — так это восприятие в качестве «языка» графического пользовательского интерфейса. Но если задуматься — то это тоже язык, состоящий из простых надписей и пиктограмм.

В принципе, сейчас мы вплотную подошли к одному из фундаментальных свойств операционной системы. Все современные компьютеры (за довольно редким исключением) недалеко ушли в плане «машинного языка» от существовавших в 1958 году. Но «язык», на котором пользователь общается с машиной изменился до неузнаваемости. Не нужно набирать программу с помощью кучи тумблеров или пробиванием перфокарт. Не нужно, в большинстве случаев, заниматься «программированием». Более того, программирование распалось на «низко-» и «высокоуровневое». Можно прекрасно пользоваться современным компьютером, умея лишь тыкать мышкой или даже пальцем в нужные места на «экране». Можно предположить, что в компьютере живет «что-то», что принимает ввод на одном языке, переводит его на «машинный», а затем — проделывает обратный процесс с «ответом». Это «что-то» и называется «операционной системой». Вот, скажем, определение из книжки Таненбаума:

С точки зрения пользователя операционная система выполняет функцию расширенной машины или виртуальной машины, для которой проще программировать и с которой проще работать, чем с аппаратным обеспечением.

Замечу, что оговорка о «виртуальной машине» очень важна — в очень многих случаях «языки» ввода и вывода в машине, реализуемой с помощью операционной системы, не являются «расширениями» таковых на аппаратном уровне. При этом о ней иногда попросту забывают — например, заголовок раздела, где приводится это определение, у Таненбаума звучит «Операционная система как расширенная машина». В этом определении можно дойти до определенного «экстремизма». Например, Windows с установленной Visual Studio — это отличная от «голой» Windows операционная система. Входной язык ее расширяется с помощью некоторого диалекта C++ — поэтому они и разные :) В принципе, ничему это не мешает — так что не будем заморачиваться.

Попробуем теперь описать «языки», которые поддерживает, скажем, относительно современный дистрибутив Linux «из коробки». Оказывается, что таковых — довольно много. Для начала — какое-то подобие машинного языка в исполняемых файлах. Затем — C (и даже C++) с POSIX и еще некоторыми расширениями. Обычно доступен и какой-нибудь «скриптовый» язык — типа Perl, Python — да хоть Emacs Lisp! Нельзя забывать и о языке командной строки, и о языке «коротких надписей и пиктограмм», реализованном в графическом интерфейсе пользователя.

Но все эти «языки» очень серьезно отличаются своими «базовыми» понятиями — в «машинном» языке речь идет о ячейках памяти, в C — о процедурах, переменных и структурах, в Emacs Lisp — о функциях, в командной строке — о каталогах, файлах и командах, в графическом интерфейсе — о папках и документах (несмотря на то, что рьяные линуксоиды отрицают существование последних двух понятий). Эти вещи поддерживаются в архитектуре операционной системы по-разному. Например, во всех Unix-подобных (читай «современных») ОС «файловая система» с файлами и каталогами — одна из фундаментальных частей архитектуры. А вот документы и папки из графического интерфейса — они реализованы с помощью файловой системы. Следовательно, применительно к «относительно современному дистрибутиву Linux» абстракцию «файловой системы» следует считать более «фундаментальной», чем абстракцию «рабочего стола».

В некотором смысле «наиболее фундаментальные» абстракции современной операционной системы лучше всего описываются с помощью языка, который можно условно назвать «C + POSIX» (Windows API с его понятиями тоже в некоторой степени похож на него). Но, как несложно догадаться, можно объявить «фундаментальным» любой более-менее приличный язык взаимодействия человека с компьютером и его абстракции взять за основу. Вернемся к примеру с «рабочим столом». В «оригинале» — как его видели в Xerox PARC — графический интерфейс типа «окошечки и значки» довольно сильно отлдичается от современных реализаций. На «рабочем столе» находятся значки, представляющие «папки» и «документы». При щелчке мышкой на значок либо «документ», либо содержимое папки показывается целиком, в виде «окна». Вроде бы все прекрасно? Но ровно до тех пор, пока кто-то не углядит параллелей между папками и документами с одной стороны и каталогами с файлами — с другой.

Разница между каталогом и папкой, может быть, и не так ужасна — благо в развитой ФС вполне можно представить и «виртуальные папки» Windows в виде каталогоа, но вот отличия файла в смысле Unix-подобной файловой системы и документа — просто катастрофические. Например, html-файл — это документ? А является ли он документом без кучки картинок (файлы jpg, gif и т. п.)? А один и тот же текст в Word, PDF и HTML — это один документ или три разных? А кучка html-файлов, представляющих собой страничку Васи Пупкина на narod.ru — это один документ или несколько? Можно дать ответы на эти вопросы в рамках абстракции «рабочего стола» — но тогда потребуется отказаться от кучи вещей, которые существуют в «файловой системе».

Ужасная катастрофа в области всех теоретических наработок в области операционных систем — это появление и триумф UNIX. Его довольно примитивные, расчитанные прежде всего на простоту реализации, решения стали определяющими во всех современных ОС. Более того, трудно даже помыслить «непохожую» на Unix операционную систему (за исключением разве что каких-то IBMовских динозавров). Например, замечательная концепция «обменивающихся сообщениями объектов» и весь связанный с ней объектно-ориентированный подход (в варианте Smalltalk, а не C++/Java) прекрасно ложатся на техническую реализацию в виде микроядерной ОС. Лямбда-исчисление Лиспа, одинаковое представление «программ» и «данных», изменчивость и первых, и вторых — это лисп-машины или Emacs. Да-да, последний тоже можно и нужно называть «операционной системой». Но «микроядро» в современном понимании превратилось в «еще одну реализацию Unix», лисп-машины — в Emacs, появившийся в Xerox PARC прекрасный пользовательский интерфейс с метафорой «рабочего стола» — в его ужасные подобия в Windows и нынешних Linux. Все более-менее жизнеспособные идеи попросту натягиваются на порой слабо совместимые с ними принципы Unix — а затем все голосят о «дырявых абстракциях».

Из более-менее современных ОС, предлагающих (да пусть даже и на «пользовательском» уровне) альтернативы Unix-подобной файловой системе можно назвать разве что PalmOS — с ее желанием «запихать все в базы данных», да Apple iOS — где над «файловой системой» надругались самым беспощадным образом. Но в сравнении с теоретическими разработками начала 80-х — это маленькое изменение.

Короче говоря, восприятие Unix как «единственно правильной» операционной системы остановило всякое «экстенсивное» развитие этой области Computer Science на десятки лет. «Интенсивное» развитие — то есть попытки сделать «еще лучший Unix» продолжается, но есть ли в нем смысл — я сказать затрудняюсь.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *