อะไรคือความแตกต่างระหว่าง 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.