(57)【要約】【課題】連想配列を扱えないプログラミング言語でのプログラミングで、連想配列に相当するデータ構造をメモリに容易に実装可能なデータ処理装置を提供する。【解決手段】  データ処理装置は、連想配列の宣言を受け付けると第１領域にポインタ配列を生成し、ポインタ配列の存在時に登録指示を受け付けると、第１文字列のハッシュ値を求め、第１文字列を第２領域に格納し登録データを第３領域に格納し、第１文字列のハッシュ値で指定されるポインタ配列の第１要素に第２および３領域を特定するための特定情報を格納し、第１要素に特定情報が格納されている状況で参照指示を受け付けると、第２文字列のハッシュ値を求め、第２文字列のハッシュ値が第１文字列のハッシュ値と同一である場合、第１要素内の特定情報を用いて第１文字列を読み出し、第１文字列が第２文字列と同一である場合、特定情報を用いて登録データを読み出し実行部に送信する【選択図】図１
2011203958.tif 000002
【特許請求の範囲】
【請求項１】
プログラムを実行する実行部と、メモリと、に接続されるデータ処理装置であって、
前記実行部から、連想配列の要素数を表した連想配列の宣言を受け付けると、前記メモリ内の第１領域に、前記要素数以上の要素を有し前記要素を指定する添字が数値であるポインタ配列を生成する生成手段と、
前記ポインタ配列が存在する状況で、前記実行部から、前記連想配列内の特定要素を指定する添字である第１文字列と、前記特定要素に格納される登録データと、を表した登録指示を受け付けると、出力であるハッシュ値が前記ポインタ配列の添字のいずれかとなるハッシュ関数を用いて、前記第１文字列のハッシュ値を求め、かつ、前記第１文字列を前記メモリのうち前記第１領域と異なる第２領域に格納し、かつ、前記登録データを前記メモリのうち前記第１領域とも前記第２領域とも異なる第３領域に格納し、前記第１文字列のハッシュ値で指定される第１要素に、前記第２領域と前記第３領域とを特定するために必要な特定情報を格納する登録手段と、
前記第１要素に前記特定情報が格納されている状況で、前記実行部から、前記連想配列の添字のいずれかである第２文字列を表した参照指示を受け付けると、前記ハッシュ関数を用いて前記第２文字列のハッシュ値を求め、前記第２文字列のハッシュ値が前記第１文字列のハッシュ値と同一である場合、前記第１要素内の特定情報を用いて特定される第２領域から前記第１文字列を読み出し、当該第１文字列が前記第２文字列と同一である場合、前記特定情報を用いて特定される第３領域から前記登録データを読み出し、当該登録データを前記実行部に送信する参照手段と、を含むデータ処理装置。
【請求項２】
請求項１に記載のデータ処理装置において、
前記登録手段は、前記第２領域のアドレスと前記第３領域のアドレスとを、前記メモリのうち前記第１領域とも前記第２領域とも前記第３領域とも異なる第４領域に格納し、前記第４領域のアドレスを、前記特定情報として、前記第１要素に格納し、
前記参照手段は、前記第２文字列のハッシュ値が前記第１文字列のハッシュ値と同一である場合、前記第１要素内の第４領域のアドレスを用いて、前記第４領域から前記第２領域のアドレスを読み出し、当該第２領域のアドレスを用いて、前記第２領域から前記第１文字列を読み出し、当該第１文字列が前記第２文字列と同一である場合、前記第４領域のアドレスを用いて、前記第４領域から前記第３領域のアドレスを読み出し、当該第３領域のアドレスを用いて、前記第３領域から前記登録データを読み出す、データ処理装置。
【請求項３】
請求項１に記載のデータ処理装置において、
前記登録手段は、レコード識別子を、前記第１文字列と前記登録データとに関連づけて、前記メモリのうち前記第１領域とも前記第２領域とも前記第３領域とも異なる第４領域に格納し、かつ、前記レコード識別子を、前記特定情報として、前記第１要素に格納し、
前記参照手段は、前記第２文字列のハッシュ値が前記第１文字列のハッシュ値と同一である場合、前記第１要素内のレコード識別子に関連づけられた第１文字列を前記第２領域から読み出し、当該第１文字列が前記第２文字列と同一である場合、前記レコード識別子に関連づけられた登録データを前記第３領域から読み出す、データ処理装置。
【請求項４】
請求項２に記載のデータ処理装置において、
前記生成手段は、前記連想配列の宣言を受け付けると、前記第１領域を確保し、確保された第１領域に前記ポインタ配列を生成し、
前記登録手段は、前記登録指示を受け付けると、前記第２領域と前記第３領域と前記第４領域とを確保し、確保された第２領域に前記第１文字列を格納し、確保された第３領域に前記登録データを格納し、確保された第４領域に第２領域のアドレスと前記第３領域のアドレスとを格納し、
前記第１領域と前記第２領域と前記第３領域と前記第４領域とが確保されている状況で、前記実行部から、解放指示を受け付けると、前記第１領域と前記第２領域と前記第３領域と前記第４領域とを解放する解放手段を、さらに含むデータ処理装置。
【請求項５】
プログラムを実行する実行部と、メモリと、に接続されるデータ処理装置でのデータ処理方法であって、
前記実行部から、連想配列の要素数を表した連想配列の宣言を受け付けると、前記メモリ内の第１領域に、前記要素数以上の要素を有し前記要素を指定する添字が数値であるポインタ配列を生成する生成ステップと、
前記ポインタ配列が存在する状況で、前記実行部から、前記連想配列内の特定要素を指定する添字である第１文字列と、前記特定要素に格納される登録データと、を表した登録指示を受け付けると、出力であるハッシュ値が前記ポインタ配列の添字のいずれかとなるハッシュ関数を用いて、前記第１文字列のハッシュ値を求め、かつ、前記第１文字列を前記メモリのうち前記第１領域と異なる第２領域に格納し、かつ、前記登録データを前記メモリのうち前記第１領域とも前記第２領域とも異なる第３領域に格納し、前記第１文字列のハッシュ値で指定される第１要素に、前記第２領域と前記第３領域とを特定するために必要な特定情報を格納する登録ステップと、
前記第１要素に前記特定情報が格納されている状況で、前記実行部から、前記連想配列の添字のいずれかである第２文字列を表した参照指示を受け付けると、前記ハッシュ関数を用いて前記第２文字列のハッシュ値を求め、前記第２文字列のハッシュ値が前記第１文字列のハッシュ値と同一である場合、前記第１要素内の特定情報を用いて特定される第２領域から前記第１文字列を読み出し、当該第１文字列が前記第２文字列と同一である場合、前記特定情報を用いて特定される第３領域から前記登録データを読み出し、当該登録データを前記実行部に送信する参照ステップと、を含むデータ処理方法。
【請求項６】
請求項５に記載のデータ処理方法において、
前記登録ステップでは、前記第２領域のアドレスと前記第３領域のアドレスとを、前記メモリのうち前記第１領域とも前記第２領域とも前記第３領域とも異なる第４領域に格納し、前記第４領域のアドレスを、前記特定情報として、前記第１要素に格納し、
前記参照ステップでは、前記第２文字列のハッシュ値が前記第１文字列のハッシュ値と同一である場合、前記第１要素内の第４領域のアドレスを用いて、前記第４領域から前記第２領域のアドレスを読み出し、当該第２領域のアドレスを用いて、前記第２領域から前記第１文字列を読み出し、当該第１文字列が前記第２文字列と同一である場合、前記第４領域のアドレスを用いて、前記第４領域から前記第３領域のアドレスを読み出し、当該第３領域のアドレスを用いて、前記第３領域から前記登録データを読み出す、データ処理方法。
【請求項７】
請求項５に記載のデータ処理方法において、
前記登録ステップでは、レコード識別子を、前記第１文字列と前記登録データとに関連づけて、前記メモリのうち前記第１領域とも前記第２領域とも前記第３領域とも異なる第４領域に格納し、かつ、前記レコード識別子を、前記特定情報として、前記第１要素に格納し、
前記参照ステップでは、前記第２文字列のハッシュ値が前記第１文字列のハッシュ値と同一である場合、前記第１要素内のレコード識別子に関連づけられた第１文字列を前記第２領域から読み出し、当該第１文字列が前記第２文字列と同一である場合、前記レコード識別子に関連づけられた登録データを前記第３領域から読み出す、データ処理方法。
【請求項８】
プログラムを実行する実行部と、メモリと、に接続されるコンピュータに、
前記実行部から、連想配列の要素数を表した連想配列の宣言を受け付けると、前記メモリ内の第１領域に、前記要素数以上の要素を有し前記要素を指定する添字が数値であるポインタ配列を生成する生成手順と、
前記ポインタ配列が存在する状況で、前記実行部から、前記連想配列内の特定要素を指定する添字である第１文字列と、前記特定要素に格納される登録データと、を表した登録指示を受け付けると、出力であるハッシュ値が前記ポインタ配列の添字のいずれかとなるハッシュ関数を用いて、前記第１文字列のハッシュ値を求め、かつ、前記第１文字列を前記メモリのうち前記第１領域と異なる第２領域に格納し、かつ、前記登録データを前記メモリのうち前記第１領域とも前記第２領域とも異なる第３領域に格納し、前記第１文字列のハッシュ値で指定される第１要素に、前記第２領域と前記第３領域とを特定するために必要な特定情報を格納する登録手順と、
前記第１要素に前記特定情報が格納されている状況で、前記実行部から、前記連想配列の添字のいずれかである第２文字列を表した参照指示を受け付けると、前記ハッシュ関数を用いて前記第２文字列のハッシュ値を求め、前記第２文字列のハッシュ値が前記第１文字列のハッシュ値と同一である場合、前記第１要素内の特定情報を用いて特定される第２領域から前記第１文字列を読み出し、当該第１文字列が前記第２文字列と同一である場合、前記特定情報を用いて特定される第３領域から前記登録データを読み出し、当該登録データを前記実行部に送信する参照手順と、を実行させるためのプログラム。
【請求項９】
請求項８に記載のプログラムにおいて、
前記登録手順では、前記第２領域のアドレスと前記第３領域のアドレスとを、前記メモリのうち前記第１領域とも前記第２領域とも前記第３領域とも異なる第４領域に格納し、前記第４領域のアドレスを、前記特定情報として、前記第１要素に格納し、
前記参照手順では、前記第２文字列のハッシュ値が前記第１文字列のハッシュ値と同一である場合、前記第１要素内の第４領域のアドレスを用いて、前記第４領域から前記第２領域のアドレスを読み出し、当該第２領域のアドレスを用いて、前記第２領域から前記第１文字列を読み出し、当該第１文字列が前記第２文字列と同一である場合、前記第４領域のアドレスを用いて、前記第４領域から前記第３領域のアドレスを読み出し、当該第３領域のアドレスを用いて、前記第３領域から前記登録データを読み出す、データ処理方法。
【請求項１０】
請求項８に記載のプログラムにおいて、
前記登録手順では、レコード識別子を、前記第１文字列と前記登録データとに関連づけて、前記メモリのうち前記第１領域とも前記第２領域とも前記第３領域とも異なる第４領域に格納し、かつ、前記レコード識別子を、前記特定情報として、前記第１要素に格納し、
前記参照手順では、前記第２文字列のハッシュ値が前記第１文字列のハッシュ値と同一である場合、前記第１要素内のレコード識別子に関連づけられた第１文字列を前記第２領域から読み出し、当該第１文字列が前記第２文字列と同一である場合、前記レコード識別子に関連づけられた登録データを前記第３領域から読み出す、プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ処理装置、データ処理方法およびプログラムに関する。
【背景技術】
【０００２】
特許文献１には、連想配列を利用して情報処理を行うデータ処理システムが記載されている。連想配列は、オブジェクト指向型言語（例えば、Ｐｅｒｌ）でのプログラミングで使用可能なデータ構造である。連想配列では、添字として“文字列”を使用することができる。
【０００３】
一方、非オブジェクト指向型言語（例えば、Ｃ言語）では、抽象的なデータ構造を扱う概念はなく、非オブジェクト指向型言語でのプログラミングでは、配列の添字として“数値”しか使用できず、“文字列”を配列の添字として使用することはできない。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００７−１１４９７２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
非オブジェクト指向型言語でのプログラミングでは、配列の添字として“文字列”を使用することができない。
【０００６】
このため、非オブジェクト指向型言語でのプログラミングで、つまり、「連想配列」を扱うことができないプログラミング言語でのプログラミングで、「連想配列」に相当するデータ構造を、メモリに容易に実装することができないという課題があった。
【０００７】
例えば、インタプリタ言語であるＰｅｒｌでプログラミングされているプロトタイプのグループウェアを、レスポンス向上を狙い、コンパイル言語であるＣ言語でプログラミングし直す状況で、Ｐｅｒｌで記載されたプログラムに連想配列が使用されていると、非オブジェクト指向型言語であるＣ言語での再プログラミングが非常に困難となる。
【０００８】
本発明の目的は、上述した課題を解決するデータ処理装置、データ処理方法およびプログラムを提供することにある。
【課題を解決するための手段】
【０００９】
本発明のデータ処理装置は、プログラムを実行する実行部と、メモリと、に接続されるデータ処理装置であって、
前記実行部から、連想配列の要素数を表した連想配列の宣言を受け付けると、前記メモリ内の第１領域に、前記要素数以上の要素を有し前記要素を指定する添字が数値であるポインタ配列を生成する生成手段と、
前記ポインタ配列が存在する状況で、前記実行部から、前記連想配列内の特定要素を指定する添字である第１文字列と、前記特定要素に格納される登録データと、を表した登録指示を受け付けると、出力であるハッシュ値が前記ポインタ配列の添字のいずれかとなるハッシュ関数を用いて、前記第１文字列のハッシュ値を求め、かつ、前記第１文字列を前記メモリのうち前記第１領域と異なる第２領域に格納し、かつ、前記登録データを前記メモリのうち前記第１領域とも前記第２領域とも異なる第３領域に格納し、前記第１文字列のハッシュ値で指定される第１要素に、前記第２領域と前記第３領域とを特定するために必要な特定情報を格納する登録手段と、
前記第１要素に前記特定情報が格納されている状況で、前記実行部から、前記連想配列の添字のいずれかである第２文字列を表した参照指示を受け付けると、前記ハッシュ関数を用いて前記第２文字列のハッシュ値を求め、前記第２文字列のハッシュ値が前記第１文字列のハッシュ値と同一である場合、前記第１要素内の特定情報を用いて特定される第２領域から前記第１文字列を読み出し、当該第１文字列が前記第２文字列と同一である場合、前記特定情報を用いて特定される第３領域から前記登録データを読み出し、当該登録データを前記実行部に送信する参照手段と、を含む。
【００１０】
本発明のデータ処理方法は、プログラムを実行する実行部と、メモリと、に接続されるデータ処理装置でのデータ処理方法であって、
前記実行部から、連想配列の要素数を表した連想配列の宣言を受け付けると、前記メモリ内の第１領域に、前記要素数以上の要素を有し前記要素を指定する添字が数値であるポインタ配列を生成する生成ステップと、
前記ポインタ配列が存在する状況で、前記実行部から、前記連想配列内の特定要素を指定する添字である第１文字列と、前記特定要素に格納される登録データと、を表した登録指示を受け付けると、出力であるハッシュ値が前記ポインタ配列の添字のいずれかとなるハッシュ関数を用いて、前記第１文字列のハッシュ値を求め、かつ、前記第１文字列を前記メモリのうち前記第１領域と異なる第２領域に格納し、かつ、前記登録データを前記メモリのうち前記第１領域とも前記第２領域とも異なる第３領域に格納し、前記第１文字列のハッシュ値で指定される第１要素に、前記第２領域と前記第３領域とを特定するために必要な特定情報を格納する登録ステップと、
前記第１要素に前記特定情報が格納されている状況で、前記実行部から、前記連想配列の添字のいずれかである第２文字列を表した参照指示を受け付けると、前記ハッシュ関数を用いて前記第２文字列のハッシュ値を求め、前記第２文字列のハッシュ値が前記第１文字列のハッシュ値と同一である場合、前記第１要素内の特定情報を用いて特定される第２領域から前記第１文字列を読み出し、当該第１文字列が前記第２文字列と同一である場合、前記特定情報を用いて特定される第３領域から前記登録データを読み出し、当該登録データを前記実行部に送信する参照ステップと、を含む。
【００１１】
本発明のプログラムは、プログラムを実行する実行部と、メモリと、に接続されるコンピュータに、
前記実行部から、連想配列の要素数を表した連想配列の宣言を受け付けると、前記メモリ内の第１領域に、前記要素数以上の要素を有し前記要素を指定する添字が数値であるポインタ配列を生成する生成手順と、
前記ポインタ配列が存在する状況で、前記実行部から、前記連想配列内の特定要素を指定する添字である第１文字列と、前記特定要素に格納される登録データと、を表した登録指示を受け付けると、出力であるハッシュ値が前記ポインタ配列の添字のいずれかとなるハッシュ関数を用いて、前記第１文字列のハッシュ値を求め、かつ、前記第１文字列を前記メモリのうち前記第１領域と異なる第２領域に格納し、かつ、前記登録データを前記メモリのうち前記第１領域とも前記第２領域とも異なる第３領域に格納し、前記第１文字列のハッシュ値で指定される第１要素に、前記第２領域と前記第３領域とを特定するために必要な特定情報を格納する登録手順と、
前記第１要素に前記特定情報が格納されている状況で、前記実行部から、前記連想配列の添字のいずれかである第２文字列を表した参照指示を受け付けると、前記ハッシュ関数を用いて前記第２文字列のハッシュ値を求め、前記第２文字列のハッシュ値が前記第１文字列のハッシュ値と同一である場合、前記第１要素内の特定情報を用いて特定される第２領域から前記第１文字列を読み出し、当該第１文字列が前記第２文字列と同一である場合、前記特定情報を用いて特定される第３領域から前記登録データを読み出し、当該登録データを前記実行部に送信する参照手順と、を実行させる。
【発明の効果】
【００１２】
本発明によれば、連想配列を扱えないプログラミング言語でのプログラミングで、連想配列に相当するデータ構造をメモリに容易に実装することが可能になる。
【図面の簡単な説明】
【００１３】
【図１】本発明の第１実施形態のデータ処理装置であるＡＰＩ部１を示したブロック図である。
【図２】連想配列の宣言６ａと登録指示６ｂと参照指示６ｃと解放指示６ｄとが表す情報を示した図である。
【図３】ＡＰＩ部１の機能を機能ブロックで示した機能ブロック図である。
【図４】ＡＰＩ部１が疑似的に「連想配列」をメモリ３に実装するために使用する４種類のデータ（メモリ）構造およびその格納領域を示した図である。
【図５】本発明の第２実施形態のデータ処理装置であるＡＰＩ部１Ａを示したブロック図である。
【図６】ＡＰＩ部１Ａの機能を機能ブロックで示した機能ブロック図である。
【図７】ＲＤＢＭＳと連携したデータ（メモリ）構造の概念を示す図である。
【発明を実施するための形態】
【００１４】
以下、本発明の実施形態について図面を参照して説明する。
【００１５】
（第１実施形態）
図１は、本発明の第１実施形態のデータ処理装置であるＡＰＩ（Application Program Interface）部１を示したブロック図である。ＡＰＩ部１は、例えば、共通ＡＰＩライブラリである。
【００１６】
図１において、ＡＰＩ部１は、プログラムを実行するプログラム実行部２と、メモリ３と、に接続される。ＡＰＩ部１とプログラム実行部２は、コンピュータ４に含まれる。
【００１７】
コンピュータ４は、コンピュータにて読み取り可能な記録媒体５からＡＰＩ部１の動作を規定するプログラムを読み取り、そのプログラムを実行することによってＡＰＩ部１として機能する。記録媒体５は、例えば、ＣＤ−ＲＯＭ（Compact Disk Read Only Memory）である。なお、記録媒体５は、ＣＤ−ＲＯＭに限らず適宜変更可能である。
【００１８】
また、コンピュータ４は、プログラム実行部２の動作を規定するプログラム６を読み取り、プログラム６を実行することによってプログラム実行部２としても機能する。
【００１９】
プログラム６は、連想配列を扱うことができないプログラミング言語（例えば、Ｃ言語）で記述されたプログラムである。本実施形態では、ＡＰＩ部１の動作を規定するプログラムも、プログラム６の記述に用いられたプログラミング言語で記述されている。
【００２０】
プログラム６には、連想配列の宣言６ａと、登録指示６ｂと、参照指示６ｃと、解放指示６ｄとが、少なくとも記述されている。なお、連想配列の宣言６ａと登録指示６ｂと参照指示６ｃと解放指示６ｄとを表す記述としては、例えば、連想配列を扱うことができるプログラミング言語（例えば、Ｐｅｒｌ）で使われる記述が使用されてもよいし、新たに規定された記述が使用されてもよい。
【００２１】
図２は、連想配列の宣言６ａと登録指示６ｂと参照指示６ｃと解放指示６ｄとが表す情報を示した図である。
【００２２】
図２において、連想配列の宣言６ａには、連想配列の識別子（名称）（以下「識別子」と称する）６ａ１と、連想配列の要素数６ａ２と、が表される。
【００２３】
連想配列の要素数６ａ２は、連想配列で扱うデータ最大数であり、引数を用いて指定される。以下、連想配列の要素数６ａ２を「データ最大数」とも称する。
【００２４】
登録指示６ｂには、識別子６ｂ１と、登録キー６ｂ２と、登録データ６ｂ３と、登録キーのデータサイズ６ｂ４と、登録データのデータサイズ６ｂ５と、が表される。識別子６ｂ１と登録キー６ｂ２と登録データ６ｂ３と登録キーのデータサイズ６ｂ４と登録データのデータサイズ６ｂ５とは、それぞれ、引数を用いて指定される。
【００２５】
登録キー６ｂ２は、一般的に第１文字列と呼ぶことができる。登録キー６ｂ２は、文字列であり、識別子６ｂ１で識別される連想配列内の特定要素を指定する添字である。
【００２６】
登録データ６ｂ３は、識別子６ｂ１で識別される連想配列に格納されるデータのうち、登録キー６ｂ２で指定される特定要素に格納されるデータである。
【００２７】
参照指示６ｃには、識別子６ｃ１と登録キー６ｃ２が表される。識別子６ｃ１と登録キー６ｃ２とは、それぞれ、引数を用いて指定される。
【００２８】
登録キー６ｃ２は、一般的に第２文字列と呼ぶことができる。登録キー６ｃ２は、文字列であり、識別子６ｃ１で識別される連想配列の添字のいずれかである。
【００２９】
解放指示６ｄには、識別子６ｄ１が表される。
【００３０】
図１に示したプログラム実行部２は、連想配列の宣言６ａをＡＰＩ部１に渡し、ＡＰＩ部１に連想配列の宣言６ａを実行させる。また、プログラム実行部２は、登録指示６ｂをＡＰＩ部１に渡し、ＡＰＩ部１に登録指示６ｂを実行させる。また、プログラム実行部２は、参照指示６ｃをＡＰＩ部１に渡し、ＡＰＩ部１に参照指示６ｃを実行させる。また、プログラム実行部２は、解放指示６ｄをＡＰＩ部１に渡し、ＡＰＩ部１に解放指示６ｄを実行させる。
【００３１】
ＡＰＩ部１は、連想配列に相当するデータ構造をメモリ３に実装する。
【００３２】
図３は、ＡＰＩ部１の機能を機能ブロックで示した機能ブロック図である。
【００３３】
図３において、ＡＰＩ部１は、配列初期化部１１と、データ登録部１２と、データ参照部１３と、配列解放部１４と、を含む。
【００３４】
図４は、ＡＰＩ部１が疑似的に「連想配列」をメモリ３に実装するために使用する４種類のデータ（メモリ）構造およびその格納領域（登録キー格納領域３ａと、登録データ格納領域３ｂと、データ指標格納領域３ｃと、ポインタ配列格納領域３ｄ）を示した図である。
【００３５】
以下、登録キー格納領域３ａと、登録データ格納領域３ｂと、データ指標格納領域３ｃと、ポインタ配列格納領域３ｄについて説明する。
【００３６】
（１）登録キー格納領域３ａ
登録キー格納領域３ａは、登録キー６ｂ２（図２参照）を格納する領域である。
【００３７】
ＡＰＩ部１（具体的には、データ登録部１２）は、登録キーのデータサイズ６ｂ４（図２参照）に示されたサイズの領域を、登録キー格納領域３ａとしてメモリ３に動的に確保する。ＡＰＩ部１（具体的には、データ登録部１２）は、動的に確保された登録キー格納領域３ａに、登録キー６ｂ２を格納する。登録キー６ｂ２が格納された登録キー格納領域３ａの先頭アドレスは、データ指標格納領域３ｃ内のデータ指標３ｃ１または３ｃ１ａで管理される。
【００３８】
（２）登録データ格納領域３ｂ
登録データ格納領域３ｂは、登録データ６ｂ３（図２参照）を格納する領域である。
【００３９】
ＡＰＩ部１（具体的には、データ登録部１２）は、登録データのデータサイズ６ｂ５に示されたサイズの領域を、登録データ格納領域３ｂとしてメモリ３に動的に確保する。ＡＰＩ部１（具体的には、データ登録部１２）は、動的に確保された登録データ格納領域３ｂに、登録データ６ｂ３を格納する。登録データ６ｂ３が格納された登録データ格納領域３ｂの先頭アドレスは、データ指標格納領域３ｃ内のデータ指標３ｃ１または３ｃ１ａで管理される。
【００４０】
（３）データ指標格納領域３ｃ
データ指標格納領域３ｃは、データ指標３ｃ１または３ｃ１ａを格納する領域である。データ指標３ｃ１または３ｃ１ａは、登録キー６ｂ２が格納された登録キー格納領域３ａの先頭アドレスと、登録データ６ｂ３が格納された登録データ格納領域３ｂの先頭アドレスと、を保持するポインタ配列である。
【００４１】
ＡＰＩ部１（具体的には、データ登録部１２）は、登録指示６ｂを受け付けると、３つの要素を有するデータ指標３ｃ１または３ｃ１ａを格納するためのデータ指標格納領域３ｃを、メモリ３に確保する。ＡＰＩ部１（具体的には、データ登録部１２）は、確保されたデータ指標格納領域３ｃに、３つの要素を有するデータ指標３ｃ１または３ｃ１ａを格納する。
【００４２】
データ指標３ｃ１および３ｃ１ａが有する３つの要素のうちの１つ目の要素（図４では、３つの要素のうちの一番上の要素）は、登録キー格納領域３ａの先頭アドレスを格納するために使用される。
【００４３】
データ指標３ｃ１および３ｃ１ａが有する３つの要素のうちの２つ目の要素（図４では、３つの要素のうちの中間の要素）は、登録データ格納領域３ｂの先頭アドレスを格納するために使用される。
【００４４】
データ指標３ｃ１が有する３つの要素のうちの３つ目の要素（図４では、３つの要素のうちの一番下の要素）は、後述するように、登録キー６ｂ２のハッシュ値が衝突した場合に新たに生成されるデータ指標３ｃ１ａを格納したデータ指標格納領域３ｃの先頭アドレスを保持するために使用される。
【００４５】
（４）ポインタ配列格納領域３ｄ
ポインタ配列格納領域３ｄは、データ指標格納領域３ｃの先頭アドレスを保持するポインタ配列３ｄ１を格納する領域である。
【００４６】
ＡＰＩ部１（具体的には、配列初期化部１１）は、連想配列の宣言６ａを受け付けると、連想配列の宣言６ａに表されたデータ最大数６ａ２以上（例えば、データ最大数の約３０％増）の要素数を有するポインタ配列３ｄ１を格納するためのポインタ配列格納領域３ｄを、メモリ３に確保する。ＡＰＩ部１（具体的には、配列初期化部１１）は、確保されたポインタ配列格納領域３ｄに、ポインタ配列３ｄ１を格納する。
【００４７】
ポインタ配列３ｄ１では、ポインタ配列３ｄ１の要素を指定する添字として、数値が用いられる。ポインタ配列３ｄ１の添字としては、「０」から「ポインタ配列３ｄ１の要素数−１」までの整数（数値）が用いられる。また、ポインタ配列３ｄ１は、識別子６ａ１を有する。
【００４８】
図３に示した配列初期化部１１は、一般的に生成手段と呼ぶことができる。
【００４９】
配列初期化部１１は、プログラム実行部２から連想配列の宣言６ａを受け付ける。配列初期化部１１は、連想配列の宣言６ａを受け付けると、データ最大数６ａ２以上の要素数を有するポインタ配列３ｄ１を格納するためのポインタ配列格納領域３ｄをメモリ３に確保する。ポインタ配列格納領域３ｄは、一般的に第１領域と呼ぶことができる。
【００５０】
配列初期化部１１は、ポインタ配列格納領域３ｄを確保すると、データ最大数６ａ２以上の要素数を有するポインタ配列３ｄ１を生成し、ポインタ配列格納領域３ｄにポインタ配列３ｄ１を格納する。
【００５１】
データ登録部１２は、一般的に登録手段と呼ぶことができる。
【００５２】
データ登録部１２は、ポインタ配列３ｄ１が存在する状況で、プログラム実行部２から、登録指示６ｂを受け付けると、ハッシュ関数を用いて、登録キー６ｂ２のハッシュ値（以下「第１ハッシュ値」と称する）を求める。以下、第１ハッシュ値を生成するために使用したハッシュ関数を「特定ハッシュ関数」と称する。特定ハッシュ関数は、ポインタ配列３ｄ１の添字が示す範囲内の整数を出力する。換言すると、特定ハッシュ関数の出力となるハッシュ値は、ポインタ配列３ｄ１の添字のいずれかとなる。第１ハッシュ値は、一般的に第１添字と呼ぶことができる。
【００５３】
また、データ登録部１２は、登録キーのデータサイズ６ｂ４に示されたサイズの領域を、登録キー格納領域３ａとしてメモリ３に動的に確保する。登録キー格納領域３ａは、ポインタ配列格納領域３ｄと異なる領域であり、一般的に第２領域と呼ぶことができる。
【００５４】
データ登録部１２は、動的に確保された登録キー格納領域３ａに、登録キー６ｂ２を格納する。
【００５５】
また、データ登録部１２は、登録データのデータサイズ６ｂ５に示されたサイズの領域を、登録データ格納領域３ｂとしてメモリ３に動的に確保する。登録データ格納領域３ｂは、ポインタ配列格納領域３ｄとも登録キー格納領域３ａとも異なる領域であり、一般的に第３領域と呼ぶことができる。
【００５６】
データ登録部１２は、動的に確保された登録データ格納領域３ｂに、登録データ６ｂ３を格納する。
【００５７】
また、データ登録部１２は、ポインタ配列３ｄ１内の要素のうち、第１ハッシュ値で指定される要素（以下「第１要素」と称する）に、登録キー格納領域３ａと登録データ格納領域３ｂとを特定するために必要な特定情報を格納する。
【００５８】
本実施形態では、データ登録部１２は、データ指標３ｃ１を格納するためのデータ指標格納領域３ｃをメモリ３に確保し、確保されたデータ指標格納領域３ｃに、データ指標３ｃ１を格納する。データ指標格納領域３ｃは、ポインタ配列格納領域３ｄとも登録キー格納領域３ａとも登録データ格納領域３ｂとも異なる領域であり、一般的に第４領域と呼ぶことができる。
【００５９】
データ登録部１２は、登録キー格納領域３ａの先頭アドレスをデータ指標３ｃ１の１つ目の要素に格納し、登録データ格納領域３ｂの先頭アドレスをデータ指標３ｃ１の２つ目の要素に格納する。
【００６０】
データ登録部１２は、データ指標格納領域３ｃの先頭アドレスを、第１ハッシュ値で指定される要素（第１要素）に、特定情報として格納する。
【００６１】
データ参照部１３は、一般的に参照手段と呼ぶことができる。
【００６２】
データ参照部１３は、ポインタ配列３ｄ１が存在する状況で、プログラム実行部２から、参照指示６ｃを受け付けると、特定ハッシュ関数を用いて、登録キー６ｃ２のハッシュ値（以下「第２ハッシュ値」と称する）を求める。
【００６３】
データ参照部１３は、第２ハッシュ値が第１ハッシュ値と同一である場合、第１要素内の特定情報を用いて特定される登録キー格納領域３ａから登録キー６ｂ２を読み出す。
【００６４】
データ参照部１３は、登録キー６ｂ２が登録キー６ｃ２と同一である場合、第１要素内の特定情報を用いて特定される登録データ格納領域３ｂから登録データ６ｂ３を読み出し、登録データ６ｂ３をプログラム実行部２に送信する。
【００６５】
本実施形態では、データ参照部１３は、第２ハッシュ値が第１ハッシュ値と同一である場合、第１要素内のデータ指標格納領域３ｃの先頭アドレスを用いて、データ指標格納領域３ｃ内のデータ指標３ｃ１から、登録キー格納領域３ａの先頭アドレスを読み出す。
【００６６】
データ参照部１３は、登録キー格納領域３ａの先頭アドレスを用いて、登録キー格納領域３ａから登録キー６ｂ２を読み出す。
【００６７】
データ参照部１３は、登録キー６ｂ２が登録キー６ｃ２と同一である場合、第１要素内のデータ指標格納領域３ｃの先頭アドレスを用いて、データ指標格納領域３ｃ内のデータ指標３ｃ１から、登録データ格納領域３ｂの先頭アドレスを読み出す。
【００６８】
データ参照部１３は、登録データ格納領域３ｂの先頭アドレスを用いて、登録データ格納領域３ｂから登録データ６ｂ３を読み出す。データ参照部１３は、登録データ６ｂ３をプログラム実行部２に送信する。
【００６９】
配列解放部１４は、一般的に解放手段と呼ぶことができる。
【００７０】
配列解放部１４は、ポインタ配列格納領域３ｄと、登録キー格納領域３ａと、登録データ格納領域３ｂと、データ指標格納領域３ｃとが確保されている状況で、プログラム実行部２から、解放指示６ｄを受け付けると、ポインタ配列格納領域３ｄと、データ指標格納領域３ｃと、登録キー格納領域３ａと、登録データ格納領域３ｂと、を解放する。
【００７１】
次に、ＡＰＩ部１の動作を説明する。
【００７２】
プログラム実行部２が、ＡＰＩ部１に連想配列の宣言６ａを出力すると、配列初期化部１１が、連想配列の宣言６ａを受け付ける。配列初期化部１１は、連想配列の宣言６ａを受け付けると、ポインタ配列格納領域３ｄをメモリ３に確保する。
【００７３】
配列初期化部１１は、ポインタ配列格納領域３ｄを確保すると、ポインタ配列３ｄ１を生成し、ポインタ配列格納領域３ｄにポインタ配列３ｄ１を格納する。
【００７４】
その後、プログラム実行部２が、ＡＰＩ部１に登録指示６ｂを出力すると、データ登録部１２が、登録指示６ｂを受け付ける。
【００７５】
データ登録部１２は、登録指示６ｂを受け付けると、登録キー６ｂ２をコピーし、コピーの登録キー６ｂ２を特定ハッシュ関数で第１ハッシュ値に変換する。
【００７６】
続いて、データ登録部１２は、ポインタ配列３ｄ１の要素のうち、第１ハッシュ値を示す添字で指定される第１要素が、未使用であるかを判断する。
【００７７】
データ登録部１２は、第１要素が未使用である場合（第１要素にデータ指標格納領域３ｃの先頭アドレスが格納されていない場合）、データ指標３ｃ１を宣言して、メモリ３上にデータ指標格納領域３ｃを確保し、データ指標格納領域３ｃにデータ指標３ｃ１を格納する。
【００７８】
続いて、データ登録部１２は、データ指標格納領域３ｃの先頭アドレスを、ポインタ配列３ｄ１内の第１要素に格納する。
【００７９】
続いて、データ登録部１２は、登録キーのデータサイズ６ｂ４に示されたサイズの領域を、登録キー格納領域３ａとしてメモリ３に動的に確保する。
【００８０】
続いて、データ登録部１２は、動的に確保された登録キー格納領域３ａに、登録キー６ｂ２を格納する。
【００８１】
続いて、データ登録部１２は、登録データのデータサイズ６ｂ５に示されたサイズの領域を、登録データ格納領域３ｂとしてメモリ３に動的に確保する。
【００８２】
続いて、データ登録部１２は、動的に確保された登録データ格納領域３ｂに、登録データ６ｂ３を格納する。
【００８３】
続いて、データ登録部１２は、登録キー格納領域３ａの先頭アドレスをデータ指標３ｃ１の１つ目の要素に格納し、登録データ格納領域３ｂの先頭アドレスをデータ指標３ｃ１の２つ目の要素に格納する（図４参照）。
【００８４】
一方、第１要素が既に使用されている場合（第１要素にデータ指標格納領域３ｃの先頭アドレスが格納されている場合）、データ登録部１２は、第１要素に格納されているデータ指標格納領域３ｃの先頭アドレスを用いて、データ指標３ｃ１を特定する。
【００８５】
続いて、データ登録部１２は、特定されたデータ指標３ｃ１（以下「データ指標３ｃ１１」と称する）に格納されている登録キー格納領域３ａの先頭アドレスを用いて、登録キー格納領域３ａ内の登録キー６ｂ２を読み出す。
【００８６】
続いて、データ登録部１２は、登録キー格納領域３ａから読み出された登録キー６ｂ２（以下「登録キー６ｂ２ａ」と称する）が、登録指示６ｂに表された登録キー６ｂ２（以下「登録キー６ｂ２ｂ」と称する）と一致するかを判断する。
【００８７】
登録キー６ｂ２ａが登録キー６ｂ２ｂと一致（同値）である場合、データ登録部１２は、データ指標３ｃ１１に格納されている登録データ格納領域３ｂの先頭アドレスを先頭とし、先頭から、登録データのデータサイズ６ｂ５で示されたサイズの領域を、登録データ格納領域３ｂとして再確保する。
【００８８】
続いて、データ登録部１２は、再確保された登録データ格納領域３ｂに、登録データ６ｂ３を格納する。
【００８９】
続いて、データ登録部１２は、再確保された登録データ格納領域３ｂの先頭アドレスを、データ指標３ｃ１１に格納する（図４参照）。
【００９０】
一方、登録キー６ｂ２ａが登録キー６ｂ２ｂと一致（同値）でない場合、データ登録部１２は、データ指標３ｃ１ａを宣言して、メモリ３上に新たにデータ指標格納領域３ｃを確保し、新たに確保されたデータ指標格納領域３ｃにデータ指標３ｃ１ａを格納する。
【００９１】
続いて、データ登録部１２は、新たに確保されたデータ指標格納領域３ｃの先頭アドレスを、データ指標３ｃ１１の３つ目の要素に格納する（図４参照）。
【００９２】
続いて、データ登録部１２は、登録キーのデータサイズ６ｂ４に示されたサイズの領域を、新たな登録キー格納領域３ａとしてメモリ３に動的に確保する。
【００９３】
続いて、データ登録部１２は、新たな登録キー格納領域３ａに、登録キー６ｂ２を格納する。
【００９４】
続いて、データ登録部１２は、登録データのデータサイズ６ｂ５に示されたサイズの領域を、新たな登録データ格納領域３ｂとしてメモリ３に動的に確保する。
【００９５】
続いて、データ登録部１２は、新たな登録データ格納領域３ｂに、登録データ６ｂ３を格納する。
【００９６】
続いて、データ登録部１２は、新たな登録キー格納領域３ａの先頭アドレスを、データ指標３ｃ１ａの１つ目の要素に格納し、新たな登録データ格納領域３ｂの先頭アドレスを、データ指標３ｃ１ａの２つ目の要素に格納する（図４参照）。
【００９７】
その後、プログラム実行部２が、ＡＰＩ部１に参照指示６ｃを出力すると、データ参照部１３が、参照指示６ｃを受け付ける。
【００９８】
データ参照部１３は、参照指示６ｃを受け付けると、登録キー６ｃ２をコピーし、コピーの登録キー６ｃ２を特定ハッシュ関数で第２ハッシュ値に変換する。
【００９９】
続いて、データ参照部１３は、第２ハッシュ値を示す添字で指定される所定要素が、未使用であるかを判断する。
【０１００】
データ参照部１３は、所定要素が未使用である場合（所定要素にデータ指標格納領域３ｃの先頭アドレスが格納されていない場合）、データ未登録を示す戻値をプログラム実行部２に返却する。
【０１０１】
一方、所定要素が既に使用されている場合（所定要素にデータ指標格納領域３ｃの先頭アドレスが格納されている場合）、つまり、第２ハッシュ値が第１ハッシュ値と同一である場合、データ参照部１３は、所定要素に格納されているデータ指標格納領域３ｃの先頭アドレスを用いて、データ指標３ｃ１を特定する。
【０１０２】
続いて、データ参照部１３は、特定されたデータ指標３ｃ１（以下「データ指標３ｃ１２」と称する）に格納されている登録キー格納領域３ａの先頭アドレスを用いて、登録キー格納領域３ａ内の登録キー６ｂ２を読み出す。
【０１０３】
続いて、データ参照部１３は、登録キー格納領域３ａから読み出された登録キー６ｂ２が、参照指示６ｃに表された登録キー６ｃ２と一致するかを判断する。
【０１０４】
登録キー６ｂ２が登録キー６ｃ２と一致（同値）である場合、データ参照部１３は、データ指標３ｃ１２に格納されている登録データ格納領域３ｂの先頭アドレスを用いて、登録データ格納領域３ｂから登録データ６ｂ３を読み出し、読み出された登録データ６ｂ３をプログラム実行部２に返却する。
【０１０５】
一方、登録キー６ｂ２が登録キー６ｃ２と一致（同値）でない場合、データ参照部１３は、データ指標３ｃ１２の３つ目の要素が未使用であるかを判断する。
【０１０６】
データ指標３ｃ１２の３つ目の要素が未使用である場合（データ指標３ｃ１２の３つ目の要素に、データ指標３ｃ１ａを格納しているデータ指標格納領域３ｃの先頭アドレスが格納されていない場合）、データ参照部１３は、データ未登録を示す戻値をプログラム実行部２に返却する。
【０１０７】
一方、データ指標３ｃ１２の３つ目の要素が使用されている場合（データ指標３ｃ１２の３つ目の要素に、データ指標３ｃ１ａを格納しているデータ指標格納領域３ｃの先頭アドレスが格納されている場合）、データ参照部１３は、データ指標３ｃ１２の３つ目の要素内のデータ指標格納領域３ｃの先頭アドレスを用いて、データ指標３ｃ１ａを特定する。
【０１０８】
続いて、データ参照部１３は、特定されたデータ指標３ｃ１ａ（以下「データ指標３ｃ１ａ２」と称する）に格納されている登録キー格納領域３ａの先頭アドレスを用いて、登録キー格納領域３ａ内の登録キー６ｂ２を読み出す。
【０１０９】
続いて、データ参照部１３は、登録キー格納領域３ａから読み出された登録キー６ｂ２が、参照指示６ｃに表された登録キー６ｃ２と一致するかを判断する。
【０１１０】
登録キー６ｂ２が登録キー６ｃ２と一致（同値）である場合、データ参照部１３は、データ指標３ｃ１ａ２に格納されている登録データ格納領域３ｂの先頭アドレスを用いて、登録データ格納領域３ｂから登録データ６ｂ３を読み出し、読み出された登録データ６ｂ３をプログラム実行部２に返却する。
【０１１１】
一方、登録キー６ｂ２が登録キー６ｃ２と一致（同値）でない場合、データ指標３ｃ１ａ２の３つ目の要素が未使用であるかを判断する。
【０１１２】
データ指標３ｃ１ａ２の３つ目の要素が未使用である場合、データ参照部１３は、データ未登録を示す戻値をプログラム実行部２に返却する。
【０１１３】
データ指標３ｃ１ａ２の３つ目の要素が使用されている場合、データ参照部１３は、データ指標３ｃ１ａ２の３つ目の要素内の情報を用いて上記と同様の動作を行う。
【０１１４】
その後、プログラム実行部２が、ＡＰＩ部１に解放指示６ｄを出力すると、配列解放部１４が、解放指示６ｄを受け付ける。配列解放部１４は、解放指示６ｄを受け付けると、ポインタ配列格納領域３ｄと、データ指標格納領域３ｃと、登録キー格納領域３ａと、登録データ格納領域３ｂと、を解放する。
【０１１５】
本実施形態によれば、配列初期化部１１は、プログラム実行部２から連想配列の宣言６ａを受け付ける。配列初期化部１１は、連想配列の宣言６ａを受け付けると、ポインタ配列格納領域３ｄをメモリ３に確保する。配列初期化部１１は、ポインタ配列格納領域３ｄを確保すると、ポインタ配列３ｄ１を生成し、ポインタ配列格納領域３ｄにポインタ配列３ｄ１を格納する。
【０１１６】
データ登録部１２は、ポインタ配列３ｄ１が存在する状況で、プログラム実行部２から、登録指示６ｂを受け付けると、特定ハッシュ関数を用いて登録キー６ｂ２のハッシュ値（第１ハッシュ値）を求め、かつ、登録キー６ｂ２を登録キー格納領域３ａに格納し、かつ、登録データ６ｂ３を登録データ格納領域３ｂに格納する。
【０１１７】
データ登録部１２は、ポインタ配列３ｄ１の要素のうち、第１ハッシュ値で指定される第１要素に、登録キー格納領域３ａと登録データ格納領域３ｂとを特定するために必要な特定情報を格納する。
【０１１８】
データ参照部１３は、第１要素に特定情報が格納されている状況で、プログラム実行部２から参照指示６ｃを受け付けると、特定ハッシュ関数を用いて登録キー６ｃ２のハッシュ値（第２ハッシュ値）を求める。
【０１１９】
データ参照部１３は、第２ハッシュ値が第１ハッシュ値と同一である場合、第１要素内の特定情報を用いて特定される登録キー格納領域３ａから登録キー６ｂ２を読み出し、登録キー６ｂ２が登録キー６ｃ２と同一である場合、特定情報を用いて特定される登録データ格納領域３ｂから登録データ６ｂ３を読み出し、登録データ６ｂ３をプログラム実行部２に送信する。
【０１２０】
このため、メモリ３に、疑似的に「連想配列」が実装される。よって、非オブジェクト指向型言語でのプログラミングで「連想配列」を容易に扱えるようになる。
【０１２１】
例えば、社員データを格納する配列を宣言したとする。
【０１２２】
従来は、社員[0]、社員[1]、社員[2] 。。。というように線形リストで扱うしかないが、本実施形態によれば、社員["山内"] というようにダイレクトにデータを参照、更新することができるようになる。
【０１２３】
また抽象的なデータ構造を扱うシステムを非オブジェクト指向型言語でプログラミングする際には、ＡＰＩ部１を汎用できるため生産性の向上が見込める。
【０１２４】
また、特定ハッシュ関数によってハッシュ値の衝突が起こっても、正しい登録データを参照することが可能になる。
【０１２５】
本実施形態では、データ登録部１２は、登録キー格納領域３ａのアドレスと登録データ格納領域３ｂのアドレスとを、データ指標３ｃ１に格納し、データ指標３ｃ１の格納領域のアドレスを、特定情報として、第１要素に格納する。
【０１２６】
また、データ参照部１３は、第２ハッシュ値が第１ハッシュ値と同一である場合、第１要素内のデータ指標３ｃ１の格納領域のアドレスを用いて、データ指標３ｃ１から登録キー格納領域３ａのアドレスを読み出し、登録キー格納領域３ａのアドレスを用いて、登録キー格納領域３ａから登録キー６ｂ２を読み出す。
【０１２７】
データ参照部１３は、登録キー６ｂ２が登録キー６ｃ２と同一である場合、第１要素内のデータ指標３ｃ１の格納領域のアドレスを用いて、データ指標３ｃ１から登録データ格納領域３ｂのアドレスを読み出し、登録データ格納領域３ｂのアドレスを用いて、登録データ格納領域３ｂから登録データ６ｂ３を読み出す。
【０１２８】
この場合、データ指標を用いて、登録キーおよび登録データを管理することが可能になる。
【０１２９】
また、本実施形態では、配列解放部１４は、プログラム実行部２から、解放指示６ｄを受け付けると、ポインタ配列格納領域３ｄと、データ指標格納領域３ｃと、登録キー格納領域３ａと、登録データ格納領域３ｂと、を解放する。
【０１３０】
この場合、メモリの解放を容易に行うことが可能になる。
【０１３１】
（第２実施形態）
次に、第２実施形態を説明する。
【０１３２】
図５は、本発明の第２実施形態のデータ処理装置であるＡＰＩ部１Ａを示したブロック図である。ＡＰＩ部１Ａは、例えば、共通ＡＰＩライブラリである。図５において、図１に示したものと同一構成のものには同一符号を付してある。
【０１３３】
コンピュータ４は、記録媒体５からＡＰＩ部１Ａの動作を規定するプログラムを読み取り、そのプログラムを実行することによってＡＰＩ部１Ａとして機能する。
【０１３４】
第２実施形態では、メモリ確保およびメモリアドレスを参照できない非オブジェクト指向型言語で記載されたプログラムを実行する際に、ＡＰＩ部１Ａが、リレーショナルデータベースを管理するソフトウェア（ＲＤＢＭＳ：Relational DataBase Management System）と連携することで、擬似的に連想配列をメモリ３に実装する。
【０１３５】
図６は、ＡＰＩ部１Ａの機能を機能ブロックで示した機能ブロック図である。図６において、ＡＰＩ部１Ａは、配列初期化部１１と、データ登録部１２Ａと、データ参照部１３Ａと、配列解放部１４Ａと、を含む。図６において、図３に示したものと同一機能のものには同一符号を付してある。
【０１３６】
図７は、ＲＤＢＭＳと連携したデータ（メモリ）構造の概念を示す図である。図７において、図４に示したものと同一のものには同一符号を付してある。
【０１３７】
次に、ＡＰＩ部１Ａの動作を説明する。
【０１３８】
プログラム実行部２が、ＡＰＩ部１Ａに連想配列の宣言６ａを出力すると、配列初期化部１１が、連想配列の宣言６ａを受け付ける。配列初期化部１１は、連想配列の宣言６ａを受け付けると、ポインタ配列格納領域３ｄをメモリ３に確保する
配列初期化部１１は、ポインタ配列格納領域３ｄを確保すると、ポインタ配列３ｄ１を生成し、ポインタ配列格納領域３ｄにポインタ配列３ｄ１を格納する。
【０１３９】
その後、プログラム実行部２が、ＡＰＩ部１Ａに登録指示６ｂＡを出力すると、データ登録部１２Ａが、登録指示６ｂＡを受け付ける。なお、登録指示６ｂＡは、図２に示した登録指示６ｂから、登録キーのデータサイズ６ｂ４と登録データのデータサイズ６ｂ５を除いたものである。
【０１４０】
データ登録部１２Ａは、登録指示６ｂＡを受け付けると、登録キー６ｂ２をコピーし、コピーの登録キー６ｂ２を特定ハッシュ関数で第１ハッシュ値に変換する。
【０１４１】
続いて、データ登録部１２Ａは、ポインタ配列３ｄ１の要素のうち、第１ハッシュ値を示す添字で指定される第１要素が、未使用であるかを判断する。
【０１４２】
データ登録部１２Ａは、第１要素が未使用である場合、登録キー６ｂ２と登録データ６ｂ３とレコード識別子とを有する登録レコードを生成し、登録レコードを、メモリ３内のデータ登録テーブル３ｅに格納する。なお、レコード識別子は、キー項目および枝番である。第１要素が未使用である場合、枝番として「１」が用いられる。
【０１４３】
データ登録部１２Ａは、登録レコードのキー項目の値を、特定情報として、第１要素に格納する。
【０１４４】
一方、第１要素が既に使用されている場合（第１要素にキー項目の値が格納されている場合）、データ登録部１２Ａは、データ登録テーブル３ｅを検索して、第１要素に格納されているキー項目の値を有する登録レコードのうち、登録キー６ｂ２を有する該当レコードがあるかを判断する。
【０１４５】
該当レコードがある場合、データ登録部１２Ａは、該当レコード内の登録データを、登録指示６ｂＡ内の登録データ６ｂ３に更新する。
【０１４６】
該当レコードがない場合、データ登録部１２Ａは、登録キー６ｂ２と登録データ６ｂ３とレコード識別子とを有する新たな登録レコードを生成し、新たな登録レコードを、メモリ３内のデータ登録テーブル３ｅに格納する。
【０１４７】
なお、新たな登録レコードのキー項目は、第１要素に格納されているキー項目の値を示す。
【０１４８】
また、新たな登録レコードの枝番は、第１要素に格納されているキー項目の値を示す既存の登録レコード内の枝番よりも大きい数値に設定される。
【０１４９】
その後、プログラム実行部２が、ＡＰＩ部１Ａに参照指示６ｃを出力すると、データ参照部１３Ａが、参照指示６ｃを受け付ける。
【０１５０】
データ参照部１３Ａは、参照指示６ｃを受け付けると、登録キー６ｃ２をコピーし、コピーの登録キー６ｃ２を特定ハッシュ関数で第２ハッシュ値に変換する。
【０１５１】
続いて、データ参照部１３Ａは、第２ハッシュ値を示す添字で指定される所定要素が、未使用であるかを判断する。
【０１５２】
データ参照部１３Ａは、所定要素が未使用である場合（所定要素にキー項目の値が格納されていない場合）、データ未登録を示す戻値をプログラム実行部２に返却する。
【０１５３】
一方、所定要素が既に使用されている場合（所定要素にキー項目の値が格納されている場合）、つまり、第２ハッシュ値が第１ハッシュ値と同一である場合、データ参照部１３Ａは、データ登録テーブル３ｅを検索して、所定要素に格納されているキー項目の値を有する登録レコードのうち、登録キー６ｃ２を有する参照レコードがあるかを判断する。
【０１５４】
参照レコードがある場合、データ参照部１３Ａは、参照レコード内の登録データ６ｂ３を読み出し、読み出された登録データ６ｂ３をプログラム実行部２に返却する。
【０１５５】
一方、参照レコードがない場合、データ参照部１３Ａは、データ未登録を示す戻値をプログラム実行部２に返却する。
【０１５６】
その後、プログラム実行部２は、プログラム６Ａの終了を検出すると、プログラムが終了した旨の終了情報を、ＡＰＩ部１Ａに出力する。配列解放部１４Ａは、終了情報を受け付ける。
【０１５７】
配列解放部１４Ａは、終了情報を受け付けると、データ登録テーブル３ｅ内の登録レコードを消去する。
【０１５８】
本実施形態によれば、データ登録部１２Ａは、レコード識別子（キー項目の値）を、登録キー６ｂ２と登録データ６ｂ３とに関連づけて、データ登録テーブル３ｅ内のキー項目の欄に格納し、レコード識別子（キー項目の値）を、特定情報として、第１要素に格納する。
【０１５９】
データ参照部１３Ａは、第１ハッシュ値と第２ハッシュ値とが同一である場合、第１要素内のレコード識別子に関連づけられた登録キー６ｂ２をデータ登録テーブル３ｅ内の登録キーの欄から読み出し、その登録キー６ｂ２が登録キー６ｃ２と同一である場合、レコード識別子に関連づけられた登録データ６ｂ３をデータ登録テーブル３ｅ内の登録データの欄から読み出す。
【０１６０】
このため、メモリ確保およびメモリアドレスを参照できない非オブジェクト指向型言語で記載されたプログラムを実行する際にも、擬似的に連想配列をメモリ３に実装することが可能になる。
【０１６１】
上記各実施形態によれば、非オブジェクト指向型言語でのプログラミングで「連想配列」というデータ構造をメモリに実装する場合、メモリの無駄使いをせず、かつ、連想配列用に割り当てられたメモリの範囲外にアクセスしないよう、次の点を一貫して制御することは非常に困難であったという課題を解決できる。
・可変サイズのメモリを動的に割り当てる。
・割り当てられメモリの先頭アドレスを管理（保持）する。
・不要となった割り当て済みのメモリを漏れなく解放する。
【０１６２】
以上説明した各実施形態において、図示した構成や、補正プログラム内の計算は単なる一例であって、本発明はそれに限定されるものではない。
【符号の説明】
【０１６３】
１、１Ａ  ＡＰＩ部
１１      配列初期化部
１２、１２Ａ  データ登録部
１３、１３Ａ  データ参照部
１４、１４Ａ  配列解放部
２        プログラム実行部
３        メモリ
４        コンピュータ
５        記録媒体
６、６Ａ  プログラム
【図１】
2011203958.tif 000003
【図２】
2011203958.tif 000004
【図３】
2011203958.tif 000005
【図４】
2011203958.tif 000006
【図５】
2011203958.tif 000007
【図６】
2011203958.tif 000008
【図７】
2011203958.tif 000009