[Contents]   [Back]   [Prev]   [Up]   [Next]   [Forward]  


異なる言語の使用

通常、 プログラミング言語というものは共通点を持つものですが、 その表記法が全く同様であるということはめったにありません。 例えば、 ポインタ pの指す値を取り出す方法は、 ANSI Cでは*pですが、 Modula-2ではp^です。 値の表現方法 (および表示方法) もまた異なります。 16進数は、 Cでは`0x1ae'のようになりますが、 Modula-2では`1AEH'のようになります。 いくつかの言語については、 言語固有の情報がGDBに組み込まれており、 これにより、 プログラムを記述した言語によって上記のような操作を記述したり、 プログラムを記述した言語の構文にしたがってGDBに値を出力させることができます。 式を記述するのにユーザが使用する言語を、 作業言語と呼びます。

ソース言語の切り替え

作業言語を制御する方法は2つあります。 GDBに自動的に設定させる方法と、 ユーザが手動で選択する方法です。 どちらの目的でも、 set languageコマンドを使用することができます。 起動時のデフォルトでは、 GDBは言語を自動的に設定します。 作業言語は、 ユーザの入力する式がどのように解釈されるか、 あるいは、 値がどのように表示されるかを決定します。 この作業言語とは別に、 GDBの認識しているすべてのソース・ファイルには、 それ自体の作業言語があります。 オブジェクト・ファイルのフォーマットによっては、 ソース・ファイルの記述された言語を示す情報をコンパイラが書き込んでいることがあるかもしれません。 しかし、 ほとんどの場合、 GDBはファイル名から言語を推定します。 ソース・ファイルの言語が、 C++シンボル名がデコード (demangle) されるか否かを制御します。 これにより、 backtraceは個々のフレームをその言語にしたがって適切に表示することができます。 GDBによってソース・ファイルの言語を設定することはできません。 このことは、 他の言語で記述されたソースからCのソースを生成するcfrontf2cのようなプログラムをユーザが使用する場合に問題となるでしょう。 このような場合には、 生成されるCの出力に#line指示子を使用するよう、 そのプログラムを設定してください。 こうすることによって、 GDBは元になったプログラムのソース・コードが記述された言語を正しく知ることができ、 生成されたCのコードではなく、 元になったソース・コードを表示します。

ファイル拡張子と言語のリスト

ソース・ファイル名が以下のいずれかの拡張子を持つ場合、 GDBはその言語を以下に示すものと推定します。

`.mod'
Modula-2ソース・ファイル
`.c'
Cソース・ファイル
`.C'
`.cc'
`.cxx'
`.cpp'
`.cp'
`.c++'
C++ソース・ファイル
`.ch'
`.c186'
`.c286'
CHILLソース・ファイル
`.s'
`.S'
アセンブラ言語のソース・ファイル。 実際の動作はほとんどC言語と同様ですが、 ステップ実行時にGDBは関数呼び出しのための事前処理部をスキップしません。

作業言語の設定

GDBに言語を自動的に設定させる場合、 ユーザのデバッグ・セッションとユーザのプログラムにおいて、 式は同様に解釈されます。 もしそうしたければ、 言語を手動で設定することもできます。 そのためには、 コマンド`set language lang'を実行します。 ここで、 langは、 cmodula-2 のような言語名です。 サポートされている言語のリストは、 `set language'で表示させることができます。 言語を手動で設定すると、 GDBは作業言語を自動的に更新することができなくなります。 このことは、 作業言語がソースの言語と同一ではない場合で、 ある式がどちらの言語でも有効でありながら、 その意味が異なるような状況でプログラムをデバッグしようとしたときに、 混乱をもたらす可能性があります。 例えば、 カレントなソース・ファイルがC言語で記述されていて、 GDBがそれをModula-2として解析している場合に、

print a = b + c

のようなコマンドを実行すると、 その結果はユーザが意図したものとは異なるものになるでしょう。 これはC言語では、 bcとを加算して、 その結果をaに入れるということを意味し、 表示される結果は、 aの値となります。 Modula-2では、 これはab+cの結果とを比較してBOOLEAN型の値を出力することを意味します。

GDBによるソース言語の推定

GDBに作業言語を自動的に設定させるには、 `set language local'もしくは`set language auto'を使用します。 この場合、 GDBは作業言語を推定します。 つまり、 ユーザ・プログラムが (通常はブレイクポイントに達することによって) あるフレーム内部で停止したとき、 GDBは、 そのフレーム内の関数に対して記録されている言語を作業言語として設定します。 フレームの言語が不明の場合 (つまり、 そのフレームに対応する関数もしくはブロックが既知ではない拡張子を持つソース・ファイルにおいて定義されている場合)、 カレントな作業言語は変更されず、 GDBは警告メッセージを出力します。 これは、 全体がただ1つの言語のみで記述されているほとんどのプログラムにおいて不要であると思われるでしょう。 しかし、 あるソース言語で記述されたプログラム・モジュールやライブラリは、 他のソース言語で記述されたメイン・プログラムから使用することができます。 このような場合に`set language auto'を使用することで、 ユーザは作業言語を手作業で設定する手間から解放されます。

言語の表示

以下のコマンドは、 作業言語、 および、 ソース・ファイルの記述された言語を知りたいときに役に立ちます。

show language
カレントな作業言語を表示します。 このコマンドによって示される言語を使用して、 printコマンドなどでユーザ・プログラム内部の変数を含む式を構築したり評価したりすることができます。
info frame
選択されているフレームのソース言語を表示します。 このフレーム内部の識別子を使用すると、 この言語が作業言語になります。 このコマンドにより表示される他の情報について知りたい場合は、 フレームに関する情報を参照してください。
info source
選択されているソース・ファイルのソース言語を表示します。 このコマンドにより表示される他の情報について知りたい場合は、 シンボル・テーブルの検査を参照してください。

型と範囲のチェック

注意: 現在のリリースでは、 型および範囲のチェックを行うGDBコマンドは組み込まれていますが、 それらは実際には何も実行しません。 このセクションでは、 これらのコマンドが本来持つべく意図されている機能について記述してあります。

いくつかの言語は、 一連のコンパイル時チェック、 実行時チェックによって、 一般によく見られるエラーの発生を防ぐように設計されています。 これらのチェックには、 関数や演算子への引数の型のチェックや、 数学的操作の結果のオーバフローを実行時に確実に検出することなどが含まれています。 このようなチェックは、 型の不一致を排除したり、 ユーザ・プログラムの実行時に範囲エラーをチェックしたりすることによって、 コンパイル後のプログラムの正しさを確かなものにするのに役に立ちます。 GDBは、 ユーザが望むのであれば、 上記のような条件のチェックを行います。 GDBはユーザ・プログラムの文をチェックすることはしませんが、 例えばprintコマンドによる評価を目的としてGDBに直接入力された式をチェックすることはできます。 作業言語の場合と同様に、 GDBが自動的にチェックを行うか否かをユーザ・プログラムのソース言語によって決定することもできます。 サポートされている言語のデフォルトの設定については、 サポートされる言語を参照してください。

型チェックの概要

いくつかの言語、 例えばModula-2などは、 強く型付けされています。 これは、 演算子や関数への引数は正しい型でなくてはならず、 そうでない場合にはエラーが発生するということを意味しています。 このようなチェックは、 型の不一致のエラーが実行時に問題を発生させるのを防いでくれます。 例えば、 1+2は

1 + 2 => 3
ですが、1+2.3は
error--> 1 + 2.3

とエラーになります。 第2の例がエラーになるのは、 CARDINAL型の1はREAL型の2.3と型の互換性がないからです。 GDBコマンドの中で使われる式については、 ユーザがGDBの型チェック機能に対して、 以下のような指示を出すことができます。

最後の指示が選択された場合、 GDBは上記の第2の例のような式でも評価しますが、 その際には警告メッセージを出力します。 型チェックをしないよう指示した場合でも、 型に関係のある原因によってGDBが式の評価ができなくなる場合がありえます。 例えば、 GDBはintの値とstruct fooの値を加算する方法を知りません。 これら特定の型エラーは、 使用されている言語とは関係なく、 この例のように、 そもそも評価することが意味をなさないような式に起因するものです。 個々の言語は、 それが型に関してどの程度厳密であるかを定義しています。 例えば、 Modula-2とCはいずれも、 算術演算子への引数としては数値を要求します。 Cでは、 列挙型とポインタは数値として表すことができますので、 これらは算術演算子への正当な引数となります。 特定の言語に関する詳細については、 サポートされる言語を参照してください。 GDBは、 型チェック機能を制御するためのコマンドをさらにいくつか提供しています。

set check type auto
カレントな作業言語に応じて、 型チェックを実行する、 もしくは、 実行しないよう設定します。 個々の言語のデフォルトの設定については、 サポートされる言語を参照してください。
set check type on
set check type off
カレントな作業言語のデフォルトの設定を上書きして、 型チェックを実行する、 もしくは、 実行しないよう設定します。 その設定が言語のデフォルトと一致しない場合は、 警告メッセージが出力されます。 型チェックを実行するよう設定されているときの式の評価において型の不一致が発生した場合には、 GDBはメッセージを出力して式の評価をアボートさせます。
set check type warn
型チェック機能に常に式を評価させ、 (場合によっては) 警告メッセージを出力させます。 式の評価は、 他の原因のために不可能になる場合もあります。 例えば、 GDBは数値と構造体の加算はできません。
show type
型チェック機能のカレントな設定と、 GDBがそれを自動的に設定しているか否かを表示します。

範囲チェックの概要

いくつかの言語 (例えば、 Modula-2) では、 型の上限を超えるとエラーとなります。 このチェックは実行時に行われます。 このような範囲チェックは、 計算結果がオーバフローしたり、 配列の要素へのアクセス時に使うインデックスが配列の上限を超えたりすることがないことを確実にすることによって、 プログラムの正しさを確かなものにすることを意図したものです。 ユーザがGDBコマンドの中で使う式については、 範囲エラーの扱いを以下のいずれかにするよう GDBに指示することができます。

範囲エラーは、 数値がオーバフローした場合、 配列インデックスの上限を超えた場合、 ユーザがどの型のメンバでもない定数を入力した場合に発生します。 しかし、 言語の中には、 数値のオーバフローをエラーとして扱わないものもあります。 C言語の多くの実装では、 数学的演算によるオーバフローは、 結果の値を「一巡」させて小さな値にします。 例えば、 mが整数値の最大値、 sが整数値の最小値とすると、

m + 1 => s

になります。 これも、 個々の言語に固有であり、 場合によっては、 個々のコンパイラやマシンに固有です。 特定の言語に関する詳細については、 サポートされる言語を参照してください。 GDBは、 範囲チェック機能を制御するためのコマンドをさらにいくつか提供しています。

set check range auto
カレントな作業言語に応じて、 範囲チェックを実行する、 もしくは、 実行しないを設定します。 個々の言語のデフォルトの設定については、 サポートされる言語を参照してください。
set check range on
set check range off
カレントな作業言語のデフォルトの設定を上書きして、 範囲チェックを実行する、 もしくは、 実行しないよう設定します。 設定が言語のデフォルトとは異なる場合は、 警告メッセージが出力されます。 範囲エラーが発生した場合は、 メッセージが表示され、 式の評価はアボートされます。
set check range warn
GDBの範囲チェック機能が範囲エラーを検出した場合、 メッセージを出力しますが、 式の評価は試みます。 例えば、 プロセスが所有していないメモリをアクセスした場合 (多くのUnixシステムで典型的に見られる例です) など、 他の理由によって式の評価が不可能な場合があります。
show range
範囲チェック機能のカレントな設定と、 それがGDBによって自動的に設定されているのか否かを表示します。

サポートされる言語

GDB 4は、C、C++、Modula-2 をサポートしています。 いくつかのGDBの機能は、 使用されている言語にかかわらず、 式の中で使用できます。 GDBの@演算子、 ::演算子、 および`{type}addr'を参照) は、 サポートされている任意の言語において使用することができます。 次節以降で、 個々のソース言語がGDBによってどの程度までサポートされているのかを詳しく説明します。 これらの節は、 言語についてのチュートリアルやリファレンスとなることを意図したものではありません。 むしろ、 GDBの構文解析機能が受け付ける式や、 異なる言語における正しい入出力フォーマットのリファレンス・ガイドとしてのみ役に立つものです。 個々の言語については良い書籍が数多く出ています。 言語リファレンスやチュートリアルが必要な場合は、 これらの書籍を参照してください。

C/C++

CとC++は密接に関連しているので、 GDBの機能の多くは両方の言語に適用できます。このようなものについては、2つの言語を一緒に議論します。 C++のデバッグ機能は、 GNU C++コンパイラとGDBによって協同で実装されています。 したがって、 C++のコードを効率よくデバッグするには、 C++のユーザ・プログラムを GNU C++コンパイラg++でコンパイルする必要があります。 C++プログラムのデバッグ時に最高の結果を引き出すには、 スタブ・デバッグ・フォーマットを使用してください。 g++のコマンドライン・オプション`-gstabs'もしくは`-gstabs+'によって、 このフォーマットを明示的に選択することができます。 詳細については、 Using GNU CCの`Options for Debugging Your Program or GNU CC'の部分を参照してください。

C/C++演算子

演算子は、 特定の型の値に対して定義されなければなりません。 例えば、 +は数値に対しては定義されていますが、 構造体に対しては定義されていません。 演算子はしばしば型のグループに対して定義されます。 C/C++に対しては、以下の定義が有効です。

以下の演算子がサポートされています。 これらは優先順位の低いものから順に並べられています。

,
コンマ、 あるいは、 順序付けの演算子です。コンマによって区切られたリストの中の式は、 左から右の順で評価されます。 最後に評価された式の結果が、 式全体の評価結果になります。
=
代入。 代入された値が、 代入式の値になります。 スカラ型に対して定義されています。
op=
a op= bという形式の式において使用され、 a = a op bに変換されます。 op==は、 同一の優先順位を持ちます。 ここで、 opには|^&<<>>+-*/%の各演算子が使用できます。
?:
3項演算子です。 a ? b : cは、 aが真であればb、 偽であればcとみなします。 aは整数型でなければなりません。
||
論理ORです。 整数型に対して定義されています。
&&
論理ANDです。 整数型に対して定義されています。
|
ビットごとのORです。 整数型に対して定義されています。
^
ビットごとの排他的ORです。 整数型に対して定義されています。
&
ビットごとのANDです。 整数型に対して定義されています。
==、!=
等価、 および、 不等価です。 スカラ型に対して定義されています。 これらの式の値は、 偽のときはゼロであり、 真のときはゼロ以外の値となります。
<、>、<=、>=
未満、 超過、 以下、 以上です。 スカラ型に対して定義されています。 これらの式の値は、 偽のときはゼロであり、 真のときはゼロ以外の値となります。
<<、>>
左シフト、 右シフトです。 整数型に対して定義されています。
@
GDBの「人工配列」演算子です (を参照)。
+、-
加算および減算です。 整数型、 浮動小数点型、 ポインタ型に対して定義されています。
*、/、%
乗算、 除算、 剰余です。 乗算と除算は、 整数型と浮動小数点型に対して定義されています。 剰余は、 整数型に対して定義されています。
++, --
インクリメント、 デクリメントです。 これらが変数の前にある場合は、 式の中でその変数が使用される前に実行されます。 これらが変数の後にある場合は、 変数の値が使用された後に実行されます。
*
ポインタの間接参照です。 ポインタ型に対して定義されています。 ++と同一の優先度を持ちます。
&
アドレス参照演算子です。変数に対して定義されています。 ++と同一の優先順位を持ちます。 C++のデバッグでは、 C++自体では許されていないような`&'の使用法をGDBは実装しています。 C++の (`&(&ref)'により宣言される) 参照変数が格納されているアドレスを調べるのに、 `&&ref' (あるいは、もしそうしたいのであれば、 より簡単な`&ref') を使用することができます。
-
マイナスです。 整数型と浮動小数点型に対して定義されています。 ++と同一の優先順位を持ちます。
!
論理NOTです。 整数型に対して定義されています。 ++と同一の優先順位を持ちます。
~
ビットごとのNOT (補数) 演算子です。 整数型に対して定義されています。 ++と同一の優先順位を持ちます。
.、->
構造体のメンバ、 ポインタの指す構造体のメンバをそれぞれ指定する演算子です。 便宜上、 GDBは両者を同一のものとして扱い、 格納されている型情報をもとにポインタの間接参照を行うか否かを決定します。 構造体 (struct) および共用体 (union) に対して定義されています。
[]
配列のインデックスです。 a[i]*(a+i)として定義されています。 ->と同一の優先順位を持ちます。
()
関数のパラメータ・リストです。 ->と同一の優先順位を持ちます。
::
C++スコープ解決演算子です。 構造体(struct)、 共用体(union)、 クラス(class)に対して定義されています。
::
2重コロンは、 GDBのスコープ演算子 も 表します (を参照)。 上記の::と同一の優先順位を持ちます。

C/C++定数

GDBでは、 以下のような方法によって、 C/C++の定数を表すことができます。

C++式

GDBの式処理機能にはいくつかの拡張機能があり、 これによりC++の式の重要なサブセットを解釈することができます。

注意: GDBではGNU C++コンパイラでコンパイルされたC++コードしかデバッグできません。 さらに、 C++のデバッグはシンボル・テーブルの中の追加的なデバッグ情報の使用に依存するため、 特別なサポートが必要です。 GDBはこのようなサポートをスタブ・デバッグ・フォーマットでのみ手に入れることができます。 使用されるコンパイラがa.out、 MIPS ECOFF、 RS/6000 XCOFF、 ELFを、 シンボル・テーブルへのスタブ拡張付きで生成することができるのであれば、 これらの機能を使用することができます (GNUの場合は、 `-gstabs'オプションを使用して明示的にスタブ・デバッグ拡張を要求することができます)。 一方、 オブジェクト・コードのフォーマットが標準COFFやDWARFのELFである場合には、 GDBの提供するほとんどのC++サポートは機能しません

  1. メンバ関数の呼び出しが許されます。 以下のような式を使用することができます。
    count = aml->GetOriginal(x, y)
    
  2. メンバ関数が (選択されたスタック・フレームの中で) アクティブな場合、 その関数と同様の名前空間をユーザの式が持ちます。 すなわちGDBは、 C++と同様の規則にしたがって、 クラス・インスタンスへのポインタthisへの暗黙の参照を許します。
  3. オーバロードされた関数を呼び出すことができます。 GDBは正しい定義にしたがった関数呼び出しを決定します。 ただし、 1つ制限があります。 実際に呼び出したい関数が要求する型の引数を使用しなければなりません。 GDBは、 コンストラクタやユーザ定義の型演算子を必要とするような変換を実行しません。
  4. GDBはC++の参照変数として宣言された変数を理解します。 C++のソース・コードで参照変数を使用するのと同一の方法で、 参照変数を式の中で使用することができます。 参照変数は自動的に間接参照されます。 GDBがフレームを表示する際に表示されるパラメータ一覧の中では、 参照変数の値は (他の変数とは異なり) 表示されません。 これにより混乱を回避できます。 というのは、 参照変数はしばしば大きい構造体に対して使用されるからです。 参照変数の アドレスは、 `set print address off'を指定しない限り、 常に表示されます。
  5. GDBはC++の名前解決演算子::をサポートしています。 ユーザはプログラム中と同様に、 式の中でこれを使用することができます。 あるスコープが別のスコープ中で定義されることがありえるため、 必要であれば::を繰り返し使用することができます。 例えば、 `scope1::scope2::name'という具合です。 GDBはまた、 CおよびC++のデバッグにおいて、 ソース・ファイルを参照することで名前のスコープを解決することができます (プログラム変数を参照)。

C/C++のデフォルト

GDBが自動的に型チェックや範囲チェックの設定を行うことを許すと、 作業言語がCもしくはC++に変更されるときにはいつも、 それらの設定はデフォルトでoffになります。 これは、 作業言語を選択したのがユーザであってもGDBであっても同様です。 GDBが自動的に言語の設定を行うことを許すと、 GDBは名前が`.c'`.C'`.cc'で終わるソース・ファイルを認識していて、 これらのファイルからコンパイルされたコードを実行し始めるときに、 作業言語をCもしくはC++に設定します。 詳細については、 GDBによるソース言語の推定を参照してください。

C/C++の型チェックと範囲チェック

デフォルトでは、 GDBがCもしくはC++の式を解析するときには、 型チェックは行われません。 しかし、 ユーザが型チェックを有効にすると、 GDBは以下の条件が成立するときに、 2つの変数の型が一致しているとみなします。

範囲チェックは、 onに設定されている場合、 数学的演算に対して実行されます。 配列のインデックスは、 しばしばそれ自体は配列ではないポインタのインデックスとして使用されるため、 チェックされません。

GDBとC

set print unionコマンドとshow print unionコマンドは共用体型 (union) に適用されます。 `on'に設定されると、 構造体 (struct) やクラス (class) の内部にある任意の共用体 (union) は表示されます。 `on'でない場合、 それは`{...}'と表示されます。 @オペレータは、 ポインタとメモリ割り当て関数とによって形成された動的配列のデバッグに役に立ちます。 を参照してください。

C++用のGDB機能

GDBのコマンドの中にはC++を使用しているときに特に役に立つものがあり、 また、 C++専用に特に設計されたものがあります。 以下に、 その要約を示します。

breakpoint menus
名前がオーバロードされている関数の内部にブレイクポイントを設定したい場合、 関心のある関数定義を指定するのにGDBのブレイクポイント・メニューが役に立ちます。 ブレイクポイント・メニューを参照してください。
rbreak regex
特別なクラスのメンバではないがオーバロードされている関数にブレイクポイントを設定するのに、 正規表現によるブレイクポイントの設定が役に立ちます。 ブレイクポイントの設定を参照してください。
catch exceptions
info catch
これらのコマンドを使用してC++の例外処理をデバッグしてください。 ブレイクポイントと例外を参照してください。
ptype typename
typenameに関して、継承関係などの情報を表示します。 シンボル・テーブルの検査を参照してください。
set print demangle
show print demangle
set print asm-demangle
show print asm-demangle
コードをC++のソースとして表示する場合と、 逆アセンブル処理の結果を表示する場合に、 C++のシンボルをソース形式で表示するか否かを制御します。 表示設定を参照してください。
set print object
show print object
オブジェクトの型を表示する際に、 派生した (実際の) 型と宣言された型のどちらを表示するかを選択します。 表示設定を参照してください。
set print vtbl
show print vtbl
仮想関数テーブルの表示形式を制御します。 表示設定を参照してください。
オーバロードされたシンボル名
C++においてオーバロードされたシンボルを宣言するのに使用されるのと同様の表記法を使用して、 オーバロードされたシンボル定義のうち特定のものを指定することができます。 単にsymbolと入力するのではなく、 symbol(types)と入力してください。 GDBコマンドラインの単語補完機能を使用して、 利用可能な選択肢を一覧表示させたり、 型のリストを完結させたりすることができます。 この機能の使用方法の詳細については、 コマンド名の補完を参照してください。

Modula-2

Modula-2をサポートするために開発されたGDBの拡張機能は、 (現在開発中の) GNU Modula-2コンパイラによって生成されたコードのみをサポートします。 他のModula-2コンパイラは現在サポートされていません。 他のModula-2コンパイラで生成された実行形式モジュールをデバッグしようとすると、 おそらくGDBが実行モジュールのシンボル・テーブルを読み込もうとしたところでエラーになるでしょう。

Modula-2演算子

演算子は、 特定の型の値に対して定義されなければなりません。 例えば、 +は数値に対して定義され、 構造体に対しては定義されません。 演算子は、 しばしば型のグループに対して定義されます。 Modula-2においては、 以下の定義が有効です。

以下の演算子がサポートされています。 ここでは、 優先順位の低いものから順に並べています。

,
関数の引数および配列のインデックスの区切り記号です。
:=
代入です。 var := valueの値は valueです。
<、>
未満、 超過です。 整数型、 浮動小数点型、 列挙型に対して定義されています。
<=、>=
整数型、 浮動小数点型、 列挙型に対しては、 以下、 以上を表します。 集合型に対しては、 集合の包含関係を表します。 <と同一の優先順位を持ちます。
=、<>、#
スカラ型に対して定義されている等価および2種類の不等価です。 <と同一の優先順位を持ちます。 GDBスクリプトの中では、 #がスクリプトのコメント記号でもあるため、 不等価としては<>のみが使用可能です。
IN
集合のメンバを表します。 集合型およびそのメンバの型に対して定義されています。 <と同一の優先順位を持ちます。
OR
ブール型のOR (disjunction) です。 ブール型に対して定義されています。
AND、&
ブール型のAND (conjunction) です。 ブール型に対して定義されています。
@
GDBの「人工配列」演算子です (を参照)。
+、-
整数型、 浮動小数点型に対しては、 加算、 減算を表します。 集合型に対しては、 和集合 (union)、 差集合 (difference) を表します。
*
整数型、 浮動小数点型に対しては、 乗算を表します。 集合型に対しては、 積集合 (intersection) を表します。
/
浮動小数点型に対しては、 除算を表します。 集合型に対しては、 対称的差集合 (symmetric difference) を表します。 *と同一の優先順位を持ちます。
DIV、MOD
整数型の除算における商と剰余を表します。 整数型に対して定義されています。 *と同一の優先順位を持ちます。
-
反数(はんすう)のマイナスです。 INTEGERREAL型のデータに対して定義されています。
^
ポインタの間接参照です。 ポインタ型に対して定義されています。
NOT
ブール型のNOTです。 ブール型に対して定義されています。 ^と同一の優先順位を持ちます。
.
RECORDフィールドの区切り記号です。 RECORDデータに対して定義されます。^ ^と同一の優先順位を持ちます。
[]
配列のインデックスを指定します。 ARRAY型のデータに対して定義されています。 ^と同一の優先順位を持ちます。
()
プロシージャの引数リストを指定します。 PROCEDUREオブジェクトに対して定義されています。 ^と同一の優先順位を持ちます。
::、.
GDBおよびModula-2のスコープ指定演算子です。

注意: 集合および集合に対する操作はまだサポートされていません。 このため、 GDBはIN演算子、 および、 集合に対して+-*/=<>#<=>=のいずれかの演算子が使用された場合、 これをエラーとして扱います。

組み込み関数と組み込みプロシージャ

Modula-2ではいくつかの組み込みプロシージャ、 組み込み関数が使用できます。 これらの説明にあたり、 以下のメタ変数を使用します。

a
ARRAY型の変数を表します。
c
CHAR型の定数あるいは変数を表します。
i
整数型の変数あるいは定数を表します。
m
集合に属する識別子を表します。 通常、 同一関数の中でメタ変数sとともに使用されます。 sの型は、 (mの型を持つmtypeの) SET OF mtypeでなければなりません。
n
整数型もしくは浮動小数点型の、 変数もしくは定数を表します。
r
浮動小数点型の変数もしくは定数を表します。
t
型を表します。
v
変数を表します。
x
多くの型の中の1つの型の、 変数もしくは定数を表します。 詳細については、 関数の説明の部分を参照してください。

また、 すべてのModula-2の組み込みプロシージャは、 以下に説明する値を返します。

ABS(n)
nの絶対値を返します。
CAP(c)
cが小文字であれば、 それを大文字にして返します。 cが小文字でなければ、 cをそのまま返します。
CHR(i)
序数がiである文字を返します。
DEC(v)
変数vの値から1を引きます。 新しい値を返します。
DEC(v,i)
変数vの値からiで示される値を引きます。 新しい値を返します。
EXCL(m,s)
集合sから要素mを取り除きます。 新しい集合を返します。
FLOAT(i)
整数値iに等しい浮動小数点値を返します。
HIGH(a)
配列aの最後の要素のインデックスを返します。
INC(v)
変数vの値に1を加えます。 新しい値を返します。
INC(v,i)
変数vの値にiで示される値を加えます。 新しい値を返します。
INCL(m,s)
集合sに要素mが存在しない場合、 要素mを追加します。 新しい集合を返します。
MAX(t)
tの最大値を返します。
MIN(t)
tの最小値を返します。
ODD(i)
iが奇数であればブール型のTRUEを返します。
ORD(x)
引数の序数値を返します。 例えば、 文字の序数値は、 (ASCII文字セットをサポートするマシン上では) そのASCII値です。 ここでxは、 整数型、 文字型、 列挙型のような順序を持つ型でなければなりません。
SIZE(x)
引数のサイズを返します。 xは変数もしくは型のいずれかです。
TRUNC(r)
rの整数部を返します。
VAL(t,i)
tのメンバのうち、 その序数値がiであるものを返します。

注意: 集合と集合に対する操作はまだサポートされていません。 したがって、 INCLプロシージャ、 EXCLプロシージャを使用すると、 GDBはエラーとして扱います。

定数

GDBでは、 Modula-2の定数を以下のような方法で表現することができます。

Modula-2デフォルト

型チェックおよび範囲チェックがGDBにより自動的に設定される場合、 作業言語がModula-2に変わるたびに、 それらはデフォルトでonに設定されます。 これは、 作業言語を選択したのがユーザであろうとGDBであろうと同様です。 GDBに自動的に言語を設定させると、 ファイル名の末尾が`.mod'であるファイルからコンパイルされたコードに入るたびに、 作業言語はModula-2に設定されます。 詳細については、 GDBによるソース言語の推定を参照してください。

標準Modula-2との差異

Modula-2プログラムのデバッグを容易にするために2、 3の修正が施されています。 これは主に、 型に対する厳密性を緩めることによって実現されています。

Modula-2の型チェックと範囲チェック

注意: GDBは現在のところ型チェック、 範囲チェックをまだサポートしていません。

GDBは、 以下のいずれかの条件が成立するとき、 2つのModula-2変数の型が等しいとみなします。

型チェックが有効である限り、 等しくない型の変数を組み合わせようとする試みはすべてエラーとなります。 範囲チェックは、 数学的操作、 代入、 配列のインデックス境界、 およびすべての組み込み関数、 組み込みプロシージャにおいて実行されます。

スコープ演算子::.

Modula-2のスコープ演算子 (.) とGDBのスコープ演算子 (::) との間には2、 3の微妙な相違点があります。 この2つは似た構文を持っています。


module . id
scope :: id

ここで、 scopeはモジュール名もしくはプロシージャ名、 moduleはモジュール名、 idはユーザ・プログラムの中で宣言された任意の (異なるモジュール以外の) 識別子です。 ::演算子を使用するとGDBはscopeによって指定されたスコープにおいて識別子idを探します。 指定されたスコープにおいてそれを見つけることができないと、 GDBはscopeによって指定されたスコープを包含するすべてのスコープを探します。 .演算子を使用するとGDBはカレントなスコープにおいて、 modueによって指定された定義モジュールから取り込まれた、 idによって指定される識別子を探します。 この演算子を使用した際に、 識別子idが定義モジュールmoduleから取り込まれていない場合やmoduleにおいてidが識別子でない場合は、 エラーになります。

GDBとModula-2

GDBコマンドの中には、 Modula-2プログラムのデバッグにはほとんど役に立たないものがいくつかあります。 set printshow printの5つのサブ・コマンド`vtbl'`demangle'`asm-demangle'`object'`union'はC/C++にのみ適用されます。 最初の4つはC++に適用され、 最後の1つはCの共用体 (union) に適用されます。 これらは、 Modula-2において直接類似するものが存在しません。 @演算子 (を参照) は、 どの言語においても使用することができますが、 Modula-2においてはあまり役に立ちません。 この演算子は、 動的配列のデバッグを支援することを目的とするものですが、 C/C++では作成できる動的配列は、 Modula-2では作成できません。 しかし、 整数値定数によってアドレスを指定することができるので、 `{type}adrexp'は役に立ちます (を参照)。 GDBスクリプトの中では、 Modula-2の不等価#はコメントの開始記号として解釈されます。 代わりに<>を使用してください。


[Contents]   [Back]   [Prev]   [Up]   [Next]   [Forward]