オブジェクト指向機能を実装するコンパイラのシリーズを作成するためのホワイト[9]

オブジェクト指向パッケージことを特徴とします。

オブジェクトをすることができ  、データ と  データを操作 外部接点が発生したとのインタフェースの一部だけを保持したまま、内部の詳細を隠すために、可能な限り、不可分の全体を形成するために一緒にパック。


オブジェクト指向セマンティック機能

私たちは、次の3つの特徴的な角度からパッケージオブジェクト指向の意味を理解します。

  • タイプの観点から

       私たちは、プログラムのスケーラビリティを向上させるために、プログラマが自分のタイプを作成することができます。

  • スコープの観点から
  1. クラスの可視性。タイプとして、彼はもはや、プログラム全体の範囲内で表示されないはずです。
  2. オブジェクトのスコープのメンバー。オブジェクトのプロパティは、オブジェクトに関係なく、位置文の内部全体にアクセスすることができます。
  • 生存の観点から
  1. 通常、オブジェクトの生存期間を持つオブジェクトの寿命のメンバ変数は、同じです。オブジェクトを作成するときに、一緒にすべてのメンバ変数の破壊とともに、オブジェクトを破壊したときに、すべてのメンバ変数を初期化しません。
  2. (例えばJAVAの静的メンバとして)結合メンバーの種類はすべてのインスタンスによって共有されるすべてのオブジェクトのインスタンスにスコープされています。オブジェクトインスタンスのいずれかが作成される前に最後のオブジェクトの破壊が消えません前に、だから、彼の生存率は、ありました。

文法クラスのルールの設計と解析

以下は、クラスの構文規則を定義します。

classDeclaration
    : CLASS IDENTIFIER
      (EXTENDS typeType)?
      (IMPLEMENTS typeList)?
      classBody
    ;

classBody
    : '{' classBodyDeclaration* '}'
    ;

classBodyDeclaration
    : ';'
    | memberDeclaration
    ;

memberDeclaration
    : functionDeclaration
    | fieldDeclaration
    ;

functionDeclaration
    : typeTypeOrVoid IDENTIFIER formalParameters ('[' ']')*
      (THROWS qualifiedNameList)?
      functionBody
    ;

文法規則の説明:

  • IDENTIFIER CLASS:クラス宣言は、キーワードクラスで始まります。
  • (typeTypeを拡張)?(IMPLEMENTS typelistに)? 継承されたか、達成するかどうかを決定します。
  • classBody :クラスのボディに追いつくために。
  • クラス内で宣言されるクラスメンバーのボディ。
  • 今役割は、クラスの関数宣言方法です。

具体的には、それを解析すること?

字句解析と構文解析を行った後、意味解析インタプリタは、スキャンASTを上演しますすべてのカスタムタイプを識別する他の場所で変数を宣言するためにこれらの型を参照します。型宣言はどこにでも、コード内である可能性があるので、それが識別するための別のトラバースとレコードタイプを使用するのが最適です。

私たちは、変数を宣言するときに、あなたは、このタイプのを参照することができます。別の意味解析作業がされ、消化の変数の型をして例えば、私たちは「鳥の鳥=鳥();宣言 」 鳥の定義は、内のオブジェクト場所を知る必要性を適切にそのメンバーにアクセスするために。

意味解析を行うことで、型定義が保存されている必要があるデータ構造ここで:

public class Class extends Scope implements Type{
    ...
}

public abstract class Scope extends Symbol{
    // 该Scope中的成员,包括变量、方法、类等。
    protected List<Symbol> symbols = new LinkedList<Symbol>(
}

public interface Type {
    public String getName();    //类型名称

    public Scope getEnclosingScope();
}

この設計では、私たちが見る、クラスは、オリジナルメンバーのすべての種類を保存することができます範囲適用範囲(スコープ)で、今直接、クラスを保存するために使用されるプロパティとメソッドを再利用することができ、クラス図は、5月の下に描かれた:(参照:[白]コンパイラシリーズ8スコープおよび生存を作成するには、ブロックスコープと機能を達成するために

字句解析を行うことで、私たちは、変数宣言、表現だけでなく、クラス名、メソッド名などの台頭など、さまざまな文法規則、に表示された識別子の多くを解決します。メソッド名などであり、意味解析フェーズでは、我々はこれらの識別子は、個別に識別したい、これはローカル変数を参照する変数です。

変数、クラスや関数の名前は、我々はシンボルと呼ばれています。コンパイルプロセスの重要な仕事は、シンボルテーブルの確立である、それはさらに、コンパイルに私たちを助けたり、プログラムを実行し、上記の情報をいくつかのクラスを保存するためにシンボルテーブルを使用します。シンボルテーブルでは、我々はその名前、種類、範囲およびその他の情報を格納します。クラスや関数のために、私たちは店のクラス変数、メソッド、パラメータ、戻り値やその他の情報への適切な場所を持っています。

どのようにオブジェクトがインスタンス化されますか?

まずによって  コンストラクタ オブジェクトを作成します。

表現が、私たちのユニークなデザインで機能の同じ名前のクラスに新しい、直接呼び出しを省略し、以下のような文法では、我々は、オブジェクトを作成するためのサンプルコードを新しいキーワードを使用していませんでした。

Mammal mammal = Mammal("dog"); //playscript特别的构造方法,不需要new关键字
Bird bird = Bird();            //采用缺省构造方法

ときしかし、意味検査に現在のスコープは、クラスの初期化メソッドは、クラス内で定義されているため、このような機能を見つける間違いではありません、限り、我々はチェックして、哺乳類や鳥ではありません、クラス名、その上にA。さらに、Mammalクラスは、コンストラクタ哺乳類()を持っている、と鳥のクラスのコンストラクタを明示的に定義され、事実ではないですが、それは、メンバ変数を初期化することができないという意味ではありません。私たちは、から学ぶオブジェクトがメンバーの宣言を初期化時に、Javaの初期化メカニズムはデフォルトの初期化方法、デフォルトの初期化方法を提供することで、作業が実行されます全体のオブジェクトのインスタンス化のプロセスを改善するように、明示的に定義されたコンストラクタを呼び出す行く、デフォルトの初期化の後に作られたオブジェクト。

メモリ内のデータ・オブジェクトを管理する方法?

CやC ++言語の構造体のオブジェクト構造は、に格納することができる  積層体 です。スタックに格納されたオブジェクトが宣言され、むしろ作成するために、新しいキーワードを使用するよりも、直接インスタンス化されます。

新しいキーワードを作成する場合は、実際にアプリケーション・ヒープ・メモリの一部であり、ポインタ変数に代入以下のように、:

オブジェクトはヒープに格納されている場合、複数の変数は、図変数と同じオブジェクト物体1を参照することができ、Bのように、同じオブジェクトを参照することができます。クラスメンバ変数はまた、物体1引用されたオブジェクト2、オブジェクトのクラスメンバーとして他のオブジェクトを参照することができます。オブジェクトの存続期間を超えてそのスタックフレームの寿命を作成することができます。

オブジェクトが格納されている場合、スタックそれの範囲の生存率が同じで、それができ自動的に作成および破棄、ありませんので、追加のメモリ管理。欠点は、オブジェクトが長期間存在して共有する方法ではないということです

では、ヒープしかし内部の作成されたオブジェクト共有することができますが、メモリ管理の負担を増加させました

オブジェクトのプロパティとメソッドへのアクセス

オブジェクトにアクセスするために我々のドット演算子のプロパティとメソッド:

mammal.speak();                          //访问对象方法
println("mammal.name = " + mammal.name); //访问对象的属性

参照プロパティとメソッドは、発現された構文が定義され、以下のように:

expression
    : ...
    | expression bop='.'
      ( IDENTIFIER       //对象属性
      | functionCall     //对象方法
      )
     ...
     ;

また、メンバーは、ターゲットの可視性を設定することができます。換言すれば、オブジェクトのみ内部いくつかのメンバーが使用する、いくつかは外部からアクセスすることができますこれは、どのようにそれを達成するには?

それは意味検査はコンパイル時の段階で行われているだけで意味的な問題、だ、それはそれについてのレポートのコンパイルエラー、プライベートメンバーは外部からアクセスされていることはできません。


参考:「オタクの時間 - 美のコンパイラの理論」

公開された62元の記事 ウォン称賛34 ビュー20000 +

おすすめ

転載: blog.csdn.net/weixin_41960890/article/details/105300542