1989 年 12 月 1 日発行 ( 毎月 1 回 1 日発行 ) 第 1 巻第 3 号通巻 3 号 C マガジン 提携・米国「ハー」誌 / 監修・石田晴久 すへての C 言語プロクラマのための技術情報誌 0 日本ソフト八ンク 創刊 3 号 日 K SOFT 定価 980Y 。。 1989 DEC. Vo い No. 3 く特別付録〉 5"2HD ラスク ・ Quick C ユーティリティ集 ・和 rbo シリース修正差分ファイル ・ MS - DOS ユーティリティ ( 拡張 DEL ・ D 旧コマント ) ・掲載全ソースコート 提携記事・ Designing with Objects>yacc による C コン、イラフロクラミンク >C 言語入門講座・はしめて学ぶ C プロクラミンク く第 2 特集〉 QuickC Ver.2 0 徹底チェック巻頭インタヒュー NHK 人体を生んた C 言語新連載応用 c 言語・ファ弔レ操作編 く第 1 特集〉最新 MS - DOS 考察緊急レポート \/e に 4 の実 { 象ーこ迫るマイクロソフト・富士通・エプソン・日本旧 M に聞く
DESIGNIP G WITH OBJECTS 使うことによって生じる。 これらの利点を 開発および保守のて、きる , 非常に優れたア のに注意を向けるならば , より安い費用て 処理について考える前に , データというも 実装し始めなければならないのだ。もし , とて , オプジェクト指向の概念を ( 頭の中に ) データ抽象化の技術を理解し , 使用するこ 方法を根本的に変更しなければならない ぶ必要もない。ただ , 開発過程て考察する 得るために , 新しい言語を買う必要も , 学 参考文献 ルゴリズムて、処理するだろう。 Manifesto. Englewood Cliffs, N. J, 5. Martin,J. An lnformation Systems WesIey, 1986. Language. Reading, Mass. : Addison- 4. Stroustrup,B. The C 十十 Programming Communications of the ACM, Dec. 1972. in Decomposing Systems intO Modules. ” 3. Parnas,D. L. "On the Criteria to Used Prentice-HaII, 1979. emsDesign. Englewood Cliffs, N. J. DiscipIine Of Computer Program and Syst Structured Design : FundamentaIs Of a 2 . Yourdon,E. and L. L. Constantine. Hall, 1988. Data. Englewood Cliffs, N. J. : Prentice- ented Analysis : M0deling the World in 1. Mellor,S. and S. Schlaer, Object-Ori 著者について Prentice-HaII, 1984. 32 CMAGAZINE 1989 12 おもなビジネスとしている。 的情報システムの特殊なコンサルタントを 査を専門に行っている企業に対して , 戦略 長て、ある。この会社は , セキュリテイや調 のロサンゼルスにある Stratisys Corp. の社 Stephen C. Bailey 氏は , カリフォルニア List 5 関数 : 円 ayingCards() 記述形式 : void 円 ayingCards() This function Export ージョーカを加えた札の組を初期化する Deck deck; 円 ayingCards (&deck) : 詳細仕様 : 2 枚のジョーカを加えた 5 2 枚の札の組を作成する ( 全部で 5 4 枚 ) 。 札は順番通りにならんでいる ( ジョーカは最後で 5 3 番と 5 4 番 ) 。 編集部から : これらの札全部はスペースの関係で本誌には掲載できません。 このプログラムの全部は付録のディスクに収めてありますので , そちらをご覧ください。 static int 円 ayingCards (deck) Deck *deck; begin / * 札オプジェクトのポイン々 * / Card *cardp; void ( * setcard) (Card * , enum rank, enum suit) : クラブの札を作成 cardp = &deck->card[ 0 ] : CreateCard (cardp) : setcard ニ cardp->proc->SetCard; ( * setcard) (cardp, Ace, Clubs) : cardp 十十 : CreateCard (cardp) : ( * setcard) (cardp, Two, Clubs) : cardp 十十 : cardp 十十 : CreateCard (cardp) : ( * setcard) (cardp,King,CIubs) : cardp 十十 : 同様にしてダイヤの札を作成する 同様にしてハートの札を作成する end 同様にしてスペードの札の作成する ( * setcard) (cardp, J0ker, NOSuit) : CreateCard (cardp) : cardp 十十 : ( * setcard) (cardp, JOker, NoSuit) : CreateCard (cardp) : 同様にしてジョーカの札を作成する
Prologue つあった 1981 年 , コンピュータの巨人 IBM がパソコン部門に参入した。その際 , IBM のパソコンのコンセプト設計に非常に大き な影響を与えたのがマイクロソフト社のビ ル・ゲイツ氏て、あった。彼は 8 ビット CPU に 代わって , 当時登場したばかりの 16 ビット CPU, 8088 ( 8086 の 16 ビットバス版 ) の採用 を認めさせ , さらに自社製のディスクオペ レーティングシステムを搭載させることに 成功した。これが PC-DOS Ver. 1.1 て、ある。 C M86 対 MS-DOS 当時 , マイクロコンヒ。ュータ用の OS メー カーて、著名だったのは , CP / M を開発したデ ジタルリサーチ社て、あった。デジタルリサ ーチ社は CP / M をベースにして 8086 アーキテ クチャに対応した OS , CP / M ー 86 を開発し , 販売していた。これに対して , BASIC て、有 名だったマイクロソフト社が新しく DOS を 開発し , IBM-PC 用の DOS として採用させ ることに成功した。これが PC-DOS て、あり , のちに同社から MS ー DOS として発売された。 この MS ー DOS は米国の Seattle Com puter Product lnc . が開発していた 86 ー DOS という 8086 系 CPU 用の DOS をマイクロ ソフト社が買い取って拡張したものて、ある。 そのアーキテクチャは CP/M-86 とそっくり て、あり , CP / M 用のソフトウェアを CP / M ー 86 に移植するよりも , MS-DOS 用に移植す るほうが簡単だとまて、いわれていた。 DOS としての機能にそれほど差はなかった。 PC 9801 と MS-DOS アメリカて、 IBM ー PC が発表されていた ろ , 日本て、は日本電気株 ( NEC ) から PC ー 9801 が発表されていた。このマシンて、は CPU に 8086 を採用し , GDC として PD7220 を搭 載するなど , 当時としては非常に高性能な 34 CMAGAZINE 1989 12 マシンて、あった。しかし , ソフトウェアは 相変わら $BASIC インタブリタが採用され ており ,RAM も標準て、 128K バイトしか搭載 されていなかった。 OS としては MS-DOS Ver. 1.25 と CP / M ー 86 の両方がサポートさ れ , それぞれにユーザが存在していた。 M -DOS Ve 「 .2.11 MS-DOS Ver. 1.25 は , CP/M-86 とあま り機能的な差はなかったが , やがて発売さ れた Ver. 2.0 て、は , 当時話題になりはじめて いた UNIX の特長を取り入れ , かなり大幅に 機能が拡張された。内部て、の実現方法には 問題があったものの , 階層ディレクトリや リダイレクト , パイプ機能もサポートされ , システムコールもファイルハンドル形式の ファンクションが追加され , CP/M-86 とは かなり機能的に差をつけた。 PC ー 9801 に Ver. 2.11 が移植され , 発売さ れた。以降 , PCー9801 の DOS は MS-DOS が 主流になり , C 言語など、を取り扱っているデ イストリビュータも , CP / M ー 86 対応の製品 の取り扱いをやめるところも出てきた。 ASCII 版 MS-DOS 当時 , マイクロソフト社の日本て、の販売 代理店は ( 株 ) アスキーだった。当時 , アス キーて、は , いくっかのアプリケーションソ フトウェアを MS ー DOS 込みて、販売していた が , その MS ー DOS のなかに , 起動時に 「 Ver. 2.11V 」と表示するものがあった。こ れがアスキー版 MS ー DOS と呼ばれるもの て、 , 絶対パス名を指定してコマンドを起動 することがてきないといった MS-DOS Ver. 2.11 のバグが修正されていた。事情を 知っているユーザは , NEC て、発売している MS-DOS のかわりにアスキー版の MS-DOS を使っていた。 日語フロントエンド プロセッサの登場 当時の MS ー DOS は日本語を扱えるように なってはいたが , OS 上て、日本語を入力する 方法は , JIS コードを調べて 1 文字ずっ入力 していく方法しかなかった。そのため , MS -DOS 用のワードプロセッサは自分のソフト ウェア専用の漢字変換システムを用意して いた。そうした状況のなかて、 , 株バックス から , VJE ー 86 が発表された。これは MS-DOS のコンソールデバイスをトラップしてデー タ変換し , 入出力機能を利用しているアプ リケーションて、漢字入力がサポートされる というものて、 , 当時としては画期的て、あっ た。 VJE ー 86 はその後バージョンアップを繰 り返し , 現在は VJE-ßとなっている。 日本語ワープロ 「太郎」の出現 MS-DOS Ver. 2 . 11 になってもしばらく は , MS ー DOS 上て、動作する日本語ワープロ よりも , N88-BASIC(86) や , 独自の OS 上 て、動作する日本語ワープロのほうが多かっ た。しかし , ジャストシステム社から発売 された日本語ワープロ「太郎」がその流れを 変えた。「太郎」に搭載された ATOK は VJE と並んて、多くのユーザを獲得し , 「太郎」の バージョンアップ版て、ある「一太郎」は , 当 時のベストセラー「松」をおさえてトップシ ェアになった。これ以降 , ビジネスソフトも MS ー DOS 上て、動作するものが多くなった。 MS ー DOS もネットワーク の日、代へ UNIX 界て、イーサネットなどの技術が発達 しコンピュータどうしを接続するネットワ ーキングという考え方が普及するにしたが って , MS-DOS も MS-NETWORK という ネットワーキングソフトを発売し , それに
ーコンヾイラ の ( 173 行 ) の 2 とおりのものがあります。ま たエラーリカバリの都合から , if 文の「 if ( 式 ) 」という部分をノンターミナル if head として独立して定義しています。 while 文 , for 文 , switch 文についても , 同様に頭部 を表す XXX head というノンターミナルを 設けています。 177 行目は while 文 , 178 ~ 180 行は dO ~ w れ ile 文て、す。 181 行目は for 文て、す。 for 文のカッコ内には 3 つの式が書けます が , いずれも省略て、きます。式を省略可能 にするために , for head の定義て、 expr 0Pt というノンターミナルを参照しています ( 208 行 ) 。 expr 0Pt は , 何もない ( 212 行 ) か , 式がある ( 213 行 ) か , というふたつの規 則をもっています。 182 行目は , switch 文て、す ocase 文は 183 行目 , default 文は 186 行目て、定義していま す。以下 , 189 行目から 198 行目にわたって , break 文 , continue 文 , return 文 , goto 文 , ラベル付文 , 空文と続きますが , いず れも説明の必要はないて、しよう。 104 行目から 160 行目まて、が宣言の定義て、 言の定義 す。 て、は , declaration, declar ator, type name の 3 つが「外部シンボ、ル」 て、 , このほかは補助的なノンターミナルて、 す。 declaration は , いわゆる宣言のこと て、 , 型指定子 (type specifier) の後に宣言 子 (declarator) を 0 個以上 , コンマて、区切っ て並べ , 最後にセミコロンをおいたものて、 す ( 104 ~ 106 行 ) 。たとえば , 次の 3 行 int a, b, c [10] C20] ・ int は 1 行 1 行が ( それぞれ完結した ) 宣言て、す。 こて、 , int と char が type specifier て、 す ( 108 ~ 110 行 ) 。また , *p や (*fp)() や c [ 10 ] [ 20 ] が declarator て、す。宣言子 は , declarator と decIarator2 のふたっ のノンターミナルを使って定義されていま 78 CMAGAZINE 1989 12 す。これは , 宣言に優先順位 ( ポインタ ' * よりも , 関数呼び出し℃ ' や配列 ' ロ ' を優 先する ) をつけるためて、す。 122 行目はカッコを使ってのくくりだして、 す。それに対して , 124 ~ 125 行は関数呼び 出しの宣言て、す。このうち , 125 行目はパラ メータ付 2 の関数宣言て , パラメータ自体は param list ( 131 ~ 138 行 ) を使って定義さ れています oparam list は , param decl を ひとつ以上コンマをはさんて、並べたものて、 す。 param decl は , 型指定子 (type specifier) と宣言子 (declarator) を並べ たものて、す ( 140 ~ 141 行 ) 。 144 行目から 160 行目まて、が , 型名 (type name) の定義て、す otype name は , キャス トや sizeof を定義するのに使います ( 251 , 252 行目 ) 。 type name の定義には , 抽象宣 言子 (abstract declarator) を使います。 抽象宣言子は , 宣言子 (declarator) から識 別子を取り除いたものて、 , abst declarator として 148 ~ 160 行て定義されています。抽 象宣言子は宣言子から識別子をなくしたも のなのて、すが , たんに declarator/declar ator2 の文法規則の工 DENT 工 FIER をな くして空の規則にするだけて、は , conflict が 起こり , うまく処理されません。そこて、 , 型指定子宣言子関数本体 関数の定義 ( func def) は , をおくことがて、きます。 78 行 ) て、す。いずれの場合て、も前に EXTERN の定義 ( 75 , 76 行 ) , または変数の定義 ( 77 , ものて、す ( 65 , 66 行 ) 。 extern def は , 関数 が ) 。 file は , extern def を 1 個以上並べた す (program という名前のほうが適切て、す Cm コンパイラのメインエントリは , file て、 のトップレベルのプログラムの定義て、す。 65 行目から 99 行目まて、が , Cm コンパイラ プログラムの定義 してあります。 は , conflict が起きないように文法を変形 abst declarator/abst declarator2 て、 の内部を詳解 か 宣言子関数本体 のいずれかが許されます ( 82 ~ 88 行 ) 。 たとえば , int foo(char * p) 博道・田中啓介訳 , 啓学出版 , 1987 『コンパイラ設計』矢吹道郎・小暮 Hall, 1985 H. Gerorge Friedman Jr. 著 Prentice tion with UNIX, Axel T. Schreiner, [ 1 ] lntrouction tO compiler construc 参考文献 を説明する予定て、す。 ルアナライザから宣言の処理ルーチンまて、 していくことにします。次回は , レキシカ 降 , 関連するトピックのところて、適宜追加 ーサて、す。 cm. y のアクションは , 次回以 まったくアクションをつけていない裸のパ することがて、きました。 List2 の状態て、は , これて、 , ようやく Cm 言語の文法を定義 カル変数を定義て、きるようにしてあります。 化するために , 関数本体の先頭て、のみロー Cm て、はシンポルテーカレの取り扱いを簡略 ーカル変数を宣言することがて、きますが , す。本来の C 言語て、は , 複合文の先頭て、ロ ーカル変数を定義て、きる点が異なっていま ( 220 ~ 224 行目 ) と似ていますが , 先頭て、ロ 関数本体 ( func body) は複合文 ることにします。 階て、 , 言子が関数て、あるかをチェックす されてしまいます。そこて、 , 意味解析の段 この定義て、は文法的には正しいものと認識 などは , 本来ならエラーにするべきて、すが , int a[10] ん。てすから , 言子は関数を表すものて、なければなりませ 言子 , { } が関数本体になります。当然 , 宣 て、は , int が型指定子 , foo(char * p ) が宣