Обратно совместимая альтернатива Kotlin и Scala?

Вопрос или проблема

Я ищу язык программирования (т.е.: пакет компилятора и 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:

  1. Синтаксическая простота: Xtend воспринимается как синтаксический сахар над Java, и конечный код компилируется в валидный Java-код. Это позволяет использовать существующий код Java без изменений, добавляя при этом новые возможности лишь в тех местах, где это необходимо.

  2. Улучшенные конструкции: Например, в 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)
       }
    }
  3. Продвинутые функции:

    • Поддержка конструкций val и var для определения переменных с выводом типа, аналогично Scala.
    • Ключевое слово override, которое необходимо использовать для переопределения методов, вместо аннотации.
    • Метод расширения (extension methods), который позволяет упростить цепочку вызовов и сделать код более читабельным.
  4. Инструменты преобразования: В плагине Xtend для Eclipse доступна функция, позволяющая преобразовывать классы Java в код Xtend, что упрощает переход на этот язык.

Заключение

Хотя Xtend не является полным аналогом Kotlin или Scala, он предоставляет множество современных функций, а также сохраняет важные аспекты совместимости с Java. Это делает его отличным вариантом для тех, кто стремится к более читаемому и удобному синтаксису, при этом оставляя возможность работы с существующим Java-кодом без значительных изменений. Таким образом, если вы ищете язык, который бы отвечал вашим требованиям по удобству и совместимости с Java, Xtend может стать вашим решением.

Оцените материал
Добавить комментарий

Капча загружается...