(57)【要約】【課題】異なる文字コード体系を使用する場合におけるプログラムの修正を抑制する。【解決手段】実行制御装置１０は、１または２以上の文字それぞれに対してメモリ１１上に一の長さの文字コードを格納可能な第１の領域を割り当てる文字型変数を用いたプログラム１３による、文字型変数についての文字の処理を検出し、文字型変数についての文字の処理の検出に応じて、各文字について第１の領域と対応付けてメモリ１１上に第２の領域を確保する。実行制御装置１０は、メモリ１１上に確保された第１および第２の領域を用いて、上記の一の長さより長い他の文字コードで表現される文字を処理する。【選択図】図１
2015191272.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータが行う実行制御方法であって、
１または２以上の文字それぞれに対してメモリ上に一の長さの文字コードを格納可能な第１の領域を割り当てる文字型変数を用いたプログラムによる、前記文字型変数についての文字の処理を検出し、
前記文字型変数についての文字の処理の検出に応じて、各文字について前記第１の領域と対応付けて前記メモリ上に第２の領域を確保し、
前記第１および第２の領域を用いて、前記一の長さより長い他の文字コードで表現される文字を処理する、
実行制御方法。
【請求項２】
前記他の文字コードのうち前記一の長さの部分を前記第１の領域に格納し、前記一の長さの部分以外の他の部分を前記第２の領域に格納する、
請求項１記載の実行制御方法。
【請求項３】
前記他の文字コードを前記メモリ以外のデバイスに出力する場合、前記第１の領域に格納されたビット列と前記第２の領域に格納されたビット列とを結合して前記他の文字コードを再現する、
請求項１または２記載の実行制御方法。
【請求項４】
前記他の文字コードの一部分を前記第１および第２の領域に重複して格納し、
前記第１の領域に格納された前記一部分に相当するビット列と前記第２の領域に格納された前記一部分に相当するビット列とを比較することで、他のプログラムに基づいて前記文字型変数についての文字の処理が行われたことを検出する、
請求項１乃至３の何れか一項に記載の実行制御方法。
【請求項５】
コンピュータに、
１または２以上の文字それぞれに対してメモリ上に一の長さの文字コードを格納可能な第１の領域を割り当てる文字型変数を用いたプログラムによる、前記文字型変数についての文字の処理を検出し、
前記文字型変数についての文字の処理の検出に応じて、各文字について前記第１の領域と対応付けて前記メモリ上に第２の領域を確保し、
前記第１および第２の領域を用いて、前記一の長さより長い他の文字コードで表現される文字を処理する、
処理を実行させる実行制御プログラム。
【請求項６】
プログラムで用いられる文字型変数に応じて、１または２以上の文字それぞれに対して一の長さの文字コードを格納可能な第１の領域が割り当てられるメモリと、
前記プログラムによる前記文字型変数についての文字の処理を検出し、前記文字型変数についての文字の処理の検出に応じて、各文字について前記第１の領域と対応付けて前記メモリ上に第２の領域を確保し、前記第１および第２の領域を用いて、前記一の長さより長い他の文字コードで表現される文字を処理する演算部と、
を有する実行制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は実行制御方法、実行制御プログラムおよび実行制御装置に関する。
【背景技術】
【０００２】
プログラムの中には、コンピュータに文字を処理させるものがある。例えば、事務作業を支援するプログラムの中には、データベースから文字データを読み込み、文字データが示す文字を文書フォーマット中の所定の位置に挿入して印刷するものがある。
【０００３】
コンピュータ上で文字を扱うにあたり、各文字は何れかの文字コード体系に従って符号化される。文字コード体系としては、ＡＳＣＩＩ（American Standard Code for Information Interchange），ＵＴＦ（UCS (Universal Coded Character Set) Transformation Format）−８，ＵＴＦ−１６，ＵＴＦ−３２，Ｓｈｉｆｔ＿ＪＩＳ（Japanese Industrial Standards）など、様々なものが提案されている。異なる文字コード体系の間では、同じ文字に対して異なる符号（文字コード）が割り当てられていることがある。
【０００４】
文字コードの長さ（例えば、バイト数）は、文字コード体系によって異なることがあり、同じ文字コード体系の中でも文字によって異なることがある。例えば、ＵＴＦ−８では、主要なラテン文字が１バイトで表現され、多くの漢字が３〜４バイトで表現される。ＵＴＦ−３２では、各文字が４バイトで表現される。Ｓｈｉｆｔ＿ＪＩＳでは、主要なラテン文字が１バイトで表現され、漢字が２バイトで表現される。近年は、長い（例えば、バイト数の大きい）文字コードを用いて世界中の多様な文字を表現できるようにした大規模文字コード体系が提案されており、文字コードの最大長が増大する傾向にある。
【０００５】
なお、文字コードの変換に関して、ＵＴＦ−８の文字コードを含むデータを読み込み、ＵＴＦ−１６の文字コードを扱うＡＰＩ（Application Programming Interface）を利用してデータを処理するプログラムを生成するコンパイラが提案されている。このコンパイラは、文字変数に格納された文字を読み出す命令を検出すると、当該命令の前に文字コードをＵＴＦ−８からＵＴＦ−１６に変換して文字変数を更新する命令を挿入する。
【０００６】
また、プログラムが使用するメモリ領域の割当に関して、ある配列の一部（部分配列）のデータを引数として受け取る関数を呼び出すプログラムを生成するコンパイラが提案されている。このコンパイラは、部分配列のデータがメモリ上の連続した領域に格納されるものか判定する。コンパイラは、部分配列のデータが連続した領域にある場合、オリジナルのデータを関数から直接参照させるプログラムを生成し、不連続な領域にある場合、部分配列のデータをメモリ上でコピーして関数に渡すプログラムを生成する。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００５−２９３３８６号公報
【特許文献２】特開平１１−１８４７１０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
ところで、ある文字コード体系で表現された文字を処理するようにプログラムを作成した後、そのプログラムを用いて、他の文字コード体系で表現された文字を処理したいことがある。例えば、ある国の業務に使用するプログラムを作成し、その後に言語の異なる他の国に業務を拡大したとき、そのプログラムを当該他の国でも使用したいことがある。
【０００９】
このとき、他の文字コード体系における文字コードの最大長がプログラム作成時に想定していた文字コード体系よりも長くなると、そのままでは他の文字コード体系で表現された文字を正常に処理できないことがあるという問題がある。例えば、１文字当たり２バイトのメモリ領域が確保される文字型変数を含むプログラムを用いて、４バイトで表現された文字を処理しようとすると、メモリ領域から文字コードが溢れてしまう。
【００１０】
一方、プログラム作成時に想定していたものより長い文字コードを扱えるようにプログラムを修正することは、修正の影響が広範囲に及び作業量が多くなるおそれがある。例えば、ある文字型変数のデータサイズを大きくすると、その変数を参照している様々な処理の記載も修正することになるおそれがある。また、データ構造が変更されると、そのデータ構造に依存する処理手順（アルゴリズム）も修正することになるおそれがある。
【００１１】
１つの側面では、本発明は、異なる文字コード体系を使用する場合におけるプログラムの修正を抑制する実行制御方法、実行制御プログラムおよび実行制御装置を提供することを目的とする。
【課題を解決するための手段】
【００１２】
１つの態様では、コンピュータが行う実行制御方法が提供される。実行制御方法では、１または２以上の文字それぞれに対してメモリ上に一の長さの文字コードを格納可能な第１の領域を割り当てる文字型変数を用いたプログラムによる、文字型変数についての文字の処理を検出する。文字型変数についての文字の処理の検出に応じて、各文字について第１の領域と対応付けてメモリ上に第２の領域を確保する。第１および第２の領域を用いて、一の長さより長い他の文字コードで表現される文字を処理する。
【００１３】
また、１つの態様では、コンピュータに実行させる実行制御プログラムが提供される。
また、１つの態様では、メモリと演算部とを有する実行制御装置が提供される。メモリには、プログラムで用いられる文字型変数に応じて、１または２以上の文字それぞれに対して一の長さの文字コードを格納可能な第１の領域が割り当てられる。演算部は、プログラムによる文字型変数についての文字の処理を検出し、文字型変数についての文字の処理の検出に応じて、各文字について第１の領域と対応付けてメモリ上に第２の領域を確保し、第１および第２の領域を用いて、一の長さより長い他の文字コードで表現される文字を処理する。
【発明の効果】
【００１４】
１つの側面では、異なる文字コード体系を使用する場合におけるプログラムの修正を抑制できる。
【図面の簡単な説明】
【００１５】
【図１】第１の実施の形態の実行制御装置を示す図である。
【図２】第２の実施の形態の情報処理システムを示す図である。
【図３】サーバ装置のハードウェア例を示すブロック図である。
【図４】ユーザプログラムの例を示す図である。
【図５】文字コード体系を変更した場合の問題点を示す図である。
【図６】隠し領域を用いた文字コードの格納例を示す図である。
【図７】サーバ装置のソフトウェア構成例を示す図である。
【図８】サーバ装置の機能例を示すブロック図である。
【図９】領域管理テーブルの例を示す図である。
【図１０】実行制御の手順例を示すフローチャートである。
【図１１】文字コード処理の手順例を示すフローチャートである。
【図１２】文字コード処理の手順例を示すフローチャート（続き）である。
【図１３】隠し領域を用いた文字コードの他の格納例を示す図である。
【発明を実施するための形態】
【００１６】
以下、本実施の形態を図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態の実行制御装置を示す図である。
【００１７】
第１の実施の形態の実行制御装置１０は、プログラム１３の実行を制御する。実行制御装置１０は、プログラム１３を実行するコンピュータであってもよい。また、以下に説明する実行制御は、プログラム１３から利用されるランタイムライブラリやプログラム１３を解釈するインタープリタなど、ソフトウェアを用いて実現されてもよい。プログラム１３は、高級言語を用いて記述されたソースプログラムでもよいし、機械語を用いて記述された機械可読なオブジェクトプログラムであってもよい。
【００１８】
実行制御装置１０は、メモリ１１および演算部１２を有する。メモリ１１は、例えば、ＲＡＭ（Random Access Memory）などの揮発性の半導体メモリである。演算部１２は、例えば、プロセッサである。プロセッサは、ＣＰＵ（Central Processing Unit）やＤＳＰ（Digital Signal Processor）であってもよく、ＡＳＩＣ（Application Specific Integrated Circuit）やＦＰＧＡ（Field Programmable Gate Array）などの特定用途の集積回路を含んでもよい。プロセッサは、ＲＡＭなどの記憶装置（例えば、メモリ１１）に記憶されたプログラムを実行するものであってもよい。また、２以上のプロセッサの集合（マルチプロセッサ）を「プロセッサ」と呼んでもよい。
【００１９】
メモリ１１には、プログラム１３が実行されるとき、文字型変数に対応する領域が確保される。プログラム１３は、１または２以上の文字それぞれに対してある長さ（例えば、１バイトまたは２バイト）の文字コードを格納可能な領域を割り当てる文字型変数を用いて記述されている。例えば、プログラム１３には、それぞれ１バイトの文字コードで表現された文字１つを代入可能な文字型変数ｃ１，ｃ２が定義されている。この場合、メモリ１１には、プログラム１３の記述に従って、文字型変数ｃ１に対応する１バイトの領域１６が確保され、文字型変数ｃ２に対応する１バイトの領域１７が確保される。
【００２０】
また、メモリ１１には、１または２以上の文字それぞれについて、プログラム１３で定義されている文字コードの長さ分の領域に加えて、その領域と対応付けられた他の領域が確保される。例えば、メモリ１１には、文字型変数ｃ１に関して領域１６と対応付けて領域１８が確保され、文字型変数ｃ２に関して領域１７と対応付けて領域１９が確保される。領域１８，１９の大きさは、例えば、領域１６，１７と同じまたは領域１６，１７の整数倍などとする。領域１８，１９は、プログラム１３の要求に応じて確保される領域ではないためプログラム１３から認識されず、「隠し領域」と呼ぶこともできる。
【００２１】
演算部１２は、プログラム１３に従って文字型変数についての文字の処理が行われることを検出する。文字型変数についての文字の処理としては、文字型変数を用いて定義された処理であって、例えば、文字型変数への文字の格納、文字型変数からの文字の読み出し、文字型変数の間の文字のコピーや移動、２つの文字型変数の間の文字の比較などが挙げられる。文字型変数についての処理を検出すると、演算部１２は、文字型変数に応じて確保される領域（例えば、領域１６，１７）と対応付けられた他の領域（例えば、領域１８，１９）がメモリ１１にまだ確保されていない場合、当該他の領域をメモリ１１上に確保する。そして、演算部１２は、１または２以上の文字それぞれを、メモリ１１に確保された領域を用いて処理する。このとき、演算部１２は、プログラム１３の要求に応じて確保される領域とその領域に対応付けられた他の領域の両方を利用することで、プログラム１３が想定する長さより長い（例えば、３バイトまたは４バイトの）他の文字コードで表現される文字を処理できるようにする。
【００２２】
例えば、プログラム１３を実行することで、ＵＴＦ−８で記述された文字列が実行制御装置１０に読み込まれるとする。ＵＴＦ−８は、文字によって文字コードの長さが異なる文字コード体系であり、１〜４バイト（または、１〜６バイト）の文字コードを含む。このとき、文字型変数ｃ１に対応して文字「Ａ」を示す１バイトの文字コード１４（１６進数で「４１」）が読み込まれ、文字型変数ｃ２に対応して文字「α」を示す２バイトの文字コード１５（１６進数で「ＣＥＢ０」）が読み込まれたとする。
【００２３】
すると、例えば、演算部１２は、文字「Ａ」について領域１６にビット列「４１」を格納する。文字コード１４の長さは１バイトであり文字型変数ｃ１に応じて確保される領域１６のサイズと一致するため、演算部１２は領域１８を使用しなくてもよい。一方、演算部１２は、文字「α」について、領域１７にビット列「ＣＥ」を格納し領域１９にビット列「Ｂ０」を格納する。文字コード１５の長さは２バイトであり文字型変数ｃ２に応じて確保される領域１７のサイズより大きいため、演算部１２は領域１９を使用する。
【００２４】
このように、読み込む文字それぞれが１バイトで表現されていることを想定してプログラム１３が記述されている場合であっても、メモリ１１に確保される領域１８，１９を利用することで、２バイト以上で表現された文字を適切に処理することが可能となる。このとき、プログラム１３は領域１８，１９の存在を認識しなくてよく、２バイト以上で表現された文字を処理できるようにプログラム１３を修正しなくてもよい。
【００２５】
ここで、プログラム１３がコンパイル済のオブジェクトコードであり、演算部１２の処理がランタイムライブラリを用いて実装される場合の実行制御の一例を説明する。
プログラム１３をコンパイルするとき、コンパイラは、所定の文字型（例えば、Ｃ言語のｃｈａｒ型や、ＣＯＢＯＬ言語のＸ型など）の変数を検出する。１文字を表現するのに用いる想定するバイト数は、文字型によって予め決まっている。すると、コンパイラは、通常のコンパイルと同様に、この想定するバイト数に相当する第１の領域をメモリ１１に確保するための命令を、オブジェクトコードに含める。第１の領域は、プログラム１３の起動時に静的に確保されることもあるし、プログラム１３自身が処理の途中でヒープ領域から動的に確保することもある。また、第１の領域は、ランタイムライブラリを介して動的に確保することもある。その場合、コンパイラは、第１の領域の確保をランタイムライブラリに要求する命令を、プログラム１３に含めることになる。
【００２６】
また、コンパイラは、プログラム１３の中から、文字型変数についての処理の記述として、文字型変数への文字の代入または文字型変数に代入された文字の参照の記述を検出する。通常のコンパイルの場合、コンパイラは、第１の領域にアクセスする命令（第１の領域に文字コードを書き込む命令または第１の領域から文字コードを読み出す命令）を、オブジェクトコードに含めることになる。一方、第１の実施の形態の実行制御を実現する場合、コンパイラは、第１の領域にアクセスする命令の代わりに、ランタイムライブラリを呼び出す命令をオブジェクトコードに含める。
【００２７】
プログラム１３がランタイムライブラリを呼び出すとき、例えば、プログラム１３は、アクセスしようとする第１の領域のアドレス（例えば、開始アドレスと終了アドレス）をランタイムライブラリに通知する。また、プログラム１３は、アクセスしようとする第１の領域に対応する変数の文字型、または、当該第１の領域における１文字当たりのバイト数を、ランタイムライブラリに通知する。ただし、オブジェクトコードに１文字当たりのバイト数の情報を含めておき、ランタイムライブラリがこれを参照してもよい。
【００２８】
このようにしてコンパイルされたプログラム１３を実行すると、メモリ１１に第１の領域が確保される段階では、ランタイムライブラリは呼び出されない可能性があり、第１の領域に対応する第２の領域はまだ確保されない。一方、プログラム１３が第１の領域にアクセスしようとするとき、ランタイムライブラリが呼び出される。ランタイムライブラリは、プログラム１３から通知された第１の領域に対応する第２の領域がまだメモリ１１に確保されていない場合、第２の領域を確保する。第２の領域は、プログラム１３から明示的に要求された領域ではなく、プログラム１３から認識されないものである。
【００２９】
そして、ランタイムライブラリは、プログラム１３からの呼び出しに対応する処理として、第１の領域と第２の領域を用いて、文字型に応じて決まるバイト数より長い文字コードで表現された文字を処理する。例えば、ランタイムライブラリは、文字毎に、文字コードの一部のビット列を第１の領域に書き込み、文字コードの他の部分のビット列を第２の領域に書き込む。また、例えば、ランタイムライブラリは、文字毎に、第１の領域に格納されたビット列と第２の領域に格納されたビット列を結合して、文字コードを再現する。
【００３０】
第１の実施の形態の実行制御装置１０によれば、１または２以上の文字それぞれについて、文字型変数に応じてメモリ１１に確保される第１の領域と対応付けて、第２の領域がメモリ１１に確保される。そして、文字型変数についての文字の処理が行われるとき、第１の領域と第２の領域とを用いて、長い文字コードで表現される文字が処理される。これにより、ある文字コード体系で表現された文字を処理するようにプログラム１３を作成した後、プログラム１３を用いて、長い文字コードを含む他の文字コード体系で表現された文字を処理することが可能となる。このとき、プログラム１３を他の文字コード体系に適応させるための修正を抑制することができる。
【００３１】
プログラムを修正することで長い文字コードを処理できるようにする場合には、以下のような問題が生じる。１つの方法として、変数の型をサイズの大きいものに変更することが考えられる。例えば、Ｃ言語では１バイト文字を示すｃｈａｒ型から２バイト文字を示すｗｃｈａｒ型に変更することが考えられ、ＣＯＢＯＬ言語では１バイト文字を示すＸ型から２バイト文字を示すＮ型に変更することが考えられる。
【００３２】
しかし、ある変数の型を変更すると、その変数を参照するプログラム中の記載も修正することになるおそれがあり、修正量が大きくなる可能性がある。また、修正する変数が、複数のデータ項目を含むデータ構造（例えば、Ｃ言語の構造体やＣＯＢＯＬ言語の集団項目など）に属する場合、レイアウトが変わってしまいその影響が広範囲に及ぶ可能性がある。例えば、サイズを大きくした変数が構造体に属しておりその変数の後ろに他の変数が定義されているとする。この場合、構造体の先頭から他の変数までのオフセットが変わることで、他の変数を参照するプログラム中の記載も修正することになるおそれがある。
【００３３】
また、１つの方法として、変数の型によって決まる単位データ量（文字ユニット）に１文字分の文字コードが収まるという前提（１文字１ユニットの原則）を崩し、複数ユニットで１文字を表現することを許容することが考えられる。例えば、文字ユニットが１バイトであるｃｈａｒ型を用いてユニット数６の配列変数を定義し、その配列変数に２バイト文字を３個格納することが考えられる。しかし、１文字１ユニットの原則を崩すと、文字の区切りを判定する処理をプログラム中で明示的に記述することになり、その配列変数を参照するアルゴリズムを変更することになるおそれがある。
【００３４】
このように、プログラムを修正して長い文字コードを処理できるようにする場合、その影響が広範囲に及び、修正作業の負担が大きくなるおそれがあるという問題がある。これに対し、実行制御装置１０を用いることでプログラムの修正を抑制し、そのプログラムを利用して他の文字コード体系の文字を処理することが容易となる。
【００３５】
［第２の実施の形態］
図２は、第２の実施の形態の情報処理システムを示す図である。
第２の実施の形態の情報処理システムは、端末装置２１、ストレージ装置２２およびサーバ装置１００を有する。端末装置２１とサーバ装置１００、および、サーバ装置１００とストレージ装置２２は、ネットワーク２０を介して通信可能である。
【００３６】
端末装置２１は、業務においてユーザが操作するクライアントコンピュータである。端末装置２１は、ユーザが入力した文字などを示す文字データをサーバ装置１００に送信することがある。また、端末装置２１は、サーバ装置１００から文字データを受信し、受信した文字データが示す文字を端末装置２１のディスプレイに表示することがある。
【００３７】
ストレージ装置２２は、ＨＤＤ（Hard Disk Drive）など、データを格納する不揮発性の記憶装置を有する。ストレージ装置２２は、データをファイルとして管理するコンピュータ（ファイルサーバ）またはデータをデータベースとして管理するコンピュータ（データベースサーバ）であってもよい。ストレージ装置２２は、サーバ装置１００から文字データを受信し、受信した文字データを不揮発性の記憶装置に書き込むことがある。
【００３８】
サーバ装置１００は、業務用のアプリケーションプログラムを実行するサーバコンピュータである。サーバ装置１００で実行されるプログラムの中には、文字列を処理するものがある。サーバ装置１００は、端末装置２１から文字データを受信することがある。また、サーバ装置１００は、サーバ装置１００が備える不揮発性の記憶装置またはストレージ装置２２から文字データを読み込むことがある。また、サーバ装置１００は、端末装置２１に文字データを送信することがある。また、サーバ装置１００は、サーバ装置１００に接続されたプリンタなどの出力装置に文字データを出力することがある。
【００３９】
サーバ装置１００では、異なるプログラミング言語で記述された複数の種類のプログラムが実行され得る。例えば、ＣＯＢＯＬ言語で作成されたプログラムとＣ言語で作成されたプログラムとがサーバ装置１００で実行される。種類の異なるプログラムの間では、一方のプログラムが、他方のプログラムが公開するインタフェース定義（例えば、関数やデータ構造の定義）に基づいて他方のプログラムを呼び出すことがある。
【００４０】
図３は、サーバ装置のハードウェア例を示すブロック図である。
サーバ装置１００は、ＣＰＵ１０１、ＲＡＭ１０２、ＨＤＤ１０３、画像信号処理部１０４、入力信号処理部１０５、媒体リーダ１０６および通信インタフェース１０７を有する。これらのユニットはバスに接続されている。ＣＰＵ１０１は第１の実施の形態の演算部１２の一例であり、ＲＡＭ１０２は第１の実施の形態のメモリ１１の一例である。
【００４１】
ＣＰＵ１０１は、プログラムの命令を実行する演算回路を含むプロセッサである。ＣＰＵ１０１は、ＨＤＤ１０３に記憶されているプログラムやデータの少なくとも一部をＲＡＭ１０２にロードし、プログラムを実行する。なお、ＣＰＵ１０１は複数のプロセッサコアを備えてもよく、サーバ装置１００は複数のプロセッサを備えてもよく、以下で説明する処理を複数のプロセッサまたはプロセッサコアを用いて並列に実行してもよい。また、複数のプロセッサの集合（マルチプロセッサ）を「プロセッサ」と呼んでもよい。
【００４２】
ＲＡＭ１０２は、ＣＰＵ１０１が実行するプログラムやＣＰＵ１０１が演算に用いるデータを一時的に記憶する揮発性の半導体メモリである。なお、サーバ装置１００は、ＲＡＭ以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
【００４３】
ＨＤＤ１０３は、ＯＳ（Operating System）やミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。なお、サーバ装置１００は、フラッシュメモリやＳＳＤ（Solid State Drive）などの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
【００４４】
画像信号処理部１０４は、ＣＰＵ１０１からの命令に従って、サーバ装置１００に接続されたディスプレイ１１１に画像を出力する。ディスプレイ１１１としては、ＣＲＴ（Cathode Ray Tube）ディスプレイ、液晶ディスプレイ（ＬＣＤ：Liquid Crystal Display）、プラズマディスプレイ（ＰＤＰ：Plasma Display Panel）、有機ＥＬ（ＯＥＬ：Organic Electro-Luminescence）ディスプレイなどを用いることができる。
【００４５】
入力信号処理部１０５は、サーバ装置１００に接続された入力デバイス１１２から入力信号を取得し、ＣＰＵ１０１に出力する。入力デバイス１１２としては、マウスやタッチパネルやタッチパッドやトラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、サーバ装置１００に、複数の種類の入力デバイスが接続されていてもよい。
【００４６】
媒体リーダ１０６は、記録媒体１１３に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体１１３として、例えば、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）、半導体メモリなどを使用できる。媒体リーダ１０６は、例えば、記録媒体１１３から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００４７】
通信インタフェース１０７は、ネットワーク２０に接続され、ネットワーク２０を介して端末装置２１やストレージ装置２２と通信を行うインタフェースである。通信インタフェース１０７は、ケーブルで通信装置と接続される有線通信インタフェースでもよいし、基地局と無線リンクで接続される無線通信インタフェースでもよい。
【００４８】
なお、サーバ装置１００は、媒体リーダ１０６を備えていなくてもよく、ユーザが操作する端末装置から制御可能である場合には画像信号処理部１０４や入力信号処理部１０５を備えていなくてもよい。また、ディスプレイ１１１や入力デバイス１１２が、サーバ装置１００の筐体と一体に形成されていてもよい。端末装置２１およびストレージ装置２２も、サーバ装置１００と同様のハードウェアを用いて実現することができる。
【００４９】
図４は、ユーザプログラムの例を示す図である。
ここでは、ユーザが作成しサーバ装置１００に配置するユーザプログラムの例として、ＣＯＢＯＬプログラム３１およびＣプログラム３２を考える。
【００５０】
ＣＯＢＯＬプログラム３１には、１ユニットが１バイトである文字型（Ｘ型）を用いた長さ３の配列変数ＢＵＦと、Ｘ型の変数ＳＥＣＯＮＤ−ＣＨＡＲとが定義されている。そして、ＣＯＢＯＬプログラム３１では、配列変数ＢＵＦに３文字の文字コードが読み込まれ、２文字目の文字コードが変数ＳＥＣＯＮＤ−ＣＨＡＲにコピーされる。このＣＯＢＯＬプログラム３１は、１文字１バイトの文字コード体系を想定している。
【００５１】
Ｃプログラム３２も、ＣＯＢＯＬプログラム３１と同様の処理を実現している。Ｃプログラム３２には、１ユニットが１バイトである文字型（ｃｈａｒ型）を用いた長さ３の配列変数ｂｕｆと、ｃｈａｒ型の変数ｓｅｃｏｎｄＣｈａｒとが定義されている。そして、Ｃプログラム３１では、配列変数ｂｕｆに３文字の文字コードが読み込まれ、２文字目の文字コードが変数ｓｅｃｏｎｄＣｈａｒにコピーされる。このＣプログラム３２は、ＣＯＢＯＬプログラム３１と同様、１文字１バイトの文字コード体系を想定している。
【００５２】
ただし、ＣＯＢＯＬプログラム３１やＣプログラム３２を修正せずにそのまま用いて、文字コードの最大長が大きい他の文字コード体系の文字データを処理したいことがある。そこで、第２の実施の形態では、ユーザプログラムの実行時にサーバ装置１００がバイト数の大きい文字コードを扱えるように文字処理を制御することを考える。以下では、ユーザプログラムとして主にＣＯＢＯＬプログラム３１を想定する。
【００５３】
図５は、文字コード体系を変更した場合の問題点を示す図である。
ここでは、文字列「５コ  」（３文字目はスペース）の文字コードを読み込むことを考える。文字コード体系としてＳｈｉｆｔ＿ＪＩＳを用いた場合、この３文字はそれぞれ１バイトで表現することができ、この文字列は１６進数で「３５ＢＡ２０」と表現される。よって、ＣＯＢＯＬプログラム３１の配列変数ＢＵＦに文字コードを収容できる。
【００５４】
これに対して、文字コード体系としてＵＴＦ−３２を用いた場合、各文字は４バイトで表現され、この文字列は１６進数で「００００００３５００００ＦＦ７Ａ００００００２０」と表現される。よって、配列変数ＢＵＦから文字コードが溢れてしまう。また、文字コード体系としてＵＴＦ−８を用いた場合、各文字は１〜４バイト（または、１〜６バイト）の何れかで表現され、この文字列は１６進数で「３５ＥＦＢＤＢＡ２０」と表現される。よって、配列変数ＢＵＦから文字コードが溢れてしまう。
【００５５】
このように、配列変数ＢＵＦや変数ＳＥＣＯＮＤ−ＣＨＡＲの文字ユニットより大きい文字コードが読み込まれると、オーバフローが発生すると共に、１文字１ユニットの原則が崩れてしまう。よって、ＣＯＢＯＬプログラム３１を正常に実行できなくなるおそれがある。そこで、サーバ装置１００は、以下に説明するように、文字型変数によって定義されるユーザ定義領域と対応付けて、隠し領域をＲＡＭ１０２上に用意する。
【００５６】
図６は、隠し領域を用いた文字コードの格納例を示す図である。
ここでは、１文字につき１〜４バイトであるＵＴＦ−８の文字コードを読み込むことを考える。ＣＯＢＯＬプログラム３１を実行する場合、ＲＡＭ１０２には、配列変数ＢＵＦに対応する１バイト×３文字のユーザ定義領域と変数ＳＥＣＯＮＤ−ＣＨＡＲに対応する１バイト×１文字のユーザ定義領域とが確保される。
【００５７】
サーバ装置１００は、ＲＡＭ１０２に更に、配列変数ＢＵＦのユーザ定義領域と対応付けて、３バイト×３文字の隠し領域を確保する。また、サーバ装置１００は、変数ＳＥＣＯＮＤ−ＣＨＡＲのユーザ定義領域と対応付けて、３バイト×１文字の隠し領域を確保する。ユーザ定義領域と隠し領域とを合わせると、１文字につき４バイトの領域がＲＡＭ１０２に確保されていることになる。よって、４バイト以下のＵＴＦ−８の文字コードを、配列変数ＢＵＦや変数ＳＥＣＯＮＤ−ＣＨＡＲに保持させることが可能となる。
【００５８】
隠し領域は、ユーザプログラムであるＣＯＢＯＬプログラム３１から直接認識されないメモリ領域である。ＣＯＢＯＬプログラム３１からは、１文字１ユニットの原則に従い、各文字の文字コードが１ユニットに収まっているように見える。ＣＯＢＯＬプログラム３１がユーザ定義領域に対して文字コードの書き込み・コピー・比較などの文字操作を行おうとするとき、サーバ装置１００は、ユーザ定義領域に格納されたビット列と同様の操作を隠し領域に格納されたビット列に対しても行うようにする。
【００５９】
例えば、文字列「５コ  」を示すＵＴＦ−８の文字コードを配列変数ＢＵＦに格納するとする。「５」は１バイトの文字コード「３５」で表されるため、ユーザ定義領域の１文字目にその文字コードを格納すればよく、隠し領域の３バイトは空となる。使用されていない隠し領域には、例えば、ｎｕｌｌ文字などの未使用を示す所定のビット列が格納される。「コ」は３バイトの文字コード「ＥＦＢＤＢＡ」で表されるため、ユーザ定義領域の２文字目に先頭１バイト「ＥＦ」を格納し、隠し領域の２文字目に残りの２バイト「ＢＤＢＡ」を格納すればよい。「  」（スペース）は１バイトの文字コード「２０」で表されるため、ユーザ定義領域の３文字目にその文字コードを格納すればよい。
【００６０】
その後、例えば、ＣＯＢＯＬプログラム３１に従い、文字列「５コ  」の２文字目の文字コードを配列変数ＢＵＦから変数ＳＥＣＯＮＤ−ＣＨＡＲにコピーするものとする。この場合、サーバ装置１００は、配列変数ＢＵＦのユーザ定義領域にあるビット列「ＥＦ」を、変数ＳＥＣＯＮＤ−ＣＨＡＲのユーザ定義領域にコピーする。また、サーバ装置１００は、配列変数ＢＵＦの隠し領域にあるビット列「ＢＤＢＡ」を、変数ＳＥＣＯＮＤ−ＣＨＡＲの隠し領域にコピーする。配列変数ＢＵＦに格納された文字コードを他の文字コードと比較する場合には、サーバ装置１００は、ユーザ定義領域にあるビット列同士を比較すると共に、隠し領域にあるビット列同士を比較することで、文字コードの同一性を判定する。このように、サーバ装置１００がユーザ定義領域にあるビット列と隠し領域にあるビット列とを組み合わせて読み書きすることで、長い文字コードを扱うことができる。
【００６１】
図７は、サーバ装置のソフトウェア構成例を示す図である。
前述のＣＯＢＯＬプログラム３１などのユーザプログラムは、サーバ装置１００において、コンパイラ方式またはインタープリタ方式で実行される。
【００６２】
コンパイラ方式の場合、サーバ装置１００はソフトウェアとして、ＯＳ１２１、コンパイラ１２２、ユーザプログラム１２３およびライブラリ１２４を有する。ＯＳ１２１は、ミドルウェアやアプリケーションソフトウェアの実行を制御する。コンパイラ１２２は、高級言語で記述されたソースコードを機械可読なオブジェクトコードに変換する。ユーザプログラム１２３は、コンパイラ１２２によって生成されたオブジェクトコードである。ライブラリ１２４は、ユーザプログラム１２３の実行時にユーザプログラム１２３から適宜呼び出されるランタイムライブラリである。ただし、ユーザプログラム１２３は、端末装置２１などの他のコンピュータで生成されてサーバ装置１００に配置されてもよい。その場合、サーバ装置１００はコンパイラ１２２を有しなくてもよい。
【００６３】
前述の隠し領域を利用した文字コードの処理は、ライブラリ１２４に実装され得る。例えば、コンパイラ１２２は、ソースコードをコンパイルするとき、文字コード体系または文字コードの最大長を示す情報をコンパイルオプションとしてユーザから受け取る。すると、コンパイラ１２２は、文字コードの最大長を示す情報をユーザプログラム１２３に埋め込む。また、コンパイラ１２２は、前述の配列変数ＢＵＦや変数ＳＥＣＯＮＤ−ＣＨＡＲなどの文字型変数を検出する。文字型変数の定義に対しては、コンパイラ１２２は、ライブラリ１２４を呼び出さずに自身でその文字型変数に対応するユーザ定義領域をＲＡＭ１０２に確保するようなユーザプログラム１２３を生成してもよい。
【００６４】
一方、コンパイラ１２２は、文字コードの書き込み・読み出し・比較などの文字型変数の操作を検出する。すると、コンパイラ１２２は、自身がユーザ定義領域にアクセスする代わりにライブラリ１２４の関数を呼び出すようなユーザプログラム１２３を生成する。呼び出しにあたり、ユーザプログラム１２３からライブラリ１２４には、アクセスすべきユーザ定義領域のアドレス（例えば、開始アドレスと終了アドレス）が通知される。また、ユーザプログラム１２３からライブラリ１２４には、ソースコードで指定された文字型または文字型に応じて決まる１文字ユニットの大きさが通知されてもよい。文字型変数に対する操作の手順は、ライブラリ１２４に含まれる関数の中で定義される。
【００６５】
インタープリタ方式の場合、サーバ装置１００はソフトウェアとして、ＯＳ１２１、インタープリタ１２５およびユーザプログラム１２６を有する。インタープリタ１２５は、高級言語で記述されたソースコードを逐次解釈しながら実行するミドルウェアである。ユーザプログラム１２６は、インタープリタ１２５上で実行されるソースコードである。
【００６６】
前述の隠し領域を利用した文字コードの処理は、インタープリタ１２５に実装され得る。例えば、インタープリタ１２５は、ユーザプログラム１２６を起動するとき、文字コード体系または文字コードの最大長を示す情報を実行時オプションとしてユーザから受け取る。インタープリタ１２５は、ユーザプログラム１２６に記述された文字型変数を検出する。インタープリタ１２５は、文字型変数の定義に従ってＲＡＭ１０２にユーザ定義領域を確保するとき、併せてＲＡＭ１０２に隠し領域を確保する。または、インタープリタ１２５は、ユーザプログラム１２６に従って文字型変数の操作が行われるときに、ＲＡＭ１０２に隠し領域を確保する。そして、インタープリタ１２５は、隠し領域を利用して文字コードを処理するようにする。インタープリタ１２５には、文字コードの書き込み・読み出し・比較などの文字型変数の操作についての手順が予め定義されている。
【００６７】
次に、サーバ装置１００の機能およびサーバ装置１００が行う処理について説明する。以下では、コンパイラ方式でユーザプログラムが実行される場合を考える。
図８は、サーバ装置の機能例を示すブロック図である。
【００６８】
前述のように、サーバ装置１００は、コンパイラ１２２およびライブラリ１２４を有する。また、サーバ装置１００は、プログラム記憶部１３１、起動監視部１３２、領域情報記憶部１３３、文字コード処理部１３４および領域解放部１３５を有する。プログラム記憶部１３１および領域情報記憶部１３３は、例えば、ＲＡＭ１０２またはＨＤＤ１０３に確保した記憶領域として実現される。起動監視部１３２、文字コード処理部１３４および領域解放部１３５は、ライブラリ１２４に含まれるモジュールとして実現される。
【００６９】
コンパイラ１２２は、ソースコードをコンパイルするとき、サーバ装置１００に読み込みたい文字データで使用される文字コード体系または文字コードの最大長を示す情報を、コンパイルオプションとしてユーザから受け取る。その文字コード体系はソースコードが想定しているものと異なる可能性があり、文字コードの最大長はソースコードが想定しているものより長い可能性がある。すると、コンパイラ１２２は、文字コードの最大長を示す情報をオブジェクトプログラムに埋め込む。また、コンパイラ１２２は、文字コードの書き込み・読み出し・比較などの文字型変数を操作するソースコードの記述に対して、ライブラリ１２４を呼び出すオブジェクトコードを生成する。コンパイラ１２２は、生成したオブジェクトコードをプログラム記憶部１３１に格納する。
【００７０】
起動監視部１３２は、プログラム記憶部１３１に格納されたオブジェクトコードとしてのユーザプログラムが起動すると、後述する領域管理テーブルを領域情報記憶部１３３上に生成する。領域管理テーブルは、ユーザプログラムに従ってＲＡＭ１０２に確保されるユーザ定義領域と隠し領域との対応関係が登録されるテーブルである。また、起動監視部１３２は、ユーザプログラムが終了するとき、領域管理テーブルを削除する。
【００７１】
文字コード処理部１３４は、ユーザプログラムからの呼び出しに応じて、ユーザ定義領域および隠し領域を用いて文字コードを処理する。ある文字型変数のユーザ定義領域に対して最初に文字コードを書き込もうとするとき、文字コード処理部１３４は、そのユーザ定義領域に対応する隠し領域をＲＡＭ１０２に確保する。隠し領域の大きさは、文字コードが収容できるように、ユーザプログラムに埋め込まれた文字コードの最大長の情報に基づいて判定される。そして、文字コード処理部１３４は、ユーザ定義領域と隠し領域との対応関係を、領域情報記憶部１３３に記憶された領域管理テーブルに登録する。
【００７２】
隠し領域が確保されると、文字コード処理部１３４は、書き込もうとする文字コードの先頭部分のビット列をユーザ定義領域に書き込み、ユーザ定義領域から溢れた残りのビット列を隠し領域に格納する。ある文字型変数のユーザ定義領域を参照または更新しようとするときは、文字コード処理部１３４は、領域情報記憶部１３３に記憶された領域管理テーブルからそのユーザ定義領域に対応する隠し領域を検索する。そして、文字コード処理部１３４は、ユーザ定義領域とそれに対応する隠し領域の両方に対して、文字毎にビット列の読み出し・書き込み・比較などの処理を実行する。
【００７３】
領域解放部１３５は、ある文字型変数をユーザプログラムが使用しなくなりその文字型変数のユーザ定義領域を解放しようとするとき、ユーザプログラムから呼び出される。すると、領域解放部１３５は、領域情報記憶部１３３に記憶された領域管理テーブルからそのユーザ定義領域に対応する隠し領域を検索する。そして、領域解放部１３５は、ユーザ定義領域と隠し領域を解放し、領域管理テーブルからその隠し領域の情報を削除する。
【００７４】
図９は、領域管理テーブルの例を示す図である。
領域管理テーブル１３６は、領域情報記憶部１３３に格納される。領域管理テーブル１３６は、ユーザ定義領域の開始アドレス、ユーザ定義領域の終了アドレス、ユニット種類、割当フラグ、隠し領域の開始アドレスおよび隠し領域のユニット数の項目を含む。
【００７５】
ユーザ定義領域の開始アドレスは、ユーザ定義領域の先頭を示すＲＡＭ１０２のアドレスである。ユーザ定義領域の終了アドレスは、ユーザ定義領域の末尾を示すＲＡＭ１０２のアドレスである。１つのユーザ定義領域は、配列変数ＢＵＦや変数ＳＥＣＯＮＤ−ＣＨＡＲなどの１つの文字型変数に対応してＲＡＭ１０２に確保されるものであり、ｎ文字×１ユニット（ｎは１以上の整数）の大きさをもつ。ユニット種類は、ユーザプログラムに記述された変数の型に応じて決まる１ユニットのバイト数ｋを示す。例えば、ＣＯＢＯＬ言語のＸ型は１バイトでありＮ型は２バイトである。これらのユーザ定義領域を示す情報は、例えば、ユーザ定義領域にアクセスしようとするユーザプログラム１２３が文字コード処理部１３４を呼び出すときに、文字コード処理部１３４に対して通知される。
【００７６】
割当フラグは、開始アドレスおよび終了アドレスによって特定されるユーザ定義領域に対して、隠し領域を割り当てたか否かを示すフラグである。隠し領域の開始アドレスは、隠し領域の先頭を示すＲＡＭ１０２のアドレスである。１つの隠し領域は、１つのユーザ定義領域に対応して確保されるものであり、ｎ文字×ｍユニット（ｍは１以上の整数）の大きさをもつ。１つの隠し領域は、１つの文字型変数に対応していると言うこともできる。隠し領域のユニット数は、１文字に対してｍユニットが確保されることを示す。よって、ユーザ定義領域と隠し領域を合わせて、１文字につき（ｍ＋１）×ｋバイトの文字コードを格納することができる。隠し領域のユニット数ｍは、ユーザプログラムに挿入されている文字コードの最大長を示す情報に基づいて決定できる。例えば、（ｍ＋１）×ｋが文字コードの最大長以上になるような最小のｍを決定する。ユーザ定義領域の１ユニットが１バイトであり、サーバ装置１００に読み込まれる文字コードの最大長が４バイトである場合、隠し領域のユニット数を少なくとも３ユニットとする。
【００７７】
図１０は、実行制御の手順例を示すフローチャートである。
（Ｓ１０）起動監視部１３２は、ユーザプログラムの起動を検出すると、空の領域管理テーブル１３６を生成して領域情報記憶部１３３に格納する。
【００７８】
（Ｓ１１）文字コード処理部１３４は、ユーザプログラムによる文字型変数の操作を検出したか判断する。文字型変数の操作としては、文字型変数に対応するユーザ定義領域を指定した文字コードの書き込み、ユーザ定義領域を指定した文字コードの読み出し、文字コードの比較などが挙げられる。文字型変数の操作の種類に応じて、ユーザプログラムから文字コード処理部１３４が呼び出される。文字型変数の操作を検出した場合はステップＳ１２に処理が進み、それ以外の場合はステップＳ１３に処理が進む。
【００７９】
（Ｓ１２）文字コード処理部１３４は、ユーザ定義領域と隠し領域とを利用した文字コードの処理を行う。文字コード処理の詳細は後述する。
（Ｓ１３）領域解放部１３５は、ユーザプログラムによるユーザ定義領域の解放を検出したか判断する。ユーザ定義領域を解放するとき、ユーザプログラムから領域解放部１３５が呼び出される。ユーザ定義領域の解放を検出した場合はステップＳ１４に処理が進み、それ以外の場合はステップＳ１５に処理が進む。
【００８０】
（Ｓ１４）領域解放部１３５は、領域情報記憶部１３３に記憶された領域管理テーブル１３６を参照して、ユーザプログラムから指定されたユーザ定義領域に対応する隠し領域を検索する。そして、領域解放部１３５は、ユーザプログラムから指定されたユーザ定義領域と検索された隠し領域とを解放する。また、領域解放部１３５は、そのユーザ定義領域と隠し領域の情報を領域管理テーブル１３６から削除する。
【００８１】
（Ｓ１５）起動監視部１３２は、ユーザプログラムが終了するか判断する。終了する場合はステップＳ１６に処理が進み、それ以外の場合はステップＳ１１に処理が進む。
（Ｓ１６）起動監視部１３２は、ユーザプログラムの終了を検出すると、領域情報記憶部１３３に記憶された領域管理テーブル１３６を削除する。
【００８２】
図１１は、文字コード処理の手順例を示すフローチャートである。
この文字コード処理は、前述のステップＳ１２において実行される。
（Ｓ２０）文字コード処理部１３４は、文字コードの書き込みがユーザプログラムによって要求された場合、書き込み先のアドレスを特定する。なお、文字コードの書き込みが要求されていない場合は、ステップＳ２０〜Ｓ２７を実行しなくてよい。
【００８３】
（Ｓ２１）文字コード処理部１３４は、書き込み先がライブラリ１２４によって管理される自言語処理系のＲＡＭ１０２の領域であるか判断する。例えば、ユーザプログラムがＣＯＢＯＬプログラム３１である場合、文字コード処理部１３４は、ＣＯＢＯＬ言語処理系が使用するＲＡＭ１０２の領域であるか判断する。自言語処理系のＲＡＭ１０２の領域以外の書き込み先としては、他言語処理系（例えば、Ｃ言語処理系）が使用するＲＡＭ１０２の領域や、ＨＤＤ１０３・ディスプレイ１１１・端末装置２１・ストレージ装置２２などの外部デバイスが挙げられる。書き込み先が自言語処理系のＲＡＭ１０２の領域である場合はステップＳ２２に処理が進み、それ以外の場合はステップＳ２８に処理が進む。
【００８４】
（Ｓ２２）文字コード処理部１３４は、領域情報記憶部１３３に記憶された領域管理テーブル１３６に書き込み先を包含するユーザ定義領域が登録されているか判断する。書き込み先を包含するユーザ定義領域は、書き込み先全体が開始アドレスと終了アドレスの間に収まっているものである。書き込み先を包含するユーザ定義領域が登録されている場合は、そのユーザ定義領域に対応する隠し領域が既に存在すると判断され、ステップＳ２８に処理が進む。それ以外の場合は、ステップＳ２３に処理が進む。
【００８５】
（Ｓ２３）文字コード処理部１３４は、書き込み先全体を包含していないものの、書き込み先と一部重複するユーザ定義領域が領域管理テーブル１３６に登録されているか判断する。登録されたユーザ定義領域と一部重複する領域に文字コードが書き込まれる場合としては、既存のユーザ定義領域を含む新たなユーザ定義領域をユーザプログラムが再定義した場合などが挙げられる。書き込み先と一部重複するユーザ定義領域が登録されている場合はステップＳ２４に処理が進み、それ以外の場合はステップＳ２７に処理が進む。
【００８６】
（Ｓ２４）文字コード処理部１３４は、書き込み先の領域と領域管理テーブル１３６に登録された旧ユーザ定義領域とを包含する拡大したユーザ定義領域を特定する。文字コード処理部１３４は、拡大したユーザ定義領域に対応する拡大した隠し領域をＲＡＭ１０２に確保する。そして、文字コード処理部１３４は、旧ユーザ定義領域に対応する旧隠し領域を検索し、旧隠し領域に格納されたビット列を拡大した隠し領域に移行する。
【００８７】
（Ｓ２５）文字コード処理部１３４は、旧ユーザ定義領域および旧隠し領域の情報を領域管理テーブル１３６から削除する。また、文字コード処理部１３４は、拡大したユーザ定義領域および拡大した隠し領域の情報を領域管理テーブル１３６に登録する。
【００８８】
（Ｓ２６）文字コード処理部１３４は、ＲＡＭ１０２に確保された旧隠し領域を解放する。これにより、ユーザプログラムによるユーザ定義領域の変更に合わせて、隠し領域が変更される。そして、ステップＳ２８に処理が進む。
【００８９】
（Ｓ２７）文字コード処理部１３４は、書き込み先に対応する隠し領域をＲＡＭ１０２に確保する。このとき、隠し領域を用いて表現される文字列の文字数ｎおよび１ユニットのバイト数ｋは、ユーザプログラムから呼び出し時に通知される情報またはユーザプログラムの中に含まれている記述などから特定することができる。隠し領域の１文字当たりのユニット数ｍは、文字コードの最大長に基づいて決定できる。文字コード処理部１３４は、書き込み先であるユーザ定義領域と確保した隠し領域の情報を領域管理テーブル１３６に登録する。そして、ステップＳ２８に処理が進む。
【００９０】
図１２は、文字コード処理の手順例を示すフローチャート（続き）である。
（Ｓ２８）文字コード処理部１３４は、文字コードの読み込みがユーザプログラムによって要求された場合、読み込み元が外部デバイスであるか判断する。外部デバイスとしては、ＨＤＤ１０３・ディスプレイ１１１・端末装置２１・ストレージ装置２２など、ＣＰＵ１０１とＲＡＭ１０２以外のデバイスが挙げられる。読み込み元が外部デバイスである場合はステップＳ２９に処理が進み、それ以外の場合はステップＳ３０に処理が進む。
【００９１】
（Ｓ２９）文字コード処理部１３４は、外部デバイスから文字コード列を読み込み、文字単位で文字コードを分離する。更に、文字コード処理部１３４は、各文字の文字コードをユニット毎に区切る。例えば、１ユニット１バイトの文字型変数に、１文字１〜４バイトの可変長の文字コードを読み込む場合を考える。この場合、文字コード処理部１３４は、文字コード列を１〜４バイトの文字コードに分離し、各文字コードを１バイト毎に分離する。そして、ステップＳ３４に処理が進む。
【００９２】
（Ｓ３０）文字コード処理部１３４は、文字コードの読み込み元が他言語処理系の使用するＲＡＭ１０２の領域であるか判断する。ユーザプログラムから指定された読み込み元が他言語処理系の領域であるか否かは、その領域がライブラリ１２４の管理する自言語処理系の領域に属しているか否かによって判断できる。読み込み元が他言語処理系の領域である場合はステップＳ３１に処理が進み、それ以外の場合はステップＳ３２に処理が進む。
【００９３】
（Ｓ３１）他言語処理系ではユーザ定義領域に対応する隠し領域が確保されない。このため、文字コード処理部１３４は、空の隠し領域が存在するものとみなして、ユーザ定義領域に格納されたビット列を参照する。そして、ステップＳ３４に処理が進む。
【００９４】
（Ｓ３２）文字コード処理部１３４は、文字コードの読み込み元が自言語処理系のユーザ定義領域であることから、領域管理テーブル１３６を参照して、読み込み元のユーザ定義領域に対応する隠し領域を検索してその隠し領域のアドレスを特定する。
【００９５】
（Ｓ３３）文字コード処理部１３４は、ユーザ定義領域に格納されたビット列と、ステップＳ３２で検索された隠し領域に格納されたビット列とを参照する。ユーザプログラムから指定される読み込み元が１つのユーザ定義領域の中の一部分のみである場合、文字コード処理部１３４は、ユーザ定義領域の一部分に対応する隠し領域の一部分を特定し、隠し領域の一部分のみ参照する。隠し領域の先頭からのオフセットは、領域管理テーブル１３６に登録された隠し領域のユニット数ｍと１ユニットのバイト数ｋから算出できる。
【００９６】
例えば、１ユニットのバイト数が１バイトであり、隠し領域の１文字当たりユニット数ｍが３ユニットであり、ユーザプログラムが文字列の２文字目を参照する場合を考える。この場合、文字コード処理部１３４は、ユーザ定義領域の先頭から１バイト後のビット列と、隠し領域の先頭から３バイト後のビット列とを参照する。
【００９７】
（Ｓ３４）文字コード処理部１３４は、文字コードの書き込みがユーザプログラムによって要求された場合、書き込み先が外部デバイスであるか判断する。書き込み先が外部デバイスである場合はステップＳ３５に処理が進み、それ以外の場合はステップＳ３６に処理が進む。なお、２つの文字コードを比較する場合など、文字コードの書き込みが要求されていない場合、ステップＳ３４〜Ｓ４１を実行しなくてよい。
【００９８】
（Ｓ３５）文字コード処理部１３４は、文字毎に読み込み元のユーザ定義領域のビット列と隠し領域のビット列とを結合して文字コードを再現し、再現した文字コードをシリアルに外部デバイスに出力する。ステップＳ３１で空の隠し領域があるとみなした場合、文字コード処理部１３４は、実質的にユーザ定義領域のビット列のみ出力する。
【００９９】
（Ｓ３６）文字コード処理部１３４は、文字コードの書き込み先が他言語処理系の使用するＲＡＭ１０２の領域であるか判断する。ユーザプログラムから指定された書き込み先が他言語処理系の領域であるか否かは、その領域がライブラリ１２４の管理する自言語処理系の領域に属しているか否かによって判断できる。書き込み先が他言語処理系の領域である場合はステップＳ３７に処理が進み、それ以外の場合はステップＳ４０に処理が進む。
【０１００】
（Ｓ３７）文字コード処理部１３４は、読み込まれた文字コードそれぞれが１ユニットに収まっているか判断する。読み込み元の隠し領域に未使用を示す所定の値以外のビット列が格納されている場合、１文字１ユニットでないと判断される。１文字１ユニットである場合はステップＳ３８に処理が進み、それ以外の場合はステップＳ３９に処理が進む。
【０１０１】
（Ｓ３８）他言語処理系ではユーザ定義領域に対応する隠し領域が確保されない。このため、文字コード処理部１３４は、ユーザプログラムから指定された他言語処理系が用意したユーザ定義領域に、読み込まれた文字コードを書き込む。例えば、文字コード処理部１３４は、読み込み元のユーザ定義領域から書き込み先のユーザ定義領域にビット列をコピーする。このとき、読み込み元の隠し領域は無視される。
【０１０２】
（Ｓ３９）文字コード処理部１３４は、実行エラーと判断する。その結果、ユーザプログラムが停止することがあり、ディスプレイ１１１にエラーが表示されることもある。
（Ｓ４０）文字コード処理部１３４は、文字コードの書き込み先が自言語処理系のユーザ定義領域であることから、領域管理テーブル１３６を参照して、書き込み先のユーザ定義領域に対応する隠し領域を検索してその隠し領域のアドレスを特定する。
【０１０３】
（Ｓ４１）文字コード処理部１３４は、文字毎に文字コードのうち先頭１ユニットのビット列（例えば、文字コードの先頭１バイト）を書き込み先のユーザ定義領域に格納し、ユーザ定義領域から溢れるそれ以外のビット列を書き込み先の隠し領域に格納する。例えば、文字コード処理部１３４は、読み込み元のユーザ定義領域のビット列を書き込み先のユーザ定義領域にコピーし、読み込み元の隠し領域のビット列を書き込み先の隠し領域にコピーする。ステップＳ３１で空の隠し領域があるとみなした場合、文字コード処理部１３４は、書き込み先の隠し領域には未使用を示す所定のビット列を格納する。
【０１０４】
次に、隠し領域の利用方法の変形例について説明する。
隠し領域の１文字当たりのユニット数ｍは、文字コードの最大長に応じて決定されるため、ＵＴＦ−８のような文字コードが可変長な文字コード体系を使用する場合、隠し領域の多くは空になる可能性がある。そこで、使用頻度の低い隠し領域に格納されたビット列を、ファイル圧縮技術を用いて圧縮することが考えられる。
【０１０５】
例えば、領域管理テーブル１３６に、隠し領域毎にその隠し領域が最後にアクセスされた時刻を登録しておく。文字コード処理部１３４は、最後にアクセスされてから所定時間以上経過した隠し領域のビット列を圧縮してＲＡＭ１０２に格納し、元の隠し領域を解放する。これにより、ＲＡＭ１０２の領域の使用量を削減することができる。圧縮されたビット列しようとする場合、文字コード処理部１３４は、改めて隠し領域をＲＡＭ１０２に確保し、圧縮されたビット列をその隠し領域に展開する。
【０１０６】
また、隠し領域の存在を認識している自言語処理系のライブラリ１２４は、ユーザ定義領域のビット列と隠し領域のビット列とを紐付けて処理する。一方で、隠し領域の存在を認識していない他言語処理系のプログラムや、古いコンパイラでコンパイルされておりライブラリ１２４を呼び出さずに文字コードを処理する古いユーザプログラムも、サーバ装置１００で実行されるおそれがある。そのようなプログラムは、隠し領域の存在を無視してユーザ定義領域のビット列のみ書き換えてしまうおそれがある。そこで、文字コード処理部１３４は、意図しないユーザ定義領域の書き換えを以下のように検出してもよい。
【０１０７】
図１３は、隠し領域を用いた文字コードの他の格納例を示す図である。
文字コード処理部１３４は、ｎ文字×１ユニットのユーザ定義領域と対応付けて、ｎ文字×（ｍ＋１）ユニットの隠し領域をＲＡＭ１０２に確保する。ｍ＋１ユニットは、最大長の文字コードを収容できるサイズである。文字コード処理部１３４は、各文字について文字コードの先頭１ユニットをユーザ定義領域に格納すると共に、文字コード全体を隠し領域に格納する。外部デバイスに文字コードを出力する場合、文字コード処理部１３４は、ユーザ定義領域に格納されたビット列または隠し領域に格納された先頭１ユニットのビット列を無視する。ただし、ユーザ定義領域と隠し領域とで重複させるビット列は、文字コードの先頭１ユニットでなくてもよく所定の位置のビット列であればよい。
【０１０８】
ユーザ定義領域にアクセスするとき、文字コード処理部１３４は、各文字についてユーザ定義領域に格納されたビット列と隠し領域に格納された所定の位置のビット列とを比較し、両者が一致しているか確認する。両者が一致していない場合、文字コード処理部１３４は、自言語処理系の古いユーザプログラムまたは他言語処理系のプログラムがユーザ定義領域のみを書き換えたと判断する。その場合、例えば、文字コード処理部１３４は、実行エラーと判断し、ユーザプログラムの停止やディスプレイ１１１へのエラーの表示などの所定のエラー処理を行う。または、文字コード処理部１３４は、隠し領域のビット列を消去して（未使用を示す所定のビット列を隠し領域に書き込んで）、ユーザプログラムの実行を継続させる。これにより、自言語処理系の古いユーザプログラムや他言語処理系のプログラムとの間の互換性が損なわれるリスクを低減できる。
【０１０９】
第２の実施の形態の情報処理システムによれば、ユーザプログラムの文字型変数に応じてＲＡＭ１０２に確保されるユーザ定義領域と対応付けて、ユーザプログラムから認識されない隠し領域が確保される。そして、文字コードの処理が行われるとき、ユーザ定義領域と隠し領域の両方を用いて、文字型変数によって定義される１ユニットのバイト数よりも長い文字コードが処理される。これにより、ユーザプログラムからは、読み込む文字データで使用されている文字コード体系にかかわらず、１文字１ユニットの原則に従って文字コードを処理しているように見える。よって、読み込む文字データの文字コード体系が変わってもユーザプログラムを修正しなくてよく、以前に作成したユーザプログラムを活用して情報処理システムを効率的に構築・運用することができる。
【０１１０】
なお、前述のように、第１の実施の形態の情報処理は、実行制御装置１０にプログラムを実行させることで実現することができる。第２の実施の形態の情報処理は、サーバ装置１００にプログラムを実行させることで実現することができる。
【０１１１】
プログラムは、コンピュータ読み取り可能な記録媒体（例えば、記録媒体１１３）に記録しておくことができる。記録媒体としては、例えば、磁気ディスク、光ディスク、光磁気ディスク、半導体メモリなどを使用できる。磁気ディスクには、ＦＤおよびＨＤＤが含まれる。光ディスクには、ＣＤ、ＣＤ−Ｒ（Recordable）／ＲＷ（Rewritable）、ＤＶＤおよびＤＶＤ−Ｒ／ＲＷが含まれる。プログラムは、可搬型の記録媒体に記録されて配布されることがある。その場合、可搬型の記録媒体からＨＤＤなどの他の記録媒体（例えば、ＨＤＤ１０３）にプログラムを複製して（インストールして）実行してもよい。
【符号の説明】
【０１１２】
１０  実行制御装置
１１  メモリ
１２  演算部
１３  プログラム
１４，１５  文字コード
１６，１７，１８，１９  領域
【図１】
2015191272.tif 000003
【図２】
2015191272.tif 000004
【図３】
2015191272.tif 000005
【図４】
2015191272.tif 000006
【図５】
2015191272.tif 000007
【図６】
2015191272.tif 000008
【図７】
2015191272.tif 000009
【図８】
2015191272.tif 000010
【図９】
2015191272.tif 000011
【図１０】
2015191272.tif 000012
【図１１】
2015191272.tif 000013
【図１２】
2015191272.tif 000014
【図１３】
2015191272.tif 000015