トークン・スレッディング
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/02/16 19:11 UTC 版)
「スレッデッドコード」の記事における「トークン・スレッディング」の解説
トークン・スレッデッドコードは8ビットか12ビットのインデックスのリストを使用し、このインデックスはポインタテーブルのインデックスとなっている。トークン・スレッデッドコードはプログラマが特別に努力しなくても非常にコンパクトになる。トークン・スレッデッドコードは他のスレッデッドコードの半分から4分の3の大きさで、スレッデッドコードは一般に普通にコンパイルされたコードの4分の1から8分の1の大きさである。ポインタテーブル内のポインタは直接の場合と間接の場合がある。一部のForthコンパイラはトークン・スレッデッドコードを生成する。一部のPascalコンパイラが生成するPコードをトークン・スレッデッドコードに分類する場合もあり、同様に.NET/Java/BASIC/一部のCコンパイラで使用するバイトコードもトークン・スレッディングだと言われることがある。 バイトコードは歴史的に、8ビットの命令コードを使用し、スタックに基づく仮想機械で実行される。典型的なインタプリタはデコード&ディスパッチ・インタプリタと呼ばれ、次のような形式である。 bytecode: top: pushA: pushB: add: 0 /*pushA*/ i = decode(vpc++) *sp++ = A *sp++ = B *sp++ = *--sp + *--sp 1 /*pushB*/ addr = table[i] jump top jump top jump top 2 /*add*/ jump *addr 仮想機械が1バイトの命令しか使わない場合、decode() は単に bytecode から1つフェッチするだけだが、1バイト命令を基本として多バイト命令も持つ場合があり、そのときは decode() がさらに複雑になる。1バイト命令コードのデコードは非常に単純で、命令コードをインデックスとしてジャンプテーブルを参照するだけでよい。 各命令の行う操作や演算は "push" や "add" などのように単純で、それらを実際に実行するコストよりもどれを実行するかを選択するオーバーヘッドの方が大きい。そのためこのようなインタプリタは単純に機械語コードを実行するよりも遅いことが多い。しかし、命令の処理内容がより複雑になれば、オーバーヘッドの割合は小さくなる。
※この「トークン・スレッディング」の解説は、「スレッデッドコード」の解説の一部です。
「トークン・スレッディング」を含む「スレッデッドコード」の記事については、「スレッデッドコード」の概要を参照ください。
- トークン・スレッディングのページへのリンク