Итак, начнём с главного - где же место под Солнцем для 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 режиме поддерживается множество процессоров.
Параллельное программирование (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)