プログラミング言語 C の新機能 Part II: 合い言葉を唱えよ!
(1999/03/19 [金])
プログラミング言語には、一般的に予約語が存在します。これは、プログラム中で自由に意味付けすることのできない識別名のことを言います。例えば、int という単語が予約語だとすると、int という名前を変数名や、関数名として利用できないということです。
さてさて、われらがプログラミング言語 C にも当然予約語が存在しています。おさらいがてら、以下に列挙してみましょう。
すべて、おなじみのものばかりですね。えっ、registerって何?volatileって? まさかそんな事は言いませんよね...。例えば、register は変数宣言のときに使います。(例: register int i;) これはコンパイラに「この変数はよく使うから特別扱い(レジスタに割り当てて高速に参照できるよう)してあげてね」ということを教えてあげます。ただし、これはコンパイラへのヒントなので指定したからといって必ずしも要求を聞いてもらえるとは限りません。コンパイラによっては register はすべて無視するようになっているかもしれません。(高速に実行するために、どの変数に着目して最適化すべきかはデータフロー解析という手法を行うとある程度わかるが、それを行うためには多少のコストがかかる。しかし、そんなことをしなくてもプログラマはどの変数の参照を早くすればよいかだいたいわかっている。だから、プログラマが指定できるようにしておけば、わざわざ解析する必要もなくなり、コンパイル時間や資源を節約できる、という考えから。まことに C 言語らしいキーワードである。)
従来のキーワードは前記の通りですが、今度のプログラミング言語 C では新たなキーワードが追加されています。さっそく見てみましょう。
各予約語のもっと詳しい紹介はいずれ行うとしても、ついに複素数のサポートが入りました。人によっては、この機能だけで新しい C 言語を使いたいと思う人もいるかもしれませんね。
さてさて、われらがプログラミング言語 C にも当然予約語が存在しています。おさらいがてら、以下に列挙してみましょう。
auto | const | double | float | int | short | struct | unsigned |
break | continue | else | for | long | signed | switch | void |
case | default | enum | goto | register | sizeof | typedef | volatile |
char | do | extern | if | return | static | union | while |
すべて、おなじみのものばかりですね。えっ、registerって何?volatileって? まさかそんな事は言いませんよね...。例えば、register は変数宣言のときに使います。(例: register int i;) これはコンパイラに「この変数はよく使うから特別扱い(レジスタに割り当てて高速に参照できるよう)してあげてね」ということを教えてあげます。ただし、これはコンパイラへのヒントなので指定したからといって必ずしも要求を聞いてもらえるとは限りません。コンパイラによっては register はすべて無視するようになっているかもしれません。(高速に実行するために、どの変数に着目して最適化すべきかはデータフロー解析という手法を行うとある程度わかるが、それを行うためには多少のコストがかかる。しかし、そんなことをしなくてもプログラマはどの変数の参照を早くすればよいかだいたいわかっている。だから、プログラマが指定できるようにしておけば、わざわざ解析する必要もなくなり、コンパイル時間や資源を節約できる、という考えから。まことに C 言語らしいキーワードである。)
従来のキーワードは前記の通りですが、今度のプログラミング言語 C では新たなキーワードが追加されています。さっそく見てみましょう。
名称 | 対象 | 説明 |
---|---|---|
inline | 関数に修飾 | 可能な限り高速に呼び出すようコンパイラに指示する。例えば、この関数を呼び出した部分を単純な関数呼び出しにしないで、関数の内部コードそのもので置き換える。C++ にも存在。 |
restrict | ポインタに修飾 | そのポインタの指す対象にエイリアスがないことをプログラマが保証する。コンパイラはこの情報を元に最適化を行う。 |
_Bool | 型 | 見ての通り。値0か1を保持できる型。#include <stdbool.h> することでシンボル bool, true, false が使えるようになる。C++ にも存在。ただし、C++ では bool, true, false はすべて予約語。_Bool は存在しない。 |
_Complex _Imaginary | 一連の float 型を修飾 | _Imaginaryはオプション(実装しなくてもよい)。_Complex は Freestanding implementations ならオプション。_Complex, _Imaginary で、複素数演算をサポートする。#include <complex.h> とすることで、complex, imaginary, I といったシンボルが使用可能になる。(double complex)(1.2 + I * 5.4); のような複素数の表記、演算などが可能。 |
*_Bool, _Complex, _Imaginary は他の修飾子と表記法が異なっている。特定のヘッダファイルを取り込むことにより他の修飾子と同様の表記が可能になっている。これは、現存するソースファイルにこのような識別名が使われていることが考えられるため、新しい機能を使いたい人だけが使えるようにするためにこうしてあると考えられる。 |
各予約語のもっと詳しい紹介はいずれ行うとしても、ついに複素数のサポートが入りました。人によっては、この機能だけで新しい C 言語を使いたいと思う人もいるかもしれませんね。
by seclan