Итак, начнём с главного - где же место под Солнцем для Inferno, где и как имеет смысл применять Inferno. Нет, на роль десктопа или сервера я Inferno не предлагаю, эти теплые места в данный момент заняты. :) Но есть минимум три задачи, с которыми Inferno справится лучше других.
-
Распределённые вычисления и Grid (благодаря протоколу Styx доступ к локальным и удалённым ресурсам ничем не отличается, что позволяет очень просто писать распределённые системы).
-
Гомогенная среда (приложение написанное на Limbo будет гарантированно одинаково работать и под виндой, и под юниксом, и на встроенных устройствах).
-
Встроенные устройства (Inferno поддерживает множество процессоров и устройств… возможно Inferno уже работает внутри Вашего гаджета, просто вы об этом не подозреваете :)).
Но лично меня Inferno в первую очередь привлекает не этими возможностями, а элегантностью и простотой архитектуры, которая позволяет решать мои задачи значительно проще и элегантнее чем в других системах/языках. Причём я здесь имею в виду самые обычные задачи, никак не связанные ни с распределёнными вычислениями, ни с прочими основными возможностями Inferno!
Простота.
-
Вся существующая документация по системе в общем и по программированию на Limbo была мной прочитана за 4 дня, включая почти полностью аналог секций 2 (системные вызовы) и 3 (библиотечные функции) man-документации! Правда, читал я часов по 18 в день. :) И это связано не с плохой документированностью системы, а с её простотой!
-
Inferno содержит очень немного кода, по сравнению с другими системами. Причём код полностью открыт. Это даёт реальную возможность детально разобраться в системе и изменять/исправлять её самостоятельно, если авторы откажутся вносить какие-то изменения/исправления.
Я сейчас посчитал через 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).
Ссылки по теме.
-
http://citforum.ru/operating_systems/inferno_programming/ (плюс в конце этой статьи ещё куча полезных ссылок)
-
http://powerman.name/Inferno/ (мой сайт, там есть русская дока по Limbo)