epointer だから , fp て、す。ただし , しばし ばファイルを扱うプログラムを書く場合に は , ふたつ以上のファイルを扱いたくなり ますから , fp だけを使っていては混乱するか もしれません。 fp in, fp out のような書き 方はよく見かけます。 int fd ; ファイルディスクリプタの意味て、しよう。 int * p , 使い捨てのポインタとして pointer を連想 させる p を使います。これがたとえば long へ のポインタだと , lp となることが多いようて す。 Size t Size , 文字どおりサイズて、す。何のサイズかと いうと , おもに malloc のようにメモリを獲 得する関数への引数として使われますが , それ以外の用途にもよく使われるようてす。 int status , ステータス , すなわち状態て、すが , 何の 状態かというと , しばしば関数の戻す値 , もしくは exit の引数として使われます。 int temp , 次に問題になるのは , て、は , 自分が勝手 述べました。 のように使うのがよい」という方針に関して 自分勝手に使わないほうがよい」 , または「こ というわけて , 今まて、 , 「こういう名前は 印象的に登場するこど あるのて , 参考にするとよいと思います。 と , 引数の説明として使われている名前が このほかに , C の関数マニュアルを見る て , しばしば用いられます。 ムの中て、はなく , 説明のための関数名とし これらの名前は , 実際のソースプログラ intfoo(), bar() ; これは明らかに一時変数て、しよう。 66 C MAGAZINE 1992 4 単て、すが , 「 ~ するのがよい」というのは説 一般に「 ~ してはいけない」というのは簡 るのか , ということて、す。 に定義したい名前について , 何か指針があ 明困難になりがちて、す。あえて , どのよう な名前をつけるべきかという指針について 考えてみたいと思います。 言て、説明すれば , 「わかりやすい名前を つける」が大原則て、す。これだけて、も本質的 に理解していれば , あとは感性に正直に名 前をつけても , 相当変な人て、ないかぎり , 何も問題になりません。ただ , 驚いた に , わかりやすい名前にしようとさえ夢に も思わない人が結構いるように思えるのて、 すが。もうひとつは驚くには値しません。 どうすればわかりやすい名前になるのか , 理解て、きない場合て、す。 て、は , いったいどのような名前をつける とわかりやすいのて、しようか ? これは , 経験を積むに従って , 自然に身についてく るものだと思います。 まず考えておきたいのは , その名前を見 ただけて、 , 働きが一目瞭然て、あることて、す。 xc という名前が何を意味するのか , わかる 人はほとんどいないて、しよう。これが , tra nsfer count という名前だったら , 「何か転送 するとき回数が入っているのだな」程度は想 像て、きるのて、す。よくいわれることて、すが , こて、重要なのは , その意味を的確に表現 する名前を用いるということて、す。これは もっともなことてあり , 探せば多くの本に 書いてあるはずて、す。 フィンローダ流に関しては , もうひとつ 重要なことて、 , かっ , ほかの本にはあまり 書かれていないことがあります。それは , 「印象的な名前をつける」ということて、す。 ばっと一目て、気に入ってしまうような名前 がついたら成功て、す。なぜそれが本に書か れていないかというと , じゃあどうすれば 印象的な名前がつけられるんだ , といわれ たとき , そんなことは言葉て、説明がて、きな いからて、す。 名前き方 現状て、は , 日本語の名前が使える C コンパ イラは , あまり見かけないし , ANSI の規格 どおりなら , 当然日本語の変数名など考慮 されているわけがないから , いわゆるメジ ャーなコンパイラについては , 英数のみ使 えると考えておきます。 まず , 英単語を名前に使うとして , 省略 するか , 省略しないかという選択がありま す。例を見るのが手つ取り早いて、しよう。 char * file name ; / * 省略しない * / char *fn / * 省略する * / 省略しないメリットは , 意味を誤解する 確率が小さくなることて、す。 fn と書くと関数 名のことかと誤解するかもしれませんが , file name を見て関数名かと思う人はまずい ませんし , これを見た人は必ずファイル名 て、あることを理解て、きます。 て、は , 省略するメリットは何て、しようか。 ひとつは , あまりにもしばしば使われる変 数に長い名前をつけてしまうと , 入力する のがたいへんだということて、す。 ある程度長い名前になると , 開発環境に よっては cut&paste のような方法て、 , 文字列 コヒ。ーがて、きるのて、 , そのほうが間違いが 少なくなります。長い名前はタイプ時に間 違いがちなのて、嫌だという人がいますが , これはある意味て、危険て、す。タイプ時に間 違う確率は , 何文字あたり 1 回というものて、 あって , 短い変数て、も間違えるときは間違 えるものて、す。間違えたとき , どの程度の 影響があるかということも検討しておくべ きて、す。短い変数をいくつも使っていると , タイプし間違えたとき , 偶然別の変数にな ってしまうことがあります。この原因によ るバグは , 一度コンパイルに通ってしまう となかなか発見て、きません。長い名前の場 合 , 間違えてタイプしたら , そんな変数は ないとコンパイル時にはじかれる確率が高 くなり , その意味て、は安全かもしれません。 しかし , 長い名前にもデメリットがあり ます。あまり長い名前だと , 肝心の処理の 流れを理解するための思考を妨げる危険も あります。名前を追いかけて最後まて、読ん て、 , ああこれはあの変数だな , と思ったと きは , 今 while のループ条件を調べていたの か , if の判断の途中だったのか忘れてしまう かもしれません。という例はさすがに大袈
特集℃プロクラミンクの秘 裟すぎますが , 名前が長すぎると , かえっ といえばそうかもしれません。 て全体が見にくくなる可能性があるのは確 しかし , フィンローダ流は②て、す。②の かて、す。そこて、 , 妥協案として , あまり長 長所はふたつあります。 ここに出てくる c という非常に短い名前を い場合には省略する , という方法が考えら まず , すべて小文字て書かれていること 持った変数は , 伝統的に getchar のような 1 て、す。①の場合 , どこを大文字にしたか忘 れます。これも悪くはありません。 文字入力の結果を保存するために使われま れることがあるかもしれませんが , ②て、は す。 c という文字が , character を連想させる char * fname , / * ちょっとだけ省略する * / それはありません。ただし , FileName と書 のて , この場合 c という名前が使われるのて、 この方法の場合 , 長すぎもなく , 全然わ いたか FiIename と書いたかわからなくなる しよう。ただし , c の型は int< あるのが普通 からないほど省略するのて、もない , ように , filename と書いたか file name と書 なのて、 , 注意してください。初心者の中に 加減に成功すれば , かなり効果があると思 いたかわからなくなることはあるのて、 , ② は , これをうつかり char にしてしまうこと います。ただ , ひとつ気になるのは , 経験 のように書いたほうが混乱しないと一概に が多いようて、す。この変数は , 伝統的なの 的に , どの程度省略したのか , しばしば忘 はいえないかもしれません。 て、 , 短いながらもまったく無意味て、あるわ れてしまうということて、す。たとえば , 私が②の書き方を気に入っている理由は , けて、はありませんが , この種の使い捨て変 時ファイルの名称を保存したい変数の名前 単語と単語の間が , アンダースコアという , 数は , その場かぎりて、処理が完結するとい を , tempfile としたのか , tmpfile としたの 見た目がかなり空白に近い文字て、区切られ う意味て、 , 変数名に意味を持たせなくても , か , プログラムを書いている途中て、すら忘 ているため , ばっと見たとき読みやすいと 理解の妨げにはならないのて、す。これに対 れてしまうことがよくあります。 田われることて、す。①の書き方は , 確かに して , 複雑な処理を行う関数の名前や , 大 フィンローダ流は , 慣習として省略した 大文字を認識して単語を分解することが可 局的に使われている変数の名前は , て、きる 書き方が固定したものて、なければ , て、きる 能て、すが , ばっと見たとき大文字小文字を かぎりその意味を表すような名前をつける , かぎり省略しない , というものて、す。 区別するほうが , アンダースコアよりも一 というのがフィンローダ流て、す。要するに ただし , 以上の議論は , 継続的に意味を 瞬手間がかかるように感じます。 長さにはまるて、無頓着なのて、す。 持ち得る変数の場合のことて、あり , 使い捨 とくに , 後者は , わかりやすさに影響し さて , て、きるかぎり省略しないとなると , ての変数はこのかぎりて、はありません。そ 場合によっては異様に長い名前になってし てくると思いますのて、 , フィンローダ流と の中にも , ある程度は慣習的に決まった名 まうことがあります。この名前が , 頻繁に しては②を選択することにしました。 前がありますのて、 , それらが使える範囲に ただ , 場合によっては , ②の短所はもう 使われるものて、あると , かえって名前を読 おいては , ありがちな名前を使っておくの むのに労力を使ってしまうことも考えられ ひとつあります。アンダースコアが比較的 が無難な選択だといえましよう。 入力しにくいキーに割り当てられているキ ます。また , プログラムの見栄えも超高層 ーポードがあることて、す。 ビルが乱立したかのごとくなってしまい , あ スタイル まりおもしろくないかもしれません。 長い関数名について , 本誌 ' 90 年 8 月号の 「恥ずかしながらドジりました」に興味ある 流儀としては , 大きく分けてふたつに分 変数には , 固定した意味が与えられ , プ かれます。ここて、は , 英単語を組み合わせ ことが書かれていたのて , これについて意 ることによって名前をつけることにします。 ログラム , または関数の処理が終わるまて、 見を書いておきたいと思います。手元に 8 月 ① SendMessage その意味を持ち続けるものと , いわゆる使 号をお持ちて、ない方のために , 岩谷氏の主 い捨ての一時的な変数とがあります。一時 このスタイルは , 単語の先頭の文字だけ 張を簡単に説明しておきますと , を大文字にして , 単語をびったりとつけた 的変数としては , 関数の戻り値を取り敢え 「 GU 扱うプログラマは , ものすごく長 ものて、す。 ず入れるとか , ループのカウントに使われ い名前の関数を大量に覚えなければなら ( ② )send message るものがあります。 ない。たとえば , AppJugemJugemuG0k getchar( ) ) ! = EOF) { こちらは , 小文字て、書いた単語をアンダ while ( (c oNoSurikirePaipoPaipo( ) が何をすみゆ ースコアて、くつつけるというものてす。 X 、 Mndow 八ンドブックでみつけた関数 私の経験て、は , ①を好む人が多いような 気がします。理由は , ②のほうが , 名前が 長くなってしまうからて、はないかと思いま す。長い文字をタイプするほうがめんどう 名前さ List XSetWindowBackgroundPixmap(display, window, background—pixmap) : 特集 c プログラミングの秘訣 67
特集℃プログラミンクの秘 語は , C のプログラムて、あっても使わない 界からは当然そんなことは知ったことて、は うわけて、す。 とをおすすめします。 ないのて、す。 ほかに , よく使われる伝統的な意味を持 たとえば , 学校の成績処理プログラムを このような , 自分の世界以外て、使われて つ変数を示しておきましよう。 書きたい人は , 次のような構造体を作りた いる名前というのは , 案外無頓着なものだ int C くなるかもしれません。 し , 実際 , それて、問題になることも極めて 文字を格納する使い捨ての変数て、す。 struct student { 希て、すが , それて、も知識として持っている れを char とする人がよくいますが , 伝統的 名前があれば , 考慮するに越したことはな に int て、す。また , int て、受けないとおかしく int grade int Class , いと思います。 なることもあります ogetc などはマニュアル ただし , これらの関数名を伝統的に使わ int number を見ればわかるように , int の値を戻します れている関数と同じ機能を模倣するために char *name , から , 当然 int て、受けなければなりません。 使う場合は別て、す。かえって変な名前をつ char *S , この構造体の欠点は , class という名前を けるとイメージがわかないからて、す。この 作業用の , 文字列へのポインタとして使 使っていることて、す。将来 C 十十に移植しよ ような場合て、も , printf て、はなく my printf います。 string の頭文字を連想させるためて、 うとした人が , びつくりするかもしれませ という関数名にしておく手があります。 ん。悲惨なことにならないことを祈ります。 C 言語からほかの言語へのプログラムを移植 これらは , 使い捨ての変数として使われ する機会は , 神経質になるほどのものて、は ます。 for て、ループさせる場合のカウンタに ないかもしれませんが , 一応 , C 十十への移 次のリストを見てください。少し C て、プロ よく使われます。これらにかぎらず , 1 文字 植というのは , もっともありそうなことて、 グラムを書いたことのある人が見ると , 「間 の変数は , おもに使い捨ての一時変数とし すから , C 十十の予約語は避けておくのがよ 違っているぞ」と指摘されるかもしれませ て使われるものと思えば , たいてい間違い いて、しよう。 ありません。 ん。 もうひとつの , 使ってはならない名前の void main(int argv, char *argc [ ] ) int n 同にく使 0 、捨、 0 変数て、す , 00000 , を 指針。 ANSI 以外の処理系における慣習的な 関数名は , ほかの用途に使わないほうがい 連想させるのて、 , 個数を意味することが多 いて、しよう。ただ , 私もそうて、すが , 多く いようて、す。 のプログラマは自分のかぎられた世界に閉 long に じこもることが多く , ほかの世界が見えな 使い捨ての変数て、も , 1 は 1 。 ng の変数とし くなってしまうことがしばしばあります。 て使われることが多いようて、す。 しかし , このプログラムは文法的には何 さすがに printf や fopen という名前を , 自分 も間違ってはいないのて、 , コンパイルすれ int len て、定義したまったく別の関数につけること 長さて、す。何の長さかは , 場合によりま ば , 予期したとおりに動作します。間違っ はありません。 す。 long のことがあるかもしれません。 10n ているのは , プログラムて、はなく , main の しかし , UNIX の世界しか知らない人は , g なら llen と書きたくなるところてすが。 引数に argv, argc という順序て名前をつけ findfirst という名前をまったく独自の関数の char buf [ ] るという感性て、す。この種の名前は , 伝統 名前として使ってしまうかもしれないのて、 作業用の文字列を格納するためのバッフ 的に命名されていて , プログラマが勝手に す。なぜなら ,DOS の世界に findfirst という アとして使われます。 buffer の後半分を略し 変えるのは望ましくありません。そういう 関数があるということを知らないからて、す。 意味て、はこのプログラムは確かに間違って たものて、しよう。 何か最初の要素を検索するような関数に いるわけて、す。 char *src , findfirst という名前をつけたくなるのは自然 伝統的に使われる名前は , て、きるだけ先 char *dst ; な発想なのてす。 達に従うのが得策て、す。 src は source, dst は destination を意味して 逆の例てすが , 昔 LHarc を UNIX に移植し argc, argv はそれぞれ関数 main に渡され います。文字列をコピーするような場合に , たとき , link という関数が独自に定義されて る引数て , コマンドラインのパラメータの src から dst に向かってコヒ。ーすることになり いたため , とんてもない目にあった経験が ます。 数と , 各パラメータの文字列へのポインタ ありました olink という関数があることは U を順に格納した配列を意味するのが伝統て FILE *fp , NIX の世界ては常識なのてすが , DOS の世 ファイルポインタとして使われます。 fil すから , 上のように書いたら目茶苦茶とい 65 特集 C プログラミングの秘訣 す。 int i, イ的に使われる名前 while (——argv > 0 ) { puts(*argc 十十 ) ;
特集℃プロクラー こン いや , ②これに対して , い出す。 の秘 まったく想像て、 か空でいえるようになったころは , プロ グラマは老人と化しているだろう」 ということて、す。もちろん , この関数名は 単なる冗談のようて、すが。私にもこれが何 をする関数かまったくわかりません。ただ し , この関数名の 4 文字目以降は , まったく 見たこともないわけて、はありません。つま り , 関数名がまったく無意味て、はなさそう だと見当だけはつきます。ということは , この関数の意味が不明なのは , 名前が長い からて、はなく , 名前から意味が連想て、きな いところにあります。氏の指摘に対して私 が楽観的に考えたのは , そんな長い名前を わざわざ暗記しなくてもプログラムは書け るのて、はないかと思ったからて、す。 つまり , GUI システムに使われている関数 名は確かにやたら長いのて、すが , 名前に関 数の意味が含まれているのて、 , 初めて見た 関数て、あっても , およその意味は連想て、き ます。また , 仮に何か処理をしたくなった が関数名を覚えていない場合は , 手元に置 いてあるマニュアルを見ればいいだけて、す。 このことは , かって NIFTY-Serve て、発言 ことがあります。そのとき , 試しに X Window ハンドブックを適当に工イっと 開いて , ばっと目についた関数を選んて、 , 出てきた関数が List 21 にあげるものて、す。 これはかなり運が悪い部類に属するのて、 はないかと思うのて、すが , 実は私は残念な がら XWindow に関して多少の知識がある のて、 , この関数の内容が理解て、きても当然 なのかもしれませんが , 仮にまったく X W indow に関する知識がないと仮定しても , の関数が , 「ウインドウのバックグラウンド パターンをセットするのて、はないか」と容易 に想像て、きると思います ( 2 ) 。これが xwbp と いう関数名だったら , 本当に覚えないとわ けがわからなくなってしまいます。 もし名前が短かったら , 覚えるのも早い て、しようか。そのためには , ふたつの危険 を乗り越えなければなりません。ひとつは , 名前を短くしようとすればするほど , 省略 しなければならない単語が増え , ばっと見 ただけて、何をする関数かわからなくなる確 68 C MAGAZINE 1 2 4 率が高くなることて、す。たとえば itof という 私が先日書いた関数の処理を , 一目て、想像 て、きる人は百人にひとりもいないて、しよう ( 3 ) 。 省略の仕方によっては , 逆に何だかなかな か思い出せなくなるかもしれません。もう ひとつの危険は , 名前を短くしすぎたため に , 思わぬ所て、衝突してしまうことて、す。 自信がなければローマ字で 処理系に依存して , 特別な意味を持った 名前が使われていることがあります。この ような名前はあらかじめ確認しておき , う っかりほかの意味に使わないようにします。 名前は英語て、ある必要はありませんが , 英語て、書いて理解て、きればもっとも効率的 だと思います。ただし , 英語の綴りを間違 えるのは , プログラムの動作に差し支えな いとはいえ , かなり恥ずかしいものて、すか ら , あまり自信がなければ , まだローマ字 のほうがましだと思います。 アンダースコアて、始まる名前は , 特別な 意味を持っことがあるのて、 , 通常は使わな いほうが安全て、す。 [ 注 ] ( 1 ) ところが今て、もあるらしい。メモリが あればあるだけごちやごちゃとソフトを 常駐させ , その上て、巨大なコンパイラを 走らせるからて、ある。 某雑誌のパロ ディ版に載っていた超高機能工デイタ ( 機 能が多すぎるためにメモリを食いつくし , 1 頁の文章しか編集て、きない ) の記事を思 [ 参考文献 ] [ 1 ] 『プログラミング言語 C ( 第 1 版 ) 』 , B. W. カーニハン / D. M. リッチー著 , 石 田晴久訳 , 共立出版 , 1981 [ 2 ] 「プログラミング言語 C 第 2 版』 , B. W. カーニハン / D. M. リッチー著 , 石田晴 久訳 , 共立出版 , 1989 [ 3 ] 『詳説 C 言語 : H & S リファレンス』 , サミュエル・ P ・ハービソン / ガイ・ L ・ スティール共著 , 斎藤信男監訳 , ソフ というプログラマがいた きなかった ! らコメントしてくれと書いたが , 誰もコ メントをくれなかったのは , 想像て、きな かったというより , 私の説があまりに陳 腐なのて、無視されてしまったのて、はない かと思われる。なお , 岩谷氏の指摘は , 長い関数が覚えられないのて、困るといっ ているのて、はなく , むしろ各種雑多な GU I システムに対し , 同じような処理をする ための関数名がすべて異なっており互換 性も保たれていないことを間題にしてい るのて、あって , 早い話が私の意見はいい がかりて、ある。にもかかわらずそれを書 いたのは , 氏のいうところの , 「ものすご く長い名前」という表現に対しては , 何か 書いておかなければいけないような強迫 観念を感じたからて、ある。 ちなみに , 同発言の私の主張は , 「丸暗 記の技術は過去の遺物にし , 小学校から カンニングの方法をちゃんと授業て、教え , 迅速な検索能力を取得した人材を育てて ほしい , そうすれば , 適当なイマジネー ションのあるプログラマなら , ものすご く長い名前の関数をちゃんと覚える必要 はまったくない」という無茶苦茶なものだ った。これて、はコメントがないのも当た り前か。 ( 3 ) 「イスカンダルのトーフ屋」の主処理を 行う関数。て、も , 最近はこのゲームを知 らない人がいるそうなのて、 , 話が通じな いのて、ある。 トバンク , 1989 [ 4 ] 『 BORLANDC 十十マニュアル』 , B orland lnternational 著 , ポーランド [ 5 ] 『別冊インターフみース実践ソフト ウェア作法』 , CQ 出版社 , 1988 [ 6 ] 「 C プログラム正書法」 , 近野重夫 , 「イ ンターフェース』 , 1990 年 5 月号 174 ー 20 [ 7 ] fThe C Users Journal Japan 』 , N 0. 7 , ビレッシセンター [ 8 ] NIFTY-Serve, C 言語フォーラム (F C) 電子会議 3 頁
C あ磁 り返しますと , 上記の① ~ ⑤は , 「宣言が定 のバグは , 上記の③と関係しています。繰 rlandC 十十が見逃さなかったソースコード そうすると , Turbo C 十十が見逃し , Bo ⑤その宣言が typedef 宣言であるとき き ④その宣言がクラス名の宣言であると データメンバの宣言であるとき ③その宣言がクラス宣言の中の static な 体でもないとき ていて , イニシャライザでも関数本 ②その宣言に extern という指定子力寸い 記述なしで宣言しているとき ①その宣言が関数を , 関数本体の明細 ある。 の各場合を除いては , 同時に定義でも プログラムに導入する。宣言は , 以下 宣言は , ーっまたはそれ以上の名前を レンジ ] 。 れています [ 以下 ARM の文を岩谷が若干ア e ManuaI) の 3 章 1 節は「宣言と定義」と題さ ARM (The Annotated C 十十 Referenc ことを踏まえて以下を読んてください す。今 , 話題はたまたま C 十十てすが , この は C に対しても妥当 , と考えることがてきま ら , C 十十のリファレンスマニュアルの一部 C は C 十十のサプセット ( 部分集合 ) て、すか C 十十は C のスーパーセット , だから逆に 義て、はないケース」てす。 ては , 定義とは何か [ 以下は ARM の 7. 1.1 の一部 ] 。 136 C MAGAZINE 1 2 4 ARM 3.1 によれば , Fig. 1 のようなもの 体 ) が生じていません。 に , 物理的な実体 ( すなわちメモリという肉 て登録するだけて、す。宣言て、は , まだ名前 ある名前をプログラムが使用する名前とし 宣言は , 上の引用文て、お分かりのように パイラに起こさせます。これと対照的に リ確保という , 物理的なアクションをコン すなわち定義は , その名前のためのメモ 適切な初期化が行なえるようにする。 定義は , 適切な量のメモリを確保させ , が定義だそうて、す。そして ,Fig. 2 のような ものは宣言だそうて、す。 クラスの static メンバの 論理的な意味 以下 , ARM には約 80K バイトの大きさの 正誤表があるそうてすし , 私はそれをまだ という前提て、読んてください 見ていない [ 以下は ARM 9.4 「 static メンバ」からの部 分引用 ] 。 クラスのデータメンバまたは関数メン バは , クラスの宣言の中で static と宣言 できる ostatic なデータメンバは実体が ーっしかなく , プログラム中のそのク ラスのすべてのオプジェクトが共有す る。グロー / ヾルなクラスの static メンバ は , 外部リンケージを持つ。クラス宣 言の中の static なデータメンバの宣言 は , 定義ではない。定義は , 別途必要 である。 ローカルなクラスの static メンバにはリ ンケージがなく , クラス宣言の外では 定義できない。したがって , ローカル なクラスは static なデータメンバを持て static なメンバ mem は , クラス cl のオプ ジェクトが一つも作られていなくても 存在する。 static なメンバは , それらを ( ファイル スコープ内で ) 初期化できる点を除いて は , 通常のクラスメンバのアクセス規 則に従う。 そろそろ , 読者各位の頭の中も , 私同 様 , ? ? ? してきたのて、はないてしようか。 上の , 「・・・・・・定義は , 別途必要てある」まて はまあよいて、しよう onantoka. h の中てく日 常言語の意味て、 > 定義〃するクラス ( C / C 十十語としては旦するクラス ) は , グ ローバルなクラスてす。 ところが , ローカルなクラスは , ローカ ル変数と似ていて , 関数定義の中て、宣言す るのてす。だから実体がすべてスタック上 に一時的に作られるのて、 , static なメンバを と言っているのて、しよう。嘘や 持てない , それは宣言やから , なんも実体はて、け へんはずやー C てプログラミングするとき , ある関数の 中のデータて、 , 複数回のコールに亙ってず っと存在してほしいもの ( その値の変化など を利用したいもの ) は , static と宣言しま す。そのデータは , 残念ながら関数スコー プにはならず , ふつうの static と同じファイ ルスコープにしかなりませんが , とにかく , auto 変数のようにコールのたびに新たにス タック上に作られるのて、はなく , プログラ ムの全寿命と等しい寿命を持ち , 値やその 変化を維持します。そういうデータの , い ちばん分かりやすい例は , 、、その関数がコー ルされた回数をカウントするカウンタ変数〃 て、す。 ローカルなクラスの , 宣言て、はなくて , 定義に関してはどうなるのて、しようね。 いずれにしても , グローバルなクラスの 場合と同じ意味合いの static を認めたってと くに問題ないし , 処理系に大きな負担には ならないのて、は , と思いますがね。 そして , そのローカルなクラスが , 別の グローノヾルなクラスを基本クラス ( べースク ラス ) としていて , 後者に static なメンバが あったときは , それに対して , どんな規則 が適用されるのて、しようか ( まあ常識的な勘 て、は , その static はサポートされると思いま すが , とにかく具体的な処理系を動かして みんと分からんて、す。今は , その暇なし ) 。 「 static なメンノヾ mem は , クラス cl のオプ ジェクトが一つも作られていなくても存在 する」というくだりも , プログラムの問題ド メインのタイプによっては , 面倒を引き起 こしそうて、す。 現実世界には , 複数の同種オプジェクト が共有する唯一の何かが , しかし , オプジ ェクトの存在以前にそれだけが存在してい ることは , 論理的に , または現実的に , お というものが多くあ かしい・ありえない
3 変数 、一 SECTION 使い方が 制限される名前 的な制限 ・関数のネーミング法 最後に , 名前のつけ方について考えてみ ます。名前というのは , 具体的には変数名 , 関数名などて、す。 まず , つまらない条件からチェックして おきますと , C 言語の仕様により予約されて いる名前は自由に使うことがて、きません。 これらは用途が決まっているのて、 , プログ ラマが勝手に使うことはて、きません。もち ろん , それを無視するとコンパイルする時 点て、多分工ラーになるのて、 , 予約語は変数 名に使えないということさえ頭に入れてお けば , うつかりしても , たいへんな混乱に 至ることは希だと思います。 また , コンパイラやリンカなどの処理系 の制限によって , 一定の長さ以内にしなけ ればならないこともあります。 長さといっても , 最近の処理系だと , 実 用的に十分な長さの名前を自由につけるこ とがて、きるのて、 , ほとんど気にしなくても まず問題ないて、しよう。 かっての BASIC のように , 先頭の 2 文字し か判別に使われない言語があって , a01 と a 02 が同じ変数とされてしまうのて、難儀した といったような苦労は , すて、に昔話として 語り継がれているにすぎません。昔話をも うひとっしておくと , 昔は , 変数名が短い ほうがメモリやディスクの使用量が少なく て済む , といった苦労もありました。 C 言語は基本的にコンパイラの環境が提供 されているため , 変数名とメモリは直接関 係ないように思えるかもしれませんが , メ モリが 64K バイトもあれば大容量といってい た時代には , 変数が長すぎるとコンパイル 64 C MAGAZINE 1992 4 の途中て、メモリが足りなくなってしまった り , ソースファイルが長くなるためにディ スクの空き容量が不足してコンパイルに失 敗するという , 今て、は想像もて、きない世界 があったのて、す ( 1 ) 。 取り敢えず , もはやコンパイル時にメモ リを気にする時代は終わったと考えておく 話がそれますが , 実行形式のプログラム が消費するメモリ量は , ますます少なくな ることを要求されています。 今後はパソコン上て、マルチタスクの環境 を実現する方向へ世界が向かっているから て、す。個々のプログラムが小さくても , プ ログラムを 10 個同時に走らせようとすると , 10 倍のメモリが必要になるかもしれません。 640K バイトのメモリが必要なソフトを 10 個同時に実行するには , 単純に考えても約 6M バイトのメモリが必要て、す。もちろん , 実際は , あの手この手のメモリ管理を行う ため , 共有て、きるコードを共有したり , メ モリが足りなくなったとき , あまりアクセ スされない領域を一時的にディスクに待避 するなどして , 何とか少ないメモリをやり くりするのて、す。 それぞれのプログラムがメモリの使い方 に無頓着かどうかて、 , 全体の使い勝手に多 かれ少なかれ影響することは間違いないて、 という話は今回は全然関係ないのて、 , 取 り敢えず , 変数名 , 関数名の話に戻ります。 Fig. 2 C 言語の予約語 auto defa ult float 「 egister struct volatile break do fo 「 etu rn switch while case double goto short typedef Char else signed umon まず , 予約語 ( Fig. 2 ) は自由な用途には使 えないということを書きました。これはひ とまず問題ないて、しよう。 次に問題になるのは , 予約語て、はないの だが , 自由に使うのは避けたほうがいい名 前て、す。たとえば , C 言語には標準的な関数 がいくつか決まっています。これらと同じ 名前の変数名を使うことは可能て、す。しか し , それは混乱を生むだけて、何のメリット もありません。とくに , ANSI て、定義されて いる関数の名前は , それ以外の用途に使う ことは避けるべきて、す。 たとえば printf や fopen という変数名を使 ってはいけません。後て、プログラムを読む 人が混乱するかもしれないからて、す。また , 自分て勝手に定義した関数に printf という名 前をつけるのは感心しません。もちろん , それが一般的な printf を模倣するための処理 て、あるなら , 話は別て、すが。 さらに次のアドバイスは必須というほど て、はなく , おすすめ程度のニュアンスて、考 えてほしいのて、すが , 原則としてほかの言 語の予約語は , てきるかぎり使わないほう がよいと思います。とくに , C 言語に非常に 近い言語として , C 十十というものがありま す。 C 十十には , C 言語て、は予約語とされて いないいくっかの語が , 新たな予約語とし 予約された名前 VOid static long exte rn continue て追加されています。とくにこれらの予約 unsigned sizeof i nt enum const
級な論理を使うときも , それの真理関数的 な含意を素早く正しくチェックて、きる機能 は , しばしば役に立ちます。プログラマと してのあなたは , このスクラッチパッドを , 複雑な論理式や , デシジョンテープルや , 指定などのチェックに使えるて、しよう。 このスクラッチパッドプログラムは , 偉 大なる論理学者へのささやかな敬意のしる しとして QUINE と命名され , パプリックド メインて、入手て、きます。実行バージョンと 完全なソースコードは , COMPUTER LA NGUAGE のプレテンポードサービス , また は , CompuServe の CLMFORUM の LIBI か ら得られます 0QUINE は Pascal-C 、書かれて おり , MS-DOS システムの上て、ランしま す。それは , EGA または VGA モニタを必要 とします ( この不幸な制約は , 非標準の文字 セットを使っているためて、す ) 。 コードの大部分は ( 基本的な評価マシンも 含めて ) , 標準的な PascaI て、書いています。 機械依存とオペレーティングシステム依存 の部分のみ , Turbo PascaI の非標準的な機 能を使っています。他のシステムへの移植 は , 簡単て、はないとはいえ可能て、す。現在 のバージョンは , 実は私が最初にこのプロ グラムを開発した DigitaI の PRO 350 から移 1 2 3 4 5 6 植したものて、す。 殊文字 ( ギリシア文字と連結記号 ) は , 工ス 式を評価するためには , そのためのファ [ 参考文献 ] ケープシーケンスという方法て、入力します。 ンクションキーを , 当の式の行にカーソル マイナス記号を二つ続けると , コメントの がある状態て、押します。押したキーの種類 [ 1 ] Quine, W. V. O. Method of Logic. 開始という意味て、す。コメントは行末まて、 に応じて , V, C, または N の文字が評価フ Reinhart and Winston, 1961. て、す。 ィールドに出ます。クエスチョンマークが [ 2 ] Strawson, P. F. lntroduction to Lo 行のデータ部分に式を入力したら , カー 出たら , 何かのエラーて、す。このスクラッ gic Theory. Methuen and Co. , 1952. チパッドの内容は , いって、もプリントした [ 3 ] ソルがその行にあるままて、ファンクション Knuth D. E. The Art of Computer キーを押すと , その式に名前 ( 1 文字のギリ り , 指定のファイルにセープて、き , セープ Programming, V01 1 : Fundamen シア文字 ) が付きます。この文字は , 名前の したものを後て、また取り出すこともて、きま ta 1 Algorithms. Addison-Wesley, フィールドに現れます。もうーっ別のキー す。 1968. を押すと , その式の評価 , または別の式の スクラッチパッド 部品として使うことを指定します。式がシ の使い方 ンタクス的に正しければ , 指定フィールド にコロン ( : ) が現れ , 正しくなければクエ スチョンマーク ( ? ) が出ます。 List 5 = T Node : Scratch (Left) Reduce—I mp 1 0 朝 00 り 00 3 00 00 00 00 っ 0 3 00 3 4 4 4 4 4 4 4 4 4 -0 -0 -0 【 0 -0 END ELSE BEGIN New (q { , Operator)) WITH qA DO BEGIN N_Type N_Operator N_Left_L i nk END ・ Reduce—Impl Operator = 0p_Not ・ = Left ・ N_Right—Link ・ = NIL ・ END ELSE BEGI N New (q { , 0perator)) WITH qA DO BEGIN Operator ・ N_Type = Op-Impl ・ N_Operator N_Left_Link = Left ・ N—Right—Link ・ = Right ・ END ・ Reduce—I 叩 1 END ・ Fig. 2 画面の各行には 4 個のフィールドがある 評価フィールドⅣ = 妥当 , C = 矛盾 , N = 無矛盾 ) スペース 名前フィード ( 式の名前・・・ 1 文字のギリシア文字 ) 指定フィールド ( この式か指定されたらコロンが表示される ) スペース 80 Gianfranco Boggi0-Togna 氏は , 20 年以上 のソフトウェア開発の経験を持つコンサル タントです。彼はイタリアのミラノで仕事 このスクラッチパッドは , 真理関数論理 をしています。 を学ぶための良いツールて、すし , もっと高 真理関数論理のためのスクラッチバッド 29
Scratchpad for Turth-FunctionaILogic 載っています ) 。式を逆ポーランド記法に直 した後 , その逆ポーランド文字列を後ろか ら前へスキャンする再帰的な手続きによっ てツリーを構築し , ツリーのノードのアロ ケートとリンクをしていきます。 スクラッチパッド この方法て、 , 基本的な妥当性チェックマ シンが完成します。これに簡単なドライバ をくつつければ , 式をユーザから受け取っ て , VaIid ( 妥当 ) , Contradictory ( 矛盾 ) , または Noncontradictory ( 無矛盾 ) と答える プログラムを作れます。またこのマシンは , 式のチェックを必要とするどんなプログラ ムにて、も , 組み込めます。 て、も , 一度に一つの式しか処理て、きない のは , やや不便てす。同時に複数の式を扱 い , それらに名前を付け , 必要に応じて呼 び出したり組み合わせたりしたいものて、す。 そこて、私は , 基本のマシンの外側に 一層の手続きと関数を実装しました。その 層の中に , 最大て、 25 個の式を保持て、き , そ れぞれを名前て、識別て、き ( ーっの 8 ビット文 字 ) , 式の追加や削除 , そしてもちろん評価 を , 名前を指定して行なえます。 最後に , マシンへのアクセスを容易にす るために , 私はユーザインタフェイスを担 当するルーチン群を追加し , スクラッチパ ッド〔、、落書き板クとて、も訳すべきか・・ を実装しました。このスクラッチパッドは たまたま , ビデオ画面の 25 行にびったり収 まります。このサイズて、 , 実用目的にとっ ては十分て、すし , ウインドウを作るとかな んとかという面倒も避けられます。 Fig. 2 に示すように , 1 行が 4 個のフィール ドに分かれます。最初の 3 つのフィールド は , それぞれ 1 文字のフィールドて、 , プログ ラムが管理します。そしてその行のデータ 部分が , 実際のスクラッチパッドを形成し ます。データ部分は , ふつうのエデイタの ように文字列の入力や変更がて、きます。特 List 3 Reduce ・ = Reduce_ImpI Reduce ・ = Reduce_Equiv ・ 0 、り 0 ^ 0 4 -0 5 - -0 に 0 - -0 5 - -0 0p_Impl ・ Op_Equiv: END ・ END ・ END ・ Reduce が作るツリーを破壊する Sc 「 atch 手続き 1 2 : ツリーを消す 3 : 4 : 5 : 6 : ' p' をルートとする ( サブ ) ツリーからすべての演算子ノードを削除する 7 : 9 : 10 : 11 : PROCEDURE Scratch (VAR p: Pointer) ・ 13 : BEGIN IF p く〉 NIL THEN 14 : WITH DO IF N_Type = 0perator THEN 16 : BEGIN Scratch (N-Left—Link) ・ Scratch (N—Right—Link) Dispose (P { , Operator)) 20 : = NIL : 21 : END ・ 22 : 23 : END ・ List 4 条件式を処理する関数の例 2 : 含意を還元 ( 単純化 ) する 3 : 4 : 5 : 6 : 7 : PUNCTION Reduce_Impl : Pointer ・ 8 : 9 : BEGIN IF (LeftA. N—Type = Truth-VaIue) AND (RightA. N—Type = Truth—Value) THEN IF f . N—Truth_Value AND (NOT RightA. N—Truth—Value) THEN 11 : Reduce—Impl = F_Node ELSE Reduce— I mp 1 = T_Node 14 : ELSE IF ft ・ . N_Type = Truth_VaIue THEN 16 : IP ft ・ . N_Truth_Value THEN 17 : Reduce—ImpI ・ = Right ELSE 20 : BEGIN Reduce—Impl 22 : END 23 : 24 : 25 : 26 : List 5 = T_Node : Scratch (Right) ELSE IF Right ・ . N_Type = Truth—Value THEN IF RightA. N—Truth—VaIue THEN BEGI N 28 C MAGAZINE 1992 4
マイ 5Q ノフト lnformation from C0mpiler Makers MS-C Ver. 6.0 MS-BASIC 7.1 MS-FORTRAN 5.1 MASM 6.0 初心者はそのような簡単なことか ミックスドランゲージのサポート マイクロソフト言語製品固有鐙様に ら始めるとよいてしよう。 の範囲としては TabIe 1 の製品に ついての十分な知識 制限されます。 ・関数とプロシージャの知識 各言語の一般的な仕様以外に実 ミックスドランゲージとは ミックスドランゲージを 際のインプリメンテーションて、決 行うための知識 ミックスドランゲージは , 他言 定される仕様があります。また , ミックスドランゲージとは , 複 語の関数またはプロシージャを呼 マイクロソフトが拡張した仕様と , マイクロソフトの旨は 数のコンパイラ言語を使用してひ ーコロロ、ツ び出すことにより行います。これ 使用している OS や CPU に依存して クスドランゲージを簡単に行える とつのアプリケーションを作成す らの関数 , プロシージャは言語に 決定される仕様もあります。たと ようになっています。しかし , ることをいいます。アセンプラは より名称が異なります (TabIe 2 ) 。 えば , far や near ポインタについ こていう簡単にというのは , 知識 コンパイラ言語てはありませんが , て , 各メモリモデルの相違とメモ がなくてもてきるという意味ては 言語のひとっとして考えます。 ・言語による規約 リ配置などがあります。各製品に ありません。十分に知識のある人 ミックスドランゲージを行える 添付されているスタートアップル にとっては楽に記述て、きるように 最小の単位は , 関数またはプロシ 各言語には , 関数やプロシージ ーチンのソースは , 必ずお読みに なっているという意味てす。 ージャ単位てす。ある言語のプロ ヤを呼ぶための独自の規約があり なって理解しておく必要がありま ミックスドランゲージを行うた グラムの中から , 別の言語て、記述 ます。ミックスドランゲージを行 す。 めに必要な知識には次のようなも された関数またはプロシージャを うためには , 各言語の規約とその のがあります。 呼ぶことがてきるということてす。 相違をよく理解しなければなりま ・アセンプラの知識 こ , ミックスドランゲージを 使用する各言語の仕様に せん。規約には , 名前付け規約 , 行うためには , 各言語ごとに別の ついての十分な知識 呼び出し規約 , 引数の受け渡し規 ミックスドランゲージは , 各コ ファイルにプログラムを作成し , 約の 3 種類があります。 ンパイラが生成したオプジェクト 使用する各言語のプログラミン それぞれを個別にコンパイルしま 名前付け規約 をリンクすることにより行われま グ手法について十分な知識が必要 す。つまり , 複数の言語をひとっ コンパイラは関数やプロシーシ す。したがって , ミックスドラン なことはいうまてもありません。 のソースファイルに記述すること ャに , あるシンポルをつけてオプ ゲージの仕組や原理を理解するた さらに , 各言語て、の詳細な仕様に はて、きません。 ジェクトを生成します。このシン めには , コンパイラがどのような ついての知識も必要てす。たとえ ポルは関数名またはプロシージャ オプジェクト ( アセンプラソース ) ば , C 言語の場合 , short は 2 バイト 対応製品 名から作られますが , このときの を生成するかを理解しなければな の符号付整数 , long は 4 バイトの符 規約を名前付け規約といいます。 りません。そのためには , どうし 号付整数てあること , 文字列を \ 0 マイクロソフトの言語は , バー この規約は言語により異なってい てもアセンプラとリンカ , ライプ 文字を終端文字とする可変長て扱 ジョンを問わずオプジェクトレベ ます。呼び出し側と呼ばれる側が ラリアンの知識が必要となります。 うこと , 関数のパラメータはすべ ルての基本的な互換性があります。 正しく同じシンポルになっていな ただし , 単純にいくつかの変数 て call by value< 行われること , しかし , デバッグ情報やライプラ いと , リンク時に未定義シンポル を他言語のルーチンに引き渡し , ローカル変数はスタック上に割り リの整合性を考えると , いろいろ のエラーが発生したり , 呼び出そ その結果を受け取ることは , 前記 付けられることなどの知識てす。 な制限があります。したがって , うとしたルーチンてないものを呼 のような知識がなくてもてきます。 ミックスドランゲージをサポートする製品 TabIe 1 語 TabIe 2 各言語の関数とプロシージャ 戻り値あり 値なし void 型関数 関数 SUB プロシージャ FUNC 引 ON プロシージャ BASIC 副プログラム 関数副プログラム FORTRAN SUBROUTINE FUNCTION プロシージャ プロシージャ MASM ミックスドランケージ MS-C 6.0 BASIC 注 ) MS-BASIC 7.1 MS-FORTRAN 5.1 FORTRAN アセンプラ MASM 6 ℃ ・メインプログラムは , 必ず BAS ℃でなければならない ・ BAS ℃でサポートしているハードウェアの資源は , BAS ℃ですべて管理しているので 他言語から操作してはならない 156 C MAGAZINE 1 2 4 圭五 注 )
r 叩機能やいくっかの統合能力さえをも提供 ト指向機能や能力を持った製品を市場に提 ことをいっているのですが。 供しています。そして 2 年後には , 現在 OM し , アプリケーション中て、情報を統合して Crow 確かに , オプジェクト指向データベ G ( オプジェクトマネージメントグループ ) と います。しかし , それは依然ファイルシス ースについて考えるなら , Se Ⅳ ioLogic 社の ともに進めている作業に基づいた製品が爆 テムに基づいており , ファイルシステムに 製品はよい例て、すし ,ObjectDesigns も優れ 付随する大きな限界があります。これは , 発的勢いて、市場に登場するものと予測して たオプジェクト指向データベースて、す。ま います。我々と OMG は共同て、それら製品の ファイルシステムがまったく同じタイプの た最近 , 当社のミニコンヒ。ュータファミリ 機能性レベルを統一し , 標準化することに 情報 , すなわちファイル名を使って , デー ーて、ある UNIX ファミリーに ,OpenDB シリ ーズを登場させました。まあ , これは少し も実際に着手しました。しかし , 今日 , Ne タのロケーションを管理し , 表現すること wWave と同等のものはまったく存在しませ からくるものて、す。ファイル名とは , その 話が違いますが。この場合 , 管理している 情報のディスク上のアドレスて、あり , ュー 情報は , データベースレコードとフィール ん。 ザがそれを識別て、きる ID て、もあるわけて、 ドなどによる , 細分性要素と非常に密接に 変わったことといえば ,NewWave 開発中 関連しています。これまて、にお話したオプ に基本的なオプジェクトマネージメントを す。このため基本サプシステムが , システ ジェクト指向データベースの主流は , たい ム内の情報ロケーションを切れ目なく管理 中心にした多くの機能が追加されたことて、 へんわかりやすい , うまく構築されたオプ す。追加された NewWave の機能を利用する したり , 複数の部分からなる複合ドキュメ ジェクト指向のアプローチを実行しており , と , 変更していないアプリケーションの操 ントを簡単にコピーするのは困難になりま しかもユーザにも大きなメリットが生まれ 作をサポートて、きるのが特徴て、す。もちろ ます。これらが究極的にひとつのファイル ん , New ve 用アプリケーションには変更 システム上に常駐するということは , もは や特別なプログラミングは必要ないかもし やそこて、は SQLi•—タベースの問題にすぎ れませんが・・・ ず , 究極的には基本ファイルシステムの最 現在市場に流通しているプログラムの 上部に常駐することになるかもしれません。 いくつかは , 完全なオプジェクト指向では 私がここて、お話したかったのは , ューザ ないかもしれないが , オプジェクト指向の がドキュメント , スプレッドシート , その 要素があるといわれました。完全なオプジ ほか同じタイプの情報を管理しているとい ェクト指向ソフトウェアであるためには , う点て、 , デスクトップやそれに近いユーザ なにか基本的な特徴やフレームワークが必 環境をとおして行われるオプジェクトマネ す。なぜなら , ディスク上のロケーション 要なのでしようか ? つまり , セールスト ージメントの一般分野についてなのて、す。 ークとしてだけに「オプジェクト指向」と へ割り当てたり , アドレスを要求される情 報は , ユーザが名前をつけるのに使う情報 では , そのようなタイプのソフトウェ 銘打っている製品と , 本物のオプジェクト と同じものだからて、す。 アは Apple 社の HyperTalk 以上のレベルなの 指向製品を区別するには , どうすればよい したがって , ューザがこの名前を変更し でしようか ? のでしようか ? Crow 私は Macintosh の詳しい構造はあま ようとすると , アドレスとして使用するた Crow そうて、すね・・ この場合 , 青い鳥 り知りませんが , Macintosh の基本的な環境 めにその情報を記憶するほかのサプシステ を探すように , オプジェクト指向を求める て、も , やはりューザのレベルてはドキュメ ムとの間に問題が起きてしまうのて、す。 Ne のはちょっと危険じゃないかと思います。 ントに与えるタイトルはファイル名て、あり , オプジェクト指向は数多くの方法て、応用て、 wWave のオプジェクトマネージャは , この したがって , アドレスを与えるときに使わ きるインプリメンテーション技術て、す。も ようなファイルシステムに対する抽象レベ れます。このため , Macintosh て、は同じ名前 し , オプジェクト指向的にユーザの情報を ルを提供することがて、きます。 のふたつのドキュメントを同じフォルダ中 管理するという意味て、オプジェクトマネ では , あなたがファイルシステムとフ に置けないのて、す。なぜなら , ふたつの同 ジメントの分野に焦点を当てるのて、あるな ァイルシステムの依存性とおっしやる場合 , じアドレスが衝突するからて、す。メモリア ら , 既存のほかのシステムと異なる NewW それはデータベース機能や能力に大きく依 存しているオプジェクト指向プログラムを ドレスとユーザの ID との間にこのような関 ave の特徴は , NewWave が通常のファイル 係があるため , 本当に限定している要因が 指しているのでしようか ? たとえば , Se システム以上の抽象レベルを提供するとい わかったのて、す。複合ドキュメントをコビ 「 vi 。 Logic 社のオプジェクト指向データベー うことて、しよう。 スアプリケーションソフトウェアのような ーするにはたくさんの断片をコヒ。ーしなく ほかの多くのシステムて、は , drag-and-d 巻頭インタビュー 13