javac와 Eclipse 컴파일러의 차이점은 무엇입니까?


201

Eclipse의 Java 컴파일러는 javac프로그램이 래핑 되는 것과 동일한 코어를 감싸는 래퍼 입니까? 아니면 별도의 컴파일러입니까? 후자라면 왜 바퀴를 재발 명했을까요?

답변:


209

Eclipse는 ECJ ( Eclipse Compiler for Java) 라는 자체 컴파일러를 구현했습니다 .

Sun JDK와 함께 제공되는 컴파일러 인 javac와 다릅니다. 주목할만한 차이점 중 하나는 Eclipse 컴파일러를 사용하면 실제로 제대로 컴파일되지 않은 코드를 실행할 수 있다는 것입니다. 오류가있는 코드 블록이 실행되지 않으면 프로그램이 정상적으로 실행됩니다. 그렇지 않으면 컴파일되지 않은 코드를 실행하려고했음을 나타내는 예외가 발생합니다.

또 다른 차이점은 Eclipse 컴파일러가 Eclipse IDE 내에서 증분 빌드를 허용한다는 것입니다. 즉, 입력을 마치면 모든 코드가 컴파일됩니다.

Eclipse에 자체 컴파일러가 있다는 사실도 Java SDK를 설치하지 않고도 Eclipse에서 Java 코드를 작성, 컴파일 및 실행할 수 있기 때문에 분명합니다.

ECJ가 javac보다 선호되는 몇 가지 예는 다음과 같습니다.


3
@Bart, Eclipse 컴파일러는 엔터프라이즈 릴리스 빌드에 적합합니다.
jjnguy

7
@jinguy 릴리스에 Eclipse 컴파일러를 사용해야한다는 데 동의하지 않습니다. 답변에서 언급했듯이 오류가있는 코드를 컴파일 할 수 있습니다. public void foo () {throw new Error ( "해결되지 않은 컴파일 문제 : \ n \ tFOOBAR를 해결할 수 없습니다 \ n"); } 내 프로덕션 코드에 나타납니다.
Matthew Farwell

10
@Matthew Farwell 그는 당신이해야한다고 말하지 않았지만 할 수 있다고 말했습니다. 그리고 오류가있는 빌드를 만든 경우 처음부터 빌드 프로세스에 문제가 있습니다.
Stefan

4
응용 프로그램에 ECJ를 포함하면 프로그램이 JDK가 아닌 JRE에서 실행될 수 있습니다.
Thorbjørn Ravn Andersen

6
@MatthewFarwell에서 루프를 닫으십시오. 릴리스 빌드의 경우 컴파일러 인수를 지정 하지 말고 소스에서 .class 파일을 생성 하지 않는 것이 좋습니다 -proceedOnError.
Stephan Herrmann

36

모두가 이미 다르다고 이미 설명했습니다. 다음은 두 컴파일러에서 발견 한 동작의 차이점입니다. 그것들은 모두 (적어도) 구현 중 하나에서 버그로 귀결됩니다.

컴파일 타임 최적화 관련

제네릭 형식 유추 관련


1
실제로 나는 긴 밤 후에이 차이에 대해 알고있었습니다 : 이클립스는 나에게 합법적 인 것처럼 보이는 것에 대해 오류를보고했습니다 (무엇을 기억하지 못합니까), 필사적으로 (깨어있을 수는 없습니다) 그냥 javac에 코드를 공급합니다. 그런 다음 원활하게 작동했습니다! Google에서 해당 문제에 대한 수정 사항을 얻으려면 JDT를 업그레이드해야한다는 것을 알았습니다.
Abel Morelos 2016 년

5
어려운 경우 컴파일러가 제네릭을 처리하는 것 사이에 많은 차이점이 있습니다. 다음은 답변에 질문을 추가하려는 경우 여기에 대한 두 가지 질문입니다. stackoverflow.com/questions/13501836/… stackoverflow.com/questions/13980552/…
Elias Vasylenko

5
익명 클래스는 JLS에 따라 정적이지 않지만 정적 범위에서 선언 될 수 있습니다. 리플렉션을 사용하여 이러한 클래스가 정적인지 묻는 경우 ECJ에서 생성 된 코드는 no라고하고 javac 's 는 yes라고합니다 . 관련 게시물 here .
Paul Bellora

2
방출 된 바이트 코드의 의미 차이는 두 구현 모두에서 버그입니다. 이것은 제 생각에는 그리 흥미롭지 않습니다. javac 및 ecj의 공개 버그를 나열하여 이러한 "차이"의 긴 목록을 쉽게 생성 할 수 있습니다.
aioobe

참고로 Netbeans은 javac의 내부 API를 사용하여 EJC가 수행하는 모든 작업을 수행하므로 이러한 "차이"를 겪지 않습니다.
Aleksandr Dubinsky

17

Eclipse의 내장 컴파일러는 IBM의 Jikes Java 컴파일러를 기반으로 합니다. (Eclipse도 IBM에서 시작되었습니다). JDK에서 Sun의 Java 컴파일러와는 완전히 독립적입니다. Sun 주위의 래퍼가 아닙니다 javac.

Jikes는 오랫동안 존재 해 왔으며, 표준 JDK Java 컴파일러보다 훨씬 빠르지 만 (여전히 사실인지는 모르겠습니다). IBM이 자체 Java 컴파일러를 작성하려는 이유는 라이센스 이유 때문일 수도 있습니다 (자체 Java 구현도 있음).


31
그들은 실제로 자신의 Java 컴파일러를 작성 하지 않았습니다 . Eclipse는 Java가 존재하기 전에 Visual Age for Smalltalk로 거슬러 올라갑니다. 두 언어는 실제로 다소 유사하기 때문에 기존 기술을 간단히 조정했습니다. Sun의 컴파일러는 IDE 전체, 특히 원래 Visual Age for Java와 같은 증분 스몰 토크 스타일 IDE에서 사용하기에 적합하지 않습니다. 항상 전체 파일을 컴파일하기를 원하기 때문입니다. IBM의 컴파일러는 변경된 단편 만 증분 컴파일 할 수 있습니다. 그것도에서 사용하는 경우에도 법적 자바,하지 미리 컴파일 할 수 있습니다
요 르그 W MITTAG

2
이클립스는 단순히 코드의 조각을 쓰기를 강조하는 클래스, 주요 방법, 또는 방법에에 넣어하지 않고 실행할 수있는 스크랩북 에 모두 .
Jörg W Mittag 2018 년

1
@ JörgWMittag 사실 Netc에 의해 사용되는 javac의 내부 API를 사용하여 동일한 목표를 모두 달성 할 수 있습니다.
Aleksandr Dubinsky

1
@AleksandrDubinsky : Visual Age for Java가 출시되었을 때 1997 년에 실제로 얼마나 잘 작동 했습니까?
Jörg W Mittag

15

모두 별도의 컴파일러입니다. javac는 일식 사이트 에서 약간 깨진 코드의 컴파일을 허용하지 않기 때문에 필요 합니다.

증분 Java 컴파일러 Eclipse 빌더로 구현되어 VisualAge for Java 컴파일러에서 발전된 기술을 기반으로합니다. 특히, 여전히 해결되지 않은 오류가 포함 된 코드를 실행하고 디버그 할 수 있습니다.


왜 "약간"깨진 코드의 컴파일을 원하십니까?
Steve Cohen

5
@SteveCohen : 컴파일러가 구문 강조, 의미 적 강조, 리팩토링 지원, 유형 검사, 코드 완성, 힌트 및 코드를 작성하는 동안 및 코드를 작성하는 동안 컴파일러가 수행하는 기타 모든 기능을 제공하기를 원하기 때문에, 그것은 불완전한 정의에 의해 어느 정도입니다 (그렇지 않으면 왜 아직도 작성합니까?) 모든 것이 이미 구현되었을 때 프로젝트의 끝에서만 작동하는 IDE는 매우 쓸모가 없습니다.
Jörg W Mittag
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.