> Просто могут в Oracle писать виртуалки и вот хвастают, но как показала Java в целом, то они ничего кроме и не сделали. не вышло ни чего хорошего в JVM потому что одной только виртуальки НЕ достаточно для целей "букета" языков.
у теоретиков абстракция потекла почти что на ровном месте. :-)
проблемы-то ведь нужно решать в том числе и на этапе копиляции:
вот например:
УМЕЕТ код на Scala работать дружественно вместе с кодом на Java -- внезависимости от того кто для кого (из них) является зависимым (или одновременно оба друг от друга взаимозависмы).
и код на Koltin УМЕЕТ работать дружественно вместе с кодом на Java -- внезависимости от того кто для кого (из них: Koltin <=> Java) является зависимым (или одновременно оба друг от друга взаимозависмы).
а код Scala <=> Koltin -- НЕ умеют дружественно работать друг с другом -- в ситуациях когда оба они являются взаимозавимыми (Koltin-классы ссылаются на Scala-классы и при этом одновременно Scala-классы ссылаются на Koltin-классы).
в теории это должно было бы работать -- но про процесс компиляции забыли подумать! оказывается ведь компиляцию нужно запускать в определённых порядках.. а в каком порядке запускать Scala-компилятор а в каком порядке Koltin-компилятор, если произошла взаимозависимость?
ведь общий граф взаимозавимостей Scala+Koltin составить невозможно -- для так для этого нужно было бы объединённое сотрудничество обоих компиляторов. а они каждый по своему составляют свои независимые графы зависимостей, и сразу ИСПОЛНЯЮТ(!).
при этом в Groovy для успешного решения этой же проблемы придумали дополнительную (ранюю) стадию формирования классов-заглушек. классы-заглушки создаются на самам самом раннем этапе компилирования (ПЕРЕД запуском настоящих компиляторов), и заглушки (в отличии от своих настоящих классов) НЕ зависят ни от каких других классов. а затем уже позднее -- заглушки заменяются на настоящие классы. таким образом проблема порядка запуска компиляторов решается: JVM-язык который зависит от Groovy-классов -- будет связывать свой код с заглушками и поэтому НЕ требует запуск настоящего Groovy-компилятора ранее своего запуска.