В чем разница между javac и компилятором Eclipse?

201

Является ли Java-компилятор Eclipse просто оболочкой вокруг того же ядра, в javacкоторое обернута программа, или это отдельный компилятор? Если последнее, зачем им изобретать велосипед?

Барт ван Хейкелом
источник

Ответы:

209

В Eclipse реализован собственный компилятор, называемый Eclipse Compiler for Java (ECJ).

Он отличается от javac, компилятора, поставляемого с Sun JDK. Одно заметное отличие состоит в том, что компилятор Eclipse позволяет запускать код, который на самом деле не компилировался должным образом. Если блок кода с ошибкой никогда не запускается, ваша программа будет работать нормально. В противном случае он выдаст исключение, указывающее, что вы пытались запустить код, который не компилируется.

Другое отличие состоит в том, что компилятор Eclipse допускает инкрементные сборки внутри Eclipse IDE, то есть весь код компилируется, как только вы закончите вводить текст.

Тот факт, что Eclipse поставляется с собственным компилятором, также очевиден, поскольку вы можете писать, компилировать и запускать код Java в Eclipse, даже не устанавливая Java SDK.

Вот несколько примеров, где ECJ предпочтительнее javac:

  • Apache Tomcat использует ECJ для компиляции JSP,
  • IntelliJ IDEA поддерживает ECJ, начиная с GNU Compiler for Java (GCJ) 4.3,
  • GCJ интегрируется с ECJ,
  • Liferay строится с помощью ECJ.
jjnguy
источник
3
@Bart, компилятор Eclipse работает достаточно хорошо для сборок корпоративных версий.
jjnguy
7
@jinguy Я не согласен с тем, что вы должны использовать компилятор Eclipse для релизов. Как вы указали в ответе, он может компилировать код с ошибками, вам не нужны такие вещи, как public void foo () {throw new Error ("Неразрешенная проблема компиляции: \ n \ tFOOBAR не может быть решена \ n"); } чтобы появиться в моем производственном коде.
Мэтью Фарвелл
10
@ Мэтью Фарвелл Он не сказал, что ты должен, но ты можешь. И если вы когда-нибудь создадите сборку с ошибками, то, во-первых, что-то не так с вашим процессом сборки.
Стефан
4
Обратите внимание, что встраивание ECJ в ваше приложение позволяет вашей программе работать под JRE вместо того, чтобы требовать JDK.
Турбьёрн Равн Андерсен
6
@MatthewFarwell, чтобы замкнуть цикл здесь: для релизных сборок рекомендуется просто не указывать аргумент компилятора, -proceedOnErrorи он просто не будет создавать файлы .class из источника с ошибками.
Стефан Херрманн
36

Все уже объяснили, что они разные. Вот некоторые различия в поведении, которые я заметил между двумя компиляторами. Все они сводятся к ошибке (по крайней мере) в одной из реализаций.

Оптимизация во время компиляции

Родовой тип, связанный с выводом

polygenelubricants
источник
1
На самом деле я знал об этой разнице после долгой ночи: Eclipse сообщал об ошибке о чем-то, что мне казалось законным (я не помню, что), в отчаянии (я едва мог не заснуть), я просто передаю код в javac и тогда это работало гладко! В Google я обнаружил, что мне нужно обновить JDT, чтобы решить эту проблему.
Абель Морелос
5
Я обнаружил ряд различий между обработчиками обобщений в сложных случаях. Вот два вопроса, которые я задал здесь, на случай, если вы захотите добавить их в свой ответ: stackoverflow.com/questions/13501836/… stackoverflow.com/questions/13980552/…
Элиас Василенко,
5
Анонимные классы никогда не являются статическими в соответствии с JLS, но они могут быть объявлены в статической области видимости. При использовании отражения, чтобы спросить, является ли такой класс статическим, сгенерированный код ECJ говорит «нет», а javac - « да» . Связанный пост здесь .
Пол Беллора
2
Любая семантическая разница в передаваемом байт-коде является ошибкой в ​​любой реализации. Это не очень интересно, на мой взгляд. Я легко могу составить длинный список таких «различий», просто перечислив открытые ошибки из javac и ecj.
aioobe
К вашему сведению, Netbeans не страдает от таких «различий», поскольку использует внутренний API javac для выполнения всего, что делает EJC.
Александр Дубинский
18

Встроенный компилятор Eclipse основан на Java-компиляторе Jikes IBM . (Обратите внимание, что Eclipse также начал свою жизнь в IBM). Он полностью независим от Java-компилятора Sun в JDK; это не обертка вокруг Солнца javac.

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

Jesper
источник
31
Они не действительно писать свои собственные Java компилятор. Eclipse имеет длинную родословную от Visual Age для Smalltalk, еще до появления Java. Поскольку два языка на самом деле несколько похожи, они просто адаптировали свои существующие технологии. Компилятор Sun также совершенно не подходит для использования в IDE, особенно в инкрементальной IDE в стиле Smalltalk, такой как оригинальный Visual Age for Java, поскольку он всегда хочет компилировать целые файлы. Компилятор IBM может постепенно компилировать только измененные фрагменты. Он может даже компилировать фрагменты, которые даже не являются законной Java, которая используется в
Jörg W Mittag
2
Eclipse записки, где вы можете просто написать фрагменты кода, выделить их и запустить их, без необходимости помещать их в класс, метод main или даже в метод вообще .
Йорг Миттаг
1
@ JörgWMittag На самом деле, внутренний API javac (используемый Netbeans) может использоваться для достижения всех тех же целей.
Александр Дубинский
1
@AleksandrDubinsky: Насколько хорошо это сработало в 1997 году, когда был выпущен Visual Age for Java?
Йорг Миттаг
15

Это отдельный компилятор. Это необходимо, поскольку javac не позволяет компилировать слегка испорченный код с сайта Eclipse.

Инкрементный компилятор Java. Реализованный как Eclipse-компоновщик, он основан на технологии, разработанной на основе VisualAge для компилятора Java. В частности, он позволяет запускать и отлаживать код, который все еще содержит неразрешенные ошибки.

BenM
источник
Зачем вам нужна компиляция «слегка» испорченного кода?
Стив Коэн
5
@SteveCohen: поскольку вы хотите, чтобы компилятор предоставлял подсветку синтаксиса, семантическую подсветку, поддержку рефакторинга, проверку типов, завершение кода, подсказки и все остальные вещи, которые компилятор делает, когда вы пишете код и когда вы пишете код, по определению он более или менее неполный (в противном случае, почему вы до сих пор пишете это?) IDE, которая работает только в самом конце проекта, когда все уже реализовано, была бы совершенно бесполезной.
Йорг Миттаг