Работает ли Scala на собственном JVM?
В моей компании есть большая устаревшая база кода Java, и многие из наших клиентов используют WebSphere и WebLogic. Мы рассматриваем возможность использования Scala, но не смогли подтвердить, что Scala (2.9.X) хорошо работает с IBM JDK (и BEA JRockit).
Поскольку эти JVM проходят TCK, я бы сказал, что он должен просто работать, но с учетом различных проблем, которые у меня были с разными JVM годы, когда я немного нервный. Есть ли какие-либо ошибки, которые следует учитывать при использовании Scala с другими JVM?
- Любые флаги компилятора для использования (или избежания)?
- Должен ли я компилировать код с помощью Scala на горячей точке или на JVM клиента?
- Любые проблемы с микшированием JAR, скомпилированные с использованием разных версий Scala/Java на разных JVM?
Любые военные рассказы, ссылки и предложения приветствуются.
Ответы
Ответ 1
Компилятор Scala должен создавать одинаковый байт-код независимо от используемой вами JVM. Я ожидал бы, что Scala будет работать на всех трех платформах, однако HotSpot попытался оптимизировать динамические языки и может быть немного лучше. (Возможно, этого недостаточно, чтобы беспокоиться)
В последние годы между этими платформами все меньше и меньше разница, и в ближайшем будущем я ожидаю, что все они будут напрямую основаны на OpenJDK (поскольку IBM согласилась поддержать OpenJDK сейчас) Команды JRockit и Hotspot были объединены для через некоторое время с тех пор, как Oracle владеет обоими.
Однако, если вы не используете последнюю версию JDK, вы можете увидеть некоторые проблемы.
JVM очень хорошо разговаривают друг с другом, и я бы рассмотрел запуск Scala в своей собственной JVM, чтобы изолировать любые проблемы, которые могут возникнуть.
Ответ 2
Да, Scala работает на не-Sun JVM. Рассмотрим, например, эти два комментария из исходного кода:
//print SourceAnnotation in a predefined way to insure
// against difference in the JVMs (e.g. Sun vs IBM's)
// on IBM J9 1.6 do not use ForkJoinPool
Их не так много. В конце концов, различные JVM должны быть совместимы - и проверены на это. Но, в то время как проблемы возникают, предпринимаются действия, чтобы обеспечить бесперебойную работу.
Ответ 3
-
Ничего не могу придумать.
-
Компилятор не должен иметь никакого значения, ведь если запуск scalac
на другой виртуальной машине будет генерировать другой байт-код, это определенно ошибка.
-
Вы всегда должны запускать Scala код с той же версией Scala, скомпилированной с помощью. Код, скомпилированный на 2.x, по умолчанию не будет работать на 2.x + 1. Код, составленный на 2.x.y, должен работать на 2.x.y + 1, однако.
Я согласен с тем, что было бы неплохо получить лицензии от сторонних поставщиков, таких как IBM или Azul, для включения этих платформ в тестирование.