Android neden Java kullanıyor? [kapalı]


114

Tamam, bu gerçekten Google'dan birine sorulmalı, ama ben sadece başka fikirler istiyorum.

Android, Yerel kod uygulamalarını desteklese bile, ana geliştirme aracı Java'dır. Ama neden? Demek istediğim, bir mobil cihazda kodu yorumlamak çok yavaş değil mi? Froyo'yu tanıtırken Google, yeni JIT derleyicisinin 2-5 kat daha hızlı uygulamalara ulaşabileceğini söyledi. Bu, Java'yı yerel kod üzerinden kullanmanın 2 x kat daha yavaş olduğu anlamına gelir.

Evet, sanal makine programı daha iyi kontrol ettiğinden, yönetilen kod uygulamalarını kullanmanın sistem kararlılığı açısından daha güvenli olduğunu biliyorum, ancak yine de bu performans düşüşü çok büyük ve onu neden kullanmam gerektiğine dair herhangi bir nokta göremiyorum.


12
Java kodu, en azından Android'de yorumlanmaz - derlenir ve sanal bir makinede çalıştırılır.
Radomir Dopieralski

4
Sun'ın Java'nın yerel kod kadar hızlı olabileceğini kanıtladığını sanıyordum (birkaç bölgede, ancak çoğu zaman neredeyse)? Artı, google çalışanları akıllı bir paket - yakın zamanda tanıttıkları JIT'in er ya da geç çok iyi kod üreteceğinden eminim.

1
@ b-gen-jack-o-neill Cevap aslında hayır, çünkü sanal makine çalışma zamanında hangi kodun çalıştırıldığını ve nasıl yürütüldüğünü söyleyebilir. Örneğin Apple, çalışma zamanında performans açısından kritik grafik işlevlerini optimize etmek için OS X'te LLVM kullanır. Bu, özellikle yerel kod tekniklerinden daha hızlı olduğu için yapılır.
PeterAllenWebb

1
@ b-gen-jack-o-neill, Java bayt kodu çalışma zamanında yerel koda derlenebilir.
Mike Daniels

1
@ b-gen-jack-o-neill - VM, excution ortamı hakkında tipik bir derleyiciden daha fazla bilgiye erişebilir, böylece daha akıllı seçimler yapabilir. Bu, fazladan ek yükün ne ölçüde dengelendiği uygulamadan uygulamaya değişecektir.
CurtainDog

Yanıtlar:


98

Bazı noktalar:

  1. Java bilinen bir dildir, geliştiriciler bunu bilir ve öğrenmek zorunda değildir

  2. İşaretçi aritmetiği olmadığı için Java ile kendinizi vurmak C / C ++ kodundan daha zordur

  3. bir sanal makinede çalışır, böylece onu her telefon için yeniden derlemeye gerek yoktur ve güvenliğini sağlamak kolaydır

  4. Java için çok sayıda geliştirme aracı (1. maddeye bakın)

  5. birkaç cep telefonu zaten Java ME kullanıyordu, bu nedenle Java endüstride biliniyordu

  6. hız farkı çoğu uygulama için bir sorun değildir; eğer öyleyse düşük seviyeli bir dilde kodlamalısın


5
Bir sanal makinede çalıştırmak (dolayısıyla yeniden derleme yok) büyük bir artıdır. Ayrıca, işlemleri birbirlerinden kolayca ayırarak sahte bir uygulamanın telefonunuzu yok etmesini veya diğer uygulamalara müdahale
etmesini önler

1
Hileli uygulama olayı hakkında - bu kulağa ilginç geliyor. Yanılıyorsam düzeltin, ancak x86 CPU'ları sayfalama ve halka modları yoluyla korumada önyargılıdır, bu nedenle uygulama bellekteki sayfasını değiştiremez, bu nedenle OS API kullanmak dışında başka bir uygulamaya müdahale edemez. Ancak bu özelliğin ARM CPU'ları var mı? Aslında hiçbir fikrim yok. Değilse, bu platformda Java için harika bir + olacaktır.
B.Gen.Jack.O.Neill

CPU'nun kötü şeyler yapan kötü niyetli bir uygulama ile ilgisi yok
Falmarri

4
Bellek koruması, bazı cpu mimarilerinin bir parçasıdır. Kötü amaçlı bir uygulamanın farklı bir uygulamaya atanmış belleğe erişmesini engeller. en.wikipedia.org/wiki/Memory_protection
josefx

1
@Falmarri: Evet, öyle. Temelde çok basit. Uygulamanız kendi adres alanını atadı. Erişmek istediğiniz tüm adresler MMU tarafından çevrilmiştir. 0x0000 adresine erişmek istiyorsunuz ve MMU bunu örneğin 0x0E21'e çevirir. Ve işletim sistemi tarafından başlatıldığında temel adresi, ayrıcalıklı talimatını ve programınız değiştirmenizi önlemek için en düşük ayrıcalık düzeyine sahiptir. Aksi takdirde, tek CLI (kesintileri devre dışı bırakma) talimatı sistemi
çökertebilir

39

Bayt kodu düzeyinde, Android Java kullanmaz. Kaynak Java'dır, ancak bir JVM kullanmaz.


7
Evet. Java kaynaktır, ancak java sanal makine uyumlu bayt koduna derlenmemiştir. Bu yüzden muhtemelen güneş / oracle ile olan patent anlaşmazlığının çoğunu / tamamını yapacaklar. Sadece dilin sözdizimini kullanıyorlar.
John Gardner

1
Yine de java vm'nin çoğu işlevini desteklemesi gerekir. Yani bunları optimize edemezler.
josefx

1
Öyleyse neden Android'de geliştirirken JDK'yi kurmanız gerekiyor? Sadece öykünücü için mi?
jiggunjer

@jiggunjer Android Studio aslında Java ile geliştirilmiştir. Ve öykünücü de öyle.
Rudra B. Saraswat

20

Sistem kararlılığının iyileştirilmesi, cep telefonu gibi bir cihazda çok önemlidir .

Güvenlik daha da önemlidir. Android ortamı, kullanıcıların, mükemmel bir güvenlik olmadan telefonu gerçekten hoş olmayan şekillerde kullanabilecek yarı güvenilir uygulamaları çalıştırmasına olanak tanır. Tüm uygulamaları bir sanal makinede çalıştırarak, VM uygulamasında bir kusur olmadığı sürece hiçbir uygulamanın işletim sistemi çekirdeğinden yararlanamayacağını garanti edersiniz. Sanal makine uygulaması muhtemelen küçüktür ve küçük, iyi tanımlanmış bir güvenlik yüzeyine sahiptir.

Belki de en önemlisi, programlar bir sanal makine için kodlanmak üzere derlendiğinde, yeni donanım için yeniden derlenmelerine gerek yoktur. Telefon çipleri pazarı çok çeşitli ve hızla değişiyor, bu yüzden bu büyük bir mesele.

Ayrıca, Java kullanmak, insanların yazdığı uygulamaların kendilerinin sömürülmesini daha az olası kılar. Arabellek aşımı, işaretçilerde hata vb. Yok ...


David'in başka bir cevabı ise android'in jvm kullanmadığını söylüyor
Ssenyonjo

13

Yerel kodun Java kodundan daha hızlı olması gerekmez. Yerel kodun daha hızlı çalışabileceğini gösteren profil verileriniz nerede?

Neden Java?

  • Android, birçok farklı donanım platformunda çalışır. Gerçek faydaları görmek için bu farklı platformların her biri için yerel kodunuzu derlemeniz ve optimize etmeniz gerekir.

  • Java'da zaten yetkin çok sayıda geliştirici var.

  • Java, geliştiricilerin hayatını kolaylaştırmak için birçok kitaplık ve araç içeren devasa açık kaynak desteğine sahiptir.

  • Java, sizi bellek sızıntıları, kötü işaretçi kullanımı vb. Gibi yerel kodun doğasında bulunan birçok sorundan korur.

  • Java, onların sandbox uygulamaları oluşturmalarına ve daha iyi bir güvenlik modeli oluşturmalarına izin verir, böylece bir kötü Uygulama tüm işletim sisteminizi kapatamaz.


7

Öncelikle Google'a göre Android Java kullanmıyor. Oracle bu yüzden Google'a dava açıyor. Oracle, Android'in bazı Java teknolojilerini ihlal ettiğini iddia ediyor, ancak Google bunun Dalvik olduğunu söylüyor.

İkinci olarak, 1995'ten beri bir Java bayt kodu yorumlayıcısı görmedim.

Performans varsayımınızı bazı gerçek ölçütlerle yedekleyebilir misiniz? Sağladığınız yanlış arka plan bilgileri göz önüne alındığında, varsayımlarınızın kapsamı haklı görünmüyor.


4

Java'nın Google'ın Android'de kullanması için oldukça ikna edici bir argümanı var: çok büyük bir geliştirici tabanı var. Tüm bu geliştiriciler mobil platformları için (bir nevi) geliştirmeye hazırlar.

Teknik olarak Android'in saf Java kullanmadığını unutmayın .


2
Mobil geliştirmeyle ilgilenen herkesin Java'dan daha "daha havalı" dillerle de ilgilendiğini düşünüyorum.
Earlz

4

Başka bir yerde değinildiği gibi, ana sorun, Android'in çok çeşitli donanımlarda çalışacak şekilde taşınabilir bir işletim sistemi olarak tasarlanmasıdır. Aynı zamanda birçok mevcut mobil geliştiricinin aşina olduğu bir çerçeve ve dil üzerine kuruludur.

Son olarak, geleceğe karşı bir bahis olduğunu söyleyebilirim - mevcut performans sorunları donanım geliştikçe önemsiz hale gelecektir - aynı şekilde geliştiricilerin bir soyutlamaya karşı kod yazmasını sağlayarak, Google temeldeki işletim sistemini söküp değiştirebilir. geliştiriciler POSIX / Unix API'lerini kodluyordu.

Çoğu uygulama için yerel yerine VM tabanlı bir dil kullanmanın ek yükü önemli değildir (Twitter gibi web hizmetlerini tüketen uygulamaların darboğazı çoğunlukla ağdır). Palm WebOS de bunu gösteriyor - ve bu, ana dil olarak Java yerine JavaScript kullanıyor.

Neredeyse tüm VM'lerin JIT'sinin yerel koda derlendiği göz önüne alındığında, ham kod hızı genellikle yerel hız ile karşılaştırılabilir. Daha yüksek seviyeli dillere atfedilen birçok gecikme, diğer faktörlere (karmaşık bir nesne çalışma süresi, sınır kontrolü yaparak 'güvenlik' bellek erişimini denetleme, vb.) Göre VM ek yüküyle daha az ilgilidir.

Ayrıca, bir uygulamayı yazmak için kullanılan dilden bağımsız olarak, fiili işlerin çoğunun daha düşük seviyeli API'lerde yapıldığını unutmayın. En üst düzey dil genellikle API çağrılarını birbirine zincirler.

Elbette bu kuralın pek çok istisnası vardır - telefon donanımının sınırlarını zorlayan oyunlar, ses ve grafik uygulamaları. İOS'ta bile, geliştiriciler bu alanlarda hız kazanmak için genellikle C / C ++ 'ya düşer.


1

Yeni JIT, uygulamaları eski dalvikVM'den (her ikisi de JAVA) 2 - 5 kat daha hızlı çalıştırıyor. Dolayısıyla karşılaştırma JAVA üzerinden C değil, dalvikVM üzerinden JIT'dir.


1

Her şeyden önce, aynı şey Windows mobil veya iPhone için de geçerli, .net çerçevesinin kakaonun yanı sıra kendi sanal makinesine ihtiyacı var.

Ve performans en iyi olmasa bile, çünkü bayt kodunun bir yorumu olduğu için, android tüm java topluluğunu potansiyel geliştiriciler olarak getiriyor. Daha fazla uygulama, daha fazla müşteri vb.

Bitirmek için, hiçbir performans o kadar da kötü değil, bu yüzden java daha küçük cihazlarda bile kullanılıyor (bkz. JavaMe).


Cocoa sanal makine tabanlı değildir - tamamı derlenmiş yerel koddur - ancak saf C / C ++ 'dan farklı olarak, kendi performans sorunları ve optimizasyonları olan dinamik bir çalışma süresine (Smalltalk / Ruby / Python'a benzer) sahiptir. Çoğu iPhone oyununun Obj-C yerine büyük ölçüde C ++ olması dikkat çekicidir.
JulesLt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.