เหตุใด Android จึงใช้ Java [ปิด]


114

ตกลงนี่ควรจะถามใครบางคนจาก Google จริงๆ แต่ฉันแค่ต้องการความคิดเห็นอื่น ๆ

แม้แต่ Android ก็รองรับแอปพลิเคชัน Native code แต่เครื่องมือในการพัฒนาหลักคือ Java แต่ทำไม? ฉันหมายความว่าการตีความโค้ดบนอุปกรณ์เคลื่อนที่ช้าเกินไปไม่ใช่หรือ เมื่อแนะนำ Froyo Google กล่าวว่าคอมไพเลอร์ JIT ใหม่สามารถใช้งานแอพพลิเคชั่นได้เร็วขึ้น 2-5 เท่า ซึ่งหมายความว่าการใช้ Java ผ่านโค้ดเนทีฟจะช้ากว่า 2-x เท่า

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


12
โค้ด Java ไม่ได้รับการตีความอย่างน้อยก็ไม่ใช่บน Android - คอมไพล์และรันบนเครื่องเสมือน
Radomir Dopieralski

4
ฉันคิดว่า Sun พิสูจน์แล้วว่า Java สามารถเป็นได้ (ในบางพื้นที่ แต่ค่อนข้างบ่อย) เร็วเท่ากับโค้ดเนทีฟ? นอกจากนี้พวก Google ยังเป็นสมาร์ทแพ็ค - ฉันมั่นใจว่า JIT ที่พวกเขาเพิ่งเปิดตัวจะสร้างโค้ดที่ดีไม่ช้าก็เร็ว

1
@ b-gen-jack-o-neill คำตอบคือไม่จริงเพราะ VM สามารถบอกได้ว่าโค้ดใดถูกเรียกใช้งานในขณะรันไทม์และวิธีดำเนินการ ตัวอย่างเช่น Apple ใช้ LLVM ใน OS X เพื่อจุดประสงค์ที่ชัดเจนในการเพิ่มประสิทธิภาพฟังก์ชันกราฟิกที่สำคัญในขณะรันไทม์ สิ่งนี้ทำได้โดยเฉพาะเนื่องจากเร็วกว่าเทคนิคเนทีฟโค้ด
PeterAllenWebb

1
@ b-gen-jack-o-neill, Java bytecode สามารถคอมไพล์เป็นโค้ดเนทีฟได้ที่รันไทม์
Mike Daniels

1
@ b-gen-jack-o-neill - VM สามารถเข้าถึงข้อมูลเพิ่มเติมเกี่ยวกับสภาพแวดล้อม excution ได้มากกว่าคอมไพเลอร์ทั่วไปจึงสามารถเลือกได้อย่างชาญฉลาดมากขึ้น การชดเชยค่าโสหุ้ยพิเศษจะแตกต่างกันไปในแต่ละแอป
CurtainDog

คำตอบ:


98

บางจุด:

  1. Java เป็นภาษาที่นักพัฒนารู้จักและไม่จำเป็นต้องเรียนรู้

  2. การถ่ายภาพตัวเองด้วย Java นั้นยากกว่าการใช้รหัส C / C ++ เนื่องจากไม่มีตัวชี้เลขคณิต

  3. มันทำงานใน VM ดังนั้นไม่จำเป็นต้องคอมไพล์ใหม่สำหรับโทรศัพท์ทุกเครื่องที่นั่นและง่ายต่อการรักษาความปลอดภัย

  4. เครื่องมือพัฒนา Java จำนวนมาก (ดูจุดที่ 1)

  5. โทรศัพท์มือถือหลายเครื่องใช้ Java ME อยู่แล้วดังนั้น Java จึงเป็นที่รู้จักในอุตสาหกรรมนี้

  6. ความแตกต่างของความเร็วไม่ใช่ปัญหาสำหรับแอปพลิเคชันส่วนใหญ่ หากเป็นคุณควรเขียนโค้ดเป็นภาษาระดับต่ำ


5
การทำงานบน VM (จึงไม่มีการคอมไพล์ใหม่) เป็นข้อดีอย่างมาก นอกจากนี้ยังแยกกระบวนการออกจากกันได้อย่างง่ายดายป้องกันไม่ให้แอปพลิเคชันโกงทำลายโทรศัพท์ของคุณหรือรบกวนแอปพลิเคชันอื่น ๆ
Falmarri

1
เกี่ยวกับแอปพลิเคชั่นโกง - ฟังดูน่าสนใจ แก้ไขฉันถ้าฉันผิด แต่ซีพียู x86 มี biult ในการป้องกันผ่านโหมดเพจและแหวนดังนั้นแอปพลิเคชันจึงไม่สามารถเปลี่ยนเพจในหน่วยความจำได้ดังนั้นจึงไม่สามารถรบกวนแอพอื่นนอกเหนือจากการใช้ OS API แต่คุณสมบัตินี้มีซีพียู ARM หรือไม่? ที่จริงฉันไม่รู้ ถ้าไม่นี่จะดีมากสำหรับ Java บนแพลตฟอร์มนี้
แจ็

ซีพียูไม่มีส่วนเกี่ยวข้องกับแอปพลิเคชันที่เป็นอันตรายที่ทำสิ่งชั่วร้าย
Falmarri

4
การป้องกันหน่วยความจำเป็นส่วนหนึ่งของสถาปัตยกรรมซีพียูบางอย่าง ป้องกันไม่ให้แอปพลิเคชันที่เป็นอันตรายเข้าถึงหน่วยความจำที่กำหนดให้กับแอปพลิเคชันอื่น en.wikipedia.org/wiki/Memory_protection
josefx

1
@ Falmarri: ใช่แล้ว โดยทั่วไปแล้วมันง่ายมาก แอปของคุณได้กำหนดพื้นที่ที่อยู่ของตัวเอง ที่อยู่ทั้งหมดที่คุณต้องการเข้าถึงแปลโดย MMU คุณต้องการเข้าถึง adress 0x0000 และ MMU แปลเป็นตัวอย่างเช่น 0x0E21 และเพื่อป้องกันไม่ให้คุณเปลี่ยนที่อยู่ฐานคำสั่งส่วนตัวและโปรแกรมของคุณเมื่อเริ่มต้นโดยระบบปฏิบัติการได้กำหนดระดับความเป็นส่วนตัวต่ำสุด ถ้าไม่เช่นนั้นคำสั่ง CLI เดียว (ปิดการใช้งานการขัดจังหวะ) อาจทำให้ระบบขัดข้อง ....
ข. แจ็

39

ในระดับไบต์โค้ด Android จะไม่ใช้ Java ซอร์สคือ Java แต่ไม่ได้ใช้ JVM


7
ใช่. Java เป็นแหล่งที่มา แต่ไม่ได้คอมไพล์ไปยังรหัสไบต์ที่เข้ากันได้กับเครื่องเสมือน java นี่คือเหตุผลที่พวกเขาอาจจะโต้แย้งสิทธิบัตรกับ sun / oracle มากที่สุด / ทั้งหมด ใช้เฉพาะไวยากรณ์ของภาษาเท่านั้น
John Gardner

1
มันยังคงต้องรองรับฟังก์ชั่นส่วนใหญ่ของ java vm ดังนั้นพวกเขาจึงไม่สามารถปรับให้เหมาะสมได้
josefx

1
แล้วทำไมต้องติดตั้ง JDK เมื่อพัฒนาใน android? เป็นเพียงโปรแกรมจำลองหรือไม่
jiggunjer

@jiggunjer Android Studio ได้รับการพัฒนาใน Java ตามความเป็นจริง และโปรแกรมจำลองก็เช่นกัน
Rudra B. Saraswat

20

การปรับปรุงความเสถียรของระบบเป็นสิ่งสำคัญมากสำหรับอุปกรณ์เช่นโทรศัพท์มือถือ

ความปลอดภัยยิ่งมีความสำคัญมากขึ้น สภาพแวดล้อม Android ช่วยให้ผู้ใช้เรียกใช้แอปกึ่งเชื่อถือได้ซึ่งอาจใช้ประโยชน์จากโทรศัพท์ด้วยวิธีที่ไม่พึงประสงค์อย่างแท้จริงโดยไม่มีการรักษาความปลอดภัยที่ดีเยี่ยม การเรียกใช้แอปทั้งหมดในเครื่องเสมือนคุณรับประกันได้ว่าไม่มีแอปใดสามารถใช้ประโยชน์จากเคอร์เนลระบบปฏิบัติการได้เว้นแต่จะมีข้อบกพร่องในการใช้งาน VM ในทางกลับกันการติดตั้ง VM นั้นน่าจะมีขนาดเล็กและมีพื้นผิวด้านความปลอดภัยขนาดเล็กที่กำหนดไว้อย่างดี

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

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


อีกคำตอบของ David กล่าวว่า android ไม่ใช้ jvm
Ssenyonjo

13

โค้ดเนทีฟไม่จำเป็นต้องเร็วกว่าโค้ด Java เสมอไป ข้อมูลโปรไฟล์ของคุณอยู่ที่ไหนที่แสดงว่าโค้ดเนทีฟทำงานได้เร็วขึ้น

ทำไมต้องเป็น Java

  • Android ทำงานบนแพลตฟอร์มฮาร์ดแวร์ต่างๆมากมาย คุณจะต้องรวบรวมและปรับแต่งโค้ดเนทีฟของคุณสำหรับแต่ละแพลตฟอร์มที่แตกต่างกันเหล่านี้เพื่อดูประโยชน์ที่แท้จริง

  • มีนักพัฒนาจำนวนมากที่เชี่ยวชาญภาษา Java อยู่แล้ว

  • Java มีการสนับสนุนโอเพ่นซอร์สขนาดใหญ่พร้อมด้วยไลบรารีและเครื่องมือมากมายที่ช่วยให้ชีวิตนักพัฒนาง่ายขึ้น

  • Java ปกป้องคุณจากปัญหาต่างๆที่มีอยู่ในโค้ดเนทีฟเช่นการรั่วไหลของหน่วยความจำการใช้ตัวชี้ที่ไม่ถูกต้องเป็นต้น

  • Java ช่วยให้พวกเขาสร้างแอปพลิเคชันแซนด์บ็อกซ์และสร้างรูปแบบการรักษาความปลอดภัยที่ดีขึ้นเพื่อให้แอปที่ไม่ดีแอปหนึ่งไม่สามารถลบระบบปฏิบัติการทั้งหมดของคุณได้


7

ก่อนอื่นตาม Google Android ไม่ได้ใช้ Java นั่นเป็นเหตุผลที่ Oracle ฟ้อง Google Oracle อ้างว่า Android ละเมิดเทคโนโลยี Java บางอย่าง แต่ Google บอกว่าเป็น Dalvik

ประการที่สองฉันไม่เห็นตัวแปลรหัส Java byte มาตั้งแต่ปี 1995

คุณสามารถสำรองข้อมูลการคาดเดาประสิทธิภาพของคุณด้วยเกณฑ์มาตรฐานที่แท้จริงได้หรือไม่? ขอบเขตของข้อสันนิษฐานของคุณดูเหมือนจะไม่เป็นธรรมเนื่องจากข้อมูลพื้นฐานที่ไม่ถูกต้องที่คุณให้มา


4

Java มีข้อโต้แย้งที่น่าสนใจสำหรับ Google ที่ใช้ใน Android: มีฐานนักพัฒนาจำนวนมาก นักพัฒนาทั้งหมดเหล่านี้ (ประเภท) พร้อมที่จะพัฒนาสำหรับแพลตฟอร์มมือถือของพวกเขา

โปรดทราบว่าในทางเทคนิคแล้ว Android ไม่ได้ใช้Java บริสุทธิ์


2
ฉันคิดว่าทุกคนที่สนใจในการพัฒนาอุปกรณ์เคลื่อนที่ต่างก็สนใจภาษาที่ "เย็นกว่า" มากกว่า Java เช่นกัน
Earlz

4

ดังที่ได้สัมผัสในที่อื่น ๆ ปัญหาหลักคือ Android ได้รับการออกแบบให้เป็นระบบปฏิบัติการแบบพกพาเพื่อให้ทำงานบนฮาร์ดแวร์ที่หลากหลาย นอกจากนี้ยังสร้างจากกรอบและภาษาที่คุ้นเคยกับนักพัฒนามือถือที่มีอยู่จำนวนมาก

ในที่สุดฉันจะบอกว่ามันเป็นการเดิมพันกับอนาคต - ปัญหาด้านประสิทธิภาพใด ๆ ที่มีอยู่จะไม่เกี่ยวข้องเมื่อฮาร์ดแวร์ดีขึ้น - เท่าเทียมกันโดยการให้นักพัฒนาเขียนโค้ดกับสิ่งที่เป็นนามธรรม Google สามารถตัดทอนและเปลี่ยนระบบปฏิบัติการพื้นฐานได้ง่ายกว่า นักพัฒนากำลังเขียนโค้ดไปยัง POSIX / Unix API

สำหรับแอปพลิเคชันส่วนใหญ่ค่าใช้จ่ายในการใช้ภาษาที่ใช้ VM ผ่านเนทีฟนั้นไม่สำคัญ (ปัญหาคอขวดสำหรับแอปที่ใช้บริการเว็บเช่น Twitter ส่วนใหญ่เป็นระบบเครือข่าย) Palm WebOS ยังแสดงให้เห็นถึงสิ่งนี้ - และใช้ JavaScript มากกว่า Java เป็นภาษาหลัก

เนื่องจาก VMs JIT เกือบทั้งหมดคอมไพล์เป็นโค้ดเนทีฟความเร็วโค้ดดิบมักเทียบได้กับความเร็วเนทีฟ ความล่าช้าจำนวนมากที่เกิดจากภาษาระดับสูงนั้นเกี่ยวข้องกับค่าใช้จ่ายของ VM น้อยกว่าปัจจัยอื่น ๆ (รันไทม์ออบเจ็กต์ที่ซับซ้อน 'ความปลอดภัย' ตรวจสอบการเข้าถึงหน่วยความจำโดยทำการตรวจสอบขอบเขต ฯลฯ )

โปรดจำไว้ว่าไม่ว่าจะใช้ภาษาใดในการเขียนแอปพลิเคชันงานจริงจำนวนมากจะทำใน API ระดับล่าง ภาษาระดับบนสุดมักเป็นเพียงการเชื่อมโยงการเรียก API เข้าด้วยกัน

แน่นอนว่ามีข้อยกเว้นมากมายสำหรับกฎนี้เช่นแอปเกมเสียงและกราฟิกที่ผลักดันขีด จำกัด ของฮาร์ดแวร์โทรศัพท์ แม้แต่ใน iOS นักพัฒนาก็มักจะเลื่อนลงไปที่ C / C ++ เพื่อรับความเร็วในพื้นที่เหล่านี้


1

JIT ใหม่กำลังเรียกใช้แอปพลิเคชันเร็วกว่า dalvikVM แบบเก่า 2-5 เท่า (ทั้ง JAVA) ดังนั้นการเปรียบเทียบจึงไม่ใช่ C เหนือ JAVA แต่เป็น JIT มากกว่า dalvikVM


1

ก่อนอื่นมันเกี่ยวกับสิ่งเดียวกันคือ windows mobile หรือ iPhone กรอบ. net ต้องการ VM ของตัวเองเช่นเดียวกับโกโก้

และแม้ว่าประสิทธิภาพจะไม่ดีที่สุดเนื่องจากเป็นการตีความรหัสไบต์ แต่ android ก็นำชุมชน java ทั้งหมดมาเป็นนักพัฒนาที่มีศักยภาพ แอปพลิเคชันเพิ่มเติมลูกค้ามากขึ้น ฯลฯ

เพื่อให้เสร็จสิ้นประสิทธิภาพการทำงานไม่ได้แย่ขนาดนั้นนั่นคือสาเหตุที่ใช้ java แม้ในอุปกรณ์ขนาดเล็ก (ดู JavaMe)


Cocoa ไม่ใช่ VM ซึ่งเป็นโค้ดเนทีฟที่คอมไพล์แล้วทั้งหมด - แต่แตกต่างจาก C / C ++ แท้ที่มีรันไทม์แบบไดนามิก (คล้ายกับ Smalltalk / Ruby / Python) ซึ่งมีปัญหาด้านประสิทธิภาพและการเพิ่มประสิทธิภาพของตัวเอง เป็นที่น่าสังเกตว่าเกม iPhone ส่วนใหญ่มักใช้ภาษา C ++ มากกว่า Obj-C
JulesLt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.