特許第6245028号(P6245028)IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 富士通株式会社の特許一覧

特許6245028実行制御方法、実行制御プログラムおよび実行制御装置
<>
  • 特許6245028-実行制御方法、実行制御プログラムおよび実行制御装置 図000002
  • 特許6245028-実行制御方法、実行制御プログラムおよび実行制御装置 図000003
  • 特許6245028-実行制御方法、実行制御プログラムおよび実行制御装置 図000004
  • 特許6245028-実行制御方法、実行制御プログラムおよび実行制御装置 図000005
  • 特許6245028-実行制御方法、実行制御プログラムおよび実行制御装置 図000006
  • 特許6245028-実行制御方法、実行制御プログラムおよび実行制御装置 図000007
  • 特許6245028-実行制御方法、実行制御プログラムおよび実行制御装置 図000008
  • 特許6245028-実行制御方法、実行制御プログラムおよび実行制御装置 図000009
  • 特許6245028-実行制御方法、実行制御プログラムおよび実行制御装置 図000010
  • 特許6245028-実行制御方法、実行制御プログラムおよび実行制御装置 図000011
  • 特許6245028-実行制御方法、実行制御プログラムおよび実行制御装置 図000012
  • 特許6245028-実行制御方法、実行制御プログラムおよび実行制御装置 図000013
  • 特許6245028-実行制御方法、実行制御プログラムおよび実行制御装置 図000014
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】6245028
(24)【登録日】2017年11月24日
(45)【発行日】2017年12月13日
(54)【発明の名称】実行制御方法、実行制御プログラムおよび実行制御装置
(51)【国際特許分類】
   G06F 9/44 20060101AFI20171204BHJP
   G06F 9/45 20060101ALI20171204BHJP
【FI】
   G06F9/06 620K
   G06F9/44 320C
   G06F9/44 322E
【請求項の数】6
【全頁数】20
(21)【出願番号】特願2014-66051(P2014-66051)
(22)【出願日】2014年3月27日
(65)【公開番号】特開2015-191272(P2015-191272A)
(43)【公開日】2015年11月2日
【審査請求日】2016年12月6日
(73)【特許権者】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】100092152
【弁理士】
【氏名又は名称】服部 毅巖
(72)【発明者】
【氏名】浦本 貴正
【審査官】 多賀 実
(56)【参考文献】
【文献】 特開2008−226010(JP,A)
【文献】 特開平9−179759(JP,A)
【文献】 特開昭61−020129(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 5/00
G06F 9/44− 9/45
G06F 17/20−17/28
(57)【特許請求の範囲】
【請求項1】
コンピュータが行う実行制御方法であって、
1または2以上の文字それぞれに対してメモリ上に一の長さの文字コードを格納可能な第1の領域を割り当てる文字型変数を用いたプログラムによる、前記文字型変数についての文字の処理を検出し、
前記文字型変数についての文字の処理の検出に応じて、各文字について前記第1の領域と対応付けて前記メモリ上に第2の領域を確保し、
前記第1および第2の領域を用いて、前記一の長さより長い他の文字コードで表現される文字を処理する、
実行制御方法。
【請求項2】
前記他の文字コードのうち前記一の長さの部分を前記第1の領域に格納し、前記一の長さの部分以外の他の部分を前記第2の領域に格納する、
請求項1記載の実行制御方法。
【請求項3】
前記他の文字コードを前記メモリ以外のデバイスに出力する場合、前記第1の領域に格納されたビット列と前記第2の領域に格納されたビット列とを結合して前記他の文字コードを再現する、
請求項1または2記載の実行制御方法。
【請求項4】
前記他の文字コードの一部分を前記第1および第2の領域に重複して格納し、
前記第1の領域に格納された前記一部分に相当するビット列と前記第2の領域に格納された前記一部分に相当するビット列とを比較することで、他のプログラムに基づいて前記文字型変数についての文字の処理が行われたことを検出する、
請求項1乃至3の何れか一項に記載の実行制御方法。
【請求項5】
コンピュータに、
1または2以上の文字それぞれに対してメモリ上に一の長さの文字コードを格納可能な第1の領域を割り当てる文字型変数を用いたプログラムによる、前記文字型変数についての文字の処理を検出し、
前記文字型変数についての文字の処理の検出に応じて、各文字について前記第1の領域と対応付けて前記メモリ上に第2の領域を確保し、
前記第1および第2の領域を用いて、前記一の長さより長い他の文字コードで表現される文字を処理する、
処理を実行させる実行制御プログラム。
【請求項6】
プログラムで用いられる文字型変数に応じて、1または2以上の文字それぞれに対して一の長さの文字コードを格納可能な第1の領域が割り当てられるメモリと、
前記プログラムによる前記文字型変数についての文字の処理を検出し、前記文字型変数についての文字の処理の検出に応じて、各文字について前記第1の領域と対応付けて前記メモリ上に第2の領域を確保し、前記第1および第2の領域を用いて、前記一の長さより長い他の文字コードで表現される文字を処理する演算部と、
を有する実行制御装置。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は実行制御方法、実行制御プログラムおよび実行制御装置に関する。
【背景技術】
【0002】
プログラムの中には、コンピュータに文字を処理させるものがある。例えば、事務作業を支援するプログラムの中には、データベースから文字データを読み込み、文字データが示す文字を文書フォーマット中の所定の位置に挿入して印刷するものがある。
【0003】
コンピュータ上で文字を扱うにあたり、各文字は何れかの文字コード体系に従って符号化される。文字コード体系としては、ASCII(American Standard Code for Information Interchange),UTF(UCS (Universal Coded Character Set) Transformation Format)−8,UTF−16,UTF−32,Shift_JIS(Japanese Industrial Standards)など、様々なものが提案されている。異なる文字コード体系の間では、同じ文字に対して異なる符号(文字コード)が割り当てられていることがある。
【0004】
文字コードの長さ(例えば、バイト数)は、文字コード体系によって異なることがあり、同じ文字コード体系の中でも文字によって異なることがある。例えば、UTF−8では、主要なラテン文字が1バイトで表現され、多くの漢字が3〜4バイトで表現される。UTF−32では、各文字が4バイトで表現される。Shift_JISでは、主要なラテン文字が1バイトで表現され、漢字が2バイトで表現される。近年は、長い(例えば、バイト数の大きい)文字コードを用いて世界中の多様な文字を表現できるようにした大規模文字コード体系が提案されており、文字コードの最大長が増大する傾向にある。
【0005】
なお、文字コードの変換に関して、UTF−8の文字コードを含むデータを読み込み、UTF−16の文字コードを扱うAPI(Application Programming Interface)を利用してデータを処理するプログラムを生成するコンパイラが提案されている。このコンパイラは、文字変数に格納された文字を読み出す命令を検出すると、当該命令の前に文字コードをUTF−8からUTF−16に変換して文字変数を更新する命令を挿入する。
【0006】
また、プログラムが使用するメモリ領域の割当に関して、ある配列の一部(部分配列)のデータを引数として受け取る関数を呼び出すプログラムを生成するコンパイラが提案されている。このコンパイラは、部分配列のデータがメモリ上の連続した領域に格納されるものか判定する。コンパイラは、部分配列のデータが連続した領域にある場合、オリジナルのデータを関数から直接参照させるプログラムを生成し、不連続な領域にある場合、部分配列のデータをメモリ上でコピーして関数に渡すプログラムを生成する。
【先行技術文献】
【特許文献】
【0007】
【特許文献1】特開2005−293386号公報
【特許文献2】特開平11−184710号公報
【発明の概要】
【発明が解決しようとする課題】
【0008】
ところで、ある文字コード体系で表現された文字を処理するようにプログラムを作成した後、そのプログラムを用いて、他の文字コード体系で表現された文字を処理したいことがある。例えば、ある国の業務に使用するプログラムを作成し、その後に言語の異なる他の国に業務を拡大したとき、そのプログラムを当該他の国でも使用したいことがある。
【0009】
このとき、他の文字コード体系における文字コードの最大長がプログラム作成時に想定していた文字コード体系よりも長くなると、そのままでは他の文字コード体系で表現された文字を正常に処理できないことがあるという問題がある。例えば、1文字当たり2バイトのメモリ領域が確保される文字型変数を含むプログラムを用いて、4バイトで表現された文字を処理しようとすると、メモリ領域から文字コードが溢れてしまう。
【0010】
一方、プログラム作成時に想定していたものより長い文字コードを扱えるようにプログラムを修正することは、修正の影響が広範囲に及び作業量が多くなるおそれがある。例えば、ある文字型変数のデータサイズを大きくすると、その変数を参照している様々な処理の記載も修正することになるおそれがある。また、データ構造が変更されると、そのデータ構造に依存する処理手順(アルゴリズム)も修正することになるおそれがある。
【0011】
1つの側面では、本発明は、異なる文字コード体系を使用する場合におけるプログラムの修正を抑制する実行制御方法、実行制御プログラムおよび実行制御装置を提供することを目的とする。
【課題を解決するための手段】
【0012】
1つの態様では、コンピュータが行う実行制御方法が提供される。実行制御方法では、1または2以上の文字それぞれに対してメモリ上に一の長さの文字コードを格納可能な第1の領域を割り当てる文字型変数を用いたプログラムによる、文字型変数についての文字の処理を検出する。文字型変数についての文字の処理の検出に応じて、各文字について第1の領域と対応付けてメモリ上に第2の領域を確保する。第1および第2の領域を用いて、一の長さより長い他の文字コードで表現される文字を処理する。
【0013】
また、1つの態様では、コンピュータに実行させる実行制御プログラムが提供される。
また、1つの態様では、メモリと演算部とを有する実行制御装置が提供される。メモリには、プログラムで用いられる文字型変数に応じて、1または2以上の文字それぞれに対して一の長さの文字コードを格納可能な第1の領域が割り当てられる。演算部は、プログラムによる文字型変数についての文字の処理を検出し、文字型変数についての文字の処理の検出に応じて、各文字について第1の領域と対応付けてメモリ上に第2の領域を確保し、第1および第2の領域を用いて、一の長さより長い他の文字コードで表現される文字を処理する。
【発明の効果】
【0014】
1つの側面では、異なる文字コード体系を使用する場合におけるプログラムの修正を抑制できる。
【図面の簡単な説明】
【0015】
図1】第1の実施の形態の実行制御装置を示す図である。
図2】第2の実施の形態の情報処理システムを示す図である。
図3】サーバ装置のハードウェア例を示すブロック図である。
図4】ユーザプログラムの例を示す図である。
図5】文字コード体系を変更した場合の問題点を示す図である。
図6】隠し領域を用いた文字コードの格納例を示す図である。
図7】サーバ装置のソフトウェア構成例を示す図である。
図8】サーバ装置の機能例を示すブロック図である。
図9】領域管理テーブルの例を示す図である。
図10】実行制御の手順例を示すフローチャートである。
図11】文字コード処理の手順例を示すフローチャートである。
図12】文字コード処理の手順例を示すフローチャート(続き)である。
図13】隠し領域を用いた文字コードの他の格納例を示す図である。
【発明を実施するための形態】
【0016】
以下、本実施の形態を図面を参照して説明する。
[第1の実施の形態]
図1は、第1の実施の形態の実行制御装置を示す図である。
【0017】
第1の実施の形態の実行制御装置10は、プログラム13の実行を制御する。実行制御装置10は、プログラム13を実行するコンピュータであってもよい。また、以下に説明する実行制御は、プログラム13から利用されるランタイムライブラリやプログラム13を解釈するインタープリタなど、ソフトウェアを用いて実現されてもよい。プログラム13は、高級言語を用いて記述されたソースプログラムでもよいし、機械語を用いて記述された機械可読なオブジェクトプログラムであってもよい。
【0018】
実行制御装置10は、メモリ11および演算部12を有する。メモリ11は、例えば、RAM(Random Access Memory)などの揮発性の半導体メモリである。演算部12は、例えば、プロセッサである。プロセッサは、CPU(Central Processing Unit)やDSP(Digital Signal Processor)であってもよく、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)などの特定用途の集積回路を含んでもよい。プロセッサは、RAMなどの記憶装置(例えば、メモリ11)に記憶されたプログラムを実行するものであってもよい。また、2以上のプロセッサの集合(マルチプロセッサ)を「プロセッサ」と呼んでもよい。
【0019】
メモリ11には、プログラム13が実行されるとき、文字型変数に対応する領域が確保される。プログラム13は、1または2以上の文字それぞれに対してある長さ(例えば、1バイトまたは2バイト)の文字コードを格納可能な領域を割り当てる文字型変数を用いて記述されている。例えば、プログラム13には、それぞれ1バイトの文字コードで表現された文字1つを代入可能な文字型変数c1,c2が定義されている。この場合、メモリ11には、プログラム13の記述に従って、文字型変数c1に対応する1バイトの領域16が確保され、文字型変数c2に対応する1バイトの領域17が確保される。
【0020】
また、メモリ11には、1または2以上の文字それぞれについて、プログラム13で定義されている文字コードの長さ分の領域に加えて、その領域と対応付けられた他の領域が確保される。例えば、メモリ11には、文字型変数c1に関して領域16と対応付けて領域18が確保され、文字型変数c2に関して領域17と対応付けて領域19が確保される。領域18,19の大きさは、例えば、領域16,17と同じまたは領域16,17の整数倍などとする。領域18,19は、プログラム13の要求に応じて確保される領域ではないためプログラム13から認識されず、「隠し領域」と呼ぶこともできる。
【0021】
演算部12は、プログラム13に従って文字型変数についての文字の処理が行われることを検出する。文字型変数についての文字の処理としては、文字型変数を用いて定義された処理であって、例えば、文字型変数への文字の格納、文字型変数からの文字の読み出し、文字型変数の間の文字のコピーや移動、2つの文字型変数の間の文字の比較などが挙げられる。文字型変数についての処理を検出すると、演算部12は、文字型変数に応じて確保される領域(例えば、領域16,17)と対応付けられた他の領域(例えば、領域18,19)がメモリ11にまだ確保されていない場合、当該他の領域をメモリ11上に確保する。そして、演算部12は、1または2以上の文字それぞれを、メモリ11に確保された領域を用いて処理する。このとき、演算部12は、プログラム13の要求に応じて確保される領域とその領域に対応付けられた他の領域の両方を利用することで、プログラム13が想定する長さより長い(例えば、3バイトまたは4バイトの)他の文字コードで表現される文字を処理できるようにする。
【0022】
例えば、プログラム13を実行することで、UTF−8で記述された文字列が実行制御装置10に読み込まれるとする。UTF−8は、文字によって文字コードの長さが異なる文字コード体系であり、1〜4バイト(または、1〜6バイト)の文字コードを含む。このとき、文字型変数c1に対応して文字「A」を示す1バイトの文字コード14(16進数で「41」)が読み込まれ、文字型変数c2に対応して文字「α」を示す2バイトの文字コード15(16進数で「CEB0」)が読み込まれたとする。
【0023】
すると、例えば、演算部12は、文字「A」について領域16にビット列「41」を格納する。文字コード14の長さは1バイトであり文字型変数c1に応じて確保される領域16のサイズと一致するため、演算部12は領域18を使用しなくてもよい。一方、演算部12は、文字「α」について、領域17にビット列「CE」を格納し領域19にビット列「B0」を格納する。文字コード15の長さは2バイトであり文字型変数c2に応じて確保される領域17のサイズより大きいため、演算部12は領域19を使用する。
【0024】
このように、読み込む文字それぞれが1バイトで表現されていることを想定してプログラム13が記述されている場合であっても、メモリ11に確保される領域18,19を利用することで、2バイト以上で表現された文字を適切に処理することが可能となる。このとき、プログラム13は領域18,19の存在を認識しなくてよく、2バイト以上で表現された文字を処理できるようにプログラム13を修正しなくてもよい。
【0025】
ここで、プログラム13がコンパイル済のオブジェクトコードであり、演算部12の処理がランタイムライブラリを用いて実装される場合の実行制御の一例を説明する。
プログラム13をコンパイルするとき、コンパイラは、所定の文字型(例えば、C言語のchar型や、COBOL言語のX型など)の変数を検出する。1文字を表現するのに用いる想定するバイト数は、文字型によって予め決まっている。すると、コンパイラは、通常のコンパイルと同様に、この想定するバイト数に相当する第1の領域をメモリ11に確保するための命令を、オブジェクトコードに含める。第1の領域は、プログラム13の起動時に静的に確保されることもあるし、プログラム13自身が処理の途中でヒープ領域から動的に確保することもある。また、第1の領域は、ランタイムライブラリを介して動的に確保することもある。その場合、コンパイラは、第1の領域の確保をランタイムライブラリに要求する命令を、プログラム13に含めることになる。
【0026】
また、コンパイラは、プログラム13の中から、文字型変数についての処理の記述として、文字型変数への文字の代入または文字型変数に代入された文字の参照の記述を検出する。通常のコンパイルの場合、コンパイラは、第1の領域にアクセスする命令(第1の領域に文字コードを書き込む命令または第1の領域から文字コードを読み出す命令)を、オブジェクトコードに含めることになる。一方、第1の実施の形態の実行制御を実現する場合、コンパイラは、第1の領域にアクセスする命令の代わりに、ランタイムライブラリを呼び出す命令をオブジェクトコードに含める。
【0027】
プログラム13がランタイムライブラリを呼び出すとき、例えば、プログラム13は、アクセスしようとする第1の領域のアドレス(例えば、開始アドレスと終了アドレス)をランタイムライブラリに通知する。また、プログラム13は、アクセスしようとする第1の領域に対応する変数の文字型、または、当該第1の領域における1文字当たりのバイト数を、ランタイムライブラリに通知する。ただし、オブジェクトコードに1文字当たりのバイト数の情報を含めておき、ランタイムライブラリがこれを参照してもよい。
【0028】
このようにしてコンパイルされたプログラム13を実行すると、メモリ11に第1の領域が確保される段階では、ランタイムライブラリは呼び出されない可能性があり、第1の領域に対応する第2の領域はまだ確保されない。一方、プログラム13が第1の領域にアクセスしようとするとき、ランタイムライブラリが呼び出される。ランタイムライブラリは、プログラム13から通知された第1の領域に対応する第2の領域がまだメモリ11に確保されていない場合、第2の領域を確保する。第2の領域は、プログラム13から明示的に要求された領域ではなく、プログラム13から認識されないものである。
【0029】
そして、ランタイムライブラリは、プログラム13からの呼び出しに対応する処理として、第1の領域と第2の領域を用いて、文字型に応じて決まるバイト数より長い文字コードで表現された文字を処理する。例えば、ランタイムライブラリは、文字毎に、文字コードの一部のビット列を第1の領域に書き込み、文字コードの他の部分のビット列を第2の領域に書き込む。また、例えば、ランタイムライブラリは、文字毎に、第1の領域に格納されたビット列と第2の領域に格納されたビット列を結合して、文字コードを再現する。
【0030】
第1の実施の形態の実行制御装置10によれば、1または2以上の文字それぞれについて、文字型変数に応じてメモリ11に確保される第1の領域と対応付けて、第2の領域がメモリ11に確保される。そして、文字型変数についての文字の処理が行われるとき、第1の領域と第2の領域とを用いて、長い文字コードで表現される文字が処理される。これにより、ある文字コード体系で表現された文字を処理するようにプログラム13を作成した後、プログラム13を用いて、長い文字コードを含む他の文字コード体系で表現された文字を処理することが可能となる。このとき、プログラム13を他の文字コード体系に適応させるための修正を抑制することができる。
【0031】
プログラムを修正することで長い文字コードを処理できるようにする場合には、以下のような問題が生じる。1つの方法として、変数の型をサイズの大きいものに変更することが考えられる。例えば、C言語では1バイト文字を示すchar型から2バイト文字を示すwchar型に変更することが考えられ、COBOL言語では1バイト文字を示すX型から2バイト文字を示すN型に変更することが考えられる。
【0032】
しかし、ある変数の型を変更すると、その変数を参照するプログラム中の記載も修正することになるおそれがあり、修正量が大きくなる可能性がある。また、修正する変数が、複数のデータ項目を含むデータ構造(例えば、C言語の構造体やCOBOL言語の集団項目など)に属する場合、レイアウトが変わってしまいその影響が広範囲に及ぶ可能性がある。例えば、サイズを大きくした変数が構造体に属しておりその変数の後ろに他の変数が定義されているとする。この場合、構造体の先頭から他の変数までのオフセットが変わることで、他の変数を参照するプログラム中の記載も修正することになるおそれがある。
【0033】
また、1つの方法として、変数の型によって決まる単位データ量(文字ユニット)に1文字分の文字コードが収まるという前提(1文字1ユニットの原則)を崩し、複数ユニットで1文字を表現することを許容することが考えられる。例えば、文字ユニットが1バイトであるchar型を用いてユニット数6の配列変数を定義し、その配列変数に2バイト文字を3個格納することが考えられる。しかし、1文字1ユニットの原則を崩すと、文字の区切りを判定する処理をプログラム中で明示的に記述することになり、その配列変数を参照するアルゴリズムを変更することになるおそれがある。
【0034】
このように、プログラムを修正して長い文字コードを処理できるようにする場合、その影響が広範囲に及び、修正作業の負担が大きくなるおそれがあるという問題がある。これに対し、実行制御装置10を用いることでプログラムの修正を抑制し、そのプログラムを利用して他の文字コード体系の文字を処理することが容易となる。
【0035】
[第2の実施の形態]
図2は、第2の実施の形態の情報処理システムを示す図である。
第2の実施の形態の情報処理システムは、端末装置21、ストレージ装置22およびサーバ装置100を有する。端末装置21とサーバ装置100、および、サーバ装置100とストレージ装置22は、ネットワーク20を介して通信可能である。
【0036】
端末装置21は、業務においてユーザが操作するクライアントコンピュータである。端末装置21は、ユーザが入力した文字などを示す文字データをサーバ装置100に送信することがある。また、端末装置21は、サーバ装置100から文字データを受信し、受信した文字データが示す文字を端末装置21のディスプレイに表示することがある。
【0037】
ストレージ装置22は、HDD(Hard Disk Drive)など、データを格納する不揮発性の記憶装置を有する。ストレージ装置22は、データをファイルとして管理するコンピュータ(ファイルサーバ)またはデータをデータベースとして管理するコンピュータ(データベースサーバ)であってもよい。ストレージ装置22は、サーバ装置100から文字データを受信し、受信した文字データを不揮発性の記憶装置に書き込むことがある。
【0038】
サーバ装置100は、業務用のアプリケーションプログラムを実行するサーバコンピュータである。サーバ装置100で実行されるプログラムの中には、文字列を処理するものがある。サーバ装置100は、端末装置21から文字データを受信することがある。また、サーバ装置100は、サーバ装置100が備える不揮発性の記憶装置またはストレージ装置22から文字データを読み込むことがある。また、サーバ装置100は、端末装置21に文字データを送信することがある。また、サーバ装置100は、サーバ装置100に接続されたプリンタなどの出力装置に文字データを出力することがある。
【0039】
サーバ装置100では、異なるプログラミング言語で記述された複数の種類のプログラムが実行され得る。例えば、COBOL言語で作成されたプログラムとC言語で作成されたプログラムとがサーバ装置100で実行される。種類の異なるプログラムの間では、一方のプログラムが、他方のプログラムが公開するインタフェース定義(例えば、関数やデータ構造の定義)に基づいて他方のプログラムを呼び出すことがある。
【0040】
図3は、サーバ装置のハードウェア例を示すブロック図である。
サーバ装置100は、CPU101、RAM102、HDD103、画像信号処理部104、入力信号処理部105、媒体リーダ106および通信インタフェース107を有する。これらのユニットはバスに接続されている。CPU101は第1の実施の形態の演算部12の一例であり、RAM102は第1の実施の形態のメモリ11の一例である。
【0041】
CPU101は、プログラムの命令を実行する演算回路を含むプロセッサである。CPU101は、HDD103に記憶されているプログラムやデータの少なくとも一部をRAM102にロードし、プログラムを実行する。なお、CPU101は複数のプロセッサコアを備えてもよく、サーバ装置100は複数のプロセッサを備えてもよく、以下で説明する処理を複数のプロセッサまたはプロセッサコアを用いて並列に実行してもよい。また、複数のプロセッサの集合(マルチプロセッサ)を「プロセッサ」と呼んでもよい。
【0042】
RAM102は、CPU101が実行するプログラムやCPU101が演算に用いるデータを一時的に記憶する揮発性の半導体メモリである。なお、サーバ装置100は、RAM以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
【0043】
HDD103は、OS(Operating System)やミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。なお、サーバ装置100は、フラッシュメモリやSSD(Solid State Drive)などの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
【0044】
画像信号処理部104は、CPU101からの命令に従って、サーバ装置100に接続されたディスプレイ111に画像を出力する。ディスプレイ111としては、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ(LCD:Liquid Crystal Display)、プラズマディスプレイ(PDP:Plasma Display Panel)、有機EL(OEL:Organic Electro-Luminescence)ディスプレイなどを用いることができる。
【0045】
入力信号処理部105は、サーバ装置100に接続された入力デバイス112から入力信号を取得し、CPU101に出力する。入力デバイス112としては、マウスやタッチパネルやタッチパッドやトラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、サーバ装置100に、複数の種類の入力デバイスが接続されていてもよい。
【0046】
媒体リーダ106は、記録媒体113に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体113として、例えば、フレキシブルディスク(FD:Flexible Disk)やHDDなどの磁気ディスク、CD(Compact Disc)やDVD(Digital Versatile Disc)などの光ディスク、光磁気ディスク(MO:Magneto-Optical disk)、半導体メモリなどを使用できる。媒体リーダ106は、例えば、記録媒体113から読み取ったプログラムやデータをRAM102またはHDD103に格納する。
【0047】
通信インタフェース107は、ネットワーク20に接続され、ネットワーク20を介して端末装置21やストレージ装置22と通信を行うインタフェースである。通信インタフェース107は、ケーブルで通信装置と接続される有線通信インタフェースでもよいし、基地局と無線リンクで接続される無線通信インタフェースでもよい。
【0048】
なお、サーバ装置100は、媒体リーダ106を備えていなくてもよく、ユーザが操作する端末装置から制御可能である場合には画像信号処理部104や入力信号処理部105を備えていなくてもよい。また、ディスプレイ111や入力デバイス112が、サーバ装置100の筐体と一体に形成されていてもよい。端末装置21およびストレージ装置22も、サーバ装置100と同様のハードウェアを用いて実現することができる。
【0049】
図4は、ユーザプログラムの例を示す図である。
ここでは、ユーザが作成しサーバ装置100に配置するユーザプログラムの例として、COBOLプログラム31およびCプログラム32を考える。
【0050】
COBOLプログラム31には、1ユニットが1バイトである文字型(X型)を用いた長さ3の配列変数BUFと、X型の変数SECOND−CHARとが定義されている。そして、COBOLプログラム31では、配列変数BUFに3文字の文字コードが読み込まれ、2文字目の文字コードが変数SECOND−CHARにコピーされる。このCOBOLプログラム31は、1文字1バイトの文字コード体系を想定している。
【0051】
Cプログラム32も、COBOLプログラム31と同様の処理を実現している。Cプログラム32には、1ユニットが1バイトである文字型(char型)を用いた長さ3の配列変数bufと、char型の変数secondCharとが定義されている。そして、Cプログラム31では、配列変数bufに3文字の文字コードが読み込まれ、2文字目の文字コードが変数secondCharにコピーされる。このCプログラム32は、COBOLプログラム31と同様、1文字1バイトの文字コード体系を想定している。
【0052】
ただし、COBOLプログラム31やCプログラム32を修正せずにそのまま用いて、文字コードの最大長が大きい他の文字コード体系の文字データを処理したいことがある。そこで、第2の実施の形態では、ユーザプログラムの実行時にサーバ装置100がバイト数の大きい文字コードを扱えるように文字処理を制御することを考える。以下では、ユーザプログラムとして主にCOBOLプログラム31を想定する。
【0053】
図5は、文字コード体系を変更した場合の問題点を示す図である。
ここでは、文字列「5コ 」(3文字目はスペース)の文字コードを読み込むことを考える。文字コード体系としてShift_JISを用いた場合、この3文字はそれぞれ1バイトで表現することができ、この文字列は16進数で「35BA20」と表現される。よって、COBOLプログラム31の配列変数BUFに文字コードを収容できる。
【0054】
これに対して、文字コード体系としてUTF−32を用いた場合、各文字は4バイトで表現され、この文字列は16進数で「000000350000FF7A00000020」と表現される。よって、配列変数BUFから文字コードが溢れてしまう。また、文字コード体系としてUTF−8を用いた場合、各文字は1〜4バイト(または、1〜6バイト)の何れかで表現され、この文字列は16進数で「35EFBDBA20」と表現される。よって、配列変数BUFから文字コードが溢れてしまう。
【0055】
このように、配列変数BUFや変数SECOND−CHARの文字ユニットより大きい文字コードが読み込まれると、オーバフローが発生すると共に、1文字1ユニットの原則が崩れてしまう。よって、COBOLプログラム31を正常に実行できなくなるおそれがある。そこで、サーバ装置100は、以下に説明するように、文字型変数によって定義されるユーザ定義領域と対応付けて、隠し領域をRAM102上に用意する。
【0056】
図6は、隠し領域を用いた文字コードの格納例を示す図である。
ここでは、1文字につき1〜4バイトであるUTF−8の文字コードを読み込むことを考える。COBOLプログラム31を実行する場合、RAM102には、配列変数BUFに対応する1バイト×3文字のユーザ定義領域と変数SECOND−CHARに対応する1バイト×1文字のユーザ定義領域とが確保される。
【0057】
サーバ装置100は、RAM102に更に、配列変数BUFのユーザ定義領域と対応付けて、3バイト×3文字の隠し領域を確保する。また、サーバ装置100は、変数SECOND−CHARのユーザ定義領域と対応付けて、3バイト×1文字の隠し領域を確保する。ユーザ定義領域と隠し領域とを合わせると、1文字につき4バイトの領域がRAM102に確保されていることになる。よって、4バイト以下のUTF−8の文字コードを、配列変数BUFや変数SECOND−CHARに保持させることが可能となる。
【0058】
隠し領域は、ユーザプログラムであるCOBOLプログラム31から直接認識されないメモリ領域である。COBOLプログラム31からは、1文字1ユニットの原則に従い、各文字の文字コードが1ユニットに収まっているように見える。COBOLプログラム31がユーザ定義領域に対して文字コードの書き込み・コピー・比較などの文字操作を行おうとするとき、サーバ装置100は、ユーザ定義領域に格納されたビット列と同様の操作を隠し領域に格納されたビット列に対しても行うようにする。
【0059】
例えば、文字列「5コ 」を示すUTF−8の文字コードを配列変数BUFに格納するとする。「5」は1バイトの文字コード「35」で表されるため、ユーザ定義領域の1文字目にその文字コードを格納すればよく、隠し領域の3バイトは空となる。使用されていない隠し領域には、例えば、null文字などの未使用を示す所定のビット列が格納される。「コ」は3バイトの文字コード「EFBDBA」で表されるため、ユーザ定義領域の2文字目に先頭1バイト「EF」を格納し、隠し領域の2文字目に残りの2バイト「BDBA」を格納すればよい。「 」(スペース)は1バイトの文字コード「20」で表されるため、ユーザ定義領域の3文字目にその文字コードを格納すればよい。
【0060】
その後、例えば、COBOLプログラム31に従い、文字列「5コ 」の2文字目の文字コードを配列変数BUFから変数SECOND−CHARにコピーするものとする。この場合、サーバ装置100は、配列変数BUFのユーザ定義領域にあるビット列「EF」を、変数SECOND−CHARのユーザ定義領域にコピーする。また、サーバ装置100は、配列変数BUFの隠し領域にあるビット列「BDBA」を、変数SECOND−CHARの隠し領域にコピーする。配列変数BUFに格納された文字コードを他の文字コードと比較する場合には、サーバ装置100は、ユーザ定義領域にあるビット列同士を比較すると共に、隠し領域にあるビット列同士を比較することで、文字コードの同一性を判定する。このように、サーバ装置100がユーザ定義領域にあるビット列と隠し領域にあるビット列とを組み合わせて読み書きすることで、長い文字コードを扱うことができる。
【0061】
図7は、サーバ装置のソフトウェア構成例を示す図である。
前述のCOBOLプログラム31などのユーザプログラムは、サーバ装置100において、コンパイラ方式またはインタープリタ方式で実行される。
【0062】
コンパイラ方式の場合、サーバ装置100はソフトウェアとして、OS121、コンパイラ122、ユーザプログラム123およびライブラリ124を有する。OS121は、ミドルウェアやアプリケーションソフトウェアの実行を制御する。コンパイラ122は、高級言語で記述されたソースコードを機械可読なオブジェクトコードに変換する。ユーザプログラム123は、コンパイラ122によって生成されたオブジェクトコードである。ライブラリ124は、ユーザプログラム123の実行時にユーザプログラム123から適宜呼び出されるランタイムライブラリである。ただし、ユーザプログラム123は、端末装置21などの他のコンピュータで生成されてサーバ装置100に配置されてもよい。その場合、サーバ装置100はコンパイラ122を有しなくてもよい。
【0063】
前述の隠し領域を利用した文字コードの処理は、ライブラリ124に実装され得る。例えば、コンパイラ122は、ソースコードをコンパイルするとき、文字コード体系または文字コードの最大長を示す情報をコンパイルオプションとしてユーザから受け取る。すると、コンパイラ122は、文字コードの最大長を示す情報をユーザプログラム123に埋め込む。また、コンパイラ122は、前述の配列変数BUFや変数SECOND−CHARなどの文字型変数を検出する。文字型変数の定義に対しては、コンパイラ122は、ライブラリ124を呼び出さずに自身でその文字型変数に対応するユーザ定義領域をRAM102に確保するようなユーザプログラム123を生成してもよい。
【0064】
一方、コンパイラ122は、文字コードの書き込み・読み出し・比較などの文字型変数の操作を検出する。すると、コンパイラ122は、自身がユーザ定義領域にアクセスする代わりにライブラリ124の関数を呼び出すようなユーザプログラム123を生成する。呼び出しにあたり、ユーザプログラム123からライブラリ124には、アクセスすべきユーザ定義領域のアドレス(例えば、開始アドレスと終了アドレス)が通知される。また、ユーザプログラム123からライブラリ124には、ソースコードで指定された文字型または文字型に応じて決まる1文字ユニットの大きさが通知されてもよい。文字型変数に対する操作の手順は、ライブラリ124に含まれる関数の中で定義される。
【0065】
インタープリタ方式の場合、サーバ装置100はソフトウェアとして、OS121、インタープリタ125およびユーザプログラム126を有する。インタープリタ125は、高級言語で記述されたソースコードを逐次解釈しながら実行するミドルウェアである。ユーザプログラム126は、インタープリタ125上で実行されるソースコードである。
【0066】
前述の隠し領域を利用した文字コードの処理は、インタープリタ125に実装され得る。例えば、インタープリタ125は、ユーザプログラム126を起動するとき、文字コード体系または文字コードの最大長を示す情報を実行時オプションとしてユーザから受け取る。インタープリタ125は、ユーザプログラム126に記述された文字型変数を検出する。インタープリタ125は、文字型変数の定義に従ってRAM102にユーザ定義領域を確保するとき、併せてRAM102に隠し領域を確保する。または、インタープリタ125は、ユーザプログラム126に従って文字型変数の操作が行われるときに、RAM102に隠し領域を確保する。そして、インタープリタ125は、隠し領域を利用して文字コードを処理するようにする。インタープリタ125には、文字コードの書き込み・読み出し・比較などの文字型変数の操作についての手順が予め定義されている。
【0067】
次に、サーバ装置100の機能およびサーバ装置100が行う処理について説明する。以下では、コンパイラ方式でユーザプログラムが実行される場合を考える。
図8は、サーバ装置の機能例を示すブロック図である。
【0068】
前述のように、サーバ装置100は、コンパイラ122およびライブラリ124を有する。また、サーバ装置100は、プログラム記憶部131、起動監視部132、領域情報記憶部133、文字コード処理部134および領域解放部135を有する。プログラム記憶部131および領域情報記憶部133は、例えば、RAM102またはHDD103に確保した記憶領域として実現される。起動監視部132、文字コード処理部134および領域解放部135は、ライブラリ124に含まれるモジュールとして実現される。
【0069】
コンパイラ122は、ソースコードをコンパイルするとき、サーバ装置100に読み込みたい文字データで使用される文字コード体系または文字コードの最大長を示す情報を、コンパイルオプションとしてユーザから受け取る。その文字コード体系はソースコードが想定しているものと異なる可能性があり、文字コードの最大長はソースコードが想定しているものより長い可能性がある。すると、コンパイラ122は、文字コードの最大長を示す情報をオブジェクトプログラムに埋め込む。また、コンパイラ122は、文字コードの書き込み・読み出し・比較などの文字型変数を操作するソースコードの記述に対して、ライブラリ124を呼び出すオブジェクトコードを生成する。コンパイラ122は、生成したオブジェクトコードをプログラム記憶部131に格納する。
【0070】
起動監視部132は、プログラム記憶部131に格納されたオブジェクトコードとしてのユーザプログラムが起動すると、後述する領域管理テーブルを領域情報記憶部133上に生成する。領域管理テーブルは、ユーザプログラムに従ってRAM102に確保されるユーザ定義領域と隠し領域との対応関係が登録されるテーブルである。また、起動監視部132は、ユーザプログラムが終了するとき、領域管理テーブルを削除する。
【0071】
文字コード処理部134は、ユーザプログラムからの呼び出しに応じて、ユーザ定義領域および隠し領域を用いて文字コードを処理する。ある文字型変数のユーザ定義領域に対して最初に文字コードを書き込もうとするとき、文字コード処理部134は、そのユーザ定義領域に対応する隠し領域をRAM102に確保する。隠し領域の大きさは、文字コードが収容できるように、ユーザプログラムに埋め込まれた文字コードの最大長の情報に基づいて判定される。そして、文字コード処理部134は、ユーザ定義領域と隠し領域との対応関係を、領域情報記憶部133に記憶された領域管理テーブルに登録する。
【0072】
隠し領域が確保されると、文字コード処理部134は、書き込もうとする文字コードの先頭部分のビット列をユーザ定義領域に書き込み、ユーザ定義領域から溢れた残りのビット列を隠し領域に格納する。ある文字型変数のユーザ定義領域を参照または更新しようとするときは、文字コード処理部134は、領域情報記憶部133に記憶された領域管理テーブルからそのユーザ定義領域に対応する隠し領域を検索する。そして、文字コード処理部134は、ユーザ定義領域とそれに対応する隠し領域の両方に対して、文字毎にビット列の読み出し・書き込み・比較などの処理を実行する。
【0073】
領域解放部135は、ある文字型変数をユーザプログラムが使用しなくなりその文字型変数のユーザ定義領域を解放しようとするとき、ユーザプログラムから呼び出される。すると、領域解放部135は、領域情報記憶部133に記憶された領域管理テーブルからそのユーザ定義領域に対応する隠し領域を検索する。そして、領域解放部135は、ユーザ定義領域と隠し領域を解放し、領域管理テーブルからその隠し領域の情報を削除する。
【0074】
図9は、領域管理テーブルの例を示す図である。
領域管理テーブル136は、領域情報記憶部133に格納される。領域管理テーブル136は、ユーザ定義領域の開始アドレス、ユーザ定義領域の終了アドレス、ユニット種類、割当フラグ、隠し領域の開始アドレスおよび隠し領域のユニット数の項目を含む。
【0075】
ユーザ定義領域の開始アドレスは、ユーザ定義領域の先頭を示すRAM102のアドレスである。ユーザ定義領域の終了アドレスは、ユーザ定義領域の末尾を示すRAM102のアドレスである。1つのユーザ定義領域は、配列変数BUFや変数SECOND−CHARなどの1つの文字型変数に対応してRAM102に確保されるものであり、n文字×1ユニット(nは1以上の整数)の大きさをもつ。ユニット種類は、ユーザプログラムに記述された変数の型に応じて決まる1ユニットのバイト数kを示す。例えば、COBOL言語のX型は1バイトでありN型は2バイトである。これらのユーザ定義領域を示す情報は、例えば、ユーザ定義領域にアクセスしようとするユーザプログラム123が文字コード処理部134を呼び出すときに、文字コード処理部134に対して通知される。
【0076】
割当フラグは、開始アドレスおよび終了アドレスによって特定されるユーザ定義領域に対して、隠し領域を割り当てたか否かを示すフラグである。隠し領域の開始アドレスは、隠し領域の先頭を示すRAM102のアドレスである。1つの隠し領域は、1つのユーザ定義領域に対応して確保されるものであり、n文字×mユニット(mは1以上の整数)の大きさをもつ。1つの隠し領域は、1つの文字型変数に対応していると言うこともできる。隠し領域のユニット数は、1文字に対してmユニットが確保されることを示す。よって、ユーザ定義領域と隠し領域を合わせて、1文字につき(m+1)×kバイトの文字コードを格納することができる。隠し領域のユニット数mは、ユーザプログラムに挿入されている文字コードの最大長を示す情報に基づいて決定できる。例えば、(m+1)×kが文字コードの最大長以上になるような最小のmを決定する。ユーザ定義領域の1ユニットが1バイトであり、サーバ装置100に読み込まれる文字コードの最大長が4バイトである場合、隠し領域のユニット数を少なくとも3ユニットとする。
【0077】
図10は、実行制御の手順例を示すフローチャートである。
(S10)起動監視部132は、ユーザプログラムの起動を検出すると、空の領域管理テーブル136を生成して領域情報記憶部133に格納する。
【0078】
(S11)文字コード処理部134は、ユーザプログラムによる文字型変数の操作を検出したか判断する。文字型変数の操作としては、文字型変数に対応するユーザ定義領域を指定した文字コードの書き込み、ユーザ定義領域を指定した文字コードの読み出し、文字コードの比較などが挙げられる。文字型変数の操作の種類に応じて、ユーザプログラムから文字コード処理部134が呼び出される。文字型変数の操作を検出した場合はステップS12に処理が進み、それ以外の場合はステップS13に処理が進む。
【0079】
(S12)文字コード処理部134は、ユーザ定義領域と隠し領域とを利用した文字コードの処理を行う。文字コード処理の詳細は後述する。
(S13)領域解放部135は、ユーザプログラムによるユーザ定義領域の解放を検出したか判断する。ユーザ定義領域を解放するとき、ユーザプログラムから領域解放部135が呼び出される。ユーザ定義領域の解放を検出した場合はステップS14に処理が進み、それ以外の場合はステップS15に処理が進む。
【0080】
(S14)領域解放部135は、領域情報記憶部133に記憶された領域管理テーブル136を参照して、ユーザプログラムから指定されたユーザ定義領域に対応する隠し領域を検索する。そして、領域解放部135は、ユーザプログラムから指定されたユーザ定義領域と検索された隠し領域とを解放する。また、領域解放部135は、そのユーザ定義領域と隠し領域の情報を領域管理テーブル136から削除する。
【0081】
(S15)起動監視部132は、ユーザプログラムが終了するか判断する。終了する場合はステップS16に処理が進み、それ以外の場合はステップS11に処理が進む。
(S16)起動監視部132は、ユーザプログラムの終了を検出すると、領域情報記憶部133に記憶された領域管理テーブル136を削除する。
【0082】
図11は、文字コード処理の手順例を示すフローチャートである。
この文字コード処理は、前述のステップS12において実行される。
(S20)文字コード処理部134は、文字コードの書き込みがユーザプログラムによって要求された場合、書き込み先のアドレスを特定する。なお、文字コードの書き込みが要求されていない場合は、ステップS20〜S27を実行しなくてよい。
【0083】
(S21)文字コード処理部134は、書き込み先がライブラリ124によって管理される自言語処理系のRAM102の領域であるか判断する。例えば、ユーザプログラムがCOBOLプログラム31である場合、文字コード処理部134は、COBOL言語処理系が使用するRAM102の領域であるか判断する。自言語処理系のRAM102の領域以外の書き込み先としては、他言語処理系(例えば、C言語処理系)が使用するRAM102の領域や、HDD103・ディスプレイ111・端末装置21・ストレージ装置22などの外部デバイスが挙げられる。書き込み先が自言語処理系のRAM102の領域である場合はステップS22に処理が進み、それ以外の場合はステップS28に処理が進む。
【0084】
(S22)文字コード処理部134は、領域情報記憶部133に記憶された領域管理テーブル136に書き込み先を包含するユーザ定義領域が登録されているか判断する。書き込み先を包含するユーザ定義領域は、書き込み先全体が開始アドレスと終了アドレスの間に収まっているものである。書き込み先を包含するユーザ定義領域が登録されている場合は、そのユーザ定義領域に対応する隠し領域が既に存在すると判断され、ステップS28に処理が進む。それ以外の場合は、ステップS23に処理が進む。
【0085】
(S23)文字コード処理部134は、書き込み先全体を包含していないものの、書き込み先と一部重複するユーザ定義領域が領域管理テーブル136に登録されているか判断する。登録されたユーザ定義領域と一部重複する領域に文字コードが書き込まれる場合としては、既存のユーザ定義領域を含む新たなユーザ定義領域をユーザプログラムが再定義した場合などが挙げられる。書き込み先と一部重複するユーザ定義領域が登録されている場合はステップS24に処理が進み、それ以外の場合はステップS27に処理が進む。
【0086】
(S24)文字コード処理部134は、書き込み先の領域と領域管理テーブル136に登録された旧ユーザ定義領域とを包含する拡大したユーザ定義領域を特定する。文字コード処理部134は、拡大したユーザ定義領域に対応する拡大した隠し領域をRAM102に確保する。そして、文字コード処理部134は、旧ユーザ定義領域に対応する旧隠し領域を検索し、旧隠し領域に格納されたビット列を拡大した隠し領域に移行する。
【0087】
(S25)文字コード処理部134は、旧ユーザ定義領域および旧隠し領域の情報を領域管理テーブル136から削除する。また、文字コード処理部134は、拡大したユーザ定義領域および拡大した隠し領域の情報を領域管理テーブル136に登録する。
【0088】
(S26)文字コード処理部134は、RAM102に確保された旧隠し領域を解放する。これにより、ユーザプログラムによるユーザ定義領域の変更に合わせて、隠し領域が変更される。そして、ステップS28に処理が進む。
【0089】
(S27)文字コード処理部134は、書き込み先に対応する隠し領域をRAM102に確保する。このとき、隠し領域を用いて表現される文字列の文字数nおよび1ユニットのバイト数kは、ユーザプログラムから呼び出し時に通知される情報またはユーザプログラムの中に含まれている記述などから特定することができる。隠し領域の1文字当たりのユニット数mは、文字コードの最大長に基づいて決定できる。文字コード処理部134は、書き込み先であるユーザ定義領域と確保した隠し領域の情報を領域管理テーブル136に登録する。そして、ステップS28に処理が進む。
【0090】
図12は、文字コード処理の手順例を示すフローチャート(続き)である。
(S28)文字コード処理部134は、文字コードの読み込みがユーザプログラムによって要求された場合、読み込み元が外部デバイスであるか判断する。外部デバイスとしては、HDD103・ディスプレイ111・端末装置21・ストレージ装置22など、CPU101とRAM102以外のデバイスが挙げられる。読み込み元が外部デバイスである場合はステップS29に処理が進み、それ以外の場合はステップS30に処理が進む。
【0091】
(S29)文字コード処理部134は、外部デバイスから文字コード列を読み込み、文字単位で文字コードを分離する。更に、文字コード処理部134は、各文字の文字コードをユニット毎に区切る。例えば、1ユニット1バイトの文字型変数に、1文字1〜4バイトの可変長の文字コードを読み込む場合を考える。この場合、文字コード処理部134は、文字コード列を1〜4バイトの文字コードに分離し、各文字コードを1バイト毎に分離する。そして、ステップS34に処理が進む。
【0092】
(S30)文字コード処理部134は、文字コードの読み込み元が他言語処理系の使用するRAM102の領域であるか判断する。ユーザプログラムから指定された読み込み元が他言語処理系の領域であるか否かは、その領域がライブラリ124の管理する自言語処理系の領域に属しているか否かによって判断できる。読み込み元が他言語処理系の領域である場合はステップS31に処理が進み、それ以外の場合はステップS32に処理が進む。
【0093】
(S31)他言語処理系ではユーザ定義領域に対応する隠し領域が確保されない。このため、文字コード処理部134は、空の隠し領域が存在するものとみなして、ユーザ定義領域に格納されたビット列を参照する。そして、ステップS34に処理が進む。
【0094】
(S32)文字コード処理部134は、文字コードの読み込み元が自言語処理系のユーザ定義領域であることから、領域管理テーブル136を参照して、読み込み元のユーザ定義領域に対応する隠し領域を検索してその隠し領域のアドレスを特定する。
【0095】
(S33)文字コード処理部134は、ユーザ定義領域に格納されたビット列と、ステップS32で検索された隠し領域に格納されたビット列とを参照する。ユーザプログラムから指定される読み込み元が1つのユーザ定義領域の中の一部分のみである場合、文字コード処理部134は、ユーザ定義領域の一部分に対応する隠し領域の一部分を特定し、隠し領域の一部分のみ参照する。隠し領域の先頭からのオフセットは、領域管理テーブル136に登録された隠し領域のユニット数mと1ユニットのバイト数kから算出できる。
【0096】
例えば、1ユニットのバイト数が1バイトであり、隠し領域の1文字当たりユニット数mが3ユニットであり、ユーザプログラムが文字列の2文字目を参照する場合を考える。この場合、文字コード処理部134は、ユーザ定義領域の先頭から1バイト後のビット列と、隠し領域の先頭から3バイト後のビット列とを参照する。
【0097】
(S34)文字コード処理部134は、文字コードの書き込みがユーザプログラムによって要求された場合、書き込み先が外部デバイスであるか判断する。書き込み先が外部デバイスである場合はステップS35に処理が進み、それ以外の場合はステップS36に処理が進む。なお、2つの文字コードを比較する場合など、文字コードの書き込みが要求されていない場合、ステップS34〜S41を実行しなくてよい。
【0098】
(S35)文字コード処理部134は、文字毎に読み込み元のユーザ定義領域のビット列と隠し領域のビット列とを結合して文字コードを再現し、再現した文字コードをシリアルに外部デバイスに出力する。ステップS31で空の隠し領域があるとみなした場合、文字コード処理部134は、実質的にユーザ定義領域のビット列のみ出力する。
【0099】
(S36)文字コード処理部134は、文字コードの書き込み先が他言語処理系の使用するRAM102の領域であるか判断する。ユーザプログラムから指定された書き込み先が他言語処理系の領域であるか否かは、その領域がライブラリ124の管理する自言語処理系の領域に属しているか否かによって判断できる。書き込み先が他言語処理系の領域である場合はステップS37に処理が進み、それ以外の場合はステップS40に処理が進む。
【0100】
(S37)文字コード処理部134は、読み込まれた文字コードそれぞれが1ユニットに収まっているか判断する。読み込み元の隠し領域に未使用を示す所定の値以外のビット列が格納されている場合、1文字1ユニットでないと判断される。1文字1ユニットである場合はステップS38に処理が進み、それ以外の場合はステップS39に処理が進む。
【0101】
(S38)他言語処理系ではユーザ定義領域に対応する隠し領域が確保されない。このため、文字コード処理部134は、ユーザプログラムから指定された他言語処理系が用意したユーザ定義領域に、読み込まれた文字コードを書き込む。例えば、文字コード処理部134は、読み込み元のユーザ定義領域から書き込み先のユーザ定義領域にビット列をコピーする。このとき、読み込み元の隠し領域は無視される。
【0102】
(S39)文字コード処理部134は、実行エラーと判断する。その結果、ユーザプログラムが停止することがあり、ディスプレイ111にエラーが表示されることもある。
(S40)文字コード処理部134は、文字コードの書き込み先が自言語処理系のユーザ定義領域であることから、領域管理テーブル136を参照して、書き込み先のユーザ定義領域に対応する隠し領域を検索してその隠し領域のアドレスを特定する。
【0103】
(S41)文字コード処理部134は、文字毎に文字コードのうち先頭1ユニットのビット列(例えば、文字コードの先頭1バイト)を書き込み先のユーザ定義領域に格納し、ユーザ定義領域から溢れるそれ以外のビット列を書き込み先の隠し領域に格納する。例えば、文字コード処理部134は、読み込み元のユーザ定義領域のビット列を書き込み先のユーザ定義領域にコピーし、読み込み元の隠し領域のビット列を書き込み先の隠し領域にコピーする。ステップS31で空の隠し領域があるとみなした場合、文字コード処理部134は、書き込み先の隠し領域には未使用を示す所定のビット列を格納する。
【0104】
次に、隠し領域の利用方法の変形例について説明する。
隠し領域の1文字当たりのユニット数mは、文字コードの最大長に応じて決定されるため、UTF−8のような文字コードが可変長な文字コード体系を使用する場合、隠し領域の多くは空になる可能性がある。そこで、使用頻度の低い隠し領域に格納されたビット列を、ファイル圧縮技術を用いて圧縮することが考えられる。
【0105】
例えば、領域管理テーブル136に、隠し領域毎にその隠し領域が最後にアクセスされた時刻を登録しておく。文字コード処理部134は、最後にアクセスされてから所定時間以上経過した隠し領域のビット列を圧縮してRAM102に格納し、元の隠し領域を解放する。これにより、RAM102の領域の使用量を削減することができる。圧縮されたビット列しようとする場合、文字コード処理部134は、改めて隠し領域をRAM102に確保し、圧縮されたビット列をその隠し領域に展開する。
【0106】
また、隠し領域の存在を認識している自言語処理系のライブラリ124は、ユーザ定義領域のビット列と隠し領域のビット列とを紐付けて処理する。一方で、隠し領域の存在を認識していない他言語処理系のプログラムや、古いコンパイラでコンパイルされておりライブラリ124を呼び出さずに文字コードを処理する古いユーザプログラムも、サーバ装置100で実行されるおそれがある。そのようなプログラムは、隠し領域の存在を無視してユーザ定義領域のビット列のみ書き換えてしまうおそれがある。そこで、文字コード処理部134は、意図しないユーザ定義領域の書き換えを以下のように検出してもよい。
【0107】
図13は、隠し領域を用いた文字コードの他の格納例を示す図である。
文字コード処理部134は、n文字×1ユニットのユーザ定義領域と対応付けて、n文字×(m+1)ユニットの隠し領域をRAM102に確保する。m+1ユニットは、最大長の文字コードを収容できるサイズである。文字コード処理部134は、各文字について文字コードの先頭1ユニットをユーザ定義領域に格納すると共に、文字コード全体を隠し領域に格納する。外部デバイスに文字コードを出力する場合、文字コード処理部134は、ユーザ定義領域に格納されたビット列または隠し領域に格納された先頭1ユニットのビット列を無視する。ただし、ユーザ定義領域と隠し領域とで重複させるビット列は、文字コードの先頭1ユニットでなくてもよく所定の位置のビット列であればよい。
【0108】
ユーザ定義領域にアクセスするとき、文字コード処理部134は、各文字についてユーザ定義領域に格納されたビット列と隠し領域に格納された所定の位置のビット列とを比較し、両者が一致しているか確認する。両者が一致していない場合、文字コード処理部134は、自言語処理系の古いユーザプログラムまたは他言語処理系のプログラムがユーザ定義領域のみを書き換えたと判断する。その場合、例えば、文字コード処理部134は、実行エラーと判断し、ユーザプログラムの停止やディスプレイ111へのエラーの表示などの所定のエラー処理を行う。または、文字コード処理部134は、隠し領域のビット列を消去して(未使用を示す所定のビット列を隠し領域に書き込んで)、ユーザプログラムの実行を継続させる。これにより、自言語処理系の古いユーザプログラムや他言語処理系のプログラムとの間の互換性が損なわれるリスクを低減できる。
【0109】
第2の実施の形態の情報処理システムによれば、ユーザプログラムの文字型変数に応じてRAM102に確保されるユーザ定義領域と対応付けて、ユーザプログラムから認識されない隠し領域が確保される。そして、文字コードの処理が行われるとき、ユーザ定義領域と隠し領域の両方を用いて、文字型変数によって定義される1ユニットのバイト数よりも長い文字コードが処理される。これにより、ユーザプログラムからは、読み込む文字データで使用されている文字コード体系にかかわらず、1文字1ユニットの原則に従って文字コードを処理しているように見える。よって、読み込む文字データの文字コード体系が変わってもユーザプログラムを修正しなくてよく、以前に作成したユーザプログラムを活用して情報処理システムを効率的に構築・運用することができる。
【0110】
なお、前述のように、第1の実施の形態の情報処理は、実行制御装置10にプログラムを実行させることで実現することができる。第2の実施の形態の情報処理は、サーバ装置100にプログラムを実行させることで実現することができる。
【0111】
プログラムは、コンピュータ読み取り可能な記録媒体(例えば、記録媒体113)に記録しておくことができる。記録媒体としては、例えば、磁気ディスク、光ディスク、光磁気ディスク、半導体メモリなどを使用できる。磁気ディスクには、FDおよびHDDが含まれる。光ディスクには、CD、CD−R(Recordable)/RW(Rewritable)、DVDおよびDVD−R/RWが含まれる。プログラムは、可搬型の記録媒体に記録されて配布されることがある。その場合、可搬型の記録媒体からHDDなどの他の記録媒体(例えば、HDD103)にプログラムを複製して(インストールして)実行してもよい。
【符号の説明】
【0112】
10 実行制御装置
11 メモリ
12 演算部
13 プログラム
14,15 文字コード
16,17,18,19 領域
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13