Apa perbedaan antara javac dan kompilator Eclipse?


201

Apakah kompiler Java Eclipse hanya pembungkus inti yang sama dengan javacprogram yang dibungkus, atau apakah itu kompilator terpisah sama sekali? Jika yang terakhir, mengapa mereka menemukan kembali roda?

Jawaban:


209

Eclipse telah mengimplementasikan kompilernya sendiri yang disebut Eclipse Compiler for Java (ECJ).

Ini berbeda dari javac, kompiler yang dikirimkan bersama Sun JDK. Satu perbedaan penting adalah bahwa kompiler Eclipse memungkinkan Anda menjalankan kode yang sebenarnya tidak benar-benar dikompilasi. Jika blok kode dengan kesalahan tidak pernah dijalankan, program Anda akan berjalan dengan baik. Jika tidak, itu akan mengeluarkan pengecualian yang menunjukkan bahwa Anda mencoba menjalankan kode yang tidak dikompilasi.

Perbedaan lain adalah bahwa kompilator Eclipse memungkinkan untuk membangun tambahan dari dalam Eclipse IDE, yaitu, semua kode dikompilasi segera setelah Anda selesai mengetik.

Fakta bahwa Eclipse hadir dengan kompilernya sendiri juga jelas karena Anda dapat menulis, mengkompilasi, dan menjalankan kode Java di Eclipse tanpa menginstal Java SDK.

Beberapa contoh di mana ECJ lebih disukai daripada javac adalah:


3
@ Bart, kompiler Eclipse bekerja cukup baik untuk versi rilis perusahaan.
jjnguy

7
@jinguy Saya tidak setuju bahwa Anda harus menggunakan kompiler Eclipse untuk rilis. Seperti yang Anda nyatakan dalam jawaban, itu dapat mengkompilasi kode dengan kesalahan, Anda tidak ingin hal-hal seperti public void foo () {throw new Error ("Masalah kompilasi yang belum terselesaikan: \ n \ tFOOBAR tidak dapat diselesaikan \ n"); } untuk muncul dalam kode produksi saya.
Matius Farwell

10
@Matthew Farwell Dia tidak mengatakan Anda harus, tetapi Anda bisa. Dan jika Anda pernah membuat build dengan kesalahan di dalamnya, maka ada sesuatu yang salah dengan proses build Anda.
Stefan

4
Perhatikan bahwa menanamkan ECJ di aplikasi Anda memungkinkan program Anda berjalan di bawah JRE alih-alih membutuhkan JDK.
Thorbjørn Ravn Andersen

6
@MatthewFarwell untuk menutup loop di sini: untuk rilis rilis Anda disarankan untuk tidak menentukan argumen kompiler -proceedOnErrordan itu tidak akan menghasilkan file .class dari sumber dengan kesalahan.
Stephan Herrmann

36

Semua orang sudah menjelaskan bahwa mereka berbeda. Berikut adalah beberapa perbedaan perilaku yang saya perhatikan di antara kedua penyusun. Mereka semua bermuara pada bug di (setidaknya) salah satu implementasi.

Terkait kompilasi optimasi waktu

Kesimpulan tipe generik terkait


1
Sebenarnya saya tahu tentang perbedaan ini setelah malam yang panjang: Eclipse melaporkan kesalahan tentang sesuatu yang bagi saya tampak legal (saya tidak ingat apa), dalam keputusasaan saya (saya hampir tidak bisa tetap terjaga) saya hanya memasukkan kode ke javac dan maka itu bekerja dengan lancar! Saya menemukan di Google bahwa saya harus memutakhirkan JDT untuk mendapatkan perbaikan untuk masalah itu.
Abel Morelos

5
Saya telah menemukan sejumlah perbedaan antara kompiler yang menangani obat generik dalam kasus-kasus sulit. Berikut adalah dua pertanyaan yang saya ajukan di sini jika Anda ingin menambahkannya ke jawaban Anda: stackoverflow.com/questions/13501836/... stackoverflow.com/questions/13980552/…
Elias Vasylenko

5
Kelas anonim tidak pernah statis sesuai dengan JLS tetapi mereka dapat dideklarasikan dalam lingkup statis. Saat menggunakan refleksi untuk bertanya apakah kelas seperti itu statis, kode yang dihasilkan ECJ mengatakan tidak, sedangkan javac mengatakan ya . Posting terkait di sini .
Paul Bellora

2
Setiap perbedaan semantik dalam bytecode yang dipancarkan adalah bug dalam implementasi mana pun. Ini tidak terlalu menarik menurut saya. Saya dapat dengan mudah menghasilkan daftar panjang "perbedaan" seperti itu dengan hanya mendaftar bug terbuka dari javac dan ecj.
aioobe

FYI, Netbeans tidak mengalami "perbedaan" seperti itu karena menggunakan API internal javac untuk melakukan semua yang dilakukan EJC.
Aleksandr Dubinsky

18

Compiler internal Eclipse didasarkan pada kompiler java Jikes IBM . (Perhatikan bahwa Eclipse juga memulai kehidupannya di IBM). Ini sepenuhnya independen dari kompiler Java Sun di JDK; itu bukan pembungkus sekitar Sun javac.

Jikes sudah ada sejak lama, dulu jauh lebih cepat daripada kompiler JDK Java standar (tapi saya tidak tahu apakah itu masih benar). Mengenai mengapa IBM ingin menulis kompiler Java sendiri: mungkin karena alasan lisensi (mereka juga memiliki implementasi Java sendiri).


31
Mereka tidak benar - benar menulis kompiler Java mereka sendiri. Eclipse memiliki garis keturunan yang panjang kembali ke Visual Age for Smalltalk, bahkan sebelum Jawa ada. Karena kedua bahasa tersebut sebenarnya agak mirip, mereka hanya mengadaptasi teknologi yang ada. Kompiler Sun juga sama sekali tidak cocok untuk digunakan dalam IDE, terutama dalam IDE gaya Smalltalk tambahan seperti Visual Age for Java asli karena selalu ingin mengkompilasi seluruh file. Kompiler IBM secara bertahap dapat mengkompilasi hanya fragmen yang telah berubah. Ia bahkan dapat mengkompilasi cuplikan yang bahkan bukan Java legal, yang digunakan dalam
Jörg W Mittag

2
Eclipse scrapbook di mana Anda bisa menulis potongan kode, menyorotnya dan menjalankannya, tanpa harus memasukkannya ke dalam kelas, metode utama, atau bahkan ke metode sama sekali .
Jörg W Mittag

1
@ JörgWMittag Sebenarnya, API internal javac (seperti yang digunakan oleh Netbeans) dapat digunakan untuk mencapai semua tujuan yang sama.
Aleksandr Dubinsky

1
@AleksandrDubinsky: Seberapa baik itu benar-benar berfungsi pada tahun 1997, ketika Visual Age for Java dirilis?
Jörg W Mittag

15

Ini adalah kompiler yang terpisah sama sekali. Ini diperlukan karena javac tidak mengizinkan kompilasi kode yang sedikit rusak, dari situs gerhana

Kompiler Java tambahan. Diterapkan sebagai pembangun Eclipse, didasarkan pada teknologi yang dikembangkan dari VisualAge untuk kompiler Java. Secara khusus, ini memungkinkan untuk menjalankan dan men-debug kode yang masih mengandung kesalahan yang belum terselesaikan.


Mengapa Anda ingin kompilasi kode "sedikit" rusak?
Steve Cohen

5
@SteveCohen: Karena Anda ingin kompiler menyediakan penyorotan sintaks, penyorotan semantik, dukungan refactoring, pengecekan jenis, penyelesaian kode, petunjuk, dan semua hal lain yang dilakukan kompiler saat Anda menulis kode, dan saat Anda menulis kode, itu kurang lebih menurut definisi tidak lengkap (jika tidak, mengapa Anda masih menulisnya?) IDE yang hanya bekerja di akhir proyek, ketika semuanya sudah dilaksanakan, akan sangat tidak berguna.
Jörg W Mittag
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.