(57)【要約】【課題】静的なコンパイラにおいて、コンパイルされたオブジェクトコードの実行時におけるプロパティへのアクセスを高速に実現する。【解決手段】ソースコードからオブジェクトコードを生成する情報処理装置であって、前記ソースコードに含まれるオブジェクトのプロパティに対するアクセスについて、オブジェクトに対応して設けられたヒドンタイプ情報のオフセットテーブルに、プロパティに対応付けてバリューを格納する１次元配列のオフセットを設定し、前記オフセットテーブルを介してプロパティにアクセスするコードを生成する手段を備える。【選択図】図４
2014149810.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードからオブジェクトコードを生成する情報処理装置であって、
前記ソースコードに含まれるオブジェクトのプロパティに対するアクセスについて、オブジェクトに対応して設けられたヒドンタイプ情報のオフセットテーブルに、プロパティに対応付けてバリューを格納する１次元配列のオフセットを設定し、前記オフセットテーブルを介してプロパティにアクセスするコードを生成する手段
を備えたことを特徴とする情報処理装置。
【請求項２】
請求項１に記載の情報処理装置において、
前記オフセットテーブルによるプロパティへのアクセスが行えない場合のために、ハッシュテーブルを介してプロパティにアクセスするコードを生成する手段
を備えたことを特徴とする情報処理装置。
【請求項３】
ソースコードからオブジェクトコードを生成する情報処理装置を構成するコンピュータを、
前記ソースコードに含まれるオブジェクトのプロパティに対するアクセスについて、オブジェクトに対応して設けられたヒドンタイプ情報のオフセットテーブルに、プロパティに対応付けてバリューを格納する１次元配列のオフセットを設定し、前記オフセットテーブルを介してプロパティにアクセスするコードを生成する手段
として機能させるコンパイラプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソースプログラムをコンパイルする技術に関する。
【背景技術】
【０００２】
Javascript（登録商標）のような動的なプログラミング言語においては、高速化処理のため、型推論と呼ばれる手法を用いてコード書き換えが実現されている。例えば、オブジェクトのプロパティにアクセスする時間を短縮するためにインラインキャッシュ（Inline Cache）という手法が実装されている（例えば、特許文献１等を参照。）。
【０００３】
インラインキャッシュにおいては、初回アクセス時に背後のヒドンタイプ情報（Hidden Type）をもとにプロパティをアクセスするコードを動的に生成し、２回目以降のアクセスでは、ヒドンタイプ情報が前回アクセス時と同等か確認した上で、生成されたアクセスコードを呼び出す。新規にプロパティが追加されると、新しいヒドンタイプ情報が生成され、オブジェクトのヒドンタイプ情報として設定される。
【０００４】
例えば、下記のJavascriptの関数
function Point(x, y) {this.x = x; this.y = y;}
において、新規に Point(x, y)が実行されると、
ヒドンタイプ情報の示すオフセットに対応するメモリ領域にプロパティｘ、ｙの値が書き込まれる。このヒドンタイプ情報をもとに動的に生成したコードを実行することで、プロパティへのアクセスが行われる。
【０００５】
上述した手法は実行時にコードを生成するインタプリタにおいては有効であったが、事前にソースコードからオブジェクトコードを生成するコンパイラには適用できない。すなわち、コンパイラは元々静的であるために、動的プログラミング言語で導入されている型推論には馴染まない。
【０００６】
そのため、コンパイラにおいて、オブジェクトのプロパティへの高速なアクセスを実現しようとする場合、ハッシュテーブルを用いることが多い。ハッシュテーブルでは、インデクス（index）値とバリュー（value）を使ってテーブルを構成する。
【０００７】
図１〜図３は、ソースコード（source code）として
obj = {};
obj.x = 123;
obj.y = 456;
をコンパイルする過程で生成されるオブジェクト（object）とハッシュテーブル（hash table）の関係の例を示している。
【０００８】
図１（ａ）に示すように、ソースコードsource codeの１行目「obj = {};」を処理することにより、図１（ｂ）に示すように、オブジェクトobjが生成される。この時点では、ハッシュテーブルhash tableは生成されておらず、オブジェクトobjのハッシュテーブルhash tableへのポインタentriesはnullであり、プロパティの要素数occupiedは"0"である。
【０００９】
図２（ａ）に示すように、ソースコードsource codeの２行目「obj.x = 123;」を処理することにより、図２（ｂ）に示すように、ハッシュテーブルhash tableが生成され、オブジェクトobjのポインタentriesはハッシュテーブルhash tableを指す。また、ハッシュテーブルhash tableの配列要素のうち、プロパティｘの文字列"x"をハッシュしてハッシュテーブルhash tableの要素数で剰余（mod）をとった値に相当する配列要素に文字列"x"へのポインタが設定され（デフォルトはnull）、バリューに"123"が設定される。オブジェクトobjの要素数occupiedは"1"に設定される。
【００１０】
図３（ａ）に示すようにソースコードsource codeの３行目「obj.y = 456;」を処理することにより、図３（ｂ）に示すようにハッシュテーブルhash tableの配列要素のうち、プロパティｙの文字列"y"をハッシュしてハッシュテーブルhash tableの要素数で剰余をとった値に相当する配列要素に文字列"y"へのポインタが設定され、バリューに"456"が設定される。オブジェクトobjの要素数occupiedは"2"に設定される。
【００１１】
コンパイルされたオブジェクトコードには、上記のハッシュテーブルを参照してプロパティへのアクセスを行うコードが埋め込まれる。
【先行技術文献】
【特許文献】
【００１２】
【特許文献１】ＵＳ８２４４７７５Ｂ１
【発明の概要】
【発明が解決しようとする課題】
【００１３】
上述したように、静的なコンパイラにおいては、コンパイルされたオブジェクトコードの実行時におけるプロパティへのアクセスを高速化するにはハッシュテーブルを用いて対応せざるを得ず、高速化には限界があった。すなわち、ハッシュテーブルを用いる場合、インデクス値の生成やハッシュテーブルの検索のためのマッチング処理に時間を要するため、充分な高速化が実現できないものであった。
【００１４】
本発明は上記の従来の問題点に鑑み提案されたものであり、その目的とするところは、静的なコンパイラにおいて、コンパイルされたオブジェクトコードの実行時におけるプロパティへのアクセスを高速に実現することにある。
【課題を解決するための手段】
【００１５】
上記の課題を解決するため、本発明にあっては、ソースコードからオブジェクトコードを生成する情報処理装置であって、前記ソースコードに含まれるオブジェクトのプロパティに対するアクセスについて、オブジェクトに対応して設けられたヒドンタイプ情報のオフセットテーブルに、プロパティに対応付けてバリューを格納する１次元配列のオフセットを設定し、前記オフセットテーブルを介してプロパティにアクセスするコードを生成する手段を備えるようにしている。
【発明の効果】
【００１６】
本発明にあっては、静的なコンパイラにおいて、コンパイルされたオブジェクトコードの実行時におけるプロパティへのアクセスを高速に実現することができる。
【図面の簡単な説明】
【００１７】
【図１】従来のハッシュテーブルによる高速化の例を示す図（その１）である。
【図２】従来のハッシュテーブルによる高速化の例を示す図（その２）である。
【図３】従来のハッシュテーブルによる高速化の例を示す図（その３）である。
【図４】本発明の一実施形態にかかる情報処理装置の構成例を示す図である。
【図５】情報処理装置のハードウェア構成例を示す図である。
【図６】生成されるコードで使用されるテーブルの例を示す図（その１）である。
【図７】生成されるコードで使用されるテーブルの例を示す図（その２）である。
【図８】生成されるコードで使用されるテーブルの例を示す図（その３）である。
【図９】プロパティアクセスについてのコンパイル処理の例を示すフローチャートである。
【図１０】生成されるコードの例を示す図（その１）である。
【図１１】生成されるコードの例を示す図（その２）である。
【図１２】生成されるコードの例を示す図（その３）である。
【図１３】生成されるコードの例を示す図（その４）である。
【発明を実施するための形態】
【００１８】
以下、本発明の好適な実施形態につき説明する。
【００１９】
＜構成＞
図４は本発明の一実施形態にかかる情報処理装置１の構成例を示す図である。
【００２０】
図４において、情報処理装置１は、ソースコード１１を読み込んでコンパイルを行い、オブジェクトコード１４を生成するコンパイラ１２が設けられている。コンパイラ１２としては、直接にオブジェクトコード１４を生成するものでもよいし、いったんＣ＋＋等のコードを生成し、それをiOS用やAndroid用の機種別コンパイラ１３Ａ、１３Ｂにより更にコンパイルを行ってオブジェクトコード１４を生成するものでもよい。
【００２１】
図５は情報処理装置１のハードウェア構成例を示す図である。
【００２２】
図５において、情報処理装置１は、システムバス１０１に接続されたＣＰＵ（Central Processing Unit）１０２、ＲＯＭ（Read Only Memory）１０３、ＲＡＭ（Random Access Memory）１０４、ＮＶＲＡＭ（Non-Volatile Random Access Memory）１０５、Ｉ／Ｆ（Interface）１０６と、Ｉ／Ｆ１０６に接続された、キーボード、マウス、モニタ、ＣＤ／ＤＶＤ（Compact Disk / Digital Versatile Disk）ドライブ等のＩ／Ｏ（Input / Output Device）１０７、ＨＤＤ（Hard Disk Drive）１０８、ＮＩＣ（Network Interface Card）１０９等を備えている。
【００２３】
＜動作＞
図６〜図８は、ソースコード（source code）として
obj = {};
obj.x = 123;
obj.y = 456;
をコンパイルする過程で生成されるオブジェクト（object）とヒドンタイプ情報（hidden type）およびハッシュテーブル（hash table）の関係の例を示している。これらの情報やテーブルはコンパイル結果としてのオブジェクトコード（object code）に含められる。
【００２４】
図６（ａ）に示すように、ソースコードsource codeの１行目「obj = {};」を処理することにより、図６（ｂ）に示すように、オブジェクトobjが生成される。オブジェクトobjのポインタhidden typeは基本となるヒドンタイプ情報（hidden type、hidden class）Ｃ０を指し、スロットテーブル（１次元配列）slot tableを指すポインタentriesはnullとなっている。
【００２５】
ヒドンタイプ情報（hidden type）Ｃ０は、ファストオフセットテーブルfast offset tableとオフセットハッシュテーブルoffset hash tableとトランジションテーブルtransition tableを有している。ファストオフセットテーブルfast offset tableの第１欄は、初期状態として、どの識別子（プロパティの識別子）でもない識別子に割り当てられる番号（後述する採番処理において各識別子に割り当てられる番号と重複しない番号）を示す"SYM_null"となっている。第２欄はブランクとなっている。オフセットハッシュテーブルoffset hash tableのポインタentriesはハッシュテーブルhash tableを指しており、要素数occupiedは"0"となっている。ハッシュテーブルhash tableの第１欄はnullとなっており、第２欄はブランクとなっている。なお、ハッシュテーブルhash tableを設けているのは、ファストオフセットテーブルfast offset tableにおいて衝突が発生する場合と、文字列でプロパティにアクセスされる場合とに対処するためである。
【００２６】
図７（ａ）に示すように、ソースコードsource codeの２行目「obj.x = 123;」を処理することにより、図７（ｂ）に示すようにヒドンタイプ情報（hidden type）Ｃ０がコピー（クローン）されてヒドンタイプ情報（hidden type）Ｃ１が作成され、オブジェクトobjのポインタhidden typeはヒドンタイプ情報（hidden type）Ｃ１を指し、ポインタentriesはスロットテーブルslot tableを指す。以前のヒドンタイプ情報（hidden type）Ｃ０のトランジションテーブルtransition tableにはプロパティの文字列"x"に対応付けてヒドンタイプ情報（hidden type）Ｃ１へのポインタが設定される。
【００２７】
ヒドンタイプ情報（hidden type）Ｃ１のファストオフセットテーブルfast offset tableの所定の配列要素（予めソースコードsource codeを先頭からスキャンしてプロパティの識別子（"."演算子を用いた識別子）に採番された値をファストオフセットテーブルfast offset tableの要素数で剰余（mod）をとった値に相当する配列要素）の第１欄には、その識別子に採番された値SYM_x（id番号値）が設定され、その第２欄にはスロットテーブルslot tableの対応するオフセット（この場合は最初のプロパティであるため"0"）が設定される。スロットテーブルslot tableの対応するオフセットの領域にはプロパティの値"123"が設定される。
【００２８】
ハッシュテーブルhash tableの配列要素（プロパティｘの文字列"x"をハッシュしてハッシュテーブルhash tableの要素数で剰余をとった値に相当する配列要素）の第１欄には、文字列"x"へのポインタが設定され、その第２欄にはスロットテーブルslot tableの対応するオフセット"0"が設定される。
【００２９】
図８（ａ）に示すように、ソースコードsource codeの３行目「obj.y = 456;」を処理することにより、図８（ｂ）に示すようにヒドンタイプ情報（hidden type）Ｃ１がコピーされてヒドンタイプ情報（hidden type）Ｃ２が作成され、オブジェクトobjのポインタhidden typeはヒドンタイプ情報（hidden type）Ｃ２を指す。以前のヒドンタイプ情報（hidden type）Ｃ１のトランジションテーブルtransition tableにはプロパティの文字列"y"に対応付けてヒドンタイプ情報（hidden type）Ｃ２へのポインタが設定される。
【００３０】
ヒドンタイプ情報（hidden type）Ｃ２のファストオフセットテーブルfast offset tableの所定の配列要素（予めソースコードsource codeを先頭からスキャンしてプロパティの識別子（"."演算子を用いた識別子）に採番された値をファストオフセットテーブルfast offset tableの要素数で剰余をとった値に相当する配列要素）の第１欄には、その識別子に採番された値SYM_yが設定され、その第２欄にはスロットテーブルslot tableの対応するオフセット（この場合は２つめのプロパティであるため"1"）が設定される。スロットテーブルslot tableの対応するオフセットの領域にはプロパティの値"456"が設定される。
【００３１】
ハッシュテーブルhash tableの配列要素（プロパティｙの文字列"y"をハッシュしてハッシュテーブルhash tableの要素数で剰余をとった値に相当する配列要素）の第１欄には、文字列"y"へのポインタが設定され、その第２欄にはスロットテーブルslot tableの対応するオフセット"1"が設定される。
【００３２】
図９はプロパティアクセスについてのコンパイル処理の例を示すフローチャートである。
【００３３】
図９において、先ず採番処理を行う（ステップＳ１０１）。すなわち、ソースコードをパースした直後に、パースされたソースコードを上から下へスキャンし、識別子、例えばJavaScript型コンパイル言語の場合"."演算子を用いたプロパティアクセスについて、その識別子に"１"から昇順に番号を振っていく。既に採番済の識別子には番号を振り直さない。例えば、"pt.x" という文字列があった場合、"x "という識別子が未採番であれば採番する。
【００３４】
次いで、プロパティアクセスコード生成処理を行う（ステップＳ１０２）。
【００３５】
プロパティアクセスコード生成処理（ステップＳ１０２）では、識別子によるプロパティの読み込みについてのコード生成処理（コード中で参照するテーブル等がある場合はその生成も含む）を行う（ステップＳ１０３）。具体的には、例えば、図１０（ａ）のようなコードを生成する。
【００３６】
図１０（ａ）の記述ｄ１において、オブジェクトobjのポインタhidden typeの値を変数hidden typeに設定し、変数hidden typeの示すヒドンタイプ情報hidden typeのファストオフセットテーブルfast offset tableのfastSlot番目の配列要素のid番号値を取得し、アクセスするプロパティのSYM_idであるか否か判断する。ここで、fastSlotは、採番処理（ステップＳ１０１）で識別子に付与した番号（SYM_id）をファストオフセットテーブルfast offset tableの要素数で割った余り（剰余）である。
【００３７】
SYM_idと一致した場合、高速処理として、記述ｄ２において、オブジェクトobjのポインタentriesの示すスロットテーブルslot tableにおける、変数hidden typeの示すヒドンタイプ情報hidden typeのファストオフセットテーブルfast offset tableのfastSlot番目の配列要素のオフセットの値を、読み込んだバリューvalueとする。
【００３８】
SYM_idと一致しない場合、高速処理は行わず、記述ｄ３において、ハッシュテーブルhash tableを用いた読み込みを行う。
【００３９】
図１０（ｂ）はハッシュテーブルhash tableを用いた読み込みの処理SlowLookup（obj,id）の定義を示している。
【００４０】
図１０（ｂ）の記述ｄ１１において、オブジェクトobjのポインタhidden typeの示すヒドンタイプ情報hidden typeのオフセットハッシュテーブルoffset hash tableとプロパティの識別子idを伴って関数HASH_TABLE_LOOKUPを実行し、結果を変数slotに設定し、変数slotがnullでないか（有効な結果が得られたか）否か判断する。
【００４１】
変数slotがnullでない場合、記述ｄ１２において、オブジェクトobjのポインタentriesの示すスロットテーブルslot tableにおけるslot番目の値を返す。
【００４２】
変数slotがnullである場合、記述ｄ１３において、"NOT_FOUND"を返す。
【００４３】
次いで、図９に戻り、識別子によるプロパティの書き込みについてのコード生成処理（コード中で参照するテーブル等がある場合はその生成も含む）を行う（ステップＳ１０４）。具体的には、例えば、図１１（ａ）のようなコードを生成する。
【００４４】
図１１（ａ）の記述ｄ２１において、オブジェクトobjのポインタhidden typeの値を変数hidden typeに設定し、変数hidden typeの示すヒドンタイプ情報hidden typeのファストオフセットテーブルfast offset tableのfastSlot番目の配列要素のid番号値を取得し、アクセスするプロパティのSYM_idであるか否か判断する。fastSlotは、前述したのと同様に、採番処理（ステップＳ１０１）で識別子に付与した番号（SYM_id）をファストオフセットテーブルfast offset tableの要素数で割った余り（剰余）である。
【００４５】
SYM_idと一致した場合、高速処理として、記述ｄ２２において、オブジェクトobjのポインタentriesの示すスロットテーブルslot tableにおける、変数hidden typeの示すヒドンタイプ情報hidden typeのファストオフセットテーブルfast offset tableのfastSlot番目の配列要素のオフセットの値に、書き込むバリューvalueを設定する。
【００４６】
SYM_idと一致しない場合、記述ｄ２３において、変数hidden typeの示すヒドンタイプ情報hidden typeのファストオフセットテーブルfast offset tableのfastSlot番目の配列要素のid番号値がSYM_nullでなく、かつ、変数hidden typeの示すヒドンタイプ情報hidden typeのオフセットハッシュテーブルoffset hash tableと識別子idにより呼んだHASH_TABLE_LOOKUP関数の戻り値slotがnullでないか判断する。
【００４７】
id番号値がSYM_nullでなく、かつ、HASH_TABLE_LOOKUP関数の戻り値slotがnullでない場合、既に同名のプロパティが存在するため、記述ｄ２４において、オブジェクトobjのポインタentriesの指すスロットテーブルslot tableのslot（記述ｄ２３で設定）の位置に、書き込むバリューvalueを設定する。
【００４８】
その他の場合、記述ｄ２５において、新しいプロパティを追加する。
【００４９】
図１１（ｂ）は新しいプロパティを追加する処理NewProperty(obj,id,value)の定義を示している。
図１１（ｂ）の記述ｄ３１において、変数hidden typeの示すヒドンタイプ情報hidden typeのオフセットハッシュテーブルoffset hash tableの要素数occupiedを変数offsetに設定する。
【００５０】
記述ｄ３２において、変数hidden typeの示すヒドンタイプ情報hidden typeのメソッドlookupTransition(id)を実行し、戻り値を変数newHiddenTypeに設定し、変数newHiddenTypeがnullであるか否か判断する。メソッドlookupTransition(id)は、ヒドンタイプ情報hidden typeのトランジションテーブルtransition tableで記述されるトランジションを辿り、識別子idに該当するヒドンタイプ情報を探すものである。
【００５１】
変数newHiddenTypeがnullである場合、記述ｄ３３において、変数hidden typeの示すヒドンタイプ情報hidden typeのメソッドclone()を実行し、戻り値である新たなヒドンタイプ情報を変数newHiddenTypeに設定する。
【００５２】
記述ｄ３４において、変数newHiddenTypeの示すヒドンタイプ情報hidden typeのオフセットハッシュテーブルoffset hash tableと識別子idとオフセットoffset（記述ｄ３１で設定）を指定して関数HASH_TABLE_INSERTを実行し、ハッシュテーブルhash tableに新しいプロパティの名前とオフセットを保存する。
【００５３】
記述ｄ３５において、識別子idを指定して関数GET_SYM_OF_id(id)を実行し、取得したSYM_idを変数sym_idに設定し、変数sym_idがSYM_nullでなく、かつ、変数newHiddenTypeの示すヒドンタイプ情報hidden typeのファストオフセットテーブルfast offset tableのsym_id番目のid番号値がSYM_nullであるか否か判断する。関数GET_SYM_OF_id(id)は、識別子idが採番処理により採番された識別子のいずれかと一致する場合は対応するid番号値を返し、いずれとも一致しない場合はSYM_nullを返すものである。
【００５４】
変数sym_idがSYM_nullでなく、かつ、ファストオフセットテーブルfast offset tableの対応する項目がSYM_nullであれば、記述ｄ３６において、変数sym_idのSIZE_OF_OFFSET_TABLEの剰余（mod）を変数fastSlotに設定し、変数newHiddenTypeの示すヒドンタイプ情報hidden typeのファストオフセットテーブルfast offset tableの変数fastSlot番目のid番号値に変数sym_idを設定し、offset値に変数offset（記述ｄ３１で設定）を設定する。
【００５５】
記述ｄ３７において、変数hidden typeの示すヒドンタイプ情報hidden typeのメソッドaddTransition(id,newHiddenType)を実行し、新しいトランジションを設定する。
【００５６】
記述ｄ３８において、オブジェクトobjのポインタhidden typeに変数newHiddenTypeを設定し、オブジェクトobjが参照するヒドンタイプ情報を更新する。
【００５７】
記述ｄ３９において、オブジェクトobjのメソッドvalues_append(value)を実行し、スロットテーブルslot tableの末尾に、書き込むバリューvalueを設定する。
【００５８】
次いで、図９に戻り、文字列によりプロパティを指定した読み込みについてのコード生成処理（コード中で参照するテーブル等がある場合はその生成も含む）を行う（ステップＳ１０５）。具体的には、例えば、図１２のようなコードを生成する。
【００５９】
図１２の記述４１において、ハッシュテーブルhash tableを用いた読み込みを行う。ハッシュテーブルhash tableを用いた読み込みの処理SlowLookup（obj,id）の定義は図１０（ｂ）に示したのと同様である。
【００６０】
次いで、図９に戻り、文字列によりプロパティを指定した書き込みについてのコード生成処理（コード中で参照するテーブル等がある場合はその生成も含む）を行う（ステップＳ１０６）。具体的には、例えば、図１３のようなコードを生成する。
【００６１】
図１３の記述５１において、オブジェクトobjのポインタhidden typeの示すヒドンタイプ情報hidden typeのオフセットハッシュテーブルoffset hash tableと識別子idを伴って関数HASH_TABLE_LOOKUPを実行し、結果を変数slotに設定し、変数slotがnullでないか（有効な結果が得られたか）否か判断する。
【００６２】
変数slotがnullでない場合、記述５２において、オブジェクトobjのポインタentriesの示すスロットテーブルslot tableにおけるslot番目の値に、書き込むバリューvalueを設定する。
【００６３】
変数slotがnullである場合、記述５３において、新しいプロパティを追加する。新しいプロパティを追加する処理NewProperty(obj,id,value)の定義は図１１（ｂ）に示したのと同様である。
【００６４】
なお、図１０〜図１３に示したコードは、最終的にはオブジェクトコードに変換される。
【００６５】
＜総括＞
以上説明したように、本実施形態によれば、静的なコンパイラにおいて、コンパイルされたオブジェクトコードの実行時には、ファストオフセットテーブルfast offset tableに該当するプロパティが存在する場合、処理の遅いハッシュテーブルhash tableを参照することなく、即座にスロットテーブルslot tableにアクセスすることができるため、プロパティへのアクセスを高速に実現することができる。
【００６６】
以上、本発明の好適な実施の形態により本発明を説明した。ここでは特定の具体例を示して本発明を説明したが、特許請求の範囲に定義された本発明の広範な趣旨および範囲から逸脱することなく、これら具体例に様々な修正および変更を加えることができることは明らかである。すなわち、具体例の詳細および添付の図面により本発明が限定されるものと解釈してはならない。
【符号の説明】
【００６７】
１                  情報処理装置
１１                ソースコード
１２                コンパイラ
１３Ａ、１３Ｂ      機種別コンパイラ
１４                オブジェクトコード
【図１】
2014149810.tif 000003
【図２】
2014149810.tif 000004
【図３】
2014149810.tif 000005
【図４】
2014149810.tif 000006
【図５】
2014149810.tif 000007
【図６】
2014149810.tif 000008
【図７】
2014149810.tif 000009
【図８】
2014149810.tif 000010
【図９】
2014149810.tif 000011
【図１０】
2014149810.tif 000012
【図１１】
2014149810.tif 000013
【図１２】
2014149810.tif 000014
【図１３】
2014149810.tif 000015