Sự khác biệt giữa javac và trình biên dịch Eclipse là gì?


201

Là trình biên dịch Java của Eclipse chỉ là một trình bao bọc xung quanh cùng một lõi mà javacchương trình được bao bọc xung quanh hay nó là một trình biên dịch riêng biệt hoàn toàn? Nếu sau này, tại sao họ sẽ phát minh lại bánh xe?

Câu trả lời:


209

Eclipse đã triển khai trình biên dịch riêng của nó được gọi là Trình biên dịch Eclipse cho Java (ECJ).

Nó khác với javac, trình biên dịch được gửi cùng với Sun JDK. Một điểm khác biệt đáng chú ý là trình biên dịch Eclipse cho phép bạn chạy mã không thực sự biên dịch đúng. Nếu khối mã có lỗi không bao giờ được chạy, chương trình của bạn sẽ chạy tốt. Mặt khác, nó sẽ đưa ra một ngoại lệ cho biết bạn đã cố chạy mã không biên dịch.

Một sự khác biệt nữa là trình biên dịch Eclipse cho phép xây dựng gia tăng từ bên trong IDE Eclipse, nghĩa là, tất cả các mã được biên dịch ngay khi bạn nhập xong.

Thực tế là Eclipse đi kèm với trình biên dịch riêng của nó cũng rõ ràng bởi vì bạn có thể viết, biên dịch và chạy mã Java trong Eclipse mà không cần cài đặt SDK Java.

Một vài ví dụ trong đó ECJ được ưa thích hơn javac là:


3
@Bart, trình biên dịch Eclipse hoạt động đủ tốt cho các bản dựng phát hành doanh nghiệp.
jjnguy

7
@jinguy Tôi không đồng ý rằng bạn nên sử dụng trình biên dịch Eclipse để phát hành. Như bạn đã nêu trong câu trả lời, nó có thể biên dịch mã có lỗi, bạn không muốn những thứ như public void foo () {throw new Error ("Vấn đề biên dịch chưa được giải quyết: \ n \ tFOOebar không thể giải quyết \ n"); } để xuất hiện trong mã sản xuất của tôi.
Matthew Farwell

10
@Matthew Farwell Anh ấy không nói bạn nên, nhưng bạn có thể. Và nếu bạn từng tạo một bản dựng có lỗi trong đó, thì có gì đó không đúng với quy trình xây dựng của bạn ở nơi đầu tiên.
Stefan

4
Lưu ý rằng việc nhúng ECJ trong ứng dụng của bạn cho phép chương trình của bạn chạy theo JRE thay vì yêu cầu JDK.
Thorbjørn Ravn Andersen

6
@MatthewFarwell để đóng một vòng lặp ở đây: để xây dựng bản phát hành, bạn nên đơn giản là không chỉ định đối số trình biên dịch -proceedOnErrorvà đơn giản là nó sẽ không tạo ra các tệp. Class từ nguồn có lỗi.
Stephan Herrmann

36

Mọi người đã giải thích rằng họ khác nhau. Dưới đây là một số khác biệt trong hành vi mà tôi nhận thấy giữa hai trình biên dịch. Tất cả đều sôi sục với một lỗi trong (ít nhất) một trong những triển khai.

Tối ưu hóa thời gian biên dịch liên quan

Generics loại vô sinh liên quan


1
Trên thực tế tôi đã biết về sự khác biệt này sau một đêm dài: Eclipse đã báo cáo lỗi về điều gì đó đối với tôi có vẻ hợp pháp (tôi không nhớ gì), trong sự tuyệt vọng của tôi (tôi hầu như không thể tỉnh táo) Tôi chỉ cung cấp mã cho javac và sau đó nó hoạt động trơn tru! Tôi đã tìm thấy trong Google rằng tôi phải nâng cấp JDT để có thể khắc phục sự cố đó.
Abel Morelos

5
Tôi đã tìm thấy một số khác biệt giữa các trình biên dịch xử lý thuốc generic trong các trường hợp khó. Đây là hai câu hỏi tôi đã đặt ra ở đây trong trường hợp bạn muốn thêm chúng vào câu trả lời của mình: stackoverflow.com/questions/13501836/
Thẻ

5
Các lớp ẩn danh không bao giờ tĩnh theo JLS nhưng chúng có thể được khai báo trong phạm vi tĩnh. Khi sử dụng sự phản chiếu để hỏi xem một lớp như vậy có tĩnh không, mã được tạo của ECJ nói không trong khi javac's nói có . Bài viết liên quan ở đây .
Paul Bellora

2
Bất kỳ sự khác biệt về ngữ nghĩa trong mã byte được phát ra là một lỗi trong quá trình thực hiện. Điều này không thú vị theo ý kiến ​​của tôi. Tôi có thể dễ dàng tạo ra một danh sách dài các "sự khác biệt" như vậy chỉ bằng cách liệt kê các lỗi mở từ javac và ecj.
aioobe

FYI, Netbeans không chịu bất kỳ "sự khác biệt" nào vì nó sử dụng API nội bộ của javac để làm mọi thứ mà EJC làm.
Alexanderr Dubinsky

17

Trình biên dịch dựng sẵn của Eclipse dựa trên trình biên dịch java Jike của IBM . (Lưu ý rằng Eclipse cũng bắt đầu cuộc sống của nó tại IBM). Nó hoàn toàn độc lập với trình biên dịch Java của Sun trong JDK; nó không phải là một cái bọc quanh mặt trời javac.

Jike đã tồn tại trong một thời gian dài, nó từng nhanh hơn rất nhiều so với trình biên dịch Java JDK tiêu chuẩn (nhưng tôi không biết liệu điều đó có còn đúng không). Về lý do tại sao IBM muốn viết trình biên dịch Java của riêng họ: có thể vì lý do cấp phép (họ cũng có triển khai Java riêng).


31
Họ đã không thực sự viết trình biên dịch Java của riêng họ. Eclipse có một dòng dõi dài trở lại Thời đại Trực quan cho Smalltalk, trước khi Java thậm chí còn tồn tại. Vì hai ngôn ngữ thực sự hơi giống nhau, chúng chỉ đơn giản là điều chỉnh công nghệ hiện có của chúng. Trình biên dịch của Sun cũng hoàn toàn không phù hợp để sử dụng trong IDE, đặc biệt là trong IDE kiểu Smalltalk tăng dần như Visual Age gốc cho Java vì nó luôn muốn biên dịch toàn bộ tệp. Trình biên dịch của IBM có thể biên dịch tăng dần chỉ các đoạn đã thay đổi. Nó thậm chí có thể biên dịch các đoạn mã thậm chí không hợp pháp Java, được sử dụng trong
Jörg W Mittag

2
Sổ lưu niệm Eclipse nơi bạn có thể chỉ cần viết các đoạn mã, tô sáng chúng và chạy chúng, mà không cần phải đặt chúng vào một lớp, một phương thức chính hoặc thậm chí vào một phương thức nào cả .
Jörg W Mittag

1
@ JörgWMittag Trên thực tế, API nội bộ của javac (được Netbeans sử dụng) có thể được sử dụng để đạt được tất cả các mục tiêu giống nhau.
Alexanderr Dubinsky

1
@AleksandrDubinsky: Điều đó thực sự hoạt động tốt như thế nào vào năm 1997, khi Visual Age cho Java được phát hành?
Jörg W Mittag

15

Nó là một trình biên dịch riêng biệt hoàn toàn. Điều này là cần thiết vì javac không cho phép biên dịch mã bị hỏng nhẹ, từ trang nhật thực

Một trình biên dịch Java gia tăng. Được triển khai như một trình xây dựng Eclipse, nó dựa trên công nghệ được phát triển từ VisualAge cho trình biên dịch Java. Đặc biệt, nó cho phép chạy và gỡ lỗi mã vẫn chứa các lỗi chưa được giải quyết.


Tại sao bạn muốn biên dịch mã bị "hơi"?
Steve Cohen

5
@SteveCohen: Bởi vì bạn muốn trình biên dịch cung cấp tô sáng cú pháp, tô sáng ngữ nghĩa, hỗ trợ tái cấu trúc, kiểm tra kiểu, hoàn thành mã, gợi ý và tất cả những thứ khác mà trình biên dịch thực hiện trong khi bạn đang viết mã và trong khi bạn đang viết mã, Nó ít nhiều theo định nghĩa không đầy đủ (nếu không, tại sao bạn vẫn viết nó?) Một IDE chỉ hoạt động ở cuối dự án, khi mọi thứ đã được thực hiện, sẽ khá vô dụng.
Jörg W Mittag
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.