อะไรคือความแตกต่างระหว่าง javac และคอมไพเลอร์ Eclipse?


201

คอมไพเลอร์ Java ของ Eclipse เป็นเพียงตัวคลุมรอบแกนกลางเดียวกันกับที่javacโปรแกรมถูกล้อมรอบหรือเป็นคอมไพเลอร์แยกกันทั้งหมดหรือไม่ หากหลังทำไมพวกเขาจะบูรณาการล้อ?

คำตอบ:


209

Eclipse ได้ใช้คอมไพเลอร์ของตัวเองที่เรียกว่าEclipse Compiler สำหรับ Java (ECJ)

มันแตกต่างจาก javac ซึ่งเป็นคอมไพเลอร์ที่มาพร้อมกับ Sun JDK ข้อแตกต่างที่น่าสังเกตประการหนึ่งคือคอมไพเลอร์ Eclipse ให้คุณเรียกใช้โค้ดที่ไม่ได้รวบรวมอย่างถูกต้อง หากบล็อกของรหัสที่มีข้อผิดพลาดไม่เคยทำงานโปรแกรมของคุณจะทำงานได้ดี มิฉะนั้นจะมีข้อผิดพลาดระบุว่าคุณพยายามเรียกใช้รหัสที่ไม่ได้รวบรวม

ข้อแตกต่างอีกประการคือคอมไพเลอร์ Eclipse อนุญาตให้สร้างบิลด์จากภายใน Eclipse IDE กล่าวคือโค้ดทั้งหมดจะถูกคอมไพล์ทันทีที่คุณพิมพ์เสร็จ

ความจริงที่ว่า Eclipse มาพร้อมกับคอมไพเลอร์ของตัวเองก็ชัดเจนเช่นกันเพราะคุณสามารถเขียนรวบรวมและเรียกใช้โค้ด Java ใน Eclipse โดยไม่ต้องติดตั้ง Java SDK

ตัวอย่างเล็ก ๆ น้อย ๆ ที่ ECJ ต้องการมากกว่า javac คือ:


3
@Bart คอมไพเลอร์ Eclipse ทำงานได้ดีพอสำหรับการสร้างรีลีสขององค์กร
jjnguy

7
@ Jinguy ฉันไม่เห็นด้วยที่คุณควรใช้คอมไพเลอร์ Eclipse สำหรับการเปิดตัว ตามที่คุณระบุไว้ในคำตอบมันสามารถรวบรวมรหัสที่มีข้อผิดพลาดคุณไม่ต้องการสิ่งที่เป็นโมฆะสาธารณะ foo () {โยนข้อผิดพลาดใหม่ ("ปัญหาการรวบรวมที่ไม่ได้รับการแก้ไข: \ n \ tFOOBAR ไม่สามารถแก้ไข \ n"); } เพื่อปรากฏในรหัสการผลิตของฉัน
Matthew Farwell

10
@ Matthew Farwell เขาไม่ได้บอกว่าคุณควรทำ แต่คุณทำได้ และถ้าคุณเคยสร้างบิลด์ที่มีข้อผิดพลาดอยู่ก็มีบางอย่างผิดปกติกับบิลด์ของคุณในตอนแรก
สเตฟาน

4
โปรดทราบว่าการฝัง ECJ ในแอปพลิเคชันของคุณทำให้โปรแกรมของคุณทำงานภายใต้ JRE แทนที่จะต้องใช้ JDK
Thorbjørn Ravn Andersen

6
@MatthewFarwell เพื่อปิดห่วงที่นี่: สำหรับรุ่นสร้างคุณควรเพียงไม่ระบุอาร์กิวเมนต์คอมไพเลอร์-proceedOnErrorและมันจะไม่เพียงแค่ผลิตไฟล์ .class จากแหล่งที่มีข้อผิดพลาด
เตฟานมานน์

36

ทุกคนอธิบายแล้วว่าพวกเขาแตกต่างกัน นี่คือความแตกต่างของพฤติกรรมที่ฉันสังเกตุระหว่างคอมไพเลอร์ทั้งสอง พวกเขาทั้งหมดลงไปที่ข้อผิดพลาดใน (อย่างน้อย) หนึ่งในการใช้งาน

การคอมไพล์เวลาที่เกี่ยวข้อง

ข้อมูลทั่วไปเกี่ยวกับยาสามัญสามัญประเภทที่เกี่ยวข้อง


1
ที่จริงฉันรู้เกี่ยวกับความแตกต่างนี้หลังจากคืนที่ยาวนาน: Eclipse รายงานข้อผิดพลาดเกี่ยวกับสิ่งที่ฉันดูเหมือนถูกกฎหมาย (ฉันจำไม่ได้ว่าอะไร) ในความสิ้นคิดของฉัน (ฉันแทบจะไม่ตื่นตัว) ฉันแค่ป้อนรหัสเพื่อ javac และ จากนั้นก็ทำงานได้อย่างราบรื่น! ฉันพบใน Google ว่าต้องอัพเกรด JDT เพื่อรับการแก้ไขสำหรับปัญหานั้น
Abel Morelos

5
ฉันพบความแตกต่างจำนวนมากระหว่างคอมไพเลอร์ที่จัดการกับยาชื่อสามัญในกรณีที่ยากลำบาก นี่คือสองฉันทำคำถามเกี่ยวกับที่นี่ในกรณีที่คุณต้องการที่จะเพิ่มให้กับคำตอบของคุณ: stackoverflow.com/questions/13501836/... stackoverflow.com/questions/13980552/...
อีเลียส Vasylenko

5
คลาสที่ไม่ระบุชื่อจะไม่คงที่ตาม JLS แต่สามารถประกาศได้ในขอบเขตคงที่ เมื่อใช้การสะท้อนจะถามว่าระดับดังกล่าวเป็นแบบคงที่ ECJ ของรหัสที่สร้างขึ้นในขณะที่บอกว่าไม่มี javac ของบอกว่าใช่ โพสต์ที่เกี่ยวข้องที่นี่
Paul Bellora

2
ความแตกต่างเชิงความหมายใด ๆ ในไบต์ที่ปล่อยออกมานั้นเป็นข้อบกพร่องในการนำไปใช้งานอย่างใดอย่างหนึ่ง นี่ไม่ใช่ความคิดของฉันที่น่าสนใจ ฉันสามารถสร้างรายการ "ความแตกต่าง" แบบยาวได้อย่างง่ายดายโดยเพียงแค่แสดงรายการบั๊กที่เปิดจาก javac และ ecj
aioobe

FYI, Netbeans ไม่ประสบกับ "ความแตกต่าง" ดังกล่าวเนื่องจากใช้ API ภายในของ javac เพื่อทำทุกอย่างที่ EJC ทำ
Aleksandr Dubinsky

17

คราสในตัวคอมไพเลอร์จะขึ้นอยู่กับของไอบีเอ็มJikes คอมไพเลอร์จาวา (โปรดทราบว่า Eclipse เริ่มต้นชีวิตที่ IBM ด้วย) เป็นอิสระอย่างสมบูรณ์จากคอมไพเลอร์ Java ของ Sun ใน JDK javacมันไม่ได้เป็นห่อหุ้มรอบดวงอาทิตย์

Jikes มีอยู่เป็นเวลานานมันเคยเร็วกว่าคอมไพเลอร์ JDK Java มาตรฐานมาก (แต่ฉันไม่รู้ว่ามันยังคงเป็นจริง) เหตุผลที่ IBM ต้องการเขียน Java คอมไพเลอร์ของตัวเอง: อาจเป็นเพราะเหตุผลการออกใบอนุญาต (พวกเขามีการติดตั้ง Java ของตัวเองด้วย)


31
พวกเขาไม่ได้เขียนคอมไพเลอร์ Java ของตัวเองจริงๆ Eclipse มีสายเลือดที่ยาวกลับสู่ Visual Age สำหรับ Smalltalk ก่อนที่ Java จะมีอยู่จริง เนื่องจากทั้งสองภาษามีความคล้ายคลึงกันพวกเขาจึงปรับใช้เทคโนโลยีที่มีอยู่เดิม คอมไพเลอร์ของซันยังไม่เหมาะสมอย่างสมบูรณ์สำหรับการใช้งานใน IDE โดยเฉพาะอย่างยิ่งใน IDE แบบ Smalltalk สไตล์ที่เพิ่มขึ้นเช่น Visual Age เดิมสำหรับ Java เนื่องจากมันต้องการรวบรวมไฟล์ทั้งหมด คอมไพเลอร์ของ IBM สามารถรวบรวมได้เฉพาะส่วนที่เปลี่ยนไปเท่านั้น มันยังสามารถรวบรวมตัวอย่างที่ไม่ได้เป็นจาวาที่ถูกกฎหมายซึ่งใช้ใน
Jörg W Mittag

2
Eclipse scrapbook ที่คุณสามารถเขียนตัวอย่างโค้ดไฮไลต์และเรียกใช้โดยไม่ต้องใส่ลงในคลาสวิธีหลักหรือแม้แต่เป็นวิธีเลยก็ได้
Jörg W Mittag

1
@ JörgWMittagที่จริงแล้ว API ภายในของ javac (ที่ใช้โดย Netbeans) สามารถใช้เพื่อให้บรรลุเป้าหมายเดียวกันทั้งหมด
Aleksandr Dubinsky

1
@AleksandrDubinsky: มันใช้งานได้ดีจริง ๆ ในปี 1997 เมื่อ Visual Age for Java ได้รับการเผยแพร่?
Jörg W Mittag

15

มันเป็นคอมไพเลอร์แยกกันโดยสิ้นเชิง สิ่งนี้จำเป็นเนื่องจาก javac ไม่อนุญาตให้รวบรวมโค้ดที่เสียหายเล็กน้อยจากไซต์ eclipse

คอมไพเลอร์ Java ที่เพิ่มขึ้น ดำเนินการในฐานะผู้สร้าง Eclipse ขึ้นอยู่กับเทคโนโลยีที่พัฒนาจาก VisualAge สำหรับคอมไพเลอร์ Java โดยเฉพาะอย่างยิ่งมันช่วยให้การเรียกใช้และแก้จุดบกพร่องรหัสซึ่งยังคงมีข้อผิดพลาดที่ยังไม่ได้แก้ไข


ทำไมคุณต้องการรวบรวมรหัสที่เสียหาย "เล็กน้อย"
Steve Cohen

5
@SteveCohen: เพราะคุณต้องการให้คอมไพเลอร์ให้การเน้นไวยากรณ์, การเน้นความหมาย, การสนับสนุนการกำหนดรูปแบบใหม่, การตรวจสอบประเภท, การกรอกรหัส, คำแนะนำและสิ่งอื่น ๆ ที่คอมไพเลอร์ทำในขณะที่คุณเขียนรหัสของคุณ มันจะมากหรือน้อยตามคำจำกัดความที่ไม่สมบูรณ์ (ไม่เช่นนั้นทำไมคุณยังเขียนมันอยู่) IDE ที่ใช้งานได้ในตอนท้ายของโครงการเมื่อทุกอย่างถูกนำไปใช้แล้วจะไร้ประโยชน์เลยทีเดียว
Jörg W Mittag
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.