Вопрос или проблема
Я ищу язык программирования (т.е.: пакет компилятора и IDE), который вводит современные концепции удобства, такие как неявные преобразования, взаимозаменяемость присвоения/вызова, миксины, расширяющие методы, отбор функций, сопоставление шаблонов из Kotlin и Scala, НО полностью обратно совместим с Java.
Значение “обратно совместимый с источником”: Я могу взять устаревший Java код и работать с ним без изменений в новом языке, и ТОЛЬКО добавлять продвинутые функции в конкретные места, где я этого хочу.
Исторический параллель: когда люди решали добавить объектно-ориентированные функции в язык C, они избрали два разных подхода. Один (C++) акцентировал внимание на обратной совместимости. Другой (Objective C) этого не делал. На мой взгляд, Objective C относится к C так же, как Kotlin и Scala относятся к Java; а C++ относится к C так же, как Неизвестный язык X к Java.
В качестве дополнительного придирчивого требования, это должно выглядеть как настоящий язык, а не как аннотационная популярная каша, как проект Lombok.
Одним из замечаний, которые у меня есть к языкам, таким как Kotlin и Scala, является то, что они ввели необоснованные изменения, такие как изменение объявлений с Type name
на name: Type
. Я называю это необоснованным, потому что они функционально эквивалентны и эргономически уступают (по одному лишнему символу в каждом объявлении). Они нарушают совместимость, не предоставляя никаких дополнительных преимуществ.
Я очень осведомлен о экосистеме Java. Я ожидаю, что если существует язык, удовлетворяющий моим требованиям, вероятно, это очень obscure проект одного блестящего человека где-то там. Существует ли он?
Xtend может быть тем, что вы ищете. Он НЕ является обратно совместимым в том смысле, что валидный Java код не является валидным Xtend, но является совместимым в том смысле, что смешанные проекты Java/Xtend являются вполне нормальным делом, и оба могут без проблем взаимодействовать (в отличие от Scala, которая может взаимодействовать, но быстро приводит к громоздким и непонятным именам на стороне Java). Xtend по сути является синтаксическим сахаром для Java, и имеет валидный Java код в качестве промежуточного продукта компиляции.
Например, вот пример из документации:
package com.acme
import java.util.List
class MyClass {
String name
new(String name) {
this.name = name
}
def String first(List<String> elements) {
elements.get(0)
}
}
Существуют уже несколько мелких особенностей синтаксиса:
- конструкторы используются с ключевым словом
new
- методы/конструкторы имеют публичную видимость по умолчанию
public
- поля имеют приватную видимость по умолчанию
private
- возврат значений опционален, в этом случае последнее выражение определяет возвращаемое значение
Дополнительные функции:
val
иvar
используются в определениях переменных, как в Scala (ура, выведение типов)override
является настоящим ключевым словом, а не необязательной аннотацией- Расширяющие методы, которые позволяют создавать более плавные цепочки вызовов вместо глубоко вложенных вызовов функций.
(Также существует пункт контекстного меню в плагине xtend для eclipse, который может преобразовать Java классы в код xtend, если вы этого хотите).
Ответ или решение
Ваша просьба касается поиска языка программирования, который бы сочетал современные удобства, такие как неявные преобразования, смешиваемые методы, методы расширений и паттерн-матчинг, с полной обратной совместимостью с Java. Одним из возможных решений, которое я хотел бы предложить, является язык Xtend.
Xtend
Xtend – это язык, предназначенный в первую очередь для упрощения разработки на платформе Java. Хотя Xtend не является полностью обратной совместимостью в том смысле, что валидный Java-код не является валидным кодом Xtend, он позволяет смешивать проекты на Java и Xtend без проблем. Это отличает Xtend от Scala, где взаимодействие может превращаться в сложные и нечитабельные структуры.
Основные положительные аспекты Xtend:
-
Синтаксическая простота: Xtend воспринимается как синтаксический сахар над Java, и конечный код компилируется в валидный Java-код. Это позволяет использовать существующий код Java без изменений, добавляя при этом новые возможности лишь в тех местах, где это необходимо.
-
Улучшенные конструкции: Например, в Xtend вы определяете конструкторы с помощью ключевого слова
new
, у методов и конструкторов по умолчанию открытая видимостьpublic
, а у полей приватнаяprivate
. Возврат значения из метода осуществляется автоматически, если в методе последнее выражение не имеет явного возвращаемого значения.package com.acme import java.util.List class MyClass { String name new(String name) { this.name = name } def String first(List<String> elements) { elements.get(0) } }
-
Продвинутые функции:
- Поддержка конструкций
val
иvar
для определения переменных с выводом типа, аналогично Scala. - Ключевое слово
override
, которое необходимо использовать для переопределения методов, вместо аннотации. - Метод расширения (extension methods), который позволяет упростить цепочку вызовов и сделать код более читабельным.
- Поддержка конструкций
-
Инструменты преобразования: В плагине Xtend для Eclipse доступна функция, позволяющая преобразовывать классы Java в код Xtend, что упрощает переход на этот язык.
Заключение
Хотя Xtend не является полным аналогом Kotlin или Scala, он предоставляет множество современных функций, а также сохраняет важные аспекты совместимости с Java. Это делает его отличным вариантом для тех, кто стремится к более читаемому и удобному синтаксису, при этом оставляя возможность работы с существующим Java-кодом без значительных изменений. Таким образом, если вы ищете язык, который бы отвечал вашим требованиям по удобству и совместимости с Java, Xtend может стать вашим решением.