(57)【要約】【課題】アプリケーションの多言語化を促進するのに役立つコンパイラを提供する。【解決手段】コンパイラ１００は、コンピュータにコンパイル処理を実行させる。コンパイル処理は、コンパイル対象のソースコード１０１と、複数の言語の間で互いに対応する意味を持つ複数の文字列リテラルの組み合わせであるリテラル組を定義する定義情報１０２と、を読み込むことを含む。コンパイル処理は、コード１０３を生成することも含む。コード１０３内では、各リテラル組について、当該リテラル組に属する複数の文字列リテラルのそれぞれに対して、当該リテラル組のうちで最長の文字列リテラルのバイト長以上である算出バイト長が割り当てられる。コード１０３によれば、各文字列リテラルの開始アドレスが、実行時に指定されるロケールに応じて参照される。【選択図】図１
2015194862.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに、
コンパイル対象のソースコードと、複数の言語の間で互いに対応する意味を持つ複数の文字列リテラルの組み合わせであるリテラル組を定義する定義情報と、を読み込み、
各リテラル組について、当該リテラル組に属する複数の文字列リテラルのそれぞれに対して、当該リテラル組のうちで最長の文字列リテラルのバイト長以上である算出バイト長が割り当てられ、かつ、各文字列リテラルの開始アドレスが、実行時に指定されるロケールに応じて参照されるコードを生成する
ことを含むコンパイル処理を実行させるコンパイラ。
【請求項２】
前記コードを生成する処理は、
前記ロケールを示すロケール識別情報を取得するための１つ以上の命令と、前記ロケール識別情報に応じた条件分岐のための１つ以上の命令と、前記複数の言語に対応する複数個の数値のうちの１つを用いて各文字列リテラルの前記開始アドレスを参照するための１つ以上の命令と、を含む複数の命令を生成し、
前記複数の命令を前記コードの中に含める
ことを含むことを特徴とする請求項１に記載のコンパイラ。
【請求項３】
生成される前記コードの中では、言語ごとに文字列リテラルが配置されており、かつ、各言語について、当該言語の複数の文字列リテラルは、リテラル組同士の間で定義される順序で配置されている
ことを特徴とする請求項２に記載のコンパイラ。
【請求項４】
生成される前記コードの中では、リテラル組ごとに文字列リテラルが配置されており、かつ、各リテラル組について、当該リテラル組に属する複数の文字列リテラルは、前記複数の言語の間で定義される順序で配置されている
ことを特徴とする請求項２に記載のコンパイラ。
【請求項５】
コンピュータが、
コンパイル対象のソースコードと、複数の言語の間で互いに対応する意味を持つ複数の文字列リテラルの組み合わせであるリテラル組を定義する定義情報と、を読み込み、
各リテラル組について、当該リテラル組に属する複数の文字列リテラルのそれぞれに対して、当該リテラル組のうちで最長の文字列リテラルのバイト長以上である算出バイト長が割り当てられ、かつ、各文字列リテラルの開始アドレスが、実行時に指定されるロケールに応じて参照されるコードを生成する
ことを特徴とするコンパイル方法。
【請求項６】
コンパイル対象のソースコードと、複数の言語の間で互いに対応する意味を持つ複数の文字列リテラルの組み合わせであるリテラル組を定義する定義情報とに基づいて、各リテラル組について、当該リテラル組に属する複数の文字列リテラルのそれぞれに対して当該リテラル組のうちで最長の文字列リテラルのバイト長以上である算出バイト長が割り当てられており、かつ、各文字列リテラルの開始アドレスが、実行時に指定されるロケールに応じて参照されるコードを、生成する生成部
を備えるコンパイル装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はコンパイラに関する。
【背景技術】
【０００２】
近年では種々のソフトウェアが多言語化されている。また、多言語化にともなう問題に対処するための様々な研究も行われている。
【０００３】
例えば、プリンタにフォント登録を行う際の制御に関連して、以下のような情報処理装置が提案されている。以下の情報処理装置は、開発コストやメンテナンス工数の増加を招くことなく常に最適な文字登録が行えるようして、２バイトフォントの印字パフォーマンスを向上させることを目的とするものである。
【０００４】
まず、当該情報処理装置上でＯＳ（Operating System）の保持するロケールＩＤ（locale identifier）が判別される。そして、当該情報処理装置は、判別したロケールＩＤを参照して、固定領域と可変領域の登録文字数を決定する。その後、当該情報処理装置は、決定した登録文字数に応じて、当該情報処理装置上で使用頻度の高いフォントをプリンタの固定領域に登録するとともに、固定領域に登録されたフォントより当該情報処理装置上で使用頻度の低いフォントを可変領域に登録する。
【０００５】
また、多言語化されたウェブページも増えつつある。そして、ＪＳＰ（Java Server Pages; Javaは登録商標）などにより動的コンテンツを生成する際の処理に要する時間を短縮することができるようにするための、以下のような技術も提案されている。
【０００６】
動的コンテンツを作成するプログラムを生成する装置において、当該装置の内部ではテキストを所定の汎用的な文字エンコーディングにより表現して取り扱うものとする。一方、当該装置に対し、以下の２つの手段が設けられる。
【０００７】
・コンテンツの静的部分を構成するための静的テキストを含む所定のファイルに基づき、動的コンテンツを作成するプログラムを生成する手段。
・静的テキストについての、コンテンツ用の文字エンコーディングによる文字コードの情報を、プログラムが利用できるように、予め用意する手段。
【０００８】
ところで、多言語化は、プリンタやウェブページにだけ関係するものではない。近年では、基幹系システム（enterprise system）を含む種々のアプリケーションの多言語化も進められている。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開２００３−０４４４７２号公報
【特許文献２】特開２００５−３３２１４６号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
アプリケーションが実際にどのようなロケールで実行されるのかは、アプリケーションのソースコードがコンパイルされる際には不明である。したがって、複数の言語の間で互いに対応する意味を持つ複数の文字列リテラルのうちのいずれが実行時のロケールに適しているのかは、ソースコードがコンパイルされる際には決まらない。そして、以上のごとき不確定性は、アプリケーション・ライフサイクル中の少なくとも１つの段階において何らかの困難または問題を引き起こし得るので、アプリケーションの多言語化を妨げる要因となり得る。
【００１１】
そこで本発明は、１つの側面では、アプリケーションの多言語化を促進するのに役立つコンパイラを提供することを目的とする。
【課題を解決するための手段】
【００１２】
一態様によるコンパイラは、コンピュータにコンパイル処理を実行させる。前記コンパイル処理は、コンパイル対象のソースコードと、複数の言語の間で互いに対応する意味を持つ複数の文字列リテラルの組み合わせであるリテラル組を定義する定義情報と、を読み込むことを含む。また、前記コンパイル処理は、各リテラル組について、当該リテラル組に属する複数の文字列リテラルのそれぞれに対して、当該リテラル組のうちで最長の文字列リテラルのバイト長以上である算出バイト長が割り当てられ、かつ、各文字列リテラルの開始アドレスが、実行時に指定されるロケールに応じて参照されるコードを生成することを含む。
【発明の効果】
【００１３】
アプリケーションの多言語化が促進されると期待される。
【図面の簡単な説明】
【００１４】
【図１】第１実施形態によるコンパイラが実行するコンパイル処理について説明する図である。
【図２】第１比較例について説明する図である。
【図３】第２比較例について説明する図（その１）である。
【図４】第２比較例について説明する図（その２）である。
【図５】第３比較例について説明する図である。
【図６】第２実施形態の概要を説明する図である。
【図７】第２実施形態のコンパイラのブロック構成図である。
【図８】コンピュータのハードウェア構成図である。
【図９】第２実施形態で使われるデータを例示する図である。
【図１０】第２実施形態で生成される命令列を例示する図（その１）である。
【図１１】第２実施形態で生成される命令列を例示する図（その２）である。
【図１２】第２実施形態のコンパイラがリテラル一覧を作成する処理のフローチャートである。
【図１３】第２実施形態のコンパイラがＲＯ領域（read-only section）を作成する処理のフローチャートである。
【図１４】第３実施形態で生成されるオブジェクトコードのＲＯ領域中で、言語依存の文字列リテラルが配置される部分を例示する図である。
【図１５】第３実施形態で生成される命令列を例示する図である。
【図１６】第４実施形態でオブジェクトコードに埋め込まれるデータを例示する図である。
【発明を実施するための形態】
【００１５】
以下、実施形態について、図面を参照しながら詳細に説明する。説明は以下の順序で行う。
【００１６】
まず、種々の実施形態の利点の意義を明らかにするための説明を行う。次に、図１を参照して第１実施形態について説明する。その後、各種実施形態についての理解を助けるために、図２〜５を参照して第１〜第３比較例について説明する。続いて、図６〜１６を参照して、第２〜第４実施形態について説明する。最後に、その他の実施形態についても説明する。
【００１７】
複数の自然言語で書かれており、かつ、互いに対応する意味を持つような複数の文字列の長さ同士は、異なり得る。他方、多言語アプリケーションが実際にどのような環境で実行されるのかは、アプリケーションのソースコードがコンパイルされる際には不明である。
【００１８】
よって、「長さが異なり得るような複数の言語の文字列リテラル（string literals）のうちのいずれが、アプリケーションが実際に実行されるロケールに適しているのか」ということは、ソースコードがコンパイルされる際には決まらない。このような不確定性は、多言語アプリケーションのライフサイクル中の少なくとも一つの段階において、広義のコストの増大を招く原因となり得るし、その結果として、何らかの問題または困難を引き起こし得る。
【００１９】
例えば、開発または保守を担当する人の手間という意味でのコストが、上記の不確定性のせいで増大することもあり得る。別の例として、アプリケーションの実行にともなう計算コスト（computational cost）が、上記の不確定性のせいで増大することもあり得る。コストの増大は、アプリケーションの多言語化を妨げる要因である。
【００２０】
詳しくは後述するとおり、各種実施形態によれば、多言語アプリケーションのライフサイクル中の開発・実行・保守等の段階のうちの、少なくとも一つの段階における何らかのコストを、第１〜第３比較例よりも減らすことが可能である。コストの削減は、アプリケーションの多言語化を促進するうえで有益である。したがって、各実施形態によるコンパイラは、アプリケーションの多言語化を促進するのに役立つと期待される。
【００２１】
基幹系システムを含む種々のアプリケーションの多言語化は、近年、重要性を増している。理由は以下のとおりである。
【００２２】
近年では、市場の成熟化などの理由により、日本国内の市場が伸び悩んでいる。そのため、海外への事業展開を目指す企業が増えている。具体的には、グローバル化に向けた企業の動き（例えば、ＩＣＴ（Information and Communication Technology）分野での海外への投資を増やす、などの動き）が加速している。
【００２３】
従来、企業の海外拠点で使われる基幹系システムは、個々の海外拠点に任されるケースが多かった。しかし、クラウドサービスが本格的に使われる時代の到来により、基幹系システムのグローバル化（換言すれば国際化）が進められつつある。したがって、基幹系システムを含む種々のアプリケーションの国際化および多言語化の重要性が近年増してきている。
【００２４】
様々なプログラミング言語により実装された様々な基幹系システムが存在するが、中でもＣＯＢＯＬ（Common Business-Oriented Language）は、多くの基幹系システムの実装に使われている。よって、以下の説明では、主にＣＯＢＯＬを例として取り上げる。しかし、例えばＣなどの、ＣＯＢＯＬ以外の他の高級言語（high-level language）に対しても、各実施形態は適用可能である。
【００２５】
ＣＯＢＯＬは、国際化対応（internationalization support）機能を有する。例えば、ＣＯＢＯＬの仕様では、漢字などのマルチオクテット文字の扱いが規定されている。国際化対応機能により、様々な言語向け（または様々な文化圏向け）のＣＯＢＯＬアプリケーションの開発が容易化され得る。
【００２６】
しかし、単にマルチオクテット文字の入出力を容易化する機能だけでは、アプリケーションの国際化には不十分である。アプリケーションの国際化のためには、複数の言語または文化圏における動作を規定するための、いわゆる「文化圏適応」（cultural adaptation）機能が有益である。
【００２７】
ところが、文化圏適応に関するＣＯＢＯＬの規格は、通貨や時刻の変換などに関する限定的な範囲にとどまっている。ＣＯＢＯＬの規格に定められた文化圏適応機能は、「ロケールに応じて、いくつかの国別文字定数（national literals）の中から、適宜の自然言語で書かれた国別文字定数を選んで出力する」といった機能を含まない。すなわち、ＣＯＢＯＬの規格で定められている機能には限界がある。
【００２８】
そのため、ＣＯＢＯＬ開発環境のベンダにより提供されるＣＯＢＯＬコンパイラは、国別文字定数を含むプログラムをコンパイルするとき、特定の一つの言語または文化圏向けのオブジェクトコードを出力するだけである。よって、アプリケーションに文化圏適応機能を持たせるためには、個々のアプリケーションの開発者が何らかの対処を迫られる。
【００２９】
例えば、「アプリケーション本体の実行ファイル（executable file）のほかに、ロケール別のリソースファイルをいくつか用意する」という方法が考えられ得る。この方法の詳細は、第１比較例として後述する。
【００３０】
別の例として、「複数のロケールに対応する複数のソースファイルを用意し、ロケール別にソースファイルをコンパイルし、それにより、複数のロケールに対応する複数の実行ファイルを生成する」という方法も考えられ得る。この方法の詳細は、第２比較例として後述する。
【００３１】
詳しくは後述するとおり、第１比較例も第２比較例も、アプリケーションのライフサイクル中で生じる広義のコストという点において、改善の余地が大いにある。つまり、アプリケーションの国際化および多言語化の重要性が上記のとおり近年増しているにも関わらず、アプリケーションに文化圏適応機能を持たせる（つまりアプリケーションを国際化および多言語化する）ためのコストは、現在ではまだ高い。
【００３２】
したがって、アプリケーションを国際化および多言語化するために生じるコストを減らす技術を提供することには、意義がある。とりわけ、コスト削減の役に立つ機能をコンパイラが提供することには、意義がある。なぜなら、コンパイラによって機能が提供されれば、個々のアプリケーション開発者のスキルや努力への依存度を減らせるからである。
【００３３】
下記の各種実施形態のコンパイラは、アプリケーションを国際化および多言語化するために生じ得るコストを減らす効果を有する。よって、各実施形態によるコンパイラは、アプリケーションの多言語化を促進するのに役立つと期待される。
【００３４】
さて、図１は、第１実施形態によるコンパイラが実行するコンパイル処理について説明する図である。図１に関する説明において、理解の助けとするために、後述の実施形態における具体例を参照することもある。
【００３５】
図１には、コンパイラ１００と、コンパイル対象のソースコード１０１と、定義情報１０２が例示されている。以下では、複数の言語の間で互いに対応する意味を持つ複数の文字列リテラルの組み合わせを「リテラル組」（literal tuple）という。定義情報１０２は、リテラル組を定義する情報である。
【００３６】
定義情報１０２で定義されるリテラル組の数は、１以上である。図１の例では、Ｍ組のリテラル組が定義されている（１≦Ｍ）。例えば、ｉ番目（１≦ｉ≦Ｍ）のリテラル組は、Ｎ種類（１＜Ｎ）の言語で書かれた、互いに対応する意味を持つＮ個の文字列リテラルＬｉ１，……，ＬｉＮの組み合わせである。
【００３７】
図１には、コンパイラ１００によってオブジェクトコード１０３（つまりマシン語で書かれたコード）が生成される例が示されている。実施形態によっては、コンパイラ１００は、アセンブリ言語で書かれたアセンブリコードを生成してもよい。
【００３８】
なお、コンパイラ１００は、コンピュータ（例えば後述の図８のコンピュータ７００）により実行されるプログラムの一種である。コンピュータは、コンパイラ１００のプログラムを実行することにより、コンパイル装置として動作する。以下では説明の簡単化のため、「コンピュータが、コンパイラ１００のプログラムを実行することにより、オブジェクトコード１０３を生成する」と述べる代わりに、単に「コンパイラ１００がオブジェクトコード１０３を生成する」のように述べることもある。
【００３９】
コンパイラ１００がコンピュータに実行させるコンパイル処理は、ソースコード１０１と定義情報１０２を読み込むことを含む。また、コンパイル処理は、コード（具体的にはオブジェクトコード１０３またはアセンブリコード）を生成することも含む。
【００４０】
なお、ソースコード１０１が書かれたソースファイルの中に、定義情報１０２が含まれていてもよい。あるいは、ソースファイルとは別のファイル（例えば後述の図６のロケールリソースファイル５０２）に、定義情報１０２が含まれていてもよい。
【００４１】
ソースコード１０１は、複数の言語（図１の例ではＮ種類の言語）のうちの１つの言語で書かれた複数の文字列リテラルのそれぞれについて、当該文字列リテラルか、または、当該文字列リテラルへの参照を含んでもよい。例えば、ソースコード１０１は、複数の言語のうちの１つの言語で書かれた複数の文字列リテラル自体を含んでもよい。または、ソースコード１０１は、当該１つの言語で書かれた複数の文字列リテラルへの参照を含んでもよい。もちろん、ソースコード１０１が、１つ以上の文字列リテラル自体と、１つ以上の文字列リテラルへの参照とを含んでいてもよい。
【００４２】
文字列リテラルは、例えば、定数（constant）または変数（variable）に値を設定するためにソースコード１０１内に記述されてもよいし、関数のパラメタとしてソースコード１０１内に記述されてもよい。
【００４３】
文字列リテラルへの参照の形式は、プログラミング言語の仕様による。例えば、ソースコード１０１がＣ言語で書かれている場合、文字列リテラルを定義するマクロの名前が、文字列リテラルへの一種の参照として、ソースコード１０１内に含まれていてもよい。
【００４４】
便宜上、図１には、ｓ番目（１≦ｓ≦Ｎ）の言語で書かれたＭ個の文字列リテラルＬ１ｓ，……，ＬＭｓがソースコード１０１に含まれる場合が図示されている。
【００４５】
オブジェクトコード１０３の中では、各リテラル組について、当該リテラル組に属する複数の文字列リテラルのそれぞれに対して、当該リテラル組のうちで最長の文字列リテラルのバイト長以上である「算出バイト長」が割り当てられている。例えば、ｉ番目のリテラル組に属する文字列リテラルＬｉ１，……，ＬｉＮのそれぞれに対して割り当てられる算出バイト長は、図１の例では、Ｂｉバイトである。
【００４６】
つまり、Ｂｉは、文字列リテラルＬｉ１，……，ＬｉＮのうちで最長の文字列リテラルのバイト長以上の値である。したがって、各文字列リテラルＬｉｊ（１≦ｊ≦Ｎ）は、文字列リテラルＬｉｊに割り当てられたＢｉバイトの範囲内に収まる。よって、例えば、文字列リテラルの参照にともなってＢｉバイトの範囲外への不正なメモリアクセスを引き起こし得るような危険な命令の生成は、自然と防止される。
【００４７】
各リテラル組に対応する算出バイト長は、具体的には、当該リテラル組に属する複数の文字列リテラルのうちで最長の文字列リテラルのバイト長そのものでもよい。または、各リテラル組に対応する算出バイト長は、「メモリ管理の単位である所定のバイト長の倍数であり、かつ当該リテラル組に属する複数の文字列リテラルのうちで最長の文字列リテラルのバイト長以上である」という条件を満たす最小のバイト長でもよい。
【００４８】
また、オブジェクトコード１０３によれば、各文字列リテラルの開始アドレスが、実行時に指定されるロケール（例えば、実行環境においてＯＳに設定されているロケール）に応じて参照される。換言すれば、各文字列リテラルの開始アドレスが、実行時に指定されるロケールに応じて参照されるように、コンパイラ１００は、適切なオブジェクトコード１０３を生成する。すなわち、オブジェクトコード１０３には、コンピュータ（具体的には、オブジェクトコード１０３から生成される実行ファイルを実行するコンピュータ）に各文字列リテラルの開始アドレスを実行時のロケールに応じて参照させるような複数の命令が含まれている。
【００４９】
なおここでの「各文字列リテラルの開始アドレス」とは、より具体的には、各リテラル組に属する複数の文字列リテラルのうち、実行時のロケールに応じた言語の文字列リテラルの開始アドレスのことである。
【００５０】
図１では便宜上、開始アドレスへの参照が矢印により表されている。矢印により表されているとおり、オブジェクトコード１０３には、実行時のロケールに応じて文字列リテラルＬｉ１，……，ＬｉＮのうちの１つの開始アドレスを参照するための命令が含まれる。
【００５１】
コンパイラ１００は、以上のような複数の命令を生成し、生成した複数の命令をオブジェクトコード１０３に含める。より具体的には、複数の命令の中には以下のような命令が含まれる。
【００５２】
・実行時に指定されるロケールを示すロケール識別情報を取得するための、１つ以上の命令。例えば、後述の図１０の命令８０３〜８０５など。
・ロケール識別情報に応じた条件分岐のための、１つ以上の命令。例えば、後述の図１０の命令８０７、８０８、８１０、８１２、８１３、８１５、８１７、８１８、８２０など。
・複数の言語の数に対応する複数個の数値（図１の例ではＮ個の異なる数値）のうちの１つを用いて、各文字列リテラルの開始アドレスを参照するための、１つ以上の命令。例えば、後述の図１０〜１１の命令８０９、８１４、８１９、８２２、８２５〜８３０、８３３、８３４、８３７、８３８、８４１、８４２や、図１５の命令９０５〜９０８、９１１〜９１４、９１７〜９２０、９２３〜９２６など。
【００５３】
文字列リテラルの開始アドレスを参照するための１つ以上の命令の中には、開始アドレスを算出するための１つ以上の命令が含まれていてもよい。開始アドレスを算出するための命令は、例えば、加算命令や乗算命令などの算術命令でもよい。別の例として、開始アドレスを算出するための命令は、、あるレジスタに保持されている値と指定された数値との算術演算（加算など）を行うことがオペランドに指定されているような、他の種類の命令であってもよい。
【００５４】
例えば、後述の図１０〜１１には、命令８０９、８１４、８１９、８２２、８２５〜８３０、８３３、８３４、８３７、８３７、８４１、８４２が例示されている。これらの命令は、３つの言語に対応する、０、１、２という３つの数値のうちの１つを用いて、開始アドレスを算出および参照するための命令の例である。
【００５５】
他の例として、後述の図１５には、命令９０５〜９０８、９１１〜９１４、９１７〜９２０、９２３〜９２６が例示されている。これらの命令は、３つの言語に対応する、０、１、２という３つの数値のうちの１つを用いて、開始アドレスを算出および参照するための命令の例である。
【００５６】
図１０〜１１と１５の例では、上記の「複数個の数値」は、０、１、２という連続した整数である。しかし、実施形態によっては、例えば、０、Ｙ、２Ｙなどの、連続しない複数個の数値が使われてもよい（Ｙの具体例は図６とともに後述する）。
【００５７】
さらに、実施形態によっては、α、β＋Ｙ、γ＋２Ｙなどの、不等間隔の複数個の数値が使われてもよい。なお、α、β、γは、コンパイラ１００が実装に応じて決める適宜の値であるものとする。
【００５８】
もちろん、定義情報１０２で文字列リテラルが定義される対象となる言語の数（図１ではＮ）に応じて、上記の「複数個の数値」の個数は、３以外の個数であってもよい。
【００５９】
ところで、複数の文字列リテラルのオブジェクトコード１０３内での配置には、２種類のものがあり得る。後述の第２実施形態は１種類目の配置が採用される例であり、後述の第３実施形態は２種類目の配置が採用される例である。
【００６０】
１種類目の配置によると、オブジェクトコード１０３の中では、言語ごとに文字列リテラルが配置され、かつ、各言語について、当該言語の複数の文字列リテラルは、リテラル組同士の間で定義される順序で配置される。例えば、１種類目の配置では、「Ｌ１１，……，ＬＭ１，Ｌ１２，……，ＬＭ２，……，Ｌ１Ｎ，……，ＬＭＮ」という順序で、ＭＮ個の文字列リテラルがオブジェクトコード１０３内に配置されてもよい。
【００６１】
他方、２種類目の配置によると、オブジェクトコード１０３の中では、リテラル組ごとに文字列リテラルが配置され、かつ、各リテラル組について、当該リテラル組に属する複数の文字列リテラルは、複数の言語の間で定義される順序で配置される。例えば、２種類目の配置では、「Ｌ１１，……，Ｌ１Ｎ，Ｌ２１，……，Ｌ２Ｎ，……，ＬＭ１，……，ＬＭＮ」という順序で、ＭＮ個の文字列リテラルがオブジェクトコード１０３内に配置されてもよい。
【００６２】
コンパイラ１００は、１種類目と２種類目のいずれの配置を採用するかに応じて、適宜の命令を生成する。なお、１種類目と２種類目のいずれの配置が採用される場合でも、オブジェクトコード１０３の中では、各リテラル組について、当該リテラル組に属する複数の文字列リテラルのそれぞれに対して上記の「算出バイト長」が割り当てられる。
【００６３】
１種類目の配置が採用される場合、コンパイラ１００は、算出バイト長を累積加算することによって、各リテラル組に対応するオフセットを算出してもよい。オフセットの具体例は図９とともに後述する。この場合、各文字列リテラルの開始アドレスを参照するための上記の１つ以上の命令は、オフセットを含むオペランドが指定された命令（例えば、後述の図１１の命令８２９、８３３、８３７、８４１など）を含んでもよい。
【００６４】
また、１種類目の配置が採用される場合、コンパイラ１００は、さらに、全リテラル組の算出バイト長の合計を算出してもよい。例えば、図１の例では、合計は（Ｂ１＋……＋Ｂｉ＋……＋ＢＮ）であり、後述の図１１の例では合計はＹである。この場合、各文字列リテラルの開始アドレスを参照するための上記１つ以上の命令は、複数の言語のうち実行時のロケールに対応する１つの言語の複数の文字列リテラルが配置された範囲の開始アドレスを合計に基づいて算出するための命令を含んでいてもよい。
【００６５】
例えば、実行時のロケールに対応する言語が、Ｎ個の言語のうちのｊ番目の言語であれば、上記範囲は、具体的には、文字列リテラルＬ１ｊ，……，ＬＭｊが配置される範囲である。
【００６６】
例えば、コンパイラ１００は、上記の複数個の数値（各文字列リテラルの開始アドレスを参照するための１つ以上の命令についての説明を参照）を、算出した合計に基づいて決めてもよい（０、Ｙ、２Ｙが上記の複数個の数値として使われる例を参照）。
【００６７】
あるいは、上記の複数個の数値のうちの１つと算出した合計とを使って上記範囲の開始アドレスを算出するための命令を、コンパイラ１００が生成してもよい。例えば、図１０〜１１の例では、０、１、２が上記の複数個の数値として使われており、算出される合計はＹである。そして、３つの言語それぞれについての上記範囲の開始アドレスは、(StartAddr+Offset+X)、(StartAddr+Offset+X+Y)、(StartAddr+Offset+X+2Y）であり、これらは、命令８２５〜８２９、８３３、８３７、８４１の実行過程で算出され得る。
【００６８】
詳しくは第２実施形態とともに後述するが、例えば、命令８２５は、複数個の数値のうちの１つ（０、１、または２）と、算出された合計（Ｙ）との積を所定のレジスタに記憶するための命令である。また、命令８２９、８３３、８３７、および８４１のオペランド内では、当該所定のレジスタの値を用いて上記範囲の開始アドレスを算出することが"BaseReg+Reg2"のように表現されている。
【００６９】
ところで、１種類目の配置における、上記の「リテラル組同士の間で定義される順序」は、１つの言語で書かれた文字列リテラル（または、当該文字列リテラルへの参照）がソースコード１０１内に出現する順序に基づくことが好ましい。なぜなら、ソースコード１０１内での出現順を入れ替える処理が不要なので、コンパイラ１００が行う解析を簡素にすることができるからである。なお、リテラル組同士の間で定義される順序は、図１の例では、「１，……，ｉ，……，Ｍ」というインデックスにより表されており、この順序は、ソースコード１０１での文字列リテラルの出現順と同じである。
【００７０】
他方、２種類目の配置における、上記の「複数の言語の間で定義される順序」は、例えば、定義情報１０２によって定義される順序であってもよい。例えば、図１の例では、複数の言語の間で定義される順序は、「１，……，ｓ，……，Ｍ」というインデックスにより表されている。
【００７１】
２種類目の配置が採用される場合、コンパイラ１００は、算出バイト長を累積加算することによって各リテラル組に対応する第１の値（例えば後述の図９における「オフセット」フィールドの値など）を算出してもよい。この場合、各文字列リテラルの開始アドレスを参照するための上記の１つ以上の命令は、複数の言語の数（図１の例ではＮ、図１４〜１５の例では３）と第１の値とに応じて決まる第２の値を含むオペランドが指定された命令を含んでいてもよい。
【００７２】
詳しくは第３実施形態とともに後述するが、例えば、後述の図１５には、複数の言語の数である３と、図９にオフセットとして示される０という値とに応じて決まる値（具体的には３と０の積である０）を含むオペランドが指定された命令９０７が例示されている。同様に、図１５には、３と１２という２つの値に応じて決まる値（具体的には３と１２の積である３６）を含むオペランドが指定された命令９１３も例示されている。命令９１９と９２５も類似の命令である。
【００７３】
ところで、第１のロケールと第２のロケールで特定の自然言語が使われる場合がある。例えば、アメリカとイギリスでは英語が使われる。
【００７４】
第１と第２のロケールで特定の自然言語が使われる場合、複数の言語（図１ではＮ種類の言語）のうちの２つは、第１のロケールで使われる特定の自然言語と、第２のロケールで使われる特定の自然言語であってもよい。例えば、第１と第２のロケールが"en-us"と"en-gb"という名前でそれぞれ識別される場合、アメリカ英語とイギリス英語が２つの異なる言語として扱われてもよい。
【００７５】
このように第１のロケールで使われる特定の自然言語と、第２のロケールで使われる特定の自然言語が区別される実施形態では、コンパイラ１００が生成する複数の命令の中には、次のような処理のための命令が含まれる。
【００７６】
・ロケール識別情報が第１のロケールを示す場合には、上記の複数個の数値（各文字列リテラルの開始アドレスを参照するための１つ以上の命令についての説明を参照）のうちの第１の数値を使って、開始アドレスを算出する。
・ロケール識別情報が第２のロケールを示す場合には、上記の複数個の数値のうちの第２の数値を使って、開始アドレスを算出する。
【００７７】
なお、第１の数値は、第１のロケールで使われる特定の自然言語に対応する。よって、第１の数値を使って算出される上記開始アドレスとは、第１のロケールで使われる特定の自然言語で書かれた文字列リテラルの開始アドレスのことである。また、第２の数値は、第２のロケールで使われる特定の自然言語に対応する。よって、第２の数値を使って算出される上記開始アドレスとは、第２のロケールで使われる特定の自然言語で書かれた文字列リテラルの開始アドレスのことである。
【００７８】
逆に、第１のロケールで使われる特定の自然言語と、第２のロケールで使われる特定の自然言語が区別されない実施形態も可能である。例えば、第１と第２のロケールが"en-us"と"en-gb"という名前でそれぞれ識別される場合、"en"という２文字で識別される言語（すなわち英語）が、第１と第２のロケールに共通の「特定の自然言語」に当たる。つまり、アメリカ英語とイギリス英語が区別されずに、同じ英語として扱われるような実施形態も可能である。
【００７９】
第１のロケールで使われる特定の自然言語と、第２のロケールで使われる特定の自然言語が区別されない場合、複数の言語（図１ではＮ種類の言語）のうちの１つは、第１のロケールと第２のロケールに共通の特定の自然言語であってもよい。この場合、コンパイラ１００が生成する複数の命令の中には、次のような命令が含まれる。
【００８０】
すなわち、複数の命令の中には、ロケール識別情報が第１のロケールを示す場合と、ロケール識別情報が第２のロケールを示す場合のいずれにおいても、上記の複数個の数値のうちのある１つの数値を用いて、開始アドレスを算出するための命令が含まれる。このようにして算出される上記開始アドレスとは、第１と第２のロケールに共通の特定の自然言語で書かれた文字列リテラルの開始アドレスのことである。
【００８１】
ところで、実行時に指定されるロケールで使われる言語が、複数の言語（図１ではＮ種類の言語）のうちのいずれとも異なる場合もあり得る。そこで、コンパイラ１００は、そのような場合に使われるデフォルト言語を、複数の言語のうちの１つに決定してもよい。デフォルト言語の決定方法の具体例については後述する。
【００８２】
ここで、説明の便宜上、上記の複数個の数値（各文字列リテラルの開始アドレスを参照するための１つ以上の命令についての説明を参照）のうちで、デフォルト言語に対応する１つの数値を、「デフォルト数値」という。コンパイラ１００がデフォルト言語を決める場合、生成される複数の命令の中には、次のような命令が含まれる。すなわち、複数の言語のうちのいずれとも異なる言語を使うロケールをロケール識別情報が示している場合にデフォルト数値を用いて開始アドレスを算出するための命令が、複数の命令の中には含まれる。
【００８３】
例えば、後述の第２実施形態では、デフォルト言語が英語であり、デフォルト数値が０である。図１０には、デフォルト数値を用いて開始アドレスを算出するための命令８２２が例示されている。
【００８４】
ところで、オブジェクトコード１０３を生成する処理は、以下のいずれか一方の処理を含んでいてもよい。
【００８５】
・各リテラル組について、当該リテラル組に属する複数の文字列リテラルのうち算出バイト長未満の長さの各文字列リテラルを所定の文字でパディングし、パディングした文字列リテラルをオブジェクトコード１０３内に配置する処理。例えば、後述の図１３のステップＳ２０６〜Ｓ２０８など。
・各リテラル組に属する複数の文字列リテラルそれぞれの長さを示す数値をオブジェクトコード１０３内に埋め込み（例えば図１６を参照）、長さを示す数値が埋め込まれたアドレスを参照するための命令を生成する処理。
【００８６】
また、ソースコード１０１は、ロケールによらずに共通に使われる言語非依存の文字列リテラルを含むか、または、言語非依存の文字列リテラルへの参照を含む場合があり得る。この場合、オブジェクトコード１０３を生成する処理は、言語非依存の文字列リテラルをオブジェクトコード１０３に含める処理を含む。例えば、後述の図６のように、すべての言語非依存の文字列リテラルが、複数の言語の文字列リテラルよりも前に配置されてもよい。実施形態によっては、言語非依存の文字列リテラルは、複数の言語の文字列リテラルよりも後に配置されてもよい。
【００８７】
続いて、上記の第１実施形態および後述の各種実施形態の利点についての理解を助けるために、第１〜第３比較例について説明する。
【００８８】
図２は、第１比較例について説明する図である。各種実施形態は、第１比較例と比べると、少なくとも以下の２つの点で優れている。ある側面では、各種実施形態は、第１比較例に対して以下のような優位性を持つことを１つの目的としている。
【００８９】
・実行時のオーバヘッドが少ない。換言すれば、実行時の計算コストが少ない。
・運用（service）開始後の保守コストが少ない。
【００９０】
図２のとおり、第１比較例の実行環境２００では、実行ファイル２０１とリソース呼び出しＤＬＬ（Dynamic Link Library）２０２とリソースファイル群２０３が使われる。リソースファイル群２０３は、Ｎ個のリソースファイルの集まりである（１＜Ｎ）。これらＮ個のリソースファイルは、Ｎ通りのロケールで使われるＮ種類の自然言語に対応する。図２の例では、Ｎ＝３であり、リソースファイル群２０３は、英語リソースファイル２０４と日本語リソースファイル２０５と中国語リソースファイル２０６を含む。
【００９１】
英語リソースファイル２０４は、英語の文字列リテラルをＭ個含む（１≦Ｍ）。これらＭ個の文字列リテラルに対応する意味を有し、かつ、日本語で書かれたＭ個の文字列リテラルが、日本語リソースファイル２０５に含まれる。また、英語リソースファイル２０４内のＭ個の文字列リテラルに対応する意味を有し、かつ、中国語で書かれたＭ個の文字列リテラルが、中国語リソースファイル２０６に含まれる。
【００９２】
各リソースファイル内の各文字列リテラルは、コード番号などのＩＤ（identifier）により識別される。互いに対応する意味を持つ英語と日本語と中国語の３つの文字列リテラルには、同じＩＤが割り当てられる。
【００９３】
実行ファイル２０１には、少なくとも以下の命令列が含まれる。
・実行ファイル２０１が実行される実行環境２００におけるロケールを認識するための命令列。例えば、実行環境２００のＯＳ（Operating System）に設定されているロケールを示す値を、ＯＳにより提供されるＡＰＩ（Application Programming Interface）などを介して取得するための命令列。
・取得した値に応じて（つまり実行時のロケールに応じて）リソースファイルを選択し、選択したリソースファイルから、呼び出しＤＬＬ２０２を介して文字列リテラルを読み出すための命令列。
【００９４】
したがって、第１比較例によれば、実行ファイル２０１が実行されると、実行環境２００のロケールに応じて、英語、日本語、または中国語の文字列リテラルが読み出される。実行ファイル２０１は、リソースファイルから読み出された文字列リテラルを表示するための命令列も含む。よって、実行環境２００のロケールに応じた言語で、文字列リテラルが表示される。すなわち、第１比較例によれば、多言語化が実現される。
【００９５】
しかしながら、第１比較例では、実行時のオーバヘッドが大きい。換言すれば、第１比較例では、実行時の計算コストが高い。
【００９６】
なぜなら、リソースファイル群２０３内のいずれかのリソースファイルが、実行時に、リソース呼び出しＤＬＬ２０２を介してアクセスされるからである。具体的には、実行ファイル２０１からリソース呼び出しＤＬＬ２０２を呼び出すためのオーバヘッドが生じる。さらに、リソースファイルを参照するためのディスクアクセスによるオーバヘッドも生じる。このようにリソースファイルを実行時に参照するために生じるオーバヘッドは、実行効率の低下の原因となり得る。
【００９７】
また、第１比較例では、実行時にリソースファイル群２０３が使われる。よって、第１比較例では、運用開始後もリソースファイル群２０３内の各リソースファイルを適切に管理するための管理コストが生じ得る。例えば、リソースファイル群２０３がエンドユーザによって誤って削除、移動、または編集されないように、システム管理者が何らかの手作業を行うことが考えられる。
【００９８】
続いて、図３〜４を参照して第２比較例について説明する。第１比較例のような実行時のオーバヘッドは、第２比較例では生じない。また、第２比較例では、実行時にリソースファイル群２０３を使わないので、リソースファイル群２０３の管理コストも不要である。
【００９９】
しかし、第２比較例では、プログラマが、ロケール別にソースファイルを作成およびコンパイルし、ロケール別に実行ファイルをビルドする。したがって、第２比較例では、ソースファイルの作成およびコンパイルに第１比較例よりも手間がかかる。さらに、第２比較例では、実行ファイルのビルドにも、第１比較例よりも手間がかかる。
【０１００】
このように、第２比較例には、プログラマの負担が大きい（すなわち開発コストが高い）という欠点がある。詳しくは後述するとおり、各種実施形態は、第２比較例と比べて開発コストが低い。つまり、ある側面では、各種実施形態は、第２比較例よりも開発コストを下げることを１つの目的としている。
【０１０１】
例えば、あるアプリケーションが、日本語が使われる実行環境と、英語が使われる実行環境と、中国語が使われる実行環境という、３つの実行環境（すなわち３つのロケール）で使われる可能性があるとする。この場合、第２比較例では、プログラマが３つの言語の開発環境で３つのソースファイルを作成する。
【０１０２】
そして、各ソースファイルが、各開発環境内のコンパイラによりコンパイルされ、その結果、３つの言語に対応する３つのオブジェクトファイルが得られる。
【０１０３】
各オブジェクトファイルは、リンカによって、適宜別のオブジェクトファイルとリンクされる。その結果、３つの言語に対応する３つの実行ファイルが得られる。エンドユーザは、３つの実行ファイルのうち、自分が使うコンピュータの環境に応じた実行ファイルを実行する。
【０１０４】
具体的には、図３には、日本語向け開発環境３００と日本語の実行環境３１０が例示されている。
【０１０５】
プログラマは、日本語向け開発環境３００において、日本語で書かれた文字列リテラルを含むソースファイル３０１を作成する。なお、説明の便宜上、ソースファイル３０１はＣＯＢＯＬで書かれているものとする。ＣＯＢＯＬの用語では、指定された各国文字集合（national character set）に属する文字の連なりにより表された文字列リテラルを、国別文字定数（national literal）という。
【０１０６】
図３には、ソースファイル３０１中の６個の文字列リテラルが例示されている。
"20131226"および"G8-2"という２つの文字列リテラルは、英数字リテラル（alphanumeric literals）であり、言語に依存しない文字列リテラルである。つまり、これら２つの文字列リテラルは、日本語・英語・中国語の違いによらず使われる、共通の文字列リテラルである。
【０１０７】
他方、"富士通太郎"と"基本給"と"職責給"と"勤続年数"という４つの文字列リテラルは、日本語で書かれた言語依存の文字列リテラルである。つまり、これら４つの文字列リテラルは国別文字定数（national literals）である。よって、これら４つの文字列リテラルを出力するための４つのDISPLAY文（DISPLAY statements）の各々では、国別文字定数を示す"N"が指定されている。
【０１０８】
さて、プログラマは、ソースファイル３０１を日本語向け開発環境３００内のコンパイラ３０２に入力として与える。コンパイラ３０２は、ソースファイル３０１をコンパイルすることでオブジェクトファイル３０３を生成する。
【０１０９】
日本語向け開発環境３００には、コンパイラ３０２だけでなくリンカ３０５も用意されている。リンカ３０５は、オブジェクトファイル３０３および他のオブジェクトファイル３０４から、実行ファイル３１１を生成する（つまりビルドする）。
【０１１０】
実行ファイル３１１が日本語の実行環境３１０で実行されると、画面３１２には、"20131226"、"G8-2"、"富士通太郎"、"基本給"、"職責給"、"勤続年数"という６つの文字列リテラルが表示される。
【０１１１】
ところで、図３にはオブジェクトファイル３０３の詳細も示されている。オブジェクトファイル３０３は、文字列リテラル用の記憶領域（storage area）であるＲＯ領域（read-only section）３０６と、命令３０７〜３０９を少なくとも含む。ＲＯ領域３０６の詳細が図３の右端に示されている。
【０１１２】
具体的には、ＲＯ領域３０６において、０〜７バイト目に"20131226"が配置され、８〜１１バイト目に"G8-2"が配置される。また、ＲＯ領域３０６において、１２〜２１バイト目に"富士通太郎"が配置され、２２〜２７バイト目に"基本給"が配置され、２８〜３３バイト目に"職責給"が配置され、３４〜４１バイト目に"勤続年数"が配置される。
【０１１３】
命令３０７は、ベースレジスタに、メモリ上でのオブジェクトコードの開始アドレスを読み込む（つまりロードする）ための命令である。なお、図３および後述の他の図では、ベースレジスタが"BaseReg"という名前で示されており、メモリ上でのオブジェクトコードの開始アドレスが"StartAddr"と表されている。
【０１１４】
命令３０８は、ベースレジスタに保持されている値に、オブジェクトコードの開始アドレスに対するＲＯ領域３０６の開始アドレスのオフセットを足して、その加算結果をベースレジスタに格納するための命令である。図３および後述の他の図では、オブジェクトコードの開始アドレスに対するＲＯ領域の開始アドレスのオフセットが、"Offset"と表されている。
【０１１５】
命令３０９は、ベースレジスタに保持されている値と３４を足した値を、"Reg1"という名前のレジスタに格納するための命令である。つまり、命令３０９は、"勤続年数"という文字列リテラルのメモリ上での開始アドレスを、レジスタＲｅｇ１に格納するための命令である。命令３０９は、画面３１２に"勤続年数"という文字列リテラルを出力するための命令列に含まれる複数の命令のうちの１つである。
【０１１６】
なお、図３および後述の他の図では、説明の便宜上、オブジェクトコードをアセンブリ言語で表現している。しかし、実際には、オブジェクトコードは、図示されたアセンブリコードに対応するマシン語のコード（machine code）である。
【０１１７】
ところで、第２比較例でプログラマは、英語向け開発環境（不図示）において、英語で書かれた文字列リテラルを含む、英語向けソースファイルを作成する。英語向けソースファイルでは、ソースファイル３０１内の日本語の文字列リテラルが英語の文字列リテラルに置換されるが、その他の点では両ソースファイルは同じである。
【０１１８】
具体的には、英語向けソースファイルには、日本語向けソースファイル３０１と同じく、"20131226"および"G8-2"という２つの言語非依存文字列リテラルが含まれる。また、英語向けソースファイルには、ソースファイル３０１に含まれる日本語の４つの文字列リテラルに対応する意味を持つ、英語で書かれた４つの文字列リテラルも含まれる。すなわち、英語向けソースファイルには、"Fujitsu Taro"と"Base Salary"と"Responsibility Salary"と"Length of Service"という４つの文字列リテラルも含まれる。
【０１１９】
プログラマは、英語向けソースファイルを、英語向け開発環境内のコンパイラに入力として与える。コンパイラは、英語向けソースファイルをコンパイルすることで、図４のオブジェクトファイル３２０を生成する。
【０１２０】
オブジェクトファイル３２０はリンカによって他のオブジェクトファイルとリンクされる。その結果、英語の実行環境（不図示）用の実行ファイル（不図示）が生成される。この実行ファイルが実行されると、画面には、"20131226"、"G8-2"、"Fujitsu Taro"、"Base Salary"、"Responsibility Salary"、"Length of Service"という６つの文字列リテラルが表示される。
【０１２１】
ところで、図４には、オブジェクトファイル３２０の詳細が示されている。オブジェクトファイル３２０は、ＲＯ領域３２１と、命令３０７および３０８と同じ２つの命令と、命令３０９とはオペランドが異なる命令３２２を含む。
【０１２２】
具体的には、ＲＯ領域３２１において、０〜７バイト目に"20131226"が配置され、８〜１１バイト目に"G8-2"が配置される。また、ＲＯ領域３０６において、１２〜２３バイト目には、"富士通太郎"に対応する意味を持つ"Fujitsu Taro"が配置される。そして、２４〜３４バイト目には、"基本給"に対応する意味を持つ"Base Salary"が配置される。また、３５〜５５バイト目には、"職責給"に対応する意味を持つ"Responsibility Salary"が配置される。さらに、５６〜７２バイト目には、"勤続年数"に対応する意味を持つ"Length of Service"が配置される。
【０１２３】
命令３２２は、ベースレジスタに保持されている値と５６を足した値を、レジスタＲｅｇ１に格納するための命令である。つまり、命令３２２は、"Length of Service"という文字列リテラルのメモリ上での開始アドレスを、レジスタＲｅｇ１に格納するための命令である。
【０１２４】
さて、第２比較例でプログラマは、中国語向け開発環境（不図示）において、中国語で書かれた文字列リテラルを含む、中国語向けソースファイルを作成する。中国語向けソースファイルでは、ソースファイル３０１内の日本語の文字列リテラルが中国語の文字列リテラルに置換されるが、その他の点では両ソースファイルは同じである。
【０１２５】
よって、中国語向けソースファイルにも、"20131226"および"G8-2"という２つの言語非依存文字列リテラルが含まれる。また、中国語向けソースファイルには、ソースファイル３０１に含まれる日本語の４つの文字列リテラルに対応する意味を持つ、中国語で書かれた４つの文字列リテラルも含まれる。すなわち、中国語向けソースファイルには、"富士通太郎"と
2015194862.tif 000003
と
2015194862.tif 000004
と
2015194862.tif 000005
という４つの文字列リテラルも含まれる。なお、"富士通太郎"という人名は、たまたま日本語と中国語で同じ文字で表されているが、固有名詞の中には、日本語と中国語で異なる文字で表されるものもある。
【０１２６】
プログラマは、中国語向けソースファイルを、中国語向け開発環境内のコンパイラに入力として与える。すると、コンパイラは、図４のオブジェクトファイル３３０を生成する。
【０１２７】
オブジェクトファイル３３０リンカによって他のオブジェクトファイルとリンクされる。その結果、中国語の実行環境（不図示）用の実行ファイル（不図示）が生成される。この実行ファイルが実行されると、画面には、"20131226"、"G8-2"、"富士通太郎"、
2015194862.tif 000006
、
2015194862.tif 000007
、
2015194862.tif 000008
という６つの文字列リテラルが表示される。
【０１２８】
ところで、図４には、オブジェクトファイル３３０の詳細が示されている。オブジェクトファイル３３０は、ＲＯ領域３３１と、命令３０７および３０８と同じ２つの命令と、命令３０９とはオペランドが異なる命令３３２を含む。
【０１２９】
具体的には、ＲＯ領域３３１において、０〜７バイト目に"20131226"が配置され、８〜１１バイト目に"G8-2"が配置される。また、ＲＯ領域３３１において、１２〜２１バイト目には、日本語の"富士通太郎"に対応する意味を持つ中国語の"富士通太郎"が配置される。そして、２２〜２９バイト目には、"基本給"に対応する意味を持つ
2015194862.tif 000009
が配置される。また、３０〜３７バイト目には、"職責給"に対応する意味を持つ
2015194862.tif 000010
が配置される。さらに、３８〜４１バイト目には、"勤続年数"に対応する意味を持つ
2015194862.tif 000011
が配置される。
【０１３０】
命令３３２は、ベースレジスタに保持されている値と３８を足した値を、レジスタＲｅｇ１に格納するための命令である。つまり、命令３３２は、
2015194862.tif 000012
という文字列リテラルのメモリ上での開始アドレスを、レジスタＲｅｇ１に格納するための命令である。
【０１３１】
以上の説明から分かるように、命令３０９と３２２と３３２は、オペランドが異なるだけである。命令３０９と３２２と３３２のオペランドが異なる理由は、互いに対応する意味を持つような複数の言語の文字列リテラル同士が、必ずしも同じ長さではないからである。結果として、オブジェクトファイル３０３と３２０と３３０は、文字列リテラル用のＲＯ領域の内容において互いに異なるだけでなく、命令用の領域に含まれるいくつかの命令のオペランドにおいても互いに異なる。ある観点から見れば、「ＲＯ領域の内容も、命令のオペランドも、上記のように言語に依存してしまう」ということは、言語ごとに別々にコンパイル処理が行われることの帰結とも言える。
【０１３２】
第２比較例では、言語ごとにプログラマがソースファイルを用意するので、ソースファイルの作成・保守・管理にかかる手間（つまりコスト）が大きい。また、第２比較例では、言語ごとに別々にコンパイル処理が行われるので、コンパイル処理の手間もかかる。
【０１３３】
続いて、図５を参照して第３比較例について説明する。第３比較例は、第１比較例と第２比較例の欠点を克服するために考えられ得る方法の一例を示す。
【０１３４】
しかし、第３比較例のような単純な方法では、コンパイルが失敗してしまう。つまり、第３比較例は非現実的である。ある側面では、各種実施形態は、第３比較例のような失敗を避けることを１つの目的としている。
【０１３５】
実は、図３〜４に例示したようなＲＯ領域を含むオブジェクトコードを生成するような種類のコンパイラには、優れた利点がある。具体的には、この種のコンパイラには、「コンパイル処理を簡素化することで、ソースファイルをコンパイルするのにかかる時間を短縮する」という効果がある（詳しくは後述する）。
【０１３６】
しかし、この時間短縮効果が得られるようなコンパイルの仕方を変えずに（つまり時間短縮効果を維持したままで）、第１比較例と第２比較例の欠点を克服することには、困難がある。第３比較例は、この困難の克服（または回避）に失敗してしまう例である。
【０１３７】
図５には、図３のソースファイル３０１と同じソースファイル４０１が例示されている。また、図５には、コンパイラ４０２とオブジェクトファイル４０３が図示されており、オブジェクトファイル４０３内のＲＯ領域４０４の詳細も図示されている。
【０１３８】
第３比較例での目標の１つは、第１比較例のように複数のリソースファイル２０４〜２０６を実行時に使う事態を避け、かつ、第２比較例のように複数種類のオブジェクトファイル３０３、３２０、および３３０を生成する事態も避けることである。この目標を達成するために考えられ得る方法は、１つのオブジェクトファイル４０３のＲＯ領域４０４内に、複数の言語の文字列リテラルを含めることである。
【０１３９】
図５には、言語非依存の文字列リテラルと、日本語の文字列リテラルと、英語の文字列リテラルと、中国語の文字列リテラルのすべてを含むＲＯ領域４０４が例示されている。具体的には、上記の文字列リテラルが以下のように配置されたＲＯ領域４０４が考えられ得る。
【０１４０】
・  ０〜  ７バイト目："20131226"（言語非依存の文字列リテラル）
・  ８〜１１バイト目："G8-2"（言語非依存の文字列リテラル）
・１２〜２１バイト目："富士通太郎"（日本語の文字列リテラル）
・２２〜３３バイト目："Fujitsu Taro"（１２〜２１バイト目の文字列リテラルに対応する意味を持つ英語の文字列リテラル）
・３４〜４３バイト目："富士通太郎"（１２〜２１バイト目の文字列リテラルに対応する意味を持つ中国語の文字列リテラル）
・４４〜４９バイト目："基本給"（日本語の文字列リテラル）
・５０〜６０バイト目："Base Salary"（４４〜４９バイト目の文字列リテラルに対応する意味を持つ英語の文字列リテラル）
・６１〜６８バイト目：
2015194862.tif 000013
（４４〜４９バイト目の文字列リテラルに対応する意味を持つ中国語の文字列リテラル）
・６９〜７４バイト目："職責給"（日本語の文字列リテラル）
・７５〜９５バイト目："Responsibility Salary"（６９〜７４バイト目の文字列リテラルに対応する意味を持つ英語の文字列リテラル）
・９６〜１０３バイト目：
2015194862.tif 000014
（６９〜７４バイト目の文字列リテラルに対応する意味を持つ中国語の文字列リテラル）
・１０４〜１１１バイト目："勤続年数"（日本語の文字列リテラル）
・１１２〜１２８バイト目："Length of Service"（１０４〜１１１バイト目の文字列リテラルに対応する意味を持つ英語の文字列リテラル）
・１２９〜１３２バイト目：
2015194862.tif 000015
（１０４〜１１１バイト目の文字列リテラルに対応する意味を持つ中国語の文字列リテラル）
【０１４１】
もし、上記のごときＲＯ領域４０４を含むオブジェクトファイル４０３をコンパイラ４０２が生成することが可能であれば、第３比較例は第１・第２比較例よりも有利であろう。しかし、単にオブジェクトファイル４０３が図５のようなＲＯ領域４０４を含んでさえいれば十分、という訳ではない。もし、ＲＯ領域４０４内の文字列リテラルを参照するための適切な命令をコンパイラ４０２が生成することができなければ、図５のようなＲＯ領域４０４は意味を持たない。
【０１４２】
そして、「上述のような時間短縮効果を持つコンパイラを改造（modify）することで、ＲＯ領域４０４を含むオブジェクトファイル４０３の生成を可能にしよう」という試みは、失敗してしまう。つまり、第３比較例で想定した方法は、コンパイルの失敗にしかつながらない。
【０１４３】
なぜなら、ＲＯ領域４０４内の文字列リテラルを参照するための適切な命令は、コンパイル時には定まらないからである。この失敗は、図５において、オペランドが定まらない命令４０５によって表現されている。以下に、より具体的に説明する。
【０１４４】
上記のとおり、コンパイル処理を簡素化することで、ソースファイルをコンパイルするのにかかる時間を短縮することが可能となる。コンパイル処理の簡素化とは、コンパイラ（例えばコンパイラ３０２または４０２）が、ソースファイル（例えばソースファイル３０１または４０１）にリテラルが出現する順に、リテラルの種類によらない一律の操作を行うことを意味する。以下、第２比較例のコンパイラ３０２とソースファイル３０１を例にして、この時間短縮効果について説明する。
【０１４５】
具体的には、コンパイラ３０２は、リテラルの種類によらず、単に、ソースファイル３０１にリテラルが出現する順にそれらのリテラルを解析する。そして、コンパイラ３０２は、解析した順にそれらのリテラルをオブジェクトファイル３０３のＲＯ領域３０６内に連続的に配置する。
【０１４６】
つまり、コンパイラ３０２は、リテラルの種類（数値リテラル、言語非依存の文字列リテラル、言語依存の文字列リテラル、など）に基づいてリテラルを解析する順序を変えることはない。コンパイラ３０２は、単に、ソースファイル３０１にリテラルが出現する順に、それらのリテラルを解析するだけである。
【０１４７】
また、コンパイラ３０２は、ＲＯ領域３０６内でリテラルを配置する場所（換言すればＲＯ領域３０６内での各リテラルの開始アドレス）を、リテラルの種類に基づいて決めることもない。コンパイラ３０２は、単に、ソースファイル３０１にリテラルが出現する順に、それらのリテラルをＲＯ領域３０６内に連続的に配置するだけである。
【０１４８】
例えば、ソースファイル３０１に１０個のリテラルが含まれ、そのうち１番目と７番目のリテラルが数値リテラルであり、２番目と９番目が言語非依存の文字列リテラルであり、３〜６、８、１０番目が言語依存の文字列リテラルであるとする。このような場合でも、例えば「１〜２番目に２つの数値リテラルを解析し、３〜４番目に２つの言語非依存の文字列リテラルを解析し、５〜１０番目に６つの言語依存の文字列リテラルを解析する」といったような、解析順の入れ替えは行われない。また、このような場合でも、例えば「１〜２番目に２つの数値リテラルを配置し、３〜４番目に２つの言語非依存の文字列リテラルを配置し、５〜１０番目に６つの言語依存の文字列リテラルを配置する」といったような、種類に応じた配置は行われない。上記の場合、コンパイラ３０２は、単に、ソースファイル３０１に出現するｉ番目のリテラルをｉ番目に解析し、このｉ番目のリテラルをＲＯ領域３０６内でｉ番目に配置するだけである（１≦ｉ≦１０）。
【０１４９】
以上のような、「コンパイラ３０２がリテラルの種類を考慮しないで、単にソースファイル３０１での出現順にのみ基づいて、リテラルを順に解析し、ＲＯ領域３０６内に順にリテラルを配置する」という方法によれば、コンパイル処理が簡素化される。なぜなら、リテラルを配置する順番やアドレスをリテラルの種類に応じて決める処理が不要だからである。そして、コンパイル処理の簡素化により、ソースファイル３０１をコンパイルするのにかかる時間が短縮される。
【０１５０】
第３比較例のコンパイラ４０２も、以上のような時間短縮効果を狙って、リテラルの種類によらず、単に、ソースファイル４０１にリテラルが出現する順にそれらのリテラルを解析する。そして、コンパイラ４０２は、解析した順に、リテラルをＲＯ領域４０４に配置しようとする。
【０１５１】
より具体的には、ソースファイル４０１にｉ番目に出現するリテラルが言語に依存しない種類のリテラルであれば、コンパイラ４０２は、単に、ｉ番目のリテラルをＲＯ領域４０４内の次の位置に配置する。逆に、ｉ番目のリテラルが、言語依存の文字列リテラルであれば、コンパイラ４０２は、ｉ番目のリテラルをＲＯ領域４０４内の次の位置に配置し、さらに、ｉ番目のリテラルに対応する他の言語の文字列リテラルも、その後に連続して配置する。こうしてコンパイラ４０２は、複数の言語間で互いに対応するリテラルを含む複数のリテラルを、図５に示すようにＲＯ領域４０４に配置することも可能である。
【０１５２】
ところが、単にリテラルがＲＯ領域４０４内に配置されているだけでは意味がない。リテラルにアクセスする（つまり、ＲＯ領域４０４内のリテラルを参照する）ための命令がオブジェクトファイル４０３に含まれてこそ、ＲＯ領域４０４内のリテラルは意味を持つ。しかし、第３比較例のコンパイラ４０２は、リテラルを参照するための命令をうまく決めることができない。
【０１５３】
リテラルを参照するための命令の生成にコンパイラ４０２が失敗してしまうことが、図５では、オペランドが不定の命令４０５として表現されている。オペランドが正しく指定されていない命令４０５は、もちろん、不正であり、実行不能である。
【０１５４】
このような第３比較例におけるコンパイル処理の失敗の原因は、第２比較例と第３比較例を比べることで、よりよく理解される。
【０１５５】
第２比較例では、どの言語の文字列リテラルが実行時に参照されるのかについて、コンパイル時に一意に確定される。例えば、日本語向けソースファイル３０１がコンパイルされる場合は、「コンパイルにより得られるオブジェクトファイル３０３から生成される実行ファイル３１１が実行されると、日本語の文字列リテラルが参照される」ということがコンパイル時に確定される。同様に、英語向けのソースファイルがコンパイルされる場合には、「実行時には英語の文字列リテラルが参照される」ということがコンパイル時に確定する。同様に、中国語向けのソースファイルがコンパイルされる場合には、「実行時には中国語の文字列リテラルが参照される」ということがコンパイル時に確定する。
【０１５６】
そのため、第２比較例のコンパイラ３０２は、ＲＯ領域内のリテラルを参照するための命令のオペランド（例えば、命令３０９における、３４という数値を含むオペランド）をコンパイル時に確定することができる。したがって、第２比較例のコンパイラ３０２は、適切な命令（例えば命令３０９）を生成することもできる。
【０１５７】
例えば、ソースファイル３０１は日本語の文字列リテラルを含むが、英語や中国語などの他の言語の文字列リテラルは含まない。よって、コンパイラ３０２は、ソースファイル３０１をコンパイルする際に、「実行時に参照されることになる文字列リテラルは、ソースファイル３０１に現れる日本語の文字列リテラルである」と確定することができる。つまり、第２比較例では、コンパイラ３０２がソースファイル３０１をコンパイルする際には、「実行ファイル３１１の実行時に、英語や中国語などの他の言語の文字列リテラルが参照される」という可能性は予め排除されている。
【０１５８】
そのため、コンパイラ３０２は、日本語の文字列リテラルを参照するための適切なオペランドを一意に確定することができ、その適切なオペランドを含む命令を生成することができる。例えば、"勤続年数"という日本語の文字列リテラルのＲＯ領域３０６内での開始アドレスを指定するための、"[BaseReg+34]"という適切なオペランドを、コンパイラ３０２は確定することができる。具体的には、コンパイラ３０２は、単にソースファイル３０１に出現する順にリテラルを解析し、リテラルのバイト長を順に合算してゆくだけで、上記オペランドに含まれる３４という値を確定的に得ることができる。よって、コンパイラ３０２は、上記オペランドを含む命令３０９を生成することができる。
【０１５９】
もちろん、ソースファイル３０１中に例示した他の各文字列リテラルに関しても、コンパイラ３０２は、適宜のオペランドを確定することができ、そのオペランドを含む命令を生成することができる。だからこそ、実行ファイル３１１の実行時には、各リテラルが正しく参照され、画面３１２に表示されるのである。
【０１６０】
同様に、コンパイラ３０２は、英語向けソースファイル（図４に関して説明した、不図示のソースファイル）をコンパイルする際には、「実行時に参照されることになる文字列リテラルは、英語の文字列リテラルである」と確定することができる。そのため、コンパイラ３０２は、例えば、"Length of Service"という英語の文字列リテラルのＲＯ領域３２１内での開始アドレスを指定するための、"[BaseReg+56]"という適切なオペランドを確定することができる。よって、コンパイラ３０２は、このオペランドを含む命令３２２を生成することができる。
【０１６１】
同様に、コンパイラ３０２は、中国語向けソースファイコンパイルする際には、「実行時に参照されることになる文字列リテラルは、中国語の文字列リテラルである」と確定することができる。したがって、コンパイラ３０２は、例えば、命令３３２のオペランドを適切に確定することができ、命令３３２を生成することができる。
【０１６２】
ところが、第３比較例では、どの言語の文字列リテラルが実行時に参照されるのかが、コンパイル時には不明である。この不確定性が、第３比較例において命令生成が失敗する原因である。仮に、コンパイラ４０２が図５のＲＯ領域４０４のように日本語と英語と中国語の文字列リテラルを配置することができるとしても、コンパイラ４０２は、それらの文字列リテラルを参照するための適切な命令を生成することには失敗してしまう。
【０１６３】
例えば、ソースファイル４０１に含まれる"勤続年数"という日本語の文字列リテラルに対応して、コンパイラ４０２は、ＲＯ領域４０４内に以下のように３種類の言語の文字列リテラルを配置することが可能である。
【０１６４】
・１０４〜１１１バイト目："勤続年数"という日本語の文字列リテラル
・１１２〜１２８バイト目："Length of Service"という英語の文字列リテラル
・１２９〜１３２バイト目：
2015194862.tif 000016
という中国語の文字列リテラル
【０１６５】
しかし、上記３つの文字列リテラルのうちのいずれが実行時に参照されるのかは、コンパイラ４０２にとって不明である。したがって、コンパイラ４０２は、以下の３つの命令のうちのどれを生成すべきなのかを決められない。
【０１６６】
・"勤続年数"という日本語の文字列リテラルの開始アドレスを、レジスタＲｅｇ１に設定するための、"Mov Reg1, [BaseReg+104]"という命令
・"Length of Service"という英語の文字列リテラルの開始アドレスを、レジスタＲｅｇ１に設定するための、"Mov Reg1, [BaseReg+112]"という命令
・
2015194862.tif 000017
という中国語の文字列リテラルの開始アドレスを、レジスタＲｅｇ１に設定するための、"Mov Reg1, [BaseReg+129]"という命令
【０１６７】
以上の例から分かるように、第３比較例では、仮にコンパイラ４０２が図５のようにＲＯ領域４０４内に日本語と英語と中国語の文字列リテラルを配置することができるとしても、コンパイラ４０２は命令のオペランドを決められない。その結果、第３比較例では、コンパイラ４０２は、文字列リテラルを参照するための命令の生成に失敗する。つまり、第３比較例のようなアプローチでは、文字列リテラルを参照するための有効な命令を含むオブジェクトコードの生成に失敗する。
【０１６８】
したがって、第１・第２比較例の欠点を克服するには、第３比較例とは別のアプローチをとることが有益である。上記の第１実施形態および下記の各種実施形態では、第３比較例とは別のアプローチがとられているので、第３比較例のような失敗は避けられる。また、上記の第１実施形態および下記の各種実施形態によれば、第１・第２比較例の欠点が克服され、かつ、第２・第３比較例に関して説明した上述の時間短縮効果と同様の効果も得られる。第１実施形態を含む各種の実施形態の効果については、後に再び述べる。
【０１６９】
続いて、図６〜１３を参照して第２実施形態について説明する。
図６は、第２実施形態の概要を説明する図である。図６には、第２実施形態によるコンパイラ５００と、コンパイラ５００が入力として受け取るソースファイル５０１およびロケールリソースファイル５０２と、コンパイラ５００が出力するオブジェクトファイル５０３が示されている。コンパイラ５００の詳細は後述する。
【０１７０】
ソースファイル５０１は、図３のソースファイル３０１および図５のソースファイル４０１と同じである。具体的には、ソースファイル５０１には、言語非依存の"20131226"および"G8-2"という文字列リテラルと、"富士通太郎"、"基本給"、"職責給"、"勤続年数"という日本語の文字列リテラルが含まれる。
【０１７１】
ロケールリソースファイル５０２には、複数のロケールに対応する文字列リテラルの組（tuple）が、複数記憶されている。具体的には、図６のロケールリソースファイル５０２は、"en-us"と"zh-cn"と"ja"という３つのロケール名により識別される３種類のロケールに対応する。換言すれば、ロケールリソースファイル５０２では、３種類のロケールに対応する３種類の言語の文字列リテラルの組み合わせであるリテラル組が、定義されている。
【０１７２】
なお、"en-us"というロケール名は、アメリカ合衆国の英語を表し、０ｘ０４０９という１６進数で表されるＬＣＩＤ（locale identifier）に対応する。また、"zh-cn"は中華人民共和国の中国語を表し、０ｘ０８０４という１６進数で表されるＬＣＩＤに対応する。そして、"ja"は日本語を表し、０ｘ０４１１という１６進数で表されるＬＣＩＤに対応する。
【０１７３】
ＬＣＩＤは、Windows（登録商標）ＯＳでロケールを識別するために使われる識別子である。ＬＣＩＤを取得するためのＡＰＩも提供されている。
【０１７４】
以下では説明の便宜上、ＬＣＩＤによりロケールが識別されるものとするが、Windows（登録商標）以外のＯＳでも、ロケールを識別するための類似の識別子が使われる。よって、第２実施形態は、開発環境のＯＳや実行環境のＯＳによらず、適用可能である。
【０１７５】
ロケールリソースファイル５０２のデータ形式は、実施形態に応じて適宜定められていてよい。図６では便宜上、ロケールリソースファイル５０２がテーブル形式で示されている。
【０１７６】
ロケールリソースファイル５０２のヘッダには、ロケールリソースファイル５０２で文字列リテラルが定義される言語に対応するロケールの名前が記録されている。図６の例では、"en-us"と"zh-cn"と"ja"という３つのロケール名が、ヘッダに指定されている。ロケール名の代わりにＬＣＩＤがヘッダで指定されていてもよい。
【０１７７】
ロケールリソースファイル５０２の個々のレコードは、文字列リテラルの組に対応する。各レコードには識別子（図６の例では識別番号）が割り当てられている。
【０１７８】
例えば、１という識別番号が割り当てられたレコードは、"Fujitsu Taro"という英語の文字列リテラルと、"富士通太郎"という中国語の文字列リテラルと、"富士通太郎"という日本語の文字列リテラルを含む。これら３つの文字列リテラルは、互いに対応する意味を持つ。
【０１７９】
また、２という識別番号が割り当てられたレコードは、"Base Salary"という英語の文字列リテラルと、
2015194862.tif 000018
という中国語の文字列リテラルと、"基本給"という日本語の文字列リテラルを含む。これら３つの文字列リテラルは、互いに対応する意味を持つ。
【０１８０】
そして、３という識別番号が割り当てられたレコードは、"Responsibility Salary"という英語の文字列リテラルと、
2015194862.tif 000019
という中国語の文字列リテラルと、"職責給"という日本語の文字列リテラルを含む。これら３つの文字列リテラルは、互いに対応する意味を持つ。
【０１８１】
また、４という識別番号が割り当てられたレコードは、"Length of Service"という英語の文字列リテラルと、
2015194862.tif 000020
という中国語の文字列リテラルと、"勤続年数"という日本語の文字列リテラルを含む。これら３つの文字列リテラルは、互いに対応する意味を持つ。
【０１８２】
なお、実施形態によっては、ロケールリソースファイル５０２が、物理的には複数のファイルの集まりであってもよい。例えば、ロケールリソースファイル５０２が、以下の３つのファイルの集まりであってもよい。
【０１８３】
・"en-us"というロケール名に対応するファイル（具体的には識別番号と英語の文字列リテラルの組を含むファイル）。
・"zh-cn"というロケール名に対応するファイル（具体的には識別番号と中国語の文字列リテラルの組を含むファイル）。
・"ja"というロケール名に対応するファイル（具体的には識別番号と日本語の文字列リテラルの組を含むファイル）。
【０１８４】
なお、複数のファイルの文字エンコーディング方式（character encoding scheme；ＣＥＳ）は互いに異なっていてもよい。例えば、"ja"というロケール名に対応するファイルでは、シフトＪＩＳ（Japanese industrial standard）が使われてもよく、他の２つのファイルではシフトＪＩＳ以外のＣＥＳが使われてもよい。
【０１８５】
逆に、複数のファイルのＣＥＳが同じであってもよい。例えば、複数のファイルでＵＴＦ−８（UCS transformation format 8；UCSは、universal multiple-octet coded character setの略）が使われてもよい。
【０１８６】
あるいは、１つのロケールリソースファイル５０２の中で、ロケールごとに別のＣＥＳが使われてもよい。ＣＥＳに応じて、１文字に対応するバイト数は異なり得る（例えば、シフトＪＩＳでは２バイトで表される文字が、ＵＴＦ−８では３バイトで表される場合がある）。
【０１８７】
オブジェクトファイル５０３は、文字列リテラルが配置されるＲＯ領域と、複数の命令を含む。ＲＯ領域は、言語非依存の文字列リテラル用の部分と、言語依存の文字列リテラル用の部分を含む。紙幅の都合上、図６には、ＲＯ領域と１つの命令だけが例示されている。オブジェクトファイル５０３に含まれる複数の命令の詳細は、図１０〜１１とともに後述する。図６に例示されている命令は、図１１の命令８３７である。
【０１８８】
オブジェクトファイル５０３のＲＯ領域のうち、言語非依存の文字列リテラル用の領域には、ロケールによらず共通に使われる文字列リテラルが、ソースファイル５０１での出現順に、配置される。
【０１８９】
具体的には、ソースファイル５０１には、まず"20131226"という言語非依存の文字列リテラルが出現し、その後、"G8-2"という言語非依存の文字列リテラルが出現する。よって、オブジェクトファイル５０３内の言語非依存の文字列リテラル用の領域において、０〜７バイト目には"20131226"という文字列リテラルが配置され、８〜１１バイト目には"G8-2"という文字列リテラルが配置される。
【０１９０】
以下では説明の便宜上、ソースファイル５０１に含まれる言語非依存の文字列リテラルのバイト長の合計を、「Ｘバイト」と表記する。よって、オブジェクトファイル５０３のＲＯ領域のうち、言語非依存の文字列リテラルが配置される領域の長さは、Ｘバイトである。
【０１９１】
また、第２実施形態では、ロケールリソースファイル５０２で定義される各リテラル組に属する３つの文字列リテラルのうちで最長の文字列リテラルのバイト長が、当該リテラル組に対応する「算出バイト長」（第１実施形態での説明を参照）として使われる。以下では説明の便宜上、ソースファイル５０１に出現する文字列リテラルに対応してロケールリソースファイル５０２で定義される全リテラル組の算出バイト長の合計を、「Ｙバイト」と表記する。
【０１９２】
よって、ＲＯ領域のうち、言語依存の文字列リテラルが配置される領域の長さは、３Ｙバイトである。図１の表記法によれば、図６では、Ｎ＝３であり、かつ、Ｙ＝Ｂ１＋…＋ＢＭである。
【０１９３】
以下では説明の便宜上、ＲＯ領域の開始アドレスが（１バイト目ではなく）「０バイト目」とカウントされるものとする。したがって、オブジェクトファイル５０３のＲＯ領域のＸバイト目から（Ｘ＋３Ｙ−１）バイト目までの範囲に、言語依存の文字列リテラルが配置される。
【０１９４】
具体的には、以下のとおり、Ｘ〜（Ｘ＋Ｙ−１）バイト目までの範囲に、英語の文字列リテラルが配置される。なお、第２実施形態では、算出バイト長より短い文字列リテラルは、空白文字（space character）でパディングされて（詳しくは後述）、ＲＯ領域内に配置される。偶然にも図６の例では、英語の各文字列リテラルは、対応する算出バイト長と同じ長さなので、パディングされていない。
【０１９５】
・（Ｘ＋０）〜（Ｘ＋１１）バイト目："Fujitsu Taro"
・（Ｘ＋１２）〜（Ｘ＋２２）バイト目："Base Salary"
・（Ｘ＋２３）〜（Ｘ＋４３）バイト目："Responsibility Salary"
・（Ｘ＋４４）〜（Ｘ＋６０）バイト目："Length of Service"
【０１９６】
そして、以下のとおり、（Ｘ＋Ｙ）〜（Ｘ＋２Ｙ−１）バイト目までの範囲に、中国語の文字列リテラルが配置される。なお、図示の便宜上、図６（および後述の図１４）では、空白文字によりパディングされた各バイトを示すセルには、点線の斜線が引かれている。
【０１９７】
・（Ｘ＋Ｙ＋０）〜（Ｘ＋Ｙ＋１１）バイト目："富士通太郎"
・（Ｘ＋Ｙ＋１２）〜（Ｘ＋Ｙ＋２２）バイト目：
2015194862.tif 000021
・（Ｘ＋Ｙ＋２３）〜（Ｘ＋Ｙ＋４３）バイト目：
2015194862.tif 000022
・（Ｘ＋Ｙ＋４４）〜（Ｘ＋Ｙ＋６０）バイト目：
2015194862.tif 000023
【０１９８】
さらに、以下のとおり、（Ｘ＋２Ｙ）〜（Ｘ＋３Ｙ−１）バイト目までの範囲に、日本語の文字列リテラルが配置される。
【０１９９】
・（Ｘ＋２Ｙ＋０）〜（Ｘ＋２Ｙ＋１１）バイト目："富士通太郎"
・（Ｘ＋２Ｙ＋１２）〜（Ｘ＋２Ｙ＋２２）バイト目："基本給"
・（Ｘ＋２Ｙ＋２３）〜（Ｘ＋２Ｙ＋４３）バイト目："職責給"
・（Ｘ＋２Ｙ＋４４）〜（Ｘ＋２Ｙ＋６０）バイト目："勤続年数"
【０２００】
例えば、（Ｘ＋２３）〜（Ｘ＋４３）バイト目と、（Ｘ＋Ｙ＋２３）〜（Ｘ＋Ｙ＋４３）バイト目と、（Ｘ＋２Ｙ＋２３）〜（Ｘ＋２Ｙ＋４３）バイト目は、ソースファイル５０１中に出現する"職責給"という日本語の文字列リテラルに対応する。（Ｘ＋２３）バイト目、（Ｘ＋Ｙ＋２３）バイト目、（Ｘ＋２Ｙ＋２３）バイト目という、３つの言語の文字列リテラルそれぞれの開始アドレスの共通点は、２３というオフセットである。オフセットが共通な理由は、各リテラル組に属する３つの文字列リテラルには同じ算出バイト数が割り当てられるためである。
【０２０１】
図６には、上記の共通のオフセットを含むオペランド（すなわち"[BaseReg+Reg2+23]"というオペランド）が指定された命令が例示されている。詳しくは後述するとおり、レジスタＲｅｇ２には、実行時のロケールに応じた値が設定される。よって、"Mov Reg3, [BaseReg+Reg2+23]"という１つの共通の命令にしたがって、実行時のロケールに応じた適宜の言語（すなわち、英語、中国語または日本語）の文字列リテラルの開始アドレスが参照される。オペランドが不定な第３比較例とは異なり、第２実施形態のコンパイラ５００は、コンパイル時に２３という値を確定することができるので、以上のように適切な命令を生成することができる。
【０２０２】
なお、図６では、省略符号により、「言語依存または言語非依存の他の１つ以上の文字列リテラルがソースファイル５０１にさらに含まれる」という可能性が示されている。しかし、もし仮に、ソースファイル５０１内に、図６には明示されていない他の文字列リテラルが含まれないならば、Ｘ＝８＋４＝１２であり、かつ、Ｙ＝１２＋１１＋２１＋１７＝６１である。
【０２０３】
図７は、第２実施形態のコンパイラのブロック構成図である。図７には、コンパイラ５００だけでなく、コンパイラ５００が入力として受け取るソースファイル５０１およびロケールリソースファイル５０２も示されている。さらに、図７には、コンパイラ５００が出力するオブジェクトファイル５０３と、その他のオブジェクトファイル５０４および５０５と、リンカ５０６と、実行ファイル５０７も示されている。
【０２０４】
ソースファイル５０１とロケールリソースファイル５０２の詳細は、例えば、図６に示すとおりであってもよい。また、オブジェクトファイル５０３の詳細は、例えば、図６および後述の図１０〜１１に示すとおりであってもよい。リンカ５０６は、オブジェクトファイル５０３〜５０５をリンクすることにより実行ファイル５０７を生成する。
【０２０５】
コンパイラ５００は、解析部６００を有する。解析部６００は、字句解析（lexical analysis）部６０１と、構文解析（syntactic analysis）部６０２と、意味解析（semantic analysis）部６０３を含む。意味解析部６０３は、手続き解析部６０４とリテラル登録部６０５を含む。コンパイラ５００はさらに、割り付け（allocation）部６０６とオブジェクトコード生成部６０７を含む。オブジェクトコード生成部６０７はリテラル配置部６０８を含む。オブジェクトコード生成部６０７は、不図示のコード最適化部を含んでいてもよい。
【０２０６】
また、図７には、コンパイラ５００がコンパイル処理を実行している最中に作成および使用する、一時的なデータも例示されている。具体的には、コンパイラ５００は、言語非依存リテラル一覧６０９を作成および使用する。また、図６に示すようにロケールリソースファイル５０２において英語と中国語と日本語の文字列リテラルが定義されている場合、コンパイラ５００は、日本語リテラル一覧６１０と英語リテラル一覧６１１と中国語リテラル一覧６１２を作成および使用する。また、詳しくは後述するとおり、コンパイラ５００は、オフセット一覧６１３も作成および使用する。なお、図７中に例示したこれらの一覧の具体例は、図９とともに後述する。
【０２０７】
コンパイラ５００の動作の詳細は、図１２〜１３とともに後述するが、概要は以下のとおりである。
【０２０８】
字句解析部６０１は、ソースファイル５０１に書かれたソースコードをスキャンして解析する。つまり、字句解析部６０１は、ソースコードの文字列からトークン列を認識する。
【０２０９】
構文解析部６０２はトークン列を解析（parse）し、それにより、構文木（parse tree）を生成する。
【０２１０】
意味解析部６０３は、構文木をトラバースし、構文木の意味を解析（analyze）する。具体的には、意味解析部６０３は、ソースファイル５０１中に出現するシンボル（例えば、変数、定数、関数等の名称）の一覧（list）を作成したり、リテラルの一覧を作成したりする。また、意味解析部６０３は、型チェックなどの整合性チェックを行ってもよい。このように、意味解析部６０３が行う解析は複数種類の処理を含むので、意味解析部６０３は複数のモジュールを含んでいてよい。図６には、複数のモジュールのうちの２つ（すなわち手続き解析部６０４とリテラル登録部６０５）が示されている。
【０２１１】
手続き解析部６０４は、ソースコード中のステートメントを順に解析してもよい。例えば、手続き解析部６０４は、構文木を適宜の順序（例えば後順（post-order））でトラバースしてもよい。それにより、手続き解析部６０４は、例えば、ステートメント間の入れ子構造や、関数の呼び出し元（caller）と呼び出される関数との関係を解析してもよい。
【０２１２】
リテラル登録部６０５は、ソースコード中に現れるリテラルを、適宜のリテラル一覧に登録する。また、リテラル一覧への登録の際、リテラル登録部６０５は、オフセット一覧６１３にオフセットも登録する。
【０２１３】
割り付け部６０６は、レジスタの割り付けを行う（つまり、どの命令でどのレジスタを使うかを決定する）。また、割り付け部６０６は、オブジェクトコード内の各領域（例えば、リテラルを記憶するためのＲＯ領域や、命令列を記憶するための領域など）のバイト数も決定する。
【０２１４】
そして、意味解析部６０３と割り付け部６０６による処理の結果に基づいて、オブジェクトコード生成部６０７が、オブジェクトコードを生成する。オブジェクトコード生成部６０７は、生成したオブジェクトコードをオブジェクトファイル５０３として出力する。なお、リテラル配置部６０８は、オブジェクトコードの生成する処理のうち、リテラルをオブジェクトコードのＲＯ領域内に配置する処理を行う。
【０２１５】
ところで、図６〜７のコンパイラ５００は、具体的には、コンパイラ・プログラムを実行するコンピュータにより実現されるコンパイル装置であってもよい。具体的には、コンパイル装置は、コンパイル対象のソースファイル５０１と、リテラル組を定義するロケールリソースファイル５０２とに基づいて、オブジェクトファイル５０３を生成する生成部（例えばオブジェクトコード生成部６０７）を有する装置である。
【０２１６】
コンパイラ５００内の解析部６００やオブジェクトコード生成部６０７等の各部は、具体的には、コンパイラ・プログラムに含まれるプログラム・モジュールをコンピュータが実行することにより実現されてもよい。コンパイラ・プログラムを実行するコンピュータは、具体的には、図８のコンピュータ７００であってもよい。なお、コンパイラ・プログラムのことを単にコンパイラともいう。
【０２１７】
図８は、コンピュータ７００のハードウェア構成図である。コンピュータ７００は、ＣＰＵ（Central Processing Unit）７０１と、ＲＯＭ（Read-Only Memory）７０２と、ＲＡＭ（Random-Access Memory）７０３と、通信インタフェイス７０４を有する。コンピュータ７００はさらに、入力装置７０５と、出力装置７０６と、記憶装置７０７と、可搬型記憶媒体７１０の駆動装置７０８を有する。コンピュータ７００内の各コンポーネントは、バス７０９を介して互いに接続されている。
【０２１８】
また、コンピュータ７００はネットワーク７１１に接続されている。ネットワーク７１１は、例えば、ＬＡＮ（Local Area Network）、ＷＡＮ（Wide Area Network）、インターネット、またはその組み合わせである。ネットワーク７１１にはさらに、プログラム提供者７１２が接続されていてもよい。プログラム提供者７１２は、プログラムを提供するためのコンピュータである。
【０２１９】
図７には１つのＣＰＵ７０１のみが図示されているが、コンピュータ７００は複数のＣＰＵ７０１を有していてもよい。また、ＣＰＵ７０１は、シングルコアＣＰＵでもよいしマルチコアＣＰＵでもよい。ＣＰＵ７０１はプロセッサの一例である。
【０２２０】
ＣＰＵ７０１は、プログラムをＲＡＭ７０３にロードし、ＲＡＭ７０３をワーキングエリアとしても使いながらプログラムを実行する。ＲＯＭ７０２には、例えば、ＢＩＯＳ（Basic Input Output System）などのファームウェアが記憶されていてもよい。
【０２２１】
通信インタフェイス７０４は、例えば、有線ＬＡＮインタフェイス回路、無線ＬＡＮインタフェイス回路、またはその組み合わせである。通信インタフェイス７０４は、具体的には、外付けのＮＩＣ（Network Interface Card）でもよいし、オンボード型のネットワークインタフェイスコントローラでもよい。例えば、通信インタフェイス７０４は、物理層の処理を行う「ＰＨＹチップ」と呼ばれる回路と、ＭＡＣ（Media Access Control）副層の処理を行う「ＭＡＣチップ」と呼ばれる回路を含んでいてもよい。
【０２２２】
入力装置７０５は、例えば、キーボード、ポインティングデバイス、マイク、カメラ、またはそれらの２つ以上の組み合わせである。ポインティングデバイスは、例えば、マウスでもよいしタッチパッドでもよいしタッチスクリーンでもよい。
【０２２３】
出力装置７０６は、ディスプレイ、スピーカ、またはその組み合わせである。ディスプレイはタッチスクリーンであってもよい。
【０２２４】
記憶装置７０７は不揮発性である。具体的には、記憶装置７０７は、例えば、ＨＤＤ（Hard Disk Drive）、ＳＳＤ（Solid-State Drive）、またはその組み合わせである。
【０２２５】
可搬型記憶媒体７１０の例は、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disk）などの光ディスク、光磁気ディスク、磁気ディスク、フラッシュメモリなどの半導体メモリカードなどである。駆動装置７０８は、具体的には、光ディスク駆動装置、光磁気ディスク駆動装置、または磁気ディスク駆動装置であってもよい。あるいは、駆動装置７０８は、メモリカード用のリーダおよびライタであってもよい。
【０２２６】
コンピュータ７００をコンパイラ５００として動作させるためのコンパイラ・プログラムは、予め記憶装置７０７にインストールされていてもよい。あるいは、コンパイラ・プログラムは、可搬型記憶媒体７１０に格納されて提供され、可搬型記憶媒体７１０から駆動装置７０８により読み取られて記憶装置７０７にインストールされてもよい。または、コンパイラ・プログラムは、プログラム提供者７１２により提供され、ネットワーク７１１と通信インタフェイス７０４を介してコンピュータ７００にダウンロードされ、記憶装置７０７にインストールされてもよい。
【０２２７】
なお、ＲＯＭ７０２、ＲＡＭ７０３、記憶装置７０７、可搬型記憶媒体７１０は、いずれも、有形の（tangible）記憶媒体の例である。これらの有形の記憶媒体は、信号搬送波のような一時的な（transitory）媒体ではない。
【０２２８】
コンパイラ・プログラムを実行することによってコンピュータ７００がコンパイラ５００として動作する場合、具体的には、解析部６００、割り付け部６０６、およびオブジェクトコード生成部６０７は、ＣＰＵ７０１により実現される。また、言語非依存リテラル一覧６０９、日本語リテラル一覧６１０、英語リテラル一覧６１１、中国語リテラル一覧６１２、およびオフセット一覧６１３は、ＲＡＭ７０３に記憶されるのが好ましいが、記憶装置７０７に記憶されてもよい。
【０２２９】
なお、ソースファイル５０１とロケールリソースファイル５０２は、例えば、記憶装置７０７に予め記憶されていてもよい。コンパイラ５００は、オブジェクトファイル５０３を記憶装置７０７に出力してもよい。オブジェクトファイル５０４と５０５も、記憶装置７０７に記憶されていてよい。
【０２３０】
リンカ５０６も、ＣＰＵ７０１がプログラムを実行することで実現される。リンカ５０６は、実行ファイル５０７を記憶装置７０７に出力してもよい。実行ファイル５０７は、コンピュータ７００上で実行されてもよいし、他のコンピュータ（例えばエンドユーザのコンピュータ）にコピーされて実行されてもよい。
【０２３１】
さて、図９は、第２実施形態で使われるデータを例示する図である。図９には、図６に例示したソースファイル５０１とロケールリソースファイル５０２をコンパイラ５００が入力として受け取った場合の、各種一覧が例示されている。
【０２３２】
具体的には、言語非依存リテラル一覧６０９の各レコードは、「ＩＤ」（identifier）、「票長」（record length）、「項類」（category）、「長さ」、「オフセット」、「値」という６つのフィールドを持つ。「ＩＤ」はレコードに割り当てられた識別子である。「票長」はレコードの長さ（つまり６つのフィールドの長さの和）を示す。
【０２３３】
「値」のフィールドには、言語に依存しないリテラルが記憶される。「項類」は、リテラルの種類を示す。図９の例では、数値（numerical）リテラルの項類は"1"と表され、言語に依存せず使われる共通の英数字（alphanumeric）リテラルの項類は"2"と表され、言語依存の文字列リテラルの項類は"3"と表されている。
【０２３４】
「長さ」のフィールドには、「値」のフィールドに記憶されたリテラルのバイト長が記憶される。また、ｉ番目のレコードの「オフセット」のフィールドには、１番目から（ｉ−１）番目のレコードの、「長さ」のフィールドの値の和が記憶される（１＜ｉ）。１番目のレコードの「オフセット」は０である。
【０２３５】
図９には、「ＩＤ」、「票長」、「項類」、「長さ」、および「オフセット」のフィールドのバイト長が、それぞれ、６、２、２、２、２バイトである例が示されている。
【０２３６】
１番目のレコードの値は"20131226"という８バイトの数値リテラルなので、１番目のレコードの票長、項類、長さは、それぞれ２２、１、８である。また、１番目のレコードには"A00001"というＩＤが割り当てられている。
【０２３７】
２番目のレコードの値は"B8-2"という４バイトの英数字リテラルなので、２番目のレコードの票長、項類、長さは、それぞれ１８、２、４である。また、２番目のレコードには"A00002"というＩＤが割り当てられている。２番目のレコードのオフセットは８である。
【０２３８】
日本語リテラル一覧６１０には、ロケールリソースファイル５０２に記憶されている日本語の文字列リテラルが登録される。日本語リテラル一覧６１０の各レコードは、「ＩＤ」、「票長」、「項類」、「値」という４つのフィールドを持つ。
【０２３９】
図９には、「ＩＤ」、「票長」、および「項類」のフィールドのバイト長が、それぞれ、６、２、２バイトである例が示されている。日本語リテラル一覧６１０のどのレコードにおいても、項類は"3"である。
【０２４０】
図９の例では、日本語リテラル一覧６１０の１〜４番目のレコードには、"B00001"、"B00002"、"B00003"、"B00004"というＩＤが割り当てられている。また、１〜４番目のレコードの値のフィールドには、"富士通太郎"、"基本給"、"職責給"、"勤続年数"という日本語の文字列リテラルがそれぞれ記憶されている。これら４つの文字列リテラルのバイト長は、それぞれ、１０、６、６、８バイトである。票長はレコードの長さ（つまり４つのフィールドの長さの和）を示すので、例えば、３番目のレコードの票長は、１６（＝６＋２＋２＋６）である。
【０２４１】
英語リテラル一覧６１１には、ロケールリソースファイル５０２に記憶されている英語の文字列リテラルが登録される。英語リテラル一覧６１１の形式は、日本語リテラル一覧６１０と同じである。英語リテラル一覧６１１においても、各レコードの項類は"3"である。
【０２４２】
図９の例では、英語リテラル一覧６１１の１〜４番目のレコードには、"C00001"、"C00002"、"C00003"、"C00004"というＩＤが割り当てられている。また、１〜４番目のレコードの値のフィールドには、"Fujitsu Taro"、"Base Salary"、"Responsibility Salary"、"Length of Service"という英語の文字列リテラルがそれぞれ記憶されている。これら４つの文字列リテラルのバイト長は、それぞれ、１２、１１、２１、１７バイトである。
【０２４３】
中国語リテラル一覧６１２には、ロケールリソースファイル５０２に記憶されている中国語の文字列リテラルが登録される。中国語リテラル一覧６１２の形式も、日本語リテラル一覧６１０と同じである。中国語リテラル一覧６１２においても、各レコードの項類は"3"である。
【０２４４】
図９の例では、中国語リテラル一覧６１２の１〜４番目のレコードには、"D00001"、"D00002"、"D00003"、"D00004"というＩＤが割り当てられている。また、１〜４番目のレコードの値のフィールドには、"富士通太郎"、
2015194862.tif 000024
、
2015194862.tif 000025
、
2015194862.tif 000026
という中国語の文字列リテラルがそれぞれ記憶されている。これら４つの文字列リテラルのバイト長は、それぞれ、１０、８、８、４バイトである。
【０２４５】
ところで、以上例示したとおり、第２実施形態では、各言語の文字列リテラル一覧で使われる各ＩＤは、"B"、"C"、"D"などの言語に応じたプレフィックスと、"00002"などのサフィックスとの組み合わせである。そして、第２実施形態では、互いに対応する意味の複数の文字列リテラルのＩＤ同士のサフィックスは、互いに等しい。サフィックスは、ソースファイル５０１における出現順を示す。
【０２４６】
例えば、"B00002"というＩＤで識別される日本語の文字列リテラルと、"C00002"というＩＤで識別される英語の文字列リテラルと、"D00002"というＩＤで識別される中国語の文字列リテラルは、互いに対応する意味を持つ。また、これら３つの文字列リテラルのＩＤ同士は、"00002"という共通のサフィックスを含む。"00002"というサフィックスは、ソースファイル５０１に出現する言語依存の文字列リテラルのうち、２番目の文字列リテラルに対応する。
【０２４７】
上記のようなサフィックスが、オフセット一覧６１３の各レコードを識別するＩＤとして使われる。ＩＤのほかに、オフセット一覧６１３の各レコードは、「最大長」と「オフセット」というフィールドも含む。
【０２４８】
オフセット一覧６１３のＩＤ（例えば"00002"）をサフィックスとして含むＩＤ（例えば"B00002"と"D00002"と"D00002"）により識別される複数の文字列リテラルのバイト長のうちの最大値が、オフセット一覧６１３の「最大値」のフィールドに記憶される。「最大値」のフィールドに記憶された値は、図１に関して説明した「算出バイト長」として使われる。
【０２４９】
また、オフセット一覧６１３のｉ番目のレコードの「オフセット」のフィールドには、１番目から（ｉ−１）番目のレコードの「最大長」のフィールドの値の和が記憶される（１＜ｉ）。１番目のレコードのオフセットは０である。
【０２５０】
例えば、１番目のレコードのＩＤは"00001"である。つまり、オフセット一覧６１３の１番目のレコードは、日本語リテラル一覧６１０と英語リテラル一覧６１１と中国語リテラル一覧６１２のそれぞれにおいて"00001"というサフィックスを含むＩＤで識別されるレコードと対応づけられている。
【０２５１】
"B00001"と"C00001"と"D00001"というＩＤで識別される３つの言語の３つの文字列リテラルのバイト長は、上記のとおり、それぞれ、１０、１２、１０である。よって、オフセット一覧６１３の１番目のレコードの「最大長」のフィールドには、１２（すなわち、１０、１２、１０という３つの値のうちの最大値）が記憶される。
【０２５２】
また、２番目のレコードのＩＤは"00002"である。２番目のレコードの「最大長」のフィールドには、１１（すなわち、６、１１、８という３つの値のうちの最大値）が記憶される。２番目のレコードの「オフセット」のフィールドには、１番目のレコードの「最大長」と同じ、１２という値が記憶される。
【０２５３】
３番目のレコードのＩＤは"00003"である。３番目のレコードの「最大長」のフィールドには、２１（すなわち、６、２１、８という３つの値のうちの最大値）が記憶される。３番目のレコードの「オフセット」のフィールドには、１〜２番目のレコードの「最大長」のフィールドの値の和である２３（＝１２＋１１）という値が記憶される。
【０２５４】
４番目のレコードのＩＤは"00004"である。４番目のレコードの「最大長」のフィールドには、１７（すなわち、８、１７、４という３つの値のうちの最大値）が記憶される。４番目のレコードの「オフセット」のフィールドには、１〜３番目のレコードの「最大長」のフィールドの値の和である４４（＝１２＋１１＋２１）という値が記憶される。
【０２５５】
オフセット一覧６１３の最大長は、図１に関して説明した「算出バイト長」の例である。図１の表記法によれば、図９に示した４つの最大長は、Ｂ１＝１２、Ｂ２＝１１、Ｂ３＝２１、Ｂ４＝１７と表現される。
【０２５６】
また、説明の便宜上、オフセット一覧６１３のｉ番目のレコードのオフセットをＯｉと表記することにする。オフセット一覧６１３は、Ｏ１＝０、Ｏ２＝Ｂ１＝１２、Ｏ３＝Ｂ１＋Ｂ２＝２３、Ｏ４＝Ｂ１＋Ｂ２＋Ｂ３＝４４であることを示している。
【０２５７】
続いて、オブジェクトファイル５０３に含まれる命令列について説明する。オブジェクトファイル５０３は、図６に示したように、文字列リテラルが配置されたＲＯ領域を含む。ＲＯ領域の後に、命令列を記憶するための領域がある。図１０〜１１は、第２実施形態で生成される命令列を例示する図である。
【０２５８】
なお、実際には、オブジェクトファイル５０３に含まれる個々の命令は、所定の命令セットに含まれるマシン語命令（machine language instruction）である。しかし、図１０〜１１では、理解の助けとするために、マシンコードに対応するアセンブリコードが示されている。後述の図１５も同様である。
【０２５９】
コンパイラ５００（より具体的にはオブジェクトコード生成部６０７）は、まず図１０〜１１に示すようなアセンブリコードを生成してもよく、その後、生成したアセンブリコードをマシンコードに変換してもよい。実施形態によっては（例えばコンパイラ５００に与えられるコマンドオプションによっては）、コンパイラ５００は、マシン語で記述されたオブジェクトファイル５０３の代わりに、アセンブリコードのファイルを生成してもよい。
【０２６０】
図１０において、".TXT Section"というラベル８００は、命令列用の領域の開始を示し、"Prologue"というラベル８０１は、プロローグの開始を示す。プロローグには、初期化のための命令列が含まれる。
【０２６１】
プロローグにおいて、"LocaleJudgment"というラベル８０２から"EndLocaleJudgment"というラベル８２３までの部分が、実行時のロケールに応じた値をレジスタに記憶するための処理に対応する。詳細は以下のとおりである。
【０２６２】
命令８０３は、第２オペランドにより指定されるアドレスを、レジスタＲｅｇ０にロードするためのＬＥＡ（Load Effective Address）命令である。図１０で便宜上"GetLocaleReturnAddr"と示されている第２オペランドは、具体的には、ＬＣＩＤを取得するためのＡＰＩ関数の返り値が格納される領域を示すアドレスである。
【０２６３】
命令８０４は、ＬＣＩＤを取得するためのＡＰＩ関数を呼び出すサブルーチンコールを示す。ＡＰＩ関数の実行後、命令８０５が実行される。
【０２６４】
命令８０５は、レジスタＲｅｇ０が保持するアドレス（つまり、図１０では便宜上"GetLocaleReturnAddr"と示されているアドレス）に記憶されている値を、レジスタＲｅｇ１にロードするための命令である。命令８０５の実行により、実行環境におけるＬＣＩＤの値が、レジスタＲｅｇ１に記憶される。
【０２６５】
ところで、図６のロケールリソースファイル５０２では、"en-us"と"zh-cn"と"ja"というロケール名で識別される３つのロケールで使われる文字列リテラルが定義されている。図１０には、これら３つのロケールに対応する３つのラベル８０６、８１１、および８１６が示されている。
【０２６６】
図１０では、"English"というラベル８０６に続いて、「実行時のＬＣＩＤが０ｘ０４０９と等しいか否かをチェックし、両者が等しければレジスタＲｅｇ２に０を設定する」という処理のための命令８０７〜８１０が配置されている。０ｘ０４０９は、"en-us"というロケール名に対応するＬＣＩＤである。
【０２６７】
命令８０７は、レジスタＲｅｇ１の値（つまり実行時のＬＣＩＤ）と０ｘ０４０９という値を比較するための命令である。次の命令８０８は、命令８０７で比較された２つの値が等しくなければ"Chinese"というラベル８１１にジャンプするための、条件分岐命令（つまり条件付きジャンプ命令）である。
【０２６８】
レジスタＲｅｇ１の値と０ｘ０４０９という値が等しければ、命令８０９が実行される。命令８０９は、レジスタＲｅｇ２に０という値を設定するための命令である。命令８０９の次に配置される命令８１０は、"EndLocaleJudgment"というラベル８２３にジャンプするための無条件分岐命令（つまり無条件ジャンプ命令）である。
【０２６９】
ラベル８１１から命令８１５までの部分は、ラベル８０６から命令８１０までの部分と類似である。具体的には、"Chinese"というラベル８１１に続いて、レジスタＲｅｇ１の値（つまり実行時のＬＣＩＤ）と０ｘ０８０４（つまり"zh-cn"というロケール名に対応するＬＣＩＤ）を比較するための命令８１２が配置される。次の命令８１３は、命令８１２で比較された２つの値が等しくなければ"Japanese"というラベル８１６にジャンプするための、条件分岐命令である。
【０２７０】
レジスタＲｅｇ１の値と０ｘ０８０４という値が等しければ、命令８１４が実行される。命令８１４は、レジスタＲｅｇ２に１という値を設定するための命令である。命令８１４の次に配置される命令８１５は、命令８１０と同じ無条件分岐命令である。
【０２７１】
ラベル８１６から命令８２０までの部分も、ラベル８０６から命令８１０までの部分と類似である。具体的には、"Japanese"というラベル８１６に続いて、レジスタＲｅｇ１の値（つまり実行時のＬＣＩＤ）と０ｘ０４１１（つまり"ja"というロケール名に対応するＬＣＩＤ）を比較するための命令８１７が配置される。次の命令８１８は、命令８１７で比較された２つの値が等しくなければ"Others"というラベル８２１にジャンプするための、条件分岐命令である。
【０２７２】
レジスタＲｅｇ１の値と０ｘ０４１１という値が等しければ、命令８１９が実行される。命令８１９は、レジスタＲｅｇ２に２という値を設定するための命令である。命令８１９の次に配置される命令８２０は、命令８１０と同じ無条件分岐命令である。
【０２７３】
命令８２０の次には、実行時のＬＣＩＤが０ｘ０４０９、０ｘ０８０４、０ｘ０４１１のいずれとも等しくない場合のデフォルトの動作が指定されている。具体的には、"Others"というラベル８２１に続いて、レジスタＲｅｇ２に０という値を設定するための命令８２２が配置されている。命令８２２は命令８０９と同じである。
【０２７４】
つまり、命令８２２によれば、実行時のＬＣＩＤが０ｘ０４０９、０ｘ０８０４、０ｘ０４１１のいずれとも等しくない場合、英語の文字列リテラルが使われることになる。以上のごとき命令８２２をオブジェクトコード生成部６０７が生成する理由は、英語に使われるラテン・アルファベットはどの環境でも使用可能だからである。つまり、第２実施形態のコンパイラ５００は、デフォルト言語を英語にすることに決め、その決定に基づいてオブジェクトコード生成部６０７が命令を生成する。
【０２７５】
命令８２２の後に"EndLocaleJudgment"というラベル８２３が配置される。以上の説明から分かるように、ロケールリソースファイル５０２のヘッダ行のｊ番目に示されているロケールと実行環境におけるロケールとが等しいとき、レジスタＲｅｇ２には、（ｊ−１）という値が設定される（１≦ｊ）。また、実行環境におけるロケールが、ロケールリソースファイル５０２のヘッダ行に示されているどのロケールとも等しくないとき、レジスタＲｅｇ２には、デフォルト値が設定される。第２実施形態でのデフォルト値は、英語を使うロケール用の値（つまり０）である。
【０２７６】
プロローグの後に、手続きの開始を示す"StartProcedure"というラベル８２４が配置されている。図１１には、図６のソースファイル５０１内の４つのＤＩＳＰＬＡＹステートメントに対応する命令８２５〜命令８４４が例示されている。
【０２７７】
命令８２５は、レジスタＲｅｇ２に記憶されている値と、Ｙ（すなわち、オフセット一覧６１３の「最大長」フィールドの値の合計）とを乗算し、乗算の結果をレジスタＲｅｇ２に記憶するための命令である。次の命令８２６は、レジスタＲｅｇ２に記憶されている値と、Ｘ（すなわち、言語非依存リテラル一覧６０９の「長さ」フィールドの値の合計）とを加算し、加算の結果をレジスタＲｅｇ２に記憶するための命令である。
【０２７８】
また、命令８２７は、オブジェクトファイル５０３に記憶されているオブジェクトコードの、実行時におけるメモリ上の開始アドレスを、ベースレジスタに設定するためのロード命令である。上記開始アドレスは、図１１では"StartAddr"と示されている。
【０２７９】
次の命令８２８は、ベースレジスタに記憶されている値と、オブジェクトコードの先頭からＲＯ領域の先頭までのオフセットとを加算し、加算の結果をベースレジスタに記憶するための命令である。命令８２５〜８２８でレジスタＲｅｇ２とベースレジスタに設定された値は、命令８２９、８３３、８３７、８４１で使われる。
【０２８０】
命令８２９〜８３２は、ソースファイル５０１に書かれた"富士通太郎"という１番目の言語依存文字列リテラルに対応する、実行時のロケールに応じた文字列リテラルを、表示するための命令である。
【０２８１】
図９のオフセット一覧６１３によれば、１番目の言語依存文字列リテラルに対応するオフセットは０である。よって、オブジェクトコード生成部６０７は、オフセット一覧６１３の１番目のレコードの「オフセット」のフィールドから０という値を読み取り、読み取った値を使って、命令８２９を生成する。
【０２８２】
命令８２９は、ベースレジスタに記憶されている値と、レジスタＲｅｇ２に記憶されている値と、０との和を、レジスタＲｅｇ３に設定するための命令である。
【０２８３】
ここで、説明の便宜上、命令８０９、８１４、８１９、または８２２によりレジスタＲｅｇ２に設定される値（つまり、実行時のロケールに応じた、０、１、または２という値）を「ｒ」と表記する。また、図９に関して説明したとおり、言語依存の文字列リテラルのうち、ソースファイル５０１内でｉ番目に出現する文字列リテラルに対応するオフセットＯｉは、ｉ＝１のとき０であり、１＜ｉのとき、（Ｂ１＋…Ｂｉ−１）である。
【０２８４】
なお、説明の簡単化のため、「言語依存の文字列リテラルのうち、ソースファイル５０１内でｉ番目に出現する文字列リテラル」を、単に「ｉ番目の文字列リテラル」ということがある（後述の第３実施形態に関する説明でも同様）。また、ソースファイル５０１内でｉ番目に出現する文字列リテラルが属するリテラル組は、ロケールリソースファイル５０２で定義されており、当該リテラル組には、複数の言語で書かれた複数の文字列リテラルが属する。これらの複数の文字列リテラルのうち、実行時のロケールに応じた言語の文字列リテラルのことを、単に「実行時のロケールに応じた言語のｉ番目の文字列リテラル」ということがある（後述の第３実施形態に関する説明でも同様）。
【０２８５】
したがって、図６、９、１０、および１１から分かるように、実行時のロケールに応じた言語のｉ番目の文字列リテラルの開始アドレスＡｉは、式（１）のように表現される。なお、「実行時のロケールに応じた言語」とは、実行環境におけるＬＣＩＤが０ｘ０４０９であれば英語、０ｘ０８０４であれば中国語、０ｘ０４１１であれば日本語、その他の値であればデフォルト言語（すなわち英語）である。
Ai = StartAddr + Offset + X + r・Y + Oi      (1)
【０２８６】
命令８２９は、実行時のロケールに応じた言語の１番目の文字列リテラルの開始アドレスＡ１を算出し、開始アドレスＡ１をレジスタＲｅｇ３に設定するための命令の例である。つまり、命令８２９の実行結果に基づいて、開始アドレスＡ１が参照される。
【０２８７】
以下では説明の便宜上、画面に文字列リテラルを表示するためのサブルーチンが、具体的には次のようなサブルーチンであるものとする。
【０２８８】
・表示対象の文字列リテラルの開始アドレスと長さを示す２つの引数をとる。
・第１の所定のレジスタ（以下「レジスタＤｉｓｐＲｅｇ１」という）に設定された値を、第１引数（すなわち文字列リテラルの開始アドレスを示す引数）としてとる。
・第２の所定のレジスタ（以下「レジスタＤｉｓｐＲｅｇ２」という）に設定された値を、第２引数（すなわち文字列リテラルの長さを示す引数）としてとる。
【０２８９】
したがって、命令８３０は、具体的には、レジスタＲｅｇ３に記憶されている値をレジスタＤｉｓｐＲｅｇ１にコピーするための命令であり、命令８３１は、１２というバイト長をレジスタＤｉｓｐＲｅｇ２にコピーするための命令である。オブジェクトコード生成部６０７は、オフセット一覧６１３の１番目のレコードの「最大長」のフィールドから、１２という値を読み取り、読み取った値を使って、命令８３１を生成する。命令８３２は、上記サブルーチンを呼び出すための命令である。
【０２９０】
命令８３３〜８３６は、ソースファイル５０１に書かれた"基本給"という２番目の言語依存文字列リテラルに対応する、実行時のロケールに応じた文字列リテラルを、表示するための命令である。例えば、命令８３３は、実行時のロケールに応じた言語の２番目の文字列リテラルの開始アドレスＡ２をレジスタＲｅｇ３に設定するための命令であり、命令８３３の実行結果に基づいて、開始アドレスＡ２が参照される。
【０２９１】
命令８３３〜８３６は、命令８２９〜８３２と類似である。命令８２９〜８３２との違いは、命令８３３と８３５のオペランドのみである。
【０２９２】
具体的には、オフセット一覧６１３の２番目のレコードの「オフセット」と「最大長」のフィールドの値がそれぞれ１２と１１なので、命令８３３のオペランドには１２という値が含まれ、命令８３５のオペランドとして１１という値が指定されている。つまり、オブジェクトコード生成部６０７は、オフセット一覧６１３の２番目のレコードに基づいて、命令８３３と８３５を生成する。
【０２９３】
命令８３７〜８４０は、ソースファイル５０１に書かれた"職責給"という３番目の言語依存文字列リテラルに対応する、実行時のロケールに応じた文字列リテラルを、表示するための命令である。例えば、命令８３７は、実行時のロケールに応じた言語の３番目の文字列リテラルの開始アドレスＡ３をレジスタＲｅｇ３に設定するための命令であり、命令８３７の実行結果に基づいて、開始アドレスＡ３が参照される。
【０２９４】
命令８３７〜８４０も、命令８２９〜８３２と類似である。命令８２９〜８３２との違いは、命令８３７と８３９のオペランドのみである。
【０２９５】
具体的には、オフセット一覧６１３の３番目のレコードの「オフセット」と「最大長」のフィールドの値がそれぞれ２３と２１なので、命令８３７のオペランドには２３という値が含まれ、命令８３９のオペランドとして２１という値が指定されている。つまり、オブジェクトコード生成部６０７は、オフセット一覧６１３の３番目のレコードに基づいて、命令８３７と８３９を生成する。
【０２９６】
命令８４１〜８４４は、ソースファイル５０１に書かれた"勤続年数"という４番目の言語依存文字列リテラルに対応する、実行時のロケールに応じた文字列リテラルを、表示するための命令である。例えば、命令８４１は、実行時のロケールに応じた言語の４番目の文字列リテラルの開始アドレスＡ４をレジスタＲｅｇ３に設定するための命令であり、命令８４１の実行結果に基づいて、開始アドレスＡ４が参照される。
【０２９７】
命令８４１〜８４４も、命令８２９〜８３２と類似である。命令８２９〜８３２との違いは、命令８４１と８４３のオペランドのみである。
【０２９８】
具体的には、オフセット一覧６１３の４番目のレコードの「オフセット」と「最大長」のフィールドの値がそれぞれ４４と１７なので、命令８４１のオペランドには４４という値が含まれ、命令８４３のオペランドとして１７という値が指定されている。つまり、オブジェクトコード生成部６０７は、オフセット一覧６１３の４番目のレコードに基づいて、命令８４１と８４３を生成する。
【０２９９】
図１０〜１１から分かるように、第２実施形態によれば、コンパイル時にオブジェクトコード生成部６０７が、命令８２９、８３３、８３７、８４１のオペランド（つまり、実行時のロケールに依存する文字列リテラルの開始アドレス）を確定することが可能である。つまり、第３比較例のような「オペランドがコンパイル時には確定不能であるために、コンパイル処理が失敗する」という問題は、第２実施形態では起きない。
【０３００】
第２実施形態において問題が回避される理由について補足すると、以下のとおりである。第２実施形態では、１つのリテラル組に属する複数の文字列リテラルに、同じバイト長（すなわちオフセット一覧６１３の「最大長」フィールドの値）が割り当てられる。その結果、実行時のロケールに応じた文字列リテラルの開始アドレスを、実行時のロケールによらない共通の値（例えば命令８３３では１２という値）をオフセットとして使って計算することが可能となる。この共通の値はコンパイル時に確定されるので、第２実施形態では、第３比較例のような問題は回避される。
【０３０１】
さて、図１２は、第２実施形態のコンパイラ５００がリテラル一覧を作成する処理のフローチャートである。図１２の処理は、字句解析部６０１による字句解析と構文解析部６０２による構文解析が終わった後で、意味解析部６０３により実行される。例えば、図６のようなソースファイル５０１とロケールリソースファイル５０２が入力として与えられると、意味解析部６０３は、図１２の処理を実行することにより、図９の５つの一覧を生成する。
【０３０２】
ステップＳ１０１で手続き解析部６０４は、最後のステートメントまで解析が済んだか否かを判断する。例えば、手続き解析部６０４は、構文木を後順（post-order）にトラバースしてもよい。構文木全体のトラバースが完了していれば、最後のステートメントまで解析が済んでいる。
【０３０３】
最後のステートメントまで解析が済んでいれば、図１２の処理も完了する。逆に、未解析のステートメントが残っていれば、図１２の処理はステップＳ１０２に移行する。
【０３０４】
そして、ステップＳ１０２で手続き解析部６０４は、次のステートメント（具体的には、例えば、次のステートメントに対応する部分木（subtree）のデータ）を読み込む。
【０３０５】
なお、ソースコード内ではステートメントが入れ子になっている（nested）場合もあり得る。「次のステートメント」の「次」とは、手続き解析部６０４が構文木をトラバースする順序において「次」を意味する。
【０３０６】
ステップＳ１０３で手続き解析部６０４は、ステップＳ１０２で読み込んだステートメントの中に文字列リテラルがあるか否かを判断する。ステップＳ１０２で読み込んだステートメントの中に文字列リテラルがなければ、図１２の処理はステップＳ１０１に戻る。
【０３０７】
逆に、ステップＳ１０２で読み込まれたテートメントの中に文字列リテラルがあれば、ステップＳ１０４〜Ｓ１１１の処理をリテラル登録部６０５が行う。以下では説明の便宜上、ステップＳ１０２で読み込まれたテートメントの中の文字列リテラルを「現在の文字列リテラル」という。
【０３０８】
具体的には、ステップＳ１０４で、リテラル登録部６０５は、現在の文字列リテラルが言語依存の文字列リテラルか否かを判断する。ステップＳ１０４における判断の具体的手法は、実施形態によって異なっていてよい。
【０３０９】
例えば、図６の例では、コンパイラ５００はＣＯＢＯＬのコンパイラである。そして、図６のソースファイル５０１に例示したとおり、ＣＯＢＯＬでは、文字列リテラルの前に"N"というトークンを記述することで、その文字列リテラルが言語依存の文字列リテラル（つまり国別文字定数（national literal））であることを示せる。したがって、このようなプログラミング言語の仕様に基づいて（具体的には、"N"というトークンがあるか否かに応じて）、リテラル登録部６０５がステップＳ１０４の判断を行ってもよい。
【０３１０】
あるいは、リテラル登録部６０５は、ロケールリソースファイル５０２を参照することでステップＳ１０４の判断を行ってもよい。
【０３１１】
例えば、現在の文字列リテラルが図６のソースファイル５０１中の"G8-2"という文字列リテラルであるとする。この場合、リテラル登録部６０５は、ロケールリソースファイル５０２の日本語の列において、"G8-2"という文字列リテラルを検索する。検索の結果、"G8-2"という文字列リテラルは見つからないので、リテラル登録部６０５は、「"G8-2"という文字列リテラルは言語非依存の文字列リテラルである」と判断する。
【０３１２】
別の例として、現在の文字列リテラルが図６のソースファイル５０１中の"基本給"という文字列リテラルであるとする。この場合、リテラル登録部６０５は、ロケールリソースファイル５０２の日本語の列において、"基本給"という文字列リテラルを検索する。検索の結果、"基本給"という文字列リテラルが見つかるので、リテラル登録部６０５は、「"基本給"という文字列リテラルは言語依存の文字列リテラルである」と判断する。
【０３１３】
なお、リテラル登録部６０５は、ロケールリソースファイル５０２内のどの言語の列を検索するかを、実施形態に応じた適宜の方法により、適切に決めることができる。
【０３１４】
例えば、コンパイラ５００に対するコマンドオプションとして、ロケール名が指定されてもよい。この場合、リテラル登録部６０５は、ロケールリソースファイル５０２内の、指定されたロケール名に対応する列（例えば、"ja"が指定された場合は日本語の列）を検索する。
【０３１５】
別の例として、コンパイラ５００は、ＯＳの提供するＡＰＩを介して、ソースファイル５０１が開発された環境におけるロケールの名前を取得してもよい。この場合、リテラル登録部６０５は、ロケールリソースファイル５０２内の、取得されたロケール名に対応する列（例えば、"ja"が取得された場合は日本語の列）を検索する。
【０３１６】
さらに別の例として、コンパイラ５００（より具体的には例えば字句解析部６０１）は、ソースファイル５０１を解析することで、ソースファイル５０１で使われている文字符号化方式（character encoding scheme；ＣＥＳ）を判断してもよい。なお、ファイルの文字符号化方式を判断するための公知の解析手法が使われてもよい。また、コンパイラ５００は、ロケール名と文字符号化方式との対応表を有していてもよい。この場合、コンパイラ５００は、解析により認識した文字符号化方式に対応するロケール名を、対応表に基づいて認識することができる。
【０３１７】
例えば、ソースファイル５０１に使われている文字符号化方式が、シフトＪＩＳであるとする。シフトＪＩＳは日本語用の文字符号化方式であるため、対応表では、シフトＪＩＳと"ja"というロケール名が対応づけられる。よって、この場合、コンパイラ５００が対応表に基づいて認識した"ja"というロケール名にしたがって、リテラル登録部６０５は、ロケールリソースファイル５０２内の日本語の列を検索する。
【０３１８】
以上のように、ステップＳ１０４の判断の具体的方法には様々なものがある。しかし、いずれにしろリテラル登録部６０５は、ステップＳ１０４で、現在の文字列リテラルが言語依存の文字列リテラルか否かを判断する。
【０３１９】
現在の文字列リテラルが言語非依存の文字列リテラルである場合、次に、リテラル登録部６０５は、ステップＳ１０５において、言語非依存リテラル一覧６０９に現在の文字列リテラルを登録する。例えば、現在の文字列リテラルが"G8-2"という文字列リテラルである場合、図９の言語非依存リテラル一覧６０９の２番目のレコードが、リテラル登録部６０５によって新たに作成および追加される。ステップＳ１０５の後、図１２の処理はステップＳ１０１に戻る。
【０３２０】
逆に、現在の文字列リテラルが言語依存の文字列リテラルである場合、ステップＳ１０６〜Ｓ１１１が実行される。
【０３２１】
ステップＳ１０６でリテラル登録部６０５は、オフセット一覧６１３に新たなレコードを追加する。リテラル登録部６０５は、追加したレコードに新たなＩＤを割り当て、追加したレコードの最大長のフィールドを０に初期化する。なお、オフセットのフィールドには、後述の図１３の処理において適宜の値が設定される。例えば、現在の文字列リテラルが"富士通太郎"という文字列リテラルである場合、オフセット一覧６１３には、１番目のレコードが追加される。
【０３２２】
次に、ステップＳ１０７でリテラル登録部６０５は、ロケールリソースファイル５０２に文字列リテラルが記憶されている言語のうち、現在の文字列リテラルに関して未選択の言語が残っているか否かを判断する。
【０３２３】
例えば、図６の例では、「ロケールリソースファイル５０２に文字列リテラルが記憶されている言語」とは、具体的には、英語と中国語と日本語という３つの言語である。よって、リテラル登録部６０５は、英語と中国語と日本語のうち、現在の文字列リテラルに関して未選択の言語が残っているか否かを判断する。
【０３２４】
未選択の言語が残っていなければ（つまり、すべての言語を選択済みであれば）、図１２の処理はステップＳ１０１に戻る。逆に、未選択の言語が残っていれば、図１２の処理はステップＳ１０８に移行する。
【０３２５】
ステップＳ１０８でリテラル登録部６０５は、ロケールリソースファイル５０２に文字列リテラルが記憶されている言語のうち、未選択の言語を一つ選択する。そして、リテラル登録部６０５は、現在の文字列リテラルに対応する意味を有しており、かつ、選択した言語で書かれている文字列リテラルを、ロケールリソースファイル５０２から読み取る。
【０３２６】
例えば、現在の文字列リテラルが、ソースファイル５０１中の"勤続年数"であるものとする。この場合、もしステップＳ１０８で英語が選択されると、リテラル登録部６０５は、"勤続年数"に対応する英語の文字列リテラルである"Length of Service"をロケールリソースファイル５０２から読み取る。つまり、リテラル登録部６０５は、現在の文字列リテラルと同じレコードの英語のフィールドから、"Length of Service"という文字列リテラルを読み取る。
【０３２７】
別の例として、もしステップＳ１０８で日本語が選択されると、リテラル登録部６０５は、実際には、ロケールリソースファイル５０２の参照を省略してもよい。なぜなら、現在の文字列リテラルである"勤続年数"そのものが、選択された言語で書かれた文字列だからである。つまり、リテラル登録部６０５は、ステップＳ１０３で見つかった現在の文字列リテラルを、「ステップＳ１０８でロケールリソースファイル５０２から読み取った文字列リテラル」と見なしてもよい。
【０３２８】
そして、ステップＳ１０９でリテラル登録部６０５は、ステップＳ１０８で読み取った文字列リテラルのバイト長が、ステップＳ１０６で追加したレコードの最大長のフィールドが示すバイト長より長いか否かを判断する。読み取った文字列リテラルのバイト長が、最大長のフィールドが示すバイト長より長ければ、図１２の処理はステップＳ１１０に移行し、そうでなければ、図１２の処理はステップＳ１１１に移行する。
【０３２９】
ステップＳ１１０でリテラル登録部６０５は、ステップＳ１０８で読み取った文字列リテラルのバイト長を、ステップＳ１０６で追加したレコードの最大長のフィールドに書き込む。それにより、リテラル登録部６０５は最大長を適宜更新する。ステップＳ１１０での更新の後、図１２の処理はステップＳ１１１へ移行する。
【０３３０】
ステップＳ１１１でリテラル登録部６０５は、ステップＳ１０８で選択した言語のリテラル一覧に、ステップＳ１０８で読み取った文字列リテラルを登録する（詳細は後述する）。ステップＳ１１１での登録の後、図１２の処理はステップＳ１０７に戻る。ステップＳ１０７〜Ｓ１１１のループにより、現在の文字列リテラルに対応する意味を持つ各言語の文字列リテラルが、各言語のリテラル一覧に登録される。
【０３３１】
例えば、ステップＳ１０３で見つかった現在の文字列リテラルが、"勤続年数"であるものとする。この場合、ステップＳ１０６では、図９のオフセット一覧６１３の４番目のレコードが追加される。リテラル登録部６０５は、追加したレコードのために新たに"00004"というＩＤを発行し、発行した"00004"というＩＤを、追加したレコードに割り当て、「最大長」のフィールドを０に初期化する。
【０３３２】
また、説明の便宜上、例えば、日本語、英語、中国語、という順でリテラル登録部６０５が言語を選択するものとする。リテラル登録部６０５が言語を選択する順序は任意である。
【０３３３】
上記のような選択順の場合、"勤続年数"という現在の文字列リテラルに関するステップＳ１０８の１回目の実行において、日本語が選ばれる。よって、現在の文字列リテラルに関するＳ１０８の１回目の実行において、"勤続年数"という日本語の文字列リテラルが得られる。
【０３３４】
"勤続年数"という日本語の文字列リテラルのバイト長は８であり、８は０より大きい。よって、ステップＳ１１０でオフセット一覧６１３の４番目のレコードの「最大長」のフィールドが、８に更新される。
【０３３５】
そして、ステップＳ１１１では、日本語リテラル一覧６１０に、"勤続年数"という文字列リテラルが登録される。具体的には、図９の日本語リテラル一覧６１０の４番目のレコードが新たに追加される。なお、リテラル登録部６０５は、ステップＳ１０６で発行した"00004"というＩＤをサフィックスとして含む"B00004"というＩＤを新たなレコードに割り当て、"勤続年数"という文字列リテラルのバイト長に基づいて票長を計算する。その結果、図９のようなレコードが追加される。
【０３３６】
続いて、現在の文字列リテラルに関するステップＳ１０８の２回目の実行において、英語が選ばれる。よって、現在の文字列リテラルに関するステップＳ１０８の２回目の実行において、"Length of Service"という英語の文字列リテラルが得られる。
【０３３７】
"Length of Service"という英語の文字列リテラルのバイト長は１７であり、１７は８より大きい。よって、ステップＳ１１０でオフセット一覧６１３の４番目のレコードの「最大長」のフィールドが、１７に更新される。
【０３３８】
そして、ステップＳ１１１では、英語リテラル一覧６１１に、"Length of Service"という文字列リテラルが登録される。具体的には、図９の英語リテラル一覧６１１の４番目のレコードが新たに追加される。なお、リテラル登録部６０５は、ステップＳ１０６で発行した"00004"というＩＤをサフィックスとして含む"C00004"というＩＤを新たなレコードに割り当て、"Length of Service"という文字列リテラルのバイト長に基づいて票長を計算する。その結果、図９のようなレコードが追加される。
【０３３９】
続いて、現在の文字列リテラルに関するステップＳ１０８の３回目の実行において、中国語が選ばれる。よって、現在の文字列リテラルに関するステップＳ１０８の３回目の実行において、
2015194862.tif 000027
という中国語の文字列リテラルが得られる。
2015194862.tif 000028
という中国語の文字列リテラルのバイト長は４であり、４は１７より大きくない。よって、ステップＳ１１０はスキップされる。
【０３４０】
そして、ステップＳ１１１では、中国語リテラル一覧６１２に、
2015194862.tif 000029
という文字列リテラルが登録される。具体的には、図９の中国語リテラル一覧６１２の４番目のレコードが新たに追加される。なお、リテラル登録部６０５は、ステップＳ１０６で発行した"00004"というＩＤをサフィックスとして含む"D00004"というＩＤを新たなレコードに割り当て、
2015194862.tif 000030
という文字列リテラルのバイト長に基づいて票長を計算する。その結果、図９のようなレコードが追加される。
【０３４１】
そして、現在の文字列リテラルに関するステップＳ１０７の４回目の実行において、リテラル登録部６０５は、「未選択の言語はない」と判断する。その結果、図１２の処理は、ステップＳ１０１に戻る。
【０３４２】
なお、説明の簡単化のため、図１２には、１つのステートメントに含まれる文字列リテラルの数が最大でも１つの場合のフローチャートを例示した。１つのステートメントに２つ以上の文字列リテラルが含まれる場合には、ステップＳ１０２で読み込まれたステートメントに含まれる各文字列リテラルについて、ステップＳ１０４の判断が行われる。そして、各文字列リテラルについて、ステップＳ１０４での判断結果に応じて、ステップＳ１０５が実行されるか、または、ステップＳ１０６〜Ｓ１１１が実行される。
【０３４３】
さて、以上説明したような図１２の処理が完了した後、割り付け部６０６がレジスタの割り付けや、個々の領域のバイト数の計算などの適宜の処理を行う。その後、オブジェクトコード生成部６０７がオブジェクトコードを生成する。
【０３４４】
図１３の処理は、オブジェクトコードを生成するためにオブジェクトコード生成部６０７が行う一連の処理のうちの一つである。具体的には、図１３は、第２実施形態のコンパイラ５００がＲＯ領域を作成する処理のフローチャートである。より詳しくは、図１３は、オブジェクトコード生成部６０７のうちのリテラル配置部６０８が、ＲＯ領域のうちで言語依存の文字列リテラルを記憶する領域を作成する処理のフローチャートである。
【０３４５】
ステップＳ２０１でリテラル配置部６０８は、オフセット一覧６１３に記憶されている最大長を用いてオフセットを計算する。具体的には、リテラル配置部６０８は、オフセット一覧６１３の１番目のレコードの「オフセット」のフィールドを０に設定する。また、リテラル配置部６０８は、１＜ｉなる各ｉについて、オフセット一覧６１３の（ｉ−１）番目のレコードの「最大長」と「オフセット」のフィールドの値の和を計算し、計算した和を、ｉ番目のレコードの「オフセット」のフィールドに設定する。その結果、図９のように、オフセット一覧６１３の各レコードの「オフセット」のフィールドには、値が設定される。
【０３４６】
次に、ステップＳ２０２でリテラル配置部６０８は、ロケールリソースファイル５０２に文字列リテラルが記憶されている言語のうち、文字列リテラルの配置が済んでいない言語（つまり未選択の言語）が残っているか否かを判断する。なお、言語の選択順は固定されている。例えば、ロケールリソースファイル５０２での列同士の間の順にしたがって、リテラル配置部６０８は言語を選択する。
【０３４７】
例えば、図６の例では、「ロケールリソースファイル５０２に文字列リテラルが記憶されている言語」とは、具体的には、英語と中国語と日本語という３つの言語である。よって、リテラル配置部６０８は、英語と中国語と日本語のうち、未選択の言語が残っているか否かを判断する。
【０３４８】
未選択の言語が残っていなければ（つまり、すべての言語について文字列リテラルの配置が済んでいれば）、図１３の処理は完了する。逆に、未選択の言語が残っていれば、図１３の処理はステップＳ２０３に移行する。
【０３４９】
ステップＳ２０３でリテラル配置部６０８は、ロケールリソースファイル５０２に文字列リテラルが記憶されている言語のうち、未選択の言語を一つ選択する。そして、リテラル配置部６０８は、選択した言語のリテラル一覧を参照する。例えば、リテラル配置部６０８は、日本語を選択する場合は、日本語リテラル一覧６１０を参照する。
【０３５０】
次に、ステップＳ２０４でリテラル配置部６０８は、ステップＳ２０３で選択した言語のリテラル一覧（例えば日本語リテラル一覧６１０）に、未選択のレコードが残っているか否かを判断する。
【０３５１】
未選択のレコードが残っている場合、リテラル配置部６０８は、ステップＳ２０５で次のレコード（つまり、未選択のレコードのうちで、ＩＤにより示される順序が最も早いレコード）を読み込む。逆に、すべてのレコードが選択済みの場合、図１３の処理はステップＳ２０２に戻る。
【０３５２】
ステップＳ２０５の次に、ステップＳ２０６でリテラル配置部６０８は、以下の２つの値を比較する。
【０３５３】
・ステップＳ２０５で読み込んだレコードの「値」のフィールドに記憶されている文字列リテラルの実長（つまり実際のバイト長）。
・ステップＳ２０５で読み込んだレコードのＩＤのサフィックスがＩＤとして割り当てられている、オフセット一覧６１３内のレコードの、「最大長」のフィールドの値。
【０３５４】
例えば、ステップＳ２０５でリテラル配置部６０８が日本語リテラル一覧６１０の２番目のレコードを読み込んだとする。この場合、「値」のフィールドに記憶されている"基本給"という日本語の文字列リテラルの実長は６バイトである。また、日本語リテラル一覧６１０の２番目のレコードのＩＤは"B00002"であり、そのサフィックスは"00002"である。よって、リテラル配置部６０８はオフセット一覧６１３において"00002"というＩＤを有するレコードを参照し、このレコードの「最大長」のフィールドから、１１バイトという最大長を読み取る。
【０３５５】
そして、実長が最大長未満の場合、リテラル配置部６０８は、ステップＳ２０７で、ステップＳ２０５で読み込んだレコードの文字列リテラルを空白文字（space character）でパディングする。それにより、リテラル配置部６０８は、空白文字でパディングされた文字列リテラルのバイト長を、ステップＳ２０６で参照した最大長に一致させる。
【０３５６】
例えば、ステップＳ２０５で日本語リテラル一覧６１０の２番目のレコードが読み込まれたとする。この場合、上記のとおり実長は６バイトであり、最大長は１１バイトである。よって、リテラル配置部６０８は、"基本給"という日本語の文字列リテラルの後ろに５つの空白文字を追加（append）する。それにより、"基本給     "という、５つの空白文字でパディングされた１１バイトの文字列リテラルが得られる。
【０３５７】
逆に、ステップＳ２０６において実長が最大長未満ではなかった場合（つまり、実長と最大長が等しい場合）、ステップＳ２０７はスキップされる。例えば、ステップＳ２０３で英語が選択され、ステップＳ２０６で英語リテラル一覧６１１の２番目のレコードが読み込まれた場合、実長は１１バイトであり、最大長も１１バイトである。よって、この場合、ステップＳ２０７はスキップされる。
【０３５８】
その後、ステップＳ２０８でリテラル配置部６０８は、文字列リテラルをオブジェクトコードのＲＯ領域に出力する。具体的には、リテラル配置部６０８は、ステップＳ２０７を実行した場合は、ステップＳ２０７で得られた文字列リテラル（例えば、"基本給     "という、５つの空白文字でパディングされた文字列リテラル）を出力する。逆に、ステップＳ２０７をスキップした場合は、リテラル配置部６０８は、ステップＳ２０５で読み込んだレコードの「値」のフィールドに記憶されていた文字列リテラル自体（例えば、"Base Salary"という文字列リテラル）を出力する。
【０３５９】
なお、リテラル配置部６０８は、図１３の処理を実行する前に、言語非依存リテラル一覧６０９に基づいて、ＲＯ領域の０〜（Ｘ−１）バイト目に言語非依存の文字列リテラルを出力（つまり配置）する。そして、リテラル配置部６０８は、文字列リテラルを出力するアドレス（以下「出力アドレス」という）の初期値を、図１３の処理を開始するときに設定する。出力アドレスの初期値は、具体的には、ＲＯ領域のうちの言語依存の文字列リテラル用の領域の開始アドレス（すなわちＲＯ領域のＸバイト目）である。
【０３６０】
ステップＳ２０８でリテラル配置部６０８は、具体的には、出力アドレスに文字列リテラルを出力（つまり配置）する。そして、リテラル配置部６０８は、現在の出力アドレスに、ステップＳ２０６で参照した最大長を足し、加算結果を新たな出力アドレスとして設定する。
【０３６１】
ステップＳ２０８の実行後、図１３の処理はステップＳ２０４に戻る。その結果、図６に例示されているように、オブジェクトファイル５０３のＲＯ領域においては、複数の言語で互いに対応する意味を持つ文字列リテラルに、同じバイト数が割り当てられることになる。例えば、ソースファイル５０１にｉ番目に出現する文字列リテラルに対応する３個の文字列リテラルのうち、ｊ番目の言語の文字列リテラル（１≦ｊ≦３）は、ＲＯ領域の（Ｘ＋（ｊ−１）・Ｙ＋Ｏｉ）バイト目から（Ｘ＋（ｊ−１）・Ｙ＋Ｏｉ＋Ｂｉ−１）バイト目までの範囲内に配置される。
【０３６２】
なお、リテラル配置部６０８が図１３の処理を完了した後、オブジェクトコード生成部６０７は、図１０〜１１に例示したような命令列（より具体的には、図１０〜１１のアセンブリコードに対応するマシンコード）を生成し、生成した命令列をオブジェクトコードに含める。以上のようにして、オブジェクトコード生成部６０７は、文字列リテラルと命令列とを含むオブジェクトコードを生成し、生成したオブジェクトコードをオブジェクトファイル５０３として出力する。
【０３６３】
続いて、図１４〜１５を参照して、第３実施形態について説明する。なお、第２実施形態との共通点についての説明は、適宜省略する。
【０３６４】
第３実施形態では、オブジェクトコード内の言語依存の文字列リテラルの並び順が第２実施形態と異なる。また、言語依存の文字列リテラルの並び順の違いに応じて、第３実施形態では、第２実施形態とは異なる命令列が生成される。したがって、第３実施形態では、図７のコンパイラ５００のうち、オブジェクトコード生成部６０７の動作が第２実施形態とは異なる。
【０３６５】
図１４は、第３実施形態で生成されるオブジェクトファイル９００のＲＯ領域中で、言語依存の文字列リテラルが配置される部分（以下、この部分を「領域９０１」という）を例示する図である。図１４では、ＲＯ領域のうち、言語非依存の文字列リテラルを記憶するための領域（つまり、ＲＯ領域の０〜（Ｘ−１）バイト目）は、省略されている。言語非依存の文字列リテラルを記憶するための領域は、第２実施形態（図６を参照）と同様である。つまり、図１４には、ＲＯ領域のＸバイト目以降が例示されている。
【０３６６】
説明の便宜上、第３実施形態でも、図６のソースファイル５０１とロケールリソースファイル５０２が使われるものとする。第３実施形態でも、ロケールリソースファイル５０２で互いに対応づけられている文字列リテラルには、同じバイト長が割り当てられる。
【０３６７】
例えば、ロケールリソースファイル５０２の１番目のレコードにおいて互いに対応づけられている３つの文字列リテラルのいずれにも、１２バイトが割り当てられる。なぜなら、これら３つの文字列リテラルのバイト長のうちの最大値が１２バイトだからである。
【０３６８】
同様に、ロケールリソースファイル５０２の２番目のレコードにおいて互いに対応づけられている３つの文字列リテラルのいずれにも、１１バイトが割り当てられる。また、３番目のレコードにおいて互いに対応づけられている３つの文字列リテラルのいずれにも、２１バイトが割り当てられ、４番目のレコードにおいて互いに対応づけられている３つの文字列リテラルのいずれにも、１７バイトが割り当てられる。
【０３６９】
具体的には、領域９０１内には、以下のように文字列リテラルが配置される。なお、領域９０１の開始アドレスは、上記のとおり、ＲＯ領域のＸバイト目である。
【０３７０】
・    ０〜  １１バイト目："Fujitsu Taro"（英語。パディングなし。）
・  １２〜  ２３バイト目："富士通太郎"（中国語。２２〜２３バイト目はパディングされたバイトである。）
・  ２４〜  ３５バイト目："富士通太郎"（日本語。３４〜３５バイト目はパディングされたバイトである。）
・  ３６〜  ４６バイト目："Base Salary"（英語。パディングなし。）
・４７〜  ５７バイト目：
2015194862.tif 000031
（中国語。５５〜５７バイト目はパディングされたバイトである。）
・  ５８〜  ６８バイト目："基本給"（日本語。６４〜６８バイト目はパディングされたバイトである。）
・  ６９〜  ８９バイト目："Responsibility Salary"（英語。パディングなし。）
・９０〜１１０バイト目：
2015194862.tif 000032
（中国語。９８〜１１０バイト目はパディングされたバイトである。）
・１１１〜１３１バイト目："職責給"（日本語。１１７〜１３１バイト目はパディングされたバイトである。）
・１３２〜１４８バイト目："Length of Service"（英語。パディングなし。）
・１４９〜１６５バイト目：
2015194862.tif 000033
（中国語。１５３〜１６５バイト目はパディングされたバイトである。）
・１６６〜１８２バイト目："勤続年数"（日本語。１７４〜１８２バイト目はパディングされたバイトである。）
【０３７１】
第３実施形態のコンパイラ５００は、図１２の処理と図１３のステップＳ２０１を第２実施形態と同様に実行する。しかし、以上の説明から明らかなように、図１２の処理と図１３のステップＳ２０１の実行後、第３実施形態のリテラル配置部６０８は、ステップＳ２０２〜Ｓ２０８とは異なる手順で、言語依存の文字列リテラルを領域９０１へ出力してゆく。
【０３７２】
具体的には、リテラル配置部６０８は、オフセット一覧６１３のレコードをＩＤの順に選択する。この選択順は、ソースファイル５０１内での言語依存の文字列リテラルが出現する順序と同じである。そして、リテラル配置部６０８は、「オフセット一覧６１３から選択した現在のレコードに関して、未選択の言語が残っているか否か」を判断する。
【０３７３】
未選択の言語があれば、リテラル配置部６０８は言語を選択する。言語の選択順は固定されている。例えば、ロケールリソースファイル５０２での列同士の間の順にしたがって、リテラル配置部６０８は、英語、中国語、日本語の順に、言語を選択する。
【０３７４】
さらに、リテラル配置部６０８は、選択した言語のリテラル一覧を参照し、オフセット一覧６１３で選択したレコードのＩＤ（例えば"00001"）をサフィックスとして含むＩＤ（例えば"B00003"）が割り当てられているレコードの「値」のフィールドを読み込む。つまり、リテラル配置部６０８は、選択した言語の文字列リテラルを読み込む。
【０３７５】
そして、リテラル配置部６０８は、ステップＳ２０６と同様に実長と最大長を比較する。実長が最大長未満ならば、リテラル配置部６０８は、ステップＳ２０７と同様に文字列リテラルを空白文字でパディングする。その後、リテラル配置部６０８は、文字列リテラルを出力アドレスに出力する。文字列リテラルの出力はステップＳ２０８と同様であり、出力アドレスの初期化および更新も、第２実施形態と同様である。
【０３７６】
ただし、文字列リテラルの出力後、第３実施形態のリテラル配置部６０８は、次に、「オフセット一覧６１３から選択した現在のレコードに関して、未選択の言語が残っているか否か」を再び判断する。すべての言語が選択済みであれば、リテラル配置部６０８は、オフセット一覧６１３の次のレコードを選択する。
【０３７７】
以上のような手順により、第３実施形態のリテラル配置部６０８は、言語依存の複数の文字列リテラルを、リテラル組ごとに、領域９０１に配置する。
【０３７８】
さて、図１５は、第３実施形態でオブジェクトコード生成部６０７により生成される命令列を例示する図である。オブジェクトファイル９００のＲＯ領域の後ろには、図１５に例示するような命令列用の領域が配置される。
【０３７９】
図１５の"LocaleJudgment"というラベル９０２は、図１０のラベル８０２と同様である。図１５では省略されているが、ラベル９０２の前には、ラベル８００や８０１と同様のラベルがある。また、図１５では省略されているが、図１０の命令８０３からラベル８２３までの部分と同様の命令列が、ラベル９０２の後に続く。したがって、命令９０３が実行される時点では、レジスタＲｅｇ２には、実行環境のロケールに応じて０、１、または２という値が記憶されている。
【０３８０】
命令９０３および９０４は、図１１の命令８２７および８２８と同じである。なお、図１１では、命令８２７の前に命令８２５と８２６があるが、第３実施形態では命令８２５と８２６は生成されない。
【０３８１】
命令９０５〜９１０は、ソースファイル５０１に書かれた"富士通太郎"という１番目の言語依存文字列リテラルに対応する、実行時のロケールに応じた文字列リテラルを、表示するための命令である。
【０３８２】
命令９０５は、レジスタＲｅｇ２に記憶されている値をレジスタＲｅｇ３に設定する（つまりコピーする）ための命令である。命令９０６は、レジスタＲｅｇ３に記憶されている値と１２を乗算し、乗算の結果をレジスタＲｅｇ３に記憶するための命令である。オブジェクトコード生成部６０７は、オフセット一覧６１３の１番目のレコードの「最大長」のフィールドから１２という値を読み出し、読み出した１２という値を使って、命令９０６を生成する。
【０３８３】
命令９０７は、ベースレジスタに記憶されている値と、レジスタＲｅｇ３に記憶されている値と、Ｘと、０との和を、レジスタＲｅｇ４に設定するための命令である。なお、Ｘは、第２実施形態と同様に、言語非依存文字列リテラル用の領域のバイト長である。
【０３８４】
オブジェクトコード生成部６０７は、オフセット一覧６１３の１番目のレコードの「オフセット」のフィールドから０という値を読み出し、０と３（つまり、ロケールリソースファイル５０２で文字列リテラルが定義されている言語の数）とを乗じる。乗算の結果として、０という値が得られる。そして、オブジェクトコード生成部６０７は、以上のようにして得た０という値を使って、命令９０７を生成する。
【０３８５】
ここで、式（１）に関して説明したとおり、命令８０９、８１４、８１９、または８２２によりレジスタＲｅｇ２に設定される値（つまり、実行時のロケールに応じた、０、１、または２という値）をｒと表記する。なお、上記のとおり、図１５では省略されているが、第３実施形態でも、図１０の命令８０３からラベル８２３までの部分と同様の命令列が、オブジェクトコード生成部６０７により生成されることに注意されたい。
【０３８６】
また、言語依存の文字列リテラルのうち、ソースファイル５０１内でｉ番目に出現する文字列リテラルに対応してオフセット一覧６１３に記憶されているオフセットＯｉは、ｉ＝１のとき０であり、１＜ｉのとき、（Ｂ１＋…Ｂｉ−１）である。
【０３８７】
したがって、図９、１０、１４、および１５から分かるように、実行時のロケールに応じた言語のｉ番目の文字列リテラルの開始アドレスＡｉは、第３実施形態では、式（１）ではなく、式（２）のように表現される。
Ai = StartAddr + Offset + X + 3・Oi + r・Bi     (2)
【０３８８】
命令９０７は、実行時のロケールに応じた言語の１番目の文字列リテラルの開始アドレスＡ１を算出し、開始アドレスＡ１をレジスタＲｅｇ４に設定するための命令の例である。つまり、命令９０７の実行結果に基づいて、開始アドレスＡ１が参照される。
【０３８９】
なお、式（２）の右辺は、５つの値の加算を表している。このうち１〜２番目の値の和（StartAddr+Offset）は、命令９０３〜９０４の実行の結果として、ベースレジスタに設定される。また、５番目の値（ｒ・Ｂｉ）は、命令９０５〜９０６の実行の結果として、レジスタＲｅｇ３に設定される。そのため、開始アドレスＡ１は、命令９０７の第２オペランドのように表現される。
【０３９０】
なお、第２実施形態の図１１の例ではレジスタＲｅｇ３に開始アドレスが設定されるのに対し、第３実施形態の図１５の例では、上記のとおり、レジスタＲｅｇ４に開始アドレスが設定される。そのため、命令９０８の第２オペランドとして、レジスタＲｅｇ４が指定されている。しかし、それ以外の点では、命令９０８は図１１の命令８３０と同じである。また、命令９０８に続く命令９０９および９１０は、図１１の命令８３１および８３２と同じである。以上のとおり、オブジェクトコード生成部６０７は、オフセット一覧６１３の１番目のレコードに基づいて、命令９０６、９０７、９０９のオペランドを決め、命令９０６、９０７、９０９を生成する。
【０３９１】
命令９１１〜９１６は、ソースファイル５０１に書かれた"基本給"という２番目の言語依存文字列リテラルに対応する、実行時のロケールに応じた文字列リテラルを、表示するための命令である。例えば、命令９１３は、実行時のロケールに応じた言語の２番目の文字列リテラルの開始アドレスＡ２をレジスタＲｅｇ４に設定するための命令であり、命令９１３の実行結果に基づいて、開始アドレスＡ２が参照される。
【０３９２】
命令９１１〜９１６は、命令９０５〜９１０と類似である。命令９０５〜９１０との違いは、命令９１２、９１３、および９１５のオペランドのみである。
【０３９３】
具体的には、オフセット一覧６１３の２番目のレコードの「最大長」のフィールドの値が１１なので、命令９１２と９１５それぞれの第２オペランドとして、１１という値が指定されている。また、オフセット一覧６１３の２番目のレコードの「オフセット」フィールドの値が１２であり、１２と３の積は３６なので、命令９１３のオペランドには、３６という値が含まれる。つまり、オブジェクトコード生成部６０７は、オフセット一覧６１３の２番目のレコードに基づいて、命令９１２、９１３、および９１５を生成する。
【０３９４】
命令９１７〜９２２は、ソースファイル５０１に書かれた"職責給"という３番目の言語依存文字列リテラルに対応する、実行時のロケールに応じた文字列リテラルを、表示するための命令である。例えば、命令９１９は、実行時のロケールに応じた言語の３番目の文字列リテラルの開始アドレスＡ３をレジスタＲｅｇ４に設定するための命令であり、命令９１９の実行結果に基づいて、開始アドレスＡ３が参照される。
【０３９５】
命令９１７〜９２２も、命令９０５〜９１０と類似である。命令９０５〜９１０との違いは、命令９１８、９１９、および９２１のオペランドのみである。
【０３９６】
具体的には、オフセット一覧６１３の３番目のレコードの「最大長」のフィールドの値が２１なので、命令９１８と９２１それぞれの第２オペランドとして、２１という値が指定されている。また、オフセット一覧６１３の３番目のレコードの「オフセット」フィールドの値が２３であり、２３と３の積は６９なので、命令９１９のオペランドには、６９という値が含まれる。つまり、オブジェクトコード生成部６０７は、オフセット一覧６１３の３番目のレコードに基づいて、命令９１８、９１９、および９２１を生成する。
【０３９７】
命令９２３〜９２８は、ソースファイル５０１に書かれた"勤続年数"という４番目の言語依存文字列リテラルに対応する、実行時のロケールに応じた文字列リテラルを、表示するための命令である。例えば、命令９２５は、実行時のロケールに応じた言語の４番目の文字列リテラルの開始アドレスＡ４をレジスタＲｅｇ４に設定するための命令であり、命令９２５の実行結果に基づいて、開始アドレスＡ４が参照される。
【０３９８】
命令９２３〜９２８も、命令９０５〜９１０と類似である。命令９０５〜９１０との違いは、命令９２４、９２５、および９２７のオペランドのみである。
【０３９９】
具体的には、オフセット一覧６１３の４番目のレコードの「最大長」のフィールドの値が１７なので、命令９２４と９２７それぞれの第２オペランドとして、１７という値が指定されている。また、オフセット一覧６１３の４番目のレコードの「オフセット」フィールドの値が４４であり、４４と３の積は１３２なので、命令９２５のオペランドには、１３２という値が含まれる。つまり、オブジェクトコード生成部６０７は、オフセット一覧６１３の４番目のレコードに基づいて、命令９２４、９２５、および９２７を生成する。
【０４００】
図１５から分かるように、第３実施形態によれば、コンパイル時にオブジェクトコード生成部６０７が、命令９０７、９１３、９１９、９２５のオペランドを確定することが可能である。なぜなら、第１に、例えば命令９１３における（Ｘ＋３６）というオフセットのように、実行時のロケールによらない共通のオフセットがコンパイル時に確定するからである。そして、第２に、この共通のオフセットを使って、実行時のロケールに応じた文字列リテラルの開始アドレスを表すことが可能だからである。つまり、第３比較例のような「オペランドがコンパイル時には確定不能であるために、コンパイル処理が失敗する」という問題は、第３実施形態でも起きない。
【０４０１】
なお、図１５では、命令９１３のオペランドの中に"+X+36"という部分が含まれる。この部分は、ｉ＝２の場合における、式（２）の中の"+X+3・Oi"という部分に対応する。しかし、命令９１３内の"+X+36"という部分は、実行時にＸの加算と３６の加算が行われることを意味するわけではない。
【０４０２】
Ｘはコンパイル時に確定する値なので、オブジェクトコード生成部６０７は、実際には、Ｘと３６の和を算出し、その算出した和（Ｘ＋３６）を、命令９１３のオペランドの中に指定する。命令９０７、９１９、９２５についても同様である。
【０４０３】
続いて、図１６を参照して、第４実施形態について説明する。なお、第２実施形態との共通点についての説明は、適宜省略する。
【０４０４】
図１６は、第４実施形態でオブジェクトファイルに埋め込まれるデータを例示する図である。図１６のオブジェクトファイル１０００は、言語非依存の文字列リテラル用の領域１００１と、言語依存の文字列リテラル用の領域１００２を含む。
【０４０５】
領域１００１と１００２は、ＲＯ領域の一部を占める。領域１００１と１００２は、第２実施形態の図６のオブジェクトファイル５０３内のＲＯ領域（言語非依存の文字列リテラル用の領域と言語依存の文字列リテラル用の領域を含む）と同様である。なお、第４実施形態では、領域１００２におけるリテラルの並び順は、図６の第２実施形態での順序と同様である。しかし、領域１００２におけるリテラルの並び順を、図１４の第３実施形態での順序と同様の順序に変更した実施形態も可能である。
【０４０６】
領域１００２において、文字列リテラルは、第２・第３実施形態と同様に、所定の文字（例えば空白文字）でパディングされていてもよい。しかし、第４実施形態ではパディングが省略されてもよい。
【０４０７】
領域１００２においては、パディングが行われるか否かによらず、複数の言語の互いに対応する文字列リテラルには、同じバイト長が割り当てられる。例えば、"Base Salary"と
2015194862.tif 000034
と"基本給"という文字列リテラルのいずれに対しても、領域１００２内で１１バイトが割り当てられる。なぜなら、これらの３つの文字列リテラルのうち最長の"Base Salary"の長さが１１バイトだからである。パディングが省略される場合、"基本給"という６バイトの文字列リテラルに続く５バイトは、実行時に単に無視されるだけである。
【０４０８】
第４実施形態では、オブジェクトファイル１０００が、さらに、文字列リテラルの長さ用の領域１００３も含む。領域１００３もＲＯ領域の一部である。図１６には領域１００３の詳細も例示されている。領域１００３には、言語依存の各文字列リテラルの長さを示す数値が記憶される。図１６では参照の便宜のため、これらの数値のほかに、文字列リテラルのＩＤと、アドレスも示してある。
【０４０９】
例えば、図９に示すように、"C00001"と"D00001"と"B00001"というＩＤで識別される３つの文字列リテラル同士は互いに対応し、これらの文字列リテラルの長さは、それぞれ、１２、１０、１０バイトである。図１６には便宜上、文字列リテラルの長さが２バイトの数値で表現される場合のアドレス（すなわち、Ｑと、Ｑ＋２と、Ｑ＋４）が例示されている。つまり、領域１００３には、１２、１０、および１０という数値が格納されており、これらの数値が格納されているアドレスは、Ｑ、Ｑ＋２、およびＱ＋４である。なお、Ｑ＝Ｘ＋３Ｙである。
【０４１０】
同様に、領域１００３には、"C00002"と"D00002"と"B00002"というＩＤで識別される３つの文字列リテラルの長さをそれぞれ示す１１、８、６という数値も格納されている。また、"C00003"と"D00003"と"B00003"というＩＤで識別される３つの文字列リテラルの長さをそれぞれ示す２１、８、６という数値も格納されている。さらに、"C00004"と"D00004"と"B00004"というＩＤで識別される３つの文字列リテラルの長さをそれぞれ示す１７、４、８という数値も格納されている。
【０４１１】
第４実施形態のオブジェクトコード生成部６０７は、例えば、図１３の処理を実行することで、言語依存の文字列リテラル用の領域１００２に適宜文字列リテラルを配置してもよい。その後、オブジェクトコード生成部６０７は、各言語のリテラル一覧６１０〜６１２に基づいて、上記のように領域１００３内に、文字列リテラルの長さを示す数値を記録してもよい。オブジェクトコード生成部６０７は、各言語のリテラル一覧６１０〜６１２を参照することで、各文字列リテラルの長さを認識することができる。
【０４１２】
なお、オブジェクトコード生成部６０７は、領域１００２での言語の順序にしたがって、領域１００３内に数値を記録する。例えば、オブジェクトコード生成部６０７が、図６と同様の「英語が１番目で、中国語が２番目で、日本語が３番目」という順序にしたがって、領域１００２に文字列リテラルを配置したとする。この場合、オブジェクトコード生成部６０７は、図１６のとおり、各リテラル組について、以下の順序で３つの数値を配置する。すなわち、オブジェクトコード生成部６０７は、各リテラル組について、英語の文字列リテラルの長さを示す数値を１番目に配置し、中国語の文字列リテラルの長さを示す数値を２番目に配置し、日本語の文字列リテラルの長さを示す数値を３番目に配置する。
【０４１３】
なお、オブジェクトファイル１０００は、領域１００１〜１００３の後ろに、命令列用の領域１００４も含む。領域１００４には、図１０〜１１と類似の命令が含まれる。ただし、領域１００４における命令列は、以下の点において図１０〜１１と異なる。
【０４１４】
命令８２５の前に、レジスタＲｅｇ２の値をレジスタＲｅｇ５にコピーするための命令（例えば"Mov Reg5, Reg2"）が挿入される。したがって、レジスタＲｅｇ５には、実行時のＬＣＩＤに応じた０、１、２などの値が格納される。
【０４１５】
次に、レジスタＲｅｇ５の値を２倍するための命令（例えば"Mul Reg5, 2"）が挿入される。この命令の第２オペランドが２である理由は、図１６の例では文字列リテラルの長さを示す数値が２バイトで表されるためである。
【０４１６】
その後に、図１１と同様の命令８２５〜８２８が続く。第２実施形態では、１番目の文字列リテラルを表示するための命令８２９〜８３２が生成されるが、第４実施形態のオブジェクトコード生成部６０７は、命令８３１の代わりに、"Lea Reg6, [BaseReg+Reg5+Q]"と"Mov DispReg2, [Reg6]"のような命令を生成してもよい。
【０４１７】
これらの２つの命令が実行されると、実行時のＬＣＩＤに応じた言語の文字列リテラルの長さを示す数値が読み出され、読み出された数値がレジスタＤｉｓｐＲｅｇ２に設定される。
【０４１８】
同様に、オブジェクトコード生成部６０７は、２番目の文字列リテラルの表示に関して、命令８３５の代わりに、"Lea Reg6, [BaseReg+Reg5+Q+6]"と"Mov DispReg2, [Reg6]"のような命令を生成してもよい。なお、文字列リテラルの長さが２バイトの数値で表され、３つの言語の文字列リテラルが領域１００２に含まれ、２×３×（２−１）＝６であるため、上記の命令には"+Q+6"という部分が含まれる。
【０４１９】
同様に、オブジェクトコード生成部６０７は、３番目の文字列リテラルの表示に関して、命令８３９の代わりに、"Lea Reg6, [BaseReg+Reg5+Q+12]と"Mov DispReg2, [Reg6]"のような命令を生成してもよい（２×３×（３−１）＝１２であるため）。また、オブジェクトコード生成部６０７は、４番目の文字列リテラルの表示に関して、命令８４３の代わりに、"Lea Reg6, [BaseReg+Reg5+Q+18]"と"Mov DispReg2, [Reg6]"のような命令を生成してもよい（２×３×（４−１）＝１８であるため）。
【０４２０】
以上説明したように、オブジェクトコード生成部６０７は、ＲＯ領域の中に各文字列リテラルの長さを示す数値を含めてもよく、その数値を参照するための命令を生成してもよい。互いに対応する文字列リテラル同士の長さは言語に応じて異なり得るが、第４実施形態によれば、実行時のロケールに応じた言語の文字列リテラルの長さを所定のレジスタに設定するための命令を、コンパイル時に確定することが可能である。
【０４２１】
例えば、表示の都合などにより、言語に依存しない一律の長さに調整された（つまりパディングされた）文字列リテラルよりも、ロケールに応じた短い（つまりパディングされていない）文字列リテラルそのものを使う方が好ましいアプリケーションもあり得る。第４実施形態では、ロケールに応じた文字列リテラルの実際の長さが、実行時に領域１００３から読み出されるので、第４実施形態は上記のようなアプリケーションにも好適である。
【０４２２】
なお、上記のとおり、領域１００２における文字列リテラルの並び順は、図１４と同様の順序であってもよい。その場合、領域１００４における具体的な命令列は、上述の例とは異なり、図１５の命令列と似たものである。
【０４２３】
ただし、上記と同様の"Mov Reg5, Reg2"および"Mul Reg5, 2"という命令が（例えば命令９０４の後に）挿入される。また、図１５に含まれる命令のうち、命令９０９、９１５、９２１、９２７は、命令８３１、８３５、８３９、８４３が第４実施形態では上述のように別の命令に置き換えられるのと同様に、別の命令に置き換えられる。
【０４２４】
なお、命令９０６、９１２、９１８、９２４の第２オペランドは、オフセット一覧６１３の最大長フィールドの値である。しかし、命令９０６、９１２、９１８、９２４は、第４実施形態においても変わらない。なぜなら、これらの命令の第２オペランドは、文字列リテラルの長さを指定するための値ではなく、文字列リテラルの開始アドレスを計算するために使われる値だからである。
【０４２５】
また、第４実施形態における領域１００３内での数値の並び順を変更した実施形態も可能である。具体的には、オブジェクトコード生成部６０７は、１つの言語の複数の文字列リテラルの長さを示す複数の数値を、連続した複数のアドレスに記録してもよい。その場合、オブジェクトコード生成部６０７は、領域１００３内での数値の並び順に応じて適切にアドレスを指定するための適切なオペランドを含む命令を生成する。
【０４２６】
ところで、本発明は第１〜第４実施形態に限られるものではない。上記の説明においてもいくつかの変形について説明したが、第１〜第４実施形態は、さらに例えば下記の観点から様々に変形することもできる。上記および下記の種々の実施形態は、相互に矛盾しない限り、任意に組み合わせることが可能である。
【０４２７】
説明の便宜上、いくつかの図において具体的な命令をアセンブリコードの形式で例示したが、実際にオブジェクトコードに含まれる命令は、マシンコードである。そして、マシン語の個々の命令の形式は、オブジェクトファイルから得られる実行ファイルを実行するコンピュータの命令セットに応じて異なり得る。コンパイラは、実施形態に応じた命令セットにしたがって、適宜の命令を生成する。
【０４２８】
コンパイラは、場合によっては（例えば、特定のコマンドオプションが指定された場合などには）、マシンコードで記述されるオブジェクトコードの代わりに、アセンブリコードを生成してもよい。そして、アセンブラが、アセンブリコードからオブジェクトコードを生成してもよい。
【０４２９】
生成される命令は、命令セットに応じて異なり得るだけでなく、コンパイラの具体的実装に応じても異なり得る。もちろん、図１０〜１１、１５等に例示されているレジスタの具体名は、説明の便宜上の例に過ぎない。
【０４３０】
例えば、オブジェクトコード生成部６０７は、図１１の命令８２５を省略してもよく、その代わりに、図１０の命令８１４の第２オペランドとしてＹを指定するとともに命令８１９の第２オペランドとして２Ｙを指定してもよい。なお、０とＹの積は０なので、命令８２５が省略される場合も、命令８０９と８２２の第２オペランドは、図１０と同様、０である。つまり、３つの言語に対応する０、Ｙ、２Ｙという３つの数値のうち、実行時のロケールに対応する１つの数値を使って文字列リテラルの開始アドレスを算出するための１つ以上の命令が、生成されてもよい。
【０４３１】
ところで、図１３のステップＳ２０７では、パディングに空白文字が使われる。しかし、実施形態によっては（例えば、コンパイル対象のプログラミング言語によっては）、空白文字以外の文字（例えばＮＵＬＬ文字）がパディングに使われてもよい。
【０４３２】
例えば、ＮＵＬＬ終端の（null-terminated）文字列リテラルが使われてもよい。この場合、図１２の処理によりオフセット一覧６１３に設定される最大長は、ＮＵＬＬ文字を含むバイト長であってもよい。また、この場合、パディングにＮＵＬＬ文字が使われてもよい。
【０４３３】
図１１の命令８３１、８３５、８３９、８４３や、図１５の命令９０９、９１５、９２１、９２７では、文字列リテラルの長さを示すオペランドとして、固定値が指定されている。しかし、実施形態によっては、固定値が指定された命令の代わりに、別の命令列が使われてもよい。
【０４３４】
例えば、文字列リテラルの先頭から１バイトずつ読み取りながら文字列リテラルの末尾を探す処理のための命令列を、オブジェクトコード生成部６０７が生成してもよい。当該命令列は、例えば、文字列リテラルから読み取ったバイトを、文字列リテラルの末尾を示す特殊文字（例えばＮＵＬＬ文字）と比較する命令と、比較結果に応じた条件分岐命令とを含んでいてもよい。
【０４３５】
ところで、複数の言語の互いに対応する文字列リテラルのうちの最大長は、例えば図９に例示されているように、様々な値をとり得る。一方で、ある種のアーキテクチャでは、メモリ管理の単位が１バイトより大きい場合があり得る。例えば、メモリ管理の単位が４バイトの場合があり得る。メモリ管理の単位が１バイトより大きい場合、「最大長そのもの」の代わりに、「最大長以上で、かつ、メモリ管理の単位で割り切れる長さのうちの最小値」が使われてもよい。
【０４３６】
例えば、メモリ管理の単位が４バイトであるとする。また、図９のオフセット一覧６１３には、最大長として、１２、１１、２１、１７という値が記録されている。この場合、上記の各実施形態は、以下のように変形されてもよい。
【０４３７】
・１２は４で割り切れるので、１２という最大長そのものが使われる。例えば、命令８３１、９０６、９０９で、１２がオペランドとして指定される。
・１１は４で割り切れない。１１以上で、かつ、４で割り切れる最小の整数は、１２である。よって、１１の代わりに１２が使われる。例えば、命令８３５、９１２、９１５で、１１の代わりに１２がオペランドとして指定される。
・２１は４で割り切れない。２１以上で、かつ、４で割り切れる最小の整数は、２４である。よって、２１の代わりに２４が使われる。例えば、命令８３９、９１８、９２１で、２１の代わりに２４がオペランドとして指定される。
・１７は４で割り切れない。１７以上で、かつ、４で割り切れる最小の整数は、２０である。よって、１７の代わりに２０が使われる。例えば、命令８４３、９２４、９２７で、１７の代わりに２０がオペランドとして指定される。
【０４３８】
なお、１１、２１、１７という実際の最大長の代わりに、上記のように１２、２４、２０という値が使われる実施形態では、オフセット一覧６１３の「最大長」のフィールドには、これらの１２、２４、２０という値が記録される。つまり、ステップＳ１０９・Ｓ１１０で参照・更新される「最大長」は、実際の最大長より大きい値のことがある。
【０４３９】
また、ステップＳ２０１では、オフセット一覧６１３の「最大長」のフィールドに基づいてオフセットが算出される。こうして算出されるオフセットは、図９に例示された値とは異なり得る。例えば、オフセット一覧６１３の４番目のレコードのオフセットは、４８（＝１２＋１２＋２４＋２０）と変更される。したがって、命令８２９、８３３、８３７、８４１、９０７、９１３、９１９、９２５のオペランドも、オフセット一覧６１３に記録されるオフセットの値に応じて、変更される。
【０４４０】
以上のように、メモリ管理の単位に応じて実際の最大長よりも長いバイト長が使われる実施形態においても、コンパイラは、文字列リテラルの開始アドレスを算出するための命令のオペランドを、コンパイル時に確定することができる。
【０４４１】
ところで、図６のロケールリソースファイル５０２において文字列リテラルが定義される言語の順序は、１番目が英語（"en-us"に対応）、２番目が中国語（"zh-cn"に対応）、３番目が日本語（"ja"に対応）である。しかし、開発者は、任意の他の順序を採用してよい。例えば、１番目が日本語で２番目が英語で３番目が中国語であってもよい。
【０４４２】
また、ロケールリソースファイル５０２では、３つの言語に対応する文字列リテラルが定義されている。しかし、ロケールリソースファイル５０２で文字列リテラルが定義される言語の数は、２以上の任意の数でよい。
【０４４３】
ところで、実行環境のロケールで使われる言語が、ロケールリソースファイル５０２で文字列リテラルが定義されたどの言語とも等しくない場合があり得る。このような場合には、ロケールリソースファイル５０２で文字列リテラルが定義されている言語の中から、デフォルト言語が実行時に選ばれる。例えば、第２実施形態でのデフォルト言語は上記のとおり英語である。
【０４４４】
英語の文字列リテラルがロケールリソースファイル５０２において定義されている場合、第２実施形態のオブジェクトコード生成部６０７は、自動的に、デフォルト言語を英語に決定する。図１０の命令８２２は、この決定に基づいて生成される命令の例である。
【０４４５】
しかし、ロケールリソースファイル５０２において、必ずしも英語の文字列リテラルが定義されているとは限らない。実施形態に応じて、コンパイラ５００（特にオブジェクトコード生成部６０７）は、デフォルト言語を適宜の方法にしたがって決めてよい。以下に４つの方法を例示する。
【０４４６】
第１の方法によれば、「英語の文字列リテラルが、ロケールリソースファイル５０２において定義されているか否か」を、オブジェクトコード生成部６０７がチェックする。英語の文字列リテラルがロケールリソースファイル５０２において定義されている場合、オブジェクトコード生成部６０７は、自動的に、デフォルト言語を英語に決定する。
【０４４７】
逆に、英語の文字列リテラルがロケールリソースファイル５０２において定義されていない場合、オブジェクトコード生成部６０７が、コンパイル処理の途中で、インタラクティブに、ユーザにデフォルト言語を問い合わせてもよい。なお、ここでの「ユーザ」は、ソースファイル５０１のコンパイルをコンパイラ５００に命じる開発者のことである。
【０４４８】
英語を使う２つ以上のロケール（例えば、"en-us"と"en-gb"というロケール名で識別される２つのロケール）用の文字列リテラルが、ロケールリソースファイル５０２において別々に定義されている場合もあり得る。この場合、オブジェクトコード生成部６０７は、それら２つ以上のロケールのうちの１つで使われる英語を、デフォルト言語として自動的に選んでもよい。
【０４４９】
第２の方法によれば、コンパイラ５００のプログラムを呼び出すコマンドのオプションにより、デフォルト言語が明示的に指定される。例えば、図６のロケールリソースファイル５０２が入力としてコンパイラ５００に与えられ、かつ、コマンドオプションで"zh-cn"というロケール名がユーザにより指定されてもよい。この場合、オブジェクトコード生成部６０７は、指定されたコマンドオプションにしたがって、図１０の命令８２２の代わりに、"Mov Reg2, 1"という命令（つまり命令８１４と同じ命令）を生成する。なお、ここでの「ユーザ」も、ソースファイル５０１のコンパイルをコンパイラ５００に命じる開発者のことである。
【０４５０】
第３の方法によれば、ロケールリソースファイル５０２の形式により、デフォルト言語が指定される。ユーザは、どの言語をデフォルト言語として指定したいかに応じて、適切な形式でロケールリソースファイル５０２を作成する。ここでの「ユーザ」も、アプリケーションの開発者のことである。
【０４５１】
例えば、ロケールリソースファイル５０２のヘッダ行で最初に指定される言語を、オブジェクトコード生成部６０７がデフォルト言語と見なしてもよい。例えば、図６のロケールリソースファイル５０２では、たまたま最初に"en-us"というロケール名が指定されている。よって、オブジェクトコード生成部６０７は、「指定されたデフォルト言語は英語である」と認識し、第２実施形態と同様に命令８２２を生成する。
【０４５２】
逆に、ロケールリソースファイル５０２のヘッダ行で最後に指定される言語を、オブジェクトコード生成部６０７がデフォルト言語と見なしてもよい。この場合、オブジェクトコード生成部６０７は、図１０の命令８２２の代わりに、"Mov Reg2, 2"という命令（つまり命令８１９と同じ命令）を生成してもよい。あるいは、この場合、オブジェクトコード生成部６０７は、単に、図１０の命令８１７、命令８１８、命令８２０、ラベル８２１、命令８２２の生成を省略してもよい。
【０４５３】
第４の方法は、デフォルト言語をコンパイル時に１つに決めない方法である。第４の方法では、オブジェクトコード生成部６０７は、命令８２２の代わりに、以下のような命令を含む命令列を生成してもよい。
【０４５４】
・ロケールリソースファイル５０２のヘッダ行で指定されている複数の言語の中から１つをユーザに選ばせるためのＧＵＩ（Graphical User Interface）ウィジェット（例えばドロップダウンリスト）を表示するためのいくつかの命令。なお、ここでの「ユーザ」は、実行ファイル５０７を使うエンドユーザのことである。
・ＧＵＩウィジェットを介して入力される値に基づいて、レジスタＲｅｇ２に適宜の値を設定するためのいくつかの命令。なお、これらの命令の中には、条件分岐命令が含まれる。
【０４５５】
第４の方法によれば、実行環境のロケールで使われる言語が、ロケールリソースファイル５０２で文字列リテラルが定義されたどの言語とも等しくない場合には、実行時にデフォルト言語がユーザによりＧＵＩウィジェットを介して指定される。なお、第４の方法においても、オブジェクトコード生成部６０７が生成する命令列自体は、コンパイル時に確定する。
【０４５６】
以上、様々な実施形態について説明してきたが、いずれの実施形態によっても、以下のように様々な効果が得られる。
【０４５７】
上記の各種実施形態によれば、図２の第１比較例のように実行時にリソースファイルを参照する必要がない。したがって、実行ファイルと複数のリソースファイルとをセットにしてエンドユーザに頒布する必要がない。
【０４５８】
例えば図７の実行ファイル５０７のような単一の実行ファイルだけで、複数の文化圏（換言すれば複数のロケール）に適応することが可能である。つまり、単一の実行ファイルだけで、複数の言語に適応することが可能である。
【０４５９】
実行時にリソースファイルを参照する必要がないと、リソース呼び出しＤＬＬ２０２を介した呼び出しのオーバヘッドをなくせる。その結果、アプリケーションの実行性能が向上する。また、実行時にリソースファイルを参照する必要がないと、エンドユーザが誤ってリソースファイルを削除・編集・移動することを防ぐための管理コストも、不要である。
【０４６０】
さらに、上記の各種実施形態によれば、図３〜４の第２比較例のように、「複数のロケールに応じて複数のソースファイルを作り、各ソースファイルをコンパイルし、複数の実行ファイルをビルドする」という必要もない。上記の各種実施形態によれば、複数のロケールに適応可能な実行ファイル（例えば図７の実行ファイル５０７）を、１回のビルドで作成することが可能である。したがって、上記の各種実施形態は、開発・保守のコストが第２比較例よりも低い。
【０４６１】
また、第３比較例では、コンパイル時にオペランドを確定することができないためにコンパイルが失敗してしまうが、上記の各種実施形態では、そのような失敗はない。なぜなら、同じリテラル組に属する複数の文字列リテラルに、同じ長さが割り当てられるからである。そのため、上記の各種実施形態では、同じリテラル組に属するどの文字列リテラルの開始アドレスも、実行時のロケールによらない共通のオフセットを使って計算することが可能であり、したがって、コンパイル時にオペランドを確定することができる。
【０４６２】
例えば図６に示したように、同じリテラル組に属する複数の文字列リテラル自体の長さ同士は異なり得る。しかし、それらの複数の文字列リテラルに同じ長さが割り当てられている場合、各文字列リテラルの開始アドレスが、コンパイル時に確定される。つまり、コンパイル時にはオペランドが一意に定まる。したがって、第３比較例のような失敗は避けられる。
【０４６３】
以上のように、上記の各種実施形態には、アプリケーションの多言語化を促進するうえで有利な種々の効果がある。したがって、上記の各種実施形態によれば、アプリケーションの多言語化が促進されると期待される。
【０４６４】
最後に、上記の種々の実施形態に関して、さらに下記の付記を開示する。
（付記１）
コンピュータに、
コンパイル対象のソースコードと、複数の言語の間で互いに対応する意味を持つ複数の文字列リテラルの組み合わせであるリテラル組を定義する定義情報と、を読み込み、
各リテラル組について、当該リテラル組に属する複数の文字列リテラルのそれぞれに対して、当該リテラル組のうちで最長の文字列リテラルのバイト長以上である算出バイト長が割り当てられ、かつ、各文字列リテラルの開始アドレスが、実行時に指定されるロケールに応じて参照されるコードを生成する
ことを含むコンパイル処理を実行させるコンパイラ。
（付記２）
前記コードを生成する処理は、
前記ロケールを示すロケール識別情報を取得するための１つ以上の命令と、前記ロケール識別情報に応じた条件分岐のための１つ以上の命令と、前記複数の言語に対応する複数個の数値のうちの１つを用いて各文字列リテラルの前記開始アドレスを参照するための１つ以上の命令と、を含む複数の命令を生成し、
前記複数の命令を前記コードの中に含める
ことを含むことを特徴とする付記１に記載のコンパイラ。
（付記３）
生成される前記コードの中では、言語ごとに文字列リテラルが配置されており、かつ、各言語について、当該言語の複数の文字列リテラルは、リテラル組同士の間で定義される順序で配置されている
ことを特徴とする付記２に記載のコンパイラ。
（付記４）
前記コンパイル処理は、前記算出バイト長を累積加算することによって各リテラル組に対応するオフセットを算出することを含み、
各文字列リテラルの前記開始アドレスを参照するための前記１つ以上の命令は、前記オフセットを含むオペランドが指定された命令を含む
ことを特徴とする付記３に記載のコンパイラ。
（付記５）
前記コンパイル処理は、全リテラル組の前記算出バイト長の合計を算出することを含み、
各文字列リテラルの前記開始アドレスを参照するための前記１つ以上の命令は、前記複数の言語のうち前記ロケールに対応する１つの言語の複数の文字列リテラルが配置された範囲の開始アドレスを、前記合計に基づいて算出するための命令を含む
ことを特徴とする付記４に記載のコンパイラ。
（付記６）
前記ソースコードは、前記複数の言語のうちの１つの言語で書かれた複数の文字列リテラルのそれぞれについて、当該文字列リテラルか、または、当該文字列リテラルへの参照を含み、
前記リテラル組同士の間で定義される前記順序は、前記１つの言語で書かれた前記文字列リテラルまたは前記１つの言語で書かれた前記文字列リテラルへの前記参照が、前記ソースコード内に出現する順序に基づく
ことを特徴とする付記３から５のいずれか１項に記載のコンパイラ。
（付記７）
生成される前記コードの中では、リテラル組ごとに文字列リテラルが配置されており、かつ、各リテラル組について、当該リテラル組に属する複数の文字列リテラルは、前記複数の言語の間で定義される順序で配置されている
ことを特徴とする付記２に記載のコンパイラ。
（付記８）
前記コンパイル処理は、前記算出バイト長を累積加算することによって各リテラル組に対応する第１の値を算出することを含み、
各文字列リテラルの前記開始アドレスを参照するための前記１つ以上の命令は、前記複数の言語の数と前記第１の値とに応じて決まる第２の値を含むオペランドが指定された命令を含む
ことを特徴とする付記７に記載のコンパイラ。
（付記９）
第１のロケールと第２のロケールで特定の自然言語が使われ、
前記複数の言語のうちの２つは、前記第１のロケールで使われる前記特定の自然言語と、前記第２のロケールで使われる前記特定の自然言語であり、
前記ロケール識別情報が前記第１のロケールを示す場合には前記複数個の数値のうちの第１の数値を使って前記開始アドレスを算出し、前記ロケール識別情報が前記第２のロケールを示す場合には前記複数個の数値のうちの第２の数値を使って前記開始アドレスを算出するための命令が、前記複数の命令に含まれる
ことを特徴とする付記２から８のいずれか１項に記載のコンパイラ。
（付記１０）
第１のロケールと第２のロケールで特定の自然言語が使われ、
前記複数の言語のうちの１つは、前記第１のロケールと前記第２のロケールに共通の前記特定の自然言語であり、
前記ロケール識別情報が前記第１のロケールを示す場合と、前記ロケール識別情報が前記第２のロケールを示す場合のいずれにおいても、前記複数個の数値のうちのある１つの数値を用いて前記開始アドレスを算出するための命令が、前記複数の命令に含まれる
ことを特徴とする付記２から８のいずれか１項に記載のコンパイラ。
（付記１１）
前記コンパイル処理は、実行時に指定される前記ロケールで使われる言語が前記複数の言語のうちのいずれとも異なる場合に使われるデフォルト言語を、前記複数の言語のうちの１つに決定することを含み、
前記複数の言語のうちのいずれとも異なる言語を使うロケールを前記ロケール識別情報が示している場合に、前記複数個の数値のうちで前記デフォルト言語に対応する１つの数値を用いて前記開始アドレスを算出するための命令が、前記複数の命令に含まれる
ことを特徴とする付記２から１０のいずれか１項に記載のコンパイラ。
（付記１２）
各リテラル組について、当該リテラル組に属する複数の文字列リテラルのうち前記算出バイト長未満の長さの各文字列リテラルを所定の文字でパディングし、パディングした前記文字列リテラルを前記コード内に配置することを、前記コードを生成する処理が含む
ことを特徴とする付記１から１１のいずれか１項に記載のコンパイラ。
（付記１３）
前記コードを生成する処理は、
各リテラル組に属する複数の文字列リテラルそれぞれの長さを示す数値を前記コード内に埋め込み、
前記長さを示す前記数値が埋め込まれたアドレスを参照するための命令を生成する
ことを含むことを特徴とする付記１から１１のいずれか１項に記載のコンパイラ。
（付記１４）
前記ソースコードが、前記ロケールによらずに共通に使われる言語非依存の文字列リテラルを含むか、または、前記言語非依存の文字列リテラルへの参照を含むとき、前記コードを生成する処理は、前記言語非依存の文字列リテラルを前記コードに含めることを含む
ことを特徴とする付記１から１３のいずれか１項に記載のコンパイラ。
（付記１５）
各リテラル組に対応する前記算出バイト長は、当該リテラル組に属する複数の文字列リテラルのうちで最長の文字列リテラルのバイト長である
ことを特徴とする付記１から１４のいずれか１項に記載のコンパイラ。
（付記１６）
各リテラル組に対応する前記算出バイト長は、メモリ管理の単位である所定のバイト長の倍数であり、かつ、当該リテラル組に属する複数の文字列リテラルのうちで最長の文字列リテラルのバイト長以上である、という条件を満たす最小のバイト長である
ことを特徴とする付記１から１４のいずれか１項に記載のコンパイラ。
（付記１７）
コンピュータが、
コンパイル対象のソースコードと、複数の言語の間で互いに対応する意味を持つ複数の文字列リテラルの組み合わせであるリテラル組を定義する定義情報と、を読み込み、
各リテラル組について、当該リテラル組に属する複数の文字列リテラルのそれぞれに対して、当該リテラル組のうちで最長の文字列リテラルのバイト長以上である算出バイト長が割り当てられ、かつ、各文字列リテラルの開始アドレスが、実行時に指定されるロケールに応じて参照されるコードを生成する
ことを特徴とするコンパイル方法。
（付記１８）
コンパイル対象のソースコードと、複数の言語の間で互いに対応する意味を持つ複数の文字列リテラルの組み合わせであるリテラル組を定義する定義情報とに基づいて、各リテラル組について、当該リテラル組に属する複数の文字列リテラルのそれぞれに対して当該リテラル組のうちで最長の文字列リテラルのバイト長以上である算出バイト長が割り当てられており、かつ、各文字列リテラルの開始アドレスが、実行時に指定されるロケールに応じて参照されるコードを、生成する生成部
を備えるコンパイル装置。
【符号の説明】
【０４６５】
１００、３０２、４０２、５００  コンパイラ
１０１  ソースコード
１０２  定義情報
１０３  オブジェクトコード
２００  実行環境
２０１、３１１、５０７  実行ファイル
２０２  リソース呼び出しＤＬＬ
２０３  リソースファイル群
２０４  英語リソースファイル
２０５  日本語リソースファイル
２０６  中国語リソースファイル
３００  日本語向け開発環境
３０１、４０１、５０１  ソースファイル
３０３〜３０４、３２０、３３０、４０３、５０３〜５０５、９００、１０００  オブジェクトファイル
３０５、５０６  リンカ
３０６、３２１、３３１、４０４  ＲＯ領域
３０７〜３０９、３２２、３３２、４０５、８０３〜８０５、８０７〜８１０、８１２〜８１５、８１７〜８２０、８２２、８２５〜８４４、９０３〜９２８  命令
３１０  日本語の実行環境
３１２  画面
５０２  ロケールリソースファイル
６００  解析部
６０１  字句解析部
６０２  構文解析部
６０３  意味解析部
６０４  手続き解析部
６０５  リテラル登録部
６０６  割り付け部
６０７  オブジェクトコード生成部
６０８  リテラル配置部
６０９  言語非依存リテラル一覧
６１０  日本語リテラル一覧
６１１  英語リテラル一覧
６１２  中国語リテラル一覧
６１３  オフセット一覧
７００  コンピュータ
７０１  ＣＰＵ
７０２  ＲＯＭ
７０３  ＲＡＭ
７０４  通信インタフェイス
７０５  入力装置
７０６  出力装置
７０７  記憶装置
７０８  駆動装置
７０９  バス
７１０  可搬型記憶媒体
７１１  ネットワーク
７１２  プログラム提供者
８００〜８０２、８０６、８１１、８１６、８２１、８２３、８２４、９０２  ラベル
９０１、１００１〜１００４  領域
【図１】
2015194862.tif 000035
【図２】
2015194862.tif 000036
【図３】
2015194862.tif 000037
【図４】
2015194862.tif 000038
【図５】
2015194862.tif 000039
【図６】
2015194862.tif 000040
【図７】
2015194862.tif 000041
【図８】
2015194862.tif 000042
【図９】
2015194862.tif 000043
【図１０】
2015194862.tif 000044
【図１１】
2015194862.tif 000045
【図１２】
2015194862.tif 000046
【図１３】
2015194862.tif 000047
【図１４】
2015194862.tif 000048
【図１５】
2015194862.tif 000049
【図１６】
2015194862.tif 000050