Androidアプリはコンパイルされるのではなく解釈されます。これにより、実行時にiOSアプリよりも遅くなりますか?
Androidアプリはコンパイルされるのではなく解釈されます。これにより、実行時にiOSアプリよりも遅くなりますか?
回答:
JavaはAndroidでは解釈されません。Androidアプリは、開発者によってバイトコードにコンパイルされます。バイトコードは、プログラムをコンパクトに表現したものです。プログラマーが作成したソースコードよりも小さいですが、CPUで直接実行することはできません。この段階で、デッドコードの削除などのいくつかの最適化を行うことができます。
アプリをデバイスにロードすると、Dalvik JVMは実行される直前にバイトコードをネイティブ実行可能コードにコンパイルします。これはジャストインタイムのコンパイルです。プログラムがコンパイルされるのを待っている間、それは短時間のスローダウンを引き起こしますが、その後、コードはネイティブ実行可能コードにコンパイルされているため、パフォーマンスのオーバーヘッドはありません。
開発者のコンピューターで事前にコンパイルする代わりに、この方法で実行することにより、パフォーマンス上の利点がいくつかあります。電話の特定のCPU向けにアプリをコンパイルし、そのハードウェア機能を活用し、パフォーマンス特性を使用できます。たとえば、CPUがサポートしている場合、ハードウェア浮動小数点演算を使用できます。さらに、賢いJITコンパイラー(確かにDalvikはそれほど賢いわけではありません)は、プログラムの実行方法をモニターし、プログラムの実際の使用方法に基づいて最適化を実行できます。お使いの環境や携帯電話でどのオプションがオンまたはオフになっているのかがわかると、より良い分岐ヒントを使用してコードを再コンパイルできます。最先端のコンパイラには、使用するこの情報がありません。
Dalvikは、Dalvikキャッシュおよびその他の技術を使用して、JITコンパイルの欠点を軽減します。Android L以降の新しいJVMであるARTは、JITを完全に事前処理コンパイラに置き換えます。これにより、アプリのインストール時にバイトコードがネイティブの実行可能コードにコンパイルされ、アプリの読み込みを遅らせることなくJITの利点のほとんどが得られます。
Androidアプリが完全にJavaで構成されているわけではないことを忘れないでください。開発者はNDKを使用して、アプリのすべてまたは一部をCまたはC ++で記述します。アプリのパフォーマンスが重要な部分、特にゲーム用です。OpenGLやRenderscriptなどの特別な目的のインターフェイスにより、プログラマーは、GPUやSIMDコプロセッサーなどの特別なハードウェアを利用して、ある種の計算を行うことができます。
本当に、あなたの質問に対する簡単な答えはありません。事前コンパイルの代わりにJITを使用すると、一部の処理が高速になり、一部の処理が遅くなります。これは、OSの全体的なパフォーマンスのほんの一部です。
これは大まかな質問なので、ここで大まかな答えを示します。
「Androidアプリは解釈されるため、iOSアプリはAndroidアプリよりも高速ですか?」
まず、iOSアプリはAndroidアプリよりも「高速」ではありません。
第二に、「Androidアプリは解釈されます」という問題に関して。これは、「15年前」のように、コンピューティングについて言うべきことです。上記の議論からわかるように、今日の状況ははるかに複雑です。まったく新しい技術が前面に出てきました。「コンパイルされるのは、解釈されるよりも速い」という概念です。20年前にマシンコードとperlを比較して、関連性がありました。事態は非常に進んでいるため、今日の問題を「iOS V Android」に実際に明確に適用することはできません。
第三に、モバイルプログラミングには、このような考慮事項を完全に圧倒する他の問題があります。ほんの一例ですが、モバイルプログラマーは、画像の大きなスクロールリストの処理、遅延読み込み、および同様の問題に頭を悩ませています。2つのOS、およびさまざまな一般的なライブラリがこれらの重要な問題をどのように処理するかは、他の問題を圧倒します。
第4に、モバイルに関するもう1つの圧倒的な問題は、グラフィックチップセットの問題と、ソフトウェア、OpenGLなどとのさまざまな複雑な関係です。たとえば、Appleはこれらの問題に関連して「金属」を使用するシステムを発表し、Androidはこの分野で独自の「モノ」を発表しています。グラフィックスパイプラインにまつわるこれらの問題は、アプリがどのように「感じる」かという点で非常に重要です。
あなたの質問に対する非常に短い答えは、「コンパイルされたV.インタプリタ」は基本的にあなたが知っている時代遅れの議論ポイントですか?
(また、iPhoneよりも「遅い」注3を特に見つけません。また、これの一部は純粋な人工物です-安価なAndroid携帯電話が存在します。これからのアイデア。)
解釈されたアプリは、常に遅いという意味ではありません。コンパイルされたものに比べて、より強力で動的な場合があります。コンパイルされたアプリのすべてのコードは一度コンパイルされ、出力はライブラリまたは実行可能ファイルの形式で保持されますが、インタープリター言語では、一度はランダムに実行シーケンスを変更できます。だから私は言うことができる、それは開発者と開発者のプログラミングの方法に依存します。
ただし、Java(Androidのプログラミング言語)は解釈されず、JITコンパイルされます。つまり、Androidプログラムは実行直前にコンパイルされ、iOSのObjective Cとほぼ同等のパフォーマンスが得られます。
最近では、AndroidのARTフレームワークがアプリをプリコンパイルするため、iOSアプリと同じ方法で実行されます。言い換えれば、Androidの次のバージョンは、おそらくiOSと同じくらい高速になるでしょう。
更新
プログラミング言語は一般に、コンパイル済みまたは解釈済みの2つのカテゴリのいずれかに分類されます。コンパイルされた言語では、入力したコードは、実行可能ファイルとして保存される前に、マシン固有の命令のセットに削減されます。インタプリタ言語では、コードは入力したものと同じ形式で保存されます。コンパイルされたプログラムは通常、解釈されたプログラムよりも高速に実行されます。これは、解釈されたプログラムを実行時に機械命令に変換する必要があるためです。ただし、インタープリター言語では、コンパイルされた言語では実行できないことを実行できます。たとえば、解釈されたプログラムは、実行時に関数を追加または変更することにより、自身を変更できます。また、小さなセクションをテストするたびにアプリケーションを再コンパイルする必要がないため、通常、解釈環境でアプリケーションを開発する方が簡単です。