(57)【要約】【課題】  設計図面からプログラムコードを生成するプログラムコード生成装置において、異なるプログラミング言語が混在した実行可能形式を作成可能なプログラムコードを生成する。【解決手段】  フォーマル言語で記述された設計図面に基づいて、プログラムコードを生成するプログラムコード生成装置であって、前記設計図面に含まれる所定の処理単位ごとに、異なるプログラミング言語（Ｊａｖａ（登録商標）言語、Ｃ言語）で記述したプログラムコードを生成可能な手段（４６２、４６３）と、前記所定の処理単位のプログラムコード間において、相互に情報の授受ができるよう、情報の変換内容を記述した変換プログラムコード（４７０）を生成する手段（４６９）とを備える。【選択図】  図９Ｄ
2006293436.tif 000002
【特許請求の範囲】
【請求項１】
フォーマル言語で記述された設計図面に基づいて、プログラムコードを生成するプログラムコード生成装置であって、
前記設計図面に含まれる所定の処理単位ごとに、異なるプログラミング言語で記述したプログラムコードを生成可能なコード生成手段と、
前記所定の処理単位のプログラムコード間において、相互に情報の授受ができるよう、情報の変換内容を記述した変換プログラムコードを生成する変換コード生成手段と
を備えることを特徴とするプログラムコード生成装置。
【請求項２】
前記設計図面を解析することにより、前記処理単位ごとのプログラムコードを生成する際に用いるプログラミング言語の種別を、コード生成制約情報として抽出する抽出手段を更に備え、
前記コード生成手段は、前記抽出手段により抽出された前記コード生成制約情報を用いて前記プログラムコードを生成することを特徴とする請求項１に記載のプログラムコード生成装置。
【請求項３】
前記プログラムコード生成装置は、オブジェクト指向プログラミングにより前記プログラムコードを生成し、前記処理単位とは、該オブジェクト指向プログラミングにおけるクラスまたはメソッドであることを特徴とする請求項１に記載のプログラムコード生成装置。
【請求項４】
前記変換コード生成手段は、第１のプログラミング言語でプログラムコードが生成される第１のメソッドから、第２のプログラミング言語でプログラミングコードが生成される第２のメソッドを呼び出すための変換プログラムコードを生成することを特徴とする請求項３に記載のプログラムコード生成装置。
【請求項５】
第１のプログラミング言語でプログラムコードが生成される第１のメソッドから、第２のプログラミング言語でプログラミングコードが生成される第２のメソッドを呼び出すための処理手順及びデータ変換をするための処理内容を記述した変換テーブルを保持する保持手段を更に備え、
前記変換コード生成手段は、前記変換テーブルを用いて前記変換プログラムコードを生成することを特徴とする請求項３に記載のプログラムコード生成装置。
【請求項６】
前記変換コード生成手段は、
ＵＭＬで規定されたデータ型である基本型とオブジェクト型において、第１のプログラミング言語にて対応する第１のデータ型と、第２のプログラミング言語にて対応する第２のデータ型との間の変換コードを前記変換テーブルに基づいて生成することを特徴とする請求項５に記載のプログラムコード生成装置。
【請求項７】
前記変換テーブルは、データの型変換をする場合に使用する型宣言と、型変換に使用するプログラムコードとを備えることを特徴とする請求項５に記載のプログラムコード生成装置。
【請求項８】
前記変換テーブルは、データの型変換をする場合にメソッドの引数で与えられたデータの型変換で使用する型宣言と、型変換に使用されるプログラムコードとを備えることを特徴とする請求項５に記載のプログラムコード生成装置。
【請求項９】
前記コード生成手段は、ヒープ領域のデータを解放するプログラムコードを生成することを特徴とする請求項１に記載のプログラムコード生成装置。
【請求項１０】
前記コード生成制約情報は、
前記第１のメソッドと、前記第１のメソッドのプログラミング言語の種別と、前記第１のメソッドを参照している第２のメソッドと、前記第２のメソッドのプログラミング言語の種別と、を備えることを特徴とする請求項２に記載のプログラムコード生成装置。
【請求項１１】
フォーマル言語で記述された設計図面に基づいて、プログラムコードを生成するプログラムコード生成方法であって、
前記設計図面に含まれる所定の処理単位ごとに、異なるプログラミング言語で記述したプログラムコードを生成可能なコード生成工程と、
前記所定の処理単位のプログラムコード間において、相互に情報の授受ができるよう、情報の変換内容を記述した変換プログラムコードを生成する変換コード生成工程と
を備えることを特徴とするプログラムコード生成方法。
【請求項１２】
請求項１１に記載のプログラムコード生成方法をコンピュータによって実現させるための制御プログラムを格納した記憶媒体。
【請求項１３】
請求項１１に記載のプログラムコード生成方法をコンピュータによって実現させるための制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
フォーマル言語で記述された設計図面から、プログラムコードを生成するプログラムコード生成装置におけるプログラムコード生成技術に関するものである。
【背景技術】
【０００２】
コード自動生成装置とは、ＵＭＬ（Ｕｎｉｆｉｅｄ−Ｍｏｄｅｌｉｎｇ−Ｌａｎｇｕａｇｅ）やＳＤＬ（Ｓｐｅｃｉｆｉｃａｔｉｏｎ  ＆  Ｄｅｓｃｒｉｐｔｉｏｎ  Ｌａｎｇｕａｇｅ）といったフォーマル言語で記述されたソフトウェアの設計図面を入力として、それらの仕様を解析し、プログラムコードを生成する装置をいう。
【０００３】
近年、設計図面を作成するエディタと、上記コード自動生成装置と、コード自動生成装置によって生成されるプログラムコードとに基づいて実行可能形式を作成するコンパイラ／リンカとを統合したツールを用いることにより、設計図面をベースとしたソフトウェアの開発を行う、ＭＤＡ（Ｍｏｄｅｌ−Ｄｒｉｖｅｎ−Ａｒｃｈｉｔｅｃｔｕｒｅ）技術が広まってきたことに伴って、コード自動生成装置によるソフトウェアが開発が数多くなされるようになってきた。
【０００４】
このような背景のもと、設計図面からプログラムコードを自動生成するための様々な方法が提案されている。例えば、特開平９−２３１０６３号公報（発明の名称：「プログラム自動生成装置、およびプログラム自動生成方法」）では、メタルールを導入し、入出力対応表を参照することでプログラムコードの生成を行う方法が提案されている。
【０００５】
また、特開平１０−２１４１９１号公報（発明の名称：「オブジェクト指向プログラミングに適用される開発支援装置および開発支援方法」）では、オブジェクト指向のモデル情報からクラスやメソッドが外部公開のものかどうかを検出し、適切なヘッダファイルの生成を行う方法が提案されている。さらに、特開平８−０６３３４５号公報（発明の名称：「プログラム自動生成装置」）では、辞書にマイコン用の命令を登録しておいてその辞書からメモリマップを作成することによって、マイコン毎のプログラムを生成する方法が提案されている。
【特許文献１】特開平９−２３１０６３号公報
【特許文献２】特開平１０−２１４１９１号公報
【特許文献３】特開平８−０６３３４５号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかしながら、上記特許文献１（発明の名称：「プログラム自動生成装置、およびプログラム自動生成方法」）や上記特許文献２（発明の名称：「オブジェクト指向プログラミングに適用される開発支援装置および開発支援方法」）の場合、生成されるプログラムコードは単一のプログラミング言語のみである。また、上記特許文献３（発明の名称：「プログラム自動生成装置」）の場合、生成されるプログラムコードはマイコンコードを前提としている。
【０００７】
このように、既存のコード自動生成装置は、複数の言語のプログラムコードを同時に出力することができず、プログラミング言語を使い分けて実行可能形式を作成することができないという課題がある。
【０００８】
本発明は上記課題に鑑みてなされたものであり、設計図面からプログラムコードを生成するプログラムコード生成装置において、異なるプログラミング言語が混在した実行可能形式を作成可能なプログラムコードを生成することを目的とする。
【課題を解決するための手段】
【０００９】
上記の目的を達成するために本発明に係るプログラムコード生成装置は以下のような構成を備える。即ち、
フォーマル言語で記述された設計図面に基づいて、プログラムコードを生成するプログラムコード生成装置であって、
前記設計図面に含まれる所定の処理単位ごとに、異なるプログラミング言語で記述したプログラムコードを生成可能なコード生成手段と、
前記所定の処理単位のプログラムコード間において、相互に情報の授受ができるよう、情報の変換内容を記述した変換プログラムコードを生成する変換コード生成手段とを備える。
【発明の効果】
【００１０】
本発明によれば設計図面からプログラムコードを生成するプログラムコード生成装置において、異なるプログラミング言語が混在した実行可能形式を作成可能なプログラムコードを生成することが可能となる。
【発明を実施するための最良の形態】
【００１１】
以下、必要に応じて添付図面を参照しながら本発明の各実施形態を詳細に説明する。
【００１２】
［第１の実施形態］
＜プログラムコード生成装置の構成＞
図１は、本発明の第１の実施形態にかかるプログラムコード生成装置の全体構成を示す図である。１０１はＣＰＵであり、以下に説明する１０２〜１１３の各装置を１０２で示したバスを介してアクセスし制御を行なう。１０３は、読み書き可能なメモリ（以降、ＲＡＭ）であり、本実施形態ではデータ領域として、設計図面情報１０３ａ及びプラットフォーム依存情報１０３ｂ、コード生成制約情報１０３ｃ、変換テーブル１０３ｄ、プログラムコード１０３ｅ、ライブラリ１０３ｆ、実行可能形式１０３ｇを格納している。
【００１３】
１０４はバス１０２を介してＣＰＵ１０１からアクセス可能な読み出し専用メモリ（以降、ＲＯＭ）であり、以下にその動作を詳細に説明する混在コード自動生成プログラム１０５（生成コード特定部１０５ａ及び混在コード生成部１０５ｂから構成）が格納されており、必要に応じてＲＡＭ１０２に読み込まれたりする。
【００１４】
１０６は入力インターフェイスであり、１０７で示したキーボード、ボタン、マウス、ダイアル等（以降、入力装置）を介してなされる入力を受け取る。１０８は出力インターフェイスであり、１０９で示したＣＲＴ，ＬＣＤ等（以降、表示装置）１１０、更にはプリンタ、プロッタ等（以降、出力装置）１１１に対し、データの表示／出力を行なう。
【００１５】
また、１１２は外部記憶装置インターフェイスであり、１１３で示したＨＤ、ＦＤ、ＣＤ−ＲＯＭ、ＭＤ、ＣＦ等（以降、外部記憶装置）に対するデータの入出力を行なうものである。
【００１６】
なお、本実施形態では、動作の詳細な説明をする混在コード自動生成プログラム１０５がＲＯＭ１０４上にあるものとして、また、処理対象となる設計図面情報１０３ａの格納領域がＲＡＭ１０３上にあるものとして説明を行なうが、これらはすべて、外部記憶装置１１３上に配置することも可能であり、更に必要に応じて外部記憶装置１１３からＲＡＭ１０３上にロードして使用することもできる。また、ＣＰＵ１０１のキャッシュメモリ上に配置することも同様に可能である。
【００１７】
＜混在コード自動生成プログラム１０５のブロック構成＞
図２は、図１において示した混在コード自動生成プログラム１０５の構成要件とそれら構成要件がＲＡＭ１０３に格納されるデータとどのような関係にあるかを示すブロック図である。
【００１８】
１５１は、図１のプログラムコード生成装置の外観構成であり、ユーザはこのプログラムコード生成装置１５１においてデータの入力、編集及び混在コード自動生成プログラムの起動などを行うことができる。１５２〜１６４はプログラムコード生成装置１５１において実行される処理の概要を示すブロック図である。
【００１９】
１５２は、外部記憶装置１１３内から実行可能設計図面（以降、設計図面）を読み込み、構文解析を行なう設計図面解析部であり、混在コード自動生成プログラム１０５が設計図面を解釈することを可能にする。
【００２０】
１５３は、外部記憶装置１１３から実行ファイルが動作するＯＳやＣＰＵ、フレームワークといったプラットフォームデータを読み込み、構文解析を行なうプラットフォーム依存解析部であり、混在コード自動生成プログラム１０５がプラットフォーム情報を解釈することを可能にする。
【００２１】
１５４は、設計図面解析部１５２より生成された設計図面情報であり、ＲＡＭ１０３上に記憶されている（図１の１０３ａ参照）。１５５は、プラットフォーム依存解析部より生成されたプラットフォーム情報であり、ＲＡＭ１０３上に記憶されている（図１の１０３ｂ参照）。１５６は、設計図面情報１５４に対してどのプログラミング言語でプログラムコードを生成するかを規定したコード生成制約情報を生成する生成コード特定部である。
【００２２】
１５７は、設計図面に対して、どのプログラミング言語で自動生成するかを規定したコード生成制約情報であり、ＲＡＭ１０３上に記憶されている（図１の１０３ｃ参照）。１５８は、Ｊａｖａ（登録商標）言語で実装されている関数からＣ言語で実装されている関数を呼び出す場合に必要な処理手順や、逆のＣ言語で実装されている関数からＪａｖａ（登録商標）言語で実装されている関数を呼び出す場合に必要な処理手順などから構成された変換テーブルを読み込み、構文解析を行なう変換テーブル解析部であり、混在コード自動生成プログラム１０５が変換テーブルを解釈することを可能にする。
【００２３】
１５９は、変換テーブル解析部１５８より生成された変換テーブルであり、ＲＡＭ１０３上に記憶されている（図１の１０３ｄ参照）。１６０は、設計図面情報１５４、及びコード生成制約情報１５７、プラットフォーム情報１５５、変換テーブル１５９を参照／解析することで、Ｃ言語とＪａｖａ（登録商標）言語が混在したプログラムコードを生成する混在コード生成部である。
【００２４】
１６１は、混在コード生成部によって生成されたプログラムコードである。１６２は、プログラムコードから参照されるライブラリである。１６３は、プログラムコード１６１とライブラリ１６２とから、実行可能形式１６４を生成するコードコンパイラ・リンカである。
【００２５】
＜一般的な設計図面の説明＞
次に、外部記憶装置１１３から読み込まれる一般的な設計図面について説明する。図３は、設計図面の全体構成を規定する図面の一例で、一般にドメイン図と呼ばれている。図３において、２０１は、設計図面を構成するドメインと呼ばれる集合であり、２０２はドメイン同士の結びつきを表現したものであり、関連と呼ばれる。
【００２６】
図４は、モデルの静的な構造を示す設計図面であり、一般にクラス図と呼ばれる。図４では、「ＡＡＡ」という名前を持つクラスの定義例を示している。図４の２５１は名前「ＡＡＡ」を表し、２５２はＡＡＡクラスが、「ｎａｍｅ」というＳｔｒｉｎｇ型のインスタンス変数を持つことを表現している。また２５３は、ＡＡＡクラスが「ｅｖＯｎ」「ｅｖＯｆｆ」という２つのイベントを受け付けること、更に「ｎａｍｅ」を参照するための「ｇｅｔＮａｍｅ」という名前のメソッドを備えていることを表現している。
【００２７】
図５は、モデルの動的な振る舞いを定義する設計図面であり、一般に状態遷移図と呼ばれる。図５では、図４におけるＡＡＡクラスの状態遷移図を例として示している。図中の遷移３０１は、状態がＳｔａｔｅＡ１の時に、ｅｖＯｎイベントが発生すると、アクション（ＡＡＡクラスのメソッドｇｅｔＮａｍｅ（））を実行してから、ＳｔａｔｅＡ２状態に遷移する、ということを表現している。
【００２８】
図６は、クラスＡＡＡにおけるアクション定義の例を示している。アクション中のＡＡＡクラスに対する操作が記述されている。３５１は、ＡＡＡクラスのインスタンスａ１を生成することを意味している。３５２は、ｇｅｔＮａｍｅメソッドによって、インスタンスａ１のｎａｍｅを参照することを意味している。
【００２９】
＜一般的な設計図面情報１５４の説明＞
図８は、設計図面解析部１５２において設計図面を解析した結果、得られた設計図面情報１５４のイメージ図である。生成コード特定部においては、実際には、解析結果である設計図面情報を解析する処理を行う。図８にあるように、クラス名やメソッド名などの情報は、タグやテキスト文字列で表現され、モデル上で表現されている全ての情報を解析できる。
【００３０】
＜混在したプログラムコード生成のための設定条件の入力用ユーザインタフェース＞
次に、ユーザによる混在したプログラムコード生成に際しての生成コードの指定ためのユーザインタフェースについて説明する。
【００３１】
図７は、本実施形態にかかるプログラムコード生成装置において、混在したプログラムコード生成に際しての各プログラムコード（Ｃ言語プログラムを出力するかＪａｖａ（登録商標）言語プログラムを出力するか）を設定する時のユーザインタフェースのイメージ図である。
【００３２】
４０１は、生成するプログラムコードのプログラミング言語を設定するクラスである。クラス４０１を指定して生成するプログラムコードのプログラミング言語設定画面を起動すると、４０２のようなダイアログが表示される。ユーザは、ダイアログ４０２上でクラス全てをＣ／Ｊａｖａ（登録商標）言語で生成する４０３か、メソッド毎に生成するプログラミング言語を変更する４０４のいずれかを選ぶことが可能である。ユーザは、以上の設定を全てのクラスに対して行う必要がある。
【００３３】
＜混合したプログラムコード生成のための設計図面＞
図９Ａは、設計図面の一例を示したイメージ図である。４５１は、「ＢＢＢ」という名前のクラスを示しており、Ｓｔｒｉｎｇ型を戻り値として返すメソッドｇｅｔＭａｃｈｉｎｅＮａｍｅ（）を持つ。４５２は、「ＣＣＣ」という名前のクラスを示しており、Ｓｔｒｉｎｇ型を戻り値として返すメソッドｇｅｔＤｉｓｐｌａｙＮａｍｅ（）を持つ。４５３は、「ＡＡＡ」という名前のクラスを示しており、引数にＳｔｒｉｎｇ型を受け取りＳｔｒｉｎｇ型を戻り値として返すメソッドｇｅｔＮａｍｅ（Ｓｔｒｉｎｇ  ｔｙｐｅ）を持つ。４５４は、「ＤＤＤ」という名前のクラスを示しており、Ｓｔｒｉｎｇ型を戻り値として返すメソッドｇｅｔＮｕｍｂｅｒを持つ。
【００３４】
４５５は、メソッドｇｅｔＭａｃｈｉｎｅＮａｍｅの実装を示しており、メソッド内でクラスＡＡＡのｓｔａｔｉｃメソッドを呼び出していることを示している。４５６は、４５４と同様でメソッドｇｅｔＤｉｓｐｌａｙＮａｍｅの実装を示しており、メソッド内でクラスＡＡＡのｓｔａｔｉｃメソッドを呼び出していることを示している。４５７は、メソッドｇｅｔＮａｍｅの実装部分を示しており、メソッド内でクラスＤＤＤのメソッドｇｅｔＮｕｍｂｅｒを呼びだしていることを示している。４５８は、メソッドｇｅｔＮｕｍｂｅｒの実装部分を示している。
【００３５】
図９Ｂは、図９Ａの各クラスをどのプログラミング言語でプログラムコード生成するかを設定した場合のイメージ図である。４５９は、例えばクラスＢＢＢはアプリケーションインタフェースとしてＪａｖａ（登録商標）であることが必須であったため、Ｊａｖａ（登録商標）言語でプログラムコード生成する設定となっていることを示しており。４６０は、例えばクラスＡＡＡ、ＣＣＣ、ＤＤＤは高速な処理が必要であったためＣ言語でプログラムコード生成する設定となっていることを示している。
【００３６】
図９Ｃは、設計図面を解析することによって得られる混在したプログラムコードのインタフェースを示したイメージ図である。４６１は、クラスＢＢＢとクラスＡＡＡの間のインタフェースを示しており、Ｊａｖａ（登録商標）言語でプログラムコード生成されるメソッドからＣ言語でプログラムコード生成されるメソッドが呼び出されるため、その間で相互に呼び出し可能な手続きが必要となる。
【００３７】
＜混合したプログラムコード生成の概要＞
図９Ｄは、Ｃ言語とＪａｖａ（登録商標）言語のプログラムコードを混在して生成するように設定された設計図面について、プログラムコードを生成する場合のブロック図を示している。４６２は、設計図面からＪａｖａ（登録商標）コードを生成するＪａｖａ（登録商標）コード生成部である。４６３は、設計図面からＣコードを生成するＣコード生成部である。４６４は、Ｊａｖａ（登録商標）コード生成部４６２によって生成されたクラスＢＢＢのＪａｖａ（登録商標）コードである。４６５、４６６及び４６７は、Ｃコード生成部４６３によって生成されたクラスＡＡＡ、クラスＣＣＣ、クラスＤＤＤのＣコードである。４６８は、Ｊａｖａ（登録商標）言語とＣ言語の間でメソッド呼び出しをするための処理やデータ変換をするための処理をテーブルとして保持している変換テーブルである。４６９は、設計図面や変換テーブル４６８を参照してＪａｖａ（登録商標）コードとＣコードのメソッド呼び出しを可能にしたり、データの相互変換をする変換コードを生成する変換コード生成部である。４７０は、Ｊａｖａ（登録商標）言語とＣ言語間のメソッド呼び出しやデータ変換をする変換コードである。変換コード４７０をＪａｖａ（登録商標）言語で生成されたクラスＢＢＢとＣ言語で生成されたクラスＡＡＡとの間に置くことで、設計図面で混在するプログラムコードがあっても実行可能形式を作成できる。
【００３８】
以上が、混合したプログラムコード生成の概要である。次に、当該混合したプログラムコード生成に際しての各部（図２）の処理の詳細について説明する。なお、上記説明では、Ｃ言語とＪａｖａ（登録商標）言語における混在コードの自動生成について述べてきたが、生成するプログラミング言語はＣ言語やＪａｖａ（登録商標）言語以外のプログラミング言語であっても同様であり（例えば、ＬＳＩの上流設計で使用されるＳｙｓｔｅｍＣとプログラミング言語との混在）、異なる言語間でのメソッドやデータのやり取りを可能とする変換コードを生成することで実現できることはいうまでもなく、この点については以下の説明においても同様である。ただし、説明の便宜上、以下の説明においても上記同様、Ｃ言語とＪａｖａ（登録商標）言語における混在コードの自動生成を行うものとして説明する。。
【００３９】
なお、以降の説明においてのフローチャートによる処理手順は、以下の例に限定されることはなく、本発明の結果を満たす限りいかなる手順の組み合わせも、複数処理をまとめることも、あるいは処理を細分化することも可能であり、また、各処理を個々に切り出してひとつの機能要素として単体として機能させ、示している処理以外の処理と組み合わせて使用することも可能である。
【００４０】
＜生成コード特定部１５６における処理の流れ＞
図１０は、本発明の第１の実施形態にかかるプログラムコード生成装置の混在コード自動生成プログラム１０５の生成コード特定部１５６における処理の流れを示すフローチャートである。
【００４１】
ユーザによって、モデルがどのプログラミング言語で実装するか決定されると、設計図面情報１５４にある全てのクラスに対してステップＳ１０１からステップＳ１０７までの処理を行って、コード生成制約情報１５７を作成する処理を行う。
【００４２】
はじめにステップＳ１０１では全てのクラスに対して解析が済んだかどうかを比較する処理を行う。全てのクラスの解析が終了していなければ、ステップＳ１０２へ進む。ステップＳ１０２では、解析対象のクラスを１つ取得し、解析対象のクラスについて、全てのメソッドについて解析が終了したかどうかを比較する処理を行う。全てのメソッドの解析が終了していなければ、ステップＳ１０３へ進む。
【００４３】
ステップＳ１０３では、解析対象のメソッドを１つ取得し、そのメソッドの実装プログラミング言語の種別を取得する処理を行う。ステップＳ１０４において、ステップＳ１０３のメソッドを参照している全てのメソッドについて実装言語の種別を取得する処理を行う。
【００４４】
ステップＳ１０５では、ステップＳ１０４で取得した参照メソッドについて、異なる実装言語から呼び出されているかどうかを判断する処理を行う。異なる実装言語から呼び出されている場合は、ステップＳ１０６へ進む。
【００４５】
ステップＳ１０６では、呼び出し元と呼び出し先の実装言語が異なるメソッドをコード生成制約情報に追加する処理を行う。ステップＳ１０５で、同じプログラミング言語で実装する場合、及びステップＳ１０６が終了すると、ステップＳ１０２へ進み全てのメソッドが解析終わるまでステップＳ１０２からステップＳ１０６までを繰り返す。
【００４６】
ステップＳ１０２において、全てのメソッドの解析が終了したら、ステップＳ１０１へ進み、全てのクラスが解析終了するまで、ステップＳ１０２からステップＳ１０６を繰り返す。ステップＳ１０１において全てのクラスの解析が終了すると、本シーケンスを終了する。
【００４７】
図１１は、図９におけるモデルについて、クラスＡＡＡ、ＣＣＣ、ＤＤＤがＣ言語による実装、クラスＢＢＢがＪａｖａ（登録商標）言語による実装の場合に、図１０のフローチャートを実行した結果得られるコード生成制約情報１５７のイメージ図である。図９の設計図面情報１５４及び図１１のコード生成制約情報１５７において、クラスＡＡＡのメソッドｇｅｔＮａｍｅ（実装言語Ｃ）がクラスＢＢＢのメソッドｇｅｔＭａｃｈｉｎｅＮａｍｅ（実装言語Ｊａｖａ（登録商標））とクラスＣＣＣのメソッドｇｅｔＤｉｓｐｌａｙＮａｍｅ（実装言語Ｃ）から参照されていることがわかる。
【００４８】
＜変換テーブル情報１５９の説明＞
次に、変換テーブル１５９について説明する。変換テーブル１５９を変換テーブル解析部１５８において解析することによって、混在コード生成部１６０で読み込み可能なデータとなる。変換テーブル１５９は、Ｊａｖａ（登録商標）言語とＣ言語でデータをやり取りする場合や制御を行う場合の変換規則に関するテーブルである。混在コード生成部１６０は、変換テーブル１５９を参照することによって、通常のプログラムコード生成に加え、データ変換などが必要な項目についてはさらなるプログラムコードを追加することが可能となる。
【００４９】
図１２は、ＣコードからＪａｖａ（登録商標）コードへの変換規則に関する変換テーブル１５９の一例を示す図である。図１２の例では、Ｃ言語で実装されているクラスがＪａｖａ（登録商標）言語で実装されているクラスに戻り値を返す場合に必要な変換規則に関する変換テーブルを示している。
【００５０】
図１３は、Ｊａｖａ（登録商標）コードからＣコードへの変換規則に関する変換テーブル１５９の一例を示す図である。図１３の例では、Ｊａｖａ（登録商標）コードから渡されたＳｔｒｉｎｇ型の引数をＣコードで利用するための変換規則に関する変換テーブル１５９を示している。
【００５１】
＜混在コード生成部１６０における処理＞
図１４は、混在コード自動生成プログラム１０５の混在コード生成部１６０における処理の流れを示すフローチャートである。
【００５２】
生成コード特定部１５６によって、コード生成制約情報１５７を取得すると、設計図面情報１５４にある全てのクラスに対してステップＳ１５１からステップＳ１５８までの処理を行って、プログラムコード１６１を生成する処理を行う。
【００５３】
ステップＳ１５１において、コード生成制約情報１５７に登録されていない通常クラスのプログラムコードを自動生成する処理を行う。ステップＳ１５２において、生成コードがＪａｖａ（登録商標）言語である全てのクラスについてプログラムコードを生成したかどうかを判断する処理を行う。ステップＳ１５２において、生成コードがＪａｖａ（登録商標）言語のクラス全てのプログラムコードの生成が完了するとステップＳ１５５へ進む。完了していない場合は、ステップＳ１５３へ進む。
【００５４】
ステップＳ１５３において、Ｊａｖａ（登録商標）コードを生成する処理を行う。なお、ステップＳ１５３については、後に詳しく説明する。ステップＳ１５４において、Ｊａｖａ（登録商標）コードのクラス情報を変換テーブル１５９に登録する処理を行う。ステップＳ１５４については、後に詳しく説明する。
【００５５】
ステップＳ１５４の処理が終了すると、ステップＳ１５２へ戻り、実装言語がＪａｖａ（登録商標）である全てのクラスについてプログラムコードの生成が完了するまでステップＳ１５２からステップＳ１５４を繰り返す。ステップＳ１５２において、実装言語がＪａｖａ（登録商標）である全てのクラスについてプログラムコードの生成が完了したと判断した場合には、ステップＳ１５５に進む。
【００５６】
ステップＳ１５５では、生成コードがＣ言語である全てのクラスについてプログラムコードを生成したかどうかを判断する処理を行う。
【００５７】
ステップＳ１５５において、生成コードがＣ言語であるクラス全てのプログラムコードの生成が完了すると本シーケンスを終了する。完了していない場合は、ステップＳ１５６へ進む。ステップＳ１５６において、ＪＮＩコードを生成する処理を行う。ステップＳ１５６については、後に詳しく説明する。
【００５８】
ステップＳ１５７において、生成コードがＣ言語のクラスから参照されているかどうかをコード生成制約情報１５７から判断する処理を行う。ステップＳ１５７で、生成コードがＣ言語のクラスから参照されていない場合は、ステップＳ１５５へ進む。ステップＳ１５７で参照されている場合は、ステップＳ１５８へ進む。ステップＳ１５８では、ステップＳ１５６で生成されたプログラムコードを元に、Ｃ言語用のヘッダファイルを生成する処理を行う。ステップＳ１５８が終了するとステップＳ１５５へ戻り、生成コードがＣ言語である全てのクラスについてプログラムコードの生成が完了するまでステップＳ１５５からステップＳ１５８を繰り返す。
【００５９】
＜Ｊａｖａ（登録商標）コード生成処理（ステップＳ１５３）の流れ＞
図１５は、図１４におけるステップＳ１５３（Ｊａｖａ（登録商標）コード生成処理）の詳細の流れを示したフローチャートである。ステップＳ２０１において、メソッド以外の全てのコードをＪａｖａ（登録商標）コードで生成する処理を行う。ステップＳ２０２において、全てのメソッドについてプログラムコードの生成が完了したかどうかを判断する処理を行う。ステップＳ２０２で全てのメソッドの生成が完了すると本シーケンスを終了する。
【００６０】
ステップＳ２０２で全てのメソッドのプログラムコードの生成が完了していない場合は、ステップＳ２０３へ進む。ステップＳ２０３では、Ｊａｖａ（登録商標）コードで生成するメソッドの定義部分を生成する処理を行う。ステップＳ２０４では、全てのアクション記述をプログラムコードで生成したかどうかを判断する処理を行う。
【００６１】
ステップＳ２０４でプログラムコードの生成が完了した場合は、ステップＳ２０２へ進む。ステップＳ２０４でプログラムコードの生成が完了していない場合は、ステップＳ２０５へ進む。ステップＳ２０５では、アクション記述を１つ取得する処理を行う。ステップＳ２０６では、アクション記述がＣコードで実装されているクラスのメソッド呼び出しに変換されるかどうかを判断する処理をする。
【００６２】
ステップＳ２０６において、Ｃコードで実装されるクラスのメソッド呼び出しをしない場合は、ステップＳ２０７へ進む。ステップＳ２０７において、Ｊａｖａ（登録商標）コードを生成する処理が終了すると、ステップＳ２０４へ戻る。ステップＳ２０６において、Ｃコードで実装されるクラスのメソッド呼び出しをする場合は、ステップＳ２０８へ進む。
【００６３】
ステップＳ２０８では、Ｊａｖａ（登録商標）のプログラムコードからＣのプログラムコードを呼び出すためのラッパーファイル（関数）が生成済みであるかどうかを判断する処理を行う。ステップＳ２０８ですでに生成済みの場合は、ステップＳ２１０へ進む。ステップＳ２０８でラッパーファイル（関数）を生成済みでない場合は、ステップＳ２０９へ進む。ステップＳ２０９では、生成コードがＣ言語であるクラスをＪａｖａ（登録商標）言語のプログラムコード内で呼び出すためのラッパーファイル（関数）を作成する処理を行う。
【００６４】
ステップＳ２１０において、ラッパーファイルに定義されているラッパー関数をプログラムコードに生成する処理を行うと、ステップＳ２０４へ戻り、全てのアクション記述がプログラムコードで生成されるまでステップＳ２０４からステップＳ２１０の処理を繰り返す。ステップＳ２０４で全てのアクション記述についてプログラムコードが生成されると、ステップＳ２０２へ戻り、全てのメソッドがプログラムコードにより生成されるまでステップＳ２０２からステップＳ２１０の処理を繰り返す。ステップＳ２０２で全てのメソッドについてプログラムコードが生成されると本シーケンスを終了する。
【００６５】
図１６は、図１１のコード生成制約情報１５７の場合における（ａ）クラスＢＢＢのプログラムコード、及び（ｂ）クラスＡＡＡのラッパーファイルのイメージ図である。
【００６６】
＜Ｊａｖａ（登録商標）コードのシグニチャ登録処理の流れ＞
図１７は、図１４におけるステップＳ１５４（シグニチャ登録処理）の詳細の流れを示すフローチャートである。ステップＳ２５１では、図１４のステップＳ１５３で生成したメソッドの解析が全て完了したかどうかを判断する処理を行う。ステップＳ２５１において解析が全て終了していないと判断した場合は、ステップＳ２５２へ進む。
【００６７】
ステップＳ２５２では、メソッドの参照先を取得する処理を行う。ステップＳ２５３では、ステップＳ２５２で取得した参照先全てについて、生成コードがＣ言語であるクラスからの参照があるかどうかを判断する処理を行う。ステップＳ２５３で生成コードがＣ言語であるクラスからの参照があると判断した場合は、ステップＳ２５４へ進む。
【００６８】
ステップＳ２５４では、クラス名、及びメソッド名、メソッドのシグニチャを変換テーブル１５９に追加する処理を行う。ステップＳ２５４が終了するか、ステップＳ２５３において参照がない場合は、ステップＳ２５１へ戻り、全てのメソッドについて解析が終了するまでステップＳ２５１からステップＳ２５４までの処理を繰り返す。
【００６９】
図１８は、クラスＡＡＡからクラスＤＤＤのメソッドｇｅｔＮｕｍｂｅｒを呼びだしている様子を示した設計図面（クラス図）である。５０１は、メソッドｇｅｔＮａｍｅを持つクラスＡＡＡを示している。５０２は、メソッドｇｅｔＮｕｍｂｅｒを持つクラスＤＤＤを示している。５０３は、クラスＡＡＡにおけるメソッドｇｅｔＮａｍｅのアクション記述である。５０４は、クラスＤＤＤにおけるメソッドｇｅｔＮｕｍｂｅｒのアクション記述である。
【００７０】
図１９は、図１８の設計図面をもとに図１７のフローチャートを実行した場合に追加登録される変換テーブルを示す図である。図１９にあるように生成コードがＣ言語であるメソッドから呼ばれるメソッドの中で、生成コードがＪａｖａ（登録商標）言語のメソッドのみ変換テーブルにクラス名、メソッド名、メソッドシグニチャがセットとして追加される。
【００７１】
＜ＪＮＩコードの生成処理（ステップＳ１５６）の流れ＞
図２０は、図１４におけるステップＳ１５６（ＪＮＩコードの生成処理）の詳細の流れを示すフローチャートである。ステップＳ３０１において、メソッド以外の全てのコードをＣコードで生成する処理を行う。ステップＳ３０２では、全てのメソッドについてプログラムコードの生成が完了したかどうかを判断する処理を行う。ステップＳ３０２で全てのメソッドの生成が完了すると本シーケンスを終了する。
【００７２】
ステップＳ３０２において全てのメソッドのプログラムコードの生成が完了していないと判断した場合は、ステップＳ３０３へ進む。ステップＳ３０３では、メソッドをＣコードで生成する処理を行う。例えば、図９のクラスＡＡＡのメソッドｇｅｔＮａｍｅについて、Ｃ言語のコード生成処理を行うと、図２１のようなプログラムコードを生成する処理を行う。
【００７３】
ステップＳ３０４では、図１５のステップＳ２０９で作成したラッパーファイルを取得する処理を行う。ステップＳ３０５では、ラッパーファイルからＪＮＩの書式に従ってＣのヘッダファイルを生成する処理を行う。ステップＳ３０６では、ステップＳ３０５で生成されたヘッダファイルのメソッドの定義部分をプログラムコードに生成する処理を行う。例えば、図９のクラスＡＡＡのメソッドｇｅｔＮａｍｅは、図２２の（ａ）のようなプログラムコードが生成される。
【００７４】
ステップＳ３０７では、ステップＳ３０６のメソッドが引数を持つかどうかを判断する処理を行う。ステップＳ３０７で引数を持たない場合は、ステップＳ３０９へ進む。ステップＳ３０８では、図１３の変換テーブル１５９を参照して引数に関する変換コードを挿入する処理を行う。例えば、図９のクラスＡＡＡのメソッドｇｅｔＮａｍｅは、図２２の（ｂ）のようなプログラムコードを生成する。
【００７５】
ステップＳ３０９では、ステップＳ３０６のメソッドが戻り値があるかどうかを取得する処理を行う。ステップＳ３０９で戻り値をとらない場合は、ステップＳ３１１へ進む。ステップＳ３１０では、図１２の変換テーブルを参照して戻り値に関する変換コードを挿入する処理を行う。例えば、図９のクラスＡＡＡのメソッドｇｅｔＮａｍｅは、図２２の（ｃ）のようなコードを生成する。
【００７６】
ステップＳ３１１では、全てのアクション記述がプログラムコードで生成されたかどうかを判断する処理を行う。ステップ３１１で生成が完了していない場合は、ステップＳ３１２へ進む。ステップＳ３１２では、アクション記述を１つ取得する処理を行う。ステップＳ３１３では、Ｊａｖａ（登録商標）メソッド呼び出しを生成するかどうかを判断する処理を行う。
【００７７】
ステップＳ３１３でＪａｖａ（登録商標）メソッド呼び出しを生成しないと判断した場合は、ステップＳ３１４へ進む。ステップＳ３１４においてアクション記述に相当するＣのコードを生成する。例えば、図９のクラスＡＡＡのメソッドｇｅｔＮａｍｅは、図２２の（ｄ）のようなコードを生成する。
【００７８】
ステップＳ３１３においてＪａｖａ（登録商標）メソッド呼び出しを生成すると判断した場合は、ステップＳ３１５へ進む。ステップＳ３１５において、図１７のステップＳ２５４で変換テーブルに登録した情報などから呼び出すＪａｖａ（登録商標）メソッドを呼び出すコードを生成する。例えば、図１８のクラス図においてクラスＡＡＡのメソッドｇｅｔＮａｍｅにおけるコードは、図２３のようになる。ステップＳ３１４またはステップＳ３１５が終了すると、ステップＳ３１１へ戻り、全てのアクションがプログラムコードに変換されるまでステップＳ３１１からステップＳ３１５までの処理を繰り返す。
【００７９】
ステップＳ３１１で全てのプログラムコード生成が完了すると、ステップＳ３０２へ戻り全てのメソッドがプログラムコード生成されるまでステップＳ３０２からステップＳ３１５までの処理を繰り返す。ステップＳ３０２で全てのメソッドのプログラムコード生成が完了すると本シーケンスを終了する。
【００８０】
以上の説明から明らかなように、本実施形態にかかるコード自動生成装置によれば、前もってクラス毎メソッド毎にどのプログラミング言語（Ｃ言語あるいはＪａｖａ（登録商標）言語）でプログラムコードを生成するかを指定し、設計図面から設計図面情報とコード生成制約情報を取得し、設計図面情報とコード生成制約情報と異なる言語間（Ｃ言語とＪａｖａ（登録商標）言語）での変換ルールを定めた変換テーブル情報とから設計図面のプログラムコード（Ｃ言語とＪａｖａ（登録商標）言語）を混在する形式で生成することが可能となる。
【００８１】
［第２の実施形態］
本発明の第２の実施形態にかかるコード自動生成装置は、上記第１の実施形態と同様に図１の構成によって実現されるが、処理内容として、図２の混在コード生成部１６０においてプログラムコード１６１を生成する時に、メモリ管理に関するプログラムコードが追加される点が異なっている。
【００８２】
具体的には上記第１の実施形態で説明した図９において、Ｃ言語のプログラムコードが生成されるクラスＡＡＡからＪａｖａ（登録商標）言語のプログラムコードが生成されるクラスＢＢＢに対して戻り値を返す場合、クラスＡＡＡで明示的にメモリ領域を獲得したデータが戻り値の場合、クラスＢＢＢに戻り値を返す前にメモリ領域を解放するプログラムコードを追加する。
【００８３】
以下、図面およびフローチャートを参照しながら、本発明の第２の実施形態にかかるコード自動生成装置について説明する。
【００８４】
図２４は、上記第１の実施形態で説明した図２０のステップＳ３１０の処理に代わる処理の流れを詳細に説明したフローチャートである。なお、本シーケンスは、プログラムコードが生成されるメソッドが特定されており、かつそのメソッドの戻り値を変換する必要があることが判明していることが前提となる。
【００８５】
まず、ステップＳ３５１において、メソッドの戻り値がＳｔｒｉｎｇであるかどうかを判断する処理を行う。ステップＳ３５１でＳｔｒｉｎｇでないと判断した場合は、本シーケンスを終了する。一方、ステップＳ３５１でＳｔｒｉｎｇであると判断した場合は、ステップＳ３５２へ進む。
【００８６】
ステップＳ３５２では、図２０のステップＳ３１０と同じ処理を行う。ステップＳ３５３では、戻り値の変換を行った元データがヒープ領域に獲得されたデータであるかどうかを判断する処理を行う。
【００８７】
ステップＳ３５３で元データがヒープ領域に獲得されていなければ、本シーケンスを終了する。一方、ステップＳ３５３で元データがヒープ領域に獲得されていれば、ステップＳ３５４へ進む。ステップＳ３５４では、ヒープ領域に獲得されたデータをヒープ領域から解放する処理を行い、本シーケンスを終了する。
【００８８】
図２５は、図９のＡＡＡクラスに対して図２４で示したフローチャートを実行した結果得られるプログラムコードである。ｇｅｔＮａｍｅメソッドで得られる元データがヒープ領域で獲得されているためｆｒｅｅＭｅｍｏｒｙメソッドを呼び出してヒープ領域から解放するプログラムコードを挿入している。
【００８９】
本実施形態では、Ｓｔｒｉｎｇに関するデータについて説明したが、Ｓｔｒｉｎｇ以外のデータであっても同様とする。
【００９０】
以上の説明から明らかなように本実施形態にかかるコード自動生成装置によれば、ヒープ領域に獲得されたデータをＪａｖａ（登録商標）言語で生成されるクラスに戻り値として返すにあたり、ヒープ領域に獲得したデータを解放するよう動作するプログラムコードを生成することが可能となる。
【００９１】
［他の実施形態］
なお、本発明は、複数の機器（例えばホストコンピュータ、インタフェイス機器、リーダ、プリンタなど）から構成されるシステムに適用しても、一つの機器からなる装置（例えば、複写機、ファクシミリ装置など）に適用してもよい。
【００９２】
また、本発明の目的は、前述した実施形態の機能を実現するソフトウェアのプログラムコードを記録した記憶媒体を、システムあるいは装置に供給し、そのシステムあるいは装置のコンピュータ（またはＣＰＵやＭＰＵ）が記憶媒体に格納されたプログラムコードを読出し実行することによっても、達成されることは言うまでもない。
【００９３】
この場合、記憶媒体から読出されたプログラムコード自体が前述した実施形態の機能を実現することになり、そのプログラムコードを記憶した記憶媒体は本発明を構成することになる。
【００９４】
プログラムコードを供給するための記憶媒体としては、例えば、フロッピ（登録商標）ディスク、ハードディスク、光ディスク、光磁気ディスク、ＣＤ−ＲＯＭ、ＣＤ−Ｒ、磁気テープ、不揮発性のメモリカード、ＲＯＭなどを用いることができる。
【００９５】
また、コンピュータが読出したプログラムコードを実行することにより、前述した実施形態の機能が実現されるだけでなく、そのプログラムコードの指示に基づき、コンピュータ上で稼働しているＯＳ（オペレーティングシステム）などが実際の処理の一部または全部を行い、その処理によって前述した実施形態の機能が実現される場合も含まれることは言うまでもない。
【００９６】
さらに、記憶媒体から読出されたプログラムコードが、コンピュータに挿入された機能拡張ボードやコンピュータに接続された機能拡張ユニットに備わるメモリに書込まれた後、そのプログラムコードの指示に基づき、その機能拡張ボードや機能拡張ユニットに備わるＣＰＵなどが実際の処理の一部または全部を行い、その処理によって前述した実施形態の機能が実現される場合も含まれることは言うまでもない。
【図面の簡単な説明】
【００９７】
【図１】本発明の第１の実施形態にかかるプログラムコード生成装置の全体構成を示す図である。
【図２】混在コード自動生成プログラム１０５の構成要件とそれら構成要件がＲＡＭ１０３に格納されるデータとどのような関係にあるかを示すブロック図である。
【図３】設計図面の全体構成を規定する図面（ドメイン図）の一例を示す図である。
【図４】モデルの静的な構造を示す設計図面（クラス図）の一例を示す図である。
【図５】モデルの動的な振る舞いを定義する設計図面（状態遷移図）の一例を示す図である。
【図６】クラスＡＡＡにおけるアクション定義の例を示す図である。
【図７】混在コード（Ｃ言語プログラムを出力するかＪａｖａ（登録商標）言語プログラムを出力するか）を設定する時のユーザインタフェースのイメージ図である。
【図８】設計図面解析部１５２において設計図面を解析した結果、得られた設計図面情報１５４のイメージ図である。
【図９Ａ】設計図面の一例を示したイメージ図である。
【図９Ｂ】各クラスをどのプログラミング言語でコード生成するかを設定した場合のイメージ図である。
【図９Ｃ】設計図面を解析することによって得られる混在コードのインタフェースを示したイメージ図である。
【図９Ｄ】Ｃ言語とＪａｖａ（登録商標）言語のプログラムコードを混在して生成するように設定された設計図面について、プログラムコードを生成する場合のブロック図である。
【図１０】本発明の第１の実施形態にかかるプログラムコード生成装置の混在コード自動生成プログラム１０５の生成コード特定部１５６における処理の流れを示すフローチャートである。
【図１１】コード生成制約情報のイメージ図である。
【図１２】ＣコードからＪａｖａ（登録商標）コードへの変換規則に関する変換テーブルの一例を示す図である。
【図１３】Ｊａｖａ（登録商標）コードからＣコードへの変換規則に関する変換テーブルの一例を示す図である。
【図１４】混在コード自動生成プログラム１０５の混在コード生成部１６０における処理の流れを示すフローチャートである。
【図１５】Ｊａｖａ（登録商標）コード生成処理の詳細な流れを示すフローチャートである。
【図１６】クラスＢＢＢのプログラムコード、及びクラスＡＡＡのラッパーファイルのイメージ図である。
【図１７】シグニチャ登録処理の詳細な流れを示すフローチャートである。
【図１８】クラスＡＡＡからクラスＤＤＤのメソッドｇｅｔＮｕｍｂｅｒを呼びだしている様子を示した設計図面（クラス図）である。
【図１９】変換テーブルの一例を示す図である。
【図２０】ＪＮＩコードの生成処理の詳細な流れを示すフローチャートである。
【図２１】Ｃ言語のプログラムコードの一例を示す図である。
【図２２】ＪＮＩのプログラムコードの一例を示す図である。
【図２３】Ｃ言語のプログラムコードからＪａｖａ（登録商標）言語のプログラムコードを呼び出すコードの一例を示す図である。
【図２４】ヒープ領域のデータを解放するコードを生成する処理の流れを示すフローチャートである。
【図２５】ヒープ領域のデータを解放するコードが追加されたＪＮＩのプログラムコードの一例を示す図である。
【符号の説明】
【００９８】
１０１  ＣＰＵ
１０２  バス
１０３  ＲＡＭ
１０４  ＲＯＭ
１０６  入力インタフェース
１０７  入力装置
１０８  出力インタフェース
１１０  表示装置
１１１  出力装置
１１２  外部記憶装置インタフェース
１１３  外部記憶装置
【図１】
2006293436.tif 000003
【図２】
2006293436.tif 000004
【図３】
2006293436.tif 000005
【図４】
2006293436.tif 000006
【図５】
2006293436.tif 000007
【図６】
2006293436.tif 000008
【図７】
2006293436.tif 000009
【図８】
2006293436.tif 000010
【図９Ａ】
2006293436.tif 000011
【図９Ｂ】
2006293436.tif 000012
【図９Ｃ】
2006293436.tif 000013
【図９Ｄ】
2006293436.tif 000014
【図１０】
2006293436.tif 000015
【図１１】
2006293436.tif 000016
【図１２】
2006293436.tif 000017
【図１３】
2006293436.tif 000018
【図１４】
2006293436.tif 000019
【図１５】
2006293436.tif 000020
【図１６】
2006293436.tif 000021
【図１７】
2006293436.tif 000022
【図１８】
2006293436.tif 000023
【図１９】
2006293436.tif 000024
【図２０】
2006293436.tif 000025
【図２１】
2006293436.tif 000026
【図２２】
2006293436.tif 000027
【図２３】
2006293436.tif 000028
【図２４】
2006293436.tif 000029
【図２５】
2006293436.tif 000030