Подтвердить что ты не робот

Зачем нам нужны другие языки JVM

Я вижу здесь, что есть масса языков, кроме Java, которые запускаются на JVM. Я немного смущен всей концепцией других языков, работающих в JVM. Итак:

В чем преимущество наличия других языков для JVM?

Что требуется (в терминах высокого уровня) для написания языка/компилятора для JVM?

Как вы пишете/компилируете/запускаете код на языке (отличном от Java) в JVM?


РЕДАКТИРОВАТЬ: Были ответы на 3 вопроса (изначально комментарии), на которые был дан ответ в принятом ответе. Они перепечатываются здесь для удобочитаемости:

Как приложение, написанное, скажем, JPython, взаимодействует с Java-приложением?

Кроме того, может ли приложение JPython использовать любую из функций/объектов JDK?

Что, если это был код Jaskell, будет ли факт, что это функциональный язык, не делает его несовместимым с JDK?

4b9b3361

Ответ 1

Чтобы задать три вопроса отдельно:

В чем преимущество наличия других языков для JVM?

Здесь есть два фактора. (1) Зачем нужен язык, отличный от Java для JVM, и (2) почему другой язык запускается на JVM вместо другой среды выполнения?

  • Другие языки могут удовлетворить другие потребности. Например, Java не имеет встроенной поддержки закрытия, которая часто очень полезна.
  • Язык, который работает на JVM, - это байт-код, совместимый с любым другим языком, который работает на JVM, что означает, что код, написанный на одном языке, может взаимодействовать с библиотекой, написанной на другом языке.

Что требуется (в терминах высокого уровня) для записи языка/компилятора для JVM?

JVM считывает файлы байт-кода (.class) для получения инструкций, которые необходимо выполнить. Таким образом, любой язык, который должен быть запущен на JVM, должен быть скомпилирован для байт-кода, придерживаясь спецификации Scala, который безупречно работает на JVM.

Отвечая на следующие вопросы:

Как приложение, написанное, скажем, JPython, взаимодействует с Java-приложением?

Это зависит от выбора реализации для преодоления языкового разрыва. В вашем примере Jython project имеет прямое средство для этого (см. Здесь):

from java.net import URL
u = URL('http://jython.org')

Кроме того, может ли приложение JPython использовать любую из функций/объектов JDK?

Да, см. выше.

Что, если это был код Jaskell, будет ли факт, что это функциональный язык, не делает его несовместимым с JDK?

Нет. Scala (ссылка выше), например, реализует функциональные функции при сохранении совместимости с Java. Например:

object Timer {
  def oncePerSecond(callback: () => unit) {
    while (true) { callback(); Thread sleep 1000 }
  }
  def timeFlies() {
    println("time flies like an arrow...")
  }
  def main(args: Array[String]) {
    oncePerSecond(timeFlies)
  }
}

Ответ 2

Вам нужны другие языки в JVM по той же причине, в которой вам нужны несколько языков программирования в целом: разные языки лучше подходят для решения различных задач... статическая типизация и динамическая типизация, строгая против ленивых... Декларативная, императивная, Объектно-ориентированный... и т.д.

В общем, запись "компилятора" для другого языка, запускаемого на JVM (или в .Net CLR), в основном заключается в компиляции этого языка в java-байт-код (или в случае с .Net, IL) вместо на сборку/машинный язык.

Тем не менее, многие дополнительные языки, которые записываются для JVM, не компилируются, а скорее интерпретируются языки сценариев...

Ответ 3

Повернув это на голове, подумайте о том, что вы хотите создать новый язык, и вы хотите, чтобы он работал в управляемой среде исполнения с JIT и GC. Тогда подумайте, что вы могли:

(a) напишите вам собственную управляемую среду выполнения (VM) и займите всевозможные технически сложные проблемы, которые, несомненно, приведут к многочисленным ошибкам, плохой производительности, неправильной потоковой обработке и большому количеству переносимости.

или

(b) скомпилируйте свой язык в байт-код, который может запускаться на виртуальной машине Java, которая уже достаточно зрелая, быстро и поддерживается на нескольких платформах (иногда с несколькими вариантами импортера).

Учитывая, что байт-код JavaVM не привязан так близко к языку Java, что чрезмерно ограничивает тип языка, который вы можете реализовать, он был популярной целевой средой для языков, которые нужно запускать в виртуальной машине.

Ответ 4

Java - довольно многословный язык программирования, который быстро устаревает со всеми новыми причудливыми языками/фреймами, выходящими за последние 5 лет. Для поддержки всего сильного синтаксиса, который требуется людям на языке и сохранения обратной совместимости, имеет смысл добавить больше языков в среду выполнения.

Другим преимуществом является то, что он позволяет запускать некоторые веб-фреймворки, написанные на Ruby ala JRuby (aka Rails) или Grails (Groovy on Railys) и т.д. на проверенной платформе хостинга, которая, вероятно, уже находится в производстве у многих компаний, вместо того, чтобы использовать это не так, как проверенные и проверенные среды размещения Ruby.

Чтобы скомпилировать другие языки, вы просто конвертируете в байт-код Java.

Ответ 6

Преимущество наличия других языков для JVM совершенно не отличается от преимуществ наличия других языков для компьютера в целом: в то время как все языки полного обучения могут технически выполнять одни и те же задачи, некоторые языки облегчают некоторые задачи, чем другие, в то время как другие языки облегчают другие задачи. Поскольку JVM - это то, что у нас уже есть возможность работать на всех (ну, почти всех) компьютерах и на множестве компьютеров, на самом деле уже есть, мы можем получить преимущество "писать один раз, работать куда угодно", но не требуя что один использует Java.

Написание языка/компилятора для JVM на самом деле не отличается от написания одного для реальной машины. Реальное различие заключается в том, что вы должны скомпилировать байт-код JVM вместо исполняемого кода машины, но это действительно незначительная разница в великой схеме вещей.

Написание кода для языка, отличного от Java в JVM, действительно не отличается от написания Java, за исключением, конечно, того, что вы будете использовать другой язык. Вы компилируете с помощью компилятора, который кто-то пишет для него (опять же, не сильно отличается от компилятора C, в корне и в значительной степени совсем не отличается от компилятора Java), и вы в конечном итоге сможете запустить его просто подобно тому, как вы скомпилировали Java-код, поскольку с момента его использования в байт-коде, JVM не может определить, с какого языка он пришел.

Ответ 7

Различные языки адаптированы к различным задачам. Хотя некоторые проблемные области идеально подходят для языка Java, некоторые из них гораздо проще выразить на альтернативных языках. Кроме того, для пользователя, привыкшего к Ruby, Python и т.д., Возможность генерации байт-кода Java и использования классов JDK и JIT-компилятора имеет очевидные преимущества.

Ответ 8

Отвечая на ваш второй вопрос:

JVM - это всего лишь абстрактная машина и модель исполнения. Таким образом, таргетинг на компилятор такой же, как и на любой другой машине и модели исполнения, на которые может рассчитывать компилятор, будь он реализован на оборудовании (x86, CELL и т.д.) Или программном обеспечении (попугай,.NET). JVM довольно прост, поэтому на самом деле это довольно простая задача для компиляторов. Кроме того, в реализациях, как правило, есть довольно хорошие JIT-компиляторы (для работы с паршивым кодом, который создает javac), поэтому вы можете получить хорошую производительность, не беспокоясь о большом количестве оптимизаций.

Применяется пара предостережений. Во-первых, JVM непосредственно воплощает java-модуль и систему наследования, поэтому попытка сделать что-либо еще (множественное наследование, многократная отправка), вероятно, будет сложной задачей и потребует свернутый код. Во-вторых, JVM оптимизированы для работы с типом байт-кода, который производит javac. Производящий байт-код, который сильно отличается от этого, скорее всего, попадет в нечетные углы JIT-компилятора/JVM, которые, скорее всего, будут в лучшем случае неэффективными (в худшем случае они могут привести к сбою JVM или, по крайней мере, дать ложные исключения VirtualMachineError).

Ответ 9

Что может сделать JVM, определяется байт-кодом JVM (то, что вы находите в .class файлах), а не исходным. Поэтому изменение языка исходного кода на высоком уровне не окажет существенного влияния на доступные функции.

Что касается того, что требуется для написания компилятора для JVM, все, что вам действительно нужно сделать, это генерировать правильные файлы bytecode/.class. Как вы пишете/компилируете код с альтернативным типом компилятора, зависит от рассматриваемого компилятора, но как только компилятор выводит файлы .class, их запуск ничем не отличается от запуска .class файлов, созданных javac.

Ответ 10

Преимущество этих других языков заключается в том, что они получают относительно легкий доступ к множеству java-библиотек.

Преимущество для людей Java варьируется в зависимости от языка - у каждого есть рассказ, рассказывающий Java-кодерам о том, что они делают лучше. Некоторые расскажут, как их можно использовать для добавления динамических сценариев в приложения на основе JVM, другие просто расскажут о том, как их язык проще в использовании, имеет более сильный синтаксис и т.д.

Что нужно, так это то же самое, что написать любой компилятор другого языка: синтаксический анализ в AST, а затем преобразование его в инструкции для целевой архитектуры (байт-код) и сохранение его в правильном формате (файлы .class).

С точки зрения пользователей вы просто пишете код и запускаете двоичные файлы компилятора, и вы получаете файлы .class, которые вы можете смешивать с теми, которые производит ваш компилятор java.

Ответ 11

Языки .NET - это больше, чем реальная полезность. Каждый язык был настолько запутан, что все они С# с новым лицом.

Существует множество причин для предоставления альтернативных языков для виртуальной машины Java:

  • JVM является мультиплатформенным. Любой язык, перенесенный в JVM, получает это как бесплатный бонус.
  • Существует довольно много устаревшего кода. Антикоррозийные двигатели, такие как ColdFusion, работают лучше, предлагая заказчикам возможность постепенно фазировать свои приложения от старого решения до современного решения.
  • Некоторые формы сценариев лучше подходят для быстрого развития. JavaFX, например, разработан с учетом быстрого графического развития. Таким образом, он конкурирует с такими двигателями, как DarkBasic. (Обработка - это другой игрок в этом пространстве.)
  • Сценарии могут обеспечивать контроль. Например, приложение может захотеть предоставить пользователю VBA-подобную среду, не подвергая уязвимости лежащим в основе Java API. Использование движка, такого как Rhino, может обеспечить среду, которая поддерживает быстрое и грязное кодирование в тщательно управляемой песочнице.
  • Интерпретированные скрипты означают, что нет необходимости перекомпилировать что-либо. Нет необходимости перекомпилировать перевод в более динамичную среду. например Несмотря на то, что OpenOffice использует Java как "язык сценариев", Java отстой для этого использования. Пользователь должен пройти все виды перекомпиляции/перезагрузки, которые не нужны в динамической среде сценариев, например Javascript.
  • Это подводит меня к другому вопросу. Сценарии могут быть более легко остановлены и перезагружены без остановки и перезагрузки всей JVM. Это увеличивает полезность языка сценариев, так как среда может быть reset в любое время.

Ответ 12

Писателю компилятора намного проще генерировать байт-коды JVM или CLR. Они намного более чистые и более высокие уровни абстракции, чем любой машинный язык. Из-за этого гораздо более целесообразно экспериментировать с созданием новых языков, чем когда-либо прежде, потому что все, что вам нужно сделать, - это одна из этих архитектур VM, и у вас будет набор инструментов и библиотек, уже доступных для вашего языка. Они позволяют языковым дизайнерам больше ориентироваться на языке, чем вся необходимая инфраструктура поддержки.

Ответ 13

Поскольку процесс JSR все больше и больше отбрасывает Java: http://www.infoq.com/news/2009/01/java7-updated

Стыдно, что даже существенные и давно известные дополнения, такие как Closures, не добавляются просто потому, что участники не могут договориться о реализации.

Ответ 14

Java накопила огромную базу пользователей в семи основных версиях (от 1.0 до 1.6). Его способность развиваться ограничена необходимостью сохранения обратной совместимости для несчетных миллионов строк кода Java, работающих в процессе производства.

Это проблема, потому что Java нуждается в развитии:

  • конкурируют с новыми языками программирования, которые узнали о успехах и неудачах Java.
  • включить новые достижения в разработку языка программирования.
  • позволяют пользователям полностью использовать преимущества аппаратных средств - например, многоядерные процессоры.
  • исправить некоторые передовые идеи, которые ввели неожиданные проблемы (например, проверенные исключения, генерики).

Требование обратной совместимости является препятствием для сохранения конкурентоспособности.

Если вы сравниваете Java с С#, то Java имеет преимущество в зрелых, готовых к производству библиотеках и инфраструктурах, а также в недостатке с точки зрения особенностей языка и скорости увеличения доли рынка. Это то, что вы ожидаете от сравнения двух успешных языков, разделенных одним поколением.

Любой новый язык имеет то же преимущество и недостаток, что С# по сравнению с Java в экстремальной степени. Одним из способов максимизации преимуществ с точки зрения языковых функций и минимизации недостатков с точки зрения зрелых библиотек и фреймворков является создание языка для существующей виртуальной машины и обеспечение его совместимости с кодом, написанным для этой виртуальной машины. Это является причиной скромного успеха Groovy и Clojure; и волнение вокруг Scala. Без JVM эти языки могли только когда-либо занимать крошечную нишу в очень специализированном сегменте рынка, тогда как с JVM они занимают значительную нишу в мейнстриме.

Ответ 15

Они делают это, чтобы не отставать от .Net..Net позволяет использовать С#, VB, J # (ранее), F #, Python, Ruby (скоро) и С++. Вероятно, я пропустил некоторые из них. Вероятно, большой в нем Python, для сценариев людей.

Ответ 16

В какой-то степени это, вероятно, "гонка вооружений" против .NET CLR.

Но я думаю, что есть и настоящие причины для введения новых языков в JVM, особенно когда они будут запускаться "параллельно", вы можете использовать правильный язык для правильной работы, язык сценариев, такой как Groovy, может быть именно то, что вам нужно для презентации вашей страницы, тогда как обычная старая Java лучше для вашей бизнес-логики.

Я собираюсь оставить кого-то более квалифицированного, чтобы говорить о том, что требуется для написания нового языка/компилятора.

Что касается написания кода, вы делаете это в блокноте /vi, как обычно! (или используйте инструмент разработки, который поддерживает язык, если вы хотите сделать это простым способом.) Для компиляции потребуется специальный компилятор для языка, который будет интерпретировать и компилировать его в байт-код.

Так как java также производит байт-код технически, вам не нужно ничего делать, чтобы запустить его.

Ответ 17

Причина в том, что платформа JVM имеет множество преимуществ.

  • Гигантское количество библиотек
  • Расширение платформы Реализации
  • Зрелые рамки
  • Устаревший код, который уже часть вашей инфраструктуры.

Языки, которые Sun пытается поддерживать со своей спецификацией Scripting (например, Python, Ruby), в значительной степени связаны с их воспринимаемыми улучшениями производительности. Запуск Jython позволяет теоретически быть более продуктивным и использовать возможности Python для решения проблемы, более подходящей для Python, но все же иметь возможность интегрировать на уровне выполнения с существующей кодовой базой. Классические реализации Python и Ruby оказывают ту же способность для библиотек C.

Кроме того, часто проще выразить некоторые вещи на динамическом языке, чем на Java. Если это так, вы можете пойти другим путем; потребляют библиотеки Python/Ruby из Java.

Там есть производительность, но многие готовы принять это взамен за менее подробный, понятный код.