2008-09-17 5 views
23

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

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

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

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


EDIT: Были 3 последующие вопросы (первоначально комментарии), которые получили ответ в принятом ответе. Они перепечатываются здесь для удобочитаемости:

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

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

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

+4

JVM - это просто виртуальная машина. Для виртуальной машины вам нужно несколько языков по той же причине, что и вам, для реальной машины. –

ответ

30

Для решения ваших три вопроса отдельно:

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

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

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

Что требуется (с точки зрения высокого уровня), чтобы написать язык/компилятор для виртуальной машины Java?

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

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

Очень точно так же вы пишете/компилируете/запускаете код на Java. Чтобы ваши ноги были мокрыми, я бы рекомендовал посмотреть на Scala, который безупречно работает на JVM.

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

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

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

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

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

Да, см. Выше.

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

№ Скала (ссылка выше), например, реализует функциональные функции при сохранении совместимости с 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) 
    } 
} 
+0

Спасибо, Всего 1 шт. Как приложение, написанное, скажем, JPython, взаимодействует с Java-приложением? Кроме того, может ли приложение JPython использовать любую из функций/объектов JDK? Что, если это был код Jaskell, будет ли факт, что это функциональный язык, не делает его несовместимым с JDK? – Lehane

+0

Добавлены ответы на ваши вопросы к моему сообщению. – toluju

+0

Закрытие может быть сделано (неудобно неудобно) с анонимными классами. –

0

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

+0

«Продолжайте», да? В настоящее время в JVM есть * десятки языков на языках JVM: http://www.is-research.de/info/vmlanguages/index.html –

1

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

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

13

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

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

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

+1

+1 в целом, но вы должны, вероятно, отметить, что большинство «серьезных» Недавно были скомпилированы языки JVM, которые приобрели сцепление (например, Scala, Clojure, JRuby). – mikera

4

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

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

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

2

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

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

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

1

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

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

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

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

2

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

0

В некоторой степени это, вероятно, «Гонка вооружений» против .NET CLR.

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

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

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

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

1

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

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

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

«Устаревшие двигатели, такие как ColdFusion»? Последняя версия Adobe ColdFusion, всего год назад, была их самой продаваемой версией. С каждым выпуском язык также неуклонно созревает. Я бы вряд ли сказал, что он устарел. Хотя это распространенное заблуждение, с которым я сталкиваюсь. –

2

Ответ только ваш второй вопрос:

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

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

+0

Согласен, абсолютно необходимо понимать как сходства *, так и различия между JVM и физической машиной. –

1

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

6

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

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

или

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

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

1

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

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

0

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

  • Giant количество библиотек
  • Более широкая степень платформы реализации
  • Зрелый каркасов
  • код Наследства, что это уже часть инфраструктуры

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

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

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

1

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

Это проблема, потому что Java должна эволюционировать:

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

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

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

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