Mengapa Android menggunakan Java? [Tutup]

114

Oke, ini harus benar-benar ditanyakan kepada seseorang dari Google, tapi saya hanya ingin pendapat lain.

Bahkan Android mendukung aplikasi kode Native, alat pengembangan utamanya adalah Java. Tapi kenapa? Maksud saya, bukankah terlalu lambat untuk menafsirkan kode di perangkat seluler? Saat memperkenalkan Froyo, Google mengatakan bahwa compiler JIT baru dapat mencapai aplikasi 2-5 kali lebih cepat. Ini berarti, penggunaan Java melalui kode native 2-x kali lebih lambat.

Ya, saya tahu bahwa menggunakan aplikasi kode terkelola lebih aman dalam hal stabilitas sistem, karena mesin virtual memiliki kontrol program yang lebih baik, tetapi tetap saja, penurunan kinerja ini sangat besar, dan saya tidak mengerti mengapa menggunakannya.

B.Gen.Jack.O.Neill
sumber
12
Kode Java tidak diinterpretasikan, setidaknya tidak di Android - itu dikompilasi dan dijalankan di mesin virtual.
Radomir Dopieralski
4
Saya pikir Sun membuktikan Java bisa (di beberapa area, tetapi cukup sering hampir) secepat kode asli? Plus, orang-orang Google adalah paket yang cerdas - saya yakin bahwa JIT yang baru saja mereka perkenalkan cepat atau lambat akan menghasilkan kode yang sangat bagus.
1
@ b-gen-jack-o-neill Jawabannya sebenarnya tidak, karena VM dapat mengetahui kode apa yang sedang dijalankan saat runtime, dan bagaimana kode itu dijalankan. Misalnya, Apple menggunakan LLVM di OS X untuk tujuan eksplisit mengoptimalkan fungsi grafis yang kritis terhadap kinerja saat runtime. Ini dilakukan secara khusus karena lebih cepat daripada teknik kode asli.
PeterAllenWebb
1
@ b-gen-jack-o-neill, bytecode Java dapat dikompilasi ke kode asli saat runtime.
Mike Daniels
1
@ b-gen-jack-o-neill - VM memiliki akses ke lebih banyak informasi tentang lingkungan excution daripada kompiler biasa, sehingga dapat membuat pilihan yang lebih cerdas. Sejauh mana hal ini mengimbangi overhead tambahan akan bervariasi dari aplikasi ke aplikasi.
CurtainDog

Jawaban:

98

Beberapa poin:

  1. Java adalah bahasa yang dikenal, pengembang mengetahuinya dan tidak harus mempelajarinya

  2. lebih sulit untuk menembak diri sendiri dengan Java daripada dengan kode C / C ++ karena tidak memiliki aritmatika penunjuk

  3. ini berjalan dalam VM, jadi tidak perlu mengkompilasinya ulang untuk setiap telepon di luar sana dan mudah diamankan

  4. sejumlah besar alat pengembangan untuk Java (lihat poin 1)

  5. beberapa ponsel sudah menggunakan Java ME, sehingga Java dikenal di industri

  6. perbedaan kecepatan tidak menjadi masalah bagi sebagian besar aplikasi; jika itu Anda harus membuat kode dalam bahasa tingkat rendah

josefx
sumber
5
Berjalan di VM (sehingga tidak ada kompilasi ulang) merupakan nilai tambah yang besar. Selain itu, ini dengan mudah memisahkan proses satu sama lain, mencegah aplikasi jahat menghancurkan ponsel Anda atau mengganggu aplikasi lain
Falmarri
1
Tentang hal aplikasi nakal - ini terdengar menarik. Koreksi saya jika saya salah, tetapi CPU x86 memiliki perlindungan ganda melalui mode paging dan ring, oleh karena itu aplikasi tidak dapat mengubah halamannya di memori sehingga tidak dapat mengganggu aplikasi lain selain menggunakan API OS. Tetapi apakah fitur ini memiliki CPU ARM? Saya sebenarnya tidak tahu. Jika tidak, ini akan + bagus untuk Java di platform ini.
B.Gen.Jack.O.Neill
CPU tidak ada hubungannya dengan aplikasi jahat yang melakukan hal
Falmarri
4
Perlindungan memori adalah bagian dari beberapa arsitektur cpu. Ini mencegah aplikasi berbahaya mengakses memori yang ditetapkan ke aplikasi lain. en.wikipedia.org/wiki/Memory_protection
josefx
1
@Falmarri: Ya, benar. Pada dasarnya ini sangat sederhana. Aplikasi Anda telah menetapkan ruang alamatnya sendiri. Semua alamat yang ingin Anda akses diterjemahkan oleh MMU. Anda ingin mengakses alamat 0x0000 dan MMU menerjemahkannya menjadi misalnya 0x0E21. Dan untuk mencegah Anda mengubah alamat dasar, instruksi priviledged dan program Anda ketika dimulai oleh OS telah menetapkan tingkat hak istimewa terendah. Jika tidak, instruksi CLI (nonaktifkan interupsi) tunggal akan merusak sistem ....
B.Gen.Jack.O.Neill
39

Pada level kode byte, Android tidak menggunakan Java. Sumbernya adalah Java, tetapi tidak menggunakan JVM.

David Thornley
sumber
7
Iya. Java adalah sumbernya, tetapi tidak dikompilasi ke kode byte yang kompatibel dengan mesin virtual java. Inilah sebabnya mengapa mereka mungkin akan sebagian besar / semua sengketa paten dengan sun / oracle. Mereka hanya menggunakan sintaks bahasa.
John Gardner
1
Itu masih harus mendukung sebagian besar fungsi java vm. Jadi mereka tidak bisa mengoptimalkannya.
josefx
1
Lalu mengapa perlu menginstal JDK saat mengembangkan di android? Apakah hanya untuk emulator?
jiggunjer
@jiggunjer Android Studio sebenarnya dikembangkan di Java. Dan begitu juga emulatornya.
Rudra B. Saraswat
20

Peningkatan stabilitas sistem sangat penting pada perangkat seperti ponsel.

Keamanan bahkan lebih penting. Lingkungan Android memungkinkan pengguna menjalankan aplikasi semi tepercaya yang dapat mengeksploitasi ponsel dengan cara yang benar-benar tidak menyenangkan tanpa keamanan yang sangat baik. Dengan menjalankan semua aplikasi di mesin virtual, Anda menjamin bahwa tidak ada aplikasi yang dapat mengeksploitasi kernel OS kecuali jika ada cacat dalam implementasi VM. Implementasi VM, pada gilirannya, mungkin kecil dan memiliki permukaan keamanan kecil yang terdefinisi dengan baik.

Mungkin yang paling penting, ketika program dikompilasi menjadi kode untuk mesin virtual, mereka tidak harus dikompilasi ulang untuk perangkat keras baru. Pasar chip ponsel beragam dan cepat berubah, jadi itu masalah besar.

Selain itu, menggunakan Java membuat kecil kemungkinan aplikasi yang ditulis orang akan dapat dieksploitasi sendiri. Tidak ada buffer-overruns, kesalahan dengan pointer, dll ...

PeterAllenWebb
sumber
Jawaban lain dari David mengatakan android tidak menggunakan jvm
Ssenyonjo
13

Kode asli tidak selalu lebih cepat dari kode Java. Di manakah data profil Anda yang menunjukkan bahwa kode asli dapat berjalan lebih cepat?

Mengapa Java?

  • Android berjalan di banyak platform perangkat keras yang berbeda. Anda perlu mengompilasi dan mengoptimalkan kode asli Anda untuk masing-masing platform berbeda ini untuk melihat manfaat nyata.

  • Ada banyak sekali pengembang yang sudah mahir di Java.

  • Java memiliki dukungan sumber terbuka yang sangat besar, dengan banyak pustaka dan alat yang tersedia untuk membuat hidup pengembang lebih mudah.

  • Java melindungi Anda dari banyak masalah yang melekat pada kode native, seperti kebocoran memori, penggunaan pointer yang buruk, dll.

  • Java memungkinkan mereka membuat aplikasi kotak pasir, dan membuat model keamanan yang lebih baik sehingga satu Aplikasi yang buruk tidak dapat menghapus seluruh OS Anda.

Cheryl Simon
sumber
7

Pertama-tama, menurut Google, Android tidak menggunakan Java. Itu sebabnya Oracle menuntut Google. Oracle mengklaim bahwa Android melanggar beberapa teknologi Java, tetapi Google mengatakan itu adalah Dalvik.

Kedua, saya belum pernah melihat juru kode byte Java sejak 1995.

Dapatkah Anda mendukung dugaan kinerja Anda dengan beberapa tolok ukur aktual? Ruang lingkup anggapan Anda tampaknya tidak dapat dibenarkan mengingat informasi latar belakang yang Anda berikan tidak akurat.

erickson
sumber
4

Java memiliki argumen yang cukup menarik untuk Google yang menggunakannya di Android: Java memiliki basis pengembang yang sangat besar. Semua pengembang ini (semacam) siap mengembangkan untuk platform seluler mereka.

Perlu diingat bahwa, secara teknis, Android tidak menggunakan Java murni .

Pablo Santa Cruz
sumber
2
Saya rasa semua orang yang tertarik dengan pengembangan Seluler juga tertarik dengan bahasa yang "lebih keren" daripada Java.
Earlz
4

Seperti disinggung di tempat lain, masalah utamanya adalah Android dirancang sebagai OS portabel, untuk berjalan di berbagai perangkat keras. Itu juga membangun kerangka kerja dan bahasa yang akrab bagi banyak pengembang seluler yang ada.

Akhirnya, saya akan mengatakan ini adalah taruhan melawan masa depan - masalah kinerja apa pun yang ada akan menjadi tidak relevan karena perangkat keras meningkat - sama dengan membuat pengembang membuat kode terhadap abstraksi, Google dapat merobek dan mengubah OS yang mendasarinya jauh lebih mudah, daripada jika pengembang sedang membuat kode ke API POSIX / Unix.

Untuk sebagian besar aplikasi, overhead penggunaan bahasa berbasis VM dibandingkan native tidak signifikan (hambatan untuk aplikasi yang menggunakan layanan web, seperti Twitter, sebagian besar adalah jaringan). Palm WebOS juga mendemonstrasikan ini - dan itu menggunakan JavaScript daripada Java sebagai bahasa utama.

Mengingat bahwa hampir semua VM JIT dikompilasi ke kode asli, kecepatan kode mentah sering kali sebanding dengan kecepatan asli. Banyak penundaan yang dikaitkan dengan bahasa tingkat yang lebih tinggi tidak terlalu berkaitan dengan overhead VM dibandingkan faktor lainnya (runtime objek yang kompleks, pemeriksaan 'keamanan' akses memori dengan melakukan pemeriksaan batas, dll).

Ingat juga bahwa terlepas dari bahasa yang digunakan untuk menulis aplikasi, banyak pekerjaan sebenarnya yang dilakukan di API tingkat yang lebih rendah. Bahasa tingkat atas sering kali hanya merangkai panggilan API.

Tentu saja ada banyak pengecualian untuk aturan ini - aplikasi game, audio, dan grafik yang mendorong batasan perangkat keras ponsel. Bahkan di iOS, pengembang sering menggunakan C / C ++ untuk mendapatkan kecepatan di area ini.

JulesLt
sumber
1

JIT baru menjalankan aplikasi 2 - 5 kali lebih cepat daripada dalvikVM lama (keduanya JAVA). Jadi perbandingannya bukanlah C melalui JAVA, tetapi JIT melalui dalvikVM.

keyboardsurfer
sumber
1

Pertama-tama ini hampir sama dengan windows mobile atau iPhone, framework .net membutuhkan VM dan cocoa sendiri.

Dan bahkan jika kinerjanya tidak terbaik, karena ini adalah interpretasi dari kode byte, android membawa seluruh komunitas java sebagai pengembang potensial. Lebih banyak aplikasi, lebih banyak klien, dll.

Untuk menyelesaikannya, tidak ada kinerja yang tidak terlalu buruk, itulah mengapa java digunakan bahkan pada perangkat yang lebih kecil (lihat JavaMe).

Colin Hebert
sumber
Cocoa bukan berbasis VM - itu semua kode native yang dikompilasi - tetapi tidak seperti C / C ++ murni, ia memiliki runtime dinamis (mirip dengan Smalltalk / Ruby / Python) - yang memiliki masalah kinerja dan optimisasinya sendiri. Perlu dicatat bahwa sebagian besar game iPhone sebagian besar C ++ daripada Obj-C.
JulesLt