Java (ยัง) เป็นภาษาข้ามแพลตฟอร์มที่เลือกหรือไม่ [ปิด]


20

เมื่อฉันเริ่มใช้ Java ใน nineties นั่นคือทั้งหมด " เขียนครั้งเดียวทำงานได้ทุกที่ " ตั้งแต่วันแรก นั่นอาจเป็นจริงทั้งหมดและฉันก็เป็นส่วนหนึ่งของคณะนักร้องด้วย

ฉันไม่แน่ใจว่าจะต้องคิดอะไรอีกต่อไปพิจารณาภาษาอื่น ๆ ทั้งหมดโดยใช้หลายแพลตฟอร์มรันไทม์ (python, flash, perl, html, php ... ) แต่ฉันยังเห็นข้อโต้แย้งมากมายที่บอกว่าคุณควรใช้ Java เพราะมันควรจะดีกว่าสำหรับการพัฒนาข้ามแพลตฟอร์ม

ดังนั้นวันนี้ยังเป็นจริงหรือไม่? Java ยังคงเป็นภาษาของทางเลือกสำหรับการพัฒนาหลายแพลตฟอร์มหรือไม่?

  • โปรดเจาะจงโดยเน้นด้านข้ามแพลตฟอร์ม
  • ฉันไม่ได้ขอเปรียบเทียบคุณสมบัติทั่วไปของภาษา

อัปเดต: การตอบสนองที่ยอดเยี่ยม! คำตอบส่วนใหญ่น่าจะเป็นที่นิยม Java หรือเว็บ ข้อมูลใด ๆ จากฝูงชนสคริปต์หรือไม่


ดูเพิ่มเติมที่: programmers.stackexchange.com/questions/15610/…
Eric Wilson

3
ความคิดเห็นนี้ไม่ได้ตอบคำถาม แต่เป็นปัจจัยที่ต้องพิจารณา: เว็บแอปที่ใช้ Java เป็นเป้าหมายสำหรับผู้ใช้ Windows เป็นสิ่งที่ควรหลีกเลี่ยง Oracle JVM สำหรับ Windows มีปัญหาด้านความปลอดภัยจำนวนมากเมื่อไม่นานมานี้ ดังนั้นคุณอาจพบว่าผู้ใช้ที่มีความชำนาญจะไม่ใช้เว็บแอพที่ใช้ Java เพราะพวกเขาได้ถอนการติดตั้ง JVM แล้ว
กระตุ้น

คำถามของคุณขึ้นอยู่กับข้อสันนิษฐานที่ว่าแม้แต่ภาษาข้ามแพลตฟอร์มที่เลือกไว้เพื่อเริ่มต้น
Lucas Ramage

คำตอบ:


10

ภาษาสไตล์การเขียนสคริปต์เช่น python ทำให้การพัฒนาข้ามแพลตฟอร์มง่ายขึ้น ตอนนี้ไม่ว่าคุณจะชอบ Python (หรือภาษาอื่น ๆ ) ขึ้นอยู่กับคุณและเราอาจไม่จำเป็นต้องเริ่มการอภิปรายที่นี่

Java พยายามบังคับให้คุณเขียนโค้ดซึ่งจะทำงานได้แบบพกพาในขณะที่ python อนุญาตให้คุณเขียนโค้ดแบบพกพา ภาษาไพ ธ อนตัวจริงนั้นจะทำงานได้แบบพกพา แต่ไลบรารีภายนอกอาจมีหรือไม่มีก็ได้ นอกจากนี้ไพ ธ อนจะให้การเข้าถึงบริการเฉพาะแพลตฟอร์มได้อย่างอิสระ

Java มีประโยชน์หรือไม่ ฉันคิดว่าในกรณีใดคุณสามารถเขียนรหัสพกพาได้อย่างง่ายดายคล้ายกัน นั่นคือคุณสามารถเขียนรหัสและโดยปกติจะทำงานบนแพลตฟอร์มที่แตกต่างกัน แต่คุณไม่สามารถหนีไปได้ด้วยการเขียนโค้ดและคิดว่ามันจะใช้ได้ทุกที่ ฉันได้ทำงานในโครงการงูหลามซึ่งผลิตเวอร์ชันสำหรับ Windows, Linux และ Mac และเราพบปัญหาข้ามแพลตฟอร์มน้อยมาก (อันเดียวที่ฉันจำได้ก็คือเนื่องจากมีข้อบกพร่องในห้องสมุดที่เราใช้ pygame ซึ่งทำให้เกิดปัญหาการวาดภาพบน Linux สิ่งนี้ได้รับการแก้ไขโดยการอัพเกรดรุ่นของ pygame ที่เราใช้)

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

ในที่สุดฉันคิดว่ามันเป็นภาษาที่คุณต้องการใช้งานและการปรับใช้แบบไหนที่คุณต้องใช้


18

ในขณะที่ Java อาจจะไม่หรือทำงานได้เพียงเครื่องมือข้ามแพลตฟอร์มก็มีจุดแข็งบางส่วน:

  • มันเร็วมาก
  • มันแข็งแกร่งมาก
  • มันสามารถพกพาได้อย่างมาก (เช่น bytecode รวบรวมเมื่อ 10 ปีก่อนใน Windows 95 ทำงานได้ดีใน OS X วันนี้)

และจุดอ่อนบางอย่าง:

  • ไลบรารี Core GUI (Swing ... ) กำลังแสดงอายุของพวกเขา (ความช่วยเหลือจากบุคคลที่สามเพิ่มเติมที่นี่)
  • ภาษาอาจมีความละเอียดน้อยลง (เช่นข้อยกเว้นที่ตรวจสอบแล้ว ... )
  • เวลาเริ่มต้นอาจเป็นปลากระพง (แม้ว่าจะปรับปรุงตลอดเวลา)

เมื่อพูดถึง Java โดยเฉพาะเกี่ยวกับแพลตฟอร์มมีอีกหนึ่งจุด

  • มีภาษาไม่กี่ภาษาที่รันบน JVM และทำงานร่วมกับ Java

19
เร็วสุด ๆ เมื่อเทียบกับอะไร
HardCode

18
@HardCode: เปรียบเทียบกับภาษาที่ตีความหรือภาษาที่รวบรวมส่วนใหญ่ C และ C ++ สามารถสร้างได้เร็วขึ้นในบางกรณี แต่มันก็ยากและยังคงเพิ่มขึ้นเรื่อย ๆ เมื่อจำนวนแกนเพิ่มขึ้น ด้วยการทำงานพร้อมกันของ Java (การใช้หลายคอร์ได้อย่างมีประสิทธิภาพ) เป็นวิธีที่ง่ายกว่าที่จะบรรลุในทางปฏิบัติ
Joonas Pulakka

5
@HardCode เห็นได้ชัดว่า JVM เป็นรันไทม์ที่เร็วที่สุดสำหรับเกือบทุกภาษาที่ตีความ (เทียบกับคนที่แฮ็กเกอร์ภาษาทำเอง)

14

มันเป็นความจริงทุกวันนี้เหมือนย้อนกลับไป - นั่นคือการพูดไม่ได้ทั้งหมด Java เขียนครั้งเดียวทดสอบและแก้ไขข้อบกพร่องทุกที่ แน่นอนว่ามันทำงานน้อยกว่าพอร์ตที่สดใหม่อย่างสมบูรณ์ แต่โดยทั่วไปแล้วเราจะเชื่อมากกว่า hype เริ่มต้น

ผลิตภัณฑ์ของเรามีเซิร์ฟเวอร์ Java ซึ่งจะทำงานบน Windows หรือ Linux แต่เราได้เห็นปัญหาเฉพาะของระบบปฏิบัติการกับมันและตรวจสอบให้แน่ใจว่าเรามีทั้งเซิร์ฟเวอร์ Linux และ Windows สำหรับการสนับสนุน / ทดสอบหากจำเป็น Java UIs มีแนวโน้มที่จะมีปัญหามากกว่าเซิร์ฟเวอร์ (แม้ว่าส่วนใหญ่จะเป็นเครื่องสำอางและอาจถูกเพิกเฉยขึ้นอยู่กับแอปพลิเคชัน)

ในขณะที่ไม่ได้ใช้ภาษาอย่างเคร่งครัดสำหรับฉันเว็บเป็นแพลตฟอร์มข้ามแพลตฟอร์มที่เลือกไว้ ส่วนหน้า HTML / JavaScript หมายความว่าแอปพลิเคชันของคุณจะทำงานบนแพลตฟอร์มไคลเอนต์ใด ๆ และในกรณีส่วนใหญ่ที่เป็นเป้าหมายจริง - โดยไม่ต้องกังวลว่าจะเป็น Mac หรือ PC ซึ่งเป็นเวอร์ชั่นของระบบปฏิบัติการและอื่น ๆ

แน่นอนว่าโดยทั่วไปคุณจะยังคงกำหนดแพลตฟอร์มเซิร์ฟเวอร์อยู่ แต่เมื่อมันกลายเป็นว่าคนมีความยืดหยุ่นมากขึ้นโดยเฉพาะอย่างยิ่งวันนี้เมื่อ บริษัท ส่วนใหญ่สนับสนุนเซิร์ฟเวอร์ Windows และ Linux ผสมกันอยู่แล้ว


8
คำตอบที่ดี. แน่นอนว่าแอปของคุณทำงานได้ดีในเบราว์เซอร์ทุกเวอร์ชันสามารถปวดหัวได้เช่นกัน
ทิมกู๊ดแมน

5
@Tim: จุดดี ฉันเชื่อว่าแอปเบราว์เซอร์นั้น "ทดสอบและแก้ไขข้อบกพร่องได้ทุกที่" มากกว่าแอป Java Desktop
Joonas Pulakka

5
@Tim: +1 การเรียกใช้แอพพลิเคชั่นเว็บแอพให้ทำงานเหมือนกันในเบราว์เซอร์หลัก ๆ ทั้งหมดนั้นทำได้ยากเช่นเดียวกับการใช้แอพ Java ให้ทำงานเหมือนกันในหลาย ๆ ระบบปฏิบัติการ
Yevgeniy Brikman

3
"เขียนหนึ่งครั้งแก้จุดบกพร่องทุกที่" ไม่เป็นความจริงในประสบการณ์ของฉัน ตราบใดที่คุณมีเหตุผลและหลีกเลี่ยงการพึ่งพาเฉพาะแพลตฟอร์มฉันไม่มีปัญหาในการรันโค้ด Java เดียวกันบนหลายแพลตฟอร์ม (รวมถึง GUI) ใช่แน่นอนคุณควรทดสอบ แต่ฉันคิดว่าในเกือบ 15 ปีของการเข้ารหัส Java ฉันเพียงครั้งเดียวที่มีปัญหาเรื่องการพกพาจริง !)
mikera

2
@mikera - เราพบปัญหาระหว่าง Linux และ Windows ซึ่งไม่เกี่ยวข้องกับรหัสของเรา พวกมันหายาก แต่มีอยู่จริง
Jon Hopkins

9

โดยส่วนตัวแล้วฉันบอกว่า Java ยังคงเป็นภาษาข้ามแพลตฟอร์มที่เลือกไว้และน่าจะอยู่ที่นั่นซักระยะ (ใกล้กับเว็บแอปพลิเคชัน) ฉันเขียนเพิ่มเติมเกี่ยวกับหัวข้อในโพสต์นี้บนJava เป็นแพลตฟอร์มที่เลือกแต่ที่ด้านหน้าข้ามแพลตฟอร์มโดยเฉพาะ:

  • ตราบใดที่คุณมีความระมัดระวังในการพึ่งพาของคุณ (เช่นหลีกเลี่ยงไลบรารีที่ใช้ JNI เพื่อเชื่อมต่อกับโค้ดเนทีฟ) จากนั้น Java สามารถเขียนรันแบบไม่แก้ไขบนแพลตฟอร์ม JVM หลักทั้งหมด

  • Beacuse Java มักจะถูกแจกจ่ายเป็น bytecode ที่ไม่ขึ้นกับเครื่องคุณสามารถรันได้โดยไม่ต้องคอมไพล์ใหม่บน JVM ใด ๆ (เนื่องจาก JVM โลคัลนั้นจัดการการคอมไพล์ JIT กับโค้ดเนทีฟ) ตัวอย่างเช่นผมได้ประสบความสำเร็จในการเป็น app ที่ซับซ้อน GUI ที่เหมาะสมที่จะทำงานเป็นครั้งแรกบน Mac หลังจากการพัฒนาใน Windows - กับไฟล์ไหเดียวกัน ตรงกันข้ามกับภาษาข้ามแพลตฟอร์มอื่น ๆ ส่วนใหญ่ซึ่งโดยทั่วไปแล้วต้องการไลบรารีที่แตกต่างกันหรือคอมไพล์ใหม่สำหรับแพลตฟอร์มอื่น

  • ไลบรารีหลักจำนวนมากที่คุณต้องการ (GUI, ระบบเครือข่าย, IO ฯลฯ ) เป็นส่วนหนึ่งของรันไทม์มาตรฐานและเขียนด้วยวิธีการข้ามแพลตฟอร์ม ดังนั้นคุณไม่จำเป็นต้องออกไปค้นหาและทดสอบไลบรารีข้ามแพลตฟอร์มคุณรับประกันได้เลยว่าทุกสิ่งที่คุณต้องการมีอยู่แล้วในสภาพแวดล้อมรันไทม์


3

ฉันคิดว่าคุณมีทางเลือกเหล่านั้น:

1) ใช้อย่างใดอย่างหนึ่ง

  • รวบรวมหรือ
  • ภาษาที่ตีความ

2) คุณจะจัดแพคเกจและส่งรหัสของคุณอย่างไร

  • หนึ่ง "front-end" หนึ่งไบนารี / สคริปต์หรือไม่
  • หนึ่ง "front-end" หลายไบนารี / สคริปต์?
  • หลาย "Front-End" หลายไบนารี / สคริปต์?

ตัวเลือกเหล่านั้นมีผลต่อประสิทธิภาพการเปิดเผยและการแจกแจงรหัส

คุณสนใจที่จะแจกซอร์สโค้ดของคุณหรือไม่? ภาษาที่รวบรวมอาจเป็นของคุณ ภาษาที่คอมไพล์ดูเหมือนจะทำงานได้ดีขึ้นในการวัดแบบไมโครกว่าภาษาที่ตีความ (แม้ JITed) นอกจากนี้หากคุณขึ้นอยู่กับสภาพแวดล้อมรันไทม์เช่น Java, Python, Ruby เป็นต้นโค้ดของคุณอาจจะยากต่อการเผยแพร่

ฉันพบว่าแอพพลิเคชั่นเดสก์ท็อปข้ามแพลตฟอร์มที่ได้รับความนิยมมากที่สุดใช้สำหรับ "หนึ่งส่วนหน้า, หลายไบนารี" โดยใช้ C / C ++ และไลบรารีวิดเจ็ตข้ามแพลตฟอร์มเช่นความกล้าหาญ, เครื่องปั่น, Firefox, Google Earth, OpenOffice, Skype, Songbird, Stellarium VLC


คุณได้ทำรายการข้อผิดพลาดที่น่าสนใจ Skype ในตัวอย่างของคุณ แต่แอปพลิเคชั่นที่ได้รับความนิยมอย่างมากนี้เริ่มต้นด้วย Delphi / Pascal บน Windows และพอร์ตด้วย C / C ++ บน linux และ Objective-C บน MacOS / iPhone
Maksee

ฉันคิดว่าคอมโพสิต / ตีความที่ทำให้เข้าใจผิดเล็กน้อย - Java มีความหมายบางอย่างไม่ได้เพราะมันถูกคอมไพล์ด้วยรหัสไบต์ที่ไม่ขึ้นอยู่กับเครื่องสำหรับการแจกจ่าย (เช่นไม่อยู่ในรูปแบบต้นฉบับ) จากนั้น JIT เครื่องอะไรก็ตามที่คุณกำลังวิ่งอยู่ มันเป็นแพลตฟอร์มข้ามอย่างสมบูรณ์ แต่ยังทำให้คุณได้รับประสิทธิภาพดั้งเดิมอีกทั้งคุณไม่จำเป็นต้องเผยแพร่แหล่งที่มาหากคุณไม่ต้องการ ชนะ / ชนะ / ชนะ
mikera

0

ฉันจะบอกว่าไม่ python และ ruby ​​มีการใช้งานกันอย่างแพร่หลายดังนั้น javascript สำหรับทั้งไคลเอนต์และฝั่งเซิร์ฟเวอร์ ส่วนตัวฉันใช้. NET และไม่มีปัญหาในการทำให้มันทำงานบน mac และ linux (ในขณะที่พัฒนาบน windows)

แก้ไข - ฉันได้ยิน LLVM กำลังเป็นที่นิยม แต่ก็ยังเล็กมาก ที่จะช่วยให้คุณใช้ข้ามแพลตฟอร์ม C ++ ในไบนารีเดียว เห็นได้ชัดว่ามันจะถูกดำเนินการบนเบราว์เซอร์ แต่ฉันไม่ได้เห็นตัวอย่างที่จะช่วยให้คุณแก้ไข dom หรือโทรจาวาสคริปต์


LLVM ไม่ได้เกี่ยวกับการทำงานบนเบราว์เซอร์ ... คุณกำลังพูดถึง emscripten หรือไม่?
Camilo Martin

ตรวจสอบวันที่ 4 ปีที่แล้วไม่มี emscripten NativeClient ถูกคาดหวังให้ทำงาน (และทำงานหนัก) แต่มันก็ไม่ได้

ตอนนี้ฉันเห็นวันที่แล้ว แต่ถึงกระนั้น LLVM ก็ไม่เคยมีเฉพาะเกี่ยวกับเบราว์เซอร์ใช่ไหม?
Camilo Martin

1
Nope แม้ว่าฉันต้องการฉันสามารถเขียน C ++ หรือภาษาอื่น ๆ LLVM รองรับแทน JS ...


-1

หากคุณนำแพลตฟอร์มมือถือมาผสมกันอย่างน้อยคุณก็จำเป็นต้องมีการคอมไพล์ซ้ำ เช่น android, j2me

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.