定義 - みる会図書館


検索対象: 月刊 C MAGAZINE 1992年5月号
56件見つかりました。

1. 月刊 C MAGAZINE 1992年5月号

0 David M. BuIman and Erin Kathleen Bulman/ 岩谷宏訳 (COMPUTER LANGUAGE, Jan. 1992 ) 4 け引 5 & 催 5 腿 LANGUAGE もの , オプジェクト , 工ンティティ , 知識 實ー羆碧、①①①も羆賴賴①、題羆 K 羆① w 碧① 提携冒事 00P を正しく理解するために言葉の意味を勉強しよう いずれも同じ意味を持ち , 意味の違いが曖 データ型 , ステート , 属性 , インスタンス , Lewis Carrol( ルイス・キャロル ) の Thr 昧なことて、す。ある , 常用英語 ( = 非技術系 ) インスタンス変数 , メンバ変数 , スロット , ough the L00king Glass ( 鏡の国のアリス ) の大辞典は , こんなふうて、す。 データ構造 , 関係 , 概念 , 情報隠蔽 , カプ の中に , 白のナイトとアリスとの間の , 奇 、、 thing" の定義に "entity" と、、 object ″を使 セル化等々・・ しかも , 私たちの言葉の 妙な会話があります。 使い方は往々にして , 白のナイトみたいに 「その歌の名前は Haddock ' s Eyes と呼ばれ っている object" の定義に、、 something" と•thing 厳密て、はありません。 ているんだ」 を使っている さらに , これらの言葉の一部は , それが 「あら , それがその歌の名前なのね ? 」 ・•entity" の定義に、、 something" と、、 object" 問題の領域のものごとを指す場合と , 解の 「ちがう。分かってないね・・・・・・。名前が , そ を使っている 領域のものごとを指す場合という , 両方の う感呼ばれている〃だけなんだ。ほんとうの something" の定義にを使ってい 使われ方があります。そしてまた , 同じく 名前は , The Aged Aged Man なのさ」 OOP の部門て、は , 初心者たちは , メソッ 「じゃあ , さっき私 , 「その、、歌″が Haddock ' る 本稿て、は , オプジェクト指向のソフトウ ド , 関数 , 操作・演算 (operations) , サービ sEyes と呼ばれているのね ? 』と言うべき ェアについて議論するために有益な , 言葉 ス , メッセージ渡しといった言葉を学び , だったわ」 の定義を幾つか提供したいと思います。ま さらにこれらの一部が同義語て、あることも 「いいや , 違うね。歌はまた , 別のものさ。 ず , 分析と設計とプログラミングの間にあ あるということも学ばなければなりません。 、、歌″はね , Ways and Means と呼ばれてい る違いについて , ざっと見てみましよう。 むろん , これらの言葉の多くが日常の英 るんだ。しかしね , それはただ , そう、、呼ば 語としての意味を持ち , そしてまたその多 れている″だけなのさ ! 」 くが , OOP 関連の新しい意味を付与される 「じゃあ , その歌は何ていうの ? 」 前から , ソフトウェア開発の専門語として 「それを言おうとしてたんだ。その歌は , ほ オプジェクト指向の分析て、は , 要件モデ の別の意味を持っています。「オプジェクト」 んとうは A-sitting on a Gate なのさ」 という言葉を , 相手は「クラス」という意味 ルというものを構築して , その中て、 , 工ン ( 訳 : 岩谷 ) て、使っているのだ , という点さえ片方が分 ティティの存在と振る舞い , 工ンティティ オプジェクト指向のソフトウェアデベロ かれば消滅してしまうような議論〔オプジ のタイプ , 関係 , そして関係のタイプを明 ッパは , アリスを手こずらせた白のナイト ェクトという言葉に付与している意味が互 らかにします。また , これらのもの・こと のような言葉遣いをすることがあります。 に影響を与える , ューザ側の世界て、起きる いに異なっている立場からの議論〕を , 私 私たちは , 実にさまざまな言葉を使います。 たちは聞いたり読んだりしてきました。 イベントも明らかにします。さらに , 工ン オプジェクト , オプジェクトのタイプ , ク ティティがとりうるステートの種類と , そ 最も厄介な間題の一つは , 英語て、は , も ラス , もの (things, ものごと ) , 工ンティテ れらステート間にありうる遷移も , 明らか の (thing) , オプジェクト , 工ンティティが イ , 工ンティティのタイプ , 抽象化 , 抽象 日と解 もの , オプジェクト , 工ンティティ , 知識 25

2. 月刊 C MAGAZINE 1992年5月号

ミングすべきて、はないて、しようか。 J ぐのフ 記窄法の概略 Fig. 2 日本語識別子の例 List 3 の【例 1 : 定義文】に定義文を示し 定義文 BNF 記法て、 Fig. 1 に示します。 文書プログラムの記述方法の概略を拡張 ムを織り込むようになります。 が , JCS ては反対にコメントの中にプログラ どて、はプログラム中にコメントを入れます 文章部分のことをいいます。通常 , C 言語な 空文とはドキュメントの部分 , すなわち , のほかに , 表題や展開式などがあります。 展開文 , 追加文および空文と呼びます。そ 分から構成されています。それらを定義文 , 文書プログラムは大きく分けて四つの部 文書プログラムの記述方法 詳細はマニュアルを参照ください List 3 に示します。コマンドの使用方法など ムと呼びます。説明用の例題プログラムを ログラムが一体化したものを文書プログラ (JCL) があります。以後 , ドキュメントとプ プログラムを通常の C 言語へ変換する機能 を抽出する機能 (JCS) と日本語 C て、書かれた JJ にはドキュメントからプログラム部分 やすくなります。 JIS て、定めた漢字などは約 8 , 000 字もあり , これらを駆使してプログラ 以上の機能のほかに , ヘッダ文を作る機 ます。 定義文とはプログラムを実際に記載する ところて、 , 置かれた順番にファイルが作ら れます。【例 1 】のように文といっても何行 て、もかまいません。定義文の表題は「データ の定義」としています。 定義文の中身は , 単に使用するインクル ードファイルを設定しているだけて、 , 「※※」 が定義文の終了を表しています。 追加文 List 3 の【例 2 : 追加文】に追加文を示し ます。 追加文は先の定義文にプログラムを追加 するときに使います。定義文と追加文の違 いは「※ > 」の後に「 = 」がくるか , 「 + 」がく るかだけて、す。この例て、は enum 型の変数と 共用体を追加定義しています。 なお , 表題は定義文のものと同じて、なけ ればなりません。 展開式 List 3 の【例 3 : 展開式】はメインプログ ラムて、す。この中て、 , 、、※く CPU の型などを 取得する※ > クなどの部分を展開式と呼び , そこに後て、説明する展開文が挿入されます。 展開式ー展開文の対応は C 言語のマクロとほ ば同じ機能て、す。しかし , C 言語て、は #defin e の前にマクロ名が出てくるとコンノヾイルエ ラーになりますが , 展開式 ( マクロて、はマク ロ名にあたる ) が先て、もかまいません。 追加文や展開文の中にさらに展開式を記 述することもて、きます。展開式はまとまっ た機能をひとことて、記述するときに便利て、 す。 展開文 表題の後に「 * 」をつけると展開文となり ます。 List 3 の【例 4 : 展開文】て、は , 内容は 1 行 しかありませんが , 【例 3 】の「 CPU の型など を取得する」に展開され , 元のところからは 消滅します。 表題の省略 List 3 の【例 5 : 展開文と表題の略名】も 展開文の例て、すが , 表題を略した書き方に してあります。定義文を除く表題は省略て、 きます。略し方はユニークな部分を残し , その後に「 ... 」 ( 半角のピリオド ) または「 . . 」 ( 全角のビリオド ) を三つ並べます。 展開文への追加文 List 3 の【例 7 : 日本語構文の例】は展開 文に追加する文を示しました。処理の流れ としては【例 7 】の部分が【例 6 】の後に追 加されて本体【例 4 】に展開されるという形 式になります。また , 表題も省略したもの そのほかの機能 を使用しています。 Fig. 3 日本語識別子から ASC コードへの変換 あうん , わたし 3072 , VT282 機械 , 電脳 , 浸透圧 サイバー , コンピュータ 126 C MAGAZINE 1992 5 平仮名 ・・・片仮名 ・・・漢字 2 バイトの英数字 ・・・ギリシャ文字 ・・・記号 日本語 CPU クロック ASCI ロード ー 00EOSDOR200E —OJ20JFOJK

3. 月刊 C MAGAZINE 1992年5月号

ンチすることだけだ。それをコンビュータ が再フォーマットして美しくプリントすべ きだ」ということだった。 こうして現代の各種文書フォーマッタの 祖父に当たる roff が誕生した。もちろん , 彼 が前述したことすべてを完全にて、きたわけ てはない。当時の普通のキーパンチて、は大 文字しかパンチて、きなかった。そのため noff" プログラムは文がどこから始まるか推 測し , 文の先頭の文字だけを大文字のまま , 残りの文字を小文字に変換した。このルー ルの例外に対しては , 特殊なエスケープシ ーケンスを追加せざるを得なかった。 Brian はさらにマークアップも追加しなけ ればならなかった。文書フォーマッティン グて、は , パラグラフの右側をきれい揃える こと以外にもいろいろとしなければならな ことがある。彼は一連のフォーマッティ ングコマンドを , ( 行の先頭としては ) 変な 文字 ( これは伝統的にドットて、ある ) て、始 まる行て、指示する形式て、取り込んだ。私の 知るかぎりては彼 , すなわち Kernighan が文 書のマークアップ言語の概念を発明した もしこれを発明したのが彼て、なかったとし ても , この概念を私の知る誰よりもうまく 洗練したのは彼てある。 その後 UNIX 用に roff を改善する決意をし たのが , ベル研究所の Joe Osanna だった 彼はマークアップ表記を気に入ってはいた が , あまりに制限が多すぎるのて、 , 「ユーザ が既存のものを使用して自分自身のマーク アップコマンドを定義可能にすること」を 決意した。そして roff にマクロを追加して、、 n ewroff", すなわち nroff を作ることになっ 高望みさえしなければマクロを追加する のは簡単だ。つまり , マクロに名前をつけ , その定義の開始を知らせるコマンドを追加 し , さらにもうひとつ , 定義の終了を知ら せるコマンドを追加するのだ。このふたっ のコマンドて、囲まれたものすべてを記憶し , 後て、呼び出されたマクロ名に対してその定 18 C MAGAZINE 1992 5 義をプレーバックすればよい また , 既存のいくつかのフォーマッティ ングコマンドのように引き数を受け付ける マクロも難しくはない。このためには , 定 義内て、引き数に名前をつけるエスケープシ ーケンスを作らなければならない。そして 定義をプレーバックするときに , 各工スケ ープシーケンスをそれぞれの引き数定義て、 置き換えればよい それて、は , 展開 ( 対応する定義のプレー バック ) を必要とするマクロを含む引き数 があったらどうだろう。この場合マクロ展 開をいつ行うか ( 許可するか ) , というルー ルが必要だ。定義をプレーバックする前に 展開を一度だけ許可するか , 対応するエス ケープシーケンスがプレーバック中に現れ るたびに展開を許可するか , どちらて、も選 択は自由だ。しかしどちらを選択するかに よって , 完全に異なる性質を持つ別々の言 語になってしまう。 もしもっとやる気があるなら (Joe はいつ もそうだった ) , 条件式を追加したいもの だ。テストの結果によってプレーバックに 含まれる定義の内容が変わり , 結構パワフ ルなマクロになる。さらに , 同じマクロへ の再帰的な呼び出しを許すと , 普通のプロ グラミング言語て、の装飾をほとんど持っこ とになる。必ずしも読みやすいものて、はな いが , その潜在的パワーにはすばらしいも のがある。十分なアスヒ。リンがあれば ( 訳 注 : 読みにくいものて、も頭痛なしに読める だろうから ) , 世界を支配てきるだろう。 ロ定義 脚注を異なるルールて、フォーマットすると ただし本文と たのだろう。結構なことだ たとき , それを書き出してほしい」といっ に書きたい。そしてページの終わりに達し 追加した。誰かが彼に「脚注を直接 , 行中 ッタの出力をマクロ定義に転換する機能を Joe は以上のほかにもうひとつ , フォーマ なると話は別だ。あるいは現在のページに 入りきれないような脚注の場合も。あるい いったい何人が nroff の脚注用のプロセッ サを書いたのだろう。たまたま私もその一 人になってはいるが。こんなナンセンスな ことをすべてうまくやろうとするのは本当 に大変な挑戦だ。そして Brian Kernighan が roff に組み込んだ機能よりはるかに多くの 機構を起動することになる。 これがさらに設計上の新しい決定を導き 出すことにつながった。たとえばマクロを 定義するマクロを書く場合を考えてみよう。 これはすごいことだが , ネストした定義中 に引き数工スケープシーケンスをどうやっ て入れるのだろう。工スケープをエスケー プしなければならないだろう。 こうなると 一度て、も記述を誤って推測したら , もう悪 夢だ。 Dennis Ritchie が書いた初期のテキスト工 デイタには , nroff と同程度のパワーがあっ た。それて、もエスケープシーケンスの処理 を N ー 1 回遅らせるためには , 2N ー 1 個の工 スケープシーケンスを書かなければならな かった。私は連続した 15 個のエスケープシ ーケンスを含む工デイタスクリプトを書い たこともある。 Joe はこの部分についてはおおよそうまく 処理した。 nroff におけるマクロの最大の問 題は長い時間をかけて集めてきたパワーだ。 このパワーを簡単な記述と結び付けューザ の目をごまかそうとすると , 悪夢のような デバッグが待っている。 APL から C へコメ ントなして、表現を変換しただけのプログラ ムて , その中に潜むバグを発見するのに夜 中まて、かかることを想像してほしい nr 。 ff て、次に大きな間題は文書フォーマッ ティングに内在する不規則性だ。たとえば ページの先頭にある空白行の場合 , ほとん どはサプレスしてもよいが , そうてない ともある。私はこの空白保存を nroff に指示 するための信頼て、きる方法が見つけられな

4. 月刊 C MAGAZINE 1992年5月号

日本語 C システム「 JJ 」 List 4 ますが , 説明は省略します。 まとめ JJ を簡単に紹介しましたが , このほかに も細かい機能がいくつかあります。それら についてはマニュアルを参照してください ワープロて、プログラムを書き , それがそ のままドキュメントにもなる , というプロ グラミングはたいへん便利て、す。さらに ドキュメントもプログラムも日本語て記述 されていると読みやすく , プログラムに対 するストレスや抵抗感も少なくなり , 精神 からなる生成規則 ( P ) および C 言語の処理を 衛生上よいように思われます。 ログラムにあたる部分がくることを示して ひとっすっ記述していきます。 います。 しかし , 難しい面もあります。今まて、の ひとつの規則は左端に非終端記号を書き , 追加文 , 展開文もほば同じ構造になって ように識別子が英数字だけだと , いいかげ 〃のあとに規則を書きます。ソ〃は「ま います。「本体の連なり」とあるのは , んな変数名て、我慢していられますが , 突然 たは」を表します。規則の終わりは〃て、 に「プログラム文字列」 , 「ヘッダ文」または 日本語の変数名が使えるようになるとどの 締めくくります。 「展開文」がくることになります。 ような日本語が最適て、あるか考え込んて、し JCS のプログラムて、はトークンがすべて日 処理の流れとしては入力された文字列が まいます。 本語になっています。 yacc も C 言語と同じ識 そのひとつの例が私の作成したインクル デリミッタにより区切られ , yylex にあたる 別子の記述方法になっているため , 日本語 ードファイルて、す。定義された日本語には 部分て、いくつかのトークンに振り分けられ , 化が可能て、した。各規則の終わりにつける yacc て、文法に従い , 振り分けられ , それぞ まだ未熟なものが多いと思います。よりよ い名称があれば , 訂正していただき , お知 の記号は「。」に置き換えています。 J れの処理がなされます。 CL て、は「。」は、、 内部て、の処理は 2 パスになっています。 1 にすべて変換されるた らせください め , このようなことが可能て、す。 パス目は文章群を解釈して , 各種の部分に JJ の欠点を述べておきます。 JJ は識別子 分けられ保存されます。プログラムの部分 を変換するのて、 , シンポリックデバッガが List 4 に見られるように , yacc の文法部分 は日本語て、記述されているためわかりやす は表題と本体に分けて保存されます。定義 使えなくなります。すなわち , デバッガ上 の識別子名が「 0J20JFOJK 」のようにわけ 文は縦のリストに登録されていきます。追 いと思いますが , 簡単に説明します。最初 加文は同じ表題をもつ定義文を探し , その のわからない文字列になってしまいます。 は「文章群」というところからスタートしま す。「文章群」は「文章」の 0 回以上の繰り返し 横に追加されていきます。これらの本体は また , プログラムの位置も変更されてしま て、す。「文章」とは空文 , 定義文 , 追加文お うのて、 , コンパイル中のエラー表示などて、 表題を名前とした二分木に保存され , テキス よび展開文て、構成されます。空文は空文字 行番号が出ても , 本体の文書プログラムと トと展開式に分けられます。展開文は二分 列 , すなわち , プログラム以外のすべての 木の中に保存されます。 異なるのて、エラー箇所を探すのにやや困り 部分 , または展開式て、成立しています。 2 パス目て、は縦のリストの最初から順番に ます。 また , 、、※ < 空文文字列の処理※ > 〃とな 日本語 C システムて、ライプラリを作成する リストを辿り , 該当する部分の二分木の中 っているところには , その後て、定義された ことも可能て、す。自分の日本語 C の世界を構 のテキストまたは展開式の部分を出力しま 処理が展開されることになります。定義文 す。展開式がて、てきたら , 該当する本体を 築してみてください。 JJ はフリーソフトウ の構成はすべてまず , 「表題」がきて , 次に 探し , 出力します。これを最後まて、繰り返 ェアて、す。自由に使用してください。なお , 「※定義」 ( 定義文の記号の意 ) があれば , 定 せば終了て、す。 JCS を作成するのに KM ー yacc を使用しまし 義文のための処理を行います。その後にプ そのほかにオプションの処理などがあり こにお礼申し上げます。 》理 》※処 ※理の 理処文 処の一 の列ダ 題字ッ 表文へ 開終 ダダ 文へ字へ ッ 展開式 : 表題 ※展開文 ※《展開式の処理※》 : ※表題 ※《表題の処理※》 文字列 ※《文字列の処理※》 ( 以下略 ) 表題 132 C MAGAZINE 1992 5

5. 月刊 C MAGAZINE 1992年5月号

Fig. 6 typedef の内部表現 Cha 「 256 typedef String typed ef 配列 Cha 「 256 (b) typedef char Cha 「 256 [ 256 ] : (a) typedef char * String : この b の置換に注目してください。変数 b ろが , ANSI 規格て、は typedef 名を変数名や は「 t 型のパラメータ t を受け取る t 型を返す関 の型は「配列へのポインタ」になります。カ 関数名として使用することが許されていま 数 t 」てす。 ッコによって * のほうが先に b と結合するた す。つまり , もちろん , typedef 名自身の宣言と , type め , b はポインタになるのて、す。もしもカッ def 名と同名の変数や関数の宣言が同じスコ typedef int t ; コがなければ char *b [ 256 ] となって「ポ という typedef 宣言があるときに ープにあってはいけません。それは再定義 インタの配列」になってしまいます。ここて t t ; / * int 型の変数 t の宣言 * / 工ラーになります。したがって , typedef 名 ひとつ注意しなければならないことがあり を再定義するときには List 2 のように内側の あるいは , char t ; / * char 型の変数 t の宣言 * / プロックてしなければなりません。 ます。それは const ( または volatile) をつけて , このように名前が現れる場所によってそ のようにして変数 t を宣言することがてきる const String x ; としたときの解釈てす。これは const char のてす。 れが typedef 名なのか識別子なのかが決定さ *x, つまり「定数の ( 変更て、きない )char へ これはどういうことかというと , 宣言の れるというのては , コンパイラは名前の種 のポインタ」のように見えるかもしれません 中て、型指定子が現れた時点て、 , typedef 名は 類を決定するのに苦労します。 yacc< はち が , 実は違います。 String によってすてに ふつうの識別子として扱われるようになる ゃんと定義てきないんじゃなかろうカ 「 const て、ない ( 変更可能な ) char へのポイン のてす。 ブップッ ( というわけて , 某社の C コンパイ タ」て、あることが決定されています。 t t ; の場合 , 最初の t は typedef 名てすか ラては typedef 名の再定義は実装されていま したがって , x が const てあることになり , ら型指定子て、す。これが現れた時点て , も せん。以上 , いい訳てした x の型は「 char への定数の ( 変更てきない ) ポ はやほかの型指定子は現れることはてきま この t t ; という宣言時に t が typedef て、は インタ」になります。 List 1 のプログラムを せん ( 現れたらエラーてす ) 。 なく , コンパイルすると 13 行目てエラーが報告さ したがって , 次の t は型指定子てはなくて #define t int 変数名となります。 char t の場合も同様て というふうに定義されていたらどうなるて れるはずてす。 す。 しようか。プリプロセッサはプログラム中 typedef 名の再定義 もっとヘンな例は , のすべての t を int に置き換えようとするの て , t t ; は int int ; と変換されてしまい typedef された名前は型指定子てす。とこ て、す。どういう宣言かわかります力 答 ェラーになります。 98 C MAGAZINE 1 2 5 靄

6. 月刊 C MAGAZINE 1992年5月号

日本語 C システム「 JJ 」 す。 規則 : アンダースコアふたつ「」で始ま り , かっ ASCII コードで大文字の A か ら V, および数字だけの識別子 宣言の日本語化 【例 2 】て、 , 「無符号」や「整数型」などは C 言 語の宣言型の unsigned や int になります。そ のほか「型定義」 , 「共用体」および「構造体」 なども Table 1 に示したように変換されま す。これらは一般の識別子とは違い , 強制 的に対応するコードに変換されます。 TabI e 1 てひとつの型にふたつの日本語の識別子 が記載されている場合は , いずれを使って も同じものに変換されます。たとえば , 「空 虚型」と「手続き」はともに「 void 」に変換され ます。 【例 3 】の中ては , 前に「型定義 (typedef) 」 て、指定した「 PC 型」の変数「 PC98 」と整数型 の「メモリ量」を定義しています。「 PC98. 値」 は共用体 PC 型の変数て共用体のうち , 「値」 TabIe 2 空白語および助詞的表現 C 言語 JJ Fig. 4 空白語 , 助詞的表現 , 区切り文字の例 日本語 C 言語 ①これは 0.5 である。 ②夜に sin(Y) を代入する。 対応する C 言語 THIS = 0.5 ; sin(Gamma); Alpha SCII コードに変換されます。この変換て C 言 能やクロスレファレンスを出力する機能な 語の識別子との重複を心配されるて、しよう どがあります。また , ヾ※クや > クなどの が , それはまずないと思います。 記号を、、 @ クや > 〃に変更することもて 通常の C 言語て識別子に ク ( アンダー きます。 スコアをふたっ ) を記述しなければ , まった 日本語 C の記述方法 く問題ありません。正確には右記のような 識別子を記述しなければいいことになりま 文書プログラムの中て、プログラム部分の TabIe 1 型の宣言 書き方について説明します。 JJ て、は「文芸的」 JJ の型 ということを意識して , 識別子などに日本 文字型 語が使えるようになります。ここてはこの 整数型 機能を日本語 C と呼びます。構文は C 言語と 長整数型 無符号 同じなのて , 構文の説明は省略させていた 有符号 だきます。 実数型 構造体 インクルードファイル 共用体 外部変数 【例 1 】て日本語 C のためのインクルード 静的 ファイルを「 jjYjj. h 」として指定しています。 内部変数 空虚型 「 jj. h 」にはよく使う関数のマクロ定義が入っ 手続き ています。たとえば【例 6 】や【例 7 】の「表 列挙型 示」などは , printf にマクロ定義されていま 型定義 定数 す。 揮発型 そのほかにも Turbo C 用の各種インクル ファイル型 ードファイルを用意してあります。 割り込み型 クラス 日本語識別子 新規 消去 【例 7 】の「 CPU 型」 , 「クロック」 , 「 5MHz 」 自分 公開 および「 NDP 型」などは日本語の識別子て 非公開 す。 JJ て、は識別子に Fig. 2 に示すような日本 部分公開 語 ( 2 バイトコード ) が使用てきるようになり 仮想関数 多重定義 ます。もちろん , 2 バイトコードと ASCII コ 友人関数 ードの混在も可能てす。 展開式 日本語識別子は最終的に Fig. 3 のような A C 言語 Cha 「 int long unsigned signed double st 「 u Ct uruon extern static static VOid VOid enum typedef const volatile FILE interrupt class n ew delete this public pnvate protected ⅵ u 引 overload friend inline ( 1 ) 空白語 である する とする です を代入する ならば ( 2 ) 助詞的表現 1 バイトの空白 1 バイトの空白 1 バイトの空白 1 バイトの空白 1 バイトの空白 1 バイトの空白 当 にをはとかのヘ 日本語 C システム卩 J 」 127

7. 月刊 C MAGAZINE 1992年5月号

9 ①ー①①、第羆賴①、羆 K ① w ー①碧① にしなければなりません。 オプジェクト指向の設計て、は , 工ンティ ティ , 関係 , 概念等々を設計部位へとマッ プします。そしてオプジェクト指向プログ ラミングて、は , プログラミング言語が提供 しているいろいろな機能を使って , 個々の 設計部位を実装していきます。 もの (things) とオプジェクトとエンティテ ィを区別して考える一つの方法は , ューザ はごく日常的に、、もの〃て、考え , 分析者は工 ンティティ〔ーまとまり性のある実体〕を 把握しようとし , そして設計者はオプジェ クト〔工ンティティのコンピュータ上て、の 具体的な姿〕を気にする , というとらえ方 て、す。分析者と設計者は , 工ンティテイや オプジェクトのクラス〔共通一般概念とし て把握されたエンティテイやオプジェクト〕 についても頭をめぐらします。 本稿のエンティティの定義は , これまて、 の情報モデル理論の主流に沿ったものて、あ り , 少なくとも , 従来の理論に十分に近く て , とくべつの異議は申し立てていないも のて、す。情報モデル理論の学者たちがエン ティティと言うときは , 現実世界て、 ( その目 的に照らして ) 同じ性格を持つ , 複数の構成 部位〔世界を構成している部品〕の〔 = を 表す〕クラスの一つの表現 , という意味て、 あることが多いようて、す。 彼らが厳密な言葉遣いをする場合は , 同 じ性格を共有するすべての部位を言い表す 言葉としてはクラスとか工ンティティのタ イプという言葉を使い , その中の一つの部 位の表現については , 工ンティティのイン スタンスという言葉を使います。さらにや やこしいのは , 現実世界の構成部位の表現 て、はなく , それそのものを指すときにも工 ンティティという言葉をよく使うことて、す。 そうすると , 私たちは少なくとも三つの用 語が必要ということになります。オプジェ クト指向に関する学会などに出席した白の ナイトは , きっと気分が良いて、しようね。 不幸なことに , 工ンティティの場合と同 様の曖昧さと不注意が , 「オプジェクト」と いう用語にもつきまとっています。人々は , 26 C MAGAZINE 1992 5 クラスとかオプジェクトのタイプという意 味て、「あのオプジェクト」と言うことがある し , オプジェクトのインスタンスという意 味て、言うこともあります。しかも , 現実世 界のものや , そのオプジェクトの中に体現 されている知識を言うときに , オプジェク トという言葉を使うことさえあります。 しかし , これらの曖昧な用語は , ある程 度区別して使ったほうが何かと便利て、す。 まず , 「もの (thing) 」は , 現実世界の中の何 かて、す。それは , ユーザが , 問題領域て、も のごとを把握する場合の対象物を言い表す 言葉て、す。それは , 有形な、、もの〃の場合も あるし , 無形な、、ことクの場合もあります。 それは , 実在物て、あることもあれば , ユー ザの思考上の存在物にすぎないこともあり ます。このほか唯一の要件は , それはユー ザが他のものと区別て、きるという点て、す。 「エンティティ」は , 現実世界には存在し ない何ものかて、す。それは , 現実世界に存 在するものの , 表現て、す。それは , ものを , 一連の性格によって表現します。そういう 性格群のことを , ふつうは属性と呼びます。 工ンティティと , それの属性は , 同じもの て、はありません。工ンティティとして表現 されるもの (things) は , そのものの定義とし て記述されます。分析者は , どのものがユ ーザにとって重要か , ということを考えよ うとしますが , そういうとき彼らは , もの をエンティティとして表現しようとしてい るのて、す。「オプジェクト」は , カプセルの 皮膜 ( ~ 外殻 ) てす。それは , 何らかの知識 をカプセル化して封じ込めたものて、す。オ プジェクトとエンティティは同じて、はあり ません。オプジェクトには , そのオプジェ クトの部分て、あるところの動作や操作によ って提供される振る舞いというものがあり ます。私たちはオプジェクトを図や文章て、 それは非常に一般的な意味て、て、す。つまり 知識をカプセル化する , と言いま もと有効な見方 表現て、きます。 したが 知識とは , 次のものをカバーします。 ・エンティティ ・エンティティの属性 ・構造 ・規則 , 原理 , 約束事 ・関係 ・状態 ( ステート ) そのタイプのいろいろな値に対して適用可 bstract data type) 」は , ーっのタイプと , の集合て、す〔例 : int 型〕。「抽象データ型 ( a いろいろな〔共通的仕様 ~ 性格を持っ〕値 ェクトの集合て、す。「タイプ (type, 型 ) 」は , 「クラス」は , 同じ振る舞いを持つオプジ トは , 設計とプログラミングの要素て、す。 ることて、しよう。したがって , オプジェク す。この定義は , 白のナイトを大満足させ 世界のもの ( things ) を表現することにありま にあり , 一方 , 工ンティティの目的は現実 ( たぶんソフトウェアの中に ) 実装すること オプジェクトの目的は , 工ンティティを 原理 , 約束事の中にあります。 中にあります。そして操作は主に , 規則 , ばれたものは , 主にエンティティの属性の ると思います。従来的な定義て、データと呼 こういう議論は避けられ な定義によれば , るのて、す。今回のわれわれの , より一般的 オプジェクトのデータか , という異論は残 が , て、はそれは , デバイスドライバという にデータを持つ , という答えがありえます の例の場合 , デバイスはそのレジスタの上 て、す。この , デバイスドライバという特定 といった議論になってしまうことが多いの ジェクトには , どんなデータがあるのか , き起こす危険性があります。そういうオプ トと呼ぶべきか , というたぐいの議論を惹 たとえば , デバイスドライバはオプジェク したもの , て、した。この従来的な定義て、は , に対して適用て、きる操作と共にカプセル化 は何らかの private なデータを , そのデータ オプジェクトの従来的な定義て、は , それ わせて、 , カプセル化したものて、す。 任意の一部に関する知識を , 任意の組み合 オプジェクトは , これらのすべてまたは ・そしてもちろん , 多くの他のもの

8. 月刊 C MAGAZINE 1992年5月号

日本語 C システム「 JJ 」 List 4 いただくために , ソースファイルの冒頭部 分を List 4 に示します。 JCS のプログラムも JJ て、記述されています。大きなファイル (J CS は約 80K バイト ) の場合 , ソースファイル の中に目次などを入れておくと , 後てたい へん便利て、す。 さて , JCS のプログラムて、す。 List 4 の目 次からわかるように yacc の定義部分 , プロ グラムの定義 , 追加 , 展開をする部分 , そ れらをリストならびに二分木に追加する部 分 , 入力および出力部分 , 表題を処理する 部分 , オプションの処理 , クロスリファレ ンスを作成する部分にわかれています。 yacc の部分は BNF (Backus Naur Form) 記法て、記述されています。 yacc 自身につい ては本誌に連載された「 yacc による C コンパ イラブログラミング」や「日本語風 C 言語 JCL の作成」 ( 参考文献 [ 8 ] , [ 9 ] ) などを参照し てください yacc は文脈自由言語 (Context Free Lan guage ) の構文を記述て、きるコンパイラ / コン パイラて、 , C 言語などの言語を作成すること がて、きます。文脈自由言語とは形式言語理 論の中のひとつのモデルてす。これはある 文法を G とするとき , G が Vn ( 非終端記号 ) , Vt ( 終端記号 ) , P ( 生成規則の集合 ) , S( 開 始記号 ) からなり , これらの記号を与えるこ とによって文法がて、きるというものて、 , 生 成文法といわれています。これらには文脈 依存文法 , 文脈自由文法 , 正規文法などが あります。 yacc はこのうちの文脈自由文法 の構文を解釈する C 言語のソースファイルを 生成するソフトウェアて、す。 yacc の記述方法は最初に終端記号の定義 を置きます。 yacc て、は終端記号をトークン と呼び , % token という記号の後に定義しま す。開始記号にあたる部分は % start て、指定 します。終端記号などの定義部分は、、 % % 〃 て終了し , その後に文法を記述します。文 法は開始記号 ( S ) から開始し , それ以降に非 終端記号 (Vn) と終端記号 ( Vt ) の組み合わせ る・ あラ でイ 了 号パ 記ン終 末コ 終る なす ダ 的に ッ 終ム 最ラ はグ とロ 理 ンプ 処 クの の 展 列 列 ト言 00 文字 文 るを 開文 ム 理 理 理 ラ あ文展空 る 処 処 グ 処 理 で義 の の の ロ 処 列 す 分定 文 の 文 文 部た 加字を 理 列 義 義たっ 追文義 処 定 展 字 追 わ の 定し沿※ム定 く * 文 る義に * ラ 空 づ》 列 す定法》義グ の終 と※ 義 対を記※定ロ 体字 体《 開 義 も義章 に O 義※プ 本文 定 本※ の O OZ 。定 に定文 ム文 ※な ※な 列 0 るの題列群法の ※な連 連 の 文文文字式 連 連りのり了 グダ式 はあン表字章記 0 群 無 体体ロッ開 はとでク※文文 O 章章文義加開 文開題の題の題のな体わ終 下 O ラ一 z 文文空定追展空展表体表体表体連本終※連本本プへ展 中 文 : 本。文 : 本。文 : 本。の : 章以 O イト就 開 《章 義 章 体体体 定 展 文 追 本本本 ※第ン※れれ※ 2 ※文 空文 本体 日本語 C システム卩 J 」 131

9. 月刊 C MAGAZINE 1992年5月号

年 , 2 年放置すると , その詳細をすっかり忘 ( 文書プログラム ) から TANGLE てプログラ 識してネーミングされたものて、 , 「私が文芸 れてしまうことも珍しくありません。いざ ムを取り出し , WEAVE て、印刷用の TeX フ 的プログラミングという言葉を選んだ理由 修正を加えようとしても , 他人が作ったも ァイルを作成します。プログラムを作るに は , 自分が構造的て、ないプログラムを書い 同然のプログラムになってしまい , 修正に は TANGLE て、抽出したプログラムのソース たときに罪の意識を持つのと同様に , 構造 苦労する , ということはよくあります。そ ファイルを Pascal コンノヾイラて、コンノヾイル 的プログラミングという言葉を作った人た のようなときに , 完全なドキュメントが残 すればよく , ドキュメントの印刷物がほし ちが , 文芸的て、ないプログラムを書いたと っていればよいのて、すが , 前述したように いきは WEAVE て、作成したファイルを Te きに罪の意識を持ってほしいと考えたから ドキュメントがきちんと整備されている場 X にかければよいわけて、す。しかし , WEB て、ある」といっています。 合は少なく , プログラムを 1 行 1 行解釈し直 システムて、は印刷用のコードも合わせて記 構造的プログラミング理論などからソフ さなくてはなりません。これて、は生産性は 述するため , ソースコードを書くのはかな トウェア作法などの本が出てきたように 向上しません。 り難しそうて、す。また , WEB はコンパイラ 彼は文芸的プログラミングから何かドキュ WEB はひとつのドキュメントファイル として Pascal を想定していますが , C 言語に メンテーション作法のようなものを作り上 げようとしているように思えます。 例題プログラム ソフトウェア関連のドキュメントにはソ フトウェア開発時のドキュメント ( 開発企画 書 , 仕様書 ) , およびソフトウェア完成後の 保守用ドキュメントなどがあります。さら に , 使用者のためのドキュメントとしてマ ニュアルがあります。 JJ および WEB は , ソフトウェア作成・保 守に求められるドキュメントの作成用ツー ルて、す。 JJ や WEB は以下のような理由によ りドキュメント作成に有効て、す。 通常 , ソフトウェア作成には , プログラ ムとドキュメントが別に作成されます。 の場合 , もしプログラム訂正があっても , すぐにドキュメントの訂正に結びつかない という状況が発生します。プログラムのほ うが頻繁に訂正され , ドキュメントの訂正 まて、手がまわらないというのが現状だと思 います。 また , プログラム訂正時に , ドキュメン トファイルが別になっていると , ドキュメ ントを直すためだけの作業が必要て、す。め んどうな作業て、あるためにドキュメントを 頻繁に改変しないということにもなります。 JJ などて、はプログラミングとドキュメン トを同時に記述てきるのて、 , このようなめ んどうはなくなります。 「ソフトウェアの保守」ということを考え ると , たとえ自作したプログラムて、も , 1 List P C 9 8 の C P U の型やクロック数を出力するプログラムです。説明用なので、 C 言語と日本語 C とを混在させてあります。 【例 1 : 定義文】 ※《データの定義※》 = #include く jj*jj. h> #include く pc98. h > 【例 2 : 追加文】 共通変数や共用体などを定義します。 ※《データの定義※ゝ十 const enum C P U 型 { 18086 , V30 , 180286 , 180386 } ; const enum クロック値 { 5 MHz, 8MHz}; const enum N D P 型 {NO, 18087 , 180287 , 180387 } ; 型定義共用体 { 無符号整数型値とする。 構造体 { 無符号整数型 C P U : 3 とする。 無符号整数型クロック : 1 とする。 無符号整数型 N D P : 2 とする。 無符号整数型その他 : 10 とする。 } 内容 ; 【例 3 : 展開式】 メインプログラムです。処理の流れを指定します。 ※《メインプログラム※》 = 空虚型 main( 空虚型 ) P C 型 P C 9 8 とする。 整数型メモリ量とする。 ※《 C P U の型などを取得する※》 ※《メモリの量を取得する※》 ※《結果を表示する※》 } P C 型 ; ←展開式の例 ←展開式の例 ←展開式の例 【例 4 : 展開文】 P C 9 8 0 1 の機器設定を取得します。 ※《 C P U の型などを取得する※》 * 124 C MAGAZINE 1992 5

10. 月刊 C MAGAZINE 1992年5月号

学 五ロ 一三ロ ードの次に現れますが , typedef 名は現れま せん。この性質を利用すればコンパイラは typedef 名と簡単に区別することがてきま す。 また , 構造体・共用体のメンバ名として も typedef 名を使うことがてきます。メンバ 名も独立した名前空間を持っています。 構造体・共用体を宣言するときは , コン パイラは上述の typedef 名の再定義と同様に してメンバ名と typedef 名を区別することが 可能になります。 式の中てメンバを参照するときには , メ ンバ名は必ず演算子 ! 〃またはー > クの次に 現れますが , typedef 名は決して現れませ ん。したがって , メンバ名と typedef 名を区 別することがてきます。 typedef 名の再定義 / * t は typedef 名 * / List 2 1 : typedef int t; 2 : 3 : foo() 5 : 6 : 7 : / * 関数 t を宣言する * / / * t の呼び出し * / t t(void); 構造体と typedef 名 List 3 / * t は typedef 名 * / / * タグ名 t * / / * メン )Xt は t 型 (int 型 ) * / 1 : typedef int t ; 2 : 3 : struct t { 4 : t t; ラベル ラベルも独立した名前空間を持っていま すから , typedef 名と同じ名前のラベルを使 うことがてきます (List 4 ) 。 ラベルの場合は , goto の次に現れるか , あるいはラベルの次には必ず〃が続きま す。この性質を利用してコンパイラは type def 名とラベルとを区別することがてきま す。 ラベルと typedef 名 List 4 / * t は typedef 名 * / 1 : typedef int t; 3 : foo() 5 : 7 : 8 : 9 : 10 : } このように typedef を使うと複雑な型を簡 単に書き表すことがてきるようになり , リ ーダビリティが向上します。しかし , ANS I 規格の typedef 名の再定義はコンパイラ屋泣 かせてもあります。 だってめんどくさくなるんだもん。 ANS I のバカア。しくしく。 ご質間 , ご意見をお寄せください。 〒 108 東京都港区高輪 2 ー 19 ー 13NS 高輪ビル ソフトバンク株 c マガジン編集部℃言語雑学講座』係 C 言語雑学講座 99 / * 変数 t は t 型 (int 型 ) * / / * t はラベル * / / * t はラベル * / t t; goto t ; f 名と同じ名前を使うことカイきます ( List 3 ) 。これはタグ名だけて独立した名前空間 を持っているからてす。 タグ名は必ず struct や union などのキーワ [ 構造体 構造体・共用体・列挙のタグ名は typede