機械翻訳について

DTraceの文字列処理

DTraceには、文字列をトレースおよび操作する機能があります。 この項では、文字列を宣言および操作するためのD言語機能の完全なセットについて説明します。 ANSI Cとは異なり、Dの文字列では、独自の組込み型と演算子がサポートされています。このため、これらはトレース・プログラム内で簡単かつ明確に使用できます。

文字列表現

DTraceでは、文字列はNULLバイト(値がゼロのバイトで、一般に'\0'と記述されます)で終わる文字配列として表現されます。 文字列の可視部分は可変長で、NULLバイトの場所によって長さが決まります。しかし、DTraceでは、各プローブで一定量のデータがトレースされるように、各文字列が固定サイズの配列に格納されます。 文字列は事前定義された文字列制限の長さを超えることはできません。 ただし、この制限はDプログラム内で変更できます。また、dtraceコマンドラインでstrsizeオプションをチューニングして変更することもできます。 デフォルトの文字列制限は256バイトです。

D言語では、文字列を参照するために、char *型を使用するかわりに、明示的なstring型が用意されています。 string型は、文字シーケンスのアドレスであるという点ではchar *型と同等です。ただし、DコンパイラやtraceなどのD関数は、string型の式に適用するときには拡張機能を使用できます。 たとえば、文字列の実際のバイトをトレースする必要がある場合、文字列タイプはchar *タイプの曖昧さを排除します。

次のD文では、schar *型の場合、DTraceはポインタsの値をトレースし、これは整数のアドレス値をトレースすることを意味します:

trace(s);

次のD文では、*演算子の定義によって、ポインタsが参照解除され、その場所の1文字がトレースされます:

trace(*s);

このような動作を利用すると、単一の文字や、文字列でないNULLバイトで終わらないバイト・サイズの整数配列を参照する文字ポインタを操作できます。

次のD文では、sstring型の場合、文字列型はDコンパイラに示されます。このとき、DTraceはアドレスが変数sに格納されている文字のnullで終了する文字列をトレースし:

trace(s);

また、文字列型の式の字句比較も実行できます。 文字列比較」を参照してください。

文字列定数

文字列定数は、二重引用符のペア("")で囲まれ、自動的にstring型が割り当てられます。 任意の長さの文字列定数を定義できます。これは、システムで消費できるメモリー量DTrace、およびstrsize DTraceランタイム・オプションに設定した制限によってのみ制限されます。 文字列定数を宣言すると、Dコンパイラによって自動的に終了NULLバイト(\0)が付加されます。 文字列定数オブジェクトのサイズは、文字列に関連付けられたバイト数と、終了Nullバイト用に1バイトを加えたものです。

文字列定数には、リテラルの改行文字を含めることはできません。 改行が含まれる文字列を作成するには、リテラルの改行のかわりに、\nエスケープ・シーケンスを使用します。 文字列定数には、文字定数用に定義された特殊文字エスケープ・シーケンスを含めることもできます。

文字列代入

char *変数の割当てとは異なり、文字列は参照ではなく値によってコピーされます。 文字列代入演算子=により、元のオペランドの文字列の実バイトとNULLバイトが、左側の変数(これはstring型である必要があります)にコピーされます。

宣言を使用して文字列変数を作成できます:

string s;

また、string型の式を代入して文字列変数を作成することもできます。

たとえば、次のようなD文があるとします。

s = "hello";

string型の変数sを作成して、そこに6バイトの文字列"hello" (出力可能文字5バイトとNULLバイト)をコピーしています。

文字列代入は、Cライブラリ関数strcpy()と類似していますが、元の文字列がコピー先の文字列の記憶域制限を超えた場合、最終的な文字列はこの制限上のNULLバイトで自動的に切り捨てられる点が異なります。

文字列変数には、文字列との互換性のある型の式を代入することもできます。 この場合、元の式が自動的にstring型に昇格され、文字列代入が行われます。 Dコンパイラでは、char *型またはchar[n]型(任意のサイズのchar型のスカラー配列)の任意の式をstring型に昇格できます。

文字列変換

他の型の式は、キャスト式を使用するか、特別なstringof演算子を適用することでstring型に明示的に変換できます。この演算子は、次の意味で同等です:

s = (string) expression;
s = stringof (expression);

式は、文字列へのアドレスとして解釈されます。

stringof演算子は、右側のオペランドに非常に緊密にバインドされます。 オプションで、わかりやすくするために式はカッコを使用して囲むことができます。

ポインタや整数などのスカラー型の式、またはスカラー配列のアドレスは、スカラーが文字型へのアドレスとして解釈されることから文字列に変換できます。 voidなどの他の型の式は、stringには変換できません。 無効なアドレスを文字列に誤って変換した場合、DTrace安全機能により、システムまたはDTraceの破損を防ぐことができますが、一連の暗号化不可能な文字のトレースを終了することがあります。

文字列比較

Dは、バイナリ関係演算子をオーバーロードし、文字列比較および整数比較に使用できます。 関係演算子は、両方のオペランドがstring型である場合、または1つのオペランドがstring型で、もう1つのオペランドがstring型に昇格できる場合に文字列比較を実行します。 詳細は、「文字列代入」を参照してください。 文字列の比較に使用できる関係演算子をリストする「表4-13」も参照してください。

表4-13 文字列のD関係演算子

演算子 説明

<

左のオペランドは右のオペランドより小さい

<=

左のオペランドは右のオペランド以下

>

左のオペランドは右のオペランドより大きい

>=

左のオペランドは右のオペランド以上

==

左のオペランドは右のオペランドと等しい

!=

左のオペランドは右のオペランドと等しくない

整数の場合と同様に、各演算子は、int型の値(条件がtrueの場合は1、falseの場合はゼロ)に評価されます。

関係演算子は、2つの入力文字列をバイト単位で比較し、Cライブラリ・ルーチンstrcmp()と同様です。 各バイトは、対応する整数値をASCIIキャラクタ・セットで使用して比較され、nullバイトが読み取られるか、最大文字列長に達するまで処理されます。 詳細は、ascii(7)マニュアル・ページを参照してください。 Dの文字列比較の例とその結果を次の表に示します。

Dの文字列比較 結果

"coffee" < "espresso"

1 (true)を返す

"coffee" == "coffee"

1 (true)を返す

"coffee"" >= "mocha"

0 (false)を返す

ノート:

どちらかが正規化されていない場合は、同一のUnicode文字列が異なる文字列として判断される可能性があります。