POWERMAN
"In each of us sleeps a genius...
and his sleep gets deeper everyday."

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

  • Распределённые вычисления и Grid (благодаря протоколу Styx доступ к локальным и удалённым ресурсам ничем не отличается, что позволяет очень просто писать распределённые системы).

  • Гомогенная среда (приложение написанное на Limbo будет гарантированно одинаково работать и под виндой, и под юниксом, и на встроенных устройствах).

  • Встроенные устройства (Inferno поддерживает множество процессоров и устройств… возможно Inferno уже работает внутри Вашего гаджета, просто вы об этом не подозреваете :)).

Но лично меня Inferno в первую очередь привлекает не этими возможностями, а элегантностью и простотой архитектуры, которая позволяет решать мои задачи значительно проще и элегантнее чем в других системах/языках. Причём я здесь имею в виду самые обычные задачи, никак не связанные ни с распределёнными вычислениями, ни с прочими основными возможностями Inferno!

Простота.

  • Вся существующая документация по системе в общем и по программированию на Limbo была мной прочитана за 4 дня, включая почти полностью аналог секций 2 (системные вызовы) и 3 (библиотечные функции) man-документации! Правда, читал я часов по 18 в день. :) И это связано не с плохой документированностью системы, а с её простотой!

  • Inferno содержит очень немного кода, по сравнению с другими системами. Причём код полностью открыт. Это даёт реальную возможность детально разобраться в системе и изменять/исправлять её самостоятельно, если авторы откажутся вносить какие-то изменения/исправления.

    Note Я сейчас посчитал через find и wc объём всех .c и .h-файлов: соответственно 750000 строк в 15MB и 100000 строк в 3.5MB - это код самой OS под все платформы (и native и hosted!), драйверов, виртуальной машины и компилятора Limbo - для сравнения, только ядро линуха занимает на порядок больше. Весь прикладной софт и библиотеки написаны на Limbo, и занимают 500000 строк в 10MB.
  • Для запуска вашего Limbo-приложения на, например, linux-сервере потребуется скопировать на сервер 3 файла Inferno общим размером 1.1MB, :) ваше приложение и необходимые ему библиотеки (если используются).

  • Ну и самое главное - архитектурная простота. Но эту тему я хочу раскрыть отдельно, она этого заслуживает!

Эффективность.

  • Очень лёгкие нити: можно создавать нити тысячами и десятками тысяч и система при этом отлично и быстро работает (если я ничего не путаю, они для экономии памяти сделали динамическое выделение памяти для стека нитей а-ля heap).

  • JIT. Вообще Dis (виртуальная машина) работает достаточно шустро. Но для достижения максимальной эффективности в Inferno есть поддержка JIT, т.е. байт-код на лету компилируется в native-коды того процессора, на котором исполняется. Причём байт-код Dis изначально проектировался так, чтобы упростить JIT-компиляцию для большинства существующих процессоров.

Переносимость.

  • Байт-код. Компилируем один раз, дальше запускаем под любой Inferno - не важно, native или hosted и на каком процессоре всё это запущено. Авторы Inferno гарантируют одинаковую работу приложений на любой системе.

  • В hosted режиме поддерживаются все популярные OS.

  • В native режиме поддерживается множество процессоров.

Язык Limbo.

  • Параллельное программирование (concurrent programming).

  • Для синхронизации потоков используется развитая идея Hoare’s Communicating Sequential Processes (CSP), что очень сильно упростило программирование. (Кстати, на эту тему можно посмотреть Google TechTalk Роба Пайка.)

  • Сильнотипизированный.

  • Поддержка кучи высокоуровневых фич (tuples, alt, etc.). Эту тему я тоже буду раскрывать отдельно. :)

Безопасность.

  • Доступ ко ВСЕМ ресурсам, и локальным и удалённым осуществляется через протокол Styx. А в Styx встроена поддержка авторизации, аутентификации и шифрования в стиле SSL-сертификатов. Таким образом безопасность обеспечивается на этапе администрирования системы и выдачи сертификатов, в приложении, как правило, ничего специально для безопасности уже программировать не приходится.

Возможные ограничения (мои личные наблюдения).

  • Пока нет поддержки unix socket, но есть шанс что скоро её добавят.

  • Каждый блокирующий syscall в host OS (линух/винду/etc.) выполняется в отдельной нити, чтобы не блокировать работу всего Inferno. При большом кол-ве блокирующих сисколов одновременно (напр. сервер на котором одновременно висит и делает I/O 10000+ клиентов) могут быть проблемы.

  • Нет поддержки полу-закрытых сокетов (т.е. нельзя послать на удалённую сторону EOF с помощью shutdown(SHUT_WR) не закрывая сокет. И не будет. Потому, что это, как мне объяснили, идеологически неправильная вещь. :)

  • Я не уверен, но возможно SSLv3 поддерживается не полностью. Т.е. он есть, по https:// на сайты заходить можно, но возможно не все фичи реализованы.

Надо отметить, что большинство этих ограничений можно обойти благодаря одной фиче Inferno: есть возможность запускать процессы host OS и взаимодействовать с ними. Т.е. я могу, например, из приложения на Limbo вызвать линуховый perl-скрипт, передать ему данные и считать от него данные. Я с помощью этой фичи уже обеспечил себе доступ из Limbo к unix socket-ам (очень хотелось из Limbo писать в syslog).

Ссылки по теме.