ホットフィックスデザインAOT / JIT&dexoptとdex2oat()

 

アリP7モバイルインターネットの建築家、高度なビデオ(毎日更新)無料学習クリックしてください:https://space.bilibili.com/474380680
この記事は、ホットフィックスのデザインを紹介するAOT / JIT&dexoptとdex2oatで始まります。

A、AOT / JIT

プログラムのコンパイル処理、すなわち、ステップAで得られた結果の各実施例について、独立して実行し、ASTを設定し、最初のバイトコードを出力することができるの終了後、ASTはまた、中間状態が実行される説明することができ、反復工程であってもよいです。あなたは、言語のために複数の独立したコンパイラを持つことができますので、自然のトランスコーディングのためには、1つのステップの各担当し、コンパイルされ、

:AOTコンパイラとJITコンパイラは、分類を行うためにコンパイルされた形式です
事前に、標準的な静的コンパイラとして、コンパイラが実行される前を指し:AOT
、ジャストで時間をサイドのコンパイルを実行している間、仮想Javaなど、実行時にコンパイルいう:JITランタイムJIT技術で使用されるマシン

JITは、何人かの人々を知っていることがあり、AOTの用語は、JITに加えて、実際には、いくつかの比較的まれであり、残りはAOTです。JITまた、AOT以外のwikiの詳細についての説明の多くは、ウィキを理解することによって、一般的には、「ランタイム」でコンパイルされるように見ていない二つの概念の区別のフォームからアップしている場合

これら二つの概念が曖昧さを持っている、問題はビューの概念の観点から、言って、区別するためにどのようにこの「実行時」ということですが、Pythonは使用済みのJIT技術である理由は次のとおりです。

... 
import a 
... 

コースをインポートする実行が実行されるとa.pyを見つける場合にのみ、この時間は、コンパイルとPythonを考え、JITパイソンの特徴であるが、一般的に言っている、a.pyc生成していきますJITはサイコ、pypyあるなど、自身がJITのカテゴリに属する、またはJIT機能のことのようにA「フォーム」は範囲に含まれていないことのpythonのダイナミクスを考えていません。他のスクリプト言語は、動的言語は似たような状況があります。私はいくつかの特定の理由があると思い
ますが、JITをオフにした場合、Javaなどの言語自体の動作には影響を与えません、最初の主流の理論のJITコンパイラによって認識されたが、JITを削除しても、言うことです彼らのコンパイル言語用のアドオンの一部であり、まだ特性が正式にJITを満たすが、時には、上記のインポートのpythonの実装と動作を説明するが、このメカニズムは、言語そのものの提供であることができ、取り外した場合、言語(主流の実現は)完全ではありません。解決するには、実行プロセスには影響しませんしませんので、直接分析実行を使用してPythonのソースコードならば、行動のためのバイトコードコンパイラは、JITとして見ることができます逆に
第二に、このPythonのコンパイラは常に実行されることはありません一般的に結果が生成されますので、バイトコードPYCディスク・ファイルは、それがより多く必要なときにJavaクラスファイル転送元の不活性化処理が行われるようなもので、存在している
。最後に、JITは実行時のリソースを消費し、原因となりますケイトン・プロセス、および理由JITのJavaや他の言語の導入、バイトコードのコンパイル、時間のカトン期間後に高速に実行することができJITは実行とほぼ等しいエンジニアリングの観点から、いわばバック、JITを改善するため、最適化(概念およびフォームからないが)、およびPythonのimportのみケイトン、何のスピードの利点
ので、コンセプトが、上記の例では、実際にJITと一致しているが、一般的にはそうは思いません出発角問題、JITのJITのプロパティがもっともらしいと考えられているの有無にかかわらず、Pythonが来ると言います

実際には、すべての命令シーケンスを実行する、私は反対し、AOTとJITの団結の概念体現し、分割するラインとして、「ファイル名を指定して実行」に反対の形であると思うので、この例を与える、と団結が言っている理由は、この全体のプロセスに関しては、そのような輸入aの実装を再コンパイルする必要がある確かにJITが、一部の人々が考える場合、AOTとして見られるかもしれない(それがインポートモジュールを実行し、初めてのPythonプロセス)このモジュールをa.pyする相対、間違って、その変化がより明白である例を行うすべてのインポートのpythonプログラムは、その概念に基づいて、実装に入る前に、プロセスで開いている場合は、すぐに実行するプロセスがすでに実行始まっているので、それは、JITですが、なぜ最初のAOTコンパイルモードと見られ、その後実行されますが、全体のプロセスは、それのバッチであるべきではありませんか?

この質問では、JITの別の説明へ(ウィキ含む)多くの情報を考慮して、JITは、動作速度を向上させるためには、マシン命令にコンパイル(例えばバイトコードなど)ランタイム実行言語で解釈されます。マシン命令にコンパイルバイトコードは、速度を向上させることができるためにも言及した記事の前のビューには、Javaなど多くのJITコンパイラは、乾いたので、なぜしなければならない、しかし、そこに(私たちは、次のJavaの例を取っ​​た)されています実行時に行われたときに、作られたAOTモードではよりスムーズにあなたよりも実行することができ、また一度コンパイル、Nの実行は、なぜ、JITが速度を向上させることになったの実行をしなければならないが、これはそうではありません効率が低下?

このビューは、実際には、いくつかのJava AOTコンパイラーがあり、理にかなって、できる機械語命令に直接でも、Javaのバイトコードコンパイラのソースコードは、実行可能ファイル、MicrosoftのオリジナルのVJ ++はとても魅力的であるように思われ、太陽のビートスローガン長い時間枠は、太陽がまた純粋なJava用の呼び出し(Javaのを達成するために太陽のデザインコンセプトと規格に準拠している純粋なJava、)、非常に面白い、歴史のこの期間について検索を行くことができます興味を持っています

一方、太陽のJVMはJITコンパイラを使用するには、だけでなく、クライアントとサーバーのモードが用意されていますが。でサーバーモードを、仮想マシンをできるだけ最初のバイトコードをコンパイルするでしょう実装の開始時およびできるだけ高いとして度を最適化し、上述したようにあなたは、可能なカトンとして少しとして動作中のサーバーを作ることができるので、これは実際にはAOTのバッチのと同じです。クライアントモードでは、ユーザーエクスペリエンスを向上させ、起動遅延を最小限にするために、主に、そうしません

ところで、JITのために例えば、私たちはJava仮想マシンA言語解釈A単語を使用し、時々、ネイティブコードで、時々マシンコードと、あいまいなマシン命令、ウィキの説明にコンパイルバイトコード実行バイトコードとネイティブコードと見られ、JVM上の実行、Javaのバイトコード、およびマシン・コードは必ずしもマシンではないため、JITである自身のJavaバイトコード、バイトコードにコンパイル実際のマシンは、JVMがマシンです

JITコンパイル時間のかかる操作の後に、その後、いくつかの最適化のポイントのために百パーセントをサポートすることはできませんので、トレードオフの最適化と実行ケイトンコードの間を作る必要があり、AOTはほかに、AOTコンパイルを行うことができ、このような問題を持っていないでしょうストレージに永続化し、一般的に一度だけ実行JITは、すべての繰り返しコンパイル再びそれを行います

我々は時間を過ごしたAOT(例えば、一度Nの実行をコンパイルなど)自体を考慮していない場合は、使いやすさを考慮していない(AOTコンパイルの数倍でもよい)、それを考慮しない、AOTのJITコンパイラは、完全に置き換えることができますコンパイルが、それは完全に不要であり、当然の実際の状況はそうではありませんJIT、JITはまだその利点と必要性を持っている、それ以外の群衆が、それは愚か者です勉強しないだろう

この問題では、静的なルックを駆動し、AOTコンパイラが静的であるが、動的なJITコンパイラが実行されている、JITは、それが静的な情報(コード)を見ることができるだけでなく、実行時に状況を見てという利点を持っている、これはJITです利点。JITの次の議論は、使用場所ではなく、上記のフォームを扱うことができない狭いJIT、AOT JITです

JITの利点がある4点のwiki上の理由で与えられているが、興味深いことに、でもそれが唯一のJITではないことを認めている2つは、AOTで(または部分的に)を達成するために、その少なくとも理論的には、行うことができます4である、可能:
。最適な機械命令に1、リアルタイムでJITコンパイラは、現在のハードウェアの状況に応じて、例えば、FPU、並列コンピューティング特性MMX、SSE2、またはIntel CPUを含むCPUは、同じ単語を行うことができる場合ハードウェアリソースの使用を最大化するために、異なるマシン上で実行されているフェスティバルヤード、。そして、特性のみ互換CPUの最小値、または複数のバージョンの内部実装に行くことができ、AOTコンパイラは異なるユーザにプログラムを出しているかの
ために最適化するには、2、JITが実際のプロセスの現在の状態に応じて実行することができますバイトコードコンパイラマシン命令のシーケンス。ウィキ考え静的コンパイルは、(トラブルのビットであってもよい)プロファイルを分析することによって、この領域で最適化することができる
、動的リンク、すなわち静的コンパイルステージをサポートするようにすると、プログラムのニーズ、3に導入されるか、コードを知らないかもしれない、とプログラムの実行コラボレーションの実行、この時間は、JITに頼るだけでできる
メモリの実際のプロセスに応じて調整することができ、ガベージコレクション、JITコードを考慮して、4、キャッシュが充実し利用することができます、と考えWIKI静的コンパイラが行うが、JITを行うことができます達成することは簡単です

最初の場合、JITは確かに、この最適化を達成することができますが、異なるユーザにプログラムのAOTコンパイラの実装が行うことができないがAOTとして、達成することができますが、ときにユーザーが使用再びそれを行うには、現在のマシンに基づいて、その後のバイトコードの問題をコンパイルすることができ、 AOT
第二に、第二のために、私が最初にすべての状態の実行ほとんどのプログラムは時々 、浮動小数点演算は、主に一般的なプログラムのシナリオが固定され、計算過半数整数時々 、このような同一のプログラムとして、頻繁に変更されないと思います特定のシーンのためにあなたは、AOTができ
、静的最適化AOTの全文を行うことができない第三、本当にダイナミックリンクのために、しかし記事は、必要なときに、上述したように、私たちは直接、さらに、言語のダイナミクスをカットすることができ、何が静的コンパイルされていないときですC言語など、知覚できないが静的にリンクされない、少なくともヘッダファイル、動的なので、強くはない知っている、
第四のために、AOTは、トラブルの多くが、達成することが可能です。そこにキャッシュ結果を改善するための外静的コンパイル命令は、これもまた、あるとガベージコレクションのアルゴリズム、プログラム自体は、この調整の影響も可能性が高いのであれば、ローカル・プログラム自体が書き込み悪いにたくさん持っている一方、限られました

私が考えるように、これらの4つの合理的ではあるが、しかし、正確にポイントを持っていません。再びAOTを超えていないプロセスの状態が制限されるため、完全に、AOT JITを置き換えることができ、AOTは、すべての可能なシナリオを予測し、実際の実行時の状態を最適化することができ、理論的には、我々はそれを見ることができ、この質問を調べますここ予測、コードの最適な使用を実行することができ、JITの利点は、あなたは、AOT最適化されたコストが高すぎる場合、それは正確に、AOTと予測するのではなく、低コストの実行時の状態を知ることができなければならないですJITを選択します。AOTはできないことではありませんが、現実的ではありません

「表現ベース専門とPythonのためのサイコプロトタイプジャスト・イン・タイム」アーミン・リゴによっては、この論文はPythonに基づいており、そのJITにライブラリサイコ例プラグイン:JITの関連情報は、ウィキに比べて私はこの論文をお勧めします分析、単語の専門で論文のトピックは、最後の仕上げとして記述することができ、それは少なくとも、動的型付け言語では、JITが重要な役割の専門の一つであり、静的の動的挙動を言って記事の使用であり、そしてこれらのシーンは、AOTで実現可能ではないことを指摘しましたその理由は、専門的な方向性を見出すことが困難であるということであり、すべての専門の列挙は現実的ではありません

専門の典型的なケースは、また、論文に記載されている、あなたは、関数f(x、y)を持っていると仮定し、次に入力×1、X、X2、X3のために...、私たちは関数f1(y)を特化することができます、F2(Y)、F3(Y)...ここで、FK(Y)の関数で(XK、Y)Fに対応する、それぞれFKを個別にかかわらず、他の機能を、実行するように最適化し、配置することができるためにそう、ことポストの元のF(X、Y)よりも少なくとも遅くない機能リスト。唯一の問題は、xの値が専門にAOTの方法は、必要性は明らかに非現実的である以上42億機能を、コンパイルする場合、xが、その後、int型であるなど、多くのことがあり、ですが、それはJIT可能ですシーンは、最適化を行いますが、特定の動作範囲の過程で、xの値の数は二十から八の法則に沿ってある、非常に小さいとしても、比較的小さいものの、なぜなら

従って、ランタイム関数では、各入力xの統計を監視するために行うことができ、F、および例えば123 xと、これらの値の見つかった不均一な分布は、大部分の場合、F123の動特性(Y)である場合、その高度に最適化した後、関数fを変更します。

func f(x, y): 
    if x == 123: 
        return f123(y) 
    ... //f的正常流程 

だから、専門的な機能を必要とする作業の効率を向上させるために持って来ることができ、JITの特別な利点であります

多くのプログラムのために、それは入力値の範囲の関数ではないので、このような値の監視を行うことは、専門とコストが高くなくてもよいが、不均衡の状態ごとに提示され、またはそれほど明らかではないが、上記の例では、xとyさ必ずしも変数は、それが動的型付け言語のために大きな意義があるように、タイプすることができ

変更する場合は、テンプレートはC高効率かかわら++こうして、コードの交換を通じて、静的の種類を達成するために、本質的には、C ++での鴨の種類を達成するために使用することができますが、チャネルは、AOTコンパイラの静的コンパイルによる分析の全文であることを思い出してください無関係な言語、多少強力な原動力であることを。k個のパラメータの関数が存在する場合、ダイナミック型では、可能なタイプがnあり、AOTは、n ^ K番目特化インスタンス、n及びkはわずかに大きいように動作可能でないように機能を拡張する必要があり、しかも、それ自体が動的です入力し、n個の範囲は必ずしもコンパイル時に知りません

プログラマは、このような関数を書くなどの動的型を、使用してプログラムを書くとき、ため、このシナリオでは、JITは選択的、統計的な方法で、より高い実現可能性と実用的な意義を専門にすることができます。

func f(x, y): 
    return x + y 

理論的には、この関数は、x限り、xおよびyの任意の型を受け入れることができ、yは一緒に追加することができるが、特定のプログラムに固有の機能のサービスは、一般的に固定されている、または文字列連結を行う、または話すと操作の異なるタイプが8極を打つことができないとる関数を記述するだけでなく、プログラマが意図的にそうような根本的なを見ていない、C ++テンプレートとして以前のあいまいさを述べ、設計されたことはほとんど、値を追加することはありませんこの要求、そう二十から八の法則に沿って、関数の入力パラメータの型、に。したがって、上記のコードについて、それがXほとんどのケースで想定およびyは整数であり、(擬似コードはオーバーフロー整数考慮されていないと仮定して)行わ特化さ:

func f(x, y): 
    if not (x instanceof int and y instanceof int): 
        //有一个不是整数,走原有流程 
        return x + y 
    //整数加法的特化流程 
    internal_code: 
        int ix = get_internal_int(x) 
        int iy = get_internal_int(y) 
        int iresult 
        asm: 
            push ... //当前状态压栈 
            mov eax, ix 
            mov ebx, iy 
            add eax, ebx 
            mov iresult, eax 
            pop ... //状态出栈 
        return build_int_object(iresult)

fは、より複雑なロジックがある場合にのみ、追加のため、この数行き過ぎ、しかし、最適化は非常に明確である場合はもちろん、これは一例であり、

また、AOTは、専門の理由を達成することは困難である、およそ思考を逆にすることができ、すべての状況を考慮することができませんが、私たちはすべての状況を考慮する必要はありません、実際には、二十から八法則自体は二十から八法で使用される別のタイプで、int型に固有大半はint型プログラムは、すべてのプログラムで圧倒的多数を占めて限られた分野では、少なくともあるそうなので、2kの種類は、関連する専門分野を持っていたint型入力するために使用しているので、それぞれの機能についてのみ状況はかなり許容され、より良い少しを行うには場合、コンパイラオプションは、ユーザーによってもにすることができる(、多くのパラメータがint型であると想定されている場合ので、たくさんの下ケース2Kの実際の数よりも構文エラー、ことを前提としていません)これより完璧なことを、専門のタイプを指定するためのAOTの時間

動的な型に加えて、他のダイナミクスだけでなく、詳細に入る、例を取る記事に類似した議論であってもよいです。

for i in range(n): 
    print(i) 
转换为: 
if not (range is builtins.range and print is builtins.print): 
    for i in range(n): 
        print(i) 
else: 
    internal_code: 
        long tmp = get_internal_long(n) 
        long i 
        //这里应该用汇编,仅表个意思 
        for (i = 0; i < tmp; ++ i): 
            print_long(i) 

現在の動作環境を検出するためのデフォルトの関数内の組み込みコマンドでプログラムが起動するので、上記の、ここではJITまたはAOTを達成することができるように、効率性とダイナミック考慮して、ユーザーが変更されていないときの必要性を保存します。

二、dex2oatとdexopt違い

これは、マスター1原理の必要性についての一般的な理解を持って、アプリケーション層から開発され、次の図のアウトラインで利用可能な特定の違い(ネットワークからの映像)。

 

 
19956127-b3d84776d9e1ddc6.png
 

 

 

あなたは明確にアートのための仮想マシンです図、のDalvik仮想マシンの元、によってdexoptとdex2oatの違いを見ることができます。

 

dexopt DEXは、操作のファイルの検証と最適化され、それはODEXファイルの最適化の結果だけで(など、仮想呼び出し命令を最適化するように)いくつかの最適化操作コードを使用し、ファイル、ドキュメント、およびこのようなDEXファイルをDEXになりました。

dex2oatがそれをコンパイルし、次に控えDEXファイルを必要とする操作のコンパイル、およびAOTのDEXファイルで、結果はローカルプロセッサに直接実行することができますネイティブのELF実行可能ファイルです。

また、図のDalvik仮想マシンで見ることができるだけでなく、また、コードを実行するためにコンパイル熱いJavaバイトコードを実行可能であると言うことですJITコンパイラを、持っているので、仮想マシンはまだアートいます異なります。Dex2oatアート仮想マシンは、最も頻繁に行われる先のすべてのdexバイトコードコンパイラ、およびホットヒューリスティック検出を使用する唯一のバイトコードコンパイラのDalvik仮想マシンのです。
参考:https://www.jianshu.com/p/26a82119da49
https://blog.csdn.net/xtlisk/article/details/39099199
アリP7モバイルインターネットの建築家、高度なビデオ(毎日更新)無料学習してくださいクリック:https://space.bilibili.com/474380680を

おすすめ

転載: www.cnblogs.com/Android-Alvin/p/11963062.html