(57)【要約】構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を作成し、使用するための方法およびシステムが本明細書に開示される。１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）が、走査されてトークン（２１６ｂ）になり得る。これらのトークンは次に、構文解析されて抽象構文木（２１６ｂ）になる。抽象構文木は次に、モジュール形式でシリアル化され、記憶デバイス（８０２）上で構文解析済みのヘッダになる。１つ以上のソースファイル（１１４、２１４、３０２、３０６）内のディレクティブ（１１４ａ、２１４ａ）に基づいて、構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）は次に、デシリアル化されて抽象構文木になり、記憶デバイスからロードされ得る。ロードされた抽象構文木は次に、ソースファイルのコンパイル中に使用され得る。【選択図】  図１
2014528128.tif 000002
【特許請求の範囲】
【請求項１】
ヘッダを構文解析済みにするための方法（５００）であって、
コンピューティングデバイス（８００）上で、１つ以上のヘッダファイル（１１６、２１６、３０４）を走査してトークン化された形式（２１６ａ）にすることと、
前記コンピューティングデバイス（８００）上で、前記トークン化された形式（２１６ａ）を構文解析して１つ以上の抽象構文木（２１６ｂ）にすることと、
前記１つ以上の抽象構文木（２１６ｂ）を、モジュール形式で記憶デバイス（８０２）にシリアル化することにより、前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）のための１つ以上の構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を作成することと、
を含む、方法。
【請求項２】
１つ以上のソースファイル（１１４、２１４、３０２、３０６）内のディレクティブ（１１４ａ、２１４ａ）に基づいて、前記記憶デバイス（８０２）から前記１つ以上の構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を見つけることと、
前記コンピューティングデバイス（８００）上で、前記構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）から、前記１つ以上の抽象構文木（２１６ｂ）をデシリアル化することと、
前記コンピューティングデバイス（８００）上で、前記１つ以上の抽象構文木（２１６ｂ）を使用して、前記１つ以上のソースファイル（１１４、２１４、３０２、３０６）をコンパイルすることと、
をさらに含む、請求項１に記載の方法。
【請求項３】
前記１つ以上の構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を見つけることは、
ソースファイル（１１４、２１４、３０２、３０６）内の１つ以上のディレクティブ（１１４ａ、２１４ａ）であって、１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）を指定する、ディレクティブ（１１４ａ、２１４ａ）を受け取ることと、
前記ソースファイル（１１４、２１４、３０２、３０６）内の前記１つ以上のディレクティブ（１１４ａ、２１４ａ）に基づいて、前記記憶デバイス（８０２）上で１つ以上の対応するシリアル化された構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を見つけることと、
を含む、請求項２に記載の方法。
【請求項４】
前記ディレクティブ（１１４ａ、２１４ａ）は、ｉｎｃｌｕｄｅディレクティブを含む、請求項３に記載の方法。
【請求項５】
前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）は、独立してコンパイル可能である、請求項１〜４のいずれか一項に記載の方法。
【請求項６】
前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）内でシンボル結合を凍結させることをさらに含む、請求項１〜５のいずれか一項に記載の方法。
【請求項７】
前記コンピューティングデバイス（８００）上で、前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）内の変更を検出することと、
前記コンピューティングデバイス（８００）上で、変更された前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）のそれぞれについて１つ以上の新しい抽象構文木（２１６ｃ）を生成することと、
前記１つ以上の新しい抽象構文木（２１６ｃ）を、モジュール形式で記憶デバイス（８０２）にシリアル化することにより、変更された前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）のそれぞれについて１つ以上の新しい構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を作成することと、
をさらに含む、請求項１〜６のいずれか一項に記載の方法。
【請求項８】
変更された前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）のそれぞれについて、前記記憶デバイス（８０２）から前記新しい構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を見つけることと、
前記コンピューティングデバイス（８００）上で、変更された前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）のそれぞれについて、前記新しい構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）から前記新しい抽象構文木（２１６ｃ）をデシリアル化することと、
前記コンピューティングデバイス（８００）上で、変更された前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）のそれぞれからの、前記新しい抽象構文木（２１６ｃ）を使用して、ソースファイル（１１４、２１４、３０２、３０６）をコンパイルすることと、
をさらに含む、請求項７に記載の方法。
【請求項９】
前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）について、前記１つ以上の抽象構文木（２１６ｂ）をモジュール形式で記憶デバイス（８０２）にシリアル化することは、前記１つ以上の抽象構文木（２１６ｂ）のそれぞれについてシリアル化されたファイルを作成することを含む、請求項１〜８のいずれか一項に記載の方法。
【請求項１０】
複数個のヘッダをモジュールにグループ化することをさらに含み、前記複数個のヘッダが、単一のシリアル化されたファイルの中に含まれる、請求項１〜９のいずれか一項に記載の方法。
【請求項１１】
前記コンピューティングデバイス（８００）上で、１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）を走査してトークン化された形式（２１６ａ）にすることは、１つ以上のシンボルについて前記トークン化された形式（２１６ａ）を走査することと、前記１つ以上のシンボルに基づいて１つ以上のプリプロセッサシンボルテーブルを作成することと、をさらに含み、
前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）について前記１つ以上の構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を作成することは、
前記１つ以上の抽象構文木（２１６ｂ）をモジュール形式で記憶デバイス（
８０２）にシリアル化することと、
前記トークン化された形式（２１６ａ）をモジュール形式で前記記憶デバイ
ス（８０２）にシリアル化することと、
前記１つ以上のプリプロセッサシンボルテーブルをモジュール形式で前記記
憶デバイス（８０２）にシリアル化することと、を含む、請求項１〜１０のいずれ
か一項に記載の方法。
【請求項１２】
１つ以上のソースファイル（１１４、２１４、３０２、３０６）内のディレクティブ（１１４ａ、２１４ａ）に基づいて、前記記憶デバイス（８０２）から前記１つ以上の構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を見つけることと、
前記コンピューティングデバイス（８００）上で、前記構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）から前記１つ以上の抽象構文木（２１６ｂ）をデシリアル化することと、
前記コンピューティングデバイス（８００）上で、前記構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）から前記トークン化された形式（２１６ａ）をデシリアル化することと、
前記コンピューティングデバイス（８００）上で、前記構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）から前記１つ以上のプリプロセッサシンボルテーブルをデシリアル化することと、
前記コンピューティングデバイス（８００）上で、前記１つ以上の抽象構文木（２１６ｂ）、前記１つ以上のプリプロセッサシンボルテーブル、および前記トークン化された形式（２１６ａ）を使用して、前記１つ以上のソースファイル（１１４、２１４、３０２、３０６）をコンパイルすることと、をさらに含む、請求項１１に記載の方法。
【請求項１３】
コンピューティングデバイス（８００）上で、１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）を走査してトークン化された形式（２１６ａ）にすることは、
前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８
）から１つ以上の識別子の一覧を作成することと、
前記各々の識別子が、前記トークン化された形式（２１６ａ）で存在するか
に基づいて、前記１つ以上の識別子の一覧の中のそれぞれの識別子を削除すること
と、をさらに含み、
前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）について、前記１つ以上の構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を作成することは、前記１つ以上の識別子の一覧をモジュール形式で記憶デバイス（８０２）にシリアル化することをさらに含む、請求項１〜１２のいずれか一項に記載の方法。
【請求項１４】
前記１つ以上の識別子の一覧が１つ以上のプリプロセッサシンボルテーブルと一致することを検証することをさらに含む、請求項１３に記載の方法。
【請求項１５】
２つ以上の抽象構文木（２１６ｂ）が等しいかを検出することと、
前記２つ以上の抽象構文木（２１６ｂ）が等しいかに基づいて、前記２つ以上の抽象構文木（２１６ｂ）を単一の抽象構文木にマージすることと、をさらに含む、請求項１〜１４のいずれか一項に記載の方法。
【請求項１６】
コンピューティングデバイス（８００）上で１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）を走査してトークン化された形式（２１６ａ）にするように構成されるスキャナ（１０４、２０４）と、
前記コンピューティングデバイス（８００）上で前記トークン化された形式
（２１６ａ）を構文解析して１つ以上の抽象構文木（２１６ｂ）にするように構成
される構文解析器（１０６、２０６）と、
前記１つ以上の抽象構文木（２１６ｂ）をモジュール形式で記憶デバイス（
８０２）にシリアル化することによって、前記１つ以上のヘッダファイル（１１６
、２１６、３０４、４０４、４０８）について、構文解析済みのヘッダ（２２２、
３０８、４１０、４１２、４１４）を前記記憶デバイス（８０２）上に作成するよ
うに構成されるシリアル化モジュール（２０８）と、を備える、フロントエンドコ
ンポーネントと、
前記１つ以上の抽象構文木（２１６ｂ）を使用して、１つ以上のソースファイル（１１４、２１４、３０２、３０６）をオブジェクトコード（１１８ａ、２１８ａ）に変換するように構成されるバックエンドコンポーネント（１１２、２１２）と、を備える、コンパイルのシステム（２０５）。
【請求項１７】
前記シリアル化モジュール（２０８）は、
１つ以上のソースファイル（１１４、２１４、３０２、３０６）内のディレクティブ（１１４ａ、２１４ａ）に基づいて、前記記憶デバイス（８０２）から前記構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を見つけることと、
前記コンピューティングデバイス（８００）上で、前記１つ以上の抽象構文木（２１６ｂ）を前記構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）からデシリアル化することと、を行うようにさらに構成され、
前記バックエンドコンポーネント（１１２、２１２）は、前記構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）からロードされた前記１つ以上の抽象構文木（２１６ｂ）を使用して、１つ以上のソースファイル（１１４、２１４、３０２、３０６）をオブジェクトコード（１１８ａ、２１８ａ）に変換するようにさらに構成される、請求項１６に記載のシステム。
【請求項１８】
前記シリアル化モジュール（２０８）は、
１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）を指定する、ソースファイル（１１４、２１４、３０２、３０６）内の１つ以上の既存のディレクティブ（１１４ａ、２１４ａ）を受け取ることと、
前記ソースファイル（１１４、２１４、３０２、３０６）内の前記１つ以上の既存のディレクティブ（１１４ａ、２１４ａ）に基づいて、前記記憶デバイス（８０２）上で１つ以上の対応するシリアル化された構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を見つけることと、を行うようにさらに構成される、請求項１７に記載のシステム。
【請求項１９】
前記ディレクティブ（１１４ａ、２１４ａ）は、ｉｎｃｌｕｄｅディレクティブを含む、請求項１８に記載のシステム。
【請求項２０】
前記フロントエンドコンポーネント（１０２、２０２）は、前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）が独立してコンパイル可能であるかを決定するように構成される検証器をさらに備える、請求項１６〜１９のいずれか一項に記載のシステム。
【請求項２１】
前記フロントエンドコンポーネント（１０２、２０２）は、前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）内でシンボル結合を凍結するように構成される検証器をさらに備える、請求項１６〜２０のいずれか一項に記載のシステム。
【請求項２２】
前記フロントエンドコンポーネント（１０２、２０２）は、
前記コンピューティングデバイス（８００）上で、前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）内の変化を検出することと、
変更された前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）のそれぞれについて、１つ以上の新しい抽象構文木（２１６ｃ）を前記コンピューティングデバイス（８００）上で生成することと、
前記１つ以上の新しい抽象構文木（２１６ｃ）をモジュール形式で記憶デバイス（８０２）にシリアル化することにより、変更された前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）のそれぞれについて、１つ以上の新しい構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を作成することと、を行うように構成される修正検出器をさらに備える、請求項１６〜２１のいずれか一項に記載のシステム。
【請求項２３】
前記シリアル化モジュール（２０８）は、前記１つ以上の抽象構文木（２１６ｂ）のそれぞれについて、構文解析済みのヘッダを作成する、請求項１６〜２２のいずれか一項に記載のシステム。
【請求項２４】
前記スキャナ（１０４、２０４）は、１つ以上のシンボルについて、前記トークン化された形式（２１６ａ）を走査することと、前記１つ以上のシンボルに基づいて、１つ以上のプリプロセッサシンボルテーブルを作成することと、を行うようにさらに構成され、
前記シリアル化モジュール（２０８）は、
前記１つ以上の抽象構文木（２１６ｂ）をモジュール形式で前記記憶デバイス（８０２）にシリアル化することと、
前記トークン化された形式（２１６ａ）をモジュール形式で前記記憶デバイス（８０２）にシリアル化することと、
前記１つ以上のプリプロセッサシンボルテーブルをモジュール形式で前記記憶デバイス（８０２）にシリアル化することと、により、前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）について、構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を記憶デバイス（８０２）上に作成するように構成される、請求項１６〜２３のいずれか一項に記載のシステム。
【請求項２５】
前記シリアル化モジュール（２０８）は、
１つ以上のソースファイル（１１４、２１４、３０２、３０６）内のディレクティブ（１１４ａ、２１４ａ）に基づいて、前記記憶デバイス（８０２）から前記構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を見つけることと、
前記コンピューティングデバイス（８００）上で、前記１つ以上の抽象構文木（２１６ｂ）を前記構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）からデシリアル化することと、
前記コンピューティングデバイス（８００）上で、前記トークン化された形式（２１６ａ）を前記構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）からデシリアル化することと、
前記コンピューティングデバイス（８００）上で、前記１つ以上のプリプロセッサシンボルテーブルを、前記構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）からデシリアル化することと、を行うようにさらに構成され、
前記バックエンドコンポーネント（１１２、２１２）は、前記１つ以上の抽象構文木（２１６ｂ）、前記１つ以上のプリプロセッサシンボルテーブル、および前記構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）から前記トークン化された形式（２１６ａ）を使用して、１つ以上のソースファイル（１１４、２１４、３０２、３０６）をオブジェクトコード（１１８ａ、２１８ａ）に変換するようにさらに構成される、請求項２４に記載のシステム。
【請求項２６】
前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）から、１つ以上の識別子の一覧を作成することと、
前記各々の識別子が前記トークン化された形式（２１６ａ）で存在するかに基づいて、前記１つ以上の識別子の一覧の中のそれぞれの識別子を削除することと、を行うように構成される検証器（２２０）をさらに含む、請求項１６〜２５のいずれか一項に記載のシステム。
【請求項２７】
前記シリアライザは、前記１つ以上の識別子の一覧をモジュール形式で記憶デバイス（８０２）にシリアル化するようにさらに構成される、請求項２６に記載のシステム。
【請求項２８】
前記検証器（２２０）は、前記１つ以上の識別子の一覧が１つ以上のプリプロセッサシンボルテーブルと一致することを検証するようにさらに構成される、請求項２６に記載のシステム。
【請求項２９】
前記シリアル化モジュール（２０８）は、
２つ以上の抽象構文木（２１６ｂ）が等しいかを検出することと、
前記２つ以上の抽象構文木（２１６ｂ）が等しいかに基づいて、前記２つ以上の抽象構文木（２１６ｂ）を単一の抽象構文木にマージすることと、を行うようにさらに構成される、請求項１６〜２８のいずれか一項に記載のシステム。
【請求項３０】
上に記憶されるコードを有するコンピュータ可読記憶媒体であって、１つ以上のプロセッサによって実行されるとき、前記１つ以上のプロセッサに、
コンピューティングデバイス（８００）上の１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）を走査（５１０）して、トークン化された形式（２１６ａ）にすることと、
前記コンピューティングデバイス（８００）上の前記トークン化された形式（２１６ａ）を構文解析（５２０）して、１つ以上の抽象構文木（２１６ｂ）にすることと、
前記１つ以上の抽象構文木（２１６ｂ）をモジュール形式で記憶デバイス（８０２）にシリアル化することにより、前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）について、１つ以上の構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を作成（５３０）することと、を含む操作を行わせる、コンピュータ可読記憶媒体。
【請求項３１】
前記操作は、
１つ以上のソースファイル（１１４、２１４、３０２、３０６）内のディレクティブ（１１４ａ、２１４ａ）に基づいて、前記記憶デバイス（８０２）から前記１つ以上の構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を見つけることと、
前記コンピューティングデバイス（８００）上の前記１つ以上の抽象構文木（２１６ｂ）を、前記構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）からデシリアル化することと、
前記コンピューティングデバイス（８００）上の前記１つ以上の抽象構文木（２１６ｂ）を使用して、前記１つ以上のソースファイル（１１４、２１４、３０２、３０６）をコンパイルすることと、をさらに含む、請求項３０に記載のコンピュータ可読記憶媒体。
【請求項３２】
前記１つ以上の構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を見つけることは、
ソースファイル（１１４、２１４、３０２、３０６）内の１つ以上の既存のディレクティブ（１１４ａ、２１４ａ）であって、１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）を指定する、前記ディレクティブ（１１４ａ、２１４ａ）を受け取ることと、
前記ソースファイル（１１４、２１４、３０２、３０６）内の前記１つ以上の既存のディレクティブ（１１４ａ、２１４ａ）に基づいて、前記記憶デバイス（８０２）上で１つ以上の対応するシリアル化された構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を見つけることと、を含む、請求項３１に記載のコンピュータ可読記憶媒体。
【請求項３３】
前記ディレクティブ（１１４ａ、２１４ａ）は、「ｉｎｃｌｕｄｅディレクティブ」を含む、請求項３２に記載のコンピュータ可読記憶媒体。
【請求項３４】
前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）は、独立してコンパイル可能である、請求項３０〜３３のいずれか一項に記載のコンピュータ可読記憶媒体。
【請求項３５】
前記操作は、前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）内でシンボル結合を凍結することをさらに含む、請求項３０〜３４のいずれか一項に記載のコンピュータ可読記憶媒体。
【請求項３６】
前記操作は、
前記コンピューティングデバイス（８００）上で、前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）内の変更を検出することと、
前記コンピューティングデバイス（８００）上で、変更された前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）のそれぞれについて、１つ以上の新しい抽象構文木（２１６ｃ）を生成することと、
前記１つ以上の新しい抽象構文木（２１６ｃ）をモジュール形式で記憶デバイス（８０２）にシリアル化することにより、変更された前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）のそれぞれについて、１つ以上の新しい構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を作成することと、をさらに含む、請求項３０〜３５のいずれか一項に記載のコンピュータ可読記憶媒体。
【請求項３７】
前記操作は、
変更された前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）のそれぞれについて、前記記憶デバイス（８０２）から前記新しい構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を見つけることと、
前記コンピューティングデバイス（８００）上で、変更された前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）のそれぞれについて、前記新しい構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）から、前記新しい抽象構文木（２１６ｃ）をデシリアル化することと、
前記コンピューティングデバイス（８００）上で、変更された前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）のそれぞれからの、前記新しい抽象構文木（２１６ｃ）を使用して、ソースファイル（１１４、２１４、３０２、３０６）をコンパイルすることと、をさらに含む、請求項３０〜３６のいずれか一項に記載のコンピュータ可読記憶媒体。
【請求項３８】
前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）について、前記１つ以上の抽象構文木（２１６ｂ）をモジュール形式で記憶デバイス（８０２）にシリアル化することは、前記１つ以上の抽象構文木（２１６ｂ）のそれぞれについてシリアル化されたファイルを作成することを含む、請求項３０〜３７のいずれか一項に記載のコンピュータ可読記憶媒体。
【請求項３９】
前記操作は、複数個のヘッダをモジュールにグループ化することをさらに含み、前記複数のヘッダが、単一のシリアル化されたファイルの中に含まれる、請求項３０〜３８のいずれか一項に記載のコンピュータ可読記憶媒体。
【請求項４０】
コンピューティングデバイス（８００）上で、前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）を走査してトークン化された形式（２１６ａ）にすることは、１つ以上のシンボルについて前記トークン化された形式（２１６ａ）を走査することと、前記１つ以上のシンボルに基づいて１つ以上のプリプロセッサシンボルテーブルを作成することと、をさらに含み、
前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）について前記１つ以上の構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を作成することは、
前記１つ以上の抽象構文木（２１６ｂ）をモジュール形式で記憶デバイス（
８０２）にシリアル化することと、
前記トークン化された形式（２１６ａ）をモジュール形式で前記記憶デバイ
ス（８０２）にシリアル化することと、
前記１つ以上のプリプロセッサシンボルテーブルをモジュール形式で前記記
憶デバイス（８０２）にシリアル化することと、を含む、請求項３０〜３９のいず
れか一項に記載のコンピュータ可読記憶媒体。
【請求項４１】
前記操作は、１つ以上のソースファイル（１１４、２１４、３０２、３０６）内のディレクティブ（１１４ａ、２１４ａ）に基づいて、前記記憶デバイス（８０２）から前記１つ以上の構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を見つけることと、
前記コンピューティングデバイス（８００）上で、前記構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）から前記１つ以上の抽象構文木（２１６ｂ）をデシリアル化することと、
前記コンピューティングデバイス（８００）上で、前記構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）から前記トークン化された形式（２１６ａ）をデシリアル化することと、
前記コンピューティングデバイス（８００）上で、前記構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）から前記１つ以上のプリプロセッサシンボルテーブルをデシリアル化することと、
前記コンピューティングデバイス（８００）上で、前記１つ以上の抽象構文木（２１６ｂ）、前記１つ以上のプリプロセッサシンボルテーブル、および前記トークン化された形式（２１６ａ）を使用して、前記１つ以上のソースファイル（１１４、２１４、３０２、３０６）をコンパイルすることと、をさらに含む、請求項４０に記載のコンピュータ可読記憶媒体。
【請求項４２】
コンピューティングデバイス（８００）上で、１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）を走査してトークン化された形式（２１６ａ）にすることは、
前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８
）から１つ以上の識別子の一覧を作成することと、
前記各々の識別子が、前記トークン化された形式（２１６ａ）で存在するか
に基づいて、前記１つ以上の識別子の一覧の中のそれぞれの識別子を削除すること
と、をさらに含み、
前記１つ以上のヘッダファイル（１１６、２１６、３０４、４０４、４０８）について、前記１つ以上の構文解析済みのヘッダ（２２２、３０８、４１０、４１２、４１４）を作成することは、前記１つ以上の識別子の一覧をモジュール形式で記憶デバイス（８０２）にシリアル化することをさらに含む、請求項３０〜４１のいずれか一項に記載のコンピュータ可読記憶媒体。
【請求項４３】
前記操作は、前記１つ以上の識別子の一覧が１つ以上のプリプロセッサシンボルテーブルと一致することを検証することをさらに含む、請求項４２に記載のコンピュータ可読記憶媒体。
【請求項４４】
前記操作は、
２つ以上の抽象構文木（２１６ｂ）が等しいか検出することと、
前記２つ以上の抽象構文木（２１６ｂ）が等しいかに基づいて、前記２つ以上の抽象構文木（２１６ｂ）を単一の抽象構文木にマージすることと、をさらに含む、請求項３０〜４３のいずれか一項に記載のコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
実施形態は、コンパイラの分野に関する。
【背景技術】
【０００２】
人間が読み取れるコードまたは命令は、コンパイラと称されるプログラムを用いて実行可能なソフトウエアにしばしば変化する。コンパイラは、コードを取得してそれを翻訳して、コンピューティングデバイスによって理解されることができる機械可読形式に変える。コード自体は、いくつかのコンポーネントに分割され得る。いくつかのプログラム言語では、コードは、ソースファイルと称される１つ以上の定義コンポーネントおよびヘッダファイルと称される１つ以上の宣言コンポーネントに分割され得る。ソースファイルは、その宣言を使用するために、ヘッダファイルを参照し得る。とりわけ、複数個のソースファイルが、その宣言のために、同一のヘッダファイルを参照し得る。コンパイラが遭遇するヘッダファイルへのそれぞれの参照について、コンパイラは概して、たとえ以前処理した可能性があっても、ヘッダファイルの全体を処理する。ヘッダファイルの数と長さによって、コンパイル時間のかなりの部分が、ヘッダファイルの再処理に起因し得る。
【発明の概要】
【０００３】
本開示の一側面は、ヘッダを構文解析済みにするための方法を提供する。本方法は、コンピューティングデバイス上で１つ以上のヘッダファイルを走査してトークン化された形式にすることと、次にコンピューティングデバイス上で、トークン化された形式を構文解析して１つ以上の抽象構文木にすることとを含む。本方法は、次に１つ以上の抽象構文木をモジュール形式で記憶デバイスにシリアル化することにより、１つ以上のヘッダファイルについて１つ以上の構文解析済みのヘッダを作成することを含む。
【０００４】
その本体上に記憶されたコードを有するコンピュータ可読記憶媒体は、データ処理装置によって実行されたとき、データ処理装置に上述のヘッダを構文解析済みにするための方法を実施させる命令を含み得る。
【０００５】
いくつかの例では、本方法は、１つ以上のソースファイル内のディレクティブに基づいて、記憶デバイスから１つ以上の構文解析済みのヘッダを見つけることと、コンピューティングデバイス上で、構文解析済みのヘッダからの１つ以上の抽象構文木をデシリアル化することと、コンピューティングデバイス上で、１つ以上の抽象構文木を使用して１つ以上のソースファイルをコンパイルすることと、をさらに含む。さらに、またはあるいは、１つ以上の構文解析済みのヘッダを見つけることは、ソースファイル内の、１つ以上のヘッダファイルを指定するディレクティブである、１つ以上のディレクティブを受け取ることと、ソースファイル内の１つ以上のディレクティブに基づいて、記憶デバイス上で１つ以上の対応するシリアル化された構文解析済みのヘッダを見つけることとを含み得る。ディレクティブは、ディレクティブを含み得る。いくつかの例では、１つ以上のヘッダファイルは、独立してコンパイル可能である。方法は、１つ以上のヘッダファイル内でシンボル結合を凍結することを含み得る。
【０００６】
いくつかの例では、本方法は、コンピューティングデバイス上で、１つ以上のヘッダファイル内の変更を検出することと、コンピューティングデバイス上で、変更された１つ以上のヘッダファイルのそれぞれについて１つ以上の新しい抽象構文木を生成することとをさらに含む。本方法は、１つ以上の新しい抽象構文木をモジュール形式で記憶デバイスにシリアル化することにより、変更された１つ以上のヘッダファイルのそれぞれについて１つ以上の新しい構文解析済みのヘッダを作成することを含み得る。本方法はまた、変更された１つ以上のヘッダファイルのそれぞれについて、記憶デバイスから新しい構文解析済みのヘッダを見つけることと、コンピューティングデバイス上で、変更された１つ以上のヘッダファイルのそれぞれについて、新しい構文解析済みのヘッダから新しい抽象構文木をデシリアル化することとを含み得る。加えて、本方法は、コンピューティングデバイス上で、変更された１つ以上のヘッダファイルのそれぞれからの新しい抽象構文木を使用して、ソースファイルをコンパイルすることを含み得る。
【０００７】
いくつかの例では、１つ以上のヘッダファイルについて、１つ以上の抽象構文木をモジュール形式で記憶デバイスにシリアル化することは、１つ以上の抽象構文木のそれぞれについてシリアル化されたファイルを作成することを含み得る。本方法は、複数個のヘッダが、単一のシリアル化されたファイルの中に含まれる、複数個のヘッダを１つのモジュールにグループ化することをさらに含みうる。
【０００８】
コンピューティングデバイス上で１つ以上のヘッダファイルを走査してトークン化された形式にすることは、１つ以上のシンボルについてトークン化された形式を走査することと、１つ以上のシンボルに基づいて１つ以上のプリプロセッサシンボルテーブルを作成することとをさらに含みうる。１つ以上のヘッダファイルについて１つ以上の構文解析済みのヘッダを作成することは、１つ以上の抽象構文木をモジュール形式で記憶デバイスにシリアル化することと、トークン化された形式をモジュール形式で記憶デバイスにシリアル化することと、１つ以上のプリプロセッサシンボルテーブルをモジュール形式で記憶デバイスにシリアル化することとを含みうる。さらに、またはあるいは、本方法は、１つ以上のソースファイル内のディレクティブに基づいて、記憶デバイスから１つ以上の構文解析済みのヘッダを見つけることと、コンピューティングデバイス上で、構文解析済みのヘッダから１つ以上の抽象構文木をデシリアル化することと、コンピューティングデバイス上で、構文解析済みのヘッダからトークン化された形式をデシリアル化することと、コンピューティングデバイス上で、構文解析済みのヘッダから１つ以上のプリプロセッサシンボルテーブルをデシリアル化することと、コンピューティングデバイス上で１つ以上の抽象構文木、１つ以上のプリプロセッサシンボルテーブル、およびトークン化された形式を使用して、１つ以上のソースファイルをコンパイルすることとを含みうる。
【０００９】
いくつかの例では、コンピューティングデバイス上で１つ以上のヘッダファイルを走査してトークン化された形式にすることは、１つ以上のヘッダファイルから１つ以上の識別子の一覧を作成することと、各々の識別子が、トークン化された形式で存在するかに基づいて、１つ以上の識別子の一覧の中のそれぞれの識別子を削除することとをさらに含む。１つ以上のヘッダファイルについて、１つ以上の構文解析済みのヘッダを作成することは、１つ以上の識別子の一覧をモジュール形式で記憶デバイスにシリアル化することをさらに含む。さらに、またはあるいは、本方法は、１つ以上の識別子の一覧が１つ以上のプリプロセッサシンボルテーブルと一致することを検証することを含む。
【００１０】
いくつかの例では、本方法は、２つ以上の抽象構文木が等しいか検出することと、２つ以上の抽象構文木が等しいかに基づいて、２つ以上の抽象構文木を単一の抽象構文木にマージすることとをさらに含む。
【００１１】
本開示の別の側面は、スキャナと、構文解析器と、シリアル化モジュールとを有するフロントエンドコンポーネントを含むコンパイルのシステムを提供する。スキャナは、コンピューティングデバイス上で、１つ以上のヘッダファイルを走査してトークン化された形式にするように構成される。構文解析器は、コンピューティングデバイス上で、トークン化された形式を構文解析して１つ以上の抽象構文木にするように構成される。シリアル化モジュールは、１つ以上の抽象構文木をモジュール形式で記憶デバイスにシリアル化することによって、１つ以上のヘッダファイルについて、構文解析済みのヘッダを記憶デバイス上に作成するように構成される。システムは、１つ以上の抽象構文木を使用して、１つ以上のソースファイルをオブジェクトコードに変換するためのバックエンドコンポーネントをさらに含む。いくつかの例では、シリアル化モジュールは、１つ以上のソースファイル内のディレクティブに基づいて、記憶デバイスから構文解析済みのヘッダを見つけ、コンピューティングデバイス上で、１つ以上の抽象構文木を構文解析済みのヘッダからデシリアル化する。バックエンドコンポーネントは、構文解析済みのヘッダからロードされた１つ以上の抽象構文木を使用して、１つ以上のソースファイルをオブジェクトコードに変換するように構成され得る。
【００１２】
いくつかの例では、シリアル化モジュールは、１つ以上のヘッダファイルを指定する、ソースファイル内の１つ以上の既存のディレクティブであるディレクティブを受け取り、ソースファイル内の１つ以上の既存のディレクティブに基づいて、１つ以上の対応するシリアル化された構文解析済みのヘッダを記憶デバイス上で見つけるように構成される。さらに、またはあるいは、ディレクティブはｉｎｃｌｕｄｅディレクティブを含む。
【００１３】
フロントエンドコンポーネントは、１つ以上のヘッダファイルが独立してコンパイル可能であるかを決定するように構成される検証器を備え得る。いくつかの例では、フロントエンドコンポーネントは、１つ以上のヘッダファイル内でシンボル結合を凍結するように構成される検証器をさらに含む。いくつかの例では、フロントエンドコンポーネントは、コンピューティングデバイス上で、１つ以上のヘッダファイル内の変化を検出し、変更された１つ以上のヘッダファイルのそれぞれについて、１つ以上の新しい抽象構文木をコンピューティングデバイス上で生成するように構成される修正検出器を含む。フロントエンドコンポーネントは、１つ以上の新しい抽象構文木をモジュール形式で記憶デバイスにシリアル化することにより、変更された１つ以上のヘッダファイルのそれぞれについて、１つ以上の新しい構文解析済みのヘッダを作成し得る。
【００１４】
いくつかの例では、シリアル化モジュールは、１つ以上の抽象構文木のそれぞれについて、構文解析済みのヘッダを作成する。スキャナは、１つ以上のシンボルについて、トークン化された形式を走査し、１つ以上のシンボルに基づいて、１つ以上のプリプロセッサシンボルテーブルを作成する。シリアル化は、１つ以上の抽象構文木をモジュール形式で記憶デバイスにシリアル化することと、トークン化された形式をモジュール形式で記憶デバイスにシリアル化することと、１つ以上のプリプロセッサシンボルテーブルをモジュール形式で記憶デバイスにシリアル化することと、により、１つ以上のヘッダファイルについて、構文解析済みのヘッダを記憶デバイス上に作成するように構成され得る。さらに、またはあるいは、シリアル化モジュールは、１つ以上のソースファイル内のディレクティブに基づいて、記憶デバイスから構文解析済みのヘッダを見つけることと、コンピューティングデバイス上で、１つ以上の抽象構文木を構文解析済みのヘッダからデシリアル化することと、を行うようにさらに構成され得る。シリアル化モジュールは、コンピューティングデバイス上で、トークン化された形式を構文解析済みのヘッダからさらにデシリアル化し、コンピューティングデバイス上で、１つ以上のプリプロセッサシンボルテーブルを、構文解析済みのヘッダからデシリアル化し得る。バックエンドコンポーネントは、１つ以上の抽象構文木、１つ以上のプリプロセッサシンボルテーブル、および構文解析済みのヘッダからトークン化された形式を使用して、１つ以上のソースファイルをオブジェクトコードに変換するようにさらに構成され得る。
【００１５】
いくつかの例では、本システムは、１つ以上のヘッダファイルから１つ以上の識別子の一覧を作成することと、各々の識別子がトークン化された形式で存在するかに基づいて、１つ以上の識別子の一覧の中のそれぞれの識別子を削除することと、を行うように構成される検証器を含む。シリアライザは、１つ以上の識別子の一覧をモジュール形式で記憶デバイスにシリアル化するように構成され得る。さらに、またはあるいは、検証器は、１つ以上の識別子の一覧が１つ以上のプリプロセッサシンボルテーブルと一致することを検証するように構成され得る。シリアル化モジュールは、２つ以上の抽象構文木が等しいかを検出し、２つ以上の抽象構文木が等しいかに基づいて、２つ以上の抽象構文木を単一の抽象構文木にマージするように構成され得る。
【００１６】
本開示のさらなる実施形態、特性、および利点は、本開示の種々の実施形態の構成および動作とあわせて、添付の図面を参照して以下に詳細に説明される。
【図面の簡単な説明】
【００１７】
本発明の実装は、添付の図面を参照して説明される。図面において、同一の参照番号は、まったく同一のまたは機能的に類似の要素を示す。要素が最初に出現したときの図面は、対応する参照番号において概して左端の桁によって示される。
【図１】一実施形態に従うコンパイルのシステムのダイアグラムである。
【図２】一実施形態に従う構文解析済みのヘッダを使用するコンパイルのシステムのダイアグラムである。
【図３Ａ】同一のヘッダファイルを参照する２つのソースファイルの典型的なコンパイルのシーケンス図である。
【図３Ｂ】一実施形態に従う同一のヘッダファイルを参照する２つのソースファイルを持つ構文解析済みのヘッダを使用する、コンパイルの例のシーケンス図である。
【図４】修正された一連のヘッダファイルの中で構文解析済みのヘッダを使用する、コンパイルの例のシーケンス図である。
【図５】一実施形態に従う構文解析済みのヘッダを作成するための方法のフローチャートである。
【図６】コンパイル中に使用するために、構文解析済みのヘッダをロードするための方法のフローチャートである。
【図７】上述の実施形態、またはその一部分がその中に実装され得る、例示的コンピュータシステムを示す。
【図８】上述の実施形態、またはその一部分がその中に実装され得る、例示的コンピューティングデバイスを示す。
【発明を実施するための形態】
【００１８】
本発明は、本明細書において特定の用途について説明的な実施形態を参照して説明されるが、本発明はそれに限定されないことを理解されたい。本明細書に提供される教示を利用可能な当業者は、その範囲内における追加的な変形、用途、および実施形態、ならびに本発明が著しく有用となるであろう追加的な分野を認識するであろう。
【００１９】
以下の実施形態の詳細な説明において、「一実施形態」、「実施形態」、「実施形態の例」等への言及は、記載の実施形態が特定の特性、構造、または特徴を含み得ることを示すが、しかし、あらゆる実施形態が、その特定の特性、構造、または特徴を必ずしも含まないことがある。その上、かかる言いまわしは、同一の実施形態を必ずしも指さないことがある。さらに、特定の特性、構造、または特徴が、実施形態に関連して説明されるとき、かかる特性、構造、または特徴を、他の実施形態に関連して達成することは、明確に記載されているか否かにかかわらず、当業者の知識の範囲内であると考えられる。
【００２０】
１つのソフトウエアは、数千かそれ以上のソースファイルから成ることがある。しばしば、１つより多いソースファイルが特定のヘッダファイル内の宣言へのアクセスを要求し得る。例えば、ヘッダファイルは、ソフトウエアパッケージの全体にわたって一般に使用される操作を含む関数についての宣言を提供し得る。しかしながら、ヘッダファイルは、定数、プリプロセッサ命令、およびさまざまな他の宣言等の他の宣言を提供することができる。関数宣言はしばしば、その関数が受け取ることのできる入力と、返す出力とを指定する。関数または方法は、１つ以上の入力を取り、入力に対していくつかの数の操作を行い、次に入力に対する操作の結果に基づいて１つ以上の出力を返す、命令のグループ化であり得る。関数を実行する行動は、「関数を呼び出す」と呼ばれ得る。関数を呼び出すために、それぞれのソースファイルは、ヘッダファイルへの参照を提供してもよく、これが関数の宣言を提供する。これは、コンパイラが、この関数が正しく使用されていることを検証することを可能にする。しかしながら、多くのソースファイルが同一の関数を呼び出し得る。これは、コンパイラが、同一のヘッダファイルをすでに読み、処理したかにかかわらず、ヘッダファイルを読み、処理することをもたらす。これは潜在的に仕事の重複を招く。
【００２１】
コンパイラは、複数個のパーツまたはステージを使用してソースおよびソフトウエアのヘッダファイルを処理し得る。これらのパーツは、ソースおよびヘッダファイル上で異なる操作を行う。これらは、ソースおよびヘッダファイルの中に含まれるテキストを、さまざまなデータ構造に変え、これはコンパイルの間に生じる処理を補助することができる。
【００２２】
図１および８は、コンパイルのシステムのダイアグラムおよび例示的コンピューティングデバイスを示す。コンパイラ１００は、フロントエンドコンポーネント１０２およびバックエンドコンポーネント１１２を含む。フロントエンドコンポーネント１０２は、ソースファイル１１４およびヘッダファイル１１６内に含まれるテキストの初期処理に関与し得る。
【００２３】
フロントエンドコンポーネント１０２は、スキャナ１０４、構文解析器１０６、および引き下げコンポーネント１０８をさらに含む。ソースファイル１１４およびヘッダファイル１１６は、テキストファイルとしてハードディスク等の記憶デバイス８０２上に格納され得る。本明細書で使用されるソースファイルという用語は、１つ以上のソースファイルを指す。同様に、本明細書で使用されるヘッダファイルという用語は、１つ以上のヘッダファイルを指す。ソースファイル１１４またはヘッダファイル１１６内に含まれるテキストを最初に処理するために、コンパイラ１００は、まずソースファイル１１４およびヘッダファイル１１６を記憶デバイス８０２から読み、次にそのテキストをコンパイラ１００によって理解されることができるデータ構造に変換し得る。テキストは、コンパイラによってトークン化された形式２１６ａで読み込まれ得る。トークンは、テキストの単語を表すデータ構造である。フロントエンドコンポーネント１０２はまた、ソースファイル１１４およびヘッダファイル１１６内に含まれるテキストを変換して、トークン化された形式２１６ａにすることに関与するスキャナ１０４を含む。例えば、ソースファイル１１４またはヘッダファイル１１６内に存在し得るテキストのそれぞれの単語について、スキャナ１０４は、これらの単語を個別のトークンに変換し得る。トークンは、つなぎ合わされてプログラミングコード構文のセンテンスを形成し得る。
【００２４】
スキャナ１０４は、プリプロセッサシンボルテーブル内でトークンをそれらの定義の代わりにするようにさらに構成され得る。プリプロセッサシンボルテーブルは、プリプロセッサシンボルおよびそれらの対応する定義を含むテーブルであり得る。プリプロセッサシンボルは、ヘッダファイル内でまたはコンパイラ自体によって定義され得る。プリプロセッサシンボルはまた、特定のコンパイラまたはプログラミングに応じて、マクロ、またはさまざまな他の種類のシンボルであり得る。マクロは、ヘッダファイルまたはソースファイル内でマクロシンボルが遭遇するといつでも代用されるテキストを定義するシンボルであり得る。例えば、「ｅｘａｍｐｌｅ」という名のマクロシンボルは、「ｅｘａｍｐｌｅ  ｔｅｘｔ」というテキストに対応するように定義され得る。コンパイラがシンボル「ｅｘａｍｐｌｅ」に遭遇するといつでも、コンパイラはこのシンボルをテキスト「ｅｘａｍｐｌｅ  ｔｅｘｔ」の代わりにし得る。シンボルおよびそれらの定義は次に、プリプロセッサシンボルテーブルと称されるテーブルの中に置かれ得る。これは次に、プリプロセッサシンボルテーブルがすべての有効なプリプロセッサシンボルおよびそれらの対応する定義のテーブルを維持することを可能にし得る。スキャナ１０４がプリプロセッサシンボルテーブル内にあるシンボルに遭遇すると、そのシンボルをテーブル内の対応する定義と置換し得る。上記の例を使用すると、スキャナ１０４が「ｅｘａｍｐｌｅ」のトークンに遭遇するたびに、スキャナ１０４が「ｅｘａｍｐｌｅ」のトークンを新しいトークン「ｅｘａｍｐｌｅ  ｔｅｘｔ」と置換し得る。
【００２５】
しかしながら、スキャナ１０４がソースファイルおよびヘッダファイルをトークンに変換し、プリプロセッサシンボルテーブルを作成するために実行し得る処理には、一定の時間がかかる。ときどき、走査に総コンパイル時間の１５％もかかることがある。例えば、スキャナ１０４が遭遇し得るソースファイル１１４内の特定のヘッダファイルへのそれぞれの参照について、スキャナ１０４は、スキャナ１０４がこの特定のヘッダファイルに以前遭遇していたとしても、それは異なるソースファイル内で参照されたため、このヘッダファイルを走査してトークンを作成し得る。
【００２６】
一実施形態において、スキャナ１０４によって作成されたトークンを後で使用するために格納することにより、この処理はさらに効率的に行われ得る。ヘッダファイル１１６はスキャナ１０４によって処理されてもよく、トークンが作成され得る。これらのトークンは次に、ヘッダファイル１１６からトークンのデータベースかまたはあらかじめトークン化されたヘッダに追加され得る。後続のコンパイルの際、スキャナ１０４があらかじめトークン化されたヘッダデータベース内にあるヘッダファイルに遭遇すると、スキャナ１０４はヘッダファイルを走査するのではなく、データベースからトークンをロードし得る。しかしながら、コンパイルを進行させるために、トークンはさらに処理されることをなお必要とし得る。例えば、これらは抽象構文木２１６ｂへと構文解析される必要があり得る。
【００２７】
フロントエンドコンポーネント１０２はまた、構文解析器１０６を含む。構文解析器１０６は、スキャナ１０４によって提供されるトークンから抽象構文木２１６ｂを作成し得る。ソースファイル１１４およびヘッダファイル１１６のテキストがトークン化された後、テキストはさらなるコンパイルを可能にするために、さらに整理されることを必要とし得る。抽象構文木は、ソースファイルまたはヘッダファイルの構文構造のデータ表現である。とりわけ、トークンはテキストの文字列を伝え得るが、しかし、抽象構文木はそのテキストへの意味を伝え得る。抽象構文木はまた、そこで検査および最適化等の多くの操作が行われることを可能にし得る。
【００２８】
フロントエンドコンポーネント１０２はまた、引き下げコンポーネント１０６を含む。引き下げコンポーネント１０６は、抽象構文木を低レベルの抽象構文木に変換するようにさらに構成され得る。この変換は、最適化等の複数個の操作、またはコンパイラの種類および特定のプログラミング言語に依存し得るさまざまな結合および誤り検査を含み得る。実施形態は抽象構文木を参照して本明細書に説明されるが、当業者であれば低レベルの抽象構文木もまた使用され得ることを認識するであろう。
【００２９】
スキャナ１０４と同様に、構文解析器１０６は、トークン全体を構文解析して抽象構文木を生成するのに一定の時間がかかる。さらにとりわけ、ヘッダファイル１１６の事例では、構文解析器１０６は、このヘッダファイルが構文解析器１０６によって以前に遭遇されていたとしても、ソースファイル内で参照されるヘッダファイル１１６のそれぞれについて抽象構文木２１６ｂを作成しなければならない。この重複した取り組みには、ヘッダファイルの数と、ソースファイル１１４内で参照されるヘッダファイルの長さに応じて、著しい期間の時間がかかり得る。
【００３０】
コンパイラ１００はまた、抽象構文木２１６ｂをオブジェクトファイル１１８に変換することに関与するバックエンドコンポーネント１１２をも含む。オブジェクトファイル１１８は、コンピューティングデバイス８００（図８）によって可読のフォーマットのオブジェクトコードを含み得る。オブジェクトファイルは、リンカープログラムを用いて組み合わされ、実行可能なプログラムを形成し得る。リンカーとは、オブジェクトファイルを一体化して単一の実行可能なプログラムまたはライブラリを作成し得るプログラムである。バックエンドコンポーネント１１２は、抽象構文木２１６ｂを用いて、ヘッダファイル１１６およびソースファイル１１４からオブジェクトコードを生成し得る。
【００３１】
一実施形態によれば、コンパイラ１００はさらに効率的になり得る。図２は、一実施形態に従う構文解析済みのヘッダを使用した、コンパイルのシステムのダイアグラムである。コンパイラ２００は、フロントエンドコンポーネント２０２およびバックエンドコンポーネント２１２を含む。フロントエンドコンポーネント２０２は、スキャナ２０４、構文解析器２０６、および引き下げコンポーネント２２４を含む。スキャナ２０４は、ソースファイル２１４およびヘッダファイル２１６を走査して、トークン化された形式２１６ａを作成するように構成され得る。構文解析器２０６は、トークン化された形式２１６ａを構文解析して、抽象構文木２１６ｂを作成するように構成されてもよく、引き下げコンポーネント２２４は、抽象構文木２１６ｂを低レベルの抽象構文木に変換するように構成され得る。
【００３２】
一実施形態によれば、フロントエンドコンポーネント２０２はまた、シリアル化モジュール２０８を含む。シリアル化モジュール２０８は、コンパイル処理の間に使用するための構文解析済みのヘッダ２２２を作成し得る。本明細書で使用される構文解析済みのヘッダという用語は、１つ以上の構文解析済みのヘッダを指す。構文解析済みのヘッダ２２２は、ヘッダファイル２１６のそれぞれが対応する構文解析済みのヘッダファイルを有するように、モジュールで構成され得る。構文解析済みのヘッダ２２２は次に、スキャナ２０４、構文解析器２０６、および引き下げコンポーネント２２４が、対応するヘッダファイル２１６のそれぞれを再度処理する必要がないように、後続のコンパイル上にロードされ得る。その上、特定のヘッダファイルのいずれかが修正されると、構文解析済みのヘッダのすべてではなく、対応する構文解析済みのヘッダファイル、または修正されたヘッダファイルを含むいずれかのヘッダファイルのみが更新される必要があり得る。いくつかの事例では、複数個のヘッダファイルは、単一の構文解析済みのヘッダにグループ化され得る。例えば、一部のヘッダファイルは、複数個のヘッダファイルがしばしば特定のソースファイル内で一緒に参照されるように、相互に関係のある宣言を提供し得る。かかる事例において、複数のヘッダファイルは、単一の構文解析済みのヘッダにグループ化され得る。別の例では、一部のヘッダファイルのグループは、他のグループよりもより頻繁に修正され得る。かかる事例において、より頻繁に修正されるヘッダが個別の構文解析済みのヘッダファイルを有し得る一方で、修正される頻度がより低いグループは一緒にグループ化される。それにもかかわらず、コンパイラ２００は、単一のヘッダファイルを表す構文解析済みのヘッダと組み合わせ、複数個のヘッダファイルを表す両方の構文解析済みのヘッダを処理し得る。
【００３３】
シリアル化モジュール２０８は、ヘッダファイル２１６の抽象構文木２１６ｂのイメージを作成することにより、構文解析済みのヘッダ２２２を作成し、これらを記憶デバイス８０２にシリアル化し得る。シリアル化は、ＸＭＬ等の周知のフォーマット、またはあらゆる文字列ベースのまたはバイナリフォーマットを使用し得る。例えば、シリアル化モジュール２０８は、構文解析済みのヘッダ２２２のより効率的なロードを可能にするために、コンパイラの抽象構文木の自らの表現に酷似したフォーマットを使用し得る。一旦抽象構文木２１６ｂのイメージが構文解析済みのヘッダ２２２にシリアル化されると、イメージは、シリアル化モジュール２０８によって再読される。シリアル化モジュール２０８は次に、フロントエンドコンポーネント２０２による使用のために、構文解析済みのヘッダ２２２をデシリアル化して抽象構文木２１６ｂとし得る。
【００３４】
シリアル化モジュール２０８は、構文解析済みのヘッダ２２２内にプリプロセッサシンボルテーブルのシリアル化されたイメージをさらに含み得る。シリアル化モジュール２０８はまた、構文解析済みのヘッダ２２２内に、スキャナ２０４によって作成されたトークンのシリアル化されたイメージを含み得る。上述の抽象構文木２１６ｂと同様に、シリアル化は、コンパイラのプリプロセッサテーブル、トークン、または両方の自らの表現に酷似したフォーマットを使用し得る。一旦抽象構文木、プリプロセッサシンボルテーブル、およびトークンのイメージが構文解析済みのヘッダ２２２内にシリアル化されると、イメージはシリアル化モジュール２０８によって再読される。シリアル化モジュール２０８は次に、フロントエンドコンポーネント２０２によって使用されるために、構文解析済みのヘッダ２２２をプリプロセッサシンボルテーブル、トークン、抽象構文木２１６ｂにデシリアル化し得る。
【００３５】
後続のコンパイル時に、フロントエンドコンポーネント２０２は、ソースファイル内のヘッダファイルへの参照時に、対応する構文解析済みのヘッダファイルを見つけるようにさらに構成され得る。ゆえに、ソースファイルは、ヘッダファイルを参照するために、なおその通常のコンストラクトを使用することができ、フロントエンドコンポーネント１０２は、対応する構文解析済みのヘッダを見つけるように構成され得る。これは、既存のコードベースがそのコードを不変のまま維持するが、構文解析済みのヘッダをなお使用することを可能にし得る。例えば、Ｃ＋＋プログラミング言語において、ヘッダファイルを参照するためのコンストラクトは、ｉｎｃｌｕｄｅディレクティブであり得る。所望されるヘッダファイルの種類に応じて、コンストラクトは、例えば、
【００３６】
＃ｉｎｃｌｕｄｅ“ｓａｍｐｌｅ．ｈ”の形式を取りうる。
【００３７】
上記の例において、「ｓａｍｐｌｅ．ｈ」はヘッダファイルであり、対応する構文解析済みのヘッダファイルである「ｓａｍｐｌｅ．ｐｐｈ」を有し得る。フロントエンドコンポーネント２０２がヘッダファイルへの参照に遭遇すると、対応する構文解析済みのヘッダファイルを見つけようと試みる。ゆえに、この例において、フロントエンドコンポーネント２０２が「ｓａｍｐｌｅ．ｈ」へのｉｎｃｌｕｄｅディレクティブに遭遇すると、「ｓａｍｐｌｅ．ｐｐｈ」を見つけることを試み得る。フロントエンドコンポーネント２０２が「ｓａｍｐｌｅ．ｐｐｈ」を見つけることに成功すると、シリアル化モジュール２０８は、「ｓａｍｐｌｅ．ｐｐｈ」をデシリアル化して抽象構文木とし得る。シリアル化モジュール２０８はまた、「ｓａｍｐｌｅ．ｐｐｈ」をデシリアル化してプリプロセッサテーブル、またはトークン、または両方とし得る。対応する構文解析済みのヘッダを見つけることができない場合、フロントエンドコンポーネント２０２は次に、「ｓａｍｐｌｅ．ｈ」等のヘッダファイルを読み、次にスキャナ２０２を使用してヘッダのトークン化へと進み、プリプロセッサシンボルテーブルを作成し、構文解析器２０６を使用して抽象構文木を生成し得る。
【００３８】
フロントエンドコンポーネント２０２は、検証器２２０をさらに含む。検証器２２０は、特定のプロパティについて、構文解析済みのヘッダの作成に先立って抽象構文木またはプリプロセッサシンボルテーブルを確認するように構成され得る。例えば、ソースファイル２１４は、そこでヘッダファイル２１６が特定の宣言を利用するために、コンパイラ２００によって検査される特定のオーダーに依存し得る。これもまた、ヘッダファイルのｉｎｃｌｕｄｅオーダーと呼ばれ得る。
【００３９】
ヘッダファイルは、宣言について他のヘッダファイルを参照し得る。多くのヘッダファイルが、その内部で宣言の使用を要求するときに、他のヘッダファイルを参照し、ゆえに、独立してコンパイル可能であると考えられ得る。しかしながら、いくつかのコンパイラまたはプログラム言語は、他のヘッダファイルを参照することなく、これらの宣言の使用を可能にし得る。代わりに、これらはまずコンパイラによって処理されている宣言を含む他のヘッダファイルに依存し得る。これは、非常にソフトウエア特有であり得る。例えば、開発者は、「ｄｅｃｌａｒａｔｉｏｎｓ．ｈ」において定義される、ある特定の「ａ．ｈ」において宣言を使用し得る。開発者は、ｉｎｃｌｕｄｅオーダーに基づいて、「ｄｅｃｌａｒａｔｉｏｎｓ．ｈ」が「ａ．ｈ」に先立ってコンパイラによって検査されることをさらに知り得る。ゆえに、この特定の事例において、開発者は、「ａ．ｈ」において「ｄｅｃｌａｒａｔｉｏｎｓ．ｈ」を参照する必要がないことがある。しかしながら、別のソフトウエアプログラムにおいて、異なるｉｎｃｌｕｄｅオーダーに基づき、「ｄｅｃｌａｒａｔｉｏｎｓ．ｈ」は、「ａ．ｈ」の後にコンパイラによって検査され得る。その場合、「ａ．ｈ」は、その宣言を使用するために、「ｄｅｃｌａｒａｔｉｏｎｓ．ｈ」を参照しなければならないことがある。
【００４０】
一実施形態によれば、検証器２２０は、ヘッダファイル内で参照された宣言を確認することにより、ヘッダファイルが独立してコンパイル可能であるかを確認するように構成され得る。宣言がヘッダファイル内またはこのヘッダファイルによって参照された一連のヘッダファイル内で定義されると、これは独立してコンパイル可能であると考えられ得る。ヘッダファイルが独立してコンパイル可能であると考えられない場合、シリアル化モジュール２０８は、そのヘッダファイルについて構文解析済みのヘッダを作成しないように構成され得る。
【００４１】
前述のとおり、ある特定の種類の宣言は関数宣言であり得る。関数宣言は、関数の入力および出力を記述する。時折、同一の名を持つ関数について複数個の宣言があり得る。典型的に、同一の名を持つ複数個の関数が宣言されたとき、これらは異なる入力および出力を要求し得る。これは関数多重定義と称される。これらの多重定義された関数のうちの１つを特定の関数呼び出し表現と関連付ける行動は、結合と称される。概して、関数は、これらが同一のヘッダファイル内、または同一のヘッダファイルの中で参照される一連のヘッダファイルの中に存在するとき、同一の名の他の関数と結合され得る。しかしながら、いくつかのコンパイラおよびプログラム言語は、関数が、同一のヘッダファイルの中にも同一のヘッダファイルの中で参照される一連のヘッダファイルの中にもなく、別のヘッダファイルと結合することを可能にし得る。これは、ヘッダファイルがコンパイラによって試験されるオーダーに基づいて生じ得る。上記で述べた宣言と同様に、これはｉｎｃｌｕｄｅオーダーに基づいてコンパイルされる特定のソフトウエアに依存し得る。一実施形態において、構文解析器２０６は、これらがその中で定義されるヘッダファイルの範囲に、またはそのヘッダファイル内の参照される一連のヘッダファイルに結合するように、関数の結合を凍結させ得る。シンボルはまた、類似の手法で関数に結合され得る。一実施形態において、構文解析器２０６はまた、これらがその中で定義されるヘッダファイルの範囲に、またはそのヘッダファイル内の参照される一連のヘッダファイルに結合するように、シンボルの結合を凍結し得る。
【００４２】
ヘッダファイルはまた、それらの内部にプリプロセッサシンボルを含み得る。しばしば、しかしながら、プリプロセッサシンボルの定義を条件が囲み得る。例えば、条件は、シンボル、「Ｘ」、が定義されているか、またはこれが特定の値と等しいかを確認し得る。「Ｘ」が定義されている場合、コンパイラはシンボル「ＴＲＵＥ」を定義する等の真の動作を行い得る。「Ｘ」が定義されていない場合、コンパイラはシンボル「ＦＡＬＳＥ」を定義する等の偽の動作を行い得る。
【００４３】
多くのコンパイラは、条件がこれらを囲んでいるかにかかわらず、ヘッダファイル内のすべてのプリプロセッサシンボルを解決する。前述の例において、偽の動作はシンボル「Ｘ」が定義されていない場合、一部のシンボルを「ＦＡＬＳＥ」と定義し得る。しかし、「Ｘ」が実際には定義されている場合、条件が決して偽の動作に達しないため、「ＦＡＬＳＥ」は関連がないことがある。しかしながら、いくつかのコンパイラは、どのみち「ＦＡＬＳＥ」シンボルをなお処理し得る。一実施形態によれば、検証器２２０は、シンボルが使用されているかを検証するように構成される。シンボルが使用されていない場合、検証器２２０は、構文解析済みのヘッダファイル内に含まれず、処理される必要がないように、このシンボルをその組のプリプロセッサシンボルテーブルから削除し得る。
【００４４】
ヘッダファイル内のトークンまたは識別子の処理は、コンパイルのコンテキストに応じてさまざまであり得る。例えば、ヘッダファイルはそのテキスト内に識別子「Ｘ」を含み得る。１つのコンパイルにおいて、「Ｘ」は実際には「Ｘ」を意味する。しかしながら、別のコンパイルにおいて、「Ｘ」は、プリプロセッサシンボルとして以前に宣言された可能性がある。かかる事例において、同一のヘッダファイルが再び処理されたとき、「Ｘ」は、「Ｙ」またはなんらかの他の宣言を意味するように置換され得る。プリプロセッサシンボルは、ｉｎｃｌｕｄｅオーダーがあるために、またはコンパイラ自体によって宣言され得るとはいえ、プリプロセッサシンボルは、ヘッダファイルが別のヘッダファイルを参照するため宣言され得る。ゆえに、同一のヘッダファイルは、１回より多く処理された後では、その識別子のうちのいくつかが置換されている可能性があるため、別のコンテキスト内では異なる意味を有し得る。
【００４５】
構文解析済みのヘッダは、しかしながら、それが作成されたコンテキストに基づいて、プリプロセッサシンボルテーブルおよびその対応するヘッダファイルの識別子の状態のみを表し得る。その結果、構文解析済みのヘッダは、異なるコンテキストにおいて、その識別子またはプリプロセッサシンボルのうちのいずれかが、別のヘッダまたは構文解析済みのヘッダ内ですでにプリプロセッサシンボルとして宣言されているとき、他のヘッダまたは構文解析済みのヘッダとコンフリクトを有し得る。一実施形態において、検証器２２０は、これらのコンフリクトを検出するようにさらに構成され得る。検証器２２０は、ヘッダファイル２１６のそれぞれについて、これら自体はプリプロセッサシンボルでない識別子の一覧を作成し得る。識別子の一覧は次に、後続のコンパイルの間に使用するために、構文解析済みのヘッダ２２２のそれぞれの中に保存され得る。しかしながら、特定のヘッダファイル内にあるすべての識別子がトークン化された形式２１６ａで生成されたトークンに対応し得るわけではない。これは、識別子上の条件があるからであることがある。例えば、識別子は、特定のシンボルが定義されている場合、またはシンボルが特定の値と等しい場合のみに使用され得る。検証器２２０は、トークン化された形式２１６ａで生成されたトークンに対応しないいずれかの特定の識別子を削除することにより、識別子の一覧を減少させるようにさらに構成され得る。
【００４６】
構文解析済みのヘッダ２２２を使用する後続のコンパイルにおいて、検証器２２０は、構文解析済みのヘッダ２２２のそれぞれから識別子の一覧をロードし、識別子のそれぞれが他のどのプリプロセッサシンボルともコンフリクトしないことを検証するように構成され得る。加えて、検証器２２０はまた、構文解析済みのヘッダ２２２内で宣言されたいかなるプリプロセッサシンボルも、他のどのプリプロセッサシンボルとコンフリクトしないことを確認し得る。コンフリクトを有することが確定したあらゆる構文解析済みのヘッダについて、検証器２２０は、スキャナ２０４、構文解析器２０６、および引き下げコンポーネント２２４に、コンパイルの間に使用するために、構文解析済みのヘッダの対応するテキストベースのヘッダファイルを再処理させ得る。
【００４７】
いくつかの事例では、例えば検証器２２０の結果に基づき、または選択により、構文解析済みのヘッダファイルは、特定のヘッダファイルについて作成されないことがある。この対応する構文解析済みのヘッダのないそのヘッダファイルは、無効となったヘッダファイルと呼ばれ得る。かかる事例において、コンパイラ２００は、コンパイルの間に使用するために、無効となったヘッダファイルの内部のテキストに依存し得る。しかしながら、対応する構文解析済みのヘッダを有する２つ以上のヘッダは、その内部の無効となったヘッダファイルをなお参照し得る。かかる事例において、無効となったヘッダが構文解析済みのヘッダと併せてコンパイラによって２回処理された場合、予期されない結果が生じ得る。とりわけ、同一の抽象構文木の数個の同等の複製が作成され得る。しかしながら、同一の抽象構文木の同等の複製が作成され得る他の事例もあり得る。例えば、無効となったヘッダは、無効となったヘッダが１回より多く処理されることを妨げる適切な制限なしに複数個のソースファイルによって参照され得る。一実施形態において、シリアル化モジュール２０８は、２つ以上の抽象構文木２１６ｂが等しいかを確定するように構成され得る。抽象構文木２１６ｂが等しい場合、シリアル化モジュール２０８は、これらの同等の抽象構文木２１６ｂを単一の抽象構文木にマージするようにさらに構成され得る。単一の抽象構文木は次に、コンパイラ２００によるさらなるコンパイルのために、構文解析済みのヘッダと併せて使用され得る。
【００４８】
フロントエンドコンポーネント２０２は、修正検出器２１０をさらに含む。しかしながら、一実施形態において、修正検出器２１０は、コンパイラ２００の外部処理であり得る。修正検出器２１０は、ヘッダファイル２１６内の変更を検出し得る。特定のヘッダファイル内で変更が検出されると、修正検出器２１０は、変更された特定のヘッダファイルについて構文解析済みのヘッダを使用しないように、フロントエンドコンポーネント２０２に通知し得る。代わりに、フロントエンドコンポーネント２０２は、スキャナ２０４と併せて構文解析器２０６を使用して、変更されたヘッダファイルのテキストから、新しい抽象構文木２１６ｃを生成し得る。ゆえに、修正検出器２１０、シリアル化モジュール２０８、またはスキャナ２０４および構文解析器２０６は、抽象構文木２１６ｂをロードし得る。抽象構文木２１６ｂは次に、オブジェクトコードへと処理され得る。
【００４９】
コンパイラ２００はまた、抽象構文木２１６ｂをオブジェクトファイル２１８に変換することに関与するバックエンドコンポーネント２１２をも含む。本明細書で使用されるオブジェクトファイルという用語は、１つ以上のオブジェクトファイルを指す。オブジェクトファイル２１８は、コンピューティングデバイスによって可読のフォーマットのオブジェクトコードを含み得る。オブジェクトファイルは、リンカープログラムを用いて組み合わされ、実行可能なプログラムを形成し得る。リンカーとは、オブジェクトファイルを一体化して単一の実行可能なプログラムまたはライブラリを作成するプログラムである。
【００５０】
バックエンドコンポーネント２１２は、抽象構文木２１６ｂを用いて、ヘッダファイル２１６およびソースファイル２１４からオブジェクトコードを生成し得る。ヘッダファイル２１６からの抽象構文木２１６ｂは、構文解析済みのヘッダ２２２と、スキャナ２０４と併せて構文解析器２０６によって作成されたヘッダとの組み合わせを通じて、すでにロードされた場合がある。それにもかかわらず、抽象構文木２１６ｂが一旦ロードされると、バックエンドコンポーネント２１２は次にオブジェクトファイル２１８を生成し得る。
【００５１】
図３Ａは、同一のヘッダファイルを参照する２つのソースファイルの典型的なコンパイル３００のシーケンス図である。コンパイル３００は、両方がヘッダファイル３０４を参照するソースファイル３０２とソースファイル３０６を含む。とりわけ、コンパイル３００は、コンパイラの異なるステージによって処理され得るため、ソースファイル３０２、ソースファイル３０６、およびヘッダファイル３０４を表す。オブジェクトファイル３１０のコンパイルの間、走査ステージ３１４は、ソースファイル３０６およびヘッダファイル３０４を走査して、トークン化された形式２１６ａにし得る。走査ステージ３１４はまた、プリプロセッサシンボルテーブルを作成し得る。走査ステージ３１４は、スキャナ、例えば図２のスキャナ２０４によって実装され得る。構文解析ステージ３１６は、ヘッダファイル３０４、ソースファイル３０６を構文解析して、抽象構文木２１６ｂにし得る。構文解析ステージ３１６は、構文解析器、例えば図２の構文解析器２０６で実装され得る。引き下げステージ３１８は、引き下げコンポーネント、例えば図２の引き下げコンポーネント２２４を使用して、高レベルの抽象構文木２１６ｂを低レベルの抽象構文木２１６ｂに変換し得る。バックエンドステージ３２０は次に、抽象構文木２１６ｂと、走査ステージ３１４および引き下げステージ３１８から生じたトークンとからオブジェクトファイル３１０を作成し得る。バックエンドステージは、バックエンドコンポーネント、例えば図２のバックエンドコンポーネント２１２によって実装され得る。同じく、オブジェクトファイル３１２のコンパイルの間、上記に記載したすべてのステージが、ヘッダファイル３０４とソースファイル３０２の両方を処理し得る。ゆえに、ヘッダファイル３０４の処理は、オブジェクトファイル３１０とオブジェクトファイル３１２の両方のコンパイルにおいて生じることがあり、これはより多くの処理資源の使用を招き得る。
【００５２】
本明細書に記載されるように、構文解析済みのヘッダを使用すると、コンパイルはより効率的になり得る。図３Ｂは、一実施形態に従う、同一のヘッダファイルを参照する２つのソースファイルを持つ、構文解析済みのヘッダを使用したコンパイル３５０の例のシーケンス図である。コンパイル３００と同様に、コンパイル３５０は、ソースファイル３０２、ヘッダファイル３０４、ソースファイル３０６、オブジェクトファイル３１０、およびオブジェクトファイル３１２を表す。さらに、コンパイル３５０は、走査ステージ３１４、構文解析ステージ３１６、引き下げステージ３１８、および生成ステージ３２０を含む。コンパイル３００と同様に、ソースファイル３０２およびソースファイル３０６は、それぞれのステージによって処理されなければならない。しかしながら、コンパイル３５０はまた、コンパイルの間に使用するための構文解析済みのヘッダ３０８をも含む。その結果、ヘッダファイル３０４は、走査ステージ３１４、構文解析ステージ３１６、および引き下げステージ３１８によって、１回だけ処理される必要がある。バックエンドステージ３２０は次に、構文解析済みのヘッダ３０８をオブジェクトファイル３１０およびオブジェクトファイル３１２に組み込むために、構文解析済みのヘッダ３０８のコンテンツを２回処理し得る。これは、コンパイル３００と比較して、コンパイル３５０が減少した総コンパイル時間を有するようにし得る。構文解析済みのヘッダ３０８はコンパイル３５０に関連して使用されるが、当業者であれば構文解析済みのヘッダ３０８はヘッダファイル３０４を使用するあらゆるコンパイルにおいて使用され得ることを認識するであろう。
【００５３】
図４は、修正された一連のヘッダファイル内の構文解析済みのヘッダを使用したコンパイル４００の例のシーケンス図である。コンパイル４００は、ソースファイル４０２、ヘッダファイル４０４、修正されたヘッダファイル４０６、およびヘッダファイル４０８を表す。修正されたヘッダファイル４０６は、対応する構文解析済みのヘッダファイル４１２を有し得る。同様に、ヘッダファイル４０４は、対応する構文解析済みのヘッダファイル４１０を有することがあり、ヘッダファイル４０８もまた、対応する構文解析済みのヘッダ４１４を有し得る。ソースファイル４０２は、修正されたヘッダファイル４０６をさらに参照し得るヘッダファイル４０４を参照し得る。修正されたヘッダファイル４０６もまた、ヘッダファイル４０８を参照し得る。ゆえに、ヘッダファイル４０４は、修正されたヘッダファイル４０６およびヘッダファイル４０８に従属し得る。しかしながら、修正されたヘッダファイル４１４は、構文解析済みのヘッダファイル４１２が最後に作成されてから、修正された可能性がある。かかる事例において、構文解析済みのヘッダファイル４１２が修正されたヘッダファイル４０６への最新の変更を反映しない場合があるため、構文解析済みのヘッダファイル４１２は無効となり得る。
【００５４】
コンパイルの間、親ヘッダファイルが子ヘッダファイルを含むとき、親ヘッダファイルは、子ヘッダファイル内に含まれる宣言を組み込む。ゆえに、子の中に任意の修正が生じると、子の中の宣言が変更された可能性があるため、コンパイルの間に親に影響を与え得る。その結果、ヘッダファイル４０４が修正されたヘッダ４０６を参照し得るため、構文解析済みのヘッダ４１０もまた無効となり得る。ゆえに、修正されたヘッダファイル４０６が修正された可能性があるため、構文解析済みのヘッダ４１０と構文解析済みのヘッダ４１２の両方が再作成される必要があり得る。
【００５５】
コンパイル４００は、ヘッダファイルが修正された可能性があるときの処理の数個のステージを表す。走査ステージ４１８は、ソースファイルおよびヘッダファイルを走査してトークンとするように構成され得る。構文解析ステージ４２０は、トークンを構文解析して抽象構文木２１６ｂとするように構成され得る。引き下げステージ４２２は、抽象構文木２１６ｂを低レベルの抽象構文木２１６ｂに変換してもよく、バックエンドステージ４２４は、低レベルの抽象構文木２１６ｂおよびトークンからオブジェクトファイル４１６を作成し得る。構文解析済みのヘッダ４１０および構文解析済みのヘッダ４１２が無効化された可能性があるため、修正されたヘッダファイル４０６およびヘッダファイル４０４は、すべてのステージによって処理される必要があり得る。しかしながら、ヘッダファイル４０８は修正されたヘッダファイル４０６に従属せず、よって再処理される必要がない。したがって、構文解析済みのヘッダファイル４１４は無効となっていない場合があり、オブジェクトファイル４１６を作成するためにバックエンドステージ４２２の間にまだ使用されることができる。その結果、ヘッダファイルが修正された可能性がある場合でも、すべてのヘッダがコンパイル４００によって再処理される必要があるわけではない。
【００５６】
図５は、一実施形態に従う構文解析済みのヘッダを作成するための、方法５００のフローチャートである。方法５００のブロック５１０で、コンピューティングデバイス８００上の１つ以上のヘッダファイルが走査され、トークン化された形式２１６ａとなる。トークン化された形式２１６ａは、１つ以上のヘッダファイルのテキストの中に単語を表す、一連のトークンであり得る。これは、スキャナ、例えば図２のスキャナ２０４によってなされ得る。これらのトークンは次に、コンピューティングデバイス８００上の、例えばランダムアクセスメモリ内に、または、上述の通り、データベース内に格納され得る。トークンはまた、プリプロセッサシンボルテーブルを作成する際に使用され得る。
【００５７】
ブロック５２０で、コンピューティングデバイス８００上のトークン化された形式２１６ａが構文解析され、抽象構文木２１６ｂになり得る。それぞれのヘッダファイルが、対応する抽象構文木を有し得る。これは、構文解析器、例えば図２の構文解析器２０６によってなされ得る。
【００５８】
ブロック５３０で、構文解析済みのヘッダが、ブロック５２０で作成された抽象構文木２１６ｂから作成され得る。構文解析済みのヘッダは、抽象構文木２１６ｂをモジュール形式で記憶デバイス８０２にシリアル化することによって作成され得る。構文解析済みのヘッダはまた、抽象構文木２１６ｂ、プリプロセッサシンボルテーブル、トークン、またはヘッダファイルを処理させないようにするために適切であり得る他のかかる情報の組み合わせをシリアル化することによって作成され得る。記憶デバイス８０２は、例えば、ハードディスクまたはメモリ等のあらゆる種類の永続的または非永続的記憶装置であり得る。シリアル化は、シリアル化モジュール、例えば図２のシリアル化モジュール２０８によって生じ得る。シリアル化は、ＸＭＬファイル、またはあらゆる他の文字列またはバイナリベースのファイルの形式をとり得る。とりわけ、シリアル化は、抽象構文木２１６ｂのコンパイラの内部表現に酷似したデータ表現の形式をとり得る。これは、抽象構文木２１６ｂ、プリプロセッサシンボルテーブル、またはトークンのより高速なロードを可能にし得る。
【００５９】
構文解析済みのヘッダファイルのそれぞれが、個別のヘッダファイルに対応し得る。しかしながら、一実施形態において、構文解析済みのヘッダファイルは、グループ化された複数個のヘッダファイルに対応し得る。しかし、特定のソフトウエアにおいて構文解析済みのヘッダが複数個のヘッダファイルを表したとしても、異なる構文解析済みのヘッダファイルによってそれぞれ表されるさらなるヘッダファイルがなおある場合がある。
【００６０】
方法５００はまた、検証ステージをもさらに含み得る。検証ステージは、構文解析済みのヘッダに対応するヘッダファイルのそれぞれが、独立してコンパイル可能であるかを確認し得る。これはまた、これらがその中で定義されるヘッダか、またはこれらのヘッダ内で参照される一連のヘッダに宣言が結合するように、機能結合、シンボル結合、または両方を凍結し得る。検証ステージはまた、ヘッダファイルのそれぞれについて識別子の一覧を作成し得る。識別子はヘッダファイルのテキスト内に出現し得るが、しかし、それら自体はプリプロセッサシンボルではない。識別子の一覧は、トークンを生成するために使用されない識別子を除外するようにさらにリファインされ得る。識別子の一覧は次に、構文解析済みのヘッダファイル内にシリアル化され得る。これは、シリアル化モジュール、例えば、図２のシリアル化モジュール２０８によって行われ得る。構文解析済みのヘッダが一旦作成されると、これはさらにコンパイラによってコンパイルのために使用されることができる。
【００６１】
図６は、コンパイル中に使用するための、構文解析済みのヘッダをロードするための方法６００のフローチャートである。方法６００のブロック６１０で、１つ以上のソースファイル内のディレクティブに基づいて、１つ以上の構文解析済みのヘッダが見つけられる。この位置は、シリアル化モジュール、例えば、図２のシリアル化モジュール２０８によって発見され得る。ソースファイルは、ｉｎｃｌｕｄｅディレクティブ等のディレクティブを用いてヘッダファイルを参照し得る。ヘッダファイルへの参照に基づいて、構文解析済みのヘッダは、コンピューティングデバイス８００上で見つけられ得る。これは、ソースファイルをなんら修正する必要もなく、ソースファイルが構文解析済みのヘッダを使用することを可能にし得る。とりわけ、ソースファイルが、例えば、ヘッダファイル「ｅｘａｍｐｌｅ．ｈ」を参照すると、構文解析済みのヘッダ「ｅｘａｍｐｌｅ．ｐｐｈ」がその参照に基づいて見つけられ、次にデシリアル化され得る。ゆえに、ソースファイルが「ｅｘａｍｐｌｅ．ｈ」への参照をなお維持してもよく、また代替的に構文解析済みのヘッダを参照し得る。
【００６２】
ブロック６２０で、１つ以上の抽象構文木２１６ｂがデシリアル化されるか、またはコンピューティングデバイス８００上に格納された構文解析済みのヘッダからロードされ得る。１つ以上のトークン、１つ以上のプリプロセッサシンボルテーブル、１つ以上の識別子一覧、またはそれらの任意の組み合わせもまた、コンピューティングデバイス８００上に格納された構文解析済みのヘッダからロードされ得る。方法５００について述べたように、構文解析済みのヘッダは、抽象構文木２１６ｂのシリアル化されたバージョンであり得る。しかしながら、構文解析済みのヘッダはまた、プリプロセッサシンボルテーブル、識別子一覧、およびトークンのシリアル化されたバージョンを含み得る。これは、ＸＭＬ、テキスト、またはバイナリデータ等のフォーマットであり得る。ゆえに、構文解析済みのヘッダは、デシリアル化され、直接抽象構文木２１６ｂ、プリプロセッサシンボルテーブル、識別子一覧、トークン、またはそれらの任意の組み合わせになり得る。抽象構文木２１６ｂ、識別子一覧、プリプロセッサシンボルテーブル、およびトークンは次に、コンピューティングデバイス８００上にロードされ得る。例えば、抽象構文木２１６ｂは、抽象構文木２１６ｂのコンパイラの内部データ表現内にロードされ得る。同様に、プリプロセッサシンボルテーブルおよびトークンはまた、それらの各々のデータ構造のそれぞれの中にロードされ得る。これは、コンパイラが、ロードされた抽象構文木２１６ｂ、プリプロセッサシンボルテーブル、および構文解析済みのヘッダからのトークンを使用してソースファイルをコンパイルすることを可能にし得る。
【００６３】
方法６００は、現在のコンテキスト内の一貫性について、識別子の一覧およびそれぞれの構文解析済みのヘッダのプリプロセッサシンボルテーブルを確認する検証ステージをさらに含み得る。例えば、識別子の一覧内の識別子のそれぞれが、そのコンテキスト内で識別子が置換され得るように、他のいずれかのプリプロセッサシンボルテーブル内の定義されたシンボルであるかを確定するために確認され得る。プリプロセッサシンボルテーブルもまた、現在のコンテキスト内において、シンボルが置換され得るように、他のいずれかのプリプロセッサシンボルテーブル内で定義されているシンボルについて確認され得る。検証ステージは、検証器、例えば、図２の検証器２２０によって行われ得る。特定の構文解析済みのヘッダについてのコンフリクトが存在することが確定すると、コンパイルの間に構文解析済みのヘッダの代わりに対応するテクスチャヘッダファイルが使用され得る。
【００６４】
方法６００において、２つ以上の構文解析済みのヘッダファイルが、対応する構文解析済みのヘッダを有しない共有のヘッダファイルを参照するという状況もまた検出され得る。かかる事例において、共有のヘッダファイルは、２つ以上の抽象構文木２１６ｂが作成され得るように、コンパイルの間に２回処理され得る。かかる事例が生じたことが検出されると、抽象構文木２１６ｂはマージされてコンパイルの間に使用するための単一の抽象構文木を形成し得る。
【００６５】
ブロック６３０で、コンピューティングデバイス８００上の１つ以上の抽象構文木２１６ｂを使用して、１つ以上のソースファイルがコンパイルされる。コンパイルはまた、プリプロセッサシンボルテーブル、トークン、または両方の使用をも含み得る。コンパイルは、ソフトウエアの必要性に基づいて、構文解析済みのヘッダとヘッダファイルとの組み合わせを使用し得る。例えば、特定のヘッダファイルが頻繁に修正されている場合、開発者は構文解析済みのヘッダファイルを使用しないことを決定してもよく、または、構文解析済みのヘッダファイルを見つけることができない場合、コンパイラは、構文解析済みのヘッダファイルの代わりにヘッダファイルを使用してもよい。コンパイルは、例えば、図２のコンパイラ２００によって行われ得る。
【００６６】
図７は、上述の実施形態、またはその一部分が実装され得る、コンピュータシステム７００の例を示す。例えば、その一部分を含むコンパイラ２００は、ハードウエア、ソフトウエア、ファームウエア、本体上に命令を格納した有形のコンピュータ可読媒体、またはその組み合わせを使用したコンピュータシステム７００において実装されてもよく、また１つ以上のコンピュータシステムまたは他の処理システム内に実装され得る。ハードウエア、ソフトウエア、またはそれらのいずれかの組み合わせは、モジュール、手順、および図１〜図６のコンポーネントのいずれをも体現し得る。
【００６７】
当業者は、開示される主題の実施形態は、マルチコアのマルチプロセッサシステム、ミニコンピュータ、メインフレームコンピュータ、分散機能とリンクまたはクラスタ化されたコンピュータ、ならびに実質的にあらゆるデバイスの中に埋め込まれ得る普及型または小型コンピュータを含む種々のコンピュータシステム構成とともに実践されることができることを理解し得る。
【００６８】
例えば、少なくとも１つのプロセッサデバイスおよびメモリを有するコンピューティングデバイス８００が、上述の実施形態を実装するために使用され得る。プロセッサデバイスは、単一のプロセッサ、複数個のプロセッサ、またはその組み合わせでありうる。プロセッサデバイスは、１つ以上のプロセッサ「コア」を有し得る。
【００６９】
本発明の種々の実施形態は、このコンピュータシステム７００の例について説明される。本説明を閲読した後、他のコンピュータシステムおよび／またはコンピュータアーキテクチャを使用して、実施形態をどのように実装するかが当業者には明らかとなろう。操作は連続的な処理として説明され得るが、操作のうちのいくつかは、実際には並行して、一斉に、および／または分散型の環境においては、単一のまたはマルチプロセッサマシンによってアクセスされるために、ローカルでまたはリモートで格納されたプログラムコードとともに行われ得る。加えて、いくつかの実施形態では、操作の順番は、開示される主題の精神を逸脱することなく再設定され得る。
【００７０】
当業者によって認識されるように、プロセッサデバイス７０４はまた、単独で動作するマルチコア／マルチプロセッサシステム内の、またはクラスタでまたはサーバーファーム内で動作するコンピューティングデバイス８００のクラスタ内の単一のプロセッサであり得る。プロセッサデバイス７０４は、通信インフラストラクチャ７０６、例えば、バス、メッセージ待ち行列、ネットワーク、またはマルチコアメッセージ受け渡しスキームに接続される。
【００７１】
コンピュータシステム７００はまた、メインメモリ７０８、例えば、ランダムアクセスメモリ（ＲＡＭ）をも含んでもよく、また二次メモリ７１０を含み得る。二次メモリ７１０は、例えば、ハードディスクドライブ７１２および取り外し可能な記憶ドライブ７１４を含み得る。取り外し可能な記憶ドライブ７１４は、フロッピーディスクドライブ、磁気テープドライブ、光ディスクドライブ、フラッシュメモリ、または同様のものを含み得る。取り外し可能な記憶ドライブ７１４は、周知の手法で取り外し可能な記憶ユニット７１８から読み出し、および／またはこれに書き込む。取り外し可能な記憶ユニット７１８は、取り外し可能な記憶ドライブ７１４によって読み出しおよび書き込みされるフロッピーディスク、磁気テープ、光ディスク等を含み得る。当業者によって認識されるように、取り外し可能な記憶ユニット７１８は、そこにコンピュータソフトウエアおよび／またはデータを格納したコンピュータ可読記憶媒体を含む。
【００７２】
コンピュータシステム７００（任意選択）は、グラフィック、テキスト、および通信インフラストラクチャ７０６からの（または図示されていないフレームバッファからの）他のデータを、表示ユニット７３０上に表示するために送る表示インターフェース７０２（キーボード、マウス等の入力および出力デバイスを含むことができる）を含む。
【００７３】
代替的な実装において、二次メモリ７１０は、コンピュータプログラムまたは他の命令がコンピュータシステム７００上にロードされることを可能にする他の類似の手段を含み得る。かかる手段は、例えば、取り外し可能な記憶ユニット７２２およびインターフェース７２０を含み得る。かかる手段の例は、プログラムカートリッジおよびカートリッジインターフェース（ビデオゲーム機器において見られるもの等）、取り外し可能なメモリチップ（ＥＰＲＯＭ、またはＰＲＯＭ等）および関連するソケット、および他の取り外し可能な記憶ユニット７２２およびソフトウエアおよびデータが取り外し可能な記憶ユニット７２２からコンピュータシステム７００へと転送されることを可能にするインターフェース７２０を含み得る。
【００７４】
コンピュータシステム７００はまた、通信インターフェース７２４を含み得る。通信インターフェース７２４は、ソフトウエアおよびデータが、コンピュータシステム７００と外部デバイスとの間で転送されることを可能にする。通信インターフェース７２４は、モデム、ネットワークインターフェース（イーサネットカード等）、ＣＯＭポート、ＰＣＭＣＩＡスロットおよびカード、または同様のものを含み得る。通信インターフェース７２４を経由して転送されるソフトウエアおよびデータは、信号の形式であってもよく、これは通信インターフェース７２４によって受信されることのできる電子、電磁、光、または他の信号であり得る。これらの信号は、通信パス７２６を経由して通信インターフェース７２４へと提供され得る。通信パス７２６は信号を運び、ワイヤまたはケーブル、光ファイバ、電話回線、携帯電話のリンク、ＲＦリンクまたは他の通信チャネルを使用して実装され得る。
【００７５】
いくつかの実施形態は、あらゆるコンピュータ可読記憶媒体上に格納されるソフトウエアを含むコンピュータ製品向けであり得る。かかるソフトウエアは、１つ以上のデータ処理デバイス内で実行されるとき、データ処理デバイス（複数を含む）を本明細書に記載のとおり動作させる。
【００７６】
一部の実施形態は、ハードウエア、ソフトウエア、ファームウエア、またはその組み合わせにおいて実装され得る。いくつかの実施形態は、複数個のマシン上で並行して走る１組のプログラムを介して実装され得る。
【００７７】
概要および要約は、発明者（複数を含む）によって企図されるように、本発明の１つ以上であるがすべてではない例示的実施形態を説明するものであり、ゆえに、本発明および添付の請求項をなんら制限するように意図されない。
【００７８】
本発明の実施形態は、指定の機能およびその関係の実装を示す機能ビルディングブロックを活用して、上記に記載されている。これらの機能ビルディングブロックの境界は、本願において説明の便宜のために適宜定義されている。指定の機能およびその関係が適切に実施される限りにおいて、代替の境界が定義されることができる。
【００７９】
特定の実施形態の先述の説明は、過度の実験を行うことなく、本発明の全体の概念を逸脱することなく、当該技術の範囲内の知識を適用することにより、かかる特定の実施形態に種々の用途のために当業者が容易に変形および／または適合を行うことができるように、本発明の全体の本質を完全に明らかにするものである。したがって、かかる適合および変形は、本願に記載の教示および指導に基づき、開示される実施形態の同等物の意味および範囲内であることが意図される。本願に記載の表現または専門用語は、本明細書に記載の表現または専門用語が、教示および指導に照らして当業者によって解釈されるように、説明を目的するものであって限定のためではないということが理解されるものとする。
【００８０】
本発明の広さおよび範囲は、上述の例示的実施形態のいずれによっても限定されないものとする。
【図１】
2014528128.tif 000003
【図２】
2014528128.tif 000004
【図３Ａ】
2014528128.tif 000005
【図３Ｂ】
2014528128.tif 000006
【図４】
2014528128.tif 000007
【図５】
2014528128.tif 000008
【図６】
2014528128.tif 000009
【図７】
2014528128.tif 000010
【図８】
2014528128.tif 000011
【国際調査報告】
2014528128.tif 000012
2014528128.tif 000013