JP5090279B2 - Program conversion system - Google Patents
Program conversion system Download PDFInfo
- Publication number
- JP5090279B2 JP5090279B2 JP2008186452A JP2008186452A JP5090279B2 JP 5090279 B2 JP5090279 B2 JP 5090279B2 JP 2008186452 A JP2008186452 A JP 2008186452A JP 2008186452 A JP2008186452 A JP 2008186452A JP 5090279 B2 JP5090279 B2 JP 5090279B2
- Authority
- JP
- Japan
- Prior art keywords
- bytecode
- language
- byte code
- virtual
- instruction
- 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.)
- Expired - Fee Related
Links
Images
Landscapes
- Devices For Executing Special Programs (AREA)
Description
本発明は、プログラムを変換するシステムに関し、特に、特定の言語のバイトコード上に他の言語のバイトコードをエンコードするシステムおよび変換方法に関する。 The present invention relates to a system for converting a program, and more particularly to a system and a conversion method for encoding a byte code of another language on a byte code of a specific language.
コンピュータ・システムを動作させる際に、相異なるプログラミング言語で記載された複数のプログラムを連携させて実行する場合がある。例えば、Java(米国サン・マイクロシステムズ社の登録商標)によるプラットフォーム上で、PHP(PHP:Hypertext Preprocessor)等で記述されたプログラムを実行する場合等である。 When a computer system is operated, a plurality of programs written in different programming languages may be executed in cooperation with each other. For example, there is a case where a program written in PHP (PHP: Hypertext Preprocessor) or the like is executed on a platform by Java (registered trademark of Sun Microsystems, Inc.).
様々な局面で効果的に動作する言語処理系を実現するためには、このような複数の機械語コードをうまく使い分けることが望まれる。しかし、1つの機械語コード表現を理解する処理系は、通常、そのままでは他の機械語コード表現を理解できない。そこで、従来から、1つの機械語コードを実行する処理系から他の機械語コードを実行するための工夫が行われている。 In order to realize a language processing system that operates effectively in various aspects, it is desirable to properly use a plurality of such machine language codes. However, a processing system that understands one machine language code expression usually cannot understand another machine language code expression as it is. Therefore, conventionally, a device for executing another machine language code from a processing system that executes one machine language code has been devised.
特許文献1には、2種類のバイナリ表現によるプログラムを1つのアプリケーションに両方備えた処理系が開示されている。この従来技術によれば、アプリケーションが複数の異なる種類の機械語コードを実行できるため、上記のような機械語コードの使い分けが可能である。
非特許文献1には、サブルーチン・スレッディングと呼ばれるプログラム変換方式について開示されている。この従来技術によれば、例えば、PHPバイトコードの各命令がJavaバイトコード上のサブルーチン(メソッド)呼び出しに対応するようにJavaバイトコードが構成され、呼び出されるメソッドがJavaで実装される。このサブルーチン・スレッディングを用いることで、コンパイル結果のJavaバイトコードからPHP言語のセマンティクスを読み取ることが可能になる。
Non-Patent
上記のように、1つの機械語コードを実行する処理系から他の機械語コードを実行するための工夫が、従来から行われている。
しかし、2種類のバイナリ表現によるプログラムを1つのアプリケーションに両方備えた処理系で対応する場合、次のような問題があった。例えば2種の処理系がある場合には、その処理系を2つとも実行系に読み込むことになる。そのため、各処理系に対応したバイナリ・データをそれぞれ用意しなければならず、プログラムのサイズが増大していた。また、このとき用意される複数のバイナリ・データは各々独立した異なる表現である。そのため、所定のバイトコードを調べて成り立つことがわかった性質が、他のバイトコードで成り立つか否かについては、実際に他のバイトコードでも調べてみないとわからない。そのため、バイナリ・データごとに全く独立の検証作業が必要になる。
As described above, a device for executing another machine language code from a processing system that executes one machine language code has been conventionally performed.
However, when dealing with two types of binary representation programs in a processing system provided in one application, there are the following problems. For example, when there are two types of processing systems, both of the processing systems are read into the execution system. For this reason, binary data corresponding to each processing system has to be prepared, and the size of the program has increased. The plurality of binary data prepared at this time are independent and different expressions. For this reason, whether or not the property found by examining a predetermined byte code is realized by other byte codes can be understood only by examining other byte codes. Therefore, a completely independent verification operation is required for each binary data.
また、サブルーチン・スレッディングによる手法では、サブルーチンを読み取る際の処理コストが大きいという問題があった。これは、サブルーチン・スレッディングが、そもそも、プラットフォーム(例えば、Java仮想機械)上で直接実行することのみを意図したものであり、そこに埋め込まれている他の言語(例えば、PHP言語)のインストラクションなどのセマンティクスを読み取るために作られてはいないためである。 Further, the technique based on subroutine threading has a problem that the processing cost for reading a subroutine is high. This is intended only for subroutine threading to be executed directly on a platform (eg, Java virtual machine) in the first place, and instructions for other languages (eg, PHP language) embedded therein This is because it is not designed to read the semantics.
本発明は、これらの課題を解決し、異なる種類の複数のバイトコードを1つのファイル上にエンコーディングし、効率良く実行されるプログラムを生成するシステムおよびプログラム変換方法を提供することを目的とする。 An object of the present invention is to solve these problems, and to provide a system and a program conversion method for generating a program to be executed efficiently by encoding a plurality of different types of byte codes on one file.
上記の目的を達成するため、本発明は、次のようなシステムとして実現される。このシステムは、第1の言語のバイトコード上に第2の言語のバイトコードをエンコードして第1の言語のバイトコードのクラス・ファイルを生成するシステムであって、第2の言語のバイトコードに対する前処理を行う前処理部と、前処理の結果を元に実際に前記第1の言語のバイトコードを生成して、メソッド呼び出しのバイトコードから参照される値を保持するデータ構造を持つクラス・ファイルを生成するコード化処理部とを備える。前処理部は、第1の言語のバイトコードの処理系が実行可能な形式に書き替えられた第2の言語のバイトコードである仮想バイトコードの命令により使用される領域を、一時記憶手段に保持された当該データ構造における第2の言語のバイトコードの命令ごとに予め定められた場所に確保し、第2の言語のバイトコードにおける各命令を仮想バイトコードに変換して、この仮想バイトコードを一時記憶手段に保持する。コード化処理部は、一時記憶手段に保持されたデータ構造および仮想バイトコードを含む第1の言語のバイトコードのクラス・ファイルを生成する。 In order to achieve the above object, the present invention is realized as the following system. The system encodes a second language byte code on a first language byte code to generate a class file of the first language byte code, the second language byte code And a class having a data structure for actually generating the byte code of the first language based on the result of the pre-processing and holding a value referred to from the byte code of the method call A coding processing unit for generating a file; The preprocessing unit stores, in the temporary storage unit, an area used by a virtual bytecode instruction that is a bytecode of the second language that has been rewritten into a format executable by the bytecode processing system of the first language. This virtual bytecode is secured in a predetermined location for each instruction of the second language bytecode in the data structure held, and each instruction in the bytecode of the second language is converted into a virtual bytecode. Is stored in the temporary storage means. The encoding processing unit generates a bytecode class file of the first language including the data structure and virtual bytecode held in the temporary storage means.
また、このシステムは、生成されたクラス・ファイルを通常の第1の言語のバイトコードの実行形態とは異なる形で実行する実行部をさらに備える構成としても実現される。
そして、好ましくは、実行部は、第2の言語のバイトコードの命令と、予め定められた命令により使用されるデータ構造上の場所との対応関係を示す情報を記憶手段に保持し、この情報に基づいて、クラス・ファイルの多くの部分を読まずして、データ構造上の場所から仮想バイトコードの内容を認識する。
This system can also be realized as a configuration further including an execution unit that executes the generated class file in a form different from the execution form of the normal first language bytecode.
Preferably, the execution unit holds information indicating a correspondence relationship between the byte code instruction of the second language and a place on the data structure used by the predetermined instruction in the storage unit, and this information Based on the above, the contents of the virtual bytecode are recognized from the location on the data structure without reading many parts of the class file.
上記のシステムにおいて、より詳細には、コード化処理部は、仮想バイトコードを第1の言語のバイトコードのメソッドとしてエンコードする。
また、コード化処理部は、データ構造に、仮想バイトコードの実行に必要なデータおよびメソッドの位置を示す情報を記録する。そして、実行部は、データ構造に記録された、データおよびメソッドの位置を示す情報に基づき、仮想バイトコードの実行に不要な内容の解読を省略してクラス・ファイルの解読および実行を行う。
In the above system, more specifically, the encoding processing unit encodes the virtual bytecode as a bytecode method of the first language.
In addition, the encoding processing unit records information indicating the position of the data and the method necessary for executing the virtual bytecode in the data structure. Then, the execution unit decodes and executes the class file based on the information indicating the position of the data and the method recorded in the data structure, omitting the decoding of the contents unnecessary for the execution of the virtual bytecode.
また、本発明は、次のような方法としても実現される。この方法は、第1の言語のバイトコード上に第2の言語のバイトコードをエンコードして第1の言語のバイトコードのクラス・ファイルを生成するプログラム変換方法であって、所定のバイトコードのクラス・ファイルは、メソッド呼び出しのバイトコードから参照される値を保持するデータ構造を持ち、第1の言語のバイトコードの処理系が実行可能な形式に書き替えられた第2の言語のバイトコードである仮想バイトコードの命令により使用される領域を、一時記憶手段に保持された当該データ構造における第2の言語のバイトコードの命令ごとに予め定められた場所に確保するステップと、第2の言語のバイトコードにおける各命令を仮想バイトコードに変換して、仮想バイトコードを一時記憶手段に保持させるステップと、一時記憶手段に保持されたデータ構造を含み、仮想バイトコードをメソッドとしてエンコードした第1の言語のバイトコードのクラス・ファイルを生成するステップと、を含む。 The present invention is also realized as the following method. This method is a program conversion method for encoding a byte code of a second language on a byte code of a first language to generate a class file of the byte code of the first language. The class file has a data structure that holds a value referenced from the byte code of the method call, and the byte code of the second language that has been rewritten into a format that can be executed by the processing system of the first language byte code Securing a region used by a virtual bytecode instruction that is a predetermined location for each bytecode instruction of the second language in the data structure held in the temporary storage means; Converting each instruction in the language bytecode into a virtual bytecode and holding the virtual bytecode in a temporary storage means; and temporary storage It includes holding data structures stage, and generating the class files bytecode first language encodes the virtual byte code as a method, a.
さらに本発明は、コンピュータを制御して、上記のシステムにおける各機能を実現させるプログラムや、上記の方法における各ステップに対応する処理を実行させるプログラムとしても実解される。このプログラムは、光ディスクや磁気ディスク、半導体メモリ、その他の記録媒体に格納して配布したり、ネットワークを介して配信したりすることにより、提供される。 Furthermore, the present invention is also realized as a program for controlling a computer to realize each function in the above system and a program for executing a process corresponding to each step in the above method. This program is provided by being stored and distributed in an optical disk, magnetic disk, semiconductor memory, or other recording medium, or distributed via a network.
以上のように構成された本発明によれば、異なる種類の複数のバイトコードを1つのファイル上にエンコーディングし、効率良く実行されるプログラムを生成するシステムおよびプログラム変換方法を提供することができる。 According to the present invention configured as described above, it is possible to provide a system and a program conversion method for encoding a plurality of different types of byte codes on one file and generating a program to be executed efficiently.
以下、添付図面を参照して、本発明の実施形態について詳細に説明する。
本発明は、一定の特徴(後述)を備えたプログラミング言語で記述されたプログラムに対して適用できるものであるが、本実施形態では、JavaバイトコードとPHPバイトコードとを1つのファイル上にエンコードする場合を例として説明する。具体的には、PHPバイトコードを仮想バイトコード(後述)として、Javaバイトコードにエンコードする。
Hereinafter, embodiments of the present invention will be described in detail with reference to the accompanying drawings.
The present invention can be applied to a program written in a programming language having certain features (described later). In this embodiment, Java byte code and PHP byte code are encoded on one file. This will be described as an example. Specifically, the PHP byte code is encoded into a Java byte code as a virtual byte code (described later).
<システム構成>
図1は、本実施形態が適用されるシステムの全体構成を示す図である。
図1に示すシステムは、パーソナルコンピュータ等のコンピュータで実現される。このシステムは、PHPスクリプトが記述されたソースコードをコンパイルしてJavaのバイトコードを生成する変換部100と、生成されたバイトコードを実行する実行部200とを備える。
<System configuration>
FIG. 1 is a diagram showing an overall configuration of a system to which the present embodiment is applied.
The system shown in FIG. 1 is realized by a computer such as a personal computer. This system includes a
変換部100は、コンパイラであり、仮想バイトコードを生成する前処理部110と、仮想バイトコードを組み込んだJavaバイトコードのクラス・ファイルを生成するコード化処理部120とを備える。ここで、仮想バイトコードとは、PHPバイトコードをJavaバイトコード上のメソッド呼び出しとしてエンコードしたものであり、言い換えれば、Java仮想機械がそのまま実行できる形に変換したものである。仮想バイトコードは、仮想インストラクションと仮想コンスタント値(定数値)とからなる。
The
実行部200は、Java仮想機械、または、PHPバイトコードの実行系、または、両者の性質を備えた実行系である。実行部200がJava仮想機械である場合は通常のJavaバイトコードとして実行される。一方、PHPバイトコードの実行系である場合、詳しくは後述するが、実行部200は、変換部100により生成されるバイトコードに固有のデータ構造に応じて、このバイトコードを実行する。実行部200の実装は、インタプリタであっても良いし、JIT(Just In Time)コンパイラであっても良い。また、複数の実装を併存させても良い。
The
図2は、本実施形態のプログラム処理装置を実現するコンピュータのハードウェア構成例を示す図である。
図2に示すコンピュータ10は、演算手段であるCPU(Central Processing Unit)10aと、記憶手段であるメイン・メモリ10cおよび磁気ディスク装置(HDD:Hard Disk Drive)10gを備える。また、ネットワークを介して外部装置に接続するためのネットワーク・インタフェース・カード10fと、表示出力を行うためのビデオ・カード10dおよび表示装置10jと、音声出力を行うための音声機構10hとを備える。さらに、キーボードやマウス等の入力デバイス10iを備える。
FIG. 2 is a diagram illustrating a hardware configuration example of a computer that realizes the program processing apparatus according to the present embodiment.
The
図2に示すように、メイン・メモリ10cおよびビデオ・カード10dは、システム・コントローラ10bを介してCPU10aに接続されている。また、ネットワーク・インタフェース・カード10f、磁気ディスク装置10g、音声機構10hおよび入力デバイス10iは、I/Oコントローラ10eを介してシステム・コントローラ10bと接続されている。各構成要素は、システム・バスや入出力バス等の各種のバスによって接続される。例えば、CPU10aとメイン・メモリ10cの間は、システム・バスやメモリ・バスにより接続される。また、CPU10aと磁気ディスク装置10g、ネットワーク・インタフェース・カード10f、ビデオ・カード10d、音声機構10h、入力デバイス10i等との間は、PCI(Peripheral Components Interconnect)、PCI Express、シリアルATA(AT Attachment)、USB(Universal Serial Bus)、AGP(Accelerated Graphics Port)等の入出力バスにより接続される。
As shown in FIG. 2, the
なお、図2は、本実施形態が適用されるのに好適なコンピュータのハードウェア構成を例示するに過ぎず、実際の各サーバが図示の構成に限定されないことは言うまでもない。例えば、ビデオ・カード10dを設ける代わりに、ビデオメモリのみを搭載し、CPU10aにてイメージ・データを処理する構成としても良い。また、音声機構10hを独立した構成とせず、システム・コントローラ10bやI/Oコントローラ10eを構成するチップセットの機能として備えるようにしても良い。また、補助記憶装置として磁気ディスク装置10gの他に、各種の光学ディスクやフレキシブル・ディスクをメディアとするドライブを設けても良い。表示装置10jとしては、主として液晶ディスプレイが用いられるが、その他、CRTディスプレイやプラズマ・ディスプレイ等、任意の方式のディスプレイを用いて良い。
Note that FIG. 2 merely exemplifies a hardware configuration of a computer suitable for application of the present embodiment, and it is needless to say that each actual server is not limited to the illustrated configuration. For example, instead of providing the
図1に示したシステムにおいて、変換部100および実行部200は、例えば図2に示したコンピュータにおいて、メイン・メモリ10cに読み込まれたプログラムをCPU10aが実行することにより実現される。また、変換部100および実行部200の処理中に生成される一時ファイル等は、メイン・メモリ10cの作業領域等に保持される。
In the system shown in FIG. 1, the
<バイトコードのデータ構造>
図3は、Javaバイトコードのデータ構造を示す図である。
変換部100により生成される、本実施形態のバイトコードのクラス・ファイルは、全体的な構成としては、通常のJavaバイトコードのクラス・ファイルと変わらない。すなわち、図3に示すように、ヘッダ301、コンスタント・プール302、クラス情報303、フィールド304、メソッド305、アトリビュート306と呼ばれる部分が含まれる。メソッド305内には、Java自体のインストラクションの他、PHPのインストラクションである仮想インストラクションと、仮想インストラクションに使用されるPHP内部のコンスタント・プールとが含まれる。
<Data structure of byte code>
FIG. 3 is a diagram showing the data structure of the Java byte code.
The byte code class file of the present embodiment generated by the
上述したように、本実施形態では、PHPバイトコードを仮想バイトコードとして、Javaバイトコードにエンコードする。具体的には、仮想バイトコードは、invokestatic(0xb8)インストラクションと、メソッドを示すコンスタント値が入っているコンスタント・プール302中のインデックス(索引番号)として、エンコードされる。例えば、PHP言語用の仮想バイトコードを考えると、PHPオブジェクトの足し算を行うADDという仮想インストラクションは、VirtualOpcodesクラスのスタティック・メソッドadd()へのメソッド呼び出しになる。なお、コンスタント・プール302は、メソッド呼び出しのバイトコードから参照される値を保持するデータ構造である。
As described above, in this embodiment, a PHP byte code is encoded as a virtual byte code into a Java byte code. More specifically, the virtual bytecode is encoded as an index (index number) in the
実際のバイト列は、
0xb8(invokestatic)
0x00(higher byte of 5, index for the constant pool)
0x05(lower byte of 5, index for the constant pool)
という、3バイトになる。ただし、コンスタント・プール302は図4のようになっているとする。これにより、Javaバイトコードとしては、com.ibm.VirtualOpcodesクラスのvoid add(Runtime)というスタティック・メソッドを呼び出すという意味になる。なお、実装形態によっては、invokestatic(0xb8)インストラクションの代わりに、invokevirtual(0xb6)、invokeinterface(0xb9)、invokespecial(0xb7)等を使用して実現しても良い。
The actual byte sequence is
0xb8 (invokestatic)
0x00 (higher byte of 5, index for the constant pool)
0x05 (lower byte of 5, index for the constant pool)
It becomes 3 bytes. However, it is assumed that the
メソッドの引数には、実行コンテキスト(Runtime)を渡している。仮想機械の状態を変えるような仮想インストラクションをJavaのメソッドとして実装する場合には、この実行コンテキスト・オブジェクトに対する操作として実装されることになる。ここで、仮想機械の状態とは、PHPバイトコードにおけるレジスタ、スタック、ヒープなどの仮想的な記憶装置の内容や、広義には入出力などを含む。したがって、仮想機械の状態を変えるとは、例えば、外部入出力へのアクセスや、スタックへの積み下ろしなどが行われることを意味する。具体的には、例えばADDというインストラクションは、
・スタックから2つ値を取り出す。
・スタックに計算結果の値を積む。
という、仮想機械の状態変化を起こす。なお、実行コンテキストを必要としないインストラクションの場合は省略して良い。
An execution context (Runtime) is passed as an argument of the method. When a virtual instruction that changes the state of the virtual machine is implemented as a Java method, it is implemented as an operation on this execution context object. Here, the state of the virtual machine includes contents of virtual storage devices such as registers, stacks, and heaps in the PHP byte code, and input / output in a broad sense. Therefore, changing the state of the virtual machine means that, for example, access to an external input / output or loading / unloading to / from a stack is performed. Specifically, for example, an instruction called ADD
-Take two values from the stack.
・ Put the value of the calculation result on the stack.
This causes a change in the state of the virtual machine. Note that this may be omitted for instructions that do not require an execution context.
仮想バイトコードの無条件分岐命令や条件分岐命令のエンコードには、実際のJava仮想機械の分岐命令を用いる。具体的には、無条件分岐にはgoto(0xa7)、条件分岐にはifne(0x9a)やifeq(0x99)を用いる。また、実装形態により、さらに、多条件分岐命令tableswitch(0xaa)、lookupswitch(0xab)と組み合わせた分岐も考えられる。 An actual Java virtual machine branch instruction is used to encode an unconditional branch instruction of a virtual bytecode or a conditional branch instruction. Specifically, goto (0xa7) is used for the unconditional branch, and ifne (0x9a) or ifeq (0x99) is used for the conditional branch. Further, depending on the implementation form, a branch combined with a multi-condition branch instruction tableswitch (0xaa) and lookupswitch (0xab) is also conceivable.
仮想バイトコードの定数には、スタティック・フィールドと、そこからの読み出しである、getstatic(0xb2)を用いる。なお、実装形態によっては、インスタンス・フィールドと、そこからの読み出しである、getfield(0xb4)を使用して実現しても良い。 As a constant of the virtual bytecode, a static field and a read static (getstatic (0xb2)) are used. Depending on the implementation, it may be realized by using an instance field and getfield (0xb4) that is read from the instance field.
<コンスタント・プールのデータ構造>
次に、本実施形態におけるコンスタント・プールのデータ構造について説明する。
図5は、PHPのオペコード(Opcode)の一部を例示する図である。
図5に示すように、本実施形態では、仮想バイトコードの各オペコードに対し、できるだけ連続した番号(ID)を割り振り、この番号は利用者間で共通化されているものとする。番号の始まりは、大きくなりすぎないように決めるか、別途オフセットなどの情報を渡してクラス・ファイル単位で柔軟に調整できるようにしても良い。
<Constant pool data structure>
Next, the data structure of the constant pool in this embodiment will be described.
FIG. 5 is a diagram illustrating a part of an operation code (Opcode) of PHP.
As shown in FIG. 5, in the present embodiment, as many consecutive numbers (IDs) as possible are assigned to each operation code of the virtual bytecode, and this number is assumed to be shared among users. The start of the number may be determined so as not to become too large, or information such as an offset may be passed separately so that the number can be adjusted flexibly for each class file.
図6は、図5のオペコードIDに対応して構成された本実施形態によるコンスタント・プールの例を示す図である。
図6に示すように、本実施形態では、各仮想インストラクションに対応するメソッドを指定するメソッド情報(Method_info)が、コンスタント・プール中で、対応するIDをインデックスとする位置に置かれる。このように、仮想インストラクションの内容に応じてコンスタント・プールにおける配置を決めておくことにより、invokestaticから続く3バイトに含まれるコンスタント・プール・エントリのインデックスを読むだけで(メソッド情報自体を読まなくても)、その一連のバイトコードが表す仮想インストラクションの内容が分かるようになる。
FIG. 6 is a diagram showing an example of a constant pool according to the present embodiment configured corresponding to the opcode ID of FIG.
As shown in FIG. 6, in this embodiment, method information (Method_info) for designating a method corresponding to each virtual instruction is placed at a position where the corresponding ID is an index in the constant pool. In this way, by determining the placement in the constant pool according to the contents of the virtual instruction, it is only necessary to read the constant pool entry index included in the 3 bytes following the invocative (without reading the method information itself). ), The contents of the virtual instruction represented by the series of bytecodes can be understood.
なお、このようなコンスタント・プールとなるように調整する方法としては、種々の方法が考えられる。単純な方法は、仮想インストラクションを指定するコンスタントは全て固定にしておき、他の用途に用いないことである。また、多少効率的にコンスタント・プールを利用するために、利用されていない仮想インストラクションに対応するコンスタント・プールのエントリを他の用途に開放するようにしても良い。 Various methods are conceivable as a method for adjusting such a constant pool. The simple way is to keep all constants that specify virtual instructions fixed and not used for other purposes. Further, in order to use the constant pool somewhat efficiently, the entry of the constant pool corresponding to the unused virtual instruction may be opened for other uses.
<変換部の機能>
次に、変換部100の前処理部110およびコード化処理部120の機能を説明する。
図7は、変換部100による処理の流れを示すフローチャートである。
図7に示す動作例では、コンスタント・プール、メソッド定義、フィールド定義などを仮に記憶しておくコンポーネント(To−Doリスト)を用意している。このコンポーネントは、例えば図2に示したメイン・メモリ10cやCPU10aのキャッシュメモリにより実現される。
図7を参照すると、まず、変換部100の前処理部110が、変換対象のプログラム全体を見て、各仮想インストラクションに関して、コンスタント・プールにおける配置場所を予約する(ステップ701)。
<Function of conversion unit>
Next, functions of the
FIG. 7 is a flowchart showing the flow of processing by the
In the operation example shown in FIG. 7, a component (To-Do list) for temporarily storing a constant pool, a method definition, a field definition, and the like is prepared. This component is realized by, for example, the
Referring to FIG. 7, first, the
次に、前処理部110は、各仮想インストラクションに関して、バイトコード生成処理を行い、生成されたバイトコードをコンスタント・プールの未だ予約されていない場所に置く(ステップ702)。このとき、仮想インストラクションが仮想コンスタント値を取るような場合に、その仮想インストラクションをエンコードしておくフィールド(名)を割り当て、仮想コンスタント値とともにTo−Doリストに入れる。
Next, the
以上の操作の後、前処理部110は、ステップ702で割り当てられた各フィールドとそれらの初期化のためのコードを生成し、To−Doリストに入れる(ステップ703)。そして、コード化処理部120が、To−Doリストに保持されている全ての内容をJavaのバイトコードとして書き出す(ステップ704)。書き出されたJavaバイトコードにおいて、コンスタント・プールにおけるcp_infoの配列に、CONSTANT_Integer_info型の整数コンスタント値として、実行に必要なデータおよびメソッドの位置を示す情報(この情報をオフセット値と呼ぶ)が記録される。オフセット値により示される情報は、仮想インストラクション列がエンコードされているメソッドの本体部分(Code属性情報)の開始位置、読み込みが必要なコンスタント・プールの記録内容の開始位置、読み込みを行うべきコンスタント・プール・エントリのインデックスの3つである。
After the above operation, the
図8は、図7のバイトコード生成処理の内容を示すフローチャートである。
図8を参照すると、前処理部110は、まず仮想インストラクションが仮想コンスタント値を取るか否かを判断する(ステップ801)。仮想コンスタント値を取らない場合(ステップ801でNo)、前処理部110は、ランタイム・コンテキストに関するバイトコード「aload 1」を生成する(ステップ804)。
FIG. 8 is a flowchart showing the contents of the bytecode generation process of FIG.
Referring to FIG. 8, the
一方、仮想インストラクションが仮想コンスタント値を取る場合(ステップ801でYes)、前処理部110は、{フィールド,値}の情報をTo−Doリストに追加する(ステップ802)。そして、追加されたフィールドに関するバイトコード「getstatic」を生成した後(ステップ803)、バイトコード「aload 1」を生成する(ステップ804)。
On the other hand, when the virtual instruction takes a virtual constant value (Yes in step 801), the
次に、前処理部110は、生成したバイトコードをコンスタント・プールのインデックスにおける予約されている場所に割り当てる(ステップ805)。そして、バイトコード「invokestatic」を生成する(ステップ806)。バイトコード「invokestatic」に付加されるMethodrefコンスタント・プール・エントリのインデックスは、エンコードされた仮想インストラクションの種類に応じて特定されている。そのため、このステップ806で生成されたバイトコードを見れば、実際にMethodrefコンスタント・プール・エントリを読み込んで内容を解読しなくても、仮想インストラクションの内容がわかる。
Next, the
具体的な仮想インストラクションの例を挙げて、図8のバイトコード生成処理をさらに説明する。
PHPのソースコード
echo“Hello World¥n”;
に対し、仮想インストラクションは次のようになる。
PUSH“Hello World^n”
ECHO
この仮想インストラクションを図8に示す手順で処理すると、次のようになる。
The byte code generation processing of FIG. 8 will be further described with a specific example of virtual instructions.
PHP source code
echo “Hello World ¥ n”;
On the other hand, the virtual instruction is as follows.
PUSH “Hello World ^ n”
ECHO
When this virtual instruction is processed according to the procedure shown in FIG.
まず、「PUSH“Hello World^n”」について処理を行うと、ステップ801ではYesとなるので、ステップ802に移行し、
{フィールド,値}={“constVal0”,“Hello World¥n”}
がTo−Doリストに追加される。そして、ステップ803で、バイトコード
getstatic“constVal0”
が生成され、ステップ804で、バイトコード
aload 1
が生成される。
First, if “PUSH“ Hello World ^ n ”” is processed, the result in Step 801 is Yes.
{Field, value} = {“constVal0”, “Hello World \ n”}
Is added to the To-Do list. In step 803, the byte code
getstatic “constVal0”
Is generated, and in step 804, a bytecode is generated.
Is generated.
この後、ステップ805で、PUSHのオペコードに対するMethodrefコンスタント・プール・エントリ(VirtualOpcodes.push(PHPValue,Runtime)という情報)のインデックスが得られる。ここでは、仮に「20」とする。そして、ステップ806で、バイトコード
invokestatic 20
が生成される。
Thereafter, in step 805, an index of Methodref constant pool entry (information called VirtualOpcodes.push (PHPValue, Runtime)) for the push opcode is obtained. Here, “20” is assumed. In step 806, the byte code
Invokestatic 20
Is generated.
次に、「ECHO」について処理を行うと、ステップ801ではNoとなるので、直ちにステップ804に移行し、バイトコード
aload 1
が生成される。そして、ステップ805で、ECHOのオペコードに対するMethodrefコンスタント・プール・エントリ(VirtualOpcodes.echo(Runtime)という情報)のインデックスが得られる。ここでは、仮に「30」とする。そして、ステップ806で、バイトコード
invokestatic 30
が生成される。
Next, when processing is performed for “ECHO”, the result in Step 801 is No.
Is generated. In step 805, an index of Methodref constant pool entry (information called VirtualOpcodes.echo (Runtime)) for the ECHO opcode is obtained. Here, “30” is assumed. In step 806, the byte code
Invokestatic 30
Is generated.
<実行部の機能>
次に、実行部200の機能を説明する。
本実施形態の実行部200は、バイトコードや仮想バイトコードについて、既に検証が済んでいる場合等、検証を行わなくても良い場合に、不要なコンスタント・プールの解読を省略する。そして、プログラムの実行に必要なコンスタント・プールのエントリとバイトコードを読み込むことで、高速な読み込みが実現される。
<Function of the execution unit>
Next, functions of the
The
図9は、バイトコードの検証を行わなくて良い場合における実行部200の処理の流れを示すフローチャートである。
図9を参照すると、実行部200は、まずプログラムの先頭の8バイトをスキップする(ステップ901)。これにより、図3に示したJavaバイトコードのヘッダ301が飛ばされる。
FIG. 9 is a flowchart showing the flow of processing of the
Referring to FIG. 9, the
次に、実行部200は、コンスタント・プール・エントリの個数を読み込み(ステップ902)、さらに、コンスタント・プールに記録されたオフセット値を読み込む(ステップ903)。次に、実行部200は、ステップ903で読み込んだオフセット値を用いて、仮想インストラクションのためのMethodref等の不要なコンスタント・プール・エントリをスキップする(ステップ904)。そして、残りのコンスタント・プール・エントリを読み込んで解読する(ステップ905)。この後、実行部200は、仮想インストラクション列(run())の先頭(実際には、その手前のメソッド情報)までスキップし(ステップ906)、後続する仮想インストラクション列を読み込む(ステップ907)。
Next, the
このように、本実施形態では、変換部100により生成されたクラス・ファイルについて、バイトコードの検証を行わなくて良い場合には、実行部200は、クラス・ファイルの全てを読み込んで解読するのではなく、オフセット値を用いて不要な部分を読み飛ばし、必要な部分のみを読み込んで解読する。このため、実行部200による処理の高速化を図ることができる。
As described above, in this embodiment, when it is not necessary to perform bytecode verification on the class file generated by the
以上、本実施形態について説明したが、本発明の技術的範囲は上記実施形態に記載の範囲には限定されない。例えば、上記実施形態では、JavaバイトコードにPHPバイトコードをエンコードしてクラス・ファイルを生成する場合について説明したが、適用される言語はJavaおよびPHPに限定されないことは言うまでもない。第1のバイトコード上に第2のバイトコードがエンコードされる場合を想定すると、第1のバイトコードが、Javaのコンスタント・プールのような、メソッド呼び出しのバイトコードから参照される値を保持するデータ構造を持ち、このデータ構造がクラス・ファイル全体のできるだけ先に読まれる位置(先頭付近)に位置するような言語であれば、本実施形態を適用することができる。その他、上記実施形態に、種々の変更または改良を加えたものも、本発明の技術的範囲に含まれることは、特許請求の範囲の記載から明らかである。 As mentioned above, although this embodiment was described, the technical scope of this invention is not limited to the range as described in the said embodiment. For example, in the above-described embodiment, a case has been described in which a PHP byte code is encoded into a Java byte code to generate a class file. However, it goes without saying that the applied language is not limited to Java and PHP. Assuming that the second byte code is encoded on the first byte code, the first byte code holds a value referenced from the byte code of the method call, such as a Java constant pool. The present embodiment can be applied to any language that has a data structure and this data structure is located at a position (near the top) that is read as early as possible in the entire class file. In addition, it is clear from the description of the scope of the claims that various modifications or improvements added to the above embodiment are also included in the technical scope of the present invention.
10a…CPU、10c…メイン・メモリ、100…変換部、110…前処理部、120…コード化処理部、200…実行部 10a ... CPU, 10c ... main memory, 100 ... conversion unit, 110 ... preprocessing unit, 120 ... coding processing unit, 200 ... execution unit
Claims (11)
前記第2の言語のバイトコードに対する前処理を行う前処理部と、
前処理の結果を元に実際に前記第1の言語のバイトコードを生成して、メソッド呼び出しのバイトコードから参照される値を保持するデータ構造を持つクラス・ファイルを生成するコード化処理部とを備え、
前記前処理部は、
前記第1の言語のバイトコードの処理系が実行可能な形式に書き替えられた前記第2の言語のバイトコードである仮想バイトコードの命令により使用される領域を、一時記憶手段に保持された前記データ構造における当該第2の言語のバイトコードの命令ごとに予め定められた場所に確保し、
前記第2の言語のバイトコードにおける各命令を前記仮想バイトコードに変換して、当該仮想バイトコードを前記一時記憶手段に保持し、
前記コード化処理部は、
前記一時記憶手段に保持された前記データ構造および前記仮想バイトコードを含む前記第1の言語のバイトコードのクラス・ファイルを生成する、
システム。 In a system for encoding a byte code of a second language on a byte code of a first language to generate a class file of the byte code of the first language,
A preprocessing unit for performing preprocessing on the bytecode of the second language;
An encoding processing unit that actually generates a byte code of the first language based on a result of the preprocessing, and generates a class file having a data structure that holds a value referenced from the byte code of the method call; With
The pre-processing unit is
An area used by a virtual bytecode instruction that is a bytecode of the second language that has been rewritten into a format executable by the bytecode processing system of the first language is held in a temporary storage unit Secure in a predetermined place for each byte code instruction of the second language in the data structure;
Converting each instruction in the byte code of the second language into the virtual byte code, and holding the virtual byte code in the temporary storage means;
The encoding processing unit
Generating a bytecode class file of the first language including the data structure held in the temporary storage means and the virtual bytecode;
system.
前記第2の言語のバイトコードに対する前処理を行う前処理部と、
前処理の結果を元に実際に前記第1の言語のバイトコードを生成して、メソッド呼び出しのバイトコードから参照される値を保持するデータ構造を持つクラス・ファイルを生成するコード化処理部と、
前記コード化処理部により生成された前記クラス・ファイルを実行する実行部とを備え、
前記前処理部は、
前記第1の言語のバイトコードの処理系が実行可能な形式に書き替えられた前記第2の言語のバイトコードである仮想バイトコードの命令により使用される領域を、一時記憶手段に保持された前記データ構造における当該第2の言語のバイトコードの命令ごとに予め定められた場所に確保し、
前記第2の言語のバイトコードにおける各命令を前記仮想バイトコードに変換して、当該仮想バイトコードを前記一時記憶手段に保持し、
前記コード化処理部は、
前記一時記憶手段に保持された前記データ構造を含み、前記仮想バイトコードをメソッドとしてエンコードした前記第1の言語のバイトコードのクラス・ファイルを生成する、
システム。 In a system that encodes a byte code of a second language on a byte code of a first language, generates a class file of the byte code of the first language, and executes the class file,
A preprocessing unit for performing preprocessing on the bytecode of the second language;
An encoding processing unit that actually generates a byte code of the first language based on a result of the preprocessing, and generates a class file having a data structure that holds a value referenced from the byte code of the method call; ,
An execution unit that executes the class file generated by the encoding processing unit,
The pre-processing unit is
An area used by a virtual bytecode instruction that is a bytecode of the second language that has been rewritten into a format executable by the bytecode processing system of the first language is held in a temporary storage unit Secure in a predetermined place for each byte code instruction of the second language in the data structure;
Converting each instruction in the byte code of the second language into the virtual byte code, and holding the virtual byte code in the temporary storage means;
The encoding processing unit
Including the data structure held in the temporary storage means, and generating a bytecode class file of the first language in which the virtual bytecode is encoded as a method;
system.
前記第2の言語のバイトコードの命令と、予め定められた当該命令により使用される前記データ構造上の場所との対応関係を示す情報を記憶手段に保持し、
前記情報に基づいて、前記データ構造上の場所から前記仮想バイトコードの内容を認識する、請求項6に記載のシステム。 The execution unit is
Holding information indicating a correspondence relationship between the byte code instruction of the second language and a place on the data structure used by the predetermined instruction in a storage unit;
The system according to claim 6, wherein the content of the virtual bytecode is recognized from a location on the data structure based on the information.
前記実行部は、前記データ構造に記録された、前記データおよび前記メソッドの位置を示す情報に基づき、前記仮想バイトコードの実行に不要な内容の解読を省略して前記クラス・ファイルの解読および実行を行う、請求項7に記載のシステム。 The encoding processing unit records, in the data structure, information indicating the position of data and a method necessary for execution of the virtual bytecode,
The execution unit decodes and executes the class file based on information indicating the position of the data and the method recorded in the data structure, omitting decoding of contents unnecessary for execution of the virtual bytecode. The system according to claim 7, wherein:
前記PHPバイトコードに対する前処理を行う前処理部と、
前処理の結果を元に実際に前記Javaバイトコードを生成して、クラス・ファイルを生成するコード化処理部と、
前記コード化処理部により生成された前記クラス・ファイルを実行する実行部とを備え、
前記前処理部は、
前記PHPバイトコードを前記Javaバイトコードの処理系が実行可能な形式に書き替えたものである仮想バイトコードの命令により使用される領域を、一時記憶手段に保持されたコンスタント・プールにおける当該PHPバイトコードの命令ごとに予め定められた場所に確保し、
前記PHPバイトコードにおける各命令を前記仮想バイトコードに変換して、当該仮想バイトコードを前記一時記憶手段に保持し、
前記コード化処理部は、
前記一時記憶手段に保持された前記コンスタント・プールを含み、前記仮想バイトコードをメソッドとしてエンコードした前記Javaバイトコードのクラス・ファイルを生成し、
前記コンスタント・プールに、前記仮想バイトコードの実行に必要なデータおよびメソッドの位置を示す情報を記録し、
前記実行部は、
前記PHPバイトコードの命令と、予め定められた当該命令により使用される前記コンスタント・プール上の場所との対応関係を示す情報を記憶手段に保持し、
前記情報に基づいて、前記コンスタント・プール上の場所から前記仮想バイトコードの内容を認識し、
前記コンスタント・プールに記録された、前記データおよび前記メソッドの位置を示す情報に基づき、前記仮想バイトコードの実行に不要な内容の解読を省略して前記クラス・ファイルの解読および実行を行う、
システム。 In a system that encodes a PHP byte code into a Java (registered trademark) byte code, generates a class file of the Java byte code, and executes the class file,
A preprocessing unit for performing preprocessing on the PHP bytecode;
An encoding processing unit that actually generates the Java bytecode based on the result of the preprocessing and generates a class file;
An execution unit that executes the class file generated by the encoding processing unit,
The pre-processing unit is
An area used by a virtual bytecode instruction, which is a rewrite of the PHP bytecode into a format executable by the Java bytecode processor, in the constant pool held in the temporary storage means Secure in a predetermined place for each code instruction,
Converting each instruction in the PHP bytecode into the virtual bytecode, holding the virtual bytecode in the temporary storage means,
The encoding processing unit
Including the constant pool held in the temporary storage means, and generating a class file of the Java bytecode in which the virtual bytecode is encoded as a method;
In the constant pool, record data indicating the position of data and method necessary for execution of the virtual bytecode,
The execution unit is
Information indicating the correspondence between the instruction of the PHP bytecode and the location on the constant pool used by the instruction is determined in a storage unit;
Based on the information, the content of the virtual bytecode is recognized from a location on the constant pool,
Based on the data and the information indicating the position of the method recorded in the constant pool, the decryption and execution of the class file is performed by omitting the decryption of contents unnecessary for the execution of the virtual bytecode.
system.
前記第1の言語のバイトコードのクラス・ファイルは、メソッド呼び出しのバイトコードから参照される値を保持するデータ構造を持ち、
前記第1の言語のバイトコードの処理系が実行可能な形式に書き替えられた前記第2の言語のバイトコードである仮想バイトコードの命令により使用される領域を、一時記憶手段に保持された前記データ構造における当該第2の言語のバイトコードの命令ごとに予め定められた場所に確保するステップと、
前記第2の言語のバイトコードにおける各命令を前記仮想バイトコードに変換して、当該仮想バイトコードを前記一時記憶手段に保持させるステップと、
前記一時記憶手段に保持された前記データ構造を含み、前記仮想バイトコードをメソッドとしてエンコードした前記第1の言語のバイトコードのクラス・ファイルを生成するステップと、
を含む、方法。 In a program conversion method for encoding a byte code of a second language on a byte code of a first language to generate a class file of the byte code of the first language,
The bytecode class file of the first language has a data structure that holds a value referenced from the bytecode of the method call,
An area used by a virtual bytecode instruction that is a bytecode of the second language that has been rewritten into a format executable by the bytecode processing system of the first language is held in a temporary storage unit Securing at a predetermined location for each byte code instruction of the second language in the data structure;
Converting each instruction in the byte code of the second language into the virtual byte code, and holding the virtual byte code in the temporary storage means;
Generating a bytecode class file of the first language including the data structure held in the temporary storage means and encoding the virtual bytecode as a method;
Including a method.
第1の言語のバイトコード上に第2の言語のバイトコードをエンコードし、メソッド呼び出しのバイトコードから参照される値を保持するデータ構造を持つ当該第1の言語のバイトコードのクラス・ファイルを生成するための下記の機能であって、
前記第1の言語のバイトコードの処理系が実行可能な形式に書き替えられた前記第2の言語のバイトコードである仮想バイトコードの命令により使用される領域を、一時記憶手段に保持された前記データ構造における当該第2の言語のバイトコードの命令ごとに予め定められた場所に確保する機能と、
前記第2の言語のバイトコードにおける各命令を前記仮想バイトコードに変換して、当該仮想バイトコードを前記一時記憶手段に保持する機能と、
前記一時記憶手段に保持された前記データ構造および前記仮想バイトコードを含む前記第1の言語のバイトコードのクラス・ファイルを生成する機能と、
を実現させるためのプログラム。 On the computer,
A bytecode class file of the first language having a data structure that encodes the bytecode of the second language on the bytecode of the first language and holds a value referenced from the bytecode of the method call The following functions for generating:
An area used by a virtual bytecode instruction that is a bytecode of the second language that has been rewritten into a format executable by the bytecode processing system of the first language is held in a temporary storage unit A function to secure a predetermined place for each byte code instruction of the second language in the data structure;
A function of converting each instruction in the byte code of the second language into the virtual byte code and holding the virtual byte code in the temporary storage means;
A function of generating a bytecode class file of the first language including the data structure held in the temporary storage means and the virtual bytecode;
A program to realize
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2008186452A JP5090279B2 (en) | 2008-07-17 | 2008-07-17 | Program conversion system |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2008186452A JP5090279B2 (en) | 2008-07-17 | 2008-07-17 | Program conversion system |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2010026728A JP2010026728A (en) | 2010-02-04 |
JP5090279B2 true JP5090279B2 (en) | 2012-12-05 |
Family
ID=41732514
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2008186452A Expired - Fee Related JP5090279B2 (en) | 2008-07-17 | 2008-07-17 | Program conversion system |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP5090279B2 (en) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110990019B (en) * | 2019-11-20 | 2023-05-02 | 腾讯音乐娱乐科技(深圳)有限公司 | Java class analysis method and device, storage medium and electronic equipment |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH0293947A (en) * | 1988-09-30 | 1990-04-04 | Fuji Xerox Co Ltd | Electronic computer |
-
2008
- 2008-07-17 JP JP2008186452A patent/JP5090279B2/en not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JP2010026728A (en) | 2010-02-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR101081090B1 (en) | Register-based instruction optimization for facilitating efficient emulation of an instruction stream | |
US7203941B2 (en) | Associating a native resource with an application | |
JP5415557B2 (en) | User script code conversion for debugging | |
KR20180136976A (en) | Apparatus and method for performing operations on qualification metadata | |
US10635823B2 (en) | Compiling techniques for hardening software programs against branching programming exploits | |
US7406684B2 (en) | Compiler, dynamic compiler, and replay compiler | |
JP4042280B2 (en) | Execution program generation method and execution program generation apparatus, execution program execution method, and computer-readable program storage medium | |
EP1347379A2 (en) | On demand, network accessible runtime compile server | |
US6463521B1 (en) | Opcode numbering for meta-data encoding | |
JP2007522584A (en) | Method and apparatus for optimizing application program interface in virtual machine environment | |
US8341615B2 (en) | Single instruction multiple data (SIMD) code generation for parallel loops using versioning and scheduling | |
KR19990036883A (en) | Mixed execution stack and implementation method and apparatus thereof | |
US20120159463A1 (en) | Method and system for creating, applying, and removing a software fix | |
JP4806060B2 (en) | Compiler program, compiling method, and computer system | |
WO2024045379A1 (en) | Compiling method, compiler, and wasm virtual machine | |
US8230407B2 (en) | Apparatus and method for accelerating Java translation | |
WO2012010419A1 (en) | A string cache file for optimizing memory usage in a java virtual machine | |
JP6073392B2 (en) | System and method for evaluating data values as instructions | |
JP2005529383A (en) | Time-multiplexed speculative multithreading to support single-threaded applications | |
JP2004303114A (en) | Interpreter and native code execution method | |
JP5536593B2 (en) | Optimization device, optimization method, and compiler program | |
JP5090279B2 (en) | Program conversion system | |
JP2004259007A (en) | Compiler device, compiler program, and storage medium | |
JP5387089B2 (en) | Program and program execution device | |
US9720660B2 (en) | Binary interface instrumentation |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20110615 |
|
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: 20120828 |
|
RD14 | Notification of resignation of power of sub attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7434 Effective date: 20120828 |
|
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20120912 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20150921 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 |