Рубрики
Без рубрики

Java мертва – Да здравствует Java

Краткая история и будущее Java. С пометкой java, новички, карьера.

Ява мертва. Покиньте тонущий корабль, Котлин, голанг, что бы это ни было, выучите другой язык!

Это действительно так?

Давайте сначала посмотрим на историю. Я занимаюсь разработкой Java примерно с 2005 года, начиная со встроенных устройств, запрограммированных в J2ME . Java SE (или J2SE) уже была в версии 1.5, но в J2ME язык был совместим с Java 1.3, и поддерживалось только подмножество JDK. Например, у него даже не было никаких реализаций карты.

На момент написания этой статьи Java 13 уже была выпущена, и это было адское путешествие. Начиная с Java 1.3 за последние 17 лет у нас появились подобные функции, которые были добавлены:

1.4 Регулярные выражения, неблокирующий ввод-вывод
5.0 Дженерики, Аннотации
6.0 Расширения компилятора JAX-WS, JWM +
7.0 Поддержка динамических языков
8.0 Лямбды, потоки, необязательно
9.0 Модульная система, Оболочка
10.0 ключевое слово var, Грааль
11.0 Запуск Java-файлов, таких как скрипты
12.0 Переключать выражения
13.0 Текстовые блоки, обмен данными о классе

NIO по-прежнему является основой неблокирующих и реактивных веб-фреймворков. Без аннотаций аспектно-ориентированное программирование, которое, например, использует Spring framework , было бы невозможно. Расширения компилятора сделали возможным Ломбок . Лямбды, потоки и необязательные приблизили Java к функциональному стилю программирования (хотя это все еще не функциональный язык) и позволили сократить количество шаблонов. Выражения переключения – это небольшой шаг на пути к сопоставлению шаблонов (см. раздел ниже). А поддержка динамических языков позволила или, по крайней мере, упростила внедрение динамически типизированных языков, таких как Ruby и Python, в JVM.

Источники:

Когда мы говорим о “Java”, на самом деле мы должны говорить о виртуальной машине Java (JVM) и языке Java.

Когда вы запускаете приложение Java, исходный код Java ( *.java ) сначала должен быть скомпилирован в байт-код Java ( *.class ), который одинаков на всех платформах, отсюда и слоган “Напиши один раз, запускай везде” . Байт-код оптимизирован для быстрой интерпретации и выполнения вместо прямой интерпретации исходного кода Java, как это делается с помощью JavaScript напр.

Сама JVM представляет собой специфичную для платформы реализацию (например, Linux, Windows, Mac) среды выполнения Java. В основном он берет ранее сгенерированный байт-код и запускает его в целевой среде. В ранних версиях Java интерпретация байт-кода была относительно медленной. Начиная с Java 1.3, виртуальная машина Hotspot , которая является компилятором JIT (JIT), стала по умолчанию. Он идентифицирует код с высокой частотой выполнения (т.Е. “горячую точку” в коде) и компилирует байт-код в машинный код, что намного быстрее.

С тех пор многие умные люди в Sun/Oracle улучшили JVM, чтобы она была чрезвычайно быстрой. И под “чрезвычайно быстрым” я подразумеваю сопоставимый или даже более быстрый, чем эквивалентная реализация C++, потому что JIT может генерировать более оптимизированный машинный код на основе известного процессора и знаний о фактическом коде и потоке данных во время выполнения.

Именно по этой причине экосистема JVM процветает, подготавливая почву для целого набора новых языков, которые компилируются в байтовый код Java:

  • Заводной
  • Клоджур
  • Джитон
  • Скала
  • Котлин

Существует длинный и растущий список других .

Недавно я нашел это на своей временной шкале в твиттере:

Ошибка жидкости: внутренняя

Это выглядит потрясающе, не так ли? Во-первых, давайте посмотрим, что это такое. Это процент вопросов, заданных об этом языке в этом месяце. Итак, Котлин – относительно новый и к тому же популярный язык, в этом нет сомнений. Поэтому, естественно, многие люди задают вопросы.

Но подождите… одного языка не хватает! А как насчет Java?

Таким образом, у Java все еще примерно в 10 раз больше вопросов, чем у Kotlin, который прошел Scala. А как насчет популярности?

Источник: Индекс TIOBE

Несмотря на то, что график снижается, Java по-прежнему остается № 1 (я знаю, я знаю, результаты TIOBE спорны). Давайте посмотрим, где находятся Котлин и Скала… Ранг 30 и 35 соответственно.

Хорошо, а как насчет возможностей трудоустройства ? Как программисту Java, вам не придется долго искать, чтобы найти достойно оплачиваемую работу в отрасли. Могут быть языки, которые обеспечат более высокую зарплату, но их труднее найти.

Так что не поймите меня неправильно: я люблю новые языки, особенно когда они привносят новые концепции, которые немного расширяют ваш кругозор и подталкивают другие языки к более быстрой адаптации. Иди и изучи их!

Я выучил и использовал множество разных языков, начиная с BASIC, Pascal, Ассемблера, C, C++, заканчивая Erlang, Scala и Python, а в последнее время и машинописью.

Несколько лет назад, например, Scala была сильно раскручена. Люди говорили, что он собирается заменить Java. Хотя у Scala есть некоторые очень привлекательные функции, в конечном итоге это не так.

В настоящее время Kotlin также сильно раскручен. У него есть некоторые стратегические преимущества по сравнению со Scala, поскольку его продвигают как JetBrains (создатели IntelliJ), так и Google (Kotlin – это язык для разработки Android), что позволило ему быстро набирать обороты. И это, безусловно, отличный язык. Но, как и в случае со Scala, я не верю, что она заменит Java.

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

Поэтому в следующий раз, когда вы услышите такие новости, как “Mega Corp. использует новый язык XYZ”, это не значит, что это делает вся компания. Может быть, это всего лишь одна или две команды из 100 000 сотрудников. Когда новый язык обладает “этой замечательной новой функцией”, которой нет в Java, это не значит, что он может легко заменить Java, JVM, сообщество и инструментарий Java.

Так почему же Java так успешна?

На мой взгляд, это результат нескольких различных факторов:

  • Язык относительно прост в освоении и имеет такой же синтаксис, как C и C++.
  • Язык относительно стабилен, обратно совместим (Java 9, о, Java 9)
  • Он все еще способен адаптироваться к новым парадигмам и технологиям
  • JVM – чертовски быстрая среда выполнения (см. Выше)
  • Многие крупные компании ведут свой бизнес на ИТ, что просто означает: Возможности трудоустройства (см. выше)
  • Вы практически найдете любую проблему уже решенной в виде библиотеки с открытым исходным кодом с лицензиями, разрешающими коммерческое использование
  • Инструментарий довольно хорош

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

Уже есть пара подробных статей, поэтому я просто кратко упомяну их здесь.

Ткацкий станок

На мой взгляд, Project Loom является одним из наиболее изменяющих игру дополнений к JVM и языку. На первый взгляд это может показаться довольно неинтересным: взгляд принесет “Волокна”, иначе говоря. облегченные потоки для JVM. Так зачем беспокоиться?

В отличие от потоков, вы можете запускать миллионы волокон с низким объемом памяти на одном ядре. Используя волокна, вы можете создавать продолжения и оптимизации конечных вызовов, которые, в свою очередь, позволяют создавать неблокирующий код, который выглядит синхронным, но не блокирует поток. Это означает отсутствие кода, загроможденного цепными обратными вызовами или наблюдаемыми, как это обычно бывает, например, в vert.x или RxJava. Я писал об этом здесь:

Я писал об этом здесь:

Грааль

Грааль – еще один кандидат на то, чтобы изменить правила игры, на мой взгляд. Грааль на самом деле не является ни одной “вещью”. Существует компилятор виртуальной машины Graal, который реализует новый API расширения компилятора JVM для замены существующего JIT-компилятора компилятором JIT, написанным на простом Java. Затем есть собственный образ GraalVM, который позволяет компилировать Java-код в собственный двоичный файл, что может значительно сократить использование памяти и увеличить время запуска приложения с секунд до миллисекунд.

Хотя это звучит потрясающе, и вы уже можете попробовать, это все еще находится на ранней стадии. Я попробовал это сам, и он был далек от того, чтобы быть готовым к производству или даже просто простым в использовании. Это плохо сочетается с фреймворками или библиотеками, которые часто используют отражение (Spring, Hibernate). Без дальнейшего понимания Graal скомпилирует приложение Spring Boot с JPA в собственный образ с помощью обходного пути, который просто объединяет и запускает JVM и JDK в образе, что не дает вам вышеуказанных преимуществ.

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

Это может позволить использовать Java-приложения в областях, где golang в настоящее время сияет, и быстрый запуск и низкое использование памяти являются обязательными.

Янтарь

Проект Amber переносит классы данных и запечатанные типы в Java. Это языковая функция, которая пытается сократить шаблонный код, необходимый при создании POJO: некоторые поля, геттеры, сеттеры. Это позволит вам написать что-то вроде точка записи(int x, int y) { } .

Функции, которые предлагает Amber, также облегчат реализацию сопоставления с образцом.

Есть пара идей для сопоставления с образцом . Первым был переключатель выражений, который был выпущен в качестве предварительного просмотра с Java 12, что позволило напрямую назначить результат выражения переключения переменной напр.

Сопоставление шаблонов в instanceOf упростит работу с неизвестными типами и сделает приведение типов в instanceOf устаревшим.

Затем происходит деконструкция объекта, которая позволяет извлекать части объекта или списка в его компоненты:

int eval(Node n) {
    return switch(n) {
        case IntNode(int i) -> i;
        case NegNode(Node n) -> -eval(n);
        case AddNode(Node left, Node right) -> eval(left) + eval(right);
        case MulNode(Node left, Node right) -> eval(left) * eval(right);
    };
}

Это заменяет большой объем кода, который был бы необходим для реализации вышеизложенного.

И что было бы действительно здорово, так это сопоставление шаблонов в методах (не уверен, что это запланировано):

    int multiply(0, int b) { return 0}
    int multiply(int a, 0) { return 0}
    int multiply(int a, int b) { return a * b}

Валгалла

Проект Valhalla пытается разрешить неизменяемые (отлично подходит для параллелизма) объекты без ссылок. Массив, например, в настоящее время представляет собой список ссылок на его значения, а не список самих значений. Это также позволит использовать примитивные типы (такие как int например) как универсальные типы. Например. Список вместо Список<Целое число> .

Итак, в заключение, я, честно говоря, не думаю, что Java мертва. У него активное сообщество, богатая экосистема, включающая инструменты, множество библиотек и фреймворков, он способен адаптироваться и развиваться, будучи при этом обратно совместимым (в основном), и он по-прежнему широко используется в отрасли.

Фотография на обложке от Shoot N’ Design на Unsplash

Оригинал: “https://dev.to/stealthmusic/java-is-dead-long-live-java-19bl”