Inferno

20 март, 2002 - 00:00Андрей Зубинский
Предваряя все, что будет сказано, автор спешит попросить читателя не воспринимать материал ни как призыв, ни, упаси Бог, как агитку. Мы просто попробуем ознакомиться (насколько это возможно в небольшой статье) с по-своему замечательной и уникальной программной системой, интересной хотя бы потому, что для нее не подходят ни привычные программистские мерки, ни маркетинговые шаблоны, ни общепринятые неформальные оценки. Она не "suxx" и не "rulezz", не образчик "самых передовых технологических решений" и, наконец, -- не "стержень будущего IT-индустрии". И все же она заслуживает внимания...
Непривычность темы и глубокая симпатия к ней автора буквально вынуждают прибегнуть и к приему непривычного изложения -- статья будет изобиловать цитатами и краткими отступлениями, на первый взгляд, совершенно отдаленными от "компьютерной" тематики. К счастью, никакого способа изменить форму изложения отыскать не удалось -- скупое перечисление "якобы достоинств" и "вероятно, недостатков" для проекта класса Inferno просто невозможно.

Итак, знакомьтесь -- операционная система Inferno, она же -- виртуальная машина, она же -- middleware, она же -- язык программирования, она же -- целый набор концепций, философия, квинтэссенция почти 35-летнего опыта борьбы с демонами сложности и падшими ангелами "требований пользователя".



Стереотипы must die

Естественно, в начале знакомства надо сразу оговорить приводящую в ужас маркетологов "инфернальность" терминологии Inferno. Названия самой системы и ее подсистем заимствованы разработчиками ОС из бессмертного европейского литературного памятника -- "Божественной комедии" Данте Алигьери. Это произведение писалось в мрачные времена в тяжелых условиях, но было и остается... комедией или даже фарсом. Так что как раз в таких "инфернальных" названиях кроется специфический юмор программиста-практика, который "земную жизнь пройдя до половины" (что соответствует 35-летнему опыту работы, если допустить такое толкование "Божественной комедии"), очутился в "сумрачном лесу, утратив правый путь во тьме долины".

"Я думаю, что computer science, достигшая зрелого возраста, становится кровосмесительной: людей обучают люди, думающие односторонне. В результате так называемые "ортогонально мыслящие" встречаются все реже и реже...".

Кен Томпсон


Мы уже много говорили с читателем и о "сумрачном лесе" чрезмерной сложности современного ПО, и о поисках "правого пути" в разработке программ. И опыт, если хотите -- школа, Inferno позволяет не просто продолжить наше обсуждение, но и "опереться на плечи" таких гигантов, как Брайан Керниган, Кен Томпсон, Деннис Ричи, которые уже прошли 35-летнюю отметку практического проектирования и реализации программных систем в исследовательском центре Bell Labs -- ведь именно этой знаменитой команде мы обязаны появлением на свет ОС Unix, Plan9 и Inferno.

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


Дантов Ад и... детские игрушки

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

Чего только не "мерещилось" компьютерной индустрии за прошедшие годы. "Серебряные пули" отливались с невиданной интенсивностью, как при мировой войне с вампирами в голливудском блокбастере. Java обещала "кофеизацию" всего, CORBA -- единую и всеобъемлющую компонентную среду, C# -- революционную замену так и не свершившей никаких революций Java, XML -- решение чуть ли не всех проблем унификации форматов данных, VRML -- 3D-революцию в Internet, VLIW -- немыслимое повышение производительности процессоров. Список можно продолжать долго. Страх перед сложностью, зависимостью от платформы и, наконец, перед требованиями рынка повелевал умами, похоже, вовсю. Свершения вышли из моды -- их заменили "решения". Для борьбы со сложностью стала повышаться... сложность, уникально-универсальные технологии оказались применимыми только в определенных областях или вообще неприменимыми, "серебряные пули" изрядно потускнели.

Сложность ПО стала настоящим Дантовым Адом -- со своими "кругами", бесконечными мучениями и "скрежетом зубовным" разработчиков. И по сравнению с этим Адом, маленький скромный "адик" Inferno из Bell Labs уже не кажется таким страшным.

"Если вы дадите мне подходящий конструктор Tinker Toy, я могу представить собранное из него здание. Я могу сидеть и смотреть на примитивные конструкции и осознавать их мощь для создания гигантских строений, для этого мне нужно только одно -- функциональная полнота набора примитивов... <Но> я не могу представить детали конструктора, созерцая здание. <Поэтому,> когда я вижу описание по принципу "сверху вниз" <программной> системы или языка, содержащих бесконечное число библиотек, специфицированных слой за слоем, все, что я вижу, -- это болото. Я не могу ни почувствовать конструкцию как единое целое, ни понять, как взаимодействуют ее части, -- я вообще не могу понять то, что подается мне как заведомо Очень Сложное. Возможно, я делаю то, что делаю из-за того, что сделай я это сложнее, чем оно есть, я просто бы не смог понять сделанного".

Кен Томпсон

InfernoКонструктор Tinker Toy -- Unix, Plan9 и Inferno образца 1913 г. Представим, что соединительные шайбы Tinker Toy -- это крохотные утилиты, а штыри -- pipes, и можно начинать "строить". Удивительно изящному даже с точки зрения математика Tinker Toy, на который ссылается один из самых заслуженно именитых практикующих программистов и проектировщиков ПО, мы можем быть обязаны и очевидным соображением-предупреждением: детские игры исключительно важны в формировании личности.


Круг первый -- Лимб

Стеснилась грудь моя от тяжкой боли
При вести, сколь достойные мужи
Вкушают в Лимбе горечь этой доли.

В первом круге Дантова Ада -- Лимбе, "размещались" все некрещеные младенцы и добродетельные нехристиане. В первом круге Inferno -- Limbo, уготовано место всем, кто или не успел пройти обряд крещения изучением мультипарадигменного программирования на C++, или не утратил добродетели прижизненным использованием Delphi, Visual Basic или, упаси Бог, COBOL. Короче говоря, как и любой хороший "еще один" уникальный язык программирования, Limbo позволит "достойным мужам" вкусить горечь доли сполна -- ведь эта яркая, интересная разработка существует исключительно в рамках ОС Inferno. Нетривиальность Limbo начинается с... размеров реализации -- программа транслятора содержит всего 12 тыс. строк тщательно выверенного на предмет мобильности ANSI C. Цифра эта смехотворна -- в подобный размер сегодня уже с трудом "умещаются" сугубо утилитарные полуигрушечные программки.

Inferno Что же такого примечательного умудрился прошедший все круги компьютерного Ада знаменитый Деннис Ричи "утрамбовать" в 12 тыс. строк? Надо сказать, много чего. Limbo унаследовал массу замечательных черт одного из своих предшественников -- C, в первую очередь -- компактность, лаконичность и выразительность многих исключительно удачных синтаксических конструкций неувядающего "ассемблера высокого уровня". От второго предшественника -- Modula 2 -- Limbo унаследовал куда более прозрачный по сравнению с C синтаксис объявлений данных (в форме "имя : тип;") и полноценную реализацию модулей. От третьего предшественника -- Oberon -- Limbo перенял встроенную реализацию абстрактного типа данных adt и очень простую объектную модель. И даже от знаменитого и созвучного по названию "инфернальному" оттенку статьи языка Ada Limbo достались очень удобные способы описания срезов (слоев) массивов. И все это разнообразие в Limbo дополняется исключительно специфическими для ОС Inferno особенностями -- весьма умным "сборщиком мусора", не требующим от программиста заботы об освобождении ранее выделенной памяти, встроенным типом "канал передачи данных", выражениями, описывающими передачу/получение данных через канал и коммутирование каналов в зависимости от степени готовности. Ну и наконец, очевидное: Limbo -- язык со строгой типизацией и очень ограниченным применением указателей, без потенциально опасной адресной арифметики.

Итак, при всем этом буйстве возможностей Limbo, содержащий 41 ключевое слово, представляется очень простой грамматикой, а исчерпывающая документация, написанная самим Д. Ричи, в html-формате, отнимает до неприличия несолидные 140 KB дискового пространства...

Глядя на лежащую на столе стопку проштудированных книг: тысячестраничный "Вводный курс C++" С. Липпмана, почти тысячестраничное третье издание "Языка программирования C++" Б. Страуструпа, пятисотстраничное "с примерами приложений" второе издание Г. Буча и библейского формата талмуд "Advanced CORBA programming" о тех же тысяче страниц, хочется или ненормативно, но емко выразиться, или обратиться за помощью к Данте:

Таков был я на темной крутизне,
И мысль, меня прельстившую сначала,
Я, поразмыслив, истребил во мне.

Ведь один крохотный язык Limbo со смешного размера реализацией позволяет делать все то же самое, что и две самые серебряные пули современности -- только делать это намного проще, удобнее, понятнее и, что главное -- быстрее. И это не реклама -- автор статьи может заверить читателя, что не торгует и не собирается торговать ОС Inferno -- это наблюдение, полученное экспериментальным путем за несколько месяцев "ковыряний" в Limbo.


На границе нижнего Ада

И властный муж, меня сопровождавший,
Сказал: "Не бойся; нашего пути
Отнять нельзя; таков его нам давший".

Inferno
В "модели Данте" город Дит (по латыни -- Dis) своими крепостными стенами и окружающим болотом отделял Лимб от ужасов "нижнего Ада". В модели Inferno роль Dis аналогична -- виртуальная машина Dis, на основе которой строится вся система, отделяет программиста и пользователя от ужасов "нижнего мира" -- различий в аппаратных средствах, системах команд разнообразных целевых платформ Inferno. При этом Dis является и настоящим "центром" ОС -- и транслятор Limbo генерирует исключительно коды Dis-машины, и сама ОС способна запускать исполняемые файлы исключительно Dis-формата. Последний факт также хорошо согласуется с "моделью Данте", где Дит играет роль центра подземного царства.

Архитектура Dis являет собой наглядный пример овеществленного результата "ортогонального мышления". Тогда как самые "ходовые" виртуальные машины основываются на стековой модели (что оправдывается существенным упрощением разработки трансляторов), Dis -- типичный представитель, если так можно сказать, традиционных процессоров. Причем процессоров, явно попадающих в категорию CISC, -- со сложной системой команд. "Сложна" она не по критериям сложности описаний или реализации, а в соответствии с принятыми в классификации CPU терминами -- Dis не имеет регистров, и все машинные команды оперируют содержимым оперативной памяти и являются потенциально трехоперандными. Вместо пространных объяснений лучше всего привести описание типовой команды, например сложения с усечением результата до 8 бит:

addb а_оп_1, а_оп_2, а_рез,

которая на "человеческом" языке означает буквально следующее -- "сложить содержимое ячейки оперативной памяти с адресом а_оп_1 с содержимым ячейки с адресом а_оп_2 и разместить младшие 8 бит результата в ячейке с адресом а_рез".

Язык ассемблера Dis насчитывает около 160 команд, которые можно разделить на, условно говоря, "традиционную" и "высокоуровневую" группы. К "традиционной" группе относятся команды пересылки, сложения, вычитания, умножения, деления, битовых сдвигов и управления потоком вычислений -- условных и безусловных переходов, селектора (перехода по одному из множества адресов), вызова подпрограмм. "Высокоуровневые" команды позволяют выполнять сложные операции с UNICODE-строками (например, конкатенацию строк) и автоматическим управлением памятью, с потоками выполнения (threads), со списками и массивами, с преобразованием типов данных (например, допустимой строки в число и наоборот), с модулями (загрузка модуля, представленного байт-кодом Dis) и, наконец, с высокоуровневыми примитивами межпроцессного взаимодействия Inferno -- каналами. По большому счету, виртуальная машина Dis является не только (и не столько) главным исполнительным механизмом системы, но и очень удачной виртуализацией... базовой библиотеки языка Limbo. Это решение можно смело отнести к еще одному примеру "ортогонального мышления", проявленного в ходе проектирования Inferno, -- виртуализация такого уровня позволяет действительно освободить прикладного (да и системного) программиста от массы забот.

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

Кен Томпсон


Но расплатой за виртуализацию всегда являлась эффективность. И здесь Inferno готовит приятный сюрприз -- система изначально проектировалась с учетом и поддержкой реальной (а не потенциальной) возможности трансляции байт-кода Dis в систему команд целевого процессора. Характер Dis-машины позволяет весьма эффективно реализовать "традиционные" команды "родными" командами множества разнообразных процессоров, а отсутствие виртуальных регистров в Dis освобождает реальные регистры процессоров для эффективного "микропрограммного" воплощения "высокоуровневых" команд. Что подтверждается высокой мобильностью системы в целом -- на сегодняшний день она портирована на компьютеры с процессорами MIPS, ARM, StrongARM, PowerPC, 68000 (без аппаратных средств управления памятью), 680x0, x86 и SPARC. По оценкам специалистов, неоднократно проводивших процедуру портирования, она требует порядка нескольких человеко-месяцев квалифицированного программистского труда, что в современных условиях никого не пугает.


Стикс

Посла небес в идущем признавая,
Я на вождя взглянул; и понял знак
Пред ним склониться, уст не размыкая.

Протокол Styx в мире Inferno и есть тот самый "посол небес", достойный беспрекословного уважения. Именно на него, являющегося незначительной вариацией протокола 9P ОС Plan9, возложено решение главной задачи, поставленной перед собой разработчиками: объединение множественных частей в единое целое с помощью чистой, простой и минимальной концепции. И, естественно, настало время с этой концепцией ознакомиться. В Inferno (как и в Plan9) весь дизайн системы подчинен трем основным принципам:

все программные интерфейсы отображены на файлы иерархической файловой системы;

допускается группирование различных интерфейсов-файлов для построения высокоуровневых абстракций -- пространств имен;

все операции над интерфейсами-файлами прозрачно выполняются с помощью протокола Styx.

Несмотря на простоту, главная концепция Inferno требует дополнительного пояснения. И мы попробуем рассмотреть ее с трех точек зрения -- программиста, пользователя, имеющего опыт работы в ОС Unix (не боящегося командной строки), и, наконец, неподготовленного пользователя, предпочитающего графический интерфейс.

С точки зрения программиста, ничего проще реализации поддержки главной архитектурной особенности Inferno быть не может. Фактически все сложности "упрятаны" за одним вызовом функции Limbo file2chan, которая "отображает" канал связи на файл с указанным путем в файловой системе. Дальше действия тривиальны и соответствуют общепринятым в минималистской модели трех ОС (Unix/Plan9/Inferno) -- из этого файла можно читать и в него можно записывать данные, можно временно заблокировать выполнение потока программы до момента готовности второй стороны и т. д. Для Limbo-вызова file2chan существует аналог более высокого уровня -- "подстегиваемый" модуль интерпретатора командного языка Inferno, позволяющий создавать отображенные на файлы интерфейсы и без "низкоуровневого" программирования.

Даже если учесть несущественные на нашем уровне знакомства нюансы, то можно смело утверждать, что для применения магического средства, превращающего любую программу в компонент, способный взаимодействовать с другими компонентами распределенной системы на основе ОС Inferno, никогда не понадобятся титанические усилия. И это замечательно -- простота системы дает возможность наконец заняться изучением самого необходимого -- прикладной области, что в какой-то мере позволяет надеяться на разрешение противоречий между реальной и требуемой процессом разработки ролью программиста.

"Существует очень мало людей, которые по-настоящему и проектируют, и реализуют программные проекты. Большинство специалистов -- маленькие шпильки в больших организациях, они или проектируют, но не могут реализовать проект, или реализуют его, но не допущены к проектированию, или не понимают <из-за сложности> всего проекта в целом...".

Кен Томпсон


С точки зрения подготовленного пользователя, концепция Inferno также выглядит крайне привлекательно, но при соблюдении одного важного условия -- существовании действующего Inferno-окружения (в идеале -- тотального). Идеализируя ситуацию, можно получить, например, следующую модель взаимодействия пользователя с компонентной средой Inferno:

предположим, что где-то очень далеко от Пользователя находится Очень Мощный Компьютер (ОМК), на котором, естественно, установлены ОС Inferno и уникальное ПО, скажем, расчетного класса -- например, аэродинамических расчетов. Эта программная система располагает множеством отображенных на файлы интерфейсов, размещенных в каталоге Aerodynamics:

Aerodynamics/вход_данных
Aerodynamics/результаты

Где-то еще дальше, на другом Достаточно Мощном Компьютере (ДМК), в свою очередь, установлено ПО визуализации данных, способное заменить кошмарное количество цифр одной понятной человеку картинкой. В файловой системе ДМК интерфейсы этой программы располагаются в каталоге Visualizer:

Visualizer/вход_данных
Visualizer/результаты

Дома у Пользователя установлен сетевой многофункциональный принтер-сканер-копир (под управлением ОС Inferno, естественно), который в каталоге Printer предлагает следующие интерфейсы:

Printer/команды_управления
Printer/вход_печати
Printer/статус_принтера

Ну и наконец, наш выдуманный Пользователь -- настолько серьезно подготовленный, что предпочитает работать на природе, вооружившись карманным компьютером (естественно, Inferno-компьютером) с беспроводным каналом связи. Впрочем, постоянное рабочее место у него имеется, где в каталоге файл-сервера находится недавно созданная математическая модель, требующая объединения всего этого программного "разнобоя" в единое целое (пусть в файловой системе она расположена так: WorkDir/modell). Для решения задачи Пользователь, в принципе, должен знать минимум команд Inferno, а точнее, целых три: mount, bind и cat. Сначала он "монтирует" (импортирует) файлы-интерфейсы разных программ удаленных компьютеров и устройств в локальную файловую систему своей карманной "рабочей лошадки", затем командами bind формирует некоторое пространство имен (с названием, например, Task). После этого остается выполнить минимум действий -- скопировать файл с математической моделью из рабочего каталога Task/WorkDir, передать его на вход программы расчетов Task/Aerodynamics/вход_данных, выход этой программы соединить со входом визуализатора, направив результат на принтер, установленный дома. Выглядит вся эта "адская кухня" более чем просто (если учесть, что команда cat копирует содержимое файла в стандартный поток вывода, а команда ">" перенаправляет стандартный вывод в некоторый файл):

cat Task/WorkDir/model > Task/WorkDir/Aerodynamics/вход_данных
cat Task/WorkDir/Aerodynamics/результаты > Task/WorkDir/Visualizer/вход_данных
cat Task/WorkDir/Visualizer/результаты > Task/WorkDir/Printer/вход_печати

Мудреного в этих процедурах ничего нет. А для неподготовленного пользователя или просто для удобства выполнения часто повторяющихся однообразных действий ко всем этим процедурам в Inferno можно элементарно "приделать" графический интерфейс, заменив кнопками, селекторами и привычной навигацией по древовидному представлению файловой системы языковое взаимодействие.

Короче говоря, решить задачу оказалось возможным с минимальными усилиями, и модель Inferno, похоже, подходит всем и во всем: программистам -- простотой реализацией распределенных сервисов, пользователям -- простотой утилизацией возможностей распределенной компонентной модели. Остается одно "но" -- Inferno требуется повсюду. Впрочем, и это "но" весьма условно -- ОС может работать в так называемом "гостевом" режиме как обычная задача под управлением одной из "классических" операционных систем, перечень которых весьма обширен, -- Windows NT/2000/XP, Linux, FreeBSD, Solaris.

Для полноты картины без последнего замечания не обойтись, и касается оно графической подсистемы Inferno. В отличие от своей старшей сестры -- ОС Plan9, в Inferno не используется ничего особо уникального или "нетрадиционного" для отображения графики. Собственно графическая подсистема представляет собой модификацию... знаменитого Tk -- неотъемлемой части проекта Tcl/Tk, при этом программные интерфейсы сохранены (для облегчения жизни имеющим опыт в работе с Tk программистам) и самым корректным образом отображены на возможности системы.


Pura Potenza

Потупя взор и бодрости лишен,
Он шел, вздыхая, и уста шептали:
"Кем в скорбный город путь мне возбранен!"

Комедию Алигьери завершает настоящий happy end в добротных голливудских традициях. Наше же короткое путешествие в мир Inferno придется оборвать минорными аккордами. Система, несомненно, хороша, распространяется на более чем лояльных условиях -- полные исходные тексты и право без отчислений использовать ОС в любых разработках обходятся в условную, по меркам коммерческого ПО, сумму -- от $150 для индивидуальных пользователей до $1000 для корпоративных. Некоторые компании основывают на этой ОС свои серийные изделия -- в первую очередь, "умные" Web-телефоны, но Inferno так и остается "чистой возможностью" (pure potenza).

"Операционные системы должны нести слишком тяжелый багаж. Сегодня, если вы хотите добиться чего-нибудь значимого в области ОС, то должны конкурировать с Microsoft. Это значит, что вы взваливаете на себя непосильную ношу не только ОС, но и всех броузеров, редакторов, офисных пакетов... Если вы создадите лучшую ОС, никому из актуальных пользователей компьютеров не будет дела до совершенства системных интерфейсов: интерфейс пользователей -- это броузер и офисный пакет. И даже в случае реализации вами наилучших системных интерфейсов для самой расширяемой и мобильной ОС в мире на эту замечательную систему понадобится портировать прикладные программы, на разработку которых затрачены тысячи человеко-лет и исходные тексты которых недоступны.

Кен Томпсон


В чем причины такой ситуации, когда при одновременно наблюдаемом росте популярности разнообразных "гэджетов" и практически идеальных характеристиках и доступности Inferno для этого сегмента рынка система остается невостребованной? Судить трудно. Тем более трудно, анализируя не слишком богатое событиями прошлое ОС -- крах консорциума Inferno, развал программ портирования на игровые консоли, абсолютная утрата интереса прессы, неприятие системы в первую очередь сообществом пользователей Linux (прежде всего из-за массовости и "альтернативного" характера Linux-движения) по причине "небесплатности" и "несовершенства" ОС. О "настольных" вариантах Inferno-терминалов (а почему бы и нет?) уже речь и не идет. И все это очень грустно...