อะไรคือความแตกต่างระหว่าง "การเขียน JRE เฉพาะสำหรับแต่ละแพลตฟอร์ม" สำหรับนักพัฒนา Java และ "การเขียนคอมไพเลอร์ C ++ สำหรับแต่ละแพลตฟอร์ม" สำหรับ C ++
อะไรคือความแตกต่างระหว่าง "การเขียน JRE เฉพาะสำหรับแต่ละแพลตฟอร์ม" สำหรับนักพัฒนา Java และ "การเขียนคอมไพเลอร์ C ++ สำหรับแต่ละแพลตฟอร์ม" สำหรับ C ++
คำตอบ:
Java คอมไพล์ครั้งเดียวทำงานได้ทุกที่ C ++ เขียนครั้งเดียวได้ทุกที่
"การเขียน JRE เฉพาะสำหรับแต่ละแพลตฟอร์ม" ไม่ใช่สิ่งที่คุณทำทุกครั้ง การย้าย JRE ไปยังแพลตฟอร์มใหม่เป็นสิ่งที่คุณต้องทำเพียงครั้งเดียว งานนี้ทำโดยผู้ดูแลหลัก / นักพัฒนาของโปรแกรมและ / หรือแพลตฟอร์ม ปัจจัยหลายอย่างอาจเข้ามาเล่นเมื่อตัดสินใจว่าใครและวิธีการ JRE จะได้รับการพอร์ต เหนือสิ่งอื่นใดมันขึ้นอยู่กับสิทธิ์การใช้งานที่เผยแพร่ภายใต้ (ฉันได้ยิน Java เป็นโอเพ่นซอร์สดังนั้นฉันเดาว่าทุกคนสามารถทำได้) เรื่องตลกสตีฟจ็อบส์ทำเรื่องใหญ่เกี่ยวกับการไม่ต้องการดูแลพอร์ตของ Java บน Mac เมื่อประมาณหนึ่งปีก่อน
จุดไม่ใช่วิธีที่หรือพอร์ต JRE แต่ความจริงที่ว่าเมื่อมีการ ported ทุกโปรแกรม Java ตอนนี้ควรทำงานตามทฤษฎีในเครื่องใหม่ได้อย่างง่ายดาย ในแง่นั้น JRE จะสร้างเลเยอร์ที่เป็นนามธรรมซึ่งซ่อนเครื่องไว้อย่างสมบูรณ์ทำให้สามารถย้ายได้ง่าย
อย่างไรก็ตามความจริงไม่ได้สวยเช่นนี้เสมอไป ฉันจะไม่ไปไกลเท่ากับการพกพา "ตำนาน" แต่มันเป็นความจริงที่มันไม่สมบูรณ์แบบ ตัวอย่างเช่น Java มีแพคเกจที่เรียกJNI
ว่าอนุญาตให้ส่งการโทรแบบดั้งเดิมผ่าน JRE เพื่อป้องกันการพกพาที่ไร้รอยต่อที่สมบูรณ์แบบสิ่งที่แฟน ๆ Java ต้องการเรียกว่า "เขียนครั้งเดียวทำงานได้ทุกที่"
ดังที่ได้กล่าวไว้ในความคิดเห็นวิธีการของ C ++ ต่อการพกพานั้นแตกต่างกัน ในอีกด้านหนึ่งมันเป็นภาษาที่รวบรวมและไบนารีเหล่านั้นมักจะเป็นแพลตฟอร์มที่เฉพาะเจาะจง ดังนั้น c ++ executables จะไม่สามารถพกพาได้ (ต่างจาก Java) ในทางกลับกันการย้ายคอมไพเลอร์บางครั้งก็เพียงพอแล้ว ชุมชนพบว่าการย้ายคอมไพเลอร์เช่นเดียวกับห้องสมุดหลักบางส่วนของภาษาซอร์สโค้ด (ไม่ใช่ไบนารี) สามารถพกพาได้
อย่างไรก็ตาม C ++ ใช้กันอย่างแพร่หลายในระบบที่สำคัญเช่นคอมไพเลอร์, เมล็ด, ระบบเรียลไทม์, ระบบฝังตัว, ... มีแง่มุม "C + +" ระดับต่ำที่ไม่สามารถมองข้ามได้เมื่อพูดถึงการพกพา
มันไม่ใช่แค่ภาษา - มันคือห้องสมุด
ทั้ง Java และ C ++ มีไลบรารีข้ามแพลตฟอร์ม Java ให้ชุดยิ่งขึ้น
ความแตกต่างคือ Java จะทำงานบนแพลตฟอร์มใด ๆโดยไม่ต้องรวบรวมใหม่ การมีคอมไพเลอร์ C ++ สำหรับแต่ละแพลตฟอร์มนั้นไม่เหมือนกันเลย
คำตอบทั้งหมดที่เริ่มต้นด้วย "ความแตกต่างคือ ... " หรืออะไรก็ตามที่คล้ายกันมากนั้นผิดปกติ (ขออภัย แต่นั่นคือชีวิต) มีความแตกต่างระหว่างสองอย่างจริงๆ
หนึ่ง (ที่ถูกกล่าวถึงมาก) คือโปรแกรม Java ที่คอมไพล์แล้วสามารถ (หรืออย่างน้อยควร) ที่จะใช้กับการติดตั้ง Java ได้ดังนั้นแม้หลังจากการคอมไพล์แล้วคุณยังสามารถย้ายโปรแกรม Java จากแพลตฟอร์มหนึ่งไปอีกแพลตฟอร์มหนึ่งโดยไม่ต้องคอมไพล์ใหม่ . C ++ (อย่างน้อยปกติ) ต้องการการรวบรวมใหม่สำหรับแต่ละแพลตฟอร์มเป้าหมาย
อีกอันหนึ่งคือ Java (อย่างน้อยก็พยายาม) รับรองว่า Java ที่เขียนอย่างถูกต้องทั้งหมดจะสามารถพกพาได้ อย่างน้อยในทางทฤษฎีคุณไม่ควรเขียนโค้ดใด ๆ ที่ไม่สามารถพกพาได้
C ++ ช่วยให้คุณทำบางสิ่งที่ไม่พกพาได้ มาตรฐาน C ++ มี "คำเตือน" เกี่ยวกับสิ่งต่างๆมากมายที่ไม่สามารถพกพาได้ (เช่นบอกคุณว่าคุณจะได้รับพฤติกรรมที่กำหนดไว้หรือพฤติกรรมที่ไม่ได้กำหนด) แต่ก็ไม่จำเป็นต้องหยุดคุณไม่ให้ทำ . ตัวอย่างเช่นหากคุณต้องการเขียนระบบปฏิบัติการสำหรับฮาร์ดแวร์ที่ใช้บัส PCI คุณอาจต้องอ่าน / เขียนหน่วยความจำการกำหนดค่า PCI เห็นได้ชัดว่าสิ่งนี้จะไม่สามารถพกพาไปยังระบบที่ไม่มีบัส PCI ได้ แต่ถ้าคุณเขียนระบบปฏิบัติการสำหรับฮาร์ดแวร์ที่มีบัส PCI มันจำเป็นมาก C ++ อนุญาตให้ใช้แม้ว่าจะไม่สามารถพกพาได้
คุณเข้าใจผิดสถานที่ โปรแกรม Javaนั้นพกพาได้มากเนื่องจาก JVM มีพฤติกรรมมาตรฐานที่รับประกันว่าจะเหมือนกัน โปรแกรม C ++ นั้นมีสภาพแวดล้อมที่ได้มาตรฐานน้อยกว่าใกล้เคียงกับฮาร์ดแวร์จริงดังนั้นโปรแกรมจำเป็นต้องสามารถจัดการรายละเอียดเฉพาะของแพลตฟอร์มที่หลากหลายเช่นขนาดของ int การจัดเรียงคำ ฯลฯ เป็นต้น
JVM นั้นไม่สามารถพกพาได้ มันเป็นภารกิจที่ต้องทำเพื่อพอร์ต JVM ประสิทธิภาพสูงไปยังแพลตฟอร์มอื่นหรือสถาปัตยกรรม CPU
ข้อแตกต่างคือโปรแกรม Java (ไม่ใช่ตัวย่อ) สามารถกระจายในรูปแบบที่สามารถเรียกใช้บนคอมพิวเตอร์ที่ติดตั้ง JVM ได้ แต่ C ++ จะกระจายตามปกติเป็นซอร์สโค้ดซึ่งเป็นผู้ใช้ที่ไม่เป็นมิตรหรือเป็นพวง ของไบนารีที่แตกต่างกันสำหรับแพลตฟอร์มที่แตกต่างกัน
หนึ่งในเหตุผลที่ Java ถูกพิจารณาว่าพกพาได้ก็คือมันมีกฎเฉพาะสำหรับวิธีการประเมินค่านิพจน์ทางคณิตศาสตร์และห้ามการใช้งานจากการประเมินพวกเขาด้วยวิธีอื่นใด ๆ แม้ว่าจะประเมินด้วยวิธีที่ได้รับคำสั่งแล้วก็ตาม แฟชั่น.
ตัวอย่างเช่นกำหนด
long thing1(int x) {
return (x+1)-1L;
}
double thing2(int x, float y) {
return x/y;
}
ค่าของthing1(2147483647)
และthing2(1123456700,11234567.0f)
จำเป็นต้องเป็น -2147483649L และ 99.9999923706054688 ตามลำดับแม้ว่าค่าที่ถูกต้องทางคณิตศาสตร์จะเป็น 2147483647L และ 100.0 และแม้ว่าในบางรหัสแพลตฟอร์มเพื่อสร้างผลลัพธ์ที่ไม่ถูกต้องเชิงตัวเลขจะช้ากว่ารหัสเพื่อสร้างผลลัพธ์ที่ไม่ถูกต้องเชิงตัวเลข ผลลัพธ์ (บนแพลตฟอร์ม 64- บิตบางส่วนบังคับให้มีการตัดคำสั่งหลัง (x + 1) จะต้องมีคำสั่งพิเศษและบนแพลตฟอร์ม 8x87 การบังคับค่า 1123456700 ให้ปัดเป็น a float
จะต้องมีคำสั่งพิเศษเมื่อเทียบกับการโหลด โดยตรงไปยังการลงทะเบียนที่มีความแม่นยำสูง)
(int)
สำหรับ(x+1)
subexpression ของตัวอย่างแรกในตัวอย่างแรกไปยังพารามิเตอร์float
ตัวอย่างที่สองx
แต่เห็นได้ชัดว่าฉันไม่ได้ออกแบบภาษา .
ปริมาณงานสำหรับเครื่องมือสนับสนุนนั้นคล้ายกันจริงความแตกต่างอยู่ที่อื่น เมื่อรวบรวมโปรแกรม C ++ สำหรับแพลตฟอร์มแล้วคุณต้องรวบรวมอีกครั้งหากคุณต้องการใช้ในแพลตฟอร์มอื่น อย่างไรก็ตามเมื่อคอมไพล์โปรแกรม Java แล้วคุณสามารถย้ายไปยังแพลตฟอร์มอื่นด้วยสภาพแวดล้อมรันไทม์โดยไม่ต้องคอมไพล์ใหม่
ตอบชื่อเรื่อง "ความสะดวกในการพกพาเป็นตำนานหรือไม่" แทนที่จะเป็น "ความสามารถในการพกพาที่ดีกว่า Java หรือ C ++" ฉันจะบอกได้ว่าการพกพาบางส่วนนั้นเป็นไปได้
สิ่งที่ฉันยืนยันที่จะเขียนและใช้กับคำถามนี้คือนักพัฒนาไม่ได้ทำงานกับภาษาการเขียนโปรแกรมอีกต่อไป แต่ด้วยกรอบการเขียนโปรแกรมแบบเต็ม
และเฟรมเวิร์กเหล่านั้นรวมถึงไลบรารีฐานข้อมูลอินเตอร์เฟสแบบกราฟิก
ภาษาการเขียนโปรแกรมใดหรือกรอบการเขียนโปรแกรมใดที่สามารถพกพาได้มากกว่า
ขึ้นอยู่กับว่าแอพของคุณเป็นอย่างไร พยายามบรรลุ
สิ่งที่เป็น "คุณ" ไม่ได้เขียน JRE ที่คุณเขียนโค้ด Java ที่ทำงานบนใด ๆ JRE"คุณ" อย่าเขียนรหัส c ++ ซึ่งสามารถต้องมีการเปลี่ยนแปลงโดยคุณก่อนที่มันจะรวบรวมบนแพลตฟอร์มอื่น
หลายคนลืมหรือไม่คำนึงถึงความเป็นจริงของ Java เมื่อพวกเขาพูดว่า "มันพกพาได้ 100%" หรือวลีเช่นนั้น
บริษัท Corporations / Software สำคัญ ๆ ส่วนใหญ่นั้นมีการใช้งาน Java อย่างน้อย 1 ครั้งกับ JRE ที่เกี่ยวข้องในอดีตที่ผ่านมาและบางส่วนยังคงใช้งานได้เช่น Microsoft, IBM และ Apple เป็นต้นว่า Java ของพวกเขามีเวอร์ชั่นของตนเอง ความคิดและความคิดของตนเองเกี่ยวกับอุตสาหกรรมและภาษาดังกล่าว
เป็นอย่างไรสำหรับ "พกพา" JRE ทุกที่ที่คุณเลี้ยว
และนี่คือสิ่งที่ Sun / Oracle ไม่ได้ทำ
ตัวอย่างเกี่ยวกับสาเหตุที่โค้ด Java อยู่ไม่ไกลจาก C และ C ++ ในแง่ของความสะดวกในการพกพาคือ GUI และเซิร์ฟเวอร์กราฟิก, Apple มีการใช้งานกรอบมาตรฐาน GUI สำหรับ JRE ของตัวเองไม่ได้มาตรฐานเนื่องจากมีจำนวนมาก ปวดหัวและทำงานสองเท่าสำหรับทุกคนที่ต้องการสร้าง / พอร์ต GUI โดยใช้ Java สำหรับเครื่อง Apple และโดยพื้นฐานแล้วพวกเขาถูกบังคับให้จัดการกับ Quartz (ในแง่ของ "อำนาจ" และภาษาระดับสูง)
บางครั้งแม้แต่คำที่ใช้บ่อยที่สุดก็ไม่ได้สะท้อนความหมายที่ผู้คนมักจะให้พวกเขาสำหรับฉันคำว่า "การพกพา" ในโลกของ Java ก็เหมือนกับ "มุมมอง" ในแง่สามัญสำนึก ในแง่การค้าและการเงินมีแนวโน้มที่ดีกว่าสำหรับคุณถ้าคุณใช้จาวามากกว่าภาษาอื่น (อย่างน้อยตอนที่เกิด Java) เพราะคุณมีงานมากมายที่ทำไปแล้วด้านหนึ่ง (คุณได้รับ JRE ในทุกสิ่ง ที่ถือได้ว่าเป็น "คอมพิวเตอร์") และ codebase ของคุณน่าจะพกพาได้เพราะคุณต้องการทรัพยากรน้อยกว่าในการพอร์ตโปรแกรมของคุณไม่ว่าทรัพยากรจะเป็นเงินเวลาหรือกำลังคนก็ไม่สำคัญ เมื่อเทียบกับเทคโนโลยีอื่น ๆ และนั่นคือสิ่งที่ Java มีไว้สำหรับมันจะลดเกณฑ์ที่
แน่นอนว่านี่เป็นเรื่องจริงถ้าคุณยอมรับสถานที่ของ Java ซึ่งหมายถึงเครื่องเสมือนที่มีการรวบรวมขยะซึ่งหมายความว่ามันใช้ทรัพยากรมากกว่าเมื่อเทียบกับภาษาท้องถิ่นหากคุณต้องการบีบ CPU สูงสุดหรือฟาร์มเซิร์ฟเวอร์ของคุณออกให้หมด อย่าคิดว่าคุณสามารถปรับใช้จาวาได้เว้นแต่ว่าคุณมีทรัพยากรเหลือน้อยมากหรือ บริษัท ของคุณมีขนาดเล็กมาก
ฉันยังต้องหาแอปพลิเคชั่น Java ที่ไม่สำคัญซึ่งมีเพียง 1 เวอร์ชันสำหรับแต่ละบรรทัดของโค้ดหรือการทำงาน (หรือที่รู้จักโดยไม่มีสิ่งใดที่แพลตฟอร์มเฉพาะ) และมันพกพาได้ 100% ในบรรดา JRE ที่สำคัญทั้งหมด