Я хотел бы использовать Kotlin и Scala вместе в проектах и, возможно, некоторые другие языки, но я не видел хорошего способа сделать это. Единственный способ, который я придумал, - это скомпилировать один язык и декомпилировать его в Java для работы с другим. Есть ли альтернативы?
Использование нескольких языков JVM в одном проекте
Ответы (2)
Ради полноты и не вкладывать слова в чьи-то уста, хотелось взвесить.
Я согласен с последним предложением ответа ziggystar. Правильнее всего использовать компонентный подход и не пытаться комбинировать несколько языков в одном компоненте или проекте.
С технической точки зрения каждый из языков JVM имеет свой собственный компилятор. Некоторые из них, например Scala, могут компилировать файлы как Scala, так и Java. Однако это может быть, а может и не быть верным для других компиляторов. Чтобы избежать странных процессов сборки, хорошим подходом было бы использовать один язык для каждого встроенного модуля.
Поскольку вы придерживаетесь языков JVM, все языки могут быть скомпилированы в JAR, поэтому вы можете легко распространять исполняемый двоичный файл в виде одного файла JAR со всеми компонентами, заключенными в него. Это подход Fat JAR (см. этот вопрос о переполнении стека, этот пост о гиках кода Java а>).
С точки зрения удобочитаемости это также должно упростить понимание вашего программного обеспечения. Вы не только разложили его на логические строительные блоки (каждый компонент), но и кому-то, кто вносит изменения, нужно только понимать язык, на котором написан компонент, над которым они работают, и общедоступный интерфейс компонентов, с которыми им нужно взаимодействовать. Нет переключения мысленного контекста между языками.
Вы можете использовать Scala и Java одновременно, поскольку scalac понимает и компилирует файлы Java. То же самое, вероятно, относится и к другим языкам. Проблемы могут возникнуть при использовании нескольких альтернативных языков JVM, поскольку, например, компилятор Kotlin, вероятно, не может понять файлы Scala и наоборот.
Я думаю, что лучший способ - разделить проект на разные модули и использовать не более одного альтернативного языка для каждого модуля.
Что я имею в виду под модулем?
Под модулем я имею в виду набор исходных файлов, которые переводятся в один (двоичный) артефакт, то есть в файл jar. В других случаях я бы просто назвал модуль проектом. Обратите внимание, что модуль может зависеть от других модулей на двоичном уровне (например, имеет некоторые файлы jar в качестве зависимостей).
Поддержка нескольких модулей в IDE
Я думаю, что в большинстве основных IDE должно быть возможно работать с разными модулями одновременно, даже если каждый модуль использует другой язык. Терминология различается в разных IDE.
Терминология
Для Intellij IDEA один из моих модулей называется module. Для Eclipse это будет называться проектом.