Почти полное совершеннолетие. 20 лет Java

3 июнь, 2015 - 18:39Андрей Зубинский

Избежать повторений в любых «именинных речах» крайне трудно. Но попробую. Обязательные банальности, конечно, не удастся оставить в стороне, сокращу их до одного абзаца (об истории Java написано столько, что уже ничего не умножить).

За 20 лет Java из набора «язык – виртуальная машина – библиотеки» со всего тридцатью разработчиками превратилась в набор системообразующих платформ очень разных «миров» IT с примерно девятью миллионами вовлечённых специалистов и, тоже очень примерно, с семимиллиардной инсталляционной базой. Достигнутую степень «распыления» Java-технологий по платформам разных вычислительных масштабов и характеристик можно смело называть уникальной – от 16-битовых встраиваемых вычислителей до 64-битовых нод суперкомпьютеров. Ещё удивительнее очевидный факт – попытки создания аналогов Java, куда более поздние (при доступности всей информации об особенностях, недостатках и достоинствах проекта Java и его эволюции), не смогли повторить и доли её успеха. Увы, не всегда помогает стоять на плечах гигантов, оказывается. И, уж, что вовсе удивительно – несмотря на колоссальные масштабы проекта, на довольно долгий период заметного снижения темпов его развития, несмотря на смену собственника и совершенно неявную, непрямую схему монетизации «конкретного мира Java как основы конкретного IT-мира», проект оказался потрясающе живучим. Восьмая версия Java (и седьмая – Java EE), ожидающаяся девятая версия – тому подтверждение. В общем, даже самые скептики, даже самые злые критики, вынуждены согласиться – когда мы говорим о Java, мы говорим об уникальном мире, состоящем из уникальных систем. Если говорить о критике Java, надо сразу отделить профессиональную критику (она не особо на слуху, потому что требует глубинного понимания) от «критики из низов». Не надо обижаться, дорогие кодировщики. В новой реальности IT, особенно в её «сугубо производственной части», где и сосредоточена основная масса программистов «новой волны» (динамические языки, Python, Ruby etc, ещё и со специализацией на конкретных ферймворках), не возникает ни малейшего удивления от явного противоречия – почему «Java – это кошмар», но написанное на этом кошмаре нечто (например, основанное на IntelliJ IDEA), оно такое удобное, что стало де-факто стандартом среды разработки в совершенно других мирах. И почему же это «нечто» так «сравнительно легко» адаптируется разработчиком к потребностям и специфике совершенно разных миров, достаточно бросить беглый взгляд в миры Eclipse, Netbeans и IntelliJ IDEA. «Сравнительно легко» не эвфемизм, это единственно возможная оценка результатов работы проектов – на базе Eclipse созданы рабочие среды чуть ли не для чего угодно (диапазон – от Bioclipse, среды для биологов, биохимиков etc, до сугубо «хипстерских», извините, IDE для Node.js, и дальше – до громадных инструментов системного проектирования вроде IBM Rational или более доступного Modelio), Netbeans стала основой собственной среды проектирования одной из ведущих embedded компаний Microchip, а уж на базе IntelliJ IDEA сделали чуть ли не что угодно «сугубо программистское», заслуженно высоко оцененное что в мире Python-программистов (PyCharm), что в мире JavaScript (WebStorm), что в мире Ruby (причём в сочетании с фреймворком Rails, RubyMine) что даже в мире C/C++ программистов (CLion). И мало у кого из разработчиков не-Java миров возникает самый простой вопрос – почему же, всё-таки, эти большие сложные и действительно полезные и удобные инструменты созданы не на моём любимом «xxx» (Python, Ruby, JavaScript, C++), а на «ужасной, кошмарной, медленной Java», и как так получилось, что все эти проекты – очень «долгоиграющие», со стабильным развитием? Я специально выбрал из бездны прекрасных Java-приложений характерные «пользовательского уровня», иначе было бы совсем сложно.

В общем, в свои 20 лет Java находится в расцвете сил, квалифицированные программисты пользуются спросом, большие написанные на Java «mature» системы живут и развиваются, постоянно появляются новые разработки, причём во всех мирах, ведутся битвы за чистоту стандартов, работает огромная машина развития Java, JCP (Java Community Process) и т.д.

Будем считать предыдущие два абзаца обязательными и заслуженными юбилейными дифирамбами, но мир Java не был бы самим собой, если бы состоял исключительно из озарённых какой-то таинственной истиной поклонников. Система потому и игнорирует любые мрачные прогнозы и нападки (мир программистов в этом похож на мир высокой моды), что отличается, мягко говоря, очень высоким требуемым для профессиональной работы отношением знаний-умений к лояльности. Именно из-за этой специфики даже тематические выступления «самого главного в Oracle по Java» были больше похожи структурой на традиционные «аналитические программистские статьи» - что хорошо, что плохо, что ужасно. Не буду их повторять, желающие или давно их прочитали сами, или легко найдут по ключевым словам «Georges Saab» (вице-президент Java Development Group, Oracle), «20 years celebration». Позволю себе поговорить о том, что прозвучало очень лаконично, но, по моему скромному мнению, исключительно важно для развития Java (которую не берусь сказать, что «знаю», это исключительно дерзкое заявление, но некоторые её подсистемы умею и люблю).

Когда Джордж Сааб говорит о том, что ужасно, о фактической утере Java сегмента «насыщенных браузерных приложений» (а это, увы, факт – начиная с версии 26 в Firefox Java-плагин отключен по умолчанию, Google планирует вообще исключить поддержку Java в Chrome, браузеры от Microsoft вообще вовлечены в затянувшуюся борьбу конкурирующих платформ), речь идёт о косвенных последствиях временного провала в разработке Java, начавшегося ещё при Sun и какое-то время продолжившегося при переходе Java во владение Oracle. Но эта проблема, самая серьёзная в судьбе проекта, уже фактически решена. Позади – успешная битва с выявляющимися чуть ли не каждый день уязвимостями (был такой период), позади – критически серьёзные модификации JVM (виртуальной машины), окончательно превратившие Java в мультиязычную платформу с поддержкой динамических языков. Это действительно громадные проекты, ещё и крайне требовательные ко времени. И вот складывается странная ситуация – радикально «пролеченная» Java одновременно резко увеличивает свою привлекательность для роли системообразующей платформы «настольных» и «насыщенных web» приложений, но тут как раз встроена стена, возведенная обоснованно испуганными за свои пользовательские аудитории, «браузеростроителями».

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

Во-первых, есть безукоризненный успех ОС Android. Во-вторых, есть очень вялое и бесформенное «развитие» ОС Linux как системы для рабочих станций. В-третьих, есть явный процесс «обновления» Microsoft, как системообразующей компании мира «персональных вычислений», и в этом процессе будущая судьба «рабочих станций» выглядит, мягко говоря, странно.

С другой стороны, в мире Java уже есть высочайшая насыщенность повторно используемым кодом очень высокого качества (это подтверждённый практикой факт), превосходный «родной инструментарий», отличная кросс-платформенность и виртуальная машина, позволяющая «жить и работать в мире Java, вообще не зная языка Java», и, наконец, новый мир соответствующей современности основой подсистемы пользовательских интерфейсов JavaFX (и сопутствующих инструментов, например, таких, как Gluon).

Надо быть очень ленивым или боязливым, чтобы не сложить события двух миров, о которых безусловно знают «отцы процесса разработки Java», и не задаться вопросом – решится ли Oracle, когда и в какой форме, возобновить проект «Java Desktop» (унаследованный от Sun) и попытаться повторить успех Android в «персональных вычислительных системах, более предназначенных для создания, чем для потребления контента» (пришлось так сложно объяснять термин «рабочая станция», потому что набившая оскомину аббревиатура PC уже просто ничего не обозначает)? Похоже, это та сверхзадача, которых давно в судьбе Java не было.

Как бы там ни было, будет ли возвращение Java Desktop, не будет ли его, развитие «core Java», ядра всех платформ, идёт своим ходом. Ожидающаяся в следующем году девятая версия должна принести то, чего так давно ждали все в Java-мире – сквозную модульность системы (проект Jigsaw). Это колоссальной сложности задача, если учесть масштабы Java и объёмы сторонних наработок. Несмотря на сложность, она решается, и, похоже, будет решена в срок. К важным ожидающимся изменениям следует отнести и фундаментальную реформацию системы типов, на всех уровнях – от невидимых прикладным программистам абстракций Java-машины до языка и библиотек. Проект Valhalla ставит перед собой именно такую задачу – дополнить два фундаментальных семейства типов, примитивов (их всего восемь) и агрегативных, новым третьим семейством value-типов. Это настолько важное изменение Java, что позволю себе отнять время читателя на объясняющее отступление.

В современной Java все объекты могут быть или примитивами (и это грубое нарушение «чистоты объектно-ориентированной парадигмы»), или агрегативными. Примитивы не содержат того, что в ООП называет object identity (и для чего в русскоязычной википедии, конечно же, нет статьи). Память аггрегативным объектам (которые, естественно, все с object identity) выделяется в «куче» (heap), любому объекту, в том числе и «упакованному в ящик» (boxed) только что примитивному. Object identity на протяжении всего жизненного цикла объекта требует дополнительных полей данных (в том числе, массива переменного размера для хранения ссылок на этот объект, это очевидно необходимо для работы «сборщика мусора»). Соответственно, для простых агрегативных объектов с небольшим числом собственных полей данных накладные расходы (в терминах машинных ресурсов) получаются сравнительно большими. В Java с этим очень долго мирились, предпочитая концептуальную чистоту всех конструкций битвам за производительность. И очень долго такой подход был вполне оправдан «законом Мура» и постоянным снижением стоимости физических вычислителей. Но вот, кажется, и «закон Мура» давно перестал быть «законом» (которым, конечно, никогда не был), и Java уже нацеливается на сегмент «малых вычислителей» (в том числе, для IoT, об этом чуть позже), и наступила пора появления в Java аггрегативных объектов без object identity. А ими, если совсем немного подумать, могут быть только неизменяемые (Immutable) объекты (в противном случае мы можем создать копию неизменяемого объекта, изменить в оригинале одно или несколько полей, и получить уже два разных объекта, для различения которых требуется object identity). Любой Java-программист умеет объявить простой агрегатный неизменяемый объект (например, с помощью ключевых слов final в объявлении класса, его полей и методов), но проблема в том, что алгоритмы JVM в общем случае не способны идеально распознавать неизменяемые объекты, максимум что в общем случае получается сделать надёжно и без возможных неявных девиаций в работе программы – «упаковать в ящик» (неявный boxing) final-поля, при этом сам «ящик» остаётся полноценным объектом с identity. Не опускаясь глубже в детали – поддержка разных value-типов, включая некоторые агрегативные (кортежи, курсоры etc), в Java будет. Как и эффективная поддержка на уровне JVM операций с этими типами. Так что, поклонники функционального программирования (разве не о нём мы говорим, когда говорим о фундаментально неизменяемых объектах), вас ждёт много интересного – новые возможности JVM без внимания разработчиков новых языков для платформы не останутся.

Теперь немного о том, без чего в 2015 году любая статья IT-тематики – не статья. Конечно, об IoT. Так неожиданно получилось, что не очень умные мобильные телефоны, предшественники первых «смартфонов», сейчас, по сути, являются типовыми… IoT-вычислителями. Уберите корпус «для человека», кнопки и экран – останется малопотребляющий 32-битовый вычислитель и, грубо говоря, GSM-модуль. Вполне работоспособная и законная «IoT-машинка». И в мире таких вычислителей, которых промышленность наделала миллиарды, долго царствовала Java ME, «обрастая» наработками, подсистемами, библиотеками etc. Было бы удивительно, если бы в Oracle всего этого не рассмотрели. И вот тихо-тихо, но Connected Limited Device Configuration (CLDC), описание требований к аппаратно-программной платформе Java ME, добралось до микроконтроллеров ARM Cortex M4, и реализация Java ME для этой платформы также доступна. И, похоже, ограничиваться этим в Oracle не собираются.
Как бы подводя итоги. В следующем году Java станет полностью совершеннолетней. Те фундаментальные изменения, которые обещаны, реализуются и ожидаются Java-сообществом, без сомнения станут основой интересных и важных трансформаций, значимых для всей индустрии.