(57)【特許請求の範囲】
【請求項１】
汎用要素および専用要素を含む、要素のセットに対応する機械コードを生成するためのコンピュータ実装方法であって、前記専用要素は、複数の汎用要素によって実行される機能の単一の要素の実装であり、前記コンピュータ実装方法は、
関係的に結合された演算子の配列内の部分が決定性であるかどうかを判断することと、
前記部分が決定性である場合に、前記部分を専用要素に、他の場合には、１以上の前記汎用要素にマッピングし、マッピングすることは、複数の状態を含むオートマトンに前記配列を変換することを含み、前記部分は、前記専用要素にマッピングされる場合には、前記専用要素に対応する専用状態を用いて変換し、他の場合には、前記部分は汎用状態に変換することと、
前記オートマトンを機械コードに変換することによって、関係的に結合された演算子の前記配列を機械コードに変換することと
を含むコンピュータ実装方法。
【請求項２】
前記機械コードが、並列マシンのためのイメージを含む、請求項１に記載のコンピュータ実装方法。
【請求項３】
前記配列をオートマトンに変換することが、前記配列内の前記演算子の各々を前記複数の状態のうちの１つまたは複数に変換することを含む、請求項１に記載のコンピュータ実装方法。
【請求項４】
前記部分が決定性でない場合に、前記部分が、専用要素に対応する専用状態を使用するのではなく、汎用状態を使用して変換され、前記汎用状態が前記汎用要素に対応する、請求項１に記載のコンピュータ実装方法。
【請求項５】
前記部分が第１の部分を含み、かつ、前記配列の第２の部分が決定性であると識別されない場合に、前記第２の部分が、専用要素に対応する専用状態を使用するのではなく、汎用状態を使用して変換され、前記汎用状態が前記汎用要素に対応する、請求項１に記載のコンピュータ実装方法。
【請求項６】
要素の前記セットが並列マシンのハードウェア要素のセットを含み、前記汎用要素がプログラム可能要素を含み、かつ、前記専用要素がカウンタを含む、請求項１に記載のコンピュータ実装方法。
【請求項７】
前記プログラム可能要素が状態機械要素を含む、請求項６に記載のコンピュータ実装方法。
【請求項８】
前記状態機械要素がメモリセルを含む、請求項７に記載のコンピュータ実装方法。
【請求項９】
前記メモリセルが揮発性メモリセルを含む、請求項８に記載のコンピュータ実装方法。
【請求項１０】
前記機械コードを公開することをさらに含む、請求項１に記載のコンピュータ実装方法。
【請求項１１】
前記機械コードを公開することが、前記機械コードを並列マシン上にロードすることを含む、請求項１０に記載のコンピュータ実装方法。
【請求項１２】
前記機械コードを公開することが、前記機械コードをコンピュータ可読媒体上に格納することを含む、請求項１０に記載のコンピュータ実装方法。
【請求項１３】
命令を含むコンピュータ可読媒体であって、
前記命令が前記コンピュータによって実行される際に、前記コンピュータに：
対象装置のための専用要素に対応する、関係的に結合された演算子の配列内の部分を識別することであって、前記対象装置が汎用要素も含む、配列内の部分を識別し、前記専用要素は、前記対象装置の複数の汎用要素によって実行することが出来る機能の単一の要素の実装であり、前記対象装置は、また、少なくとも１つの汎用要素を含むことと、
前記部分が決定性であるかどうかを判断することと、
前記配列を、複数の状態を含むオートマトンに変換することであって、前記部分が決定性である場合に、前記部分が、前記専用要素に対応する、他の場合には、汎用状態に対応する専用状態を使用して変換される、前記配列をオートマトンに変換することと、
前記オートマトンを機械コードに変換することと
を含む動作を実行させる、
コンピュータ可読媒体。
【請求項１４】
前記命令が、前記コンピュータに：
ソースコードを前記配列に変換することと、
前記機械コードを公開することと
を含む動作を実行させる、請求項１３に記載のコンピュータ可読媒体。
【請求項１５】
前記配列の部分を識別することが
量化子を識別することを含み、かつ、
前記部分が決定性であるかどうかを判断することが、前記量化子に対する駆動式が、前記量化子が処理されている間に、一致できるかどうかを判断することを含む、
請求項１３に記載のコンピュータ可読媒体。
【請求項１６】
前記配列の部分を識別することが、
量化子を識別することを含み、かつ、
前記部分が決定性であるかどうかを判断することが、前記量化子の繰返し式が、前記量化子の別の繰返し式のプレフィックスであるかどうかを判断することを含む、
請求項１３に記載のコンピュータ可読媒体。
【請求項１７】
前記配列内の部分を識別することが、量化子を識別することを含む、請求項１３に記載のコンピュータ可読媒体。
【請求項１８】
部分が決定性であるかどうかを判断することが、前記量化子に対する駆動式が、前記量化子が処理されている間に一致できるかどうかを判断すること、および、前記量化子の繰返し式が、前記量化子の別の繰返し式のプレフィックスであるかどうかを判断することを含む、請求項１７に記載のコンピュータ可読媒体。
【請求項１９】
前記専用要素が、前記オートマトン内に対応するカウンタ状態を有するカウンタを含み、かつ、前記汎用要素が、前記オートマトン内に対応する状態機械要素状態を有する状態機械要素を含む、請求項１８に記載のコンピュータ可読媒体。
【請求項２０】
前記部分が量化子に対応し、かつ前記部分が決定性である場合、前記部分が、前記量化子の繰返し式およびカウンタ状態を含むループとして実装され、前記カウンタ状態が、前記繰返し式が一致する回数をカウントするように構成されていて、また、前記繰返し式が、前記量化子によって指定された回数一致する場合に、前記カウンタ状態が下流の状態をアクティブにする、請求項１９に記載のコンピュータ可読媒体。
【請求項２１】
前記ループが、前記繰返し式の否定バージョンとの一致によって終了される、請求項２０に記載のコンピュータ可読媒体。
【請求項２２】
前記量化子が、単一のループ数と一致し得る場合に、
前記繰返し式を、前記カウンタ状態のカウント入力をアサートするように構成し、
前記繰返し式の否定バージョンを、前記カウンタ状態をリセットするように構成し、かつ
前記カウント入力が、カウンタ状態がリセットされることなく、前記ループ数に等しい回数アサートされている場合に、出力をアサートするように前記カウンタ状態を構成する、
請求項２０に記載のコンピュータ可読媒体。
【請求項２３】
前記量化子が複数個のループ数と一致し得る場合に、
第１のカウンタ状態のカウント入力および第２のカウンタ状態のカウント入力をアサートするように前記繰返し式を構成し；
前記第１のカウンタ状態のリセット入力および前記第２のカウンタ状態のリセット入力をアサートするように前記繰返し式を構成し；
前記第１のカウンタ状態の前記カウント入力が、前記第１のカウンタ状態がリセットされることなく、前記複数個のループ数の下限閾値に等しい回数アサートされている場合に、出力をアサートするように前記第１のカウンタ状態を構成し；かつ、
前記第２のカウンタ状態の前記カウント入力が、前記第２のカウンタ状態がリセットされることなく、前記複数個のループ数の上限閾値に等しい回数アサートされている場合に、前記第２のカウンタ状態の出力をアサートするように前記第２のカウンタ状態を構成することであって、前記第２のカウンタ状態の前記出力が、前記第１のカウンタ状態の前記リセット入力をアサートするように構成されている、前記第２のカウンタ状態を構成する、
請求項２０に記載のコンピュータ可読媒体。
【請求項２４】
コンピュータであって、
ソフトウェアがその上に格納されたメモリと、
前記メモリに通信的に結合されたプロセッサとを備え、
前記ソフトウェアが、前記プロセッサによって実行される際に、前記プロセッサに、正規表現を、構文木を形成するために、前記正規表現が量化子であるか否か及び量化子であった場合に量化子が決定性であるか否かを判断し、前記構文木をオートマトンに変換することによって対象装置用のコードにコンパイルさせ、
前記対象装置が、第１のタイプの要素および少なくとも他のタイプの要素をサポートし；
コンパイルすることが、前記正規表現が量化子であって且つ量化子が決定性である第１の正規表現を、前記第１のタイプの要素にマッピングすることを含み；かつ
コンパイルすることが、前記正規表現が量化子でない、または、量化子であって且つ量化子が決定性でない第２の正規表現を、前記少なくとも１つの他のタイプの要素にマッピングすることを含む、
コンピュータ。
【請求項２５】
前記対象装置が並列マシンを含み、また、前記第１のタイプの要素が第１のタイプのハードウェア要素であり、かつ、前記少なくとも１つの他のタイプの要素が第２のタイプのハードウェア要素を含む、請求項２４に記載のコンピュータ。
【請求項２６】
前記第２のタイプのハードウェア要素が、入力ストリームを受信し、前記入力ストリームに応じて出力を提供でき、かつ、
前記第１のタイプのハードウェア要素が、前記入力ストリームを受信せず、前記対象装置の他の要素からの入力に応じて出力を提供する、請求項２５に記載のコンピュータ。
【請求項２７】
前記第１のタイプの要素がカウンタであり、かつ、前記第２のタイプの要素が状態機械要素である、請求項２６に記載のコンピュータ。
【請求項２８】
前記量化子が決定性であるかどうかを判断することが、前記量化子が処理されている間に、前記量化子に対する駆動式が一致できるかどうか、および前記量化子の繰返し式が、前記量化子の別の繰返し式のプレフィックスであるかどうかを判断することを含む、請求項２４に記載のコンピュータ。
【請求項２９】
コンパイルすることが、
前記オートマトンをネットリストに変換することと、
前記ネットリストのインスタンスを位置づけることと、
前記ネットリストの前記インスタンス間の接続をルーティングすることと
を含む、請求項２４に記載のコンピュータ。
【請求項３０】
前記正規表現が、非構造化データを検索するための基準を含む、請求項２９に記載のコンピュータ。
【請求項３１】
コンピュータであって、
対象装置の専用要素に対応する、関係的に結合された演算子の配列内の部分を識別することであって、前記対象装置が汎用要素も含む、配列内の部分を識別し、前記専用要素は、前記対象装置の複数の汎用要素によって実行することが出来る機能の単一の要素の実装であり、前記対象装置は、また、少なくとも１つの汎用要素を含むことと；
前記部分が決定性であるかどうかを判断することと；
前記配列を、複数の相互接続状態を含むオートマトンに変換することであって、前記部分のうち第１の部分が決定性である場合に、前記専用要素に対応する、他の場合には、汎用状態に対応する専用状態に前記部分が変換される、前記配列をオートマトンに変換することと；
前記オートマトンを機械コードに変換することと
を行うように構成されたコンピュータ
を備えるシステム。
【請求項３２】
並列マシンをプログラムするための装置であって、前記装置が前記機械コードを前記並列マシン上にロードするように構成されている、装置
を含む、請求項３１に記載のシステム。
【請求項３３】
前記配列の部分を識別することが、
量化子を識別することを含み、
前記部分が決定性であるかどうかを判断することが、前記量化子が処理されている間に、前記量化子に対する駆動式が一致できるかどうか、および前記量化子の繰返し式が、前記量化子の別の繰返し式のプレフィックスであるかどうかを判断することを含む、
請求項３１に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
〔優先権主張〕
本特許出願は、２０１１年１月２５日に出願された、「ＵＴＩＬＩＺＩＮＧ  ＳＰＥＣＩＡＬ  ＰＵＲＰＯＳＥ  ＥＬＥＭＥＮＴＳ  ＴＯ  ＩＭＰＬＥＭＥＮＴ  Ａ  ＦＳＭ」という名称の米国仮特許出願整理番号６１／４３６，０２２に対する優先権の利益を主張し、これによって、参照によりその全体として本明細書に組み込まれる。
【背景技術】
【０００２】
有限状態機械（ＦＳＭ）（有限状態オートマトン、オートマトン、または単に状態機械とも呼ばれる）は、状態、状態間の遷移、および動作の表現である。有限状態機械は、並列マシン用のデジタル論理、コンピュータプログラム、またはイメージを設計するために使用できる。有限状態機械は、有限数の状態、それら状態間の遷移、および出力から成る挙動のモデルである。有限状態機械は、グラフとして表すことができ、グラフのバーテックスがＦＳＭの状態に対応し、グラフのエッジが、有限状態機械に対する１つまたは複数の入力に起因して生じる状態間の遷移に対応する。有限状態機械は、確率的遷移、ファジー状態、または他の奇妙な事柄（ｏｄｄｉｔｙ）も持つことができる。有限状態機械は、入力特徴、および随意の出力特徴を有する有限内部メモリとして機能できる。出力を有する有限状態機械は、有限状態トランスデューサと呼ぶことができる。
【０００３】
有限状態機械の用途には、コンピュータによる電子設計の自動化、通信プロトコル設計、生物学および人工知能研究、ならびに自然言語の文法を説明する言語学を含む。
【図面の簡単な説明】
【０００４】
【図１】本発明の様々な実施形態に従った、決定性有限状態機械の一例を示す。
【図２】本発明の様々な実施形態に従った、非決定性有限状態機械の一例を示す。
【図３】本発明の様々な実施形態に従って、コンパイラがソースコードを機械コードに変換するための方法の一例を示す。
【図４】本発明の様々な実施形態に従って、構文木をオートマトンに変換するための方法を示す。
【図５】本発明の様々な実施形態に従った、並列マシンの一例を示す。
【図６】本発明の様々な実施形態に従って、有限状態機械エンジンとして実装された図５の並列マシンの一例を示す。
【図７】本発明の様々な実施形態に従って、図６の有限状態機械エンジンのブロックの一例を示す。
【図８】本発明の様々な実施形態に従って、図７のブロックの行（ｒｏｗ）の一例を示す。
【図９】本発明の様々な実施形態に従って、図８の行の２つのグループの一例を示す。
【図１０】本発明の様々な実施形態に従って、コンパイラがソースコードを、図５の並列マシンをプログラムするように構成されたイメージに変換するための方法の一例を示す。
【図１１】本発明の様々な実施形態に従った、専用カウンタ状態を有するオートマトンの一例を示す。
【図１２】本発明の様々な実施形態に従った、専用カウンタ状態を有するオートマトンの別の例を示す。
【図１３Ａ】本発明の様々な実施形態に従った、オートマトン例を示す。
【図１３Ｂ】本発明の様々な実施形態に従った、オートマトン例を示す。
【図１４】本発明の様々な実施形態に従った、プレフィックスなし条件を満足しない量化子を有する正規表現のためのオートマトン例を示す。
【図１５】本発明の様々な実施形態に従った、フォンノイマン型アーキテクチャを有するコンピュータの一例を示す。
【発明を実施するための形態】
【０００５】
以下の説明および図は、特定の実施形態を当業者が実施できるように十分に説明する。他の実施形態は、構造的、論理的、電気的、プロセス、および他の変更を包含し得る。いくつかの実施形態の部分および特徴は、他の実施形態に含まれ得るか、または他の実施形態のそれらと置き換えられ得る。請求項に規定される実施形態は、それらの請求項の全ての利用可能な均等物を包含する。
【０００６】
本文書では、特に、ソースコードを、有限状態機械の機械コード実装に変換するコンパイラを説明する。機械コードが、ソースコードによって記述された機能を対象装置上で実装するように構成されているという点において、機械コードは、対象装置に対応できる。一例では、対象装置は並列マシンであり、機械コードは、その並列マシン用のイメージを含む。別の例では、対象装置は、フォンノイマン型アーキテクチャを有するコンピュータを含み、機械コードは、そのコンピュータ内のプロセッサによって実行するための命令を含む。
【０００７】
いかなる場合にも、コンパイラは、ソースコードを、そのソースコードによって記述された機能を実施する有限状態機械を実装する機械コードにコンパイルできる。ソースコードをコンパイルするプロセスにおいて、コンパイラは、ソースコードをオートマトンに変換する。オートマトンを使用すると、コンパイラは、機械コードで実装された、結果として得られる有限状態機械を最適化するために、ソースコード内の冗長性を識別し、結合できる。さらに、コンパイラは、オートマトンの部分を識別し、対象装置に対応する要素にマッピングできる。対象装置が並列マシンである場合、要素は、並列マシンのハードウェア要素を含むことができる。対象装置がフォンノイマン型アーキテクチャを有するコンピュータである場合、要素は、プロセッサによって実行するための命令を含むことができる。マッピング中、有限状態機械の特定の部分が、例えば、結果として得られる機械コードの効率を高めるために、特定の（例えば、専用）要素にマッピングできる。
【０００８】
図１は、有限状態機械（ＦＳＭ）例１００を示す。有限状態機械１００は、容器内の水位を１／４満杯と３／４満杯との間に保つための方法に対応する。状態１０２で、容器内の水位を減少させるために、ポンプが作動される。水位が１／４満杯より下に下がると、ＦＳＭ  １００は、ポンプが動作を停止される、状態１０４に遷移する。一方、状態１０４では、水位が３／４満杯を超えると、ＦＳＭ  １００は、ポンプが再度作動される、状態１０２に遷移して戻る。ＦＳＭ  １００に対する入力は容器内の水位であり、出力はポンプのオン／オフ信号である。
【０００９】
ＦＳＭは、決定性および非決定性の２つのクラスに分類される。決定性ＦＳＭは、一時に、単一経路の実行を有するが、他方、非決定性ＦＳＭは、複数の並列経路の実行を有する。Ｎ個の状態をもつ非決定性ＦＳＭは、通常、最悪の場合で２のＮ乗個の状態をもつ決定性ＦＳＭに変換できる。しかし、非決定性から決定性ＦＳＭへのこの指数関数的な状態拡張は、しばしば、非決定性ＦＳＭを、有限のマシンリソースと時間をもつ最も実用的な実装にする。
【００１０】
ＦＳＭ  １００は、決定性ＦＳＭの一例であり、この決定性ＦＳＭ  １００は、大規模な非決定性ＦＳＭの一部であり得る。例えば、図２は、決定性ＦＳＭ  １００がその部分を構成する、非決定性ＦＳＭ  ２００を示す。ＦＳＭ  ２００は、水位を維持するＦＳＭ  １００に対して管圧力のモニターを追加する。ＦＳＭ  ２００では、ポンプの稼働中、管圧力がモニターされ、管圧力が一定期間、過負荷である場合、ポンプが停止される。ＦＳＭ  ２００では、状態１０２でポンプが作動されている間に管圧力が過負荷である場合、ＦＳＭ  ２００は、タイマーが起動される状態１０６に遷移する。さらに、管が過負荷である場合、状態１０２はそれ自身に遷移して、ポンプをオン状態に維持する。その結果、ＦＳＭ  ２００内のこの位置で、状態１０２、「ポンプオン」状態、および状態１０６、「タイマーオン」状態の両方が同時にアクティブである。状態１０２および状態１０６は同時にアクティブであり得るので、複数経路の実行が存在し、ＦＳＭ  ２００はその結果、非決定性である。ＦＳＭ  ２００は、管内の圧力がもはや過負荷でない場合、状態１０６から、状態１０２に遷移する。また、ＦＳＭ  ２００は、タイマーの満了時にポンプをオフ状態に設定するため、状態１０２および状態１０６の両方から状態１０４に遷移する。
【００１１】
図３は、コンパイラ例に対する流れ図３００を示す。コンパイラは、ソースコードを入力として受け取り、ソースコードによって記述された機能を対象装置上で実装する機械コードを生成する。一例では、対象装置は、図５〜図９に関して後述するように、並列マシンを含む。並列マシンは、複数の状態のうちの１つに設定できる複数のプログラム可能要素を含む。並列マシンに対する機械コードは、１つまたは複数のプログラム可能要素の状態を設定するためのイメージを含む。別の例では、対象装置は、フォンノイマン型アーキテクチャを有するコンピュータである。コンピュータは、１つまたは複数のプロセッサによって実行するためにその上にソフトウェアを有する、１つまたは複数の記憶装置に結合された１つまたは複数のプロセッサを含む。フォンノイマン型アーキテクチャのための機械コードは、１つまたは複数のプロセッサによって実行するための命令を含む。フォンノイマン型アーキテクチャを有するコンピュータの例は、図１５に関して後述される。いかなる場合にも、コンパイラは、オートマトンを中間変換として使用することにより、機械コードを生成する。コンパイラは、オートマトンを、特に、結果として得られるＦＳＭを最適化するため、また、その結果として、機械コードを最適化するために使用する。
【００１２】
一例では、ソースコードは、シンボルグループ内のシンボルのパターンを識別するための検索文字列を記述する。検索文字列を記述するため、ソースコードは、複数の正規表現（ｒｅｇｅｘ）を含むことができる。正規表現は、シンボル検索パターンを記述するための文字列であり得る。正規表現は、プログラミング言語、テキストエディタ、ネットワークセキュリティ、およびその他などの、様々なコンピュータドメインで幅広く使用されている。一例では、コンパイラによってサポートされる正規表現は、非構造化データを検索するための検索基準を含む。非構造化データは、自由形式のデータを含み得、データ内のワード（ｗｏｒｄ）に適用された指標付けがない。ワードは、データ内に、印刷可能および印字不能な、バイトの任意の組合せを含み得る。一例では、コンパイラは、Ｐｅｒｌ（例えば、Ｐｅｒｌ互換正規表現（ＰＣＲＥ））、ＰＨＰ、Ｊａｖａ（登録商標）、および．ＮＥＴ言語を含む、正規表現を実装するための、複数の異なるソースコード言語をサポートできる。
【００１３】
図３を再度参照すると、ブロック３０２で、コンパイラは、ソースコードを解析して、関係的に結合された演算子の配列（ａｒｒａｎｇｅｍｅｎｔ）を形成できる。ソースコードの解析により、ソースコードの一般的表現を作成できる。一例では、一般的表現は、ソースコード内の正規表現の、構文木として知られているツリーグラフの形でコード化された表現を含む。本明細書で説明する例は、その配列を構文木（「抽象構文木」としても知られている）と呼ぶ。しかし、他の例では、具象構文木または他の配列も使用できる。
【００１４】
前述したように、コンパイラは、複数言語のソースコードをサポートできるので、解析は、その言語にかかわらず、ソースコードを、例えば、構文木などの、言語固有でない表現に変換する。従って、コンパイラによるさらなる処理（ブロック３０４、３０６、３０８、３１０）は、ソースコードの言語にかかわらず、共通の入力構造から動作できる。
【００１５】
構文木は、関係的に結合されている複数の演算子を含む。構文木は、複数の異なるタイプの演算子を含むことができ、そこでは、異なるタイプの演算子は、ソースコードによって実装された異なる機能に対応する。すなわち、異なる演算子は、ソースコード内の正規表現によって実装された異なる機能に対応できる。
【００１６】
ブロック３０４で、構文木はオートマトンに変換される。オートマトンは、ＦＳＭのソフトウェアモデルを含み、それに応じて、決定性または非決定性として分類できる。決定性オートマトンは、一時に、単一経路の実行を有するが、他方、非決定性オートマトンは、複数の並列経路の実行を有する。オートマトンは、複数の状態を含む。構文木をオートマトンに変換するために、構文木内の演算子および演算子間の関係は、状態間の遷移をもつ状態に変換される。
【００１７】
一例では、オートマトンは、汎用状態および専用状態を含む。汎用状態および専用状態は、コンパイラがそれに対して機械コードを生成している対象装置によってサポートされる汎用要素および専用要素に対応する。異なるタイプの対象装置は、異なるタイプの汎用要素ならびに１つまたは複数の異なるタイプの専用要素をサポートできる。汎用要素は、通常、幅広い範囲の機能を実装するために使用でき、他方、専用要素は、通常、もっと狭い範囲の機能を実装するために使用できる。しかし、一例では、専用要素は、例えば、その狭い範囲の適用性内でより大きな効果を得ることができる。その結果、専用要素は、例えば、対象装置において特定の機能を実装するために必要なマシンサイクルまたはマシンリソースを削減するために使用できる。いくつかの例では、対象装置は、単に専用要素をサポートし、そこで、複数の異なるタイプの専用要素がサポートされる。
【００１８】
対象装置のタイプは、その対象装置によってサポートされている要素のタイプを主として制御できる。一例では、対象装置は、フォンノイマン型アーキテクチャを有するコンピュータであり、サポートされる要素は、そのコンピュータのプロセッサに対応する命令セットを含む。命令セットは、加算、減算、読取り、および書込みなどの汎用命令、ならびに、複数格納（ｍｕｌｔｉｐｌｅ  ｓｔｏｒｅ）および大きなブロックのメモリの移動などの専用命令を含むことができる。別の例では、対象装置は、図５〜図９に関連して以下で説明するように、並列マシンである。並列マシンによってサポートされる要素は、並列マシンのハードウェア要素を含む。ハードウェアコンポーネントは、状態機械要素などの汎用要素、ならびに、カウンタなどの専用要素を含み得る。いくつかの例では、特に、並列マシンの例では、対象装置は、比較的少数の専用要素に比べて、多数の汎用要素をサポートできる。その結果、いくつかの例では、ほとんどの機能が、汎用要素で実装されるであろうが、他方、選択された少ない機能が専用要素で実装される。
【００１９】
対象装置の要素を効果的に利用するために、コンパイラは、対象装置によってサポートされる専用要素に対応するオートマトン内の専用状態を使用して、構文木の適切な部分を変換する。専用状態を使用して変換されない構文木の部分は、対象装置によってサポートされる汎用要素に対応する汎用状態に変換できる。コンパイラは、構文木を解析して、どの部分が専用状態を使用して変換でき、また、どの部分を汎用状態に変換すべきかを判断できる。いくつかの例では、ほとんどのオートマトンは、１つまたは複数の汎用状態に変換されるが、他方、わずかな割合が、１つまたは複数の専用状態を使用して変換される。
【００２０】
専用状態を使用してオートマトンのいくつかの部分を変換すると、例えば、状態の数を減らすか、かつ／またはオートマトンを単純化することができ、従って、機械コードによって実装されたＦＳＭを単純化することができる。例えば、構文木のある部分は、どの専用状態も使用することなく、汎用状態を使用して変換される場合、多数の状態という結果になり得る。状態数を減らすため、これら同一の部分が、１つまたは複数の専用状態を、おそらくは１つまたは複数の汎用状態と組み合わせて使用して、変換され得る。少数の専用状態が、多数の汎用状態に取って代わることができ得る。汎用状態の数がしばしば、結果として生じる機械コードによって使用される汎用要素の数に対応するので、汎用状態の数を減らすと、使用される汎用要素が少なくなることに起因して、結果として生じる機械コードの複雑性が減少し、効率が向上する。
【００２１】
いかなる場合にも、コンパイラは、構文木内のある部分をあるタイプの状態に変換し、構文木内の他の部分を他のタイプの状態に変換する。状態のタイプが、対象装置によってサポートされる要素のタイプに対応するので、変換は、ソースコードによって実装されるある機能を、並列マシンによってサポートされる特定のタイプの要素にマッピングする効果があり得る。対象装置が、フォンノイマン型アーキテクチャを有するコンピュータである例では、ソースコード内のある機能が、フォンノイマン型コンピュータによってサポートされる命令セットの特定タイプの命令にマッピングできる。対象装置が並列マシンである例では、ソースコードのある機能が、状態機械要素などの汎用要素にマッピングでき、他の機能は、カウンタなどの専用要素にマッピングできる。構文木のオートマトンへの変換に関するさらなる詳細は、図４に関連して以下で説明される。
【００２２】
オートマトンが形成されると、ブロック３０６で、オートマトンは、とりわけ、その複雑性およびサイズを縮小するように最適化される。オートマトンは、特に、同等な状態を結合することにより最適化できる。
【００２３】
ブロック３０８で、オートマトンが、対象装置用の機械コードに変換される。オートマトンの各部分は、ブロック３０４でマッピングされたように、対象装置の要素に対応する機械コードに変換される。一例では、機械コードは、フォンノイマン型アーキテクチャのプロセッサ用の実行可能な命令を含む。ここで、機械コードは、実行可能プログラムを含むことができる。別の例では、機械コードは、並列マシン内のハードウェア要素をプログラムするためのビットを含むことができる。ここで、機械コードは、並列マシン上にロードするためのイメージを含むことができる。
【００２４】
ブロック３１０で、機械コードは、コンパイラによって公開できる。一例では、機械コードは、機械コードをコンピュータ可読媒体に保存することによって公開できる。別の例では、機械コードは、機械コードを並列マシン上にロードするためのプログラミング装置など、別の装置に機械コードを送信することによって公開できる。さらに別の例では、機械コードは、機械コードを並列マシン上にロードすることによって公開できる。さらにまた別の例では、機械コードは、機械コードをディスプレイ装置上に表示することによって公開できる。
【００２５】
一例では、コンパイラは、フォンノイマン型アーキテクチャを有するコンピュータ用の命令によって実装できる。これらの命令は、コンピュータ上のプロセッサにコンパイラの機能を実装させることができる。例えば、命令は、プロセッサによって実行される場合、プロセッサがアクセス可能なソースコード上のブロック３０２、３０４、３０６、３０８、および３１０に記述する動作をプロセッサに実行させることができる。フォンノイマン型アーキテクチャを有するコンピュータ例が図１５に示され、以下で説明される。
【００２６】
図４は、構文木などの配列をオートマトンに変換するための方法４００を示しており、そこでは、構文木のある部分が、専用状態を使用して変換される。オートマトン内の専用状態を利用するために、ブロック４０２で、コンパイラはまず、対象装置によってサポートされる専用要素に対応する構文木の部分を識別する。例えば、並列マシンでは、所望であれば、構文木全体を汎用状態で実装することが通常可能である。これは、汎用状態が、並列マシンによってサポートされる全ての機能を実装する、ある方法で結合できるからである。しかし、前述したように、専用要素は、ある機能のみを実装することを目的としている。それ故、コンパイラは、専用要素によって実装できるか、または効果的に実装できる構文木内の演算子を識別する。これらの演算子および構文木の周囲の部分が、次いで、以下で説明するように、専用状態を使用して、変換できる。
【００２７】
一例では、専用状態に対応する構文木の部分が、構文木内の演算子の機能に基づいて識別される。実際のところ、コンパイラによって識別される演算子の機能は、対象装置の専用要素が実装することを目的としている特定の機能に対応できる。一例では、コンパイラは、対象装置がカウンタを専用要素としてサポートする場合、構文木内の量化子を専用要素に対応するとして識別できる。量化子およびカウンタに関するさらなる詳細については、図５〜図１４に関連して説明される。
【００２８】
ブロック４０４で、部分が、専用要素に対応するとして識別されると、その識別された部分は、専用要素にマッピングされるための特定の条件に一致するかどうかを判断するためにさらに解析され得る。一例では、条件には、識別された部分に対応するオートマトンが決定性であるかどうかを含む。すなわち、条件は、汎用状態のオートマトンに変換される場合、識別された部分がその一部である、より大きなオートマトン（例えば、構文木全体に基づいて形成されたオートマトン）が決定性であるかどうかに関わらず、識別された部分が決定性であるかどうかに対応する。識別された部分に対応するオートマトンが決定性である場合には、ブロック４０６で、識別された部分が、１つまたは複数の専用状態を使用して変換される。オートマトンが決定性でない場合には、ブロック４０８で、識別された部分が、どの専用状態も使用することなく、１つまたは複数の汎用状態を使用して変換される。他の例では、オートマトンは、識別された部分を、識別された部分が決定性である場合は第１のタイプの専用状態を使用して、また、識別された部分が決定性でない場合には別のタイプの専用状態を使用して、変換できる。さらに別の例では、構文木の識別された部分を変換する際にどのタイプの状態を使用するかを判断するために他の条件が使用できる。
【００２９】
一例では、ブロック４０４で、構文木の識別された部分が決定性であるかどうかを判断するために、コンパイラは、その識別された部分が、オートマトンに変換される場合、一時に１つのアクティブ状態だけを有するかどうかを判断できる。これは、例えば、識別された部分との干渉条件があるかどうかを見つけることによって、判断できる。例えば、識別された部分が量化子である場合、コンパイラは、オートマトンを解析して、オートマトンが「再入なし（ｎｏ  ｒｅ−ｅｎｔｒａｎｃｅ）」条件または「プレフィックスなし」条件を満足するかどうかを判断できる。再入なし条件またはプレフィックスなし条件に関する更なる詳細は、図１０〜図１４に関連して以下で説明される。
【００３０】
これらの判断を使用して、構文木内の各演算子が、オートマトンの１つまたは複数の状態に変換できる。いくつかの演算子は、演算子によって実装された特定の機能を識別し、適切な場合には、オートマトン内の１つまたは複数の専用状態を使用して、それらの機能を変換することにより、前述したように変換できる。１つまたは複数の専用状態を使用して変換されない演算子は、デフォルト設定により、１つまたは複数の汎用状態に変換できる。例えば、構文木は、全ての適用可能な演算子を識別し、並列マシン内のカウンタにマッピングするために解析できる。全ての適用可能な演算子が１つまたは複数のカウンタにマッピングされると、残りの演算子は、１つまたは複数の状態機械要素にマッピングできる。他の例では、構文木の全ての部分が、特定の部分に対応する１つまたは複数の特定の要素を識別することによりマッピングされる。
【００３１】
〔実施形態例〕
図５〜図１５に関連した以下の説明は、並列マシン内の専用要素を使用してＦＳＭを実装する実施形態例に関する。一例では、並列マシン内の専用要素はカウンタを含む。カウンタは、ソースコード内の量化子を実装することを目的としている。図５〜図９に関連した説明は、並列マシン例に関し、図１０〜図１４に関連した記述では、並列マシンをプログラムする機械コードを生成するためのコンパイラについて説明する。
【００３２】
図５は、データ解析のための階層構造を実装するために使用できる、並列マシン５００の例を示す。並列マシン５００は、入力データを受信し、その入力データに基づいて出力を提供できる。並列マシン５００は、入力データを受信するためのデータ入力ポート５１０および出力を別の装置に提供するための出力ポート５１４を含むことができる。データ入力ポート５１０は、並列マシン５００に入力されるデータ用のインタフェースを提供する。
【００３３】
並列マシン５００は、汎用要素５０２および専用要素５１２を含む、複数のプログラム可能要素を含む。汎用要素５０２は、１つまたは複数の入力５０４および１つまたは複数の出力５０６を含み得る。汎用要素５０２は、複数の状態のうちの１つにプログラムされ得る。汎用要素５０２の状態は、汎用要素５０２が、所与の入力に基づいて、何の出力を提供するかを決定する。すなわち、汎用要素５０２の状態は、プログラム可能要素が所与の入力に基づいてどのように反応するかを決定する。データ入力ポート５１０に対するデータ入力は、汎用要素５０２にそれに対する処置を取らせるため、複数の汎用要素５０２に提供され得る。汎用要素５０２の例には、以下で詳細に説明する状態機械要素（ＳＭＥ）、および構成可能論理ブロックを含むことができる。一例では、ＳＭＥは、所与の入力がデータ入力ポート５１０で受信される場合に、特定の出力（例えば、高信号つまり「１」信号）を提供するため、所与の状態に設定され得る。所与の入力以外の入力がデータ入力ポート５１０で受信される場合、ＳＭＥは異なる出力（例えば、低信号つまり「０」信号）を提供し得る。一例では、構成可能論理ブロックは、データ入力ポート５１０で受信された入力に基づいて、ブール論理関数（例えば、ＡＮＤ、ＯＲ、ＮＯＲなど）を実行するように設定できる。
【００３４】
並列マシン５００は、プログラム（例えば、イメージ）を並列マシン５００上にロードするためのプログラミングインタフェース５１１も含むことができる。イメージは、汎用要素５０２の状態をプログラム（例えば、設定）できる。すなわち、イメージは、所与の入力に対して特定の方法で反応するように汎用要素５０２を構成できる。例えば、汎用要素５０２は、文字‘ａ’がデータ入力ポート５１０で受信される場合、高信号を出力するように設定できる。いくつかの例では、並列マシン５００は、汎用要素５０２の動作のタイミングを制御するためのクロック信号を使用できる。ある例では、並列マシン５００は、汎用要素５０２とやりとりするため、および専用機能を実行するために、専用要素５１２（例えば、ＲＡＭ、論理ゲート、カウンタ、ルックアップテーブルなど）を含むことができる。いくつかの実施形態では、データ入力ポート５１０で受信されるデータは、長い時間をかけて、もしくは一度にそろって受信されたデータの一定のセット、または長い時間をかけて受信されたデータのストリームを含むことができる。データは、並列マシン５００に結合された、データベース、センサー、ネットワークなどの任意のソースから受信され得るか、または生成され得る。
【００３５】
並列マシン５００は、並列マシン５００の異なる要素（例えば、汎用要素５０２、データ入力ポート５１０、出力ポート５１４、プログラミングインタフェース５１１、および専用要素５１２）を選択的に共に結合するための複数のプログラム可能スイッチ５０８も含む。その結果、並列マシン５００は、要素間で形成されたプログラム可能マトリックス（ｐｒｏｇｒａｍｍａｂｌｅ  ｍａｔｒｉｘ）を含む。一例では、汎用要素５０２の入力５０４、データ入力ポート５１０、プログラミングインタフェース５１１、または専用要素５１２が、１つまたは複数のプログラム可能スイッチ５０８を通して、汎用要素５０２の出力５０６、出力ポート５１４、プログラミングインタフェース５１１、または専用要素５１２に結合できるように、プログラム可能スイッチ５０８が、２つ以上の要素を選択的に互いに結合できる。従って、要素間の信号のルーティングが、プログラム可能スイッチ５０８を設定することによって制御できる。図５は、所与の要素とプログラム可能スイッチ５０８との間の特定数の導体（例えば、ワイヤー）を示しているが、他の例では、異なる数の導体が使用できることが理解されるはずである。また、図５は、個別にプログラム可能スイッチ５０８に結合された各汎用要素５０２を示しているが、他の例では、複数の汎用要素５０２がグループ（例えば、図８に示すような、ブロック８０２）としてプログラム可能スイッチ５０８に結合できる。一例では、データ入力ポート５１０、データ出力ポート５１４、および／またはプログラミングインタフェース５１１はレジスタとして実装でき、レジスタへの書込みが、それぞれの要素へデータを提供するか、またはそれぞれの要素からデータを提供するようにする。
【００３６】
一例では、単一の並列マシン５００が物理デバイス上に実装されるが、他の例では、２つ以上の並列マシン５００が単一の物理デバイス（例えば、物理チップ）上に実装できる。一例では、複数の並列マシン５００の各々が、別個のデータ入力ポート５１０、別個の出力ポート５１４、別個のプログラミングインタフェース５１１、および汎用要素５０２の別個のセットを含むことができる。さらに、汎用要素５０２の各セットは、それらの対応する入力データポート５１０でデータに反応（例えば、高信号または低信号を出力）できる。例えば、第１の並列マシン５００に対応する汎用要素５０２の第１のセットは、第１の並列マシン５００に対応する第１のデータ入力ポート５１０でデータに反応できる。第２の並列マシン５００に対応する汎用要素５０２の第２のセットは、第２の並列マシン５００に対応する第２のデータ入力ポート５１０に反応できる。その結果、各並列マシン５００は、１セットの汎用要素５０２を含み、異なるセットの汎用要素５０２は、異なる入力データに反応できる。同様に、各並列マシン５００、および汎用要素５０２の各対応するセットは、別個の出力を提供できる。いくつかの例では、第２の並列マシン５００に対する入力データが、第１の並列マシン５００からの出力データを含むことができるように、第１の並列マシン５００からの出力ポート５１４が、第２の並列マシン５００の入力ポート５１０に結合できる。
【００３７】
一例では、並列マシン１００上にロードするためのイメージは、プログラム可能要素１０２の状態を設定するため、プログラム可能スイッチ１０８をプログラミングするため、および並列マシン１００内で専用要素１１２を構成するための複数のビットの情報を含む。一例では、ある入力に基づいて所望の出力を提供するように並列マシン１００をプログラムするために、イメージが並列マシン１００上にロードできる。出力ポート１１４は、データ入力ポート１１０でのプログラム可能要素１０２のデータに対する反応に基づいて、並列マシン１００からの出力を提供できる。出力ポート１１４からの出力は、所与のパターンの一致を示す単一ビット、複数のパターンに対する一致および不一致を示す複数のビットを含むワード（ｗｏｒｄ）、複数のアクティブ状態および非アクティブ状態を示す複数のビットを含むワード、ならびに所与の時に全てまたは特定の汎用要素１０２の状態に対応する状態ベクトルを含むことができる。
【００３８】
並列マシン５００に関する使用例には、パターン認識（例えば、音声認識、画像認識など）、信号処理、画像処理、コンピュータビジョン、暗号化、およびその他を含む。ある例では、並列マシン５００は、有限状態機械（ＦＳＭ）エンジン、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、およびそれらの変形を含むことができる。さらに、並列マシン５００は、コンピュータ、ポケットベル、携帯電話、電子手帳、携帯音楽プレーヤ、ネットワーク装置（例えば、ルータ、ファイアウォール、スイッチ、またはそれらの任意の組合せ）、制御回路、カメラなどの、大きな装置内のコンポーネントであり得る。
【００３９】
図６〜図９は、本明細書で「ＦＳＭエンジン６００」と呼ぶ並列マシンの一例を示す。一例では、ＦＳＭエンジン６００は、有限状態機械のハードウェア実装を含む。その結果、ＦＳＭエンジン６００は、ＦＳＭ内の複数の状態に対応する、複数の選択的に結合可能なハードウェア要素（例えば、プログラム可能要素）を実装する。ＦＳＭ内の状態と同様に、ハードウェア要素は、入力ストリームを解析し、その入力ストリームに基づいて下流のハードウェア要素をアクティブにできる。
【００４０】
ＦＳＭエンジン６００は、汎用要素および専用要素を含む、複数のプログラム可能要素を含む。汎用要素は、多数の異なる機能を実装するようにプログラムされ得る。これらの汎用要素は、行（ｒｏｗ）６０６（図７および図８に示す）およびブロック６０２（図６および図７に示す）に階層的に編成されているＳＭＥ ６０４、６０５（図９に示す）を含む。階層的に編成されたＳＭＥ ６０４、６０５間で信号をルーティングするために、ブロック間スイッチ６０３（図６および図７に示す）、ブロック内スイッチ６０８（図７および図８に示す）、ならびに行内（ｉｎｔｒａ−ｒｏｗ）スイッチ６１２（図８に示す）を含む、プログラム可能スイッチの階層が使用される。ＳＭＥ ６０４、６０５は、ＦＳＭエンジン６００によって実装されたＦＳＭの状態に対応できる。ＳＭＥ ６０４、６０５は、以下で説明するように、プログラム可能スイッチの使用によって共に結合できる。その結果、ＦＳＭは、状態の機能に対応するようにＳＭＥ ６０４、６０５をプログラミングすることにより、また、ＦＳＭ内の状態間の遷移に対応するため、ＳＭＥ ６０４、６０５を選択的に共に結合することにより、ＦＳＭエンジン６００上に実装できる。
【００４１】
図６は、ＦＳＭエンジン例６００の全体図を示す。ＦＳＭエンジン６００は、プログラム可能ブロック間スイッチ６０３と選択的に共に結合できる複数のブロック６０２を含む。さらに、ブロック６０２は、信号（例えば、データ）を受信するため、およびデータをブロック６０２に提供するために、入力ブロック６０９（例えば、データ入力ポート）に選択的に結合できる。ブロック６０２は、ブロック６０２から外部デバイス（例えば、別のＦＳＭエンジン６００）に信号を提供するために、出力ブロック６１３（例えば、出力ポート）にも選択的に結合できる。ＦＳＭエンジン６００は、プログラム（例えば、イメージ）をＦＳＭエンジン６００上にロードするために、プログラミングインタフェース６１１も含み得る。イメージは、ＳＭＥ ６０４、６０５の状態をプログラム（設定）できる。すなわち、イメージは、入力ブロック６０９で所与の入力に対して特定の方法で反応するように、ＳＭＥ ６０４、６０５を構成できる。例えば、ＳＭＥ ６０４は、入力ブロック６０９で文字‘ａ’が受信される場合、高信号を出力するように設定できる。
【００４２】
一例では、入力ブロック６０９、出力ブロック６１３、および／またはプログラミングインタフェース６１１はレジスタとして実装でき、そのレジスタへの書込みがそれぞれの要素に対して、またはそれぞれの要素から、データを提供できるようにする。その結果、プログラミングインタフェース６１１に対応するレジスタ内に格納されているイメージからのビットが、ＳＭＥ ６０４、６０５上にロードできる。図６は、ブロック６０２、入力ブロック６０９、出力ブロック６１３、およびブロック間スイッチ６０３の間に特定数の導体（例えば、ワイヤ、線）を示しているが、他の例では、もっと少ないかまたは多い導体が使用できることが理解されるはずである。
【００４３】
図７は、ブロック６０２の一例を示す。ブロック６０２は、プログラム可能ブロック内スイッチ６０８と選択的に共に結合できる複数の行６０６を含むことができる。その結果、行６０６は、ブロック間スイッチ６０３で、別のブロック６０２内の別の行６０６と選択的に結合できる。一例では、バッファ６０１は、ブロック間スイッチ６０３への／ブロック間スイッチ６０３からの信号のタイミングを制御するために含まれる。行６０６は、本明細書で２つのグループ（ＧＯＴ：ｇｒｏｕｐ  ｏｆ  ｔｗｏ）６１０として参照される要素のペアに編成された複数のＳＭＥ ６０４、６０５を含む。一例では、ブロック６０２は、１６個の行６０６を含む。
【００４４】
図８は、行６０６の一例を示す。ＧＯＴ ６１０は、プログラム可能行内スイッチ６１２によって、行６０６内の他のＧＯＴ ６１０および任意の他の要素６２４と選択的に結合できる。また、ＧＯＴ ６１０は、ブロック内スイッチ６０８で他の行６０６内の他のＧＯＴ ６１０と、またはブロック間スイッチ６０３で他のブロック６０２内の他のＧＯＴ ６１０とも結合できる。一例では、ＧＯＴ ６１０は、第１および第２の入力６１４、６１６ならびに出力６１８を有する。第１の入力６１４は、ＧＯＴ ６１０の第１のＳＭＥ ６０４と結合され、第２の入力６１４は、ＧＯＴ ６１０の第２のＳＭＥ ６０４と結合される。
【００４５】
一例では、行６０６は、第１および第２の複数の行相互接続導体６２０、６２２を含む。一例では、ＧＯＴ ６１０の入力６１４、６１６は、１つまたは複数の行相互接続導体６２０、６２２に結合でき、出力６１８は、１つの行相互接続導体６２０、６２２に結合できる。一例では、第１の複数の行相互接続導体６２０は、行６０６内の各ＧＯＴ ６１０の各ＳＭＥ ６０４に結合できる。第２の複数の行相互接続導体６２２は、行６０６内の各ＧＯＴ ６１０の１つのＳＭＥ ６０４に結合できるが、そのＧＯＴ ６１０の他のＳＭＥ ６０４には結合できない。一例では、第２の複数の行相互接続導体６２２の半分の第１の方が、行６０６内のＳＭＥ ６０４の半分の第１の方（各ＧＯＴ ６１０からの１つのＳＭＥ ６０４）と結合でき、第２の複数の行相互接続導体６２２の半分の第２の方が、行６０６内のＳＭＥ ６０４の半分の第２の方（各ＧＯＴ ６１０からのその他のＳＭＥ ６０４）と結合できる。第２の複数の行相互接続導体６２２とＳＭＥ ６０４、６０５との間の制限された接続性は、本明細書では「パリティ」と呼ばれる。
【００４６】
一例では、行６０６は、カウンタ、プログラム可能ブール論理要素、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、特定用途向け集積回路（ＡＳＩＣ）、プログラム可能プロセッサ（例えば、マイクロプロセッサ）、および他の要素などの、専用要素６２４も含むことができる。追加として、一例では、専用要素６２４は、異なる行６０６内では異なる。例えば、ブロック６０２内の４つの行６０６が、専用要素６２４としてブール論理を含むことができ、ブロック６０２内の他の８つの行６０６が、専用要素６２４としてカウンタを含むことができる。
【００４７】
一例では、専用要素６２４は、カウンタ（本明細書ではカウンタ６２４とも呼ばれる）を含む。一例では、カウンタ６２４は、１２ビットのプログラマブル減算カウンタを含む。１２ビットのプログラマブルカウンタ２２４は、カウント入力、リセット入力、およびゼロカウント出力を有する。カウント入力は、アサート時に、カウンタ６２４の値を１だけ減算する。リセット入力は、アサート時に、カウンタ６２４に、関連したレジスタから初期値をロードさせる。１２ビットのカウンタ６２４に対して、最大で１２ビット数が初期値としてロードできる。カウンタ６２４の値がゼロ（０）に減算されると、ゼロカウント出力がアサートされる。カウンタ６２４は、少なくとも２つのモード、パルスおよび保留（ｈｏｌｄ）を有する。カウンタ６２４がパルスモードに設定されている場合、カウンタ６２４がゼロに減算されると、第１のクロック周期中にゼロカウント出力がアサートされ、また、次のクロック周期では、たとえカウント入力がアサートされても、ゼロカウント出力はもはやアサートされない。この状態は、カウンタ６２４が、アサートされているリセット入力によってリセットされるまで、継続する。カウンタ６２４が保留モードに設定されている場合、カウンタ６２４がゼロに減算されると、第１のクロック周期中にゼロカウント出力がアサートされ、また、カウント入力がアサートされる場合、カウンタ６２４が、アサートされているリセット入力によってリセットされるまで、アサートされたままである。
【００４８】
図９は、ＧＯＴ ６１０の一例を示す。ＧＯＴ ６１０は、入力６１４、６１６を有し、かつそれらの出力６２６、６２８がＯＲゲート６３０に結合されている、第１および第２のＳＭＥ  ６０４、６０５を含む。出力６２６、６２８は、ＧＯＴ ６１０の共通の出力６１８を形成するため、ＯＲゲート６３０で一緒に論理ＯＲされている。一例では、第１および第２のＳＭＥ ６０４、６０５はパリティを示し、そこで、第１のＳＭＥ ６０４の入力６１４は、行相互接続導体６２２のいくつかに結合でき、第２のＳＭＥ ６０５の入力６１６は、他の行相互接続導体６２２に結合できる。一例では、ＧＯＴ ６１０内の２つのＳＭＥ ６０４、６０５は、第１のＳＭＥ ６０４の出力６２６を第２のＳＭＥ  ６０５の入力６１６に結合するために、スイッチ６４０を設定することにより、カスケード接続できる。
【００４９】
一例では、状態機械要素６０４、６０５は、検出線６３４と平行に結合された、ダイナミックランダムアクセスメモリ（ＤＲＡＭ）でしばしば使用されるような、複数のメモリセル６３２を含む。１つのかかるメモリセル６３２は、高値または低値（例えば、１または０）のいずれかに対応するものなどの、データ状態に設定できるメモリセルを含む。メモリセル６３２の出力は、検出線６３４に結合され、メモリセル６３２への入力は、データストリーム線６３６上のデータに基づいて、信号を受信する。一例では、データストリーム線６３６上の入力が、メモリセル６３２の１つを選択するために復号される。選択されたメモリセル６３２は、その格納されたデータ状態を出力として検出線６３４上に提供する。例えば、データ入力ポート６０９で受信されたデータがデコーダ（図示せず）に提供でき、デコーダは、データストリーム線６３６のうちの１本を選択できる。一例では、デコーダは、ＡＳＣＩＩ文字を２５６ビットのうちの１つに変換できる。
【００５０】
メモリセル６３２は、それ故、メモリセル６３２が高値に設定され、かつ、データストリーム線６３６上のデータがメモリセル６３２に対応する場合、高信号を検出線６３４に出力する。データストリーム線６３６上のデータがメモリセル６３２に対応し、メモリセル６３２が低値に設定されている場合、メモリセル６３２は、低信号を検出線６３４に出力する。メモリセル６３２からの検出線６３４上への出力は、検出回路６３８によって検知される。一例では、入力線６１４、６１６上の信号は、それぞれの検出回路６３８をアクティブ状態または非アクティブ状態のいずれかに設定する。非アクティブ状態に設定されると、検出回路６３８は、それぞれの検出線６３４上の信号にかかわらず、低信号をそれぞれの出力６２６、６２８上に出力する。アクティブ状態に設定されると、高信号がそれぞれのＳＭＥ ６０４、６０５のメモリセル６３２の１つから検出される場合、検出回路６３８は、高信号をそれぞれの出力線６２６、６２８上に出力する。アクティブ状態にある場合、それぞれのＳＭＥ ６０４、６０５のメモリセル６３２の全てからの信号が低ければ、検出回路６３８は、低信号をそれぞれの出力線６２６、６２８上に出力する。
【００５１】
一例では、ＳＭＥ ６０４、６０５は、２５６のメモリセル６３２を含み、各メモリセル６３２は、異なるデータストリーム線６３６に結合される。それ故、ＳＭＥ ６０４、６０５は、選択された１つまたは複数のデータストリーム線６３６がその上に高信号を有する場合、高信号を出力するようにプログラムされ得る。例えば、ＳＭＥ ６０４は、第１のメモリセル６３２（例えば、ビット０）を高に設定し、他の全てのメモリセル６３２（例えば、ビット１〜２５５）を低に設定できる。それぞれの検出回路６３８がアクティブ状態にあるとき、ＳＭＥ ６０４は、ビット０に対応するデータストリーム線６３６がその上に高信号を有する場合、高信号を出力６２６上に出力する。他の例では、複数のデータストリーム線６３６のうちの１本が、適切なメモリセル６３２を高値に設定することにより、その上に高信号を有する場合、ＳＭＥ ６０４は、高信号を出力するように設定できる。
【００５２】
一例では、メモリセル６３２は、関連したレジスタからビットを読み取ることにより、高値または低値に設定できる。その結果、ＳＭＥ ６０４は、コンパイラによって作成されたイメージをレジスタ内に格納し、レジスタ内のビットを関連したメモリセル６３２にロードすることにより、プログラムされ得る。一例では、コンパイラによって作成されたイメージは、高および低（例えば、１および０）ビットのバイナリイメージを含む。イメージは、ＳＭＥ ６０４、６０５をカスケード接続することにより、ＦＳＭエンジン６００をＦＳＭとして動作するようにプログラムできる。例えば、第１のＳＭＥ ６０４は、検出回路６３８をアクティブ状態に設定することにより、アクティブ状態に設定できる。第１のＳＭＥ ６０４は、ビット０に対応するデータストリーム線６３６がその上に高信号を有する場合、高信号を出力するように設定できる。第２のＳＭＥ ６０５は、最初は非アクティブ状態に設定できるが、アクティブなとき、ビット１に対応するデータストリーム線６３６がその上に高信号を有する場合、高信号を出力するように設定できる。第１のＳＭＥ ６０４および第２のＳＭＥ ６０５は、第１のＳＭＥ ６０４の出力６２６を第２のＳＭＥ ６０５の入力６１６に結合するように設定することにより、カスケード接続できる。従って、高信号が、ビット０に対応するデータストリーム線６３６上で検知される場合、第１のＳＭＥ ６０４は、高信号を出力６２６上に出力し、第２のＳＭＥ ６０５の検出回路６３８をアクティブ状態に設定する。高信号が、ビット１に対応するデータストリーム線６３６上で検知される場合、第２のＳＭＥ ６０５は、別のＳＭＥ ６０５をアクティブにするため、またはＦＳＭエンジン６００からの出力のため、高信号を出力６２８上に出力する。
【００５３】
図１０は、コンパイラがソースコードを、並列マシンをプログラムするように構成されたイメージに変換するための方法１０００の一例を示す。方法１０００は、ソースコードを構文木に解析すること（ブロック１００２）、構文木をオートマトンに変換すること（ブロック１００４）、オートマトンを最適化すること（ブロック１００６）、オートマトンをネットリストに変換すること（ブロック１００８）、ネットリストをハードウェア上に配置すること（ブロック１０１０）、ネットリストをルーティングすること（ブロック１０１２）、および結果として生じるイメージを公開すること（ブロック１０１４）を含む。
【００５４】
一例では、コンパイラは、ソフトウェア開発者がＦＳＭエンジン６００上でＦＳＭを実装するために、イメージを作成できるようにする、アプリケーションプログラミングインタフェース（ＡＰＩ）を含む。コンパイラは、ソースコード内の正規表現の入力セットを、ＦＳＭエンジン６００をプログラムするように構成されているイメージに変換するための方法を提供する。コンパイラは、フォンノイマン型アーキテクチャを有するコンピュータ用の命令によって実装できる。これらの命令は、コンピュータ上のプロセッサにコンパイラの機能を実装させることができる。例えば、命令は、プロセッサによって実行される場合、プロセッサがアクセス可能なソースコード上のブロック１００２、１００４、１００６、１００８、１０１０、１０１２、および１０１４に記述する動作をプロセッサに実行させることができる。フォンノイマン型アーキテクチャを有するコンピュータ例が図１５に示され、以下で説明される。
【００５５】
ブロック１００２で、構文木を形成するために正規表現が解析される。解析することで、図３に関して上述したように、ソースコードの一般的表現が作成される。さらに、解析することで、ＦＳＭエンジン６００によってサポートされている正規表現、およびサポートされていない正規表現を考慮に入れることができる。サポートされている正規表現は、適切な機械コード実装に変換できるが、サポートされていない正規表現は、例えば、エラーを生じ得るか、または、機能において、サポートされていない正規表現に近い、サポートされた機械コードに変換され得る。
【００５６】
ブロック１００４で、構文木が、オートマトンに変換される。図３に関連して前述したように、構文木の変換は、構文木を、複数の状態を含むオートマトンに変換する。一例では、オートマトンは、ＦＳＭエンジン６００のハードウェアに一部基づいて、変換され得る。
【００５７】
一例では、オートマトンに対する入力シンボルは、アルファベット、０〜９の数字、および他の印刷可能な文字のシンボルを含む。一例では、入力シンボルは、バイト値０〜２５５で表される。一例では、オートマトンは、グラフのノードが状態の集合に対応する有向グラフとして表され得る。一例では、オートマトンによって受け入れられた（例えば、一致した）データは、オートマトンに連続して入力される場合に、最終状態に達し得る全ての可能なデータの集合である。オートマトンによって受け入れられたデータ内の各シンボルは、開始状態から１つまたは複数の最終状態への経路を辿る。正規表現によって受け入れられたデータは、正規表現に一致する全ての可能な文字列の集合である。正規表現“Ｒ”と仮定すると、“Ｒ”の受け入れられたデータを£（Ｒ）として示す。
【００５８】
一例では、オートマトンは、汎用状態ならびに専用状態を含む。コンパイラがＦＳＭエンジン６００に対して機械コードを生成している例では、汎用状態はＳＭＥ ６０４、６０５に対応でき、汎用状態はそれに応じて本明細書では「ＳＭＥ状態」と呼ばれる。さらに、コンパイラがＦＳＭエンジン６００に対して機械コードを生成している場合、専用状態は、カウンタ６２４に対応でき、それに応じて本明細書では「カウンタ状態」と呼ばれる。一例では、オートマトン内のＳＭＥ状態は、ＳＭＥにマッピングしないオートマトンの開始状態を除いて、ＦＳＭエンジン６００内のＳＭＥ（例えば、ＳＭＥ ６０４、６０５）に１：１でマッピングする。カウンタ６２４は、カウンタ状態に１：１でマッピングすることもあれば、しないこともある。
【００５９】
一例では、入力シンボル範囲外の特別な遷移シンボルが、オートマトン内で使用され得る。これらの特別な遷移シンボルは、例えば、専用要素2２４の使用を可能にするために使用できる。さらに、特別な遷移シンボルは、入力シンボル以外の何かを受けて起こる遷移を提供するために使用できる。例えば、特別な遷移シンボルは、第２の状態および第３の状態の両方が有効な場合に、第１の状態が有効にされる（例えば、遷移される）ことを示し得る。その結果、第１の状態は、第２の状態および第３の状態の両方がアクティブにされる場合にアクティブにされ、また、第１の状態への遷移は、入力シンボルに直接依存しない。特に、第２の状態および第３の状態の両方が有効な場合に、第１の状態が有効にされることを示す特別な遷移シンボルは、例えば、専用要素2２４としてのブール論理によって実行されるブールＡＮＤ関数を表すために使用できる。一例では、特別な遷移シンボルは、カウンタ状態がゼロに達したこと、従って下流の状態への遷移を示すために使用できる。
【００６０】
一例では、オートマトンは、グルシコフの方法などの、標準的な方法の１つを使用して構築できる。一例では、オートマトンは、εのない（ε−ｆｒｅｅ）均質な（ｈｏｍｏｇｅｎｏｕｓ）オートマトンであり得る。構文木のオートマトンへの変換に関するさらなる詳細は、以下で、図４、図１１、図１２、図１３Ａ、図１３Ｂ、および図１４に関連して説明される。
【００６１】
ブロック１００６で、構文木がオートマトンに変換されると、オートマトンが最適化される。オートマトンは、とりわけ、その複雑性およびサイズを縮小するように最適化され得る。オートマトンは、重複する状態を結合することにより最適化できる。
【００６２】
ブロック１００８で、最適化されたオートマトンがネットリストに変換される。オートマトンをネットリストに変換することは、オートマトンの各状態をＦＳＭエンジン６００上のハードウェア要素（例えば、ＳＭＥ  ６０４、６０５、専用要素６２４）のインスタンスにマッピングする。また、インスタンス間の接続が、ネットリストを作成するために決定される。
【００６３】
ブロック１０１０で、ネットリストの各インスタンスに対して、対象装置の特定のハードウェア要素（例えば、ＳＭＥ  ６０４、６０５、専用要素６２４）を選択するために、ネットリストが位置付けられる。一例では、位置付けられると、ＦＳＭエンジン６００に対する一般入力制約および出力制約に基づいて、各特定のハードウェア要素が選択される。
【００６４】
ブロック１０１２で、ネットリストによって記述された接続を達成するために、選択されたハードウェア要素を共に結合するため、位置付けられたネットリストが、プログラム可能スイッチ（例えば、ブロック間スイッチ６０３、ブロック内スイッチ６０８、および行内スイッチ６１２）に対する設定を決定するようにルーティングされる。一例では、プログラム可能スイッチに対する設定が、選択されたハードウェア要素を接続するために使用されるＦＳＭエンジン６００の特定の導体を決定することにより決定される。ルーティングは、ブロック１０１０で位置付けるハードウェア要素間の接続のさらに詳しい制限を考慮に入れることができる。その結果、ルーティングは、ＦＳＭエンジン６００上の導体の実際の制限を前提として、適切な接続を行うために、グローバルな位置付けによって決定された通りに、いくつかのハードウェア要素の位置付けを調整し得る。
【００６５】
ネットリストが位置付けられルーティングされると、位置付けられルーティングされたネットリストは、ＦＳＭエンジン2００のプログラミング用に複数のビットに変換できる。複数のビットはここではイメージと呼ばれる。
【００６６】
ブロック１０１４で、イメージがコンパイラによって公開される。イメージは、ＦＳＭエンジン６００の特定のハードウェア要素および／またはプログラム可能スイッチをプログラミングするための複数のビットを含む。イメージが複数のビット（例えば、０および１）を含む実施形態では、イメージは、バイナリイメージと呼ぶことができる。ビットは、プログラム化されたＦＳＭエンジン６００が、ソースコードによって記述された機能を有するＦＳＭを実装するように、ＳＭＥ ６０４、６０５の状態、専用要素６２４、およびプログラム可能スイッチをプログラムするためにＦＳＭエンジン６００上にロードできる。位置付け（ブロック１０１０）およびルーティング（ブロック１０１２）は、特定のハードウェア要素をＦＳＭエンジン６００内の特定の位置で、オートマトン内の特定の状態にマッピングできる。その結果、イメージ内のビットは、特定のハードウェア要素および／またはプログラム可能スイッチを所望の機能を実装するようにプログラムできる。一例では、イメージは、機械コードをコンピュータ可読媒体に保存することにより公開できる。別の例では、イメージは、イメージをディスプレイ装置上に表示することにより公開できる。さらに別の例では、イメージは、イメージをＦＳＭエンジン６００上にロードするためのプログラミング装置などの、別の装置にイメージを送信することにより、公開できる。さらにまた別の例では、イメージは、イメージを並列マシン（例えば、ＦＳＭエンジン６００）上にロードすることにより、公開できる。
【００６７】
一例では、イメージは、イメージからのビット値をＳＭＥ ６０４、６０５、および他のハードウェア要素６２４に直接ロードするか、またはイメージを１つまたは複数のレジスタにロードし、次いで、レジスタからのビット値をＳＭＥ ６０４、６０５、および他のハードウェア要素６２４に書き込むかのいずれかにより、ＦＳＭエンジン６００上にロードできる。一例では、コンピュータ（例えば、コンピュータに結合されているか、またはコンピュータと一体になったプログラミング装置）が、イメージを１つまたは複数のメモリアドレスに書き込むことにより、イメージをＦＳＭエンジン６００上にロードできるように、ＦＳＭエンジン６００のハードウェア要素（例えば、ＳＭＥ ６０４、６０５、他の要素６２４、プログラム可能スイッチ６０３、６０８、６１２）がメモリマップされる。
【００６８】
図４は、前述したように、構文木をオートマトンに変換するための方法４００を詳述する。以下の説明は、対象装置が、例えば、ＦＳＭエンジン６００などの並列マシンである場合に、構文木をオートマトンに変換するためのさらなる詳細を提供する。
【００６９】
ソースコード内に記述できる正規表現の１つのタイプは、量化子を含む。量化子は、当技術分野で周知であり、繰返しパターンを記述するために使用される。一例として、“Ａ（Ｂ）｛ｎ１，ｎ２｝Ｃ”は、一般的な正規表現であり、ここで、Ａ、ＢおよびＣは部分式であり、また、“（Ｂ）｛ｎ１，ｎ２｝”は量化子を含む。本明細書では、大文字は、正規表現または正規表現の一部（例えば、部分式）を表すために使用される。混乱を避けるために、二重引用符が、正規表現または部分式の前後に追加され得る。その結果、式を記述する大文字は、複数の入力シンボルに対する検索文字列に対応できる。例えば、式“Ａ”は、入力文字列‘ａｂｂｃ’に対応できる。
【００７０】
さらに、本明細書では、式および部分式という用語が関係記述のみのために使用される（例えば、部分式は式の一部である）こと、ならびに式および部分式という用語は、いかなる特定の長さ、構文、または文字数に限定されるべきではないことが理解されるはずである。特に、ソースコードは、文字セット全体またはその任意の個々の部分が「式」と考えられる多数の文字（メタ文字および検索文字を含む）を含むことができる。例えば、以下の各々は、式と見なされ得る：“ａ（ｂｂ｜ｄ？）｛５，２０｝ｃ”、“（ｂ）｛０，１０｝”、“（ｂ｜ｄ）”、および“ｂ”。
【００７１】
量化子は、“（Ｂ）｛ｎ１，ｎ２｝”のような正規表現で表され、ここで、Ｂは、部分式であり、ｎ１およびｎ２は、先行する部分式が何回出現できるかを指定する整数である。Ｂは、ｎ１およびｎ２によって指定された回数だけ繰り返される部分式なので、Ｂは、本明細書では、繰返し部分式（ｒｅｐｅａｔｅｄ  ｓｕｂ−ｅｘｐｒｅｓｓｉｏｎ）と呼ばれる。量化子“（Ｂ）｛ｎ１，ｎ２｝”が一致するため、繰返し部分式Ｂは、ｎ１〜ｎ２回、一致しなければならない。例えば、正規表現“（Ｂ）｛５，７｝”は、部分式Ｂが５、６、または７回、一致することを必要とするであろう。正規表現“Ａ（Ｂ）｛ｎ１，ｎ２｝Ｃ”では、部分式Ａは、一致する場合、量化子に遷移するので、部分式Ａは本明細書では、駆動式（ｄｒｉｖｅ  ｅｘｐｒｅｓｓｉｏｎ）と呼ばれる。さらに、量化子のための繰返しおよびカウントの増分を継続するために、量化子の繰返し部分式が連続して一致しなければならない。つまり、量化子の所与のループ中、繰返し部分式が一致しない場合、量化子が終了する。一例では、シンボル‘？’も量化子に対応し、ここで、‘？’に先行するシンボルは、１回またはゼロ回のどちらかに識別できる。
【００７２】
対象装置がＦＳＭエンジン６００である場合、方法４００は、ある量化子を識別し、ＦＳＭエンジン６００上のカウンタ６２４にマッピングできる。ある量化子をカウンタ６２４で実装すると、状態機械要素６０４、６０５での量化子の実装よりも効率化をもたらし得る。その結果、オートマトンおよびＦＳＭエンジン６００に対して結果として得られるイメージが単純化される。例えば、量化子を実装する構文木の部分は、実装するために大量のＳＭＥ  ６０４、６０５を必要とし得る。しかし、一例では、これらの量化子のいくつかは、ＳＭＥ  ６０４、６０５によって必要とされ得るよりも少ない状態で、カウンタ６２４を使用して実装できる。
【００７３】
ブロック４０２で、コンパイラは、ＦＳＭエンジン６００内のカウンタ６２４を用いて可能な実装のため、量化子に対応する構文木の部分を識別する。構文木の部分が量化子に対応しない場合、方法４００はブロック４０８に進み、そこで、部分が、ＳＭＥ  ６０４、６０５での実装のために汎用状態に変換される。構文木の部分が量化子に対応する場合には、識別された部分がカウンタ６２４で実装できるかどうかを判断するため、量化子がさらに解析される。
【００７４】
量化子がおそらくカウンタ６２４で実装できるかどうかを判断する前に、£（Ｂ）が空文字列を含む場合、“Ｂ｛ｎ１，ｎ２｝”の量化子が“Ｂ´｛０，ｎ２｝”として書き換えられ、ここで、Ｂ´は、Ｂの非空文字列（ｎｏ−ｅｍｐｔｙ−ｓｔｒｉｎｇ）バージョンであり、£（Ｂ´）＝£（Ｂ）−Φである。例えば、“（ｂｃ｜）｛１０，２０｝”は“（ｂｃ）｛０，２０｝”と書き換えられるが、これは、これらの正規表現が全く同じデータを受け付けるからである。次いで、以下の条件に従って、所与の量化子Ｂ｛ｎ１，ｎ２｝に対して、量化子がカウンタでおそらく実装できる（方法はブロック４０４に進む）か、あるいは、ＳＭＥで、カウンタを使用せずに実装できる（方法はブロック４０８に進む）：
【００７５】
１）  （ｎ１＝０，ｎ２＝−１）の場合、量化子は、ＳＭＥ  ６０４、６０５で、かつカウンタ６２４なしで実装される（ブロック４０８）。ここで、カウンタ６２４は必要ない。
２）  （ｎ１＝１，ｎ２＝−１）の場合、量化子は、ＳＭＥ  ６０４、６０５で、かつカウンタ６２４なしで実装される（ブロック４０８）。ここで、カウンタ６２４は必要ない。
３）  （ｎ１＞１，ｎ２＝−１）の場合、Ｂ｛ｎ，−１｝がＢ｛ｎ１−１｝Ｂ＋と等しいので、量化子は２つの正規表現Ｂ｛ｎ１−１｝およびＢ＋に分割される。量化子Ｂ｛ｎ１−１｝は、次いで、カウンタでおそらく実装でき（ブロック４０４）、他方Ｂ＋は、ＳＭＥ  ６０４、６０５で、かつカウンタ６２４なしで実装される（ブロック４０８）。Ｂ＋に対して、カウンタ６２４は必要ない。
４）  （ｎ１＝０，ｎ２＞０）の場合、（Ｂ｛１，ｎ２｝）？がＢ｛０，ｎ２｝と等しいので、量化子は（Ｂ｛１，ｎ２｝）？に修正される。空値不能なＢ｛１，ｎ２｝が、次いで、おそらくはカウンタ６２４で実装できる（ブロック４０４）。
５）  （ｎ１＞０，ｎ２＞０）の場合、量化子は、カウンタ６２４でＢ｛ｎ１，ｎ２｝としておそらく実装され得る（ブロック４０４）。
要約として、修正することなく、カウンタ６２４でおそらく実装できる（ブロック４０４）量化子は、Ｂ｛ｎ１，ｎ２｝として記述でき、ここで、Ｂは空値可能でなく、ｎ１＞０、ｎ２＞０、およびｎ１≦ｎ２である。
【００７６】
ブロック４０４で、コンパイラが、カウンタ６２４でおそらく実装できる量化子を識別すると、コンパイラは、その識別された部分に対応する構文木の部分が決定性であるかどうかを判断する。識別された部分が決定性である場合、識別された部分は１つまたは複数のカウンタ６２４で実装でき、方法４００はブロック４０６に進み、そこで、識別された部分が、１つまたは複数のＳＭＥ状態とともに、１つまたは複数のカウンタ状態に変換される。識別された部分が非決定性である場合、識別された部分はカウンタ６２４を使用して実装されず、方法４００はブロック４０８に進み、そこで、識別された部分が、１つまたは複数のＳＭＥ状態に変換される。
【００７７】
一般に、ブロック４０６およびブロック４０８は、量化子をオートマトンに変換する２つの方法に対応する。ブロック４０６では、量化子をループとして実装するため、おそらくは１つまたは複数のＳＭＥ状態とともに、量化子が１つまたは複数のカウンタ状態を使用して変換される。ブロック４０８では、量化子は、ＳＭＥ状態の使用を含むがカウンタ状態のない量化子を「展開する」ことによって変換される。展開することは、量化子を非量化子構文で書き換えることを含む。例えば、正規表現“（ｂ｜ｃ）｛１，２｝”は、“（ｂ｜ｃ）（ｂ｜ｃ）？”と展開できる。展開の利点は、（１）結果として得られるオートマトンが有向非巡回グラフ（ＤＡＧ）であり、解析および実装が容易であり得ること、ならびに（２）結果として得られるオートマトンが、専用要素の代わりに、汎用要素、特に、状態機械要素で実装できることを含む。しかし、展開された量化子を実装するために使用される汎用状態の数、従って状態機械要素は、ｎ１およびｎ２に対して線形である。従って、状態の数は、ｎ１またはｎ２が多数である場合、多数であり得る。特に、実際のリソースには制限があり、それ故、いくつかの例では、この展開技法は、量化子の限られたカテゴリに対してのみ使用される。
【００７８】
しかし、対象装置が、カウンタ６２４などの、カウント機能を実装するように設計された専用要素を有する場合、展開は、ある状況において回避できる。この方法の利点は、オートマトン内で必要とされる繰返し式のコピーが少ないことであり、また、コピーの数は、ｎ１およびｎ２とは無関係である。従って、かなりのリソースが節約できる。例えば、繰返し式および１つまたは複数のカウンタ６２４をもつループを作成することにより、１つまたは複数のカウンタ６２４が、量化子を実装するために使用できる。繰返し式が一致するたびに、カウンタ６２４が増分できる（または減分できる）。繰返し式は、次いで、別の一を探すために再度アクティブにされる。カウンタ６２４が、量化子によって提示された回数に等しい回数増分される（または減分される）と、カウンタ６２４は、量化子に続く状態をアクティブにできる。その結果、繰返し式を実装するために使用されたＳＭＥが再度使用されるので、量化子は、より少ないＳＭＥ  ６０４、６０５で実装できる。しかし、オートマトン全体（例えば、構文木全体に対応する）の並行性、すなわち、同時にアクティブにできる複数の状態、に起因して、いくつかの例では、カウンタ６２４のみが、オートマトン全体の決定性部分に対応する量化子で使用できる。
【００７９】
図１１は、量化子を実装するために、専用カウンタ状態１１０２を使用して、オートマトン１１００に変換された正規表現の一例を示す。オートマトン１１００は、正規表現“Ａ（Ｂ）｛ｎ１，ｎ１｝Ｃ”に対応し、ここで、量化子の両方のカウント値（例えば、ｎ１、ｎ２）は等しい。両方のカウント値が等しいので、量化子を実装するために単一のカウンタ６２４が使用される。図１１に示すように、オートマトン１１００は、グラフのノードが状態の集合に対応する、有向グラフとして表すことができる。
【００８０】
正規表現“Ａ（Ｂ）｛ｎ１，ｎ１｝Ｃ”は、いくつかのＳＭＥ状態１１０４、１１０６、１１１０、１１０８、およびカウンタ状態１１０２に変換される。ＳＭＥ状態１１０４、１１０６、１１０８、１１１０は、部分式“Ａ”、“Ｂ”、および“Ｃ”に対応する。ＳＭＥ状態１１０４、１１０６、１１１０、１１０８は、ＳＭＥ  ６０４、６０５で実装できるが、他方、カウンタ状態１１０２は、カウンタ６２４で実装できる。オートマトン１１１０が、ＦＳＭエンジン６００上で実装される場合、カウンタ状態１１０２に対応するカウンタ６２４は、最初は値ｎ１でロードされ、カウンタ６２４内の値がゼロに達すると、ゼロカウント出力をアサートするように設定される。ｎ１がｎ２に等しい場合、カウンタ６２４は、ストップ０およびパルス出力モードに設定できるが、これは、カウンタ６２４は、その値がゼロに達すると、その出力をアサートすることを意味し、また、カウンタ６２４がリセットされるまで、カウンタ６２４はゼロのままで、いかなる信号も出さない。
【００８１】
オートマトン１１００は、状態１１０４から始まり、部分式“Ａ”に一致すると、状態１１０６に遷移する。状態１１０６での間、部分式“Ｂ”が一致するたびに、カウンタ状態１１０２のＩＮポートがアクティブにされ、カウンタ状態１１０２が１だけ減分される。さらに、部分式“Ｂ”が一致するたびに、状態１１０６は、状態１１１０をアクティブにするだけでなく、自分自身をアクティブにする。カウンタ状態１１０２がゼロに達すると、出力がアクティブにされ、オートマトン１１００は、次いで、部分式“Ｃ”を探す。次のサイクルでは、２つのシナリオが生じるであろう：第１のシナリオは、“〜Ｂ”が一致する場合に生じる。〜Ｂ”が一致すると、カウンタ状態１１０２がリセットされ、その値がｎ１に再度設定される。その結果、部分式“Ａ”が次に一致するとき、プロセスは状態１１０４からやり直す。第２にシナリオでは、状態１１０６の自己ループが依然としてアクティブであり、部分式“Ｂ”が一致すると、カウンタ１１０２のＩＮポートが、継続してトリガーされる。カウンタ状態１１０２はパルスモードで構成されているので、状態１１０６の自己ループがアクティブなままであるが、カウンタ状態１１０２は、その出力を再度アクティブにしないであろう。
【００８２】
部分式“Ｂ”の否定バージョンは、本明細書では“〜Ｂ”としても参照される。一例では、部分式“Ｂ”の否定バージョンは、カウンタ状態１１０２のリセットポートをアクティブにするために使用される。これは、“Ｂ”が、量化子“（Ｂ）｛ｎ１，ｎ２｝”の繰返し式であるからであり、Ｂ以外の何か（例えば、“Ｂ”の否定バージョン）が入力で受信される場合（状態１１０６がアクティブにされていると）、量化子が終了し、カウンタがそれに応じてリセットされる。その結果、状態１１１０がアクティブにされると、部分式“Ｂ”の否定バージョンが一致する場合、カウンタ状態１１０２がリセットされ、量化子は一致しない。一例では、繰返し式は、標準的なオートマトン理論を使用して否定される。
【００８３】
ｎ１がｎ２に等しい場合、単一のカウンタ状態６２４が示されて、量化子を実装するように説明されているが、単一のカウンタ６２４によってサポートされるよりも多くの数をカウントするように、複数のカウンタ６２４がカスケード接続できることが認識されるはずである。
【００８４】
図１２は、量化子のある正規表現を実装するために、複数の専用カウンタ状態１２０２、１２０４を使用して、オートマトン１２００に変換された正規表現の別の例を示す。オートマトン１２００は、正規表現“Ａ（Ｂ）｛ｎ１，ｎ２｝Ｃ”に対応し、ここで、ｎ１はｎ２より小さい。量化子“（Ｂ）｛ｎ１，ｎ２｝”においてｎ１はｎ２より小さいので、２つのカウンタ状態１２０２、１２０４が使用される。カウンタ状態１２０２、１２０４は、ストップ０および保留（ｈｏｌｄ）モードに構成されており、それは、カウンタ状態１２０２、１２０４がゼロに達すると、カウンタ状態１２０２、１２０４がそれらの出力をアクティブにすることを意味し、また、カウンタ状態１２０２、１２０４がリセットされる前、カウンタ状態１２０２、１２０４はゼロのままに維持され、ＩＮポートがアクティブにされるたびにそれらの出力をアクティブに保つ。この例では、カウンタ状態１２０２からカウンタ状態１２０４への待ち時間は、２サイクルかかる。
【００８５】
カウンタ状態１２０２は、最初はｎ１に設定され、また、カウンタ状態１２０４は、最初はｎ２に設定される。オートマトンは、部分式“Ａ”が一致する場合に、状態１２０６から状態１２０８に遷移する。状態１２０８がアクティブにされると、部分式“Ｂ”が一致するたびに、カウンタ状態１２０２およびカウンタ状態１２０４の両方のＩＮポートがアクティブにされる。その結果、カウンタ状態１２０２およびカウンタ状態１２０４の両方が１だけ減分される。カウンタ状態１２０２がゼロに達すると、その出力がアクティブにされ、オートマトン１２００は、次いで、部分式“Ｃ”の一致を探し、状態１２１０をアクティブにする。部分式“Ｂ”がｎ１回一致していると、カウンタ状態１２０４の値は、ｎ２−ｎ１である。その後、部分式“Ｂ”が一致するたびに、カウンタ状態１２０２のＩＮポートがアクティブにされ、カウンタ状態１２０２の値がゼロのままに維持され、その出力は依然としてアクティブにされている。その一方で、カウンタ状態１２０４は継続して減分される。部分式“Ｂ”がｎ２回一致するとき、カウンタ状態１２０４もゼロに達し、その出力がアクティブにされて、カウンタ状態１２０２のリセットポートを駆動する。カウンタ状態１２０４からカウンタ状態１２０２への待ち時間は２サイクルであるので、カウンタ状態１２０２は、状態１２１０へのその出力を継続してアクティブにする。次のサイクルで、カウンタ状態１２０２が、カウンタ状態１２０４の出力からリセットされ、カウンタ状態１２０２からの出力がアサートされない。次のサイクルでは、２つのシナリオが生じるであろう。第１のシナリオでは、“〜Ｂ”が一致する。カウンタ状態１２０２およびカウンタ状態１２０４の両方が、状態１２１２によってリセットされ、それらの値が、それぞれｎ１およびｎ２に設定される。その結果、状態１２０６が次にアクティブにされるとき、および部分式“Ａ”が次に一致するときに、状態１２０８がアクティブにされ、カウンタ状態１２０２、１２０４が再度減分される。第２のシナリオでは、状態１２０８の自己ループがアクティブのままに維持され、カウンタ状態１２０２、１２０４の両方のＩＮポートがアクティブにされる。カウンタ状態１２０４は、その出力を継続してアクティブにするので、カウンタ状態１２０２は継続してリセットされ、状態１２０８の自己ループがアクティブである限り、その出力をアクティブにしない。
【００８６】
さらに、状態１２０８がアクティブである間に部分式“Ｂ”が一致すると、状態１２１２をアクティブにする。状態１２１２がアクティブにされ、かつ、“〜Ｂ”が一致すると、カウンタ状態１２０２、１２０４がリセットされ、量化子は一致しない。“Ｂ”は、量化子“（Ｂ）｛ｎ１，ｎ２｝”の繰返し式であるため、部分式“Ｂ”の否定バージョンが使用される。その結果、状態１２０８で、式‘Ｂ’が、ｎ１からｎ２回まで繰り返して一致し得る。単一のカウンタが示され、それぞれ、下限（例えば、ｎ１）および上限（例えば、ｎ２）の閾値を実装するように説明されているが、単一のカウンタによってサポートされるよりも多くの数をカウントするために、当業者には知られているように、複数のカウンタがカスケード接続できることが認識されるはずである。
【００８７】
カウンタ状態を使用して量化子を変換する前に、コンパイラは、ブロック４０４で、量化子に対応するオートマトンが決定性であるかどうかを判断する。一例では、式が、以下で説明する、プレフィックスなし条件および再入なし条件の両方を満足する場合、オートマトンは決定性である。すなわち、量化子がカウンタ６２４にマッピングされるために、量化子は、以下で説明するように、プレフィックスなし条件および再入なし条件を満足しなければならない。
【００８８】
図１２のオートマトン１２００を参照すると、再入なし条件は、カウンタ状態１２０２がアクティブである間（例えば、カウンタ状態１２０２がカウントしている間）、状態１２０６から状態１２０８へのエッジがアクティブにできないことを必要とする。すなわち、量化子が既に処理されている間に、量化子に対する駆動式が一致できるかどうかが判断される。駆動式に一致することは、量化子の直前の状態が、量化子に対応する状態に遷移することを意味する。その結果、カウンタ状態が繰返し式をまだ処理している間に、量化子が「再入」される。ＦＳＭエンジン６００のこの例では、カウンタ６２４は、いつでも単一ループしか実装できないので、ループが既に処理されている間に量化子に遷移することは、所与のループ中に、カウンタ６２４に間違ってカウントさせ得る。
【００８９】
図１３Ａおよび図１３Ｂは、再入なし条件をさらに説明するために使用できる、オートマトン１３００および１３１４を示す。図１３Ａは、構文木内の量化子に対応するオートマトン例１３００を示し、そこで、コンパイラは、量化子に対応するオートマトンが決定性であるかどうかを判断するために解析できる。
【００９０】
オートマトン１３００は、正規表現“ａｂｂ？（ｂ｜ｃ）｛１，２｝”に対応し、開始状態１３０２および最終状態１３１２、１３０４を含む。最終状態は、図１３Ａでは、二重丸で識別される。開始状態１３０２が最初にアクティブにされ、入力シンボル‘ａ’で、状態１３０６に遷移する。状態１３０６は、入力シンボル‘ｂ’で、状態１３０８および状態１３１０の両方に遷移する。状態１３０８は、入力シンボル‘ｂ’で状態１３１０に遷移し、状態１３１０は、入力シンボル‘ｂ’または‘ｃ’のどちらかで、状態１３１２に遷移する。オートマトン１３００は、入力シンボル‘ｂ’または‘ｃ’のどちらかで、状態１３１２から状態１３０４に遷移する。
【００９１】
オートマトン１３００は、正規表現“ａｂｂ？（ｂ｜ｃ）｛１，２｝”に対するオートマトンを含み、それは、再入なし条件の順守をチェックされる。オートマトン１３１４は、オートマトン１３００の正規表現“ａｂｂ？（ｂ｜ｃ）｛１，２｝”から導出された正規表現ＳＳ（“ａｂｂ？”，“（ｂ｜ｃ）｛２｝”）のオートマトンを含む。ＳＳ（Ｍ，Ｎ）は、Ｍ，Ｎから導出された正規表現として定義される。導出ステップは次を含む：１）ＭおよびＮを連結し、結果が“ＭＮ”として示される。２）“ＭＮ”に対するオートマトンを構築し、Ａ（ＭＮ）として示される。３）Ａ（ＭＮ）を以下のように修正する：ａ）他の全ての状態を駆動するＡ（ＭＮ）の開始状態を作成し、そして、ｂ）“Ｎ”に対応する全ての状態を最終状態にする。最後に、４）修正されたオートマトンに対する正規表現をＳＳ（Ｍ，Ｎ）として示す。ＳＳ（Ｍ，Ｎ）の受け入れられたデータは、“ＭＮ”の任意の状態から始まり、Ｎの任意の状態で終わる、部分文字列から成る。
【００９２】
再入なし条件は、以下のように定義できる。量化子“ＡＢ｛ｎ１，ｎ２｝Ｃ”のある正規表現を仮定すると、再入なし条件は、£（ＳＳ（Ａ，Ｂ｛ｎ１，ｎ２｝）∩£（Ａ）＝Φであることを必要とする。言い換えれば、部分式“Ａ”が一致し、カウンタ状態１２０２がカウントを開始すると、再入なし条件を満足するために、“Ｂ｛ｎ１，ｎ２｝”が完了する（一致または失敗する）まで、状態１２０６から状態１２０８へのエッジは再度アクティブにされないであろう。例えば、“ａｂｂ”∈£（“ａｂｂ？”）∩£（ＳＳ（“ａｂｂ？”，“（ｂ｜ｃ）｛２｝”）、従って、“ａｂｂ？（ｂ｜ｃ）｛１，２｝”は、カウンタ６２４で正しく実装されないであろう。
【００９３】
ここで図１４を参照すると、プレフィックスなし条件が、オートマトン１４００に関連して説明される。プレフィックスなし条件は、£（Ｂ）の任意の文字列が、£（Ｂ）の別の文字列のプレフィックスであってはならないことを提示し、それは、Ｂがカウンタに２回以上カウントさせないことを保証する。言い換えれば、量化子の第１の繰返し部分式が、量化子の第２の繰返し部分式のプレフィックスである場合、量化子は、カウンタ６２４として実装されない（従って、それに変換されない）。正式なステートメントは、全てのｌｉ、ｌｊ∈£（Ｂ）、ｌｉ≠ｌｊに対して、｛ｌｉ．＊｝∩｛ｌｊ．＊｝＝Φであることを必要とする。
【００９４】
例えば、正規表現“ａ（ｂ｜ｂｃ）｛３｝”は、プレフィックスなし条件を満足しない。その結果、正規表現“ａ（ｂ｜ｂｃ）｛３｝”は、カウンタ状態を使用して変換されず、したって、カウンタ６２４で実装されないであろう。代わりに、正規表現“ａ（ｂ｜ｂｃ）｛３｝”は、カウンタ状態のない、汎用状態に変換されるであろう。
【００９５】
正規表現“ａ（ｂ｜ｂｃ）｛３｝”がカウンタ６２４で実装された場合、入力“ａｂｂｃ”は、誤って一致するであろう。例えば、オートマトン１４００は、カウンタ状態１４１２を使用して、正規表現“ａ（ｂ｜ｂｃ）｛３｝”を仮想的に変換した結果である。以下で説明するように、この変換は、カウンタ状態１４１２の誤動作という結果となる。状態１４０２が最初にアクティブにされ、入力‘“ａ”で、状態１４０２が状態１４０４をアクティブにする。状態１４０４をアクティブにして、入力シンボル“ｂ”で、状態１４０４が、状態１４０６、１４０８をアクティブにし、それ自身、状態１４０４を再度アクティブにする。また、入力シンボル“ｂ”で、状態１４０４は、カウンタ１４１２のＩＮポートをアクティブにし、そこで、カウンタ状態１４１２の初期値が３で、次いで、２に減らされる。状態１４０４、１４０６、および１４０８をアクティブにして、別の入力“ｂ”で、カウンタ状態１４１２のＩＮポートが、状態１４０４によって再度アクティブにされ、カウンタ状態１４１２の値が１に減らされる。この時点で、状態１４０４、１４０６、および１４０８はアクティブにされている。次いで、入力値“ｃ”で、状態１４０８によってアクティブにされるカウンタ状態１４１２のＩＮポートが、カウンタ１４１２内の値を０に減らす。カウンタ１４１２内の値がゼロで、出力がアクティブにされ、状態１４１４がアクティブにされて、一致を示す。しかし、シーケンス“ａｂｂｃ”が正規表現“ａ（ｂ｜ｂｃ）｛３｝”を満足しない場合に、入力“ａｂｂｃ”が一致を引き起こしているので、この一致は誤判定である。その結果、正規表現“ａ（ｂ｜ｂｃ）｛３｝”は、プレフィックスなし条件を満足せず、カウンタ状態を使用して変換されるべきではなく、また、カウンタ６２４で実装されるべきではない。
【００９６】
ブロック４０４で、量化子が、プレフィックスなし条件および再入なし条件の両方を満足する場合、量化子は、ブロック４０６で、専用カウンタ状態を使用して変換される。量化子は、上で図１２および図１３に関連して説明したように、変換できる。しかし、量化子が、プレフィックスなし条件または再入なし条件のどちらかを満足しない場合、量化子は、ブロック４０８で、量化子を展開し、カウンタ状態６２４なしで、汎用状態に変換することにより、変換される。量化子は、その結果、カウンタ６２４ではなく、ＳＭＥ  ６０４、６０５で実装される。
【００９７】
本明細書で説明する方法例は、少なくとも一部は、機械またはコンピュータ実装できる。いくつかの例は、上の例で説明した方法を実行する電子装置を構成するように動作可能な命令でコード化されたコンピュータ可読媒体または機械可読媒体を含み得る。かかる方法の実装は、マイクロコード、アセンブリ言語コード、高水準言語コード、または同様のものなどの、コードを含み得る。かかるコードは、様々な方法を実行するためのコンピュータ可読命令を含み得る。コードは、コンピュータプログラム製品の一部を形成し得る。さらに、コードは、実行中または他の時に、１つもしくは複数の揮発性または不揮発性のコンピュータ可読媒体上に有形的に格納され得る。これらのコンピュータ可読媒体は、ハードディスク、取り外し可能磁気ディスク、取り外し可能光ディスク（例えば、コンパクトディスクおよびデジタルビデオディスク）、磁気カセット、メモリカードまたはメモリスティック、ランダムアクセスメモリ（ＲＡＭ）、読取り専用メモリ（ＲＯＭ）、および同様のものを含み得るが、これらに限定されない。
【００９８】
図１５は、フォンノイマン型アーキテクチャを有するコンピュータ１５００の例をおおまかに示す。本開示の内容を読んで理解すると、当業者であれば、ソフトウェアプログラム内に定義された機能を実行するために、ソフトウェアプログラムが、コンピュータベースシステム内のコンピュータ可読媒体から起動できる方法を理解するであろう。当業者は、さらに、本明細書で開示する方法を実装および実行するように設計された１つまたは複数のソフトウェアプログラムを作成するために採用できる様々なプログラム言語を理解するであろう。プログラムは、Ｊａｖａ、Ｃ＋＋、または１つもしくは複数の他の言語などのオブジェクト指向言語を使用して、オブジェクト指向フォーマットで構造化できる。代替として、プログラムは、アセンブリ、Ｃ、などの手続き型言語を使用して、手続き指向フォーマットで構造化できる。ソフトウェアコンポーネントは、リモートプロシージャコールまたはその他を含む、アプリケーションプログラムインタフェースまたはプロセス間通信技術など、当業者に周知の任意の数の機構を使用して、通信できる。様々な実施形態の技術は、任意の特定のプログラム言語または環境に制限されない。
【００９９】
このようにして、他の実施形態が実現できる。例えば、コンピュータ、メモリシステム、磁気ディスクもしくは光ディスク、何らかの他の記憶装置、または任意のタイプの電子装置もしくはシステムなどの、製品は、その上に格納された命令１５２４（例えば、コンピュータプログラム命令）を有するメモリ（例えば、取り外し可能記憶媒体、ならびに電気導体、光導体、または電磁導体を含む任意のメモリ）などの、コンピュータ可読媒体１５２２に結合された１つまたは複数のプロセッサ１５０２を含み得、それは、１つまたは複数のプロセッサ１５０２で実行される場合に、上の方法に関して説明した動作のいずれかを実行する結果となる。
【０１００】
コンピュータ１５００は、いくつかのコンポーネントに直接、および／またはバス１５０８を使用して、結合されたプロセッサ１５０２を有するコンピュータシステムの形をとることができる。かかるコンポーネントには、メインメモリ１５０４、スタティックまたは不揮発性メモリ１５０６、および大容量記憶１５１６を含み得る。プロセッサ１５０２に結合された他のコンポーネントには、ビデオディスプレイなどの出力装置１５１０、キーボードなどの入力装置１５１２、およびマウスなどのカーソル制御装置１５１４を含み得る。プロセッサ１５０２および他のコンポーネントをネットワーク１５２６に結合するためのネットワークインタフェース装置１５２０は、バス１５０８にも結合できる。命令１５２４は、いくつかの周知の転送プロトコル（例えば、ＨＴＴＰ）のうちの任意の１つを利用するネットワークインタフェース装置１５２０を経由し、ネットワーク１５２６を通して、さらに転送または受信され得る。バス１５０８に結合されたこれら要素のいずれかは、実現される特定の実施形態に応じて、存在しないか、単独で存在し得るか、または複数で存在し得る。
【０１０１】
一例では、１つまたは複数のプロセッサ１５０２、メモリ１５０４、１５０６、または記憶装置１５１６は各々、コンピュータ１５００に、実行時に、本明細書に記載する方法のいずれか１つまたは複数を実行させ得る、命令１５２４を含むことができる。代替実施形態では、コンピュータ１５００は、スタンドアロン装置として動作するか、または他の装置に接続（例えば、ネットワーク接続）できる。ネットワーク化された環境では、コンピュータ１５００は、サーバークライアントネットワーク環境内のサーバーもしくはクライアント装置の資格で、または、ピアツーピア（もしくは分散）ネットワーク環境内のピア装置として、動作できる。コンピュータ１５００には、パーソナルコンピュータ（ＰＣ）、タブレットＰＣ、セットトップボックス（ＳＴＢ）、携帯情報端末（ＰＤＡ）、携帯電話、ウェブアプライアンス、ネットワークルーター、スイッチもしくはブリッジ、またはその装置によってとられる動作を指定する命令のセットを（連続して、もしくは他の方法で）実行可能な任意の装置を含み得る。さらに、単一のコンピュータ１５００のみが示されているが、「コンピュータ」という用語は、本明細書で説明する方法のいずれか１つまたは複数を実行するための命令のセット（または複数のセット）を単独に、または一緒に実行する装置の任意の集合を含むようにも解釈されるものとする。
【０１０２】
コンピュータ１５００は、１つまたは複数の通信プロトコル（例えば、ユニバーサルシリアルバス（ＵＳＢ）、ＩＥＥＥ  １３９４など）を使用して周辺機器と通信するための出力コントローラ１５２８も含むことができる。出力コントローラ１５２８は、例えば、コンピュータ１５００に通信的に結合されているプログラミング装置１５３０にイメージを提供できる。プログラミング装置１５３０は、並列マシン（例えば、並列マシン５００、ＦＳＭエンジン６００）をプログラムするように構成できる。他の例では、プログラミング装置１５３０は、コンピュータ１５００と統合されて、バス１５０８に結合できるか、またはネットワークインタフェース装置１５２０または別の装置を経由してコンピュータ１５００と通信できる。
【０１０３】
コンピュータ可読媒体１５２４は単一の媒体として示されているが、「コンピュータ可読媒体」という用語は、命令１５２４の１つまたは複数のセットを格納する単一の媒体または複数の媒体（例えば、集中型もしくは分散型データベース、または関連するキャッシュおよびサーバー、ならびに／またはプロセッサ１５０２レジスタ、メモリ１５０４、１５０６、および記憶装置１５１６などの様々な記憶媒体）を含むように解釈されるべきである。「コンピュータ可読媒体」という用語は、コンピュータによって実行するための命令のセットを格納、コード化、または運搬可能であり、かつ、コンピュータに本発明の方法のいずれか１つまたは複数を実行させるか、または命令のかかるセットによって利用されるか、またはそれに関連したデータ構造を格納、コード化、または運搬可能である、任意の媒体を含むように解釈されるものとする。「コンピュータ可読媒体」という用語は、その結果、ソリッドステートメモリ、光媒体、および磁気媒体などの、有形的媒体を含むように解釈されるものとするが、それらに限定されない。
【０１０４】
要約は、読者が技術的開示の本質および要点を確認できるようにする要約を要求する米国特許規則（３７  Ｃ．Ｆ．Ｒ）１．７２（ｂ）項に準拠するために提供されている。それは、請求項の範囲または意味を制限または解釈するために使用されないという理解で提示されている。以下の請求項は、これによって詳細な説明に組み込まれ、各請求項が別個の実施形態として権利を主張する。
【０１０５】
〔実施形態例〕
例１は、汎用要素および専用要素を含む、要素のセットに対応する機械コードを生成するためのコンピュータ実装方法を含み、本方法は、関係的に結合された演算子の配列内の部分が、専用要素にマッピングされるための条件を満足するかどうかを判断すること；その部分が条件を満足する場合に、その部分を専用要素にマッピングすること；および関係的に結合された演算子の配列を機械コードに変換することを含む。
【０１０６】
例２は、命令を含むコンピュータ可読媒体を含み、それは、コンピュータによって実行されるときに、そのコンピュータに：対象装置のための専用要素に対応する、関係的に結合された演算子の配列内の部分を識別することであって、対象装置が汎用要素も含む、配列内の部分を識別すること；その部分が、専用要素にマッピングされるための条件を満足するかどうかを判断すること；その配列を、複数の状態を含むオートマトンに変換することであって、その部分が条件を満足する場合に、その部分が、専用要素に対応する専用状態を使用して変換される、その配列をオートマトンに変換すること；およびオートマトンを機械コードに変換すること；を含む動作を実行させる。
【０１０７】
例３は、ソフトウェアがその上に格納されたメモリ；およびそのメモリに通信的に結合されたプロセッサを含むコンピュータを含み、そのソフトウェアは、プロセッサによって実行されるとき、そのプロセッサに、正規表現を、対象装置用のコードにコンパイルさせ、対象装置は、第１のタイプの要素および少なくとも他のタイプの要素をサポートし；コンパイルすることが、第１のタイプの要素に対応する第１の正規表現を第１のタイプの要素にマッピングすることを含み；また、コンパイルすることが、第１のタイプの要素に対応しない第２の正規表現を、少なくとも１つの他のタイプの要素にマッピングすることを含む。
【０１０８】
例４は、コンピュータであって、対象装置の専用要素に対応する、関係的に結合された演算子の配列内の部分を識別することであって、対象装置が汎用要素も含む、配列内の部分を識別すること；その部分が、専用要素にマッピングされるための条件を満足するかどうかを判断すること；配列を、複数の相互接続状態を含むオートマトンに変換することであって、第１の部分が条件を満足する場合に、専用要素に対応する専用状態にその部分が変換される、配列をオートマトンに変換すること；および、オートマトンを機械コードに変換すること、を行うように構成されたコンピュータ；ならびに、並列マシンをプログラムするための装置であって、その装置が機械コードを並列マシン上にロードするように構成されている、装置；を含むシステムを含む。
【０１０９】
例５では、例１〜４のいずれかの主題が、機械コードが、並列マシンのためのイメージを含むこと、を随意に含み得る。
【０１１０】
例６では、例１〜５のいずれかの主題が、要素のセットが、プロセッサ上で実装するための命令のセットを含むこと、および、専用要素が専用命令を含むこと、を随意に含み得る。
【０１１１】
例７では、例１〜６のいずれかの主題が、専用要素に対応する、関係的に結合された演算子の配列内の部分を識別することであって、部分が条件を満足するかどうかを判断することが、識別される部分が条件を満足するかどうかを判断し；マッピングすることが、配列を、複数の状態を含むオートマトンに変換することを含み、その部分が条件を満足する場合に、その部分が、専用要素に対応する専用状態を使用して、変換され；かつ、配列を変換することが、オートマトンを機械コードに変換することを含む、配列内の部分を識別することを含むこと、を随意に含み得る。
【０１１２】
例８では、例１〜７のいずれかの主題が、専用要素に対応する配列内の部分を識別することが、専用要素を使用して実装できる、関係的に結合された演算子の演算子を識別することを含むこと、を随意に含み得る。
【０１１３】
例９では、例１〜８のいずれかの主題が、配列をオートマトンに変換することが、その配列内の各演算子を複数の状態のうちの１つまたは複数に変換することを含むこと、を随意に含み得る。
【０１１４】
例１０では、例１〜９のいずれかの主題が、部分が条件を満足しない場合に、その部分が、専用要素に対応する専用状態を使用するのではなく、汎用状態を使用して変換され、汎用状態が汎用要素に対応すること、を随意に含み得る。
【０１１５】
例１１では、例１〜１０のいずれかの主題が、部分が第１の部分を含み、配列の第２の部分が専用要素に対応するとして識別されない場合に、配列の第２の部分が、専用要素に対応する専用状態を使用するのではなく、汎用状態を使用して変換され、汎用状態が汎用要素に対応すること、を随意に含み得る。
【０１１６】
例１２では、例１〜１１のいずれかの主題が、要素のセットが並列マシンのハードウェア要素のセットを含み、汎用要素がプログラム可能要素を含み、かつ、専用要素がカウンタを含むこと、を随意に含み得る。
【０１１７】
例１３では、例１〜１２のいずれかの主題が、プログラム可能要素が状態機械要素を含むこと、を随意に含み得る。
【０１１８】
例１４では、例１〜１３のいずれかの主題が、状態機械要素がメモリセルを含むこと、を随意に含み得る。
【０１１９】
例１５では、例１〜１３のいずれかの主題が、メモリセルが揮発性メモリセルを含むこと、を随意に含み得る。
【０１２０】
例１６では、例１〜１５のいずれかの主題が、機械コードを公開することをさらに含むこと、を随意に含み得る。
【０１２１】
例１７では、例１〜１６のいずれかの主題が、機械コードを公開することが、その機械コードを並列マシン上にロードすることを含むこと、を随意に含み得る。
【０１２２】
例１８では、例１〜１７のいずれかの主題が、機械コードを公開することが、機械コードをコンピュータ可読媒体上に格納することを含むこと、を随意に含み得る。
【０１２３】
例１９では、例１〜１８のいずれかの主題が、命令が、コンピュータに、ソースコードを配列に変換すること；および機械コードを公開すること、を含む動作を実行させること、を随意に含み得る。
【０１２４】
例２０では、例１〜１９のいずれかの主題が、部分が、専用要素にマッピングされるための条件を満足するかどうかを判断することが、その部分が決定性であるかどうかを判断することを含むこと、を随意に含み得る。
【０１２５】
例２１では、例１〜２０のいずれかの主題が、配列の部分を識別することが、量化子を識別することを含み、かつ、その部分が決定性であるかどうかを判断することが、量化子に対する駆動式が、量化子が処理されている間に、一致できるかどうかを判断することを含むこと、を随意に含み得る。
【０１２６】
例２２では、例１〜２１のいずれかの主題が、配列の部分を識別することが、量化子を識別することを含み、かつ、その部分が決定性であるかどうかを判断することが、量化子の繰返し式が、量化子の別の繰返し式のプレフィックスであるかどうかを判断することを含むこと、を随意に含み得る。
【０１２７】
例２３では、例１〜２２のいずれかの主題が、配列内の部分を識別することが、量化子を識別することを含むこと、を随意に含み得る。
【０１２８】
例２４では、例１〜２３のいずれかの主題が、部分が決定性であるかどうかを判断することが、量化子に対する駆動式が、その量化子が処理されている間に一致できるかどうかを判断すること、および、量化子の繰返し式が、量化子の別の繰返し式のプレフィックスであるかどうかを判断することを含むこと、を随意に含み得る。
【０１２９】
例２５では、例１〜２４のいずれかの主題が、専用要素が、オートマトン内に対応するカウンタ状態を有するカウンタを含み、かつ、汎用要素が、オートマトン内に対応する状態機械要素状態を有する状態機械要素を含むこと、を随意に含み得る。
【０１３０】
例２６では、例１〜２５のいずれかの主題が、部分が量化子に対応し、かつ部分が決定性である場合、その部分が、量化子の繰返し式およびカウンタ状態を含むループとして実装され、そのカウンタ状態が、繰返し式が一致する回数をカウントするように構成されていて、また、繰返し式が、量化子によって指定された回数一致する場合に、カウンタ状態が下流状態をアクティブにすること、を随意に含み得る。
【０１３１】
例２７では、例１〜２６のいずれかの主題が、ループが、繰返し式の否定バージョンとの一致によって終了されること、を随意に含み得る。
【０１３２】
例２８では、例１〜２７のいずれかの主題が、量化子が、単一のループ数と一致し得る場合に、繰返し式を、カウンタ状態のカウント入力をアサートするように構成し；繰返し式の否定バージョンを、カウンタ状態をリセットするように構成し；かつ、カウンタ状態がリセットされることなく、カウント入力が、ループ数に等しい回数アサートされている場合に、出力をアサートするようにカウンタ状態を構成すること、を随意に含み得る。
【０１３３】
例２９では、例１〜２８のいずれかの主題が、量化子が複数個のループ数と一致し得る場合に、第１のカウンタ状態のカウント入力および第２のカウンタ状態のカウント入力をアサートするように繰返し式を構成し；第１のカウンタ状態のリセット入力および第２のカウンタ状態のリセット入力をアサートするように繰返し式を構成し；第１のカウンタ状態のカウント入力が、第１のカウンタ状態がリセットされることなく、複数個のループ数の下限閾値に等しい回数アサートされている場合に、出力をアサートするように第１のカウンタ状態を構成し；かつ、第２のカウンタ状態のカウント入力が、第２のカウンタ状態がリセットされることなく、複数個のループ数の上限閾値に等しい回数アサートされている場合に、第２のカウンタ状態の出力をアサートするように第２のカウンタ状態を構成することであって、第２のカウンタ状態の出力が、第１のカウンタ状態のリセット入力をアサートするように構成されている、第２のカウンタ状態を構成すること、を随意に含み得る。
【０１３４】
例３０では、例１〜２９のいずれかの主題が、対象装置が並列マシンを含むこと、および、第１のタイプの要素が第１のタイプのハードウェア要素であり、かつ、少なくとも１つの他のタイプの要素が第２のタイプのハードウェア要素を含むこと、を随意に含み得る。
【０１３５】
例３１では、例１〜３０のいずれかの主題が、第２のタイプのハードウェア要素が、入力ストリームを受信し、その入力ストリームに応じて出力を提供でき、かつ、第１のタイプのハードウェア要素が、入力ストリームを受信せず、対象装置の他の要素からの入力に応じて出力を提供すること、を随意に含み得る。
【０１３６】
例３２では、例１〜３１のいずれかの主題が、第１のタイプの要素がカウンタであり、かつ、第２のタイプの要素が状態機械要素であること、を随意に含み得る。
【０１３７】
例３３では、例１〜３２のいずれかの主題が、正規表現が、第１のタイプの要素に対応するタイプであるかどうかを判断すること、および、正規表現が、第１のタイプの要素に対応するタイプではない場合に、正規表現を少なくとも１つの他のタイプの要素にマッピングすること、を随意に含み得る。
【０１３８】
例３４では、例１〜３３のいずれかの主題が、正規表現が、第１のタイプの要素に対応するタイプであるかどうかを判断することが、正規表現が、量化子であるかどうかを判断することを含むこと、および、正規表現が、量化子ではない場合に、正規表現を、少なくとも１つの他のタイプの要素にマッピングすること、を随意に含み得る。
【０１３９】
例３５では、例１〜３４のいずれかの主題が、量化子が決定性であるかどうかを判断すること；量化子が決定性である場合に、正規表現を、第１のタイプの要素にマッピングすること；および、量化子が決定性でない場合に、正規表現を、少なくとも１つの他のタイプの要素にマッピングすること、を随意に含み得る。
【０１４０】
例３６では、例１〜３５のいずれかの主題が、量化子が決定性であるかどうかを判断することが、量化子が処理されている間に、量化子に対する駆動式が一致できるかどうか、および量化子の繰返し式が、量化子の別の繰返し式のプレフィックスであるかどうかを判断することを含むこと、を随意に含み得る。
【０１４１】
例３７では、例１〜３６のいずれかの主題が、コンパイルすることが、構文木を形成するために正規表現を解析すること；構文木をオートマトンに変換すること；オートマトンをネットリストに変換すること；ネットリストのインスタンスを位置づけること；およびネットリストのインスタンス間の接続をルーティングすることを含むこと、を随意に含み得る。
【０１４２】
例３８では、例１〜３７のいずれかの主題が、正規表現が、非構造化データを検索するための基準を含むこと、を随意に含み得る。
【０１４３】
例３９では、例１〜３８のいずれかの主題が、部分が、専用要素にマッピングされるための条件を満足するかどうかを判断することが、その部分が決定性であるかどうかを判断することを含むこと、を随意に含み得る。
【０１４４】
例４０では、例１〜３９のいずれかの主題が、配列の部分を識別することが、量化子を識別することを含み；その部分が決定性であるかどうかを判断することが、量化子が処理されている間に、量化子に対する駆動式が一致できるかどうか、および量化子の繰返し式が、量化子の別の繰返し式のプレフィックスであるかどうかを判断することを含むこと、を随意に含み得る。
【０１４５】
例４１は、請求項１〜請求項４０のいずれかの主題を使用して生成されたイメージによってプログラム化された並列マシンを含む。
【図１】
0005848778.tif 000002
【図２】
0005848778.tif 000003
【図３】
0005848778.tif 000004
【図４】
0005848778.tif 000005
【図５】
0005848778.tif 000006
【図６】
0005848778.tif 000007
【図７】
0005848778.tif 000008
【図８】
0005848778.tif 000009
【図９】
0005848778.tif 000010
【図１０】
0005848778.tif 000011
【図１１】
0005848778.tif 000012
【図１２】
0005848778.tif 000013
【図１３Ａ】
0005848778.tif 000014
【図１３Ｂ】
0005848778.tif 000015
【図１４】
0005848778.tif 000016
【図１５】
0005848778.tif 000017