JP2024008554A - 開発プログラム、情報処理システム、情報処理装置、および、情報処理方法 - Google Patents

開発プログラム、情報処理システム、情報処理装置、および、情報処理方法 Download PDF

Info

Publication number
JP2024008554A
JP2024008554A JP2022110523A JP2022110523A JP2024008554A JP 2024008554 A JP2024008554 A JP 2024008554A JP 2022110523 A JP2022110523 A JP 2022110523A JP 2022110523 A JP2022110523 A JP 2022110523A JP 2024008554 A JP2024008554 A JP 2024008554A
Authority
JP
Japan
Prior art keywords
code
type
function
application program
definition
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2022110523A
Other languages
English (en)
Inventor
賢人 星
Kento Hoshi
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nintendo Co Ltd
Original Assignee
Nintendo Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nintendo Co Ltd filed Critical Nintendo Co Ltd
Priority to JP2022110523A priority Critical patent/JP2024008554A/ja
Priority to US18/348,703 priority patent/US20240012625A1/en
Publication of JP2024008554A publication Critical patent/JP2024008554A/ja
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented
    • G06F9/4493Object persistence

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computing Systems (AREA)
  • Stored Programmes (AREA)

Abstract

Figure 2024008554000001
【課題】対象となるオブジェクトなどの型の変更などに影響されない、シリアライズおよび/またはデシリアライズの処理を実現する。
【解決手段】型に基づいてオブジェクトを生成するプログラム言語を用いてアプリケーションプログラムを開発するための開発プログラムが提供される。開発プログラムは、情報処理装置のコンピュータを、アプリケーションプログラムのソースコード内の型定義を特定する特定手段と、特定された型定義に基づいて生成されるオブジェクトの各々に対応するアセットデータ用の中間オブジェクトを生成する第1コードを生成し、当該生成した第1コードをアプリケーションプログラムのソースコードに追加するコード追加手段として機能させる。中間オブジェクトがアセットデータとして保存される。
【選択図】図1

Description

本開示は、アプリケーションプログラムの開発環境に関し、より具体的には、データのシリアライズおよびデシリアライズに関する。
従来から、シリアライズと称される、実行中のアプリケーションプログラムが管理するデータをストレージ上などに書き出す(永続化する)処理が公知である。なお、シリアライズされた(あるいは、後にシリアライズされる)データは、アセットデータと称される。
例えば、特開2018-32154号公報(特許文献1)は、複数のバージョンのクラス・インスタンスの保存/回復を容易に実現することが可能なシリアライズ・データ処理装置などを開示する。
特開2018-32154号公報
実行中のアプリケーションプログラムが管理するオブジェクトをシリアライズする場合には、当該オブジェクトの型に対応するデータ構造をもつデータが書き出される。アプリケーションプログラムを開発している段階においては、オブジェクトの型は変更されることもある。オブジェクトの型が変更された場合、先に書き出されていたデータをアプリケーションソフトで再利用することが難しくなる。
本開示の一つの目的は、対象となるオブジェクトなどの型の変更などに影響されない、シリアライズおよび/またはデシリアライズの処理を実現することである。
(構成1)ある実施の形態に従えば、型に基づいてオブジェクトを生成するプログラム言語を用いてアプリケーションプログラムを開発するための開発プログラムが提供される。開発プログラムは、情報処理装置のコンピュータを、アプリケーションプログラムのソースコード内の型定義を特定する特定手段と、特定された型定義に基づいて生成されるオブジェクトの各々に対応するアセットデータ用の中間オブジェクトを生成する第1コードを生成し、当該生成した第1コードをアプリケーションプログラムのソースコードに追加するコード追加手段として機能させる。中間オブジェクトがアセットデータとして保存される。
構成1によれば、アプリケーションプログラムのソースコード内の型定義に基づいて生成されるオブジェクトに対応する中間オブジェクトを生成するための第1コードを自動的に生成できる。中間オブジェクトはアセットデータとして保存することができる。このように、アプリケーションプログラムのオブジェクトとは別の中間オブジェクトを利用できるので、対象となるオブジェクトなどの型の変更などに影響されない、シリアライズおよび/またはデシリアライズの処理を実現できる。
(構成2)構成1に記載の開発プログラムにおいて、コード追加手段は、中間オブジェクトの型定義である第2コードをアプリケーションプログラムのソースコードにさらに追加してもよい。第2コードの型定義に従って、中間オブジェクトが生成されてもよい。構成2によれば、第2コードを用いて中間オブジェクトの型を定義できるので、出力すべきアセットデータに応じた中間オブジェクトを生成できる。
(構成3)構成1または2に記載の開発プログラムにおいて、第2コードにおいて、中間オブジェクトの型は、対応するソースコード内の型定義とは独立して定義されてもよい。構成3によれば、中間オブジェクトの型は、アプリケーションプログラムのオブジェクトの型とは独立したものとできる。そのため、アプリケーションプログラムのオブジェクトの型が変更された場合であっても、アセットデータへの影響を受けないようにできる。
(構成4)構成1~3のいずれかに記載の開発プログラムにおいて、第2コードにおいて、中間オブジェクトの型は、共通の型定義を継承するように定義されてもよい。構成4によれば、共通の型定義に共通のメンバ関数の定義などを含めておくことで、中間オブジェクトの型定義を簡素化できる。
(構成5)構成1~4のいずれかに記載の開発プログラムにおいて、第2コードは、予め指定された関数により取得される値または予め指定された値を、中間オブジェクトに保持するための処理、を呼び出す処理を行うためのコードを含んでいてもよい。構成5によれば、アプリケーションのオブジェクトが保持するデータをそのまま中間オブジェクトに保持するだけではなく、予め指定された関数により取得される値または予め指定された値を中間オブジェクトに保持することができるので、プログラム開発の柔軟性や利便性を高めることができる。
(構成6)構成1~5のいずれかに記載の開発プログラムにおいて、第2コードは、中間オブジェクトが保持するプロパティの値を予め指定された関数に引き渡す処理、を呼び出す処理を行うためのコードを含んでいてもよい。構成6によれば、中間オブジェクトが保持するプロパティの値を予め指定された関数に引き渡すことができる。例えば、予め指定された関数として、アプリケーションのオブジェクトにデータを設定する関数を指定することで、中間オブジェクトからアプリケーションのオブジェクトへのデータの設定を容易に実現できる。
(構成7)構成1~6のいずれかに記載の開発プログラムにおいて、第2コードは、中間オブジェクトの型ごとに、中間オブジェクトのプロパティの値を予め定められた形式で出力する処理、を呼び出す処理を行うためのコードを含んでいてもよい。構成7によれば、中間オブジェクトが保持しているプロパティの値を予め定められた形式で出力する処理を中間オブジェクトから呼び出すことができるので、アプリケーションプログラムなどにおいて、アセットデータを書き出す処理を容易に実装できる。
(構成8)構成1~7のいずれかの開発プログラムにおいて、特定手段は、アプリケーションプログラムのソースコードから、プロパティの名称を指定する第1記述と、値を取得するための関数または変数を指定する第2記述とを含む、所定の記述を抽出してもよい。構成8によれば、第1記述および第2記述に基づいて、第1コードを生成できる。
(構成9)構成1~8のいずれかの開発プログラムにおいて、コード追加手段は、中間オブジェクトの履歴を保持する処理を実行する第3コードをアプリケーションプログラムのソースコードにさらに追加してもよい。構成9によれば、中間オブジェクトが保持するプロパティの値に対するUndoやRedoといった編集操作を実現できる。
(構成10)別の実施の形態に従えば、型に基づいてオブジェクトを生成するプログラム言語を用いてアプリケーションプログラムを開発するための情報処理システムが提供される。情報処理システムは、アプリケーションプログラムのソースコード内の型定義を特定する特定手段と、特定された型定義に基づいて生成されるオブジェクトの各々に対応するアセットデータ用の中間オブジェクトを生成する第1コードを生成し、当該生成した第1コードをアプリケーションプログラムのソースコードに追加するコード追加手段とを含む。中間オブジェクトがアセットデータとして保存される。
(構成11)別の実施の形態に従えば、1または複数のプロセッサと、プログラムを格納するメモリとを備えた情報処理装置が提供される。情報処理装置は、1または複数のプロセッサがプログラムを実行することで、型に基づいてオブジェクトを生成するプログラム言語を用いて記述された、アプリケーションプログラムのソースコード内の型定義を特定する処理と、特定された型定義に基づいて生成されるオブジェクトの各々に対応するアセットデータ用の中間オブジェクトを生成する第1コードを生成し、当該生成した第1コードをアプリケーションプログラムのソースコードに追加する処理とを実行する。中間オブジェクトがアセットデータとして保存される。
(構成12)別の実施の形態に従えば、型に基づいてオブジェクトを生成するプログラム言語を用いてアプリケーションプログラムを開発するためのコンピュータが実行する情報処理方法が提供される。情報処理方法は、型に基づいてオブジェクトを生成するプログラム言語を用いて記述された、アプリケーションプログラムのソースコード内の型定義を特定するステップと、特定された型定義に基づいて生成されるオブジェクトの各々に対応するアセットデータ用の中間オブジェクトを生成する第1コードを生成し、当該生成した第1コードをアプリケーションプログラムのソースコードに追加するステップとを含む。前記中間オブジェクトがアセットデータとして保存される。
本開示によれば、対象となるオブジェクトなどの型の変更などに影響されない、シリアライズおよび/またはデシリアライズの処理を実現できる。
本実施の形態に従う情報処理装置のハードウェア構成例を示す模式図である。 型および型に基づいて生成されるオブジェクトの一例を示す図である。 シリアライズにより生成されたアセットデータの一例を示す図である。 本実施の形態に従う情報処理装置が生成するアプリケーションプログラムの実行状態の一例を説明するための図である。 本実施の形態に従う情報処理装置の機能構成例を示す模式図である。 本実施の形態に従う情報処理装置のビルド処理の処理手順例を示すフローチャートである。 図6に示す追加コードの生成処理(ステップS6)の処理手順例を示すフローチャートである。 シリアライズ定義記述およびそれに基づいて生成される追加コードの一例を示す図である。 図8(B)に示す追加コードにより実装されるソフトウェア構成を模式的に示す図である。 シリアライズ定義記述およびそれに基づいて生成される追加コードの別の一例を示す図である。 シリアライズ定義記述およびそれに基づいて生成される追加コードのさらに別の一例を示す図である。 シリアライズ定義記述およびそれに基づいて生成される追加コードのさらに別の一例を示す図である。 自動生成される追加コードの編集例を示す図である。 型指定記述を明示的に含むシリアライズ定義記述の例を示す。 本実施の形態に従う情報処理装置におけるビルド時のシリアライズ定義記述の取り扱いを説明するための図である。 本実施の形態に従う情報処理装置が生成したアプリケーションプログラムの実行中に生成される中間オブジェクトのメンバ関数の処理を説明するための図である。 本実施の形態に従う情報処理装置が生成したアプリケーションプログラムの実行中に生成される中間オブジェクトのメンバ関数の処理を説明するための図である。 本実施の形態に従う情報処理装置が生成したスキーマファイルの一例を示す図である。 本実施の形態に従う情報処理装置が生成したスキーマファイルの利用例を説明するための図である。 本実施の形態に従う情報処理装置が生成したスキーマファイルの利用例を説明するための図である。 本実施の形態に従う情報処理装置が生成したスキーマファイルの利用例を説明するための図である。
本実施の形態について、図面を参照しながら詳細に説明する。なお、図中の同一または相当部分については、同一符号を付してその説明は繰り返さない。
[A.概要]
本実施の形態においては、型に基づいてオブジェクト(インスタンス)を生成するプログラミング言語(典型的には、オブジェクト指向の言語)を用いてアプリケーションプログラムを開発するための開発プログラムおよび情報処理装置などが例示される。アプリケーションプログラムのソースコードは、型に基づいてオブジェクトを生成するプログラム言語を用いて記述される。
本実施の形態に従う情報処理装置は、アプリケーションプログラム(ランタイムプログラム)が生成するオブジェクト(インスタンス)が保持するデータをシリアライズする際に、そのオブジェクトの型定義で出力するのではなく、その型定義と独立したデータ構造でアセットデータを出力できるようにコードを追加的に生成する。ここで、開発されるアプリケーションプログラムは、ゲームプログラムや実用アプリケーションプログラムであってもよいし、開発ツールのプログラムであってもよい。
この構成によって、シリアライズ対象のオブジェクトの型定義とは独立して、任意のデータ構造(型)のアセットデータを出力できるので、プログラム開発の柔軟性や利便性を高めることができる。例えば、アプリケーションプログラムの開発途中で、型定義が変更(メンバの追加や削除、プロパティの名称の変更、プロパティのデータ型の変更など)された場合や、プログラム環境によって型の表現が異なるような場合であっても、出力されたアセットデータを汎用的に利用できる。また、シリアライズ対象のオブジェクトの型に存在しないデータや、シリアライズ対象のオブジェクトと異なるデータ型のデータをアセットデータに含めることができる。
[B.ハードウェア構成例]
本実施の形態に従う情報処理装置はどのようなハードウェア構成例を採用してもよい。情報処理装置は、1または複数のプログラムを実行する単一のコンピュータにより構成されてもよい。コンピュータは、据置型であってもよいし、携帯型であってもよい。また、情報処理装置は、複数のコンピュータを用いて実現されてもよい。複数のコンピュータを用いる場合には、ネットワーク上のクラウド環境が提供するコンピューティングリソースを用いるようにしてもよい。そのため、本明細書において、「情報処理装置」との用語は、複数のコンピュータあるいはコンピューティングリソースを用いた「情報処理システム」を包含する。
以下の説明においては、説明の簡素化のため、単一のコンピュータを用いて情報処理装置を実現する構成例について説明するが、本願の技術的範囲は、単一のコンピュータを用いて実現する構成に限定されるものではない。
図1は、本実施の形態に従う情報処理装置100のハードウェア構成例を示す模式図である。図1を参照して、情報処理装置100は、主たるハードウェアコンポーネントとして、1または複数のプロセッサ102と、メモリ104と、ディスプレイ106と、入力部108と、ストレージ110と、通信モジュール122とを含む。これらのハードウェアコンポーネントは、バス124を介して通信可能に接続される。
プロセッサ102は、メモリ104に展開されたマシンコードに従って命令を実行する演算部であり、例えば、CPU(Central Processing Unit)やGPU(Graphics Processing Unit)などで構成される。
メモリ104は、プロセッサ102が命令を実行するためのマシンコードや各種ワークデータを一時的に格納する不揮発性記憶装置であり、例えば、DRAM(Dynamic Random Access Memory)やSRAM(Static Random Access Memory)などで構成される。
ディスプレイ106は、プロセッサ102での演算処理によって生成される映像情報を表示し、例えば、LCD(Liquid Crystal Display)や有機EL(ElectroLuminescent)ディスプレイなどの表示デバイスで構成される。
入力部108は、例えば、ユーザ操作を受け付けるマウスやキーボードなどの入力デバイスで構成される。
ストレージ110は、情報処理装置100において生成および利用されるデータを不揮発的に格納する不揮発性記憶装置であり、例えば、SSD(Solid State Drive)やHDD(Hard Disk Drive)などで構成される。典型的には、ストレージ110には、OS(Operating System)やドライバなどを含むシステムプログラム112と、アプリケーションプログラムを開発するための開発プログラム114と、ソースコードを含むプロジェクト116とが格納される。また、ストレージ110には、プロジェクト116から生成されたアプリケーションプログラム118(実行可能ファイル)が格納されてもよい。
開発プログラム114は、アプリケーションプログラム118を開発するためのプログラムであり、アプリケーションプログラム118のソースコードの作成編集、ソースコードのコンパイル、コンパイルにより生成されたオブジェクトのリンクといった、アプリケーションプログラム118の開発に必要な機能を提供する。さらに、開発プログラム114は、後述するような機能および処理を提供する。
開発プログラム114は、情報処理装置100の製造段階においてストレージ110に格納されていてもよいし、配信サーバ(図示しない)からダウンロードの形で提供されてもよい。さらに、開発プログラム114を格納するコンピュータ読取可能記憶媒体(例えば、USB(Universal Serial Bus)メモリやメモリカード)(図示しない)を情報処理装置100に装着し、装着されたコンピュータ読取可能記憶媒体から開発プログラム114を読み出してストレージ110にインストールするようにしてもよい。
説明の便宜上、単一の開発プログラム114を示すが、複数のプログラムから構成されていてもよい。例えば、基本的な開発環境を提供するプログラムに対して、後述するような機能および処理を実現するためのモジュールやライブラリを追加(アドオン)するような形態であってもよい。そのため、本発明の技術的範囲は、後述するような機能および処理のすべてを実現する単一の開発プログラムだけではなく、後述するような機能および処理を実現するための1または複数のモジュールやライブラリなども含む。
通信モジュール122は、外部装置との間で無線通信するためのモジュールであり、例えば、イーサネット(登録商標)や無線LANなどのモジュールで構成される。
なお、図1には、プロセッサ102がプログラム(システムプログラム112および開発プログラム114)を実行することで各種処理を実現する形態(すなわち、ソフトウエア実装)を例示するが、これらの処理の一部または全部をハードワイヤード回路で実現してもよい。具体的には、ASIC(Application Specific Integrated Circuit)やFPGA(Field-Programmable Gate Array)を含む演算回路(processing circuitry)を用いて、情報処理装置100が提供すべき機能および処理の一部または全部を実現してもよい。なお、演算回路には、プロセッサ102およびメモリ104を含めるようにしてもよい。したがって、情報処理装置100が提供すべき機能および処理は、プロセッサ102およびメモリ104、ならびに/または、ASICもしくはFPGAのようなハードワイヤード回路を含む、演算回路によって実現されるとも言える。
[C.シリアライズおよびデシリアライズ]
次に、シリアライズ(serialize)およびデシリアライズ(deserialize)について説明する。
シリアライズは、プログラムが管理するデータ(通常は、メモリ上に配置されている)を、ストレージ上などに書き出す(永続化する)処理である。以下の説明においては、永続化されたデータ、および、永続化される予定のデータを「アセットデータ」と称す。
デシリアライズは、ストレージ上などに永続化されたデータ(アセットデータ)をプログラムで処理できるように読み出す(メモリに展開する)処理である。なお、アセットデータは、ストレージだけではなく、ROM(Read Only Memory)やネットワーク上のサーバなどに格納されていてもよい。
シリアライズおよびデシリアライズに関して、プログラムが生成および管理するデータ構造の一例について説明する。
図2は、型および型に基づいて生成されるオブジェクトの一例を示す図である。図2には、一例として、C++に従うコード例を示す。
図2(A)は、型(type)定義のコード例を示す。型は、プログラム上で利用されるデータ構造を示す。図2(A)には、構造体として定義されたMyData型の例(符号10)を示す。この例示されるコードでは、MyData型は、メンバとして、整数型のデータを保持するプロパティvalue1(符号11)と、浮動小数点型のデータを保持するプロパティdistance(符号12)とを含むことが定義されている。
このように、型の定義は、プログラムが取り扱うデータ構造とふるまい(プロパティのデータ型)との定義を含むことができる。
図2(B)は、図2(A)で定義される型からオブジェクトを生成するコードの一例を示す。オブジェクトは、具体的な値を保持するデータ実体である。オブジェクトが保持する値(データ)は、メモリ上に配置されることになる。
図2(B)は、MyData型のオブジェクトであるmyData1(符号20)を生成し、具体的な値を保持させるコードの例を示す。オブジェクトmyData1は、プロパティvalue1の値として"10"を保持し(符号21)、プロパティdistanceとして"10.f"を保持する(符号22)。なお、".f"は、浮動小数点型の数値を示す表現である。
図2(C)は、図2(B)に示すオブジェクトが保持する値(データ)がメモリ上に配置された状態(バイナリ表現)の一例を示す(符号25)。図2(C)に示すように、プロパティvalue1およびプロパティdistanceのそれぞれの値が単に連続的にメモリ上に配置される。
図2(C)に示すような、メモリ上に配置されたオブジェクトのデータをそのまま保存した場合には、その後のデータの取り扱いにおいて問題が生じ得る。例えば、メモリ上のデータは、定義されたプロパティの順番に従って配置された値のみからなる。そのため、例えば、プロパティが追加された場合などにおいては、変更後の型とデータに含まれる値とを適切に対応付けることができなくなる。
また、同様のデータ型の値であっても、OS、プロセッサのアーキテクチャ、プログラミング言語、プログラミング言語のバージョンなどによって、バイナリ表現が異なる場合がある。そのため、特定の環境において生成されたバイナリ表現をそのまま保存したとしても、異なる環境においては、そのままでは適切に読み込むことができない場合もある。
上述したような問題に対応するために、汎用的な形式で(例えば、JSON形式で)シリアライズする手法が用いられる。
図3は、シリアライズにより生成されたアセットデータ300の一例を示す図である。図3には、一例として、JSON形式のアセットデータ300を示す。JSON形式においては、キーと値とのペアがコロンで区切って記述される。
図3に示す例では、アセットデータ300は、プロパティとして、名称"value1"と値とのペア、および、名称"distance"と値とのペアを含む。以下の説明においては、アセットデータ300に含まれる"value1"および"distance"の各々をプロパティの名称と称し、対応する各値をプロパティの値と称す。
なお、シリアライズにより生成されるアセットデータ300は、JSON形式だけではなく、例えば、タグを用いるXML形式であってもよい。さらに、それ以外の任意の形式を採用してもよい。
図3に示すような名称と値とのペアからなるアセットデータ300を生成することで、データを汎用的に取り扱うことができる。なお、JSON形式やXML形式などの汎用形式を採用することで、汎用的に提供されているライブラリなどを利用できる。これによって、どのような環境であっても、同じアセットデータ300を読み込んで、プログラムで利用できる。
また、名称と値とのペアの単位で処理できるので、アセットデータ300を利用できる。例えば、変更後の型に対応するプロパティがなければ、アセットデータ300に含まれるデータの読み込みをスキップすればよい。
本実施の形態に従う情報処理装置100は、図3に示すようなアセットデータ300をより容易に利用できる仕組みを提供する。
[D.シリアライズおよびデシリアライズの支援]
次に、本実施の形態に従う情報処理装置100がシリアライズおよびデシリアライズを支援するための機能および処理について説明する。
本実施の形態に従う情報処理装置100は、静的型付け言語(例えば、C++)で記述されたプログラムのシリアライズおよびデシリアライズを支援する。すなわち、静的型付け言語であれば、対象とするプログラミング言語の種類は限定されない。
静的型付け言語では、プログラムの実行によって生成されるオブジェクトの型が予めソースコードで定義される。また、関数は、予め定められた型のオブジェクトのみを処理することが前提となっている。そのため、関数を用いて、汎用的にシリアライズを行うことは難しい。なお、動的型付け言語は、オブジェクトのシリアライズを容易に行うための機能が実装されているものもある。
本実施の形態においては、アプリケーションプログラム118のソースコードに所定の記述を付加することで、本実施の形態に特徴的なシリアライズおよびデシリアライズを実現するためのコードが自動的に生成される。説明の便宜上、この付加される所定の記述を「シリアライズ定義記述」と称し、自動的に生成されるコードを、「追加コード」と称す。なお、ユーザ(アプリケーションプログラム118の開発者)は、エディタなどを操作して、ソースコード(後述の図5などに示すソースコード160)を作成する。この開発者により作成されるソースコードを、追加コードと区別する意味で、便宜的に「オリジナルのソースコード」と称す。
追加コードは、アプリケーションプログラム118の対象のオブジェクトのデータを保持する処理(シリアライズ)として実行される。追加コードは、対象の値をアプリケーションプログラム118の対象のオブジェクトのメンバ変数の値として保持する処理(デシリアライズ)として実行されてもよい。
シリアライズ定義記述は、シリアライズ(およびデシリアライズ)の内容を定義する記述である。この記述により、アプリケーションプログラム118のオブジェクトのうちシリアライズ対象となるオブジェクトの型(定義)が指定される。本実施の形態においては、アプリケーションプログラム118のソースコードで規定される型のうち、シリアライズ対象にしたい型に対して指定を行うことで、当該指定された型で生成されるオブジェクトがシリアライズ対象となる(以下の説明において、シリアライズ対象として指定された型を「シリアライズ対象型」と称す。)。本実施の形態においては、シリアライズ対象型を用いて生成されるオブジェクト(インスタンス)が複数ある場合、いずれのオブジェクトもシリアライズ対象となる。なお、シリアライズ定義記述は、ユーザ(アプリケーションプログラム118の開発者)によりアプリケーションプログラム118のソースコード内に記述される。
1つの実施例においてシリアライズ定義記述には、以下の(1)~(4)が含まれる。
(1)シリアライズ対象型を指定する記述(以下、「型指定記述」と称す。)
型指定記述は、データ保持の対象となるオブジェクトの型を指定する。シリアライズ対象となるオブジェクトの型の名称を型指定記述として記述してもよいし、シリアライズ対象となる型定義の内部に(または、近接した位置に)シリアライズ定義記述を配置することで、その型をシリアライズ対象として指定するようにしてもよい。
(2)シリアライズおよびデシリアライズのための関数を指定する記述(以下、「関数指定記述」と称す。)
関数指定記述としては、シリアライズ対象の型のメンバ関数を指定してもよいが、それと異なる任意の関数を指定してよい。本実施の形態においては、シリアライズのために用いられる関数(以下、当該関数を指定する記述を「シリアライズ関数指定記述」と称す。)と、デシリアライズのために用いられる関数(以下、当該関数を指定する記述を「デシリアライズ関数指定記述」と称す。)とのそれぞれを指定する。
シリアライズ関数指定記述は、値を取得するための関数、および/または、任意の変数を指定する。シリアライズ関数指定記述について、指定される関数は、アセットデータのプロパティに保持する値を取得する関数である。指定される関数は、シリアライズの対象となるオブジェクトのプロパティの値をそのまま返す関数を指定してもよいが、これに限られず、いかなる関数であってもかまわない。シリアライズの対象となるオブジェクトのプロパティの値を用いて何らかの演算をした結果の値を返すものであってもよいし、シリアライズの対象となるオブジェクトのプロパティの値を全く用いないもの(定数値や文字列、他の型のメンバのプロパティの値やそれを用いた演算結果など)であってもよい。
このように、シリアライズ関数指定記述で指定される関数は、シリアライズの対象となるオブジェクトのプロパティの値を(そのまま)取得する関数であってもよいし、シリアライズの対象となるオブジェクトのプロパティの値を用いて所定の演算を行った結果を取得する関数であってもよい。さらに、シリアライズ関数指定記述で指定される関数は、予め定められた定数を取得する関数であってもよい。
デシリアライズ関数指定記述も関数を指定する。デシリアライズ関数指定記述について、指定される関数は、アセットデータのプロパティの値を用いて、アプリケーションプログラム118のオブジェクトのプロパティの値を設定する関数である。この関数は、アセットデータのプロパティの値をそのままアプリケーションプログラム118のオブジェクトの値として設定する関数でもよいが、これに限られず、いかなる関数であってもかまわない。アセットデータのプロパティの値を用いて何らかの演算をした結果の値をアプリケーションプログラム118のオブジェクトの値として設定するものであってもよいし、アセットデータのプロパティの値を全く用いないもの(定数値や文字列、他のアセットデータのプロパティの値やそれを用いた演算結果など)であってもよい。
このように、デシリアライズ関数指定記述で指定される関数は、アセットデータのプロパティの値を(そのまま)取得する関数であってもよいし、アセットデータのプロパティの値を用いて所定の演算を行った結果を取得する関数であってもよい。さらに、デシリアライズ関数指定記述で指定される関数は、予め定められた定数を取得する関数であってもよい。
(3)アセットデータにおけるプロパティ名称を指定する記述(以下、「名称指定記述」と称す。)
名称指定記述は、プロパティ名称であるデータ名を指定する。なお、名称指定記述として指定されるプロパティ名称は、後述する中間オブジェクトにおけるプロパティ名称でもある。
(4)アセットデータにおけるプロパティのデータ型を指定する記述(以下、「データ型指定記述」と称す。)
なお、データ型指定記述として指定されるデータ型は、後述する中間オブジェクトにおけるプロパティのデータ型でもある。
本実施の形態では、アセットデータとして保持する前に中間オブジェクトとして保持し、その後、この中間オブジェクトをシリアライズしてアセットデータとして保持する。この場合、上述において、「アセットデータ」として説明した箇所は、「中間オブジェクト」と読み替えて理解される。すなわち、中間オブジェクトがアセットデータとして保存されてもよい。
アプリケーションプログラム118の実行時において、追加コードに記述された処理が実行されることにより、オリジナルのソースコード内のシリアライズ対象のオブジェクトの型定義とアセットデータにおけるデータ構造とを独立させることが可能となる。
例えば、シリアライズ関数指定記述において、アプリケーションプログラム118のオブジェクトのメンバであるプロパティ(名称が「プロパティA」)の値(そのもの)を出力する関数を指定し、名称指定記述において、プロパティAの名称と異なる名称(例えば、「プロパティB」)を指定すれば、アプリケーションプログラム118のオブジェクトのプロパティの値(「プロパティA」の値)を異なる名称(「プロパティB」)でアセットデータ(または、中間オブジェクト、以下同様)に保存することができる。
逆に、デシリアライズ関数指定記述において、アセットデータのプロパティの値をそのままアプリケーションプログラム118のオブジェクトの「プロパティA」の値にセットする関数を指定し、名称指定記述において、「プロパティB」を指定すれば、アセットデータを読み出す際に、アセットデータのプロパティ名称と異なる名称でデシリアライズすることもできる。
また、データ型指定記述において、「プロパティA」のデータ型(例えば、int型)と異なるデータ型(例えば、string型)を指定すれば、アプリケーションプログラム118のオブジェクトのプロパティの値を異なるデータ型でアセットデータに保存することができる。
また、シリアライズ関数指定記述において、アプリケーションプログラム118のオブジェクトのプロパティAの値を用いて何らかの演算をした値を出力する関数を指定すれば、アプリケーションプログラム118のオブジェクトのプロパティの値そのものではなく、演算した値をアセットデータに保存することができる。
さらに、シリアライズ関数指定記述において、アプリケーションプログラム118のオブジェクトのメンバと関係のないデータを出力する関数を指定すれば、アプリケーションプログラム118のオブジェクトに存在しない任意のデータをアセットデータに保存することができる。
本実施の形態では、シリアライズおよびデシリアライズのための関数を指定するようにした。これらの関数内で任意のコードを書くことができるので、シリアライズにおいては、アセットデータのプロパティが保持する値の自由度を高くすることができ、デシリアライズにおいては、アプリケーションプログラム側のプロパティが保持する値の自由度を高くすることができる。
しかしながら、シリアライズおよびデシリアライズのいずれについても、関数の代わりに、変数(の名称)や定数(の名称)を指定するようにしてもよい。その場合、アセットデータのプロパティが保持する値はその変数の値や定数の値となり(シリアライズ)、アプリケーションプログラム側のプロパティが保持する値はその変数の値や定数の値となる(デシリアライズ)。なお、これらの変数や定数はシリアライズ対象のオブジェクトのメンバ変数であってもよいし、外部変数や外部定数であってもよい。
なお、本実施の形態においては、シリアライズ対象を指定する際に、オリジナルのソースコードの型を指定するようにした。その場合、指定された型で生成されるオブジェクトのすべてがシリアライズ対象となるが、一部のオブジェクトだけをシリアライズ対象として指定してもよい。
シリアライズ定義記述の具体例については後述する。
本明細書において、「手続き(procedure)」との用語は、プログラムにおいて特定の処理を実行するための記述を意味する。「手続き」は、例えば、関数、メンバ関数、メソッド、指令、サブルーチン、サブプログラムなどを含む。以下の説明においては、主として、関数またはメンバ関数を「手続き」の一例として説明する。
後述するように、アプリケーションプログラム118の開発者が記述したアプリケーションプログラム118のソースコード(プロジェクト116に含まれる)に追加コードが追加された上で、アプリケーションプログラム118が生成(ビルド)される。追加コードが追加されることで、アプリケーションプログラム118の実行時において、アセットデータ300の書き出し(シリアライズ)および読み出し(デシリアライズ)を行うための中間オブジェクト(アセットデータとして保存されることが予定されているオブジェクト。詳細については後述する。)が自動的に生成される。
図4は、本実施の形態に従う情報処理装置100が生成するアプリケーションプログラム118の実行状態の一例を説明するための図である。なお、アプリケーションプログラム118は、追加コードを含むプロジェクト116から生成されている。
図4を参照して、アプリケーションプログラム118の実行中において、オリジナルのソースコードにおける任意のオブジェクト120(以下の説明で、「オリジナルのオブジェクト」と称すことがある。)に加えて、追加コードに記述された処理の実行により中間オブジェクト130が生成される。中間オブジェクト130は、任意のタイミングで呼び出されることで、シリアライズおよびデシリアライズに必要な処理を実行できる。
中間オブジェクト130のデータ構造(型)については、任意に定義することができる。中間オブジェクト130が保持するデータに対しても任意に編集が可能である。
より具体的には、追加コードは、以下の(1)~(5)を含む。
(1)中間オブジェクト130の型定義(1または複数)
(1)のコードに従って、中間オブジェクト130が生成される。より具体的には、(1)は、中間オブジェクト130の型を、以下のプロパティをメンバに持つように定義するコードである。
・プロパティ名称:シリアライズ定義記述の名称指定記述で指定される名称
・データ型:シリアライズ定義記述の型指定記述で指定されるデータ型
このように、(1)は、名称指定記述で指定されるプロパティ名称(データ名)に基づいて、指定されたプロパティ名称のメンバ変数を持つ型を定義するコードである。また、(1)は、型指定記述で指定されるデータ型のメンバ変数を持つ型を定義するコードでもある。(1)のコードにおいて、中間オブジェクト130の型は、対応するソースコード160内の型定義とは独立して定義されてもよい。
1つの型に対して複数のシリアライズ定義記述が存在する場合、それぞれについて上記のメンバが生成され、結果、中間オブジェクト130の型は複数のプロパティを持つ構造になる。
なお、中間オブジェクト130の型の名称は、例えば、シリアライズ対象とされる型に補助的な名称を付加したものが自動的に設定される(名称は任意であるが、例えば、シリアライズ対象とされる型名称が"MyData"の場合に、中間オブジェクト130の型の名称は"MyData_IntermediateObject"と自動的に決定されてもよい。)。
また、中間オブジェクト130には、例えば、以下のようなメンバ関数が実装される。
(A)LoadTo関数:後述の「デシリアライズ用コード」を呼び出す関数
(B)ExtractFrom関数:後述の「シリアライズ用コード」を呼び出す関数
(C)CreateDiff関数:指定した中間オブジェクト130が持つプロパティと自オブジェクトが持つプロパティとの差分だけを持つ新たな中間オブジェクト130を生成する関数
(D)ApplyDiff関数:(C)に示すCreateDiff関数などにより生成された差分のプロパティだけを持つ中間オブジェクト130を自オブジェクトに反映する関数
(E)Clone関数:自オブジェクトを複製して新たな中間オブジェクト130を生成する関数
(F)Exclude関数:自オブジェクトが持つプロパティのうち指定されたプロパティを除外する関数
(G)ExcludeAll関数:自オブジェクトが持つすべてのプロパティを除外する関数
(H)Include関数:自オブジェクトが持つプロパティのうち指定されたプロパティを処理対象に設定する関数
(I)Sanitize関数:自オブジェクトがプロパティの値が対応するシリアライズ定義記述に含まれる制約を満たしている(例えば、指定された範囲内であるか)かを検査する関数
(J)GetPath関数:自オブジェクトのプロパティツリー上のパスを取得する関数
(K)GetTypeId関数:自オブジェクトが保持しているデータに対応する型を示すハッシュ値を取得する関数
(L)GetStringTypeId関数:自オブジェクトが保持しているデータに対応する型の名称(文字列)を取得する関数
(M)HasProperty関数:自オブジェクトが指定されたプロパティを持っているか否かを判断する関数
(N)GetProperty関数:自オブジェクトが保持する指定されたプロパティの値を取得する関数
(O)GetDataFormatVersion関数:自オブジェクトが保持するデータのバージョンを取得する関数
なお、中間オブジェクト130の型は、共通の型定義を継承するように定義されてもよい。この場合、追加コードに含まれる中間オブジェクト130の型定義は、少なくとも1つのメンバ関数を有する共通の型を継承するように型を定義する。例えば、共通の型定義に汎用的なメンバ関数を持たせるようにしておけば、どの中間オブジェクト130もそのメンバ関数を持つようにできる。上述した(A)~(O)に示す関数の全部または一部を共通の型定義のメンバ関数としてもよい。
シリアライズ対象型が複数ある場合、中間オブジェクト130の型は、シリアライズ対象型ごとにそれぞれ生成される。
このように、情報処理装置100は、アプリケーションプログラム118のソースコード160から中間オブジェクト130の型定義を生成する。中間オブジェクト130の型定義は、ソースコード160に含まれるシリアライズ対象の型定義に基づいて生成されるオブジェクトに対応するデータを、アセットデータとして保存するための型定義に相当する。
なお、アプリケーションプログラム118のソースコード160に含まれている型定義などから中間オブジェクト130の型定義を(そのまま)抽出するようにしてもよい。
(2)中間オブジェクト130を生成(インスタンス化)するための関数を記述したコード
(2)のコードは、(1)のコードで定義される型(型定義)に基づいて中間オブジェクトを生成する処理を実行するコードである。すなわち、(2)のコードは、アプリケーションプログラム118のソースコード160内の型定義に基づいて生成されるアプリケーションプログラム118のオブジェクトの各々に対応する、アセットデータ用の中間オブジェクト130を生成するためのものである。
(2)のコードは、対象のオブジェクトのデータを保持する処理(シリアライズ)が実行される際に、中間オブジェクトを生成する処理を実行するコードでもある。
なお、シリアライズ対象型を用いて生成されるオブジェクト(インスタンス)が複数ある場合、中間オブジェクト130は、それらのそれぞれについて個別に生成される。
中間オブジェクト130が実際に生成されるのは、このコードが実行されたタイミングであるが、例えば、あるオブジェクトのシリアライズを(初めて)行う際にこのコードが実行されて、対応する中間オブジェクト130が生成される。なお、シリアライズ対象のオブジェクトが生成されたら、そのタイミングで対応する中間オブジェクト130を生成するようにしてもよい。
(3)シリアライズ関数指定記述で指定される関数の出力値を、名称指定記述で指定される名称のプロパティに読み込む関数(以下、「シリアライズ用コード」と称す。図8(B)のDEFINE_SERIALIZE_VALUE()として具体例が示される)(インターフェイス131)を記述したコード
追加コードに含まれるシリアライズ用コードは、シリアライズ関数指定記述で指定される関数により取得される値またはシリアライズ関数指定記述で指定される変数の値を、名称指定記述で指定されるデータ名(プロパティ名称)で、対象のオブジェクトに対応するデータとして保持する処理を実行するためのものである。このとき、シリアライズ用コードは、関数により取得される値または指定される変数の値を、(2)のコードで生成される中間オブジェクト130のメンバ変数の値として保持する処理を実行するコードである。また、シリアライズ用コードは、予め指定された関数により取得される値または予め指定された値を、中間オブジェクト130に保持するための処理を実行するためのものであってもよい。
対象のオブジェクトに対応するデータは、対象のオブジェクトに対応するアセットデータであってもよいし、アセットデータとして保持されることが予定されるデータ(中間オブジェクトの対応するプロパティの値)であってもよい。
(4)名称指定記述で指定される名称のプロパティの値をデシリアライズ関数指定記述で指定される関数に引き渡す関数(以下、「デシリアライズ用コード」と称す。図8(B)のDEFINE_DESERIALIZE_VALUE()として具体例が示される)(インターフェイス132)を記述したコード
追加コードに含まれるデシリアライズ用コードは、アセットデータが保持する名称指定記述で指定されるデータ名(プロパティ名称)の値をデシリアライズ関数指定記述で指定される関数へ引き渡す処理を実行するためのものである。例えば、デシリアライズ関数指定記述で指定される関数により、(引き渡された)名称指定記述で指定される名称のプロパティの値を用いて、シリアライズ対象型のオブジェクトの対応するプロパティの値が設定される。また、デシリアライズ用コードは、中間オブジェクト130が保持するプロパティの値を予め指定された関数に引き渡す処理を実行するためのものであってもよい。
(5)生成した関数のポインタを登録する処理を実行するコード
上述したようなコード群からなる追加コードを元のソースコードに自動的に追加することで、中間オブジェクト130の型が定義され(上記(1))、中間オブジェクト130が生成され(上記(2))、任意の関数(シリアライズ関数指定記述により指定される関数)で中間オブジェクト130のプロパティの値をセットするコードが追加され(上記(3))、中間オブジェクト130のプロパティの値を任意の関数(デシリアライズ関数指定記述により指定される関数)に引き渡すコードが追加できる(上記(4))。
なお、追加コードには、以下の(6)~(8)をさらに含んでいてもよい。
(6)中間オブジェクト130が保持する値をアセットデータ300へ書き出す(シリアライズするための関数(インターフェイス133)を記述したコード
(7)アセットデータ300を中間オブジェクト130に読み出す(デシリアライズする)ための関数(インターフェイス134)を記述したコード
なお、(6)および(7)の関数は、中間オブジェクト130のメンバ関数として実装してもよい。
(6)の一例として、中間オブジェクト130にGenerateJSON関数を実装してもよい。
GenerateJSON関数が呼び出されることで、中間オブジェクト130が保持しているプロパティ名称(変数名)と対応する値とのペアがJSON形式のデータとして生成されてもよい。
あるいは、中間オブジェクト130にGenerateXML関数を実装してもよい。GenerateXML関数が呼び出されることで、中間オブジェクト130が保持しているプロパティ名称(変数名)と対応する値とのペアがXML形式のデータとして生成されてもよい。
中間オブジェクト130が保持しているプロパティの名称および値を出力する形式は、JSON形式およびXML形式といった汎用形式であってもよい。
このように、(6)は、中間オブジェクト130の型ごとに、中間オブジェクト130のプロパティの値を予め定められた形式で出力する処理を実行するためのものである。なお、中間オブジェクト130の型定義(上述の(1)のコード)に、このような処理を呼び出す処理を行うためのコードを含めてもよい。
(7)の一例として、中間オブジェクト130にExtractJSON関数を実装してもよい。この場合には、空の中間オブジェクト130を生成(インスタンス化)した上で、読み込み対象のアセットデータ300を指定して、ExtractJSON関数を呼び出すことで、中間オブジェクト130には、アセットデータ300に記述されたプロパティ名称(変数名)と対応する値とのペアが読み込まれる。
あるいは、アセットデータ300からデータを読み込むためのDeserialize関数を用意してもよい。Deserialize関数は、読み込み対象のアセットデータ300、および、アセットデータ300を読み込む中間オブジェクト130の型を示す型ID、が指定されて呼び出される。Deserialize関数は、指定された読み込み対象のアセットデータ300をパースして、アセットデータ300に記述されたプロパティ名称(変数名)と対応する値とのペアを読み込む。続いて、指定された型IDに対応する中間オブジェクト130が生成(インスタンス化)され、生成された中間オブジェクト130にアセットデータ300から読み込まれたデータが設定される。
なお、中間オブジェクト130とアセットデータ300との間のデータのやり取り(シリアライズ(書き出し)、および、デシリアライズ(読み込み))は、任意のライブラリなどを利用することもできる。
なお、(6)および(7)のコードを追加コードとして自動生成しない場合は、アプリケーションプログラム118の開発者がこれらのコード記述を行うことになる。
また、アプリケーションプログラム118に応じて、シリアライズおよびデシリアライズの一方のみが必要な場合もあるし、シリアライズまたはデシリアライズの一部の処理のみが必要な場合もある。
そのため、図4に示すインターフェイス131,132のうち、少なくとも1つのみを実現するように追加コードが生成されてもよい。
(8)中間オブジェクト130の履歴を保持する処理を実行するコード
中間オブジェクト130は、プロパティの値(データ)として、現在の値だけではなく、1または複数の過去の値を保持できるようにしてもよい。例えば、Undo/Redoを実行するための関数を中間オブジェクト130のメンバ関数として実装してもよい。
また、情報処理装置100は、追加コードに加えて、スキーマファイルを自動的に生成するようにしてもよい。スキーマファイルは、中間オブジェクト130(またはアセットデータ300)の型定義のデータ構造を記述する。すなわち、スキーマファイルは、アセットデータとして保存するための型定義のデータ構造を記述する。スキーマファイルの詳細については、後述する。
[E.機能構成および処理手順]
次に、本実施の形態に従う情報処理装置100の機能構成および処理手順について説明する。
図5は、本実施の形態に従う情報処理装置100の機能構成例を示す模式図である。図5を参照して、情報処理装置100は、更新モジュール140と、ビルダ142と、追加コード生成モジュール150とを含む。これらの機能モジュールは、情報処理装置100のプロセッサ102が開発プログラム114を実行することで実現されてもよい。
ユーザ(アプリケーションプログラム118の開発者)は、図示しないエディタなどを操作して、ソースコード160と、ビルド対象のソースコード160のファイル一覧162と、設定情報164とを含むプロジェクト116を作成する。
追加コード生成モジュール150は、プロジェクト116から追加コード170を生成する。追加コード生成モジュール150は、追加コード170に加えて、スキーマファイル180を生成してもよい。より具体的には、追加コード生成モジュール150は、解析モジュール152と、追加モジュール154とを含む。
解析モジュール152は、プロジェクト116に含まれるソースコード160を解析して、シリアライズ定義記述を発見して、それに基づいて追加コード170を生成するための情報を構築する。このように、解析モジュール152は、アプリケーションプログラム118のソースコード160内の型定義(シリアライズ定義記述に含まれる型指定記述)を特定する。より具体的には、解析モジュール152は、アプリケーションプログラム118のソースコード160から、データ名(プロパティ名称)を指定する名称指定記述(第1記述の一例)と、値を取得するための関数または変数を指定するシリアライズ関数指定記述(第2記述の一例)とを含むシリアライズ定義記述(所定の記述の一例)を抽出する。そして、解析モジュール152は、ソースコード160に含まれるシリアライズ定義記述に基づいて、中間オブジェクト130の型定義を生成する。
追加モジュール154は、抽出したシリアライズ定義記述に基づいて、追加コード170を生成し、生成した追加コード170をアプリケーションプログラム118のソースコード160に追加する。
また、追加モジュール154は、スキーマファイル180を生成する。
設定情報164は、追加コード170の格納先、および、追加コード170と併せて生成されるスキーマファイル180の格納先の指定を含む。生成された追加コード170およびスキーマファイル180は、指定された格納先に出力される。
更新モジュール140は、追加コード生成モジュール150が生成した追加コード170をプロジェクト116のソースコード160に追加するとともに、ファイル一覧162に追加コード170のファイル名などを追加して、ファイル一覧162Aに更新する。
ビルダ142は、ソースコード160および追加コード170をコンパイルしてアプリケーションプログラム118を生成する。ビルダ142は、更新モジュール140によって更新されたプロジェクト116Aからアプリケーションプログラム118(実行可能ファイル)を生成する。より具体的には、ビルダ142は、解析モジュール144と、コンパイラ146と、リンカ148とを含む。
解析モジュール144は、更新モジュール140によって更新されたプロジェクト116Aに含まれるソースコード160および追加コード170を解析する。このとき、ソースコード160および追加コード170内に記述されたマクロを展開する処理が実行されるが、ソースコード160中のシリアライズ定義記述に対応するマクロ定義は、いずれも空文字(null)に展開されるように設定されている。その結果、解析モジュール144は、ソースコード160中のシリアライズ定義記述をいずれも空文字に置換する。
コンパイラ146は、解析モジュール152の解析結果に基づいて、ソースコード160および追加コード170をコンパイルしてオブジェクトコードを生成する。
リンカ148は、生成されたオブジェクトコードをリンクして、アプリケーションプログラム118(実行可能ファイル)を生成する。
なお、上述の例では、解析モジュールが追加コード170を生成するための情報を生成した後、その情報に基づいて追加モジュールが追加コードを生成したが、シリアライズ定義記述を解析した際に直接追加コードを生成してもよい。
図6は、本実施の形態に従う情報処理装置100のビルド処理の処理手順例を示すフローチャートである。
図6を参照して、情報処理装置100は、ライブラリまたはアプリケーションプログラム118のビルド要求を受けると(ステップS2においてYES)、まず、プレビルドとしてビルド前に実行されることが指定されている処理を実行する。ここで、プレビルドとして実行される処理として、追加コード170を生成する処理が指定されているとする。
情報処理装置100は、追加コード170の生成に必要な情報(例えば、(1)ビルド対象のソースコード160のファイル一覧、(2)追加コード170の格納先、(3)追加コード170と併せて生成されるスキーマファイル180の格納先)を取得し(ステップS4)、後述するような追加コード170の生成処理を実行する(ステップS6)。
情報処理装置100は、生成された追加コード170をビルド対象のソースコードに追加して、ビルド対象の新たなソースコードのファイル一覧を生成し(ステップS8)、対象のソースコードをコンパイルする(ステップS10)。そして、情報処理装置100は、コンパイルによって生成されたオブジェクトコードをリンクすることで、実行可能ファイル(アプリケーションプログラム118)を生成する(ステップS12)。これにより、処理は終了する。
図7は、図6に示す追加コード170の生成処理(ステップS6)の処理手順例を示すフローチャートである。図7を参照して、情報処理装置100(図5に示す解析モジュール152)は、ビルド対象のソースコード160を解析(字句解析)し(ステップS60)、解析により収集した情報に基づいて、追加コード生成用の情報を構築する(ステップS61)。
より具体的には、情報処理装置100は、字句解析において、ソースコード160から、アセットデータ300に含まれるプロパティの名称と、当該プロパティの値を取得するための関数名とを含むシリアライズ定義記述を抽出する。情報処理装置100は、このようなソースコード160の解析結果に基づいて、オリジナルのソースコード160で規定される型のうち、シリアライズ対象型を認識し、それに対応する中間オブジェクト130を生成するための追加コードを生成する。追加コードの詳細は上述の通りである。
続いて、情報処理装置100(図5に示す追加モジュール154)は、構築した追加コード生成用の情報に基づいて、追加コード170を生成するための文字列を生成する(ステップS62)とともに、スキーマファイル180を生成するための文字列を生成する(ステップS63)。
より具体的には、ステップS62において、情報処理装置100は、アプリケーションプログラム118のソースコード160から、データ名(プロパティ名称)を指定する名称指定記述(第1記述の一例)と、値を取得するための関数または変数を指定するシリアライズ関数指定記述(第2記述の一例)とを含むシリアライズ定義記述(所定の記述の一例)を抽出する。
最終的に、情報処理装置100(図5に示す追加モジュール154)は、追加コード170を生成するための文字列から追加コード170を生成して、ファイル出力し(ステップS64)、出力した追加コード170のファイル一覧を出力する(ステップS65)。このように、情報処理装置100は、シリアライズ定義記述に基づいて、アプリケーションプログラム118の対象のオブジェクトのデータを保持する処理(シリアライズ)として実行される追加コード170を生成し、アプリケーションプログラム118のソースコード160に追加する。
併せて、情報処理装置100は、スキーマファイル180を生成するための文字列からスキーマファイル180を出力する(ステップS66)。スキーマファイル180は、1または複数のプロパティを含むアセットデータ300のデータ構造を特定する情報を含む。そして、処理はリターンする。
[F.シリアライズ定義記述および追加コード]
次に、本実施の形態に従う情報処理装置100におけるシリアライズ定義記述および追加コードの例について説明する。なお、ユーザ(アプリケーションプログラム118の開発者)は、自動生成される追加コード170を必要に応じて編集することもできる。
(f1:アプリケーションプログラムの型定義のプロパティ名称と同じプロパティ名称でデータをアセットデータに保持させる例)
図8は、シリアライズ定義記述およびそれに基づいて生成される追加コード170の一例を示す図である。
図8(A)を参照して、開発者によって作成されたソースコード160は、MyData型の型定義40Aを含む。型定義40Aは、通常と同様の文法に従う、整数型のプロパティvalue1の定義記述401を含む。
本実施の形態の特徴として、型定義40Aにおいて、シリアライズ定義記述410が付加されている。図8(A)に示す例においては、シリアライズ対象型であることの指定は、シリアライズ対象型の型定義40Aの内部にシリアライズ定義記述410が配置されることによって行われる。すなわち、MyData型の型定義40Aの内部にシリアライズ定義記述410が配置されることで、MyData型がシリアライズ対象型であることが指定される。そのため、シリアライズ定義記述42は、型指定記述を黙示的に含むことになる。
一例として、シリアライズ定義記述410は、"BIND_VALUE"というマクロ名411を含む。マクロ名411は、オブジェクト形式マクロ(object-like macro)により置換される対象であることを示す文字列である。
シリアライズ定義記述410は、引数として、アセットデータ300におけるプロパティの名称を指定するプロパティ名称412(「名称指定記述」の一例)と、そのプロパティのデータ型を指定するデータ型定義413(「データ型指定記述」の一例)と、シリアライズのために用いられる関数を指定する関数名414(「シリアライズ関数指定記述」の一例)と、デシリアライズのために用いられる関数を指定する関数名415(「デシリアライズ関数指定記述」の一例)とを含む。
型定義40Aは、シリアライズ定義記述410の引数として指定されている関数名414に対応する関数を定義する関数定義404と、シリアライズ定義記述42の引数として指定されている関数名415に対応する関数を定義する関数定義405とを含む。
図8(B)には、図8(A)に示すシリアライズ定義記述42を含む型定義40Aに基づいて自動的に生成される追加コード170の一例を示す。
図8(B)に示す追加コード170は、シリアライズ関数指定記述の一例である関数名414で指定される関数の出力値を、名称指定記述の一例であるプロパティ名称412で指定される名称のプロパティに読み込む関数を定義するシリアライズ用コード50Aを含む。
シリアライズ用コード50Aは、引数として、シリアライズ対象型を指定する型名称416と、プロパティ名称412と、データ型定義413とを含む。
また、図8(B)に示す追加コード170は、デシリアライズ関数指定記述の一例である関数名415で指定される関数に引き渡す関数定義するデシリアライズ用コード52Aを含む。
デシリアライズ用コード52Aは、引数として、シリアライズ対象型を指定する型名称416と、プロパティ名称412と、データ型定義413とを含む。
オリジナルのソースコード160および図8(B)に示す追加コード170を含むプロジェクト116Aから生成されたアプリケーションプログラム118が実行されることで、中間オブジェクト130のプロパティ値をセットする機能などが実装される。
図9は、図8(B)に示す追加コード170により実装されるソフトウェア構成を模式的に示す図である。追加コード170を含むアプリケーションプログラム118が実行されることで、中間オブジェクト130が生成(インスタンス化)される。中間オブジェクト130は、シリアライズ定義記述42に含まれるプロパティ名称412のプロパティを持つ。
中間オブジェクト130は、関数名414により指定されるシリアライズのために用いられる関数と、関数名415により指定されるデシリアライズのために用いられる関数とが実装される。それぞれ関数は明示的に読み出せるように実装してよいし、それぞれの関数をカプセル化した別の手続き(例えば、図16および図17に示すようなメンバ関数)を実装してもよい。
(f2:アプリケーションプログラムの型定義のプロパティ名称と異なるプロパティ名称でデータをアセットデータに保持させる例)
図8には、アプリケーションプログラム118の型定義のプロパティ名称と同じプロパティ名称でデータをアセットデータ300に保持させる例を示したが、本実施の形態においては、アセットデータ300のデータ構造は、アプリケーションプログラム118の型定義から独立しているため、異なるプロパティ名称でデータをアセットデータ300に保持させることもできる。
図10は、シリアライズ定義記述およびそれに基づいて生成される追加コード170の別の一例を示す図である。図10には、アプリケーションプログラム118のオブジェクトのプロパティm_Distanceの値をプロパティDistanceとしてアセットデータ300に保持させる処理を実現するためのコード例を示す。
図10(A)を参照して、開発者によって作成されたソースコード160は、MyData型の型定義40Bを含む。型定義40Bは、通常と同様の文法に従う、浮動小数点型のプロパティm_Distanceの定義記述421を含む。プロパティm_Distanceは、実行中のアプリケーションプログラム118が生成するオブジェクトのメンバである。
型定義40Bにおいて、シリアライズ定義記述430が付加されており、MyData型がシリアライズ対象型であることが指定される。
一例として、シリアライズ定義記述430は、"BIND_VALUE"というマクロ名431を含む。シリアライズ定義記述430は、引数として、プロパティ名称432と、データ型定義433と、シリアライズのために用いられる関数を指定する関数名434と、デシリアライズのために用いられる関数を指定する関数名435とを含む。
図10(A)に示す例においては、プロパティ名称432として、"distance"が指定されている。その結果、プロパティdistanceを持つアセットデータ300が生成される。このとき、実行中のアプリケーションプログラム118が保持する対象のプロパティとは独立した任意の名称を指定できる。
型定義40Bは、シリアライズ定義記述430の引数として指定されている関数名434に対応する関数を定義する関数定義424と、シリアライズ定義記述430の引数として指定されている関数名435に対応する関数を定義する関数定義425とを含む。
関数定義424においては、アプリケーションプログラム118のオブジェクトのプロパティm_Distanceの値を出力する関数が定義されている。関数定義425においては、引数として指定された値をアプリケーションプログラム118のオブジェクトのプロパティm_Distanceの値として設定する関数が定義されている。
図10(B)には、図10(A)に示すシリアライズ定義記述430を含む型定義40Bに基づいて自動的に生成される追加コード170の一例を示す。
図10(B)に示す追加コード170は、関数名434で指定される関数の出力値をプロパティ名称432で指定される名称のプロパティに読み込む関数を定義するシリアライズ用コード50Bを含む。シリアライズ用コード50Bは、引数として、シリアライズ対象型を指定する型名称436と、プロパティ名称432と、データ型定義433とを含む。
また、図10(B)に示す追加コード170は、関数名435で指定される関数に引き渡す関数定義するデシリアライズ用コード52Bを含む。デシリアライズ用コード52Bは、引数として、シリアライズ対象型を指定する型名称436と、プロパティ名称432と、データ型定義433とを含む。
シリアライズ用コード50Bおよびデシリアライズ用コード52Bの"propertyValue"は、データ型定義433で定義された型(この例では、float型)の「参照」を指す仮引数名である。
このように、本実施の形態においては、アプリケーションプログラム118のオブジェクトのプロパティ名称とは独立した任意のプロパティ名称でデータをアセットデータ300に保持させることができる。このような処理によって、以下のような利点が得られる。
ソースコード作成上の規約により、任意の接頭辞(例えば、メンバ変数であることを示す"m_")を持つプロパティ名称(変数名)を使用したいが、シリアライズにより出力されるアセットデータ300には、"m_"などの接頭辞を付与したくないといったニーズを満たすことができる。
アプリケーションプログラム118を開発している途中の段階においてプロパティの意味合いが変わったので、ソースコード160において、プロパティ名称(変数名)を変更したが、書き出されるアセットデータ300に含まれるプロパティ名称はそのまま維持したいといったニーズを満たすことができる。
ランタイムプログラムが生成するオブジェクトのメンバ変数名にはデータ構造を表す名称が付与されているが、データ構造を表す名称をアセットデータ300側に露出したくない(秘匿したい)といったニーズを満たすことができる。例えば、ランタイムプログラム側では"childElementLinkedList"という名称のメンバ変数を用いているが、アセットデータ300として出力されるプロパティ名称は"children"という名称にしておくことができる。
アプリケーションプログラム118を開発している途中の段階において、具体的なデータ構造が変更になった場合でも、アセットデータ300に含まれるプロパティ名称をそのまま維持できる。
(f3:アプリケーションプログラムのデータ型と異なるデータ型でアセットデータに保持させる例)
図8には、アプリケーションプログラム118の型定義のデータ型と同じデータ型でデータをアセットデータ300に保持させる例を示したが、本実施の形態においては、アセットデータ300のデータ構造は、アプリケーションプログラム118の型定義から独立しているため、異なるデータ型でデータをアセットデータ300に保持させることもできる。
図11は、シリアライズ定義記述およびそれに基づいて生成される追加コード170のさらに別の一例を示す図である。図11には、アプリケーションプログラム118のオブジェクトにおいてハッシュ値(整数型)を持つプロパティm_TagHashの値を、文字列(文字列型)を持つプロパティTagとしてアセットデータ300に保持させる処理を実現するためのコード例を示す。
図11(A)を参照して、開発者によって作成されたソースコード160は、MyData型の型定義40Cを含む。型定義40Cは、通常と同様の文法に従う、32ビットの符号なし整数型のプロパティm_TagHashの定義記述441を含む。プロパティm_TagHashは、実行中のアプリケーションプログラム118が生成するオブジェクトのメンバである。
型定義40Cにおいて、シリアライズ定義記述450が付加されており、MyData型がシリアライズ対象型であることが指定される。
一例として、シリアライズ定義記述450は、"BIND_VALUE"というマクロ名451を含む。シリアライズ定義記述450は、引数として、プロパティ名称452と、データ型定義453と、シリアライズのために用いられる関数を指定する関数名454と、デシリアライズのために用いられる関数を指定する関数名455とを含む。
図11(A)に示す例においては、プロパティ名称452として、"Tag"が指定されるとともに、データ型定義453として"string"(文字列型)が指定されている。その結果、文字列型のプロパティTagを持つアセットデータ300が生成される。このように、実行中のアプリケーションプログラム118が保持する対象のプロパティとは独立した任意のデータ型を指定できる。
型定義40Cは、シリアライズ定義記述450の引数として指定されている関数名454に対応する関数を定義する関数定義444と、シリアライズ定義記述450の引数として指定されている関数名455に対応する関数を定義する関数定義445とを含む。
関数定義444においては、アプリケーションプログラム118のオブジェクトのプロパティm_TagHashが持つハッシュ値を文字列に変換して出力する関数が定義されている。なお、関数GetTagStringは、図示しないコードにおいて定義されている。関数定義445においては、引数として指定されたアセットデータに含まれる値(文字列)をハッシュ値に変換して、アプリケーションプログラム118のオブジェクトのプロパティm_TagHashの値として設定する関数が定義されている。
図11(B)には、図11(A)に示すシリアライズ定義記述450を含む型定義40Cに基づいて自動的に生成される追加コード170の一例を示す。
図11(B)に示す追加コード170は、関数名454で指定される関数の出力値をプロパティ名称452で指定される名称のプロパティに読み込む関数を定義するシリアライズ用コード50Cを含む。シリアライズ用コード50Cは、引数として、シリアライズ対象型を指定する型名称456と、プロパティ名称452と、データ型定義453とを含む。
図11(B)に示す追加コード170のシリアライズ用コード50Cは、シリアライズ関数指定記述で指定される関数により取得される値またはシリアライズ関数指定記述で指定される変数の値を、型指定記述で指定されるデータ型で、対象のオブジェクトに対応するデータとして保持する処理を実行するためのものである。
また、図11(B)に示す追加コード170は、関数名455で指定される関数に引き渡す関数定義するデシリアライズ用コード52Cを含む。デシリアライズ用コード52Cは、引数として、シリアライズ対象型を指定する型名称456と、プロパティ名称452と、データ型定義453とを含む。
このように、本実施の形態においては、アプリケーションプログラム118のオブジェクトのプロパティのデータ型とは独立した任意のデータ型でデータをアセットデータ300に保持させることができる。このような処理によって、以下のような利点が得られる。
例えば、文字列とハッシュ値との対応関係を予め定義した上で、ランタイムプログラムにおいては、文字列のハッシュ値だけが保持される。このような実装形態を採用することで、ランタイムプログラムで保持する情報を必要最小限にして、必要なメモリ量を節約できる。ハードウェアなどの制約によってオブジェクトのサイズを小さくする必要がある場合や、文字列の情報自体が処理には必要ない場合などに有効である。
あるいは、アセットデータ300においては、情報を暗号化したバイナリ列で保持するとともに、ランタイムプログラムにおいては、当該バイナリ列を復号化した文字列で保持するような処理を実現することもできる。暗号化した文字列をアセットデータに含めることで、ランタイムプログラムが保持している情報を秘匿化できる。また、長い文字列をバイナリ化することによってデータサイズを小さくできる。
(f4:アプリケーションプログラムでは保持していないデータをアセットデータに保持させる例)
本実施の形態においては、アプリケーションプログラム118(ランタイムプログラム)が保持していないデータをアセットデータ300に保持させることもできる。
図12は、シリアライズ定義記述およびそれに基づいて生成される追加コード170のさらに別の一例を示す図である。図12には、ハードコードされたバージョン(ソースコード160に記述された値)をアセットデータ300に書き出す処理を実現するためのコード例を示す。
図12(A)を参照して、開発者によって作成されたソースコード160は、MyData型の型定義40Dを含む。型定義40Dにおいて、シリアライズ定義記述470が付加されており、MyData型がシリアライズ対象型であることが指定される。
一例として、シリアライズ定義記述470は、"BIND_VALUE"というマクロ名471を含む。シリアライズ定義記述470は、引数として、プロパティ名称472と、データ型定義473と、シリアライズのために用いられる関数を指定する関数名474と、デシリアライズのために用いられる関数を指定する関数名475とを含む。
図12(A)に示す例においては、プロパティ名称472として、"AssetDataVersion"が指定されるとともに、データ型定義473として"int"(整数型)が指定されている。
型定義40Dは、シリアライズ定義記述470の引数として指定されている関数名474に対応する関数を定義する関数定義464と、シリアライズ定義記述470の引数として指定されている関数名475に対応する関数を定義する関数定義465とを含む。
関数定義464においては、ソースコード160に記述された"2"を出力する関数が定義されている。
関数定義445においては、引数として指定された値を評価する関数が定義されている。より具体的には、アセットデータ300から読み出された値(バージョンを示す値)が"2"ではなく"1"であれば、関数EnableOldAssetBehaviorが読み出されることが定義されている。関数EnableOldAssetBehaviorは、図示しないコードにおいて定義されており、典型的には、ランタイムプログラムの動作を切り替えるための処理を実行する。
図12(B)には、図12(A)に示すシリアライズ定義記述470を含む型定義40Dに基づいて自動的に生成される追加コード170の一例を示す。
図12(B)に示す追加コード170は、関数名474で指定される関数の出力値をプロパティ名称472で指定される名称のプロパティに読み込む関数を定義するシリアライズ用コード50Dを含む。シリアライズ用コード50Dは、引数として、シリアライズ対象型を指定する型名称476と、プロパティ名称472と、データ型定義473とを含む。
また、図12(B)に示す追加コード170は、関数名475で指定される関数に引き渡す関数定義するデシリアライズ用コード52Dを含む。デシリアライズ用コード52Dは、引数として、シリアライズ対象型を指定する型名称476と、プロパティ名称472と、データ型定義473とを含む。
このように、本実施の形態においては、アプリケーションプログラム118では保持していないデータであってもアセットデータ300に保持させることができる。このような処理によって、以下のような利点が得られる。
例えば、図12(A)に示すように、ソースコード160に値をハードコードすることで、アセットデータ300が出力されたタイミングを特定するための情報(例えば、アセットのバージョン、日付、プログラムのバージョンなど)を埋め込むことができる。このような情報を用いることで、ランタイムプログラムにおいて利用する必要がない古いアセットデータ300などを特定できる。
また、アプリケーションプログラム118ではそれぞれ独立した複数の値が存在しているような場合において、当該複数の値を1つの行列あるいはベクトルにまとめてアセットデータ300に書き出すような処理を実現できる。
(f5:自動生成される追加コードの編集)
ユーザ(アプリケーションプログラム118の開発者)は、自動生成される追加コード170を任意に編集することもできる。以下、追加コード170の編集例について説明する。
図13は、自動生成される追加コード170の編集例を示す図である。図13には、ランタイムプログラムが保持しているデータとアセットデータ300が保持しているデータとを相互に変換する例を示す。
図13(A)には、図10(B)と同様の追加コード170を示す。ユーザは、追加コード170を任意に編集することができる。図13(B)には、ランタイムプログラムから取得したシリアライズ対象のプロパティの値を2倍した上で、アセットデータ300に書き出すための処理と、アセットデータ300から読み出した値を0.5倍した上でランタイムプログラムに設定する処理とを実現するためのコード例を示す。
具体的には、シリアライズ用コード50Bにおいては、"* 2.0f"(値を2倍するための記述501)が追加されている。すなわち、シリアライズ対象MyData型のオブジェクトから取得される値を2倍した値を返す処理が定義されている。
デシリアライズ用コードは、"* 0.5f"(値を0.5倍するための記述502)が追加されている。すなわち、アセットデータ300から読み出される値を0.5倍した値を返す処理が定義されている。
図13に示す例に限られず、本実施の形態においては、ユーザ(アプリケーションプログラム118の開発者)は、自動生成される追加コード170を任意に編集できるので、シリアライズ対象型のオブジェクトが保持しているデータに対して任意の演算処理を行った結果をシリアライズすること、および、アセットデータ300の値に対して任意の演算処理を行った結果でデシリアライズすることを容易に実現できる。
(f6:型指定記述を明示的に含むシリアライズ定義記述の例)
図14は、型指定記述を明示的に含むシリアライズ定義記述の例を示す。図14(A)には、シリアライズ対象型に指定される外部ライブラリの型定義のコード例を示す。図14(A)に示す型定義60は、整数型のプロパティdataType(符号61)と、浮動小数点型のプロパティfloatValue(符号62)とを含むExternalLibraryData型を定義する。
図14(B)に示す例では、ソースコード160は、ExternalLibraryData型をシリアライズ対象型として指定するシリアライズ定義記述63,64を含む。
一例として、シリアライズ定義記述63,64の各々は、"BIND_VALUE_EXTERNAL"というマクロ名631,641を含む。
シリアライズ定義記述63,64の各々は、引数として、プロパティ名称632,642(「名称指定記述」の一例)と、データ型定義633,643(「データ型指定記述」の一例)と、シリアライズのために用いられる関数を指定する関数名634,644(「シリアライズ関数指定記述」の一例)と、デシリアライズのために用いられる関数を指定する関数名635,645(「デシリアライズ関数指定記述」の一例)とを含む。
さらに、シリアライズ定義記述63,64の各々は、シリアライズ対象の型を指定する型名636,646(「型指定記述」の一例)とを含む。
図14(B)に示す例においては、シリアライズ定義記述63,64の各々は、シリアライズ対象型を指定する記述(型指定記述)を明示的に含む。すなわち、シリアライズ定義記述63,64(所定の記述の一例)の各々は、データ保持の対象となるオブジェクトの型を指定する型指定記述をさらに含む。このとき、追加モジュール154(図5参照)は、抽出されるシリアライズ定義記述に含まれる型指定記述(例えば、型名636,646)に基づいて、型指定記述により指定される型により生成されるオブジェクトについて、追加コード170を生成する。
本実施の形態においては、定義される型およびプロパティそのものにシリアライズ定義記述を付加するのではなく、アセットデータ300に含まれるプロパティの名称と、プロパティの値のデータ型定義と、プロパティの値を取得するための関数と、プロパティの値を設定するための関数とを指定するシリアライズ定義記述が付加される。
そのため、外部ライブラリなどで定義された型のオブジェクトであっても、自在にシリアライズおよびデシリアライズできる。例えば、上述の説明においては、シリアライズ定義記述を型定義の一部として付加する処理例を示したが、型定義の外部にシリアライズ定義記述を配置することもできる。
このように、シリアライズ対象となるオブジェクトの型を指定する記述は、必ずしも型定義の中に配置する必要はない。その結果、任意のオブジェクトの型をシリアライズ対象として指定できる。
(f7:シリアライズ定義記述が付加されたソースコードの取り扱い)
次に、シリアライズ定義記述が付加されたソースコードの取り扱いについて説明する。上述したように、本実施の形態においては、"BIND_VALUE"(図8(A)など参照)、および、"BIND_VALUE_EXTERNAL"(図14(B)など参照)といったマクロ名を含むシリアライズ定義記述をソースコードに付加することで、シリアライズおよびデシリアライズの対象である型を特定する。
このようなシリアライズ定義記述は、追加コード170の生成処理およびアプリケーションプログラム118を生成するためのビルド処理において、それぞれ異なった取り扱いがなされる。
図15は、本実施の形態に従う情報処理装置100におけるビルド時のシリアライズ定義記述の取り扱いを説明するための図である。
図15(A)に示すMyData型の型定義40Aは、整数型のプロパティvalue1の定義記述401と、浮動小数点型のプロパティdistanceの定義記述481とを含む。型定義40Aは、さらに、シリアライズ定義記述410およびシリアライズ定義記述490を含む。
シリアライズ定義記述410は、"BIND_VALUE"というマクロ名411を含み、シリアライズ定義記述490は、"BIND_VALUE"というマクロ名491を含む。
シリアライズ定義記述410は、引数として、プロパティ名称412と、データ型定義413と、関数名414と、関数名415とを含む。シリアライズ定義記述490は、引数として、プロパティ名称492と、データ型定義493と、関数名494と、関数名495とを含む。
図15(B)には、追加コード170の生成処理において、字句解析により収集した情報に基づいて、追加コード生成用の情報が構築された状態を示す(図7のステップS61に対応)。
図15(B)に示す型定義40Fは、図15(A)に示す型定義40E中のシリアライズ定義記述410,490に基づいて、追加コード170を生成するためのコード410A,490Aにそれぞれ置換したものである。より具体的には、情報処理装置100の解析モジュール152は、シリアライズ定義記述410,490に含まれるマクロ名を置換することで、型定義40Fを生成する。
コード410A,490Aの1行目は、属性構文"__attribute__(())"を用いて記述されており、シリアライズ定義記述410,490の引数の内容を属性として指定する。コード410A,490Aの2行目は、共用体のデータ構造を定義するとともに、メンバを定義する。
情報処理装置100は、コード410A,490Aの記述内容に基づいて、追加コード170を生成する。
図15(C)には、アプリケーションプログラム118を生成するためのビルドにおいて、マクロ処理された後(図6のステップS10に対応)の型定義40Gの例を示す。ビルド時のマクロ処理において、シリアライズ定義記述に対応するマクロ定義はいずれも空文字(null)に設定されている。そのため、図15(A)に示す型定義40Eに含まれるシリアライズ定義記述410,490は、いずれも空文字に置換された後に、コンパイルされることになる。また、型定義以外に付加されたシリアライズ定義記述についても同様に取り扱われる。
このように、情報処理装置100のビルダ142(追加モジュール154)は、ソースコード160に含まれるシリアライズ定義記述を無効なものとして解釈した上で、アプリケーションプログラム118を生成する。より具体的には、情報処理装置100のビルダ142(追加モジュール154)は、マクロ名を空文字に置換する。
その結果、アプリケーションプログラム118を生成するためのビルドにおいて、ソースに記述されるシリアライズ定義記述は、実質的に何らの影響も与えない。このように、同一のソースに対して、追加コード170の生成処理およびコンパイルのそれぞれにおいて取り扱いを異ならせることで、本来のソースコードの部分には実質的に影響を与えることなく、追加コード170を自動的に生成できる。
シリアライズするためのソースコードを自動的に生成する一般的な方法として、型自体または変数自体に属性などを付加しておく方法がある。この方法では、ビルダが変更できないソースコードで定義された型については、属性などを付加することができず、シリアライズの対象とすることができない。これに対して、本実施の形態においては、ソースコードの文字列(シリアライズ定義記述など)を解析するだけで、追加コード170を生成できるので、どのような型であっても、シリアライズおよびデシリアライズの対象として指定できる。すなわち、任意の型をシリアライズおよびデシリアライズの対象とすることができる。
本実施の形態においては、シリアライズ定義記述が、アセットデータ(あるいは、中間オブジェクト)のプロパティ値として保持する値を取得するための関数(シリアライズ用)と、アセットデータ(あるいは、中間オブジェクト)のプロパティ値を引き渡す関数(デシリアライズ用)(引き渡した値はこの関数の中で用いられて、オリジナルのソースコードのプロパティ値としてセットされる)とをそれぞれ指定する。そのため、実行中のアプリケーションプログラム118において生成されるオブジェクト120の型と、アセットデータ300のデータ構造とを一致させる必要はなく、互いに独立に設定できる。
例えば、シリアライズにおいて、アセットデータ(あるいは、中間オブジェクト)のプロパティに保持する値を取得するための関数を適切に定義することで、オブジェクト120のプロパティとしては存在しない値をアセットデータ300へ書き出すことができる。また、デシリアライズにおいて、アセットデータ(あるいは、中間オブジェクト)のプロパティ値を引き渡す関数を適切に定義することで、アセットデータ300のデータ構造を変更することなく、オブジェクト120の型を変更できる。すなわち、オブジェクト120の型とアセットデータ300のデータ構造とは、互いに影響されることなく、それぞれ独立に定義および変更できる。
[G.中間オブジェクト]
次に、本実施の形態に従う情報処理装置100が生成したアプリケーションプログラム118の実行中に生成される中間オブジェクト130について説明する。
図16および図17は、本実施の形態に従う情報処理装置100が生成したアプリケーションプログラム118の実行中に生成される中間オブジェクト130のメンバ関数の処理を説明するための図である。図16には、LoadTo関数が呼び出された場合の処理を示し、図17には、ExtractFromが呼び出された場合の処理を示す。
図16(A)を参照して、プロパティvalue1を指定したLoadTo関数が実行されると、ソースコードに追加された型定義40Aの関数定義404(図8(A)参照)が示すGetValue1関数が呼び出される。同様に、図16(B)を参照して、プロパティdistanceを指定したLoadTo関数が実行されると、ソースコードに追加された型定義40Bの関数定義424(図10(A)参照)が示すGetDistance関数が呼び出される。
図17(A)を参照して、プロパティvalue1を指定したExtractFrom関数が実行されると、ソースコードに追加された型定義40Aの関数定義405(図8(A)参照)が示すSetMyValue1関数が呼び出される。同様に、図17(B)を参照して、プロパティdistanceを指定したExtractFrom関数が実行されると、ソースコードに追加された型定義40Bの関数定義425(図10(A)参照)が示すSetDistance関数が呼び出される。
なお、図16および図17には、説明の便宜上、特定のプロパティ(変数)を指定してメンバ関数を呼び出す例を示すが、中間オブジェクト130が保持するすべてのプロパティについて一斉に処理を実行することもできる。
このように、生成された中間オブジェクト130のメンバ関数(LoadTo関数およびExtractFrom関数など)が実行されると、追加コード170を生成する際に付加されたシリアライズ定義記述において指定された関数が呼び出される。シリアライズ定義記述において指定する関数は、自由に定義できるので、柔軟性の高いシリアライズおよびデシリアライズを実現できる。
図16に示すようなメンバ関数を中間オブジェクト130に実装するために、追加コード170は、中間オブジェクト130が保持しているプロパティの値を指定されたオブジェクトに設定するための予め定められた手続き(SetDistance関数など)を呼び出すためのインターフェイス(LoadTo関数)を、中間オブジェクト130に実装するためのコードを含んでいてもよい。
また、図17に示すようなメンバ関数を中間オブジェクト130に実装するために、追加コード170は、プロパティの値を取得して中間オブジェクト130に保持させるための予め定められた手続き(GetDistance関数など)を呼び出すためのインターフェイス(ExtractFrom関数)を、中間オブジェクト130に実装するためのコードを含んでいてもよい。
本実施の形態においては、シリアライズおよびデシリアライズの対象となるオブジェクト120に対応付けて中間オブジェクト130を生成するので、オブジェクト120に対するデータの読み込みおよび書き込み、ならびに、アセットデータ300に対するデータの読み出しおよび書き出しをそれぞれ独立に行うことができるため、より柔軟なシリアライズおよびデシリアライズを実現できる。
[H.スキーマファイル180]
次に、本実施の形態に従う情報処理装置100が生成するスキーマファイル180について説明する。
スキーマファイル180は、シリアライズおよびデシリアライズされるアセットデータ300のデータ構造を特定する情報を含む。より具体的には、スキーマファイル180は、プロパティの名称および値のデータ構造を特定する情報を含む。スキーマファイル180を利用することで、アプリケーションプログラム118とは独立して、アセットデータ300の生成および編集などを行うことができる。
図18は、本実施の形態に従う情報処理装置100が生成したスキーマファイル180の一例を示す図である。図18には、図8(A)に示す型定義30に対応するスキーマファイル180の例を示す。
図18を参照して、スキーマファイル180は、対応する型の名称181と、対応する型を示す型ID182と、アセットデータに含まれるプロパティの詳細な情報を示すプロパティ情報183,184と、フォーマットバージョン185とを含む。プロパティ情報183,184の各々は、中間オブジェクト130(あるいは、アセットデータ300)の型定義に含まれるプロパティの名称と、プロパティの値のデータ型を示す情報とを含む。
情報処理装置100は、ソースコードにおいてシリアライズ定義記述が付加されたプロパティについて、スキーマファイル180を生成する。より具体的には、情報処理装置100(解析モジュール152)は、実行中のアプリケーションプログラム118が保持するデータのうちアセットデータ300として出力されるデータを指定するシリアライズ定義記述に基づいて、アセットデータ300に含まれる1または複数のプロパティの名称および値のデータ型を取得する。
情報処理装置100(追加モジュール154)は、ソースコード160の解析結果などに基づいて、1または複数のプロパティを含むアセットデータ300のデータ構造を特定する情報を含むスキーマファイル180を生成する。なお、上述したような中間オブジェクト130を用いる場合には、中間オブジェクト130が保持するデータがアセットデータ300として出力される。そのため、情報処理装置100(追加モジュール154)は、アプリケーションプログラム118が実行中に生成される、アセットデータ300として出力されるデータを保持する中間オブジェクト130の型に基づいて、スキーマファイル180を生成してもよい。
この場合には、情報処理装置100(追加モジュール154)は、スキーマファイル180の生成とともに、アセットデータ300として出力されるデータを保持する中間オブジェクト130を実装するための追加コード170を生成する。
スキーマファイル180を用いることで、編集ツールとアプリケーションプログラム118(実行可能ファイル))との連携を容易化できる。なお、スキーマファイル180は、JSON形式やXML形式などの汎用形式で出力されてもよい。汎用形式のスキーマファイル180を用いることで、様々な編集ツールでスキーマファイル180を利用できる。
例えば、編集ツールは、スキーマファイル180に基づいて、アセットデータ300の作成、アセットデータ300の編集、および、アセットデータ300の表示などを行う。
ユーザは、編集ツール上で操作を行うことで、スキーマファイル180に対応するアプリケーションプログラム118が読み出すことのできるアセットデータ300(例えば、テストデータ)を生成できる。また、ユーザは、編集ツール上で操作を行うことで、スキーマファイル180に対応するアプリケーションプログラム118が読み出すことのできるアセットデータ300を編集できる(例えば、デバッグ用に値を変更するなど)。また、編集ツールは、スキーマファイル180に対応するアプリケーションプログラム118が出力したアセットデータ300に対応するスキーマファイル180の情報を付加して、ユーザへ提示する。
図19~図21は、本実施の形態に従う情報処理装置100が生成したスキーマファイル180の利用例を説明するための図である。図19を参照して、実行中のアプリケーションプログラム118は、アセットデータ300A,300Bを書き出し(シリアライズ)および読み出し(デシリアライズ)できるようになっている。
アセットデータ300A,300Bにそれぞれ対応するスキーマファイル180A,180Bが予め生成されているとする。
編集ツール400は、スキーマファイル180A,180Bを参照することで、アセットデータ300A,300Bの生成および編集が可能となる。ユーザは、編集ツール400を操作することで、アセットデータ300A,300Bを自在に生成および編集できる。例えば、アプリケーションプログラム118をデバッグするためのテストデータを容易に用意できる。また、アプリケーションプログラム118から書き出されるアセットデータ300の確認することで、不具合の原因などを容易に特定できる。
編集ツール400は、開発プログラム114の一部に組み込まれていてもよいし、開発プログラム114とは独立した汎用的なアプリケーションプログラムであってもよい。編集ツール400は、スキーマファイル180に従って、アセットデータ300を書き出しおよび読み出しするためのライブラリ群480を利用してもよい。
このように、編集ツール400は、ユーザ操作に応じて、実行中のアプリケーションプログラム118から出力されたアセットデータ300を作成または編集してもよい。
図20を参照して、編集ツール400は、アプリケーションプログラム118が存在しなくても、アセットデータ300を自在に生成および編集できる。例えば、アプリケーションプログラム118が実行されていないオフラインの状態であっても、テストデータなどを生成できる。
このように、編集ツール400は、ユーザ操作に応じて、アプリケーションプログラム118が利用可能なアセットデータ300を作成してもよい。
また、図21に示すように、実行中のアプリケーションプログラム118と編集ツール400との間でデータを直接やり取りするようにしてもよい。このような構成を採用することで、編集ツール400から実行中のアプリケーションプログラム118が保持しているデータを直接的に編集できる。すなわち、ユーザは、実行中のアプリケーションプログラム118をリアルタイムで編集できる。
このように、編集ツール400は、実行中のアプリケーションプログラム118から出力されるアセットデータ300を受信可能であるとともに、アセットデータ300を実行中のアプリケーションプログラム118へ送信可能であってもよい。
図19~図21に示すようなスキーマファイル180および編集ツール400を用いることで、アプリケーションプログラム118の開発を促進できる。
本実施の形態においては、シリアライズ定義記述が付加されたソースコードから追加コード170およびスキーマファイル180を生成できる。すなわち、アプリケーションプログラム118を生成するためのソースコードが定義している型に対応したスキーマファイル180が生成される。そのため、スキーマファイル180に基づいて、ソースコードから生成されたアプリケーションプログラム118と編集ツール400とを容易に連携できる。
また、スキーマファイル180については自動的に生成されるため、ユーザがスキーマファイル180を一から作成する必要はない。
[I.変形例]
上述の説明においては、汎用的な機能であるオブジェクト形式マクロを利用して、シリアライズおよびデシリアライズの対象であることを示すシリアライズ定義記述(および除外指定記述)をソースコードに付加する処理例について例示したが、別の方法を採用してもよい。
例えば、シリアライズ定義記述(および除外指定記述)は、コメントとしてソースコード160に配置されてもよい。すなわち、ソースコード中のコメント(例えば、C++では、2つのスラッシュ記号で開始される文字列)として、シリアライズ定義記述を付加するようにしてもよい。例えば、シリアライズおよびデシリアライズの対象となる変数に、"//[BIND_VALUE]"といった特定のキーワードを含むコメントを付加するようにしてもよい。
追加コード170の生成処理においては、字句解析により特定のキーワードを含むコメントを抽出し、特定のキーワードを含むコメントが抽出された行に記載された変数をシリアライズおよびデシリアライズの対象として特定するようにしてもよい。一方、ビルド中のコンパイルにおいて、コメントは無視されるので、本来のソースコードの部分には実質的に影響を与えることなく、アプリケーションプログラムを生成できる。
さらに、マクロ名およびコメント以外の任意の方法で、シリアライズおよびデシリアライズの対象となる変数を指定すればよい。
今回開示された実施の形態はすべての点で例示であって制限的なものではないと考えられるべきである。本発明の範囲は、上記した説明ではなく、特許請求の範囲によって示され、特許請求の範囲と均等の意味および範囲内でのすべての変更が含まれることが意図される。
30,40A,40B,40C,40D,40E,40F,40G,60 型定義、42,63,64,410,430,450,470,490 シリアライズ定義記述、50A,50B,50C,50D シリアライズ用コード、52A,52B,52C,52D デシリアライズ用コード、100 情報処理装置、102 プロセッサ、104 メモリ、106 ディスプレイ、108 入力部、110 ストレージ、112 システムプログラム、114 開発プログラム、116,116A プロジェクト、118 アプリケーションプログラム、120 オブジェクト、122 通信モジュール、124 バス、130 中間オブジェクト、131,132,133,134 インターフェイス、140 更新モジュール、142 ビルダ、144,152 解析モジュール、146 コンパイラ、148 リンカ、150 追加コード生成モジュール、154 追加モジュール、160 ソースコード、162,162A ファイル一覧、164 設定情報、170 追加コード、180,180A,180B スキーマファイル、181 名称、182 型ID、183,184 プロパティ情報、185 フォーマットバージョン、300,300A,300B アセットデータ、400 編集ツール、401,421,441,481 定義記述、404,405,424,425,444,445,464,465 関数定義、410A,490A コード、411,431,451,471,491,631,641 マクロ名、412,432,452,472,492,632,642 プロパティ名称、413,433,453,473,493,633,643 データ型定義、414,415,434,435,454,455,474,475,494,495,634,635,644,645 関数名、416,436,456,476 型名称、480 ライブラリ群、501,502 記述、636,646 型名。

Claims (12)

  1. 型に基づいてオブジェクトを生成するプログラム言語を用いてアプリケーションプログラムを開発するための開発プログラムであって、情報処理装置のコンピュータを、
    前記アプリケーションプログラムのソースコード内の型定義を特定する特定手段と、
    前記特定された型定義に基づいて生成されるオブジェクトの各々に対応するアセットデータ用の中間オブジェクトを生成する第1コードを生成し、当該生成した第1コードを前記アプリケーションプログラムのソースコードに追加するコード追加手段として機能させ、
    前記中間オブジェクトがアセットデータとして保存される、開発プログラム。
  2. 前記コード追加手段は、前記中間オブジェクトの型定義である第2コードを前記アプリケーションプログラムのソースコードにさらに追加し、
    前記第2コードの型定義に従って、前記中間オブジェクトが生成される、請求項1に記載の開発プログラム。
  3. 前記第2コードにおいて、前記中間オブジェクトの型は、対応する前記ソースコード内の型定義とは独立して定義される、請求項2に記載の開発プログラム。
  4. 前記第2コードにおいて、前記中間オブジェクトの型は、共通の型定義を継承するように定義される、請求項2に記載の開発プログラム。
  5. 前記第2コードは、予め指定された関数により取得される値または予め指定された値を、前記中間オブジェクトに保持するための処理、を呼び出す処理を行うためのコードを含む、請求項1~4のいずれか1項に記載の開発プログラム。
  6. 前記第2コードは、前記中間オブジェクトが保持するプロパティの値を予め指定された関数に引き渡す処理、を呼び出す処理を行うためのコードを含む、請求項1~4のいずれか1項に記載の開発プログラム。
  7. 前記第2コードは、前記中間オブジェクトの型ごとに、前記中間オブジェクトのプロパティの値を予め定められた形式で出力する処理、を呼び出す処理を行うためのコードを含む、請求項1~4のいずれか1項に記載の開発プログラム。
  8. 前記特定手段は、前記アプリケーションプログラムのソースコードから、プロパティの名称を指定する第1記述と、値を取得するための関数または変数を指定する第2記述とを含む、所定の記述を抽出する、請求項1~4のいずれか1項に記載の開発プログラム。
  9. 前記コード追加手段は、前記中間オブジェクトの履歴を保持する処理を実行する第3コードを前記アプリケーションプログラムのソースコードにさらに追加する、請求項1~4のいずれか1項に記載の開発プログラム。
  10. 型に基づいてオブジェクトを生成するプログラム言語を用いてアプリケーションプログラムを開発するための情報処理システムであって、
    前記アプリケーションプログラムのソースコード内の型定義を特定する特定手段と、
    前記特定された型定義に基づいて生成されるオブジェクトの各々に対応するアセットデータ用の中間オブジェクトを生成する第1コードを生成し、当該生成した第1コードを前記アプリケーションプログラムのソースコードに追加するコード追加手段とを備え、
    前記中間オブジェクトがアセットデータとして保存される、情報処理システム。
  11. 1または複数のプロセッサと、プログラムを格納するメモリとを備えた情報処理装置であって、前記情報処理装置は、前記1または複数のプロセッサが前記プログラムを実行することで、
    型に基づいてオブジェクトを生成するプログラム言語を用いて記述された、アプリケーションプログラムのソースコード内の型定義を特定する処理と、
    前記特定された型定義に基づいて生成されるオブジェクトの各々に対応するアセットデータ用の中間オブジェクトを生成する第1コードを生成し、当該生成した第1コードを前記アプリケーションプログラムのソースコードに追加する処理とを実行し、
    前記中間オブジェクトがアセットデータとして保存される、情報処理装置。
  12. 型に基づいてオブジェクトを生成するプログラム言語を用いてアプリケーションプログラムを開発するためのコンピュータが実行する情報処理方法であって、
    型に基づいてオブジェクトを生成するプログラム言語を用いて記述された、アプリケーションプログラムのソースコード内の型定義を特定するステップと、
    前記特定された型定義に基づいて生成されるオブジェクトの各々に対応するアセットデータ用の中間オブジェクトを生成する第1コードを生成し、当該生成した第1コードを前記アプリケーションプログラムのソースコードに追加するステップとを備え
    前記中間オブジェクトがアセットデータとして保存される、情報処理方法。
JP2022110523A 2022-07-08 2022-07-08 開発プログラム、情報処理システム、情報処理装置、および、情報処理方法 Pending JP2024008554A (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2022110523A JP2024008554A (ja) 2022-07-08 2022-07-08 開発プログラム、情報処理システム、情報処理装置、および、情報処理方法
US18/348,703 US20240012625A1 (en) 2022-07-08 2023-07-07 Non-transitory computer-readable storage medium with executable development program stored thereon, information processing system, information processing apparatus, and information processing method

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2022110523A JP2024008554A (ja) 2022-07-08 2022-07-08 開発プログラム、情報処理システム、情報処理装置、および、情報処理方法

Publications (1)

Publication Number Publication Date
JP2024008554A true JP2024008554A (ja) 2024-01-19

Family

ID=89431441

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2022110523A Pending JP2024008554A (ja) 2022-07-08 2022-07-08 開発プログラム、情報処理システム、情報処理装置、および、情報処理方法

Country Status (2)

Country Link
US (1) US20240012625A1 (ja)
JP (1) JP2024008554A (ja)

Also Published As

Publication number Publication date
US20240012625A1 (en) 2024-01-11

Similar Documents

Publication Publication Date Title
US7150008B2 (en) Non-invasive rule-based binary analysis of software assemblies
EP3134811B1 (en) Decomposing a generic class into layers
JP3041222B2 (ja) ソース・コード作成システム及び方法
US8752020B2 (en) System and process for debugging object-oriented programming code leveraging runtime metadata
TWI556170B (zh) 將作業系統之原始應用程式介面投射至其它程式語言(二)
US20030145309A1 (en) Probe description language
WO2015176492A1 (en) A system and method thereof for creating dynamically attachable and detachable binary files
US8141035B2 (en) Method for accessing internal states of objects in object oriented programming
JPH0836494A (ja) 動的拡張可能オブジェクト用のタイプ・セーフ・フレームワークのための方法及び装置
Ozik et al. The ReLogo agent-based modeling language
Pantridge et al. On the difficulty of benchmarking inductive program synthesis methods
KR20080038306A (ko) 널가능과 후 바인딩
US7421715B1 (en) System and method for dynamic late-binding of persistent object implementations in software-based systems
US7096453B2 (en) Data definition language
Freudenberg et al. Squeakjs: a modern and practical smalltalk that runs in any browser
Thrasher et al. Taming complex bioinformatics workflows with Weaver, Makeflow, and Starch
Křikava et al. SIGMA: Scala internal domain-specific languages for model manipulations
JP2024008554A (ja) 開発プログラム、情報処理システム、情報処理装置、および、情報処理方法
JP2024008553A (ja) 開発プログラム、情報処理システム、情報処理装置、および、情報処理方法
JP2024008555A (ja) 開発プログラム、情報処理システム、情報処理装置、および、情報処理方法
Lyu et al. A procedure-based dynamic software update
US8010955B2 (en) Reducing the run-time cost of incorporating custom tags in a server page
McGrath C# Programming in easy steps: Updated for Visual Studio 2019
Malle et al. The need for speed of ai applications: Performance comparison of native vs. browser-based algorithm implementations
McNamara Rust in Action