AndroidはなぜJavaを使用するのですか?[閉まっている]


114

OK、これは本当にGoogleの誰かに尋ねられるべきですが、私は他の意見を求めています。

Androidでもネイティブコードアプリケーションをサポートしていますが、主な開発ツールはJavaです。しかし、なぜ?つまり、モバイルデバイスでコードを解釈するには遅すぎるのではないでしょうか。Froyoを紹介する際、Googleは新しいJITコンパイラーが2〜5倍高速なアプリケーションを実現できると述べました。つまり、ネイティブコードでJavaを使用すると、2倍の速度が低下します。

はい、仮想マシンの方がプログラムをよりよく制御できるため、マネージコードアプリケーションを使用するとシステムの安定性の点で安全であることはわかっていますが、それでもこのパフォーマンスの低下は非常に大きく、なぜそれを使用するのかわかりません。


12
Javaコードは、少なくともAndroidでは解釈されません-コンパイルされて仮想マシンで実行されます。
Radomir Dopieralski、2010

4
SunがJavaが(いくつかの領域ではあるが、ほとんどの場合ほぼ同じ)ネイティブコードと同じ速さで動作することを証明したと思いましたか?さらに、Googleの連中はスマートパックです。最近導入したJITが遅かれ早かれ非常に優れたコードを生成すると確信しています。

1
@ b-gen-jack-o-neill VMは実行時にどのコードが実行されているのか、またどのように実行されているのかをVMが認識できるため、答えは実際にはノーです。たとえば、Appleは、実行時にパフォーマンスが重要なグラフィックス機能を最適化するという明確な目的で、OS XでLLVMを使用しています。これは、ネイティブコードの手法よりも高速であるため、特に行われます。
PeterAllenWebb 2010

1
@ b-gen-jack-o-neill、Javaバイトコードは実行時にネイティブコードにコンパイルできます。
マイクダニエルズ

1
@ b-gen-jack-o-neill-VMは、通常のコンパイラーよりも実行環境に関する詳細情報にアクセスできるため、よりインテリジェントな選択を行うことができます。これがどの程度オフセットするかは、アプリごとに異なります。
CurtainDog 2010

回答:


98

いくつかのポイント:

  1. Javaは既知の言語であり、開発者はそれを知っており、学習する必要はありません

  2. ポインタ演算がないため、C / C ++コードよりもJavaを使用する方が難しい

  3. それはVMで実行されるので、そこにあるすべての電話用に再コンパイルする必要はなく、簡単に保護できます

  4. Java用の多数の開発ツール(ポイント1を参照)

  5. いくつかの携帯電話はすでにJava MEを使用していたため、Javaは業界で知られていました

  6. ほとんどのアプリケーションでは速度の違いは問題になりません。もしそうなら、低水準言語でコーディングする必要があります


5
VMで実行する(したがって再コンパイルしない)ことは、大きなプラスです。また、プロセスを簡単に分離し、悪意のあるアプリケーションが電話を破壊したり、他のアプリケーションを妨害したりするのを
防ぎ

1
不正なアプリケーションのことについて-これは興味深いですね。私が間違っている場合は修正してください。ただし、x86 CPUはページングモードとリングモードを介して保護されているため、アプリケーションはメモリ内のページを変更できないため、OS APIを使用する以外の別のアプリに干渉できません。しかし、この機能にはARM CPUがありますか?本当に分からない。そうでない場合、これはこのプラットフォームでのJavaに最適です。
B.Gen.Jack.O.Neill

CPUは悪意のあるアプリケーションが悪質なことをすることとは何の関係もありません
Falmarri

4
メモリ保護は一部のCPUアーキテクチャの一部です。悪意のあるアプリケーションが別のアプリケーションに割り当てられたメモリにアクセスするのを防ぎます。en.wikipedia.org/wiki/Memory_protection
josefx

1
@Falmarri:はい、あります。基本的には非常にシンプルです。アプリが独自のアドレススペースを割り当てました。アクセスしたいすべてのアドレスはMMUによって翻訳されます。アドレス0x0000にアクセスすると、MMUはそれをたとえば0x0E21に変換します。また、基本アドレスを変更するのを防ぐために、OSで起動したときに、その特権命令とプログラムには最低の特権レベルが割り当てられています。ない場合は、単一のCLI(割り込み禁止)命令は....システムをクラッシュ
B.Gen.Jack.O.Neill

39

バイトコードレベルでは、AndroidはJavaを使用しません。ソースはJavaですが、JVMは使用していません。


7
はい。Javaがソースですが、Java仮想マシン互換のバイトコードにコンパイルされていません。これが、おそらく彼らがsun / oracleとの特許紛争のほとんどまたはすべてを行うことになるでしょう。言語の構文のみを使用しています。
ジョンガードナー

1
それでも、Java VMのほとんどの機能をサポートする必要があります。したがって、それらを最適化することはできません。
josefx 2010

1
では、なぜAndroidで開発するときにJDKをインストールする必要があるのでしょうか。エミュレータ専用ですか?
jiggunjer 2016

@jiggunjer Android Studioは、実はJavaで開発されています。エミュレーターも同様です。
Rudra B. Saraswat

20

システムの安定性の向上は、携帯電話などのデバイスでは非常に重要です。

セキュリティはさらに重要です。Android環境では、ユーザーは準信頼アプリケーションを実行できます。これは、優れたセキュリティなしでは、電話を本当に不快な方法で悪用する可能性があります。仮想マシンですべてのアプリを実行することにより、VM実装に欠陥がない限り、アプリがOSカーネルを利用できないことを保証します。次に、VMの実装はおそらく小さく、適切に定義された小さなセキュリティサーフェスがあります。

おそらく最も重要なことは、プログラムが仮想マシン用のコードにコンパイルされるときに、新しいハードウェア用に再コンパイルする必要がないことです。電話用チップの市場は多様で急速に変化しているので、それは大きな問題です。

また、Javaを使用すると、ユーザーが作成したアプリが自分自身で悪用される可能性が低くなります。バッファオーバーラン、ポインタの間違いなどはありません...


Davidによる別の回答によると、androidはjvmを使用しない
Ssenyonjo

13

ネイティブコードは必ずしもJavaコードよりも速いわけではありません。ネイティブコードがより高速に実行できることを示すプロファイルデータはどこにありますか?

なぜJavaなのか?

  • Androidはさまざまなハードウェアプラットフォームで動作します。実際のメリットを確認するには、これらの異なるプラットフォームごとにネイティブコードをコンパイルして最適化する必要があります。

  • すでにJavaに習熟している開発者は多数います。

  • Javaは、開発者の生活を楽にするために利用可能な多くのライブラリとツールを備えた、巨大なオープンソースサポートを備えています。

  • Javaは、メモリリーク、不正なポインタの使用など、ネイティブコードに固有の多くの問題からユーザーを保護します。

  • Javaを使用すると、サンドボックスアプリケーションを作成し、より優れたセキュリティモデルを作成できるため、1つの悪いアプリがOS全体を停止することはありません。


7

まず第一に、Googleによると、AndroidはJavaを使用していません。OracleがGoogleを訴えているのはそのためです。OracleはAndroidが一部のJavaテクノロジーを侵害していると主張していますが、GoogleはそれがDalvikであると述べています。

第二に、私は1995年以来、Javaバイトコードインタープリターを見ていません。

いくつかの実際のベンチマークでパフォーマンス予想をバックアップできますか?あなたが提供する不正確な背景情報を考えると、あなたの推定の範囲は正当化されていないようです。


4

Javaは、GoogleがAndroidでJavaを使用するのにかなり説得力のある議論があります。これらすべての開発者は、モバイルプラットフォーム用に開発する準備ができています。

技術的に言えば、Androidは純粋な Javaを使用しないことに注意してください。


2
モバイル開発に関心のあるすべての人々は、Javaよりも「クールな」言語にも関心があると思います。
Earlz 2010

4

他の場所で触れたように、主な問題は、Androidがさまざまなハードウェアで実行できるポータブルOSとして設計されていることです。また、多くの既存のモバイル開発者によく知られているフレームワークと言語に基づいて構築されています。

最後に、私はそれが将来への賭けだと言います-存在するパフォーマンスの問題はハードウェアが改善されると無関係になります-同様に、開発者に抽象化に対してコードを作成させることにより、Googleは、基礎となるOSをはるかに簡単にリップアウトして変更できます。開発者はPOSIX / Unix APIにコーディングしていました。

ほとんどのアプリケーションでは、ネイティブでVMベースの言語を使用することによるオーバーヘッドはそれほど大きくありません(TwitterなどのWebサービスを使用するアプリのボトルネックは、主にネットワークです)。Palm WebOSもこれを示しています-そして、主要言語としてJavaではなくJavaScriptを使用しています。

ほとんどすべてのVM JITがネイティブコードにコンパイルされることを考えると、生のコード速度はネイティブ速度に匹敵することがよくあります。高水準言語に起因する多くの遅延は、他の要因(複雑なオブジェクトランタイム、境界チェックを行うことによるメモリアクセスの「安全性」チェックなど)よりも、VMオーバーヘッドとの関係が少ないです。

また、アプリケーションの記述に使用される言語に関係なく、実際の作業の多くは低レベルのAPIで行われることも覚えておいてください。最上位言語は多くの場合、API呼び出しを一緒にチェーンするだけです。

もちろん、このルールには多くの例外があります-電話のハードウェアの限界を押し広げるゲーム、オーディオ、グラフィックのアプリ。iOSであっても、開発者はこれらの領域でスピードを上げるためにC / C ++にドロップダウンすることがよくあります。


1

新しいJITは、古いdalvikVM(両方ともJAVA)よりも2〜5倍速くアプリケーションを実行しています。したがって、比較はJAVAではなくCではなく、dalvikVMではJITです。


1

まず第一に、WindowsモバイルやiPhoneとほぼ同じですが、.netフレームワークには独自のVMとCocoaが必要です。

そして、バイトコードの解釈であるため、パフォーマンスが最高ではない場合でも、androidはJavaコミュニティ全体を潜在的な開発者としてもたらします。より多くのアプリケーション、より多くのクライアントなど

最後に、パフォーマンスはそれほど悪くありません。そのため、小さなデバイスでもJavaが使用されます(JavaMeを参照)。


CocoaはVMベースではありません-すべてコンパイルされたネイティブコードです-しかし、純粋なC / C ++とは異なり、動的ランタイム(Smalltalk / Ruby / Pythonと同様)があります-これには、独自のパフォーマンスの問題と最適化があります。ほとんどのiPhoneゲームは、Obj-Cではなく、主にC ++であることに注目してください。
JulesLt 2010
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.