Как добавить новую фичу в язык Java? Ответ — Project Amber

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

У меня очень много свободного времени, поэтому я начну издалека. Как вообще можно улучшить ваш язык програаммирования? Ну, способов несколько:

  • Написать библиотеку, которая в будущем станет дефакто частью stdlib. Примеров много — Boost в C++, Underscore в JavaScript, или Guava в Java.
  • Написать плагин к компилятору вашего языка, или сделать что-то с помощью метапрограммирования. Примеры тут — это всё тот же Boost в C++, или Lombok в Java.
  • Самое интересное — внести изменения в сам язык. Это возможно далеко не для всех языков, но в случае с Питоном, Плюсами и Java — это вполне реально. Тут есть стандартизованные Enhancement Proposals, в которых вы можете попытаться доказать, что ваше изменение — нужно языку. В Python это называется PEP, а в Java — JEP.

Что я вообще захотел добавить в язык Java? Короткий ответ — Either monadhttps://medium.freecodecamp.org/a-survival-guide-to-the-either-monad-in-scala-7293a680006.

Почему я вообще решил попробовать это сделать? Ответов, на самом деле, несколько:

  • В Java выполняется работа над реализацией Pattern matching. Первый шаг был сделан в Java 12 — https://openjdk.java.net/jeps/325. Either и Pattern matching смотрятся, как единое целое. Они дополняют друг друга.
  • Большое количество людей плюется из-за Checked Exceptions: достаточно несколько уровней вызовов методов с Проверяемыми исключениями, и вот у вас в коде самый общий Exception, который ничего не говорит про случившуюся ошибку.
  • Уже существует несколько 3-d party реализаций Either. Из-за это приходится постоянно конвертировать разные Either друг в друга — это не удобно. Примеры реализаций — http://www.vavr.io/vavr-docs/#_either, или https://bitbucket.org/atlassian/fugue/src/b0868a00273f8f2ccf5d1a2610a8a5507ce641c4/fugue/src/main/java/com/atlassian/fugue/Either.java?at=master&fileviewer=file-view-default.
  • Общаясь с разными Java-разработчиками, я постоянно слышу, как было бы здорово иметь Either в языке. Ведь монаду Optional добавили в язык, и это супер полезный инструмент, которым мы все пользуемся. Почему бы не добавить и вторую популярную монаду?

В общем, я решил попробовать добавить Either в язык. Ну, либо узнать, почему это невозможно сделать.

Небольшое отступление. Как вы, наверное, знаете, в Java-мире есть несколько крупных Проектов, в каждом из которых решается какая-то большая задача языка или виртуальной машины:

  • Project Panama — сделать более простой и дешевый интероп между Java и другими языками программирования, например, C/C++.
  • Project Loom — реализация платформы, которая позволит сделать в языке Легкие треды, Зеленые потоки, корутины — не важно, как вы это назовете, важна суть — нам нужна более легковесная абстракция, чем Поток операционной системы.
  • Project Amber — анализ и реализация новых фич, направленных на повышение продуктивности разработчиков, в языке Java.
  • Project Valhalla — анализ и разработка фич внутри виртуальной машины. Например, Value Types.

Собственно, добавление в java монады Either — это ровно Project Amber. Ведь это чисто языковая фича, никак не связанная с виртуальной машиной.

Перед тем, как создавать JEP, нужно провалидировать свою идею. Для этого, вам нужно зарегистрироваться в email рассылки проекта Amber — https://mail.openjdk.java.net/mailman/listinfo/amber-dev. Далее, вы можете предложить свою идею, отправив вопрос на почту — amber-dev@openjdk.java.net.

Вот вопрос про добавление Either — https://mail.openjdk.java.net/pipermail/amber-dev/2019-April/004291.html. Как вы можете видеть, там дан отказ. Причем, ответил один из главных Архитекторов по разработке Java языка — Brian Goetz.

Причины отказа:

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

Что же. Отказ — это тоже результат. Вполне мог быть и игнор, что ещё хуже. В любом случае, мы хотя бы узнали официальную позицию Архитекторов, и теперь можно жить с этим знанием дальше. Из положительного — получилось увидеть чучуть лучше, как устроен процесс разработки Языка, что тоже очень интересно.

Категории: Программирование