Насколько я понимаю, и Scala, и Clojure были разработаны как новые языки, которые
- зависит от JVM, и
- легко интегрируется с кодом Java в том смысле, что они позволяют использовать классы Java внутри кода Scala и Clojure.
Начиная с Java 8 (и, возможно, даже более сильно с последующими версиями Java), будут происходить изменения в семантике языка Java.
Я хотел спросить, как эти изменения повлияют на совместимость между Java и Scala / Clojure и каковы будут последствия. Например, поскольку лямбды в Java 8 не являются объектами (см., Например, здесь ), Scala и Clojure могут иметь дело со значениями Java, которые не являются объектами. Будет ли это проблемой?
Я могу думать о следующих сценариях:
- Язык Scala или Clojure будет расширен для адаптации к новой семантике Java (для обработки новых не-объектных значений) и поддержки взаимодействия с Java.
- Язык Scala или Clojure не будет расширен. Это будет возможно только в том случае, если новые функции Java, такие как значения функций, могут быть сопоставлены с существующими концепциями. Например, в Scala даже функция - это объект, поэтому я предполагаю, что функции Java снова будут помещены в какие-то объекты, когда они станут видимыми для Scala.
- Язык Scala или Clojure будет продолжать поддерживать совместимость вплоть до Java 6 или 7, не следуя последним разработкам Java. Это потребует поддержки старых версий Java (по крайней мере, OpenJDK или другого проекта), чтобы эти языки могли основываться на более консервативной / стабильной ветви Java.
Подводя итог: можем ли мы ожидать, что будущее развитие Java окажет влияние на такие языки, как Scala и Clojure, чтобы обеспечить совместимость с Java? Есть ли какая-либо (ссылка на) текущая дискуссия на эту тему уже?
Запись
Я могу себе представить, что Scala, Clojure и другие языки на основе JVM не будут иметь серьезных проблем при обновлении своей реализации до более новых версий JVM (и что новые функции JVM сделают эту реализацию еще проще). Мой вопрос сосредоточен на особенностях Java как языка и на том, сможет ли / как другой JVM-язык «увидеть» / использовать эти новые функции, а не на том, будут ли языки на основе JVM работать на последних версиях JVM.
String
- это JavaString
. Так что Scala использует определенные классы библиотек Java. Но я могу изменить формулировку, если вы думаете, что она слишком сильна.Ответы:
На самом деле Java 8 не представляет большого вреда для других языков JVM, которые взаимодействуют с Java. Работа, проделанная над Lambdas, помогла исправить ряд небольших проблем, связанных с invokedynamic, MethodHandles, MethodReferences и т. Д., Но, кроме этого, она продолжается как обычно. Тем не менее, существует целый ряд новых API, которые потенциально могут использовать другие языки JVM. Какие из них они будут использовать по умолчанию или нет, зависит от них.
Наибольшее изменение, влияющее на взаимодействие, на самом деле пришло с Java 7 - с помощью вызываемого динамического байт-кода, который допускает динамическое / позднее связывание вызовов в JVM - то, что изначально было разработано для других языков в JVM. С тех пор он был очень полезен для Lamdbas, поэтому, начиная с Java 8, Java фактически начнет испускать эти байт-коды.
Некоторые языки (например, JRuby) уже активно используют invokedynamic, в то время как другие (Scala, Groovy и др.) Все еще изучают его использование или находятся на ранних этапах его исправления. Теоретически это делает их динамические вызовы почти такими же производительными, как и существующие. Java вызывает invokestatic, в отличие от множества медленных обходных путей, которые они вынуждены были использовать в прошлом.
Java 9 принесет больше проблем для языков JVM с выходом на платформу проекта Jigsaw, который станет началом конца традиционной загрузки классов и путей к классам для JVM. Специалисты по языку JVM прекрасно знают об этом, и я ожидаю, что будет какое-то разумное сотрудничество.
источник
invokedynamic
байт-кода) был специально для поддержки языков, отличных от Java; на самом деле язык Java 7 не поддерживает и не использует этот байт-код.Scala собирается остаться позади, когда Java добавляет лямбды, потому что лямбды Java получают тип в соответствии с контекстом, в котором они используются, тогда как лямбды Scala получают тип на основе их арности, типов параметров и возвращаемых типов, например,
из Java 8 можно записать в Scala как:
если вы не используете / не пишете некоторые обертки, конвертирующие Scala () => Unit в Runnable.
источник