JP2010108076A - ソースコード変換方法、サーバシステム、およびサーバプログラム - Google Patents

ソースコード変換方法、サーバシステム、およびサーバプログラム Download PDF

Info

Publication number
JP2010108076A
JP2010108076A JP2008277002A JP2008277002A JP2010108076A JP 2010108076 A JP2010108076 A JP 2010108076A JP 2008277002 A JP2008277002 A JP 2008277002A JP 2008277002 A JP2008277002 A JP 2008277002A JP 2010108076 A JP2010108076 A JP 2010108076A
Authority
JP
Japan
Prior art keywords
string
character string
source code
bytebuffer
type variable
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2008277002A
Other languages
English (en)
Other versions
JP5164112B2 (ja
Inventor
Kazuaki Ishizaki
一明 石崎
Kazunori Ogata
一則 緒方
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Priority to JP2008277002A priority Critical patent/JP5164112B2/ja
Publication of JP2010108076A publication Critical patent/JP2010108076A/ja
Application granted granted Critical
Publication of JP5164112B2 publication Critical patent/JP5164112B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

【課題】ソースコードに対して、HTTPリクエストのStringクラスへの変換処理におけるオーバーヘッドを削減したソースコードに、プログラマが作成したソースコードを自動変換する方法、サーバシステム、およびサーバプログラムを提供すること。
【解決手段】コンピュータを用いて、プログラムのソースコードをコード変換する方法を提供する。コード変換する方法は、文字列を保持する文字列型変数s=new String(b,“UTF-8”)を特定するステップと(ステップS210)、前記文字列型変数を、前記文字列を格納するバッファへの参照を保持する参照文字列型変数s=new String(bb)に変換するステップ(ステップS220)と、前記文字列型変数を前記参照文字列型変数に型変換した前記ソースコードを格納するステップと、を含む。
【選択図】図2

Description

本発明は、ソースコード変換方法に関する。特に、HTTPリクエストを文字列型変数に変換する際のオーバーヘッドを削減したソースコードに変換する方法に関する。
従来、文字列を表現するために、Groovy等のスクリプト開発環境、または、Java(登録商標)、およびC#(登録商標)等のいわゆる高級言語を用いるプログラム開発環境ではStringクラスが用意されている。このStringクラスには、以下の2つの特徴がある。
特徴1)Stringクラスは、多言語をサポートするために、文字列の表現にUnicode文字を用い、また、文字コードのエンコーディングにUTF−16を用いる。
特徴2)Stringクラスは、Immutableオブジェクトを生成するクラスである。Immutableとは、不変という意味であり、Immutable(不変)オブジェクトは、生成後に状態を変更することはできない。なお、以降、Java、C#については(登録商標)の注記を省略する。
Stringクラスは、JavaやC#で書かれたプログラムによって構築されるWebサーバにて、クライアントから受信したHTTPリクエストを解析するために用いることができる。具体的には、HTTPプロトコルに基づいてクライアントから受信したHTTPリクエストを、JavaやC#で書かれたプログラムによって構築されるWebサーバが、受信したHTTPリクエストをStringクラスに変換し、メッセージを解析する。図11を用いて、Javaで書かれたWebサーバにおける、HTTPリクエストをStringクラスに変換する処理について説明する。
図11は、従来技術に係る、HTTPリクエストのStringクラスへの変換処理を示す概要図である。白抜き矢印は、HTTPリクエストの流れ、および処理の流れを表している。この変換処理は、変換処理を備えたWebサーバが、HTTPリクエストを受信したことに応じて、処理が開始する。まず、クライアントから受信したHTTPリクエストは、一般的に、kernelからByteBufferオブジェクトbb1に読み込まれる。ByteBufferオブジェクトbb1は、ByteBufferクラス(Java言語においては、java.nio.ByteBuffer)から変数名bbとして生成されたByteBufferオブジェクトである。HTTPリクエストは文字列をパーセントエンコーディングしたUTF−8であるので、ByteBufferオブジェクトbb1に読み込まれたHTTPリクエストはUTF−8であり、図11に示すように1文字につき1バイト消費する。図11において、便宜上、ByteBufferオブジェクトbb1に読み込まれたHTTPリクエストはUTF−8の文字コードではなく、文字で表わす。
次に、ByteBufferオブジェクトbb1に格納されたHTTPリクエストは、UTF−8にエンコーディングされたbyte[]配列として、Stringクラスのコンストラクタに、渡される。このコンストラクタは、String(bb.array(),“UTF-8”)で表される。コンストラクタ内で、byte[]配列のHTTPリクエストは、UTF−8からUTF−16へ変換される。UTF−16へ変換されたHTTPリクエストはコピーされ、このコピーをchar[]配列4に変換しStringオブジェクトs2に格納される。Stringオブジェクトs2は、Stringクラス(Java言語においては、java.lang.String)から変数名sとして生成されたStringオブジェクトである。char[]配列4はUTF−16であるので、図11に示すように1文字につき2バイト消費する。このようにして、Webサーバが受信したHTTPリクエストは、Stringクラスに変換される。
ところで、JSP(Java Server Pages)等により動的コンテンツを生成する際の処理において、多言語に対応するために、JSP内のテキストはUTF−16に変換されている。そのため、HTTPリクエストのStringクラスへの変換処理において、HTTPリクエストをUTF−8からUTF−16へ変換するのと同じように、JSPの実行に際して、JSP内のテキストをUTF−16からUTF−8へ変換している。JSPの実行に際して、JSP内のテキストをUTF−16からUTF−8へ変換することはオーバーヘッドとなっており、そのオーバーヘッドを削減する方法が開示されている(特許文献1)。
特開2005−332146号公報
上述したHTTPリクエストのStringクラスへの変換処理の中には、以下の3つのオーバーヘッドが存在するという課題がある。
課題a)ByteBufferオブジェクトに格納されているHTTPリクエストのコピーによる、オーバーヘッドがある。Stringクラスから生成されるオブジェクトが「不変」であることを確実に保証するため、ByteBufferオブジェクトbbに格納されたHTTPリクエストは常に、コピーされ、コピーされたHTTPリクエストがchar[]配列に変換されてStringオブジェクトsに格納されるからである。
課題b)HTTPリクエストのUTF−8からUTF−16へのエンコード変換による、オーバーヘッドがある。HTTPリクエストは文字列をパーセントエンコーディングしたUTF−8である。一方、Stringクラスは多言語をサポートするために、文字コードのエンコーディングにUTF−16を用いる。そのため、HTTPリクエストのUTF−8からUTF−16へのエンコード変換が必要であるからである。
課題c)Stringオブジェクトにおいて文字列をUTF−16として保持することによる、オーバーヘッドがある。HTTPリクエストの多くはASCII文字(0x00−0x7f)であるため、Stringオブジェクトに文字列をUTF−16として格納することは、不要にメモリ消費する場合が多いためである。
HTTPリクエストのStringクラスへの変換処理には、これら3つのオーバーヘッドが存在する。特許文献1には、JSP内のテキストをUTF−16からUTF−8へ変換することによるオーバーヘッドを削減する方法が記載されている。しかし、それでは、HTTPリクエストのStringクラスへの変換処理における、課題b)のオーバーヘッドしか削減することができない。
本発明は、ソースコードに対して、HTTPリクエストのStringクラスへの変換処理におけるオーバーヘッドを削減したソースコードに自動変換する方法、サーバシステム、およびサーバプログラムを提供することを目的とする。
本発明は、上記課題に鑑み、以下のような解決手段を提供する。なお、本願明細書に記載の用語「サーバ装置」とは、文字列の受信に応答して、文字列に記述されている情報に応じて処理を行う装置であって、例えば、文字列がHTTPリスエスである場合には、サーバ装置はWebサーバである。
本発明は、プログラムの文字列操作におけるオーバーヘッドを削減するために、ソースコードを変換する方法を提供する。具体的には、文字列を直接的に保持する文字列型変数を、文字列を格納するバッファを参照することにより、間接的に文字列を保持参照文字列型変数に型変換したソースコードに変換する方法、およびサーバシステム、およびサーバプログラムを提供する。
本発明の1つの態様によると、コンピュータを用いて、プログラムのソースコードをコード変換する方法を提供する。コード変換する方法は、文字列を保持する文字列型変数を特定するステップと、特定した前記文字列型変数を、前記文字列を格納するバッファへの参照を保持する参照文字列型変数に型変換するステップと、前記文字列型変数を前記参照文字列型変数に型変換した前記ソースコードを格納するステップと、を含む。
本態様によると、文字列を保持する文字列型変数は、文字列を格納するバッファへの参照を保持する参照文字列型変数に型変換したソースコードに変換される。それにより、文字列型変数は、文字列に変わって参照(ポインタ)を保持することにより、文字列を格納するバッファから文字列型変数に文字列をコピーすることが無くなる。その結果、オーバーヘッドが削減される。
ここで、文字列型変数とは、文字を保持する変数であり、例えば、Java言語においてはjava.lang.Stringクラス、C#言語ではStringクラスである。バッファとは、プログラムが実行されている際に、データ、ここでは文字列を一時的に保存しておく記憶領域をいう。
また、本態様は、型変換するステップが、更に、バッファが「不変(Immutable)」であるか否かを判定するステップを含む。それにより、文字列型変数が「不変」であるという特徴を、型変換した参照文字列型変数も持つことができる。その結果、文字列型変数に文字列を保持しなくとも、「不変」という特徴は保たれ、オーバーヘッドが削減される。
本発明は、既存の技術と組み合わせることができ、そのように組み合わせた技術もまた、本発明の技術範囲に含まれる。更に、本発明の技法は、ソースコード変換方法の諸段階を、FPGA(現場でプログラム可能なゲートアレイ)、ASIC(特定用途向け集積回路)、これらと同等のハードウェアロジック素子、プログラム可能な集積回路、またはこれらの組み合わせが記憶し得るプログラムの形態、すなわちプログラム製品として提供し得る。具体的には、データ入出力、データバス、メモリバス、システムバス等を備えるカスタムLSI(大規模集積回路)の形態として、本発明に係るソースコード変換方法の実行手段、デバイス、組み込み装置等を提供でき、そのように集積回路に記憶されたプログラム製品の形態も、本発明の技術範囲に含まれる。
本発明によれば、ソースコードに対して、HTTPリクエストのStringクラスへの変換処理におけるオーバーヘッドを削減したソースコードに自動変換する方法、サーバシステム、およびサーバプログラムを提供することができる。また、オーバーヘッドを削減したソースコードにより、HTTPリクエストのStringクラスへの変換処理に要する時間を短縮することができる。
以下、本発明の実施形態について図を参照しながら説明する。これらはあくまでも一例であって、本発明の技術的範囲はこれらに限られるものではない。以下、文字列がHTTPリクエストである場合について説明する。なお、文字列は、HTTPリクエストに限らず、文字列型変数に変換されるものであって、US−ASCII文字の文字列であればよい。
本発明の一実施形態においては、ユーザが書いた任意のプログラム中に記述された、HTTPリクエストをStringクラスに変換する処理(以下、簡略化のため変換処理とする)記述を含むソースコードを、本発明における課題であるa)、b)、c)、3つのオーバーヘッドを削減したソースコードに自動的に変換する。具体的には、変換処理における3つのオーバーヘッドを削減したソースコードに変換するために、String(java.nio.ByteBuffer bb)を新設したStringクラスのコンストラクタを用いたソースコードに変換可能な条件を満たしているか判断する。判断した結果、条件を満たしている場合には、プログラマが作成したプログラムのソースコードに対して、String(java.nio.ByteBuffer bb)を新設したStringクラス(参照文字列型変数)のコンストラクタを用いたソースコードに変換する。
最初に、String(java.nio.ByteBuffer bb)について説明する。String(java.nio.ByteBuffer bb)は、Stringクラスのコンストラクタに新設される。このStringクラスは、従来のStringクラスとは異なり、次のような特徴を持つ。なお、以下区別するために、コンストラクタにString(java.nio.ByteBuffer bb)が新設されたコンストラクタを、String(ByteBuffer)コンストラクタとする。
特徴1)ByteBufferオブジェクトbb(バッファ)にASCII文字のみが含まれている場合は、Stringオブジェクトsの文字列保持を、Stringオブジェクトs内に文字列を保持せず、ByteBufferオブジェクトbbへのポインタを保持することで実現する。
特徴2)StringオブジェクトsがByteBufferオブジェクトbbへのポインタを保持している場合、Stringクラスのメソッドを経由して文字を取り出す際には、ポインタが指すByteBufferオブジェクトbbから必要な8ビット文字を読み出して、上位8ビットに00を付加してcharに変換して値を返す。詳細な処理については、後述する。
特徴3)StringオブジェクトsがByteBufferオブジェクトbbへのポインタを保持している場合、ASCII文字について保持している文字列とByteBufferオブジェクトbbに保持している文字列とは、いずれもUTF−8であって、同一エンコーディングである。そのため、従来、Stringオブジェクトsから文字列をbyte[]配列として取得する際に行っていた、String.getBytes(“UTF-8”)を用いたエンコーディング変換は行わない。
HTTPリクエストは文字列をパーセントエンコーディングしたUTF−8であるので、ByteBufferオブジェクトbbに格納されたHTTPリクエストは必ずUS−ASCII文字である。その事実を利用して、String(ByteBuffer)コンストラクタを用いることによって、Stringオブジェクトsを生成する際のUTF−8からUTF−16への変換を無くすことができ、本発明における課題であるb)のオーバーヘッドを削減できる。また、String(ByteBuffer)コンストラクタを用いることによって、入力されたByteBufferオブジェクトbbへのポインタをStringオブジェクトsが保持することができる。その結果、UTF−16を用いて文字列を保存することを無くすことができるので、課題c)で挙げたオーバーヘッドが削減できる。
上述したString(ByteBuffer)コンストラクタを用いることができるソースコードには条件がある。そのため、プログラマが作成したソースコードが、String(ByteBuffer)コンストラクタを用いたソースコードに変換可能であるか確認する必要がある。変更可能であるためには、ByteBufferオブジェクトbbに、HTTPリクエストが書き込まれた後、ByteBufferオブジェクトbbの内容が変更されないこと、すなわち、ByteBufferオブジェクトbbが「不変」であることが条件である。この条件を満たすか否かは、以下の2つの方法で行うことができる。
方法1)コンパイラ・ツールによる構文解析を行う。解析のアルゴリズムについては、後述する。
方法2)プログラマが、アノテーション等によって、明示的に保証する。
HTTPリクエストが格納されたByteBufferオブジェクトbbがStringオブジェクトsが使用される区間で、ByteBufferオブジェクトbbが「不変」であることが上述した2つの方法により、保証できた場合のみ、String(ByteBuffer)コンストラクタを用いてStringオブジェクトsを生成するソースコードへと、自動的に変換する。なお、上述した2つの方法のうち少なくとも1つにて、ByteBufferオブジェクトbbが「不変」であることが保証されればよい。
上記方法にて、ByteBufferオブジェクトbbが「不変」であることを保証することにより、Stringクラスが「不変」であることが保証される。その結果、Stringクラスから生成されるオブジェクトが「不変」であることを保証するためのStringクラスのインスタンス内のchar[]配列へのコピーの必要が無くすことができるので、課題a)で挙げたオーバーヘッドを削減できる。
ByteBufferオブジェクトbbが「不変」であることが保証されているソースコードに、コンストラクタにString(java.nio.ByteBuffer bb)が新設されたStringクラスを用いてStringオブジェクトsを生成することにより、課題a)b)c)で挙げたオーバーヘッドを削減することができる。
図1は、本発明の一実施形態に係る、HTTPリクエストのStringクラスへの変換処理を示す概要図である。なお、図1に示す変換処理は、上述したString(ByteBuffer)コンストラクタを用いたソースコードによる変換処理である。白抜き矢印は、HTTPリクエストの流れ、および処理の流れを表している。変換処理は、変換処理を備えたWebサーバが、HTTPリクエストを受信したことに応じて、処理が開始する。まず、クライアントから受信したHTTPリクエストは、kernelからByteBufferオブジェクトbb1に読み込まれる。この処理は、図11に示す従来技術と同様である。
次に、ByteBufferオブジェクトbb1は、StringクラスのString(ByteBuffer)コンストラクタに渡される。String(ByteBuffer)コンストラクタにて作成されたStringオブジェクトsは、ByteBufferオブジェクトbb1へのポインタ3を格納する。このようにすることで、HTTPリクエストは、UTF−8からUTF−16へ変換されず、Stringオブジェクトs内のchar[]配列へのコピーもされず、StringオブジェクトsにUTF−16としてHTTPリクエストを保持することもない。すなわち、本発明における課題であるa)b)c)3つのオーバーヘッドの課題を解決することができる。
次に、図1にて概要図を示した変換処理を、フローチャートを用いて説明する。最初に、図11にて概要図を示した、従来技術に係る変換処理のフローチャートについて説明する。図12は、従来技術に係る、HTTPリクエストのStringクラスへの変換処理のフローチャートである。
S10:Webサーバがクライアントから受信したHTTPリクエストは、WebサーバのkernelからByteBufferオブジェクトbbに読み込まれる。
S20:ByteBufferオブジェクトbbの内容をbyte[]配列として返すbb.array()を実行し、ByteBufferオブジェクトbbに格納されたHTTPリクエストをbyte[]配列に変換する。
S30:ステップS20でbyte[]配列に変換されたHTTPリクエストと、エンコードしたい形式としてのUTF−8とを引数として、Stringクラスのコンストラクタを呼び出す。
S40:ステップS30で呼び出されたStringクラスのコンストラクタにて、byte[]配列に変換されたByteBufferオブジェクトbbのHTTPリクエストをUTF−8からUTF−16へ変換する。
S50:ステップS40でUTF−16へ変換されたHTTPリクエストはコピーされ、このコピーをchar[]配列に変換し、Stringオブジェクトsに保持する。
次いで、本発明の一実施形態に係る変換処理のフローチャートを示す。図2は、本発明の一実施形態に係る、HTTPリクエストのStringクラスへの変換処理のフローチャートである。
S100:HTTPリクエストを、WebサーバのkernelからByteBufferオブジェクトbbに読み込む。本処理は、図12のステップS10と同じである。
S110:ByteBufferオブジェクトbbを引数として、StringクラスのString(ByteBuffer)コンストラクタを呼び出す。
S120:ByteBufferオブジェクトbbに格納されているHTTPリクエストが、ASCII文字のみであるか判断する。判断結果がYESの場合には、ステップS130へ処理を移す。一方、判断結果がNOの場合には、図1のステップS20に処理を移し、図12に示す従来技術に係る変換処理を行う。
S130:ByteBufferオブジェクトbbへのポインタを取得し、Stringオブジェクトsに保持する。
続いて、プログラマが作成した、図11、12に示す従来技術に係る変換処理の記述が含まれているソースコードを、図1、2に示す本発明の一実施形態に係る変換処理の記述を含むソースコードに自動的に変換するアルゴリズムについて説明する。プログラマが作成したソースコードを、図1、2に示す変換処理の記述を含むソースコードに変換することにより、課題a)b)c)で挙げたオーバーヘッドを削減したソースコードとなる。
図3は、本発明の一実施形態に係る、オーバーヘッドを削減するソースコードに変換するアルゴリズムを示すフローチャートである。本アルゴリズムは、プログラマが書いたソースコード内にHTTPリクエストを保持するByteBufferオブジェクトbbを指定する記述がある場合に、下記の通りに動作する。ByteBufferオブジェクトbbの指定方法としては、プログラム中に記述する、外部から設定ファイルで与える等の方法がある。本アルゴリズムは、コンパイラが備え、コンパイラにより実行される。本アルゴリズムにより作成された、オーバーヘッドを削減するソースコードは、ハードディスク等の記憶手段に格納される。なお、オーバーヘッドを削減するソースコードではなく、オーバーヘッドを削減するソースコードがコンパイラによってコンパイルされた結果生成されるオブジェクトコード(コンピュータ上で実行可能な形式)を記憶手段に格納してもよい。
S200:ByteBufferオブジェクトbbが、「不変」であることを保証するための条件を満たしているか判断する。ByteBufferオブジェクトbbが「不変」であることを保証するための条件を満たしていない場合には、処理は終了し、満たしている場合には、ステップS210へ処理を移す。ByteBufferオブジェクトbbが「不変」であることを保証するための条件については後述する。上述したように、本発明の一実施形態において、HTTPリクエストは、Stringオブジェクトs内に、HTTPリクエストを格納しているByteBufferオブジェクトbbへのポインタを保持することにより参照できる。そのため、Stringクラスが「不変」であるという条件を満たすためには、ByteBufferオブジェクトbbが「不変」でなければならないからである。
S210:bb.array()の戻り値(bとする)と、エンコードしたい形式としてのUTF−8を引数として、UTF−16に変換後の文字列を格納するStringオブジェクトを代入する変数(sとする)を代入先とした「s=new String(b,“UTF-8”)」という代入文が検知できたか判断する。ここで、変数sは、Stringオブジェクトであり、上述しているStringオブジェクトsと同じである。代入文が検知できた場合には、ステップS220へ処理は移り、検知できなかった場合には処理は終了する。
S220:ステップS210で検知した「s=new String(b,"UTF-8")」の直後に、「s=new String(bb)」という代入文を生成する。
S230:ステップS210で検知した「s=new String(b,"UTF-8")」を削除する。
S240:ステップS230で削除した「s=new String(b,"UTF-8")」の引数のうち、プログラム中で使用されていない変数に関する代入文を削除する。
ByteBufferオブジェクトbbが「不変」であることを保証するための条件について説明する。ここでは、ByteBufferオブジェクトbbが「不変」であることを保証するための方法のうち、方法1)のコンパイラ・ツールにより解析を行う方法における条件について説明する。コンパイラ・ツールは、ユーザによってプログラム中に記述された、HTTPリクエストが格納されるByteBufferオブジェクトbbについて、メソッド中でByteBufferオブジェクトbbの値が生成されてから使用されなくなるまでの範囲において、以下の5つの条件の全てを満たしているかどうか解析する。
この5つの条件全てが満たされていれば、ByteBufferオブジェクトbbにSocketChannel.read()によって値(HTTPリクエスト)が書き込まれてから使用が終了するまで値が書き換えられることがない。そのため、Stringオブジェクトsの中で、コンストラクタに渡されたByteBufferオブジェクトbbへのポインタを保持し続けることによって、Stringオブジェクトに文字列を保持しなくとも、Stringオブジェクトの「不変」は保証される。
条件1)ByteBufferオブジェクトbbがインスタンス変数、または、クラス変数に代入されていない。
条件2)ByteBufferオブジェクトbbがメソッドの返値となっていない。
条件3)ByteBufferオブジェクトbbが、SocketChannel.read(ByteBuffer)メソッド以外の、メソッド呼び出しの引数、となっていない。
条件4)ByteBufferオブジェクトbbが、SocketChannel.read(ByteBuffer)で参照された後、左辺に現れない。
条件5)ByteBufferオブジェクトbbが、SocketChannel.read(ByteBuffer)で参照された後、bb.put()、bb.put*()メソッドが呼ばれていない。
条件4)に示す、ByteBufferオブジェクトbbが左辺に現れないとは、ByteBufferオブジェクトbbの内容が書き換えられないということを示している。なお、ByteBufferオブジェクトbbが左辺に現れた場合、その直前までを解析対象としてもよい。また、条件5)に示す、bb.put*()とは、bb.putChar(int index,char value)等のputから始まるメソッドを意味する。bb.put()、bb.put*()メソッドが呼ばれていないとは、すなわち、ByteBufferオブジェクトbbの内容を書き換えるメソッドが呼ばれておらず、ByteBufferオブジェクトbbの内容が書き換えられないということを示している。
なお、ByteBufferオブジェクトbbがObject Poolingを利用している場合、ByteBufferオブジェクトbbをPoolから取り出すメソッドが呼ばれてからPoolに返却するメソッドが呼ばれるまでの範囲が解析対象となる。この2つのメソッドは、プログラムで使われているObject Poolingの仕様より、コンパイラ・ツールはknownであるとする。ここで、Object Poolingとは、生成したオブジェクトをプール(Pool)に蓄積しておき、必要になった際にプールからオブジェクトを取り出して利用し、不要になった際にはオブジェクトをプールに戻すことである。Object Poolingを用いることは、利用する度にオブジェクトを生成する方法に比べ、速度が速いという利点がある。
また、ByteBufferオブジェクトbbがObject Poolingを利用している場合、上記の条件1)から条件5)によるソースコードの静的解析だけではStringオブジェクトの「不変」を保証できないので、Stringオブジェクトと共有されているByteBufferクラスへの書き込みがあった場合に、内容を保持するByteBufferオブジェクトを新規に作成するCopy−On−Writeメカニズムを導入して、Stringオブジェクトの「不変」を保証する。ただし、Copy−On−Writeメカニズムを導入して、Stringオブジェクトの「不変」を保証する必要があるのは、Stringオブジェクトが使用される区間内に、ByteBufferオブジェクトbbがプールに戻される場合である。
ここで、Copy−On−Writeメカニズムとは、オブジェクトの複製を要求された際には、コピーをした振りをして、とりあえず原本をそのまま参照させ、原本またはコピーのどちらかに書き込みが行われようとした際に、それを検出し、その時点で初めて新たな空き領域を探して割り当て、コピーを実行する技術である。
図3に示したフローチャートを用いて、コード変換するサーバシステムにおける各手段について説明する。特定手段は、図3のステップS210処理、すなわち、ソースコードからStringオブジェクトを代入する変数(s)を代入先とした「s=new String(b,“UTF-8”)」という代入文を検知する処理を行う。変換手段は、図3のステップS220およびS230の処理、すなわち、特定手段にて検知した代入文「s=new String(b,“UTF-8”)」を、代入文「s=new String(bb)」に変換する。格納手段は、変換手段にて、代入文「s=new String(bb)」に変換されたソースコードを、ハードディスク等の記憶手段に格納する。
ここで、コンストラクタにString(java.nio.ByteBuffer bb)を新設したStringクラスの特徴の1つである、StringオブジェクトsがByteBufferオブジェクトbbへのポインタを保持している場合の、Stringクラスのメソッドを経由して文字を取り出す処理について説明する。図4は、本発明の一実施形態に係る、ByteBufferオブジェクトbbへポインタを保持するStringオブジェクトsにおける、文字取得処理のフローチャートである。
S300:StringオブジェクトsにByteBufferオブジェクトbbへのポインタが保持されているか判断する。ポインタが保持されている場合には、処理をステップS310へ移し、保持されていない場合には、Stringオブジェクトs内にchar[]配列が保持されているので、char[]配列を取得し、戻り値として返す。
S310:Stringオブジェクトsに保持されているポインタが示すByteBufferオブジェクトbbから、必要な8ビット文字を読み出す。
S320:ステップS310にて読み出した8ビット文字の上位8ビットに00を付加して、char[]配列に変換する。
S330:戻り値として、ステップS320にて変換されたchar[]配列を返す。
このようにして、StringオブジェクトsがByteBufferオブジェクトbbへのポインタを保持している場合において、ByteBufferオブジェクトbbから文字を取り出すことができる。
図5は、本発明の一実施形態に係るStringクラスの実装を示す図である。図5を用いて、本発明の実装の詳細について説明する。まず、コンストラクタにString(java.nio.ByteBuffer bb)が新設されたStringクラスの例を、Java言語のjava.lang.Stringクラスを用いて示す。図5では、java.lang.Stringクラスの内部で使われるフィールドと、代表的なメソッドとして文字列を設定するjava.lang.Stringクラスのコンストラクタ(String(ByteBuffer)コンストラクタ)、java.lang.Stringの文字列から1文字取り出すcharAt()メソッド、用意したbyte[]配列にjava.lang.Stringの文字列をコピーするgetBytes()メソッド、を示す。
String(ByteBuffer)コンストラクタ10では、入力されたByteBufferオブジェクトbbが指す文字列を検査し、もし0x80以上の文字が含まれていた場合には通常のUTF−16表現で文字列を保持する。それ以外の場合は、入力されたByteBufferオブジェクトbbを保持する。charAt()メソッド11では、ByteBufferオブジェクトbbがそのまま保持されていた場合、ByteBufferオブジェクトbbから必要な8ビット文字を読み出して、上位8ビットに00を付加してcharに変換して値を返す。getBytes()メソッド12では、ByteBufferオブジェクトbbがそのまま保持されていた場合、ByteBufferオブジェクトbbが指す文字列はUTF−8であるので、そのままbyte[]配列にコピーする。
次に、Copy−On−Writeについて、Java言語のjava.nio.ByteBufferクラスの例を用いて説明する。ByteBufferオブジェクトが保持するバッファの内容を変更するメソッドが呼ばれたときにCopy−on−writeが必要であるかどうかを示す、SoftReferenceクラスのsrefフィールドを、ByteBufferクラスに追加する。ここで、バッファとは、プログラムが実行されている際のデータのやり取り時に、処理速度や転送速度の差を補うためにデータを一時的に保存しておく記憶領域のことをいう。
まず、String(ByteBuffer bb,int,int)の中で、byte[]配列でデータを保持すると決定した場合、bb.duplicate()した値をvalue13として、Stringクラスに保存する。そして、そのvalue13を参照する新しいソフト参照(SoftReference)を作成し、bb.srefに代入する。ByteBufferオブジェクトが保持するバッファの内容が変更されると、このbb.srefを利用してCopy−on−writeが必要であるかどうか判断する。具体的には、ByteBufferオブジェクトが保持するバッファの内容を変更するメソッド(例えばput()メソッド等)で以下の処理を行う。
1)bb.sref=nullであれば、StringオブジェクトはByteBufferオブジェクトが保持するバッファの内容を参照していないので、通常の処理を行う。
2)bb.sref.get()=nullであれば、すでにStringオブジェクトはガベージコレクション(garbage collection;GC)されているので、通常の処理を行う。ここで、ガベージコレクション(GC)とは、プログラムが動的に確保したメモリ領域のうち、不要になった領域を自動的に解放する機能である。
3)bb.sref.get()!=nullであれば、新しいバッファを確保してこれまでのバッファの内容をコピーする。
図6は、本発明の一実施形態に係る、ByteBufferオブジェクトが保持するバッファの内容が変更される前に、StringがGCされた場合のCopy−on−writeの動作概要を示す図である。図6(a)は、ByteBufferオブジェクトとバッファとの関係図を示す。String(ByteBuffer bb)の中で、byte[]配列でデータを保持する場合には、ByteBufferオブジェクトbb100が参照するバッファ200の内容を、文字列の値として使用する。ここで、バッファ200は、kernelからByteBufferオブジェクトbb100に読み込まれたデータを保持するために、ByteBufferオブジェクトbb100が内部的に使用するbyte[]配列である。
図6(b)は、バッファ200の内容を参照するStringオブジェクトの関係図を示す。String(ByteBuffer bb)の中で、バッファ200の内容を参照するために、bb.duplicate()した値を、Stringオブジェクトsに保存する。そして、bb.duplicate()した値を参照するSoftReference110を作成し、bb.srefに代入する。具体的には、ByteBufferオブジェクトbb100をshallow copyし、ByteBufferオブジェクトs_bb101を作成し、Stringオブジェクトs120にByteBufferオブジェクトs_bb101を参照させる。それにより、Stringオブジェクトs120は、ByteBufferオブジェクトs_bb101が参照するバッファ200の内容を文字列の値として使用することができる。Stringオブジェクトs120に、ByteBufferオブジェクトs_bb101を参照させた後、ByteBufferオブジェクトs_bb101を参照するSoftReference110を作成する。SoftReference110により、ByteBufferオブジェクトbb100とByteBufferオブジェクトs_bb101とを関連付けることができる。
図6(c)は、Stringオブジェクトs120が変更される前に、Stringオブジェクトs120がGCされた場合の関係図である。Stringオブジェクトs120がGCされると、SoftReference110の持つ値がnullになる。このとき、バッファ200はStringオブジェクトs120から参照されていないので、バッファ200の内容を変更することができる。
図7は、本発明の一実施形態に係る、StringオブジェクトがGCされる前に、バッファの内容が変更された場合のCopy−on−writeの動作概要を示す図である。図7(a)、(b)は図6と同様である。図7(c)は、Stringオブジェクトs120がGCされる前に、バッファ200の内容が変更された場合の関係図である。SoftReference110の持つ値がnullでない場合には、Stringオブジェクトs120がGCされていないため、バッファ200の内容を変更してしまうと、Stringオブジェクトs120の「不変」が保たれなくなる。そこで、Copy−On−Writeのメカニズムを用いて、バッファ200の内容がコピーされる。コピーされたバッファ201をByteBufferオブジェクトbb100が保持し、ByteBufferオブジェクトs_bb101とのSoftReference110が消滅する。このようにして、Stringクラスの「不変」が保持される。
最後に、本発明の一実施形態の適用例について述べる。図8に、簡単なサーバソースコードの例を示す。図8に示した簡単なサーバソースコードの処理について説明する。80番ポートからByteBufferオブジェクトbbにHTTPリクエストのデータを読み込むと処置が開始する。まず、ByteBufferオブジェクトbbに読み込まれたHTTPリクエストを、UTF−8からUTF−16へ変換し、UTF−16に変換されたHTTPリクエストを保持するStringオブジェクトsを生成する。次に、生成されたStringオブジェクトsが保持するUTF−16に変換されたHTTPリクエストのパーセントエンコーディングをデコードする。最後に、デコードされたHTTPリクエストを、標準出力に書き出し、処理を終了する。
まず、プログラマが、「ByteBuffer bb=ByteBuffer.allocateDirect(8192);」のByteBufferオブジェクトbbを指定している記述を見つける。次にByteBufferオブジェクトbbが書き換えられることがないか上述した条件を満たすかチェックを行う。図8に示されたソースコード内のByteBufferオブジェクトbbは、bb.array()メソッドしか呼んでいない、インスタンス変数・クラス変数に代入されていない、SocketChannel.read()メソッドでのみ引数となっている、メソッドの返値となっていない、のでbbがSocketChannel.read()メソッドで値が書き込まれてからは値が書き換えられることがない。従って、bbを本発明の一実施形態に係る新設のString(ByteBuffer)コンストラクタに渡すことができるので、サーバソースコードを本発明における課題であるa)b)c)3つのオーバーヘッドを削減するソースコードに変換することができる。
図8に示したサーバソースコードは、図3に示したアルゴリズムに従って、図9のように書き換えることができ、変換処理におけるa)、b)、c)のオーバーヘッドを削減できる。なお、Java言語の仕様を満たすためにString(ByteBuffer)コンストラクタは非publicとしているので、実際にはリフレクション等を用いて、String(ByteBuffer)コンストラクタを呼び出す必要がある。
本発明は、プログラムがStringとして表現するバッファの内容が1バイトで表現できるもののみであったときに、本発明の一実施形態に係る変換処理を行い、その他の場合は従来技術に係る変換処理を行うものである。このため、パーセントエンコーディングで表現できないデータがあった場合には、従来技術で変換処理が行われる。もし、パーセントエンコーディングで表現できないURI(Uniform Resource Identifier)として正しくない文字(例えば0xff)がユーザが指定したHTTPリクエストが格納されたバッファに存在した場合には、図5に示すように、String(ByteBuffer bb,int start,int length)メソッドの「value=StringCoding.decode(bb.array(),start,length);」が実行され、従来技術に係る変換処理でStringオブジェクトが生成され、バッファの内容を失うことなく本発明を適用しない結果と同じStringオブジェクトが得られる。
また、POSTコマンド等によって、HTTPメッセージにメッセージボディ(rfc2616)が存在した場合も、例えばユーザが指定したHTTPリクエストが格納されたバッファに0xffが存在した場合には、図5に示すように、String(ByteBufferbb,int start,int length)メソッドの「value=StringCoding.decode(bb.array(),start,length);」が実行され、従来技術に係る変換処理でStringオブジェクトが生成され、バッファの内容を失うことなく本発明を適用しない結果と同じStringオブジェクトが得られる。
図10は、本発明の一実施形態に係る、オーバーヘッドを削減するソースコードに変換するサーバ装置のハードウェア構成を示す図である。図10においては、オーバーヘッドを削減するソースコードに変換する装置を情報処理装置1000とし、そのハードウェア構成を例示する。以下は、コンピュータを典型とする情報処理装置として全般的な構成を説明するが、その環境に応じて必要最小限な構成を選択できることはいうまでもない。
情報処理装置1000は、CPU(Central Processing Unit)1010、バスライン1005、通信I/F1040、メインメモリ1050、BIOS(Basic Input Output System)1060、パラレルポート1080、USBポート1090、グラフィック・コントローラ1020、VRAM1024、音声プロセッサ1030、I/Oコントローラ1070、ならびにキーボードおよびマウス・アダプタ1100等の入力手段を備える。I/Oコントローラ1070には、フレキシブル・ディスク(FD)ドライブ1072、ハードディスク1074、光ディスク・ドライブ1076、半導体メモリ1078等の記憶手段を接続することができる。
音声プロセッサ1030には、マイクロホン1036、増幅回路1032、およびスピーカ1034が接続される。また、グラフィック・コントローラ1020には、表示装置1022が接続されている。
BIOS1060は、情報処理装置1000の起動時にCPU1010が実行するブートプログラムや、情報処理装置1000のハードウェアに依存するプログラム等を格納する。FD(フレキシブル・ディスク)ドライブ1072は、フレキシブル・ディスク1071からプログラムまたはデータを読み取り、I/Oコントローラ1070を介してメインメモリ1050またはハードディスク1074に提供する。図10には、情報処理装置1000の内部にハードディスク1074が含まれる例を示したが、バスライン1005またはI/Oコントローラ1070に外部機器接続用インタフェース(図示せず)を接続し、情報処理装置1000の外部にハードディスクを接続または増設してもよい。
光ディスク・ドライブ1076としては、例えば、DVD−ROMドライブ、CD−ROMドライブ、DVD−RAMドライブ、CD−RAMドライブを使用することができる。この際は各ドライブに対応した光ディスク1077を使用する必要がある。光ディスク・ドライブ1076は光ディスク1077からプログラムまたはデータを読み取り、I/Oコントローラ1070を介してメインメモリ1050またはハードディスク1074に提供することもできる。
情報処理装置1000に提供されるコンピュータプログラムは、フレキシブル・ディスク1071、光ディスク1077、またはメモリーカード等の記録媒体に格納されて利用者によって提供される。このコンピュータプログラムは、I/Oコントローラ1070を介して、記録媒体から読み出され、または通信I/F1040を介してダウンロードされることによって、情報処理装置1000にインストールされ実行される。コンピュータプログラムが情報処理装置に働きかけて行わせる動作は、既に説明した装置における動作と同一であるので省略する。
前述のコンピュータプログラムは、外部の記憶媒体に格納されてもよい。記憶媒体としてはフレキシブル・ディスク1071、光ディスク1077、またはメモリーカードの他に、MD等の光磁気記録媒体、テープ媒体を用いることができる。また、専用通信回線やインターネットに接続されたサーバシステムに設けたハードディスクまたは光ディスク・ライブラリ等の記憶装置を記録媒体として使用し、通信回線を介してコンピュータプログラムを情報処理装置1000に提供してもよい。
以上の例は、情報処理装置1000について主に説明したが、コンピュータに、情報処理装置で説明した機能を有するプログラムをインストールして、そのコンピュータを情報処理装置として動作させることにより上記で説明した情報処理装置と同様な機能を実現することができる。
本装置は、ハードウェア、ソフトウェア、またはハードウェアおよびソフトウェアの組み合わせとして実現可能である。ハードウェアとソフトウェアの組み合わせによる実施では、所定のプログラムを有するコンピュータ・システムでの実施が典型的な例として挙げられる。係る場合、該所定のプログラムが該コンピュータ・システムにロードされ実行されることにより、該プログラムは、コンピュータ・システムに本発明に係る処理を実行させる。このプログラムは、任意の言語、コード、または表記によって表現可能な命令群から構成される。そのような命令群は、システムが特定の機能を直接実行すること、または(1)他の言語、コード、もしくは表記への変換、(2)他の媒体への複製、のいずれか一方もしくは双方が行われた後に、実行することを可能にするものである。もちろん、本発明は、そのようなプログラム自体のみならず、プログラムを記録した媒体を含むプログラム製品もその範囲に含むものである。本発明の機能を実行するためのプログラムは、フレキシブル・ディスク、MO、CD−ROM、DVD、ハードディスク装置、ROM、MRAM、RAM等の任意のコンピュータ可読媒体に格納することができる。係るプログラムは、コンピュータ可読媒体への格納のために、通信回線で接続する他のコンピュータ・システムからダウンロードしたり、他の媒体から複製したりすることができる。また、係るプログラムは、圧縮し、または複数に分割して、単一または複数の記録媒体に格納することもできる。
以上、本発明を実施形態に則して説明したが、本発明は上述した実施形態に限るものではない。また、本発明の実施形態に記載された効果は、本発明から生じる最も好適な効果を列挙したに過ぎず、本発明による効果は、本発明の実施形態または実施例に記載されたものに限定されるものではない。
本発明の一実施形態に係る、HTTPリクエストのStringクラスへの変換処理を示す概要図である。 本発明の一実施形態に係る、HTTPリクエストのStringクラスへの変換処理のフローチャートである。 本発明の一実施形態に係る、オーバーヘッドを削減するソースコードに変換するアルゴリズムを示すフローチャートである。 本発明の一実施形態に係る、ByteBufferオブジェクトbbへポインタを保持するStringオブジェクトsにおける、文字取得処理のフローチャートである。 本発明の一実施形態に係る、Stringクラスの実装を示す図である。 本発明の一実施形態に係る、ByteBufferオブジェクトが保持するバッファの内容が変更される前に、StringがGCされた場合のCopy−On−Writeの動作概要を示す図である。 本発明の一実施形態に係る、StringオブジェクトがGCされる前に、バッファの内容が変更された場合のCopy−On−Writeの動作概要を示す図である。 サーバプログラム例を示す図である。 オーバーヘッドを削減するソースコードに変換されたサーバプログラム例を示す図である。 本発明の一実施形態に係る、オーバーヘッドを削減するソースコードに変換するサーバ装置のハードウェア構成を示す図である。 従来技術に係る、HTTPリクエストのStringクラスへの変換処理を示す概要図である。 従来技術に係る、HTTPリクエストのStringクラスへの変換処理のフローチャートである。
符号の説明
1 ByteBufferオブジェクトbb
2 Stringオブジェクトs
3 ポインタ
4 char[]配列

Claims (9)

  1. コンピュータを用いて、プログラムのソースコードをコード変換する方法であって、
    文字列を保持する文字列型変数を特定するステップと、
    特定した前記文字列型変数を、前記文字列を格納するバッファへの参照を保持する参照文字列型変数に型変換するステップと、
    前記文字列型変数を前記参照文字列型変数に型変換した前記ソースコードを格納するステップと、
    を含む、コード変換する方法。
  2. 前記型変換するステップは、更に、前記バッファが不変であるか否かを判定するステップを含む、請求項1に記載の方法。
  3. 前記判定するステップは、コンパイラが、前記ソースコードに対し構文解析をして得られた情報に基づいて、判定する、請求項2に記載の方法。
  4. 前記型変換するステップは、更に、
    前記判定が真である場合は、前記参照文字列型変数への型変換を実行し、
    さもなければ前記参照文字列型変数への型変換を実行しない、請求項2に記載の方法。
  5. 参照文字列型変数は、前記文字列がASCII文字列である場合には、前記文字列を格納するバッファへの参照を保持し、
    さもなければ、前記文字列を保持する、請求項1に記載の方法。
  6. 前記文字列が、HTTPリクエストである請求項1に記載の方法。
  7. サーバ装置を用いて、文字列の受信に応答して受信した前記文字列の表現を変更するプログラムのソースコードを、コード変換するサーバプログラムであって、
    コンピュータが
    前記文字列を保持する文字列型変数を特定するステップと、
    特定した前記文字列型変数を、前記文字列を格納するバッファへの参照を保持する参照文字列型変数に型変換するステップと、
    前記文字列型変数を前記参照文字列型変数に型変換した前記ソースコードを格納するステップと、
    を実行する、サーバプログラム。
  8. 文字列の受信に応答して、受信した前記文字列の表現を変更するプログラムのソースコードを、コード変換するサーバシステムであって、
    前記文字列を保持する文字列型変数を特定する特定手段と、
    特定した前記文字列型変数を、前記文字列を格納するバッファへの参照を保持する参照文字列型変数に型変換する変換手段と、
    前記文字列型変数を前記参照文字列型変数に型変換した前記ソースコードを格納する格納手段と、
    を含む、サーバシステム。
  9. サーバ装置を用いて、HTTPリクエストの受信に応答して、受信した前記HTTPリクエストの表現を変更するプログラムのソースコードを、コード変換するサーバプログラムであって、
    コンピュータが
    前記HTTPリクエストを保持する文字列型変数を特定するステップと、
    特定した前記文字列型変数を、前記HTTPリクエストを格納するバッファへの参照を保持する参照文字列型変数に型変換するステップと、
    前記文字列型変数を前記参照文字列型変数に型変換した前記ソースコードを格納するステップと、を含み、
    更に、前記バッファが不変であるか否かを判定するステップを含み、
    前記判定が真である場合は、前記参照文字列型変数への型変換を実行し、
    さもなければ前記参照文字列型変数への型変換を実行せず、
    前記参照文字列型変数は、前記HTTPリクエストがASCII文字列でない場合には、前記HTTPリクエストを保持する、サーバプログラム。
JP2008277002A 2008-10-28 2008-10-28 ソースコード変換方法、サーバシステム、およびサーバプログラム Expired - Fee Related JP5164112B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2008277002A JP5164112B2 (ja) 2008-10-28 2008-10-28 ソースコード変換方法、サーバシステム、およびサーバプログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2008277002A JP5164112B2 (ja) 2008-10-28 2008-10-28 ソースコード変換方法、サーバシステム、およびサーバプログラム

Publications (2)

Publication Number Publication Date
JP2010108076A true JP2010108076A (ja) 2010-05-13
JP5164112B2 JP5164112B2 (ja) 2013-03-13

Family

ID=42297497

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2008277002A Expired - Fee Related JP5164112B2 (ja) 2008-10-28 2008-10-28 ソースコード変換方法、サーバシステム、およびサーバプログラム

Country Status (1)

Country Link
JP (1) JP5164112B2 (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113660307A (zh) * 2021-07-19 2021-11-16 中国电子科技集团公司第十五研究所 一种算法综合集成服务***

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2001125768A (ja) * 1999-10-27 2001-05-11 Nec Corp 異なるプログラミング言語間のデータ型変換方法
US20040001010A1 (en) * 2002-06-26 2004-01-01 Nicholas Shaylor Method and apparatus for creating string objects in a programming language
JP2005293386A (ja) * 2004-04-02 2005-10-20 Internatl Business Mach Corp <Ibm> コンパイラ、コンパイラプログラム、記録媒体、制御方法、及び中央処理装置
US6996824B2 (en) * 2001-05-09 2006-02-07 Sun Microsystems, Inc. Frameworks for efficient representation of string objects in Java programming environments
US20080147696A1 (en) * 2006-12-19 2008-06-19 International Business Machines Corporation Method for reducing memory size allocated by a string class using unicode
JP2008226010A (ja) * 2007-03-14 2008-09-25 Hitachi Ltd コンパイル方法及びコンパイル装置
JP2009129127A (ja) * 2007-11-22 2009-06-11 Fujitsu Ltd プログラムの不変物抽出処理プログラム,処理装置,および処理方法,ならびに該プログラムを記憶する記憶媒体

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2001125768A (ja) * 1999-10-27 2001-05-11 Nec Corp 異なるプログラミング言語間のデータ型変換方法
US6996824B2 (en) * 2001-05-09 2006-02-07 Sun Microsystems, Inc. Frameworks for efficient representation of string objects in Java programming environments
US20040001010A1 (en) * 2002-06-26 2004-01-01 Nicholas Shaylor Method and apparatus for creating string objects in a programming language
JP2005293386A (ja) * 2004-04-02 2005-10-20 Internatl Business Mach Corp <Ibm> コンパイラ、コンパイラプログラム、記録媒体、制御方法、及び中央処理装置
US20080147696A1 (en) * 2006-12-19 2008-06-19 International Business Machines Corporation Method for reducing memory size allocated by a string class using unicode
JP2008226010A (ja) * 2007-03-14 2008-09-25 Hitachi Ltd コンパイル方法及びコンパイル装置
JP2009129127A (ja) * 2007-11-22 2009-06-11 Fujitsu Ltd プログラムの不変物抽出処理プログラム,処理装置,および処理方法,ならびに該プログラムを記憶する記憶媒体

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113660307A (zh) * 2021-07-19 2021-11-16 中国电子科技集团公司第十五研究所 一种算法综合集成服务***
CN113660307B (zh) * 2021-07-19 2024-01-19 中国电子科技集团公司第十五研究所 一种算法综合集成服务***

Also Published As

Publication number Publication date
JP5164112B2 (ja) 2013-03-13

Similar Documents

Publication Publication Date Title
US7913253B2 (en) Performing draw operations in a native code portion using cached drawing resources
JP3041222B2 (ja) ソース・コード作成システム及び方法
US6854123B1 (en) Method, system, and program for mapping standard application program interfaces (APIs) to user interface APIs
US6957439B1 (en) Method, system, and program for mapping objects in different language formats
US8850414B2 (en) Direct access of language metadata
TWI536263B (zh) 將作業系統之原始應用程式介面投射至其它程式語言
US8677328B2 (en) Generating a dynamic content creation program
US20040095387A1 (en) Virtualized and realized user interface controls
US20040098731A1 (en) Native code exposing virtual machine managed object
US6941520B1 (en) Method, system, and program for using a user interface program to generate a user interface for an application program
JP2001526421A (ja) 異なるフレームワークバージョンで作成されたオブジェクト指向プログラムが通信することを可能にする装置および方法
KR20140057547A (ko) 런타임 시스템
US20190034178A1 (en) Compiling non-native constants
US8042103B2 (en) Pre-translated files used in a virtual machine
US9038033B1 (en) Techniques and mechanisms for web application minification
JP5811088B2 (ja) データ処理システム及びデータ処理方法
US8606766B2 (en) Method and system to handle java class versioning
CN116934330A (zh) 一种调用智能合约的方法及执行方法、计算机设备及存储介质
US7458071B2 (en) Compilation method, compiler apparatus and compiler
JP4768984B2 (ja) コンパイル方法、コンパイルプログラムおよびコンパイル装置
JP5164112B2 (ja) ソースコード変換方法、サーバシステム、およびサーバプログラム
US20130247003A1 (en) Using grammar to serialize and de-serialize objects
Monnier et al. Evolution of emacs lisp
JP5399601B2 (ja) 実装コード開発システム、及び実装コード開発プログラム
KR100319765B1 (ko) 시각적인 화면 설계와 고속 처리가 가능한 동적문서 연동장치 및 그 방법

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20110908

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20121002

RD14 Notification of resignation of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7434

Effective date: 20121003

R155 Notification before disposition of declining of application

Free format text: JAPANESE INTERMEDIATE CODE: R155

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20121212

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20151228

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees