JVMの学習 - (f)は、フロントエンドのコンパイルと最適化

JVMの学習 - (f)は、フロントエンドのコンパイルと最適化

:一般的には「コンパイル」は三つの主要な側面を参照することができ、比較的広い概念である、と述べた
1️⃣フロントエンドコンパイラ。これは、の.classファイル変換プロセスに.javaファイルを参照します。
2️⃣タイムコンパイラ。これは、順番にマシンコードにバイトコードの操作のプロセスを意味します。
3️⃣事前コンパイラー。直接機械命令のターゲット・セットに関連するバイナリコードにコンパイル。
ここでは主としてここ効率化対策の最適化のための基本的には、符号化効率を最適化は、主にプログラマや言語のユーザーの幸福を目指しているが、フロントエンドコンパイラを意味しません。

.javacコンパイラ

JDKより標準ライブラリを使用した以外は、javacコンパイラ自体、それだけではsrc /共有/クラス/ COM /を指し日/ * 全体的な構造のjavacコードの観点から、コンパイル処理が準備に分けることができ、コード三の工程、すなわち:
1️⃣調製方法:注釈プラグインプロセッサを初期化します。
構文解析プロセス2️⃣シンボルテーブルと塗りつぶし:
1.字句、構文解析、マーカーの文字セットに流入し、抽象構文木構造。2.シンボルテーブルを埋める、シンボルアドレスとサイン信号が生成されます。
注釈プロセス3️⃣注釈プラグインプロセッサ:注釈プラグインプロセッサの実行ステージ。ここだけ、あなたはDIYすることができます。
4️⃣バイトコード解析と生成プロセスであって、
1のラベルを確認してください。2.フロー制御フロー解析とデータ。3.構文糖液。4.バイトコード生成。
*注:ステップ3は、新しいシンボルを生成した場合は、ステップ2から再起動する必要があります。
:全体のコンパイルプロセスはのように要約することができる
製造プロセス:注釈プラグイン初期化処理- 1.1プロセス:字句解析、構文解析- 1.2プロセス:シンボルテーブルに入力-工程2:アノテーション処理を実行-手順3.1:標識- 3.2プロセス:データ流れ- 3.3プロセス:ソリューションシンタックスシュガー- 3.4プロセス:生成するバイトコード

シンボルテーブルと塗りつぶしの解決

①形態は、構文解析
字句解析は、ソースコードマーカ収集プロセスに文字ストリームを指します。プログラムを書くときに文字が最小の要素であり、そしてマークが最小の要素のコンパイル時間です。
構文解析プロセスは、抽象構文木構造のトークンのシーケンスです。
抽象構文ツリーは、プログラム表現の木構造を記述するために使用されるコードの構文で、各ノードは、プログラムコードの文法構造を表します。
②充填されたシンボルテーブル
シンボル・テーブルは、データ構造のセットとシンボルで構成されるシンボルのアドレス情報です。出力は、プロセス保留リストの製品です。

2.注釈プロセッサ

JDK6後に特定のコンパイラコードアノテーション処理に前進させることができる「プラグイン注釈プロセッサ」と呼ばれる標準的なAPIのセットを設計しました。プラグインの操作、読み込みは、変更許可は、抽象構文木のいずれかの要素を追加するとき、コンパイラプラグのセットとして見ることができます。

3.意味解析は、バイトコードを生成し、

セマンティックチェック:コンテキストの抽象構文木のような正しいソース相関特性、チェック:型チェックは、制御フローをチェックし、データがチェックを流れます。
①チェックラベルが
含まれてフロントも小さな最適化は一定の折りたたみと呼ばれる含まれ、既に宣言された変数、データ型と変数間の代入一致を、持っています。
②データ及び制御フロー解析
プログラムロジックをさらにコンテキストことを確認することです。全てが適切ような例外処理をチェックしている場合、例えば、ローカル変数は、各パスは、メソッドの戻り値を持っているかどうか、使用前に割り当てられた、かどうかをチェックする、クラスをロード時にデータ及び制御フローの基本的な機能として見ることができます同様の分析。
例えば、最終的な修飾ローカル変数と、クラスファイル内の通常のローカル変数と、この式はの操作に同じ、全く影響されないので、注目すべきは、データ及び制御フロー解析におけるこのタイプのエラー。
溶液糖衣構文③
発生④バイトコード
だけ生成された情報、ディスクに書き込まれたバイトコード命令に(文法の数、シンボル・テーブル)の各工程の前では、コンパイラは、コードと変換作業を少量加えます。
そのような(AS)とクラスのコンストラクタメソッド強度コンストラクタを生成する方法。

II。シンタックスシュガー

糖衣構文は大幅な改善を提供することはできませんが、彼らは、効率を上げる厳密さや文法を向上させる、またはコードは、エラーの可能性を減らすことができます。

1.ジェネリック

パラメータまたは多型のパラメータの型の一般的な性質を。
①javaとC#の一般的な
「ワイパースタイルのジェネリック型」と呼ばれるJavaのジェネリック、C#は、「一般的な式をインスタンス化。」を選択しました いずれかのプログラムのソースコード、コンパイル済みの中間言語表現やCLRランタイムの内部内部内部のC#のジェネリックは本物です。ソースコード内のJava言語の一般的な唯一の存在は、ジェネリックのすべては、元のバイトコードの裸のタイプに置き換えられます。
2間の比較:
1️⃣C#ジェネリック医薬品は、効果の使用がまだあるかどうか、業務効率は(クラスラッパー資格の無数の構造につながる主な理由は、Javaのジェネリックの)汎用Javaの全体的なリーダーです。
唯一の利点は、唯一のjavacコンパイラに改良を加える必要があり2️⃣javaジェネリックジェネリックを達成することです。ジャワの歴史的要因(完全な下位互換性)はJavaのジェネリック医薬品が生じた場合はこの方法でのみ使用することができます。
ジェネリック型情報上で実行することはできません3️⃣java一般的なので、は、いくつかのコードは非常に面倒になります。
②java損失のエレガントなオブジェクト指向のコードタイプ
パラメータは、汎用の両方であり、戻り値が同じである場合、一般的なタイプは後にコンパイルされているので、一般的な出会いが過負荷に、このコードが実行されコンパイルされませんこれは、オーバーロードすることができない二つの同一の方法で得られ、ワイピングされます。
しかし、戻り値の二つの異なる種類の場合は異なるため、戻り値の加算をオーバーロードすることができることは、コード署名のバイトレベルの特性を保存するために、このようなAクラスファイルに署名方法を共存させることができ、これ含みます戻り値。のみJDK6でコンパイルすることができます。
自動トラバーサルサイクルで③入力ボックスは
状況が演算に遭遇していない、データ型変換処理が等しくない場合、「==」操作をパッケージのない入力ボックスことに留意すべきです。
*整数を使用する比較試みは[-128127】データ=のみ比較するため、等しいです。
④条件付きコンパイル
条件がコンパイル時に削除されるコードには満足していない、バイトコードは、このコードには存在しません。

リリース6元記事 ウォンの賞賛2 ビュー281

おすすめ

転載: blog.csdn.net/jacobbbbbbbb/article/details/104228064