定義 - みる会図書館


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

1. 月刊 C MAGAZINE 1990年5月号

の諸結果〔訳注 : つまりプログラミング過 程における「楽屋裏」〕を , 明確に定義され たプログラミングノヾッケージないしユニッ ト中に隠してしまう , という適用範囲の広 いソフトウェア工学の原理て、ある。そのユ ニットの機能だけを , 明示的に定義されて いるインタフェイスを介して使用て、き , そ れらのインタフェイスが隠された細部を露 Fig. 3 変換中心ソフトウェア組織における情報隠蔽 呈することはないのて、ある。 情報隠蔽は実質的に , Edward Yourdon と私が提唱したモジュールの質 ( モジュール の凝集力とモジュール間結合性 ) の定量化理 論と軌を一にするものて、ある。どちらの理 論て、も , インプリメンテーション上のさま ざまな細部や設計の意思決定 ( 内輪事情 ) を 内部に隔離することによって , 個々の構成 導出性のデータ抽象化 GET A2 の詳細は隠される / 処理とテータ構造 / MAIN DO GET AI MAKEI MAKE2 READ Fig. 4 テータによる構造化のソフトウェア組織 - 導入性のデータ抽象化 PUT 灯 MAKE-X CHANGE DISPLAY REPORT ABSTRACT REPORT ENTRIES WRIT SHOW SUMMARY SAMMARY 0 SHOW ABSTRACT SHOW ENTRY REQU 旧 ED OPTIONAL SHOW REQU 旧 ED SHOW OPTIONAL テータ構造 テータの表示をするサプシステムの構造 部位の安全性と独立性が高まるとしている。 データ抽象化は , 1 クラス全体のデータの 共通の特性や属性を摘要することによって , データを定義する。たとえば , 車は重さ , 長さ , モデルといった属性と , 発進 , 停止 , 方向変換 , 加速などといったサービスない し動作とを合わせたデータ抽象化によって 定義て、きる。隔離収容 (encapusulation) は , 情報隠蔽を具体的に実現する方法のひとつ て、あり , すなわちデータ構造とその関連操 作を単一のモジュールないしプログラミン グ単位の中に隠しているのだ , と考えるこ とがてきる。継承は , ひとつのオプジェク トクラスの特性を子孫のクラスの特性とし ても定義する , という関係性のことてある。 継承によって新たなオプジェクトモジュー ルを , それと同じ既存のオプジェクトを指 定することによってインプリメントて、き , その際 , 違う部分 , 変える部分だけを再定 義すればよいのて、ある〔訳注 : "data abstraction" を慣例により「データ抽象化」 と訳しています。これは , abstract という動 詞の原義 ( 物事の中から , その物事を定義し ていると思われる有限個の特性データや動 作を観念化・概念化して取り出すこと ) に着 目したほうが , 理解しやすいかもしれませ 構造的な組織 複数のルーチンをランダムに寄せ集めた ものは , ソフトウェアシステムてはない システムとして機能するためには , モジュ ールの集合体が実動可能な一体性へと組織 されていなければならない。政府や企業の 組織が , その独自の管理方針や指導方針に ソフトウェアシステムの形態の違いは , がありうる。 ェアシステムの組織にも , いろいろな形態 基づいてさまざまてあるように , ソフトウ オプジェクト , 関数とプログラムの拡張性 25

2. 月刊 C MAGAZINE 1990年5月号

Medicine patient Dentistry PrimarySurgery 構成されている基底クラスをある特定の用途に対 する拡張と考えることがて、きます。たとえば , 医 療データベースの例のクラス Medicine は , 基底ク ラス patient のある特定ノヾージョンにみえ , それら はクラス全体て、階層構造を構成しています。 まず , クラス patient および surgery に注目して みましよう。これらのクラスは , 公開コンストラ クタをもたず , そのインスタンスが生成されるこ とのない未完成のクラスて、す。すなわち , これら のクラスは , 実装というよりは , まだ , 雛型の段 階として使われています。したがって , これらの クラスは , それから派生したクラスがもっ基本的 な操作の統一の役目も果たします。この考えをさ らに推し進めることにより , ある問題のインタフ ェイスの統一を行うことが可能だと思われます。 , こては , 適当に車のインタフェイスを考えま しよう ( 注 10 ) 。最初に , 車の一般形て、あるクラス car を作成します (List6 参照 ) 。このクラスは , コンス トラクタおよびディストラクタ以外の全メンバ関 数が仮想関数てあり , それらの各メンバ関数には , 多重継承の例 List 9 1 : / / クラス HispeedCar の多重継承バージョン surgery SencondarySurgery あらかじめ規定の動作が定義されています ( List7 参 照 ) 。 このクラス car を基底クラスにして , その実際の 型て、あるクラスを定義します ( List8 参照 ) 。高速な 車用に派生クラス HispeedCar を , 多数の人間が 乗車て、きる車用に派生クラス BusCar を定義します ( 注 (1) 。基底クラスの規定動作のための仮想関数に より , これらの実際の車に相当する派生クラスて、 は , このように , 基底クラスの既定動作と異なる 操作だけを明示的に再び定義し直すだけて、 , 全操 作を定義する必要はありません。そして , 各派生 クラスの車間のインタフェイスは , 結果的に統一 されます。 最近の継承機能 C 十十の機能は , 最初のリリースからしだいに新 たな機能が追加され , 徐々にて、すが進化していま す。本記事の前半の大部分の話は , 最初に公開さ 2 : class HispeedCar public Car, public Hispeed 〃実装の細部は省略 6 : / / クラス BusCar の多重継承パージョン 7 : class BusCar ・ public Car, public Men / / 実装の細部は省略 8 : 5 : 3 : ( 注 1 の車のクラスは , 交 通量のシミュレーションに て、も使うことにしましよう ( 注 11 ) 本来ならば , これ らの派生クラスは , クラス Car とほかのクラスからの 多面取生クラスとして定義 されるべきだろうが , ては説明のために , 単鈍な 単一 ( sing 厄 ) 派生クラスと して定義する。 C + 十プログラミング入門 91

3. 月刊 C MAGAZINE 1990年5月号

これらのプログラムを使用して , PragmaC とがて、きます。 らに関しても , 現時点ては確定していませ のプログラミング環境がどのように展開さ csp は , C 言語のソースリストを整形 / 加工 んが , おおよそ必要て、あろうもの , 用意さ して表示 / 印刷するためのユーティリティて、 れるかを Fig. 1 にまとめました。 れているとよいてあろうものをあげておき 図からもわかるように ,PragmaC の運用 す。 ます。 に際しては , MS-DOS 関連 ( マイクロソフト ) csa は , ソースリストと関連ファイル ( へ LINK LIB SYMDEB ッダファイル ) の各種宣言 , 定義を分析する のツールがいくつか必要になります。これ MAKE MASM ためのユーティリティて、す。 cxr は , 関連するソースモデュール , また PragmaC プロジェクトプロセス はアーカイプファイル間における関数 / オプ ジェクトのクロスリファレンスリストを作 成します。 本連載は , 以下の 3 種の作業を並行して進 carc は , PragmaC 用のアーカイノヾユーテ めていく形態をとります。 ィリティて、す。 * コンバイラ / 言語仕様・規約の定義 cinf は , PragmaC 用のオンラインドキュ * ライプラリの定義 / 作成 メンテーションユーティリティて、す。 * プログラムの作成 Fig. 1 PragmaC プログラミング環境 言語仕様・規約編 [ 1 ] まず , 第 1 回目の本号て、は , C 言語として 成立するためのもっとも基本的な構文規約 プロジェクト ファイル PC CC ソース ファイル CCP Cinf CPP CSP C S a C X 「 CCC ヘッダ ファイル オンライン CCO ドキュメント リスティング アーカイプ ファイル carc アセンプラ オプジェクト L 旧 , etc アウトブット モジュール ライプラリ ー LlNK,MASM,SYMDEB,etc. L ー ファイル プロジェクト PragmaC 45

4. 月刊 C MAGAZINE 1990年5月号

ファイルて、す。 unsigned int Stat; struct tokenlink ような構造体に格納されます。 分類された語句についての情報は , 次の ことを表しています。 列が , 物理的な行末を越えて継続している 継続て、す。これは注釈文 , 文字定数 , 文字 ています。ただひとっ特殊な点は , 4 番目の これらの分類は , 前述の構文規約に則し を行っています (TbI. (1) 。 いるビットマスクを使用して , 語句の分類 cctoken. c て、は , cctoken. h て、定義されて のサプルーチン集て、す。 の単語として有効となるよう分類するため を最小構成要素となる語句に分解し , C 言語 用関数を利用して入力されたソースリスト cctoken. c (Fig. 2) は , cctype. h の判定 ncctoken. h cctoken. c 定義されています (TbI. 10 ) 。 [ ] を使用して , 判定用関数がマクロとして これらのビットマスクと配列 CCTYPE ています。 して Tbl. 9 のようなビットマスクが定義され cctype. h 内て、は , 文字タイプの判定用と int て、す。 びマクロ関数の戻り値はすべて unsigned ださい ただし , ビットマスクの値 , およ 処理プログラム専用としたものと考えてく 準ライプラリの ctype. h,ctype. c を ,C 言語 文字タイプを判定するためのものてす。標 スリストを構成する文字として見た場合の cctype. h および cctype. c は , C 言語のソー •cctype. h cctype. c 3 画面出力 / 印刷出力 語句解析 ( 行単位 ) 2 ファイルの読み込み ( 行単位 ) ( ファイル名入力 ) 1 コマンドライン処理 とおりて、す。 このプログラムの大まかな流れは以下の TbI. 9 cctype. h 内の文字タイプ判定用ビットマスク定義 C ENDOF C SPACE C PU N CTUATO R C OPERATOR C 団 GIT C OCTDIGIT C HEXDIGIT C SUFFIX C SIGINIT C SIGCHAR C SIGKANA C SIGKANJI 行末 NUL, LF 空白 space, tab, CR 甸読点 演算子 10 進数 0 , 1 , 2 , 3 , 4.5 , 6 , 7 , 8.9 8 進数 0 , 1 , 2.3 , 4 , 5 , 6.7 16 進数 0 - 9 , A - F. a - f 接尾子 u , U コ , L, f. F , d , D 有効先頭文字 , A ~ z, a ~ z 有効後続文字 , 0 ~ 9 , A ~ z, a 半角カナ シフト』 S 第 1 バイト TbI.10 ピットマスクと配列 CCTYPE [ ] を使用した判定用関数のマクロ定義 is c endof(c) is c space(c) i$ c punctuator(c) is C operator(c) is c sepa 「 atO 「 (c) is c digit(c) is c octdigit(c) is c hexdigit(c) is c suffix(c) is c siginit(c) is c sigcha 「 (c) is c sigkana(c) is c sigkanji(c) is c fi 「 st(c) is c 厄れ e 「 ( c ) 行末か ? 空白文字か ? 句読点か ? 演算子か ? 甸読点または演算子か ? 10 進数のメンバか ? 8 進数のメンバか ? 16 進数のメンバか ? 定数の接尾子か ? 先頭文字として有効か ? 先頭以後の文字として有効か ? 半角カナか ? シフト』 S 第 1 バイトか ? 先頭文字 , カナ , シフト』 S 第 1 バイト 有効文字 , カナ , シフト』 S 第 1 バイト TbI. 1 1 cctoken. c の cctoken. h で定義されるピットマスクを使用した語句の分類 CC SPACE CC LINEFEED CC ENDOFLINE CC CONTINUE CC COMMENT CC CONSTANT CC CHRCONST CC STRLITERAL CC PUNCTUATOR CC OPERATOR CC STATEMENT CC SPEC 旧 ER CC PREPROCESS CC SIGN 旧 CANT 空白 改行 行末 継続 注釈文 定数 文字定数 文字列 句読点 演算子 ロロ - 卩 指定子 プリプロセッサ命令 有効な識別子 プロジェクト PragmaC 51

5. 月刊 C MAGAZINE 1990年5月号

・ Equa 骭 0 れ 50 ⅳ e 「 in PROLOG A Nume 1 節が失敗のときは , 第 2 節が実行され , この呼び出 して、の Args の最初の要素にかかわらず , Arg が次の 再帰呼び出しに渡され調べられる。 ところて、 , ひとっ特別な場合を除外しなければな らない 。たとえば , 次のようになる。 Ca,b,c(d),e] [ ' 十 ' , 2 , 5 十 X ] . ( 訳注 5 ) 2 十 5 十 X リストさえも同様にして分解することがて、きる。 というのは , リストは , 本当は , 関数子 ( functor ( 訳注 6 ) ) が点ヾ . 〃て、ある 2 引数の構造体て、あるからだ。した がって , [a,b,c] というリストは本当は , ということになる ( ただし , すべての PROLOG て、 , のように書けるわけて、はない ) 。 Ca,b,c] となる。それゆえ , リストは特別な場合とならず , ほかの複合項とまったく同じように取り扱うことが 次の段階は , Dif を計算するための手続きを定義す ることて、ある。 solve の引数は , て、きる。 free in て、は , Left=Right , Arg ー Args] という形式の方程式て、あったことを思い出そう。ま Term という文て、 , 変数になりえない関数子を捨て , 最初 た , Dif 関数は Left—Right を評価することて、得られ るのは明かて、ある。さて , いったいどうすればいい の引数を Arg に , それ以降の引数のリストを Args に のだろう。 得ている。それから , Arg と Args の両方について , まず考えられるのは , Left ー Right という数式を 変数が含まれているかどうか調べればよい。さらに 渡して , 必要なときに評価するという方法て、ある。 Arg のほうは , ひとつの変数となり得るのて、 , 第 1 節 これは簡単て、ある。 X is Y とすれば , Y に具体化さ は , 再帰呼び出しを停止て、きるようにしておく。第 free in, define dif, solve fo 「を呼び出す という項は , と分解され , Arg= [ ] , Args= [ [ ] ] となって , 無限ループに陥る。このため , free in にはこの項を 明示的に調べて除外している。 続きの定義 List 1 : % solve ( し eft=Right) 2 : % 入力 : し eft=Right は自由変数を 1 っ含んだ数式である。 3 : % 出力 : 上の変数には方程式の近似解が代入される。 4 : % し eft と Right の形式は、述語 ' is ' ときの数式の形と同様である。 5 : 6 : solve (Left=Ri ght) free_in ( し eft=Right, X) , 7 : 8 : / * free- i n から、 1 つだけしか結果を受け取らない * / 9 : define-dif(), し eft=Right), solve-for (X). 12 : % free-in(Term. Variable) 13 : % Var i ab 厄は、 Tern の中に現れて、かっ、自由である。 14 : 15 : free-in(). X) % Term が変数ひとつのとき var (X). 17 : 18 : free-in (Term, X) % Term が複合項のとき Term \ = % Tern は [ ロ ] ではない [ ー , ArgiÅrgs], 20 : % Term をリストに分解 (free-in(Arg, X) 21 : : free-in(Args,X)). % Arg または Args に自由変数 X が 22 : % 存在する 23 : 24 : % define-dif(). Left=Right) 25 : % X を与えて、 Left-Right を計算する述語を定義する。 26 : 27 : define-dif(), し eft=R ight) abolish(dif, 2 ) , 28 : assert((dif(X,Dif) 29 : 明主 5 ] 演算子“ + 〃が xfyr, 2 + ( 3 + X ) と解尺されるならばこのとお りであるが , yfx で ( 2 十 3 ) 十 X と 無されるならば , 右辺は [ ' + ' , 2 十 3 , 刈になる。 主 6 ] たとえば foo(bar, zot ) という複 合項の関数子は f00 である。 % 元の定義を消去する ー Dif is Left-Right)). % 述語 dif を定義する 38 C M AGAZIN E 19 5

6. 月刊 C MAGAZINE 1990年5月号

についても , く〉の中の扱いによってふたっ ます。 うにポータブルな C 言語て書こうとすると , ・ NULL の異なった結果がて、てきてしまいます。そ 必ず 6 文字以内て、かつ大文字と小文字の区別 のため , プリプロセッシングはたいへんデ フランスの標準化委員会から , NULL は なしにしなければならないという制限があ リケートなものになってしまいます。 マクロとして残すように依頼を受けていま るわけて、す。 また , ある種類の宣言を記述するルール す。しかし , NULL を関数に対する引数と ・外部定義 が複雑て、す。実際のルールに盛り込まれて して使う状況を考えると , NULL がマクロ また , 外部定義においては , 宣言と定義 いる不規則な部分はなくてもよかったと田 を記述するルールが現在て、も非常に複雑て、 として存在しているために , いくつかの小 さな問題が発生してしまいます。ポータブ す。さまざまなルールを組み合わせるとい っています。 sizeof オペレータはかなりよいものて、す ルて、ないコードが簡単に書けてしまうのて、 う意味てはかなりいい仕事をしてきたと思 が , 例外があります。それは sizeof オペレ す。 っていますが , その結果として , たいへん ータのオペランドに rvalue を許したことて、 ・ enum ( 列挙 ) 複雑なルールになってしまいました。 す。これは決して有益なことて、はなく , 混 列挙をパスカルと同じような , より強力 ・ signal な型にすべきだという意見も , 委員会て、は 乱のもとになります。 ライプラリの中に signal 関数を残しては かなり聞かれています。 C ての列挙はそれほ いますが , それに関して私どもは何もして sizeof 'a' 〉 sizeof L'a' ど強力な型て、はなく , 整数型に対して同意 いません。というのも , signal の扱いに関 語てあると考えられるかもしれません。 しては , さまざまな OS 上て、扱いがそれぞれ また , const に対するポインタを定義して ・ BitfieIds 大きく異なるため , signal を明確に定義て、 も , それによって保証されるという意味合 Bitfields に関して , ひとつのサイズて、は きなかったのて、す。 いはほとんどありません。 なく , バラエティをもたしてはどうかとい ・その他 たぶん , このように最適化がて、きるて、あ う意見も出ています。しかし , この点はま 最後の問題点になりますが , たとえば算 ろうと考えても , それが現実のものとして だ変更していません。 術関数における errno の例や , あるいは関数 保証されていません。というのは , ほかの ・ unsigned int からのジャンプアウトということて、 , 式がほかのポインタを使ってオプジェクト C 言語の世界においては , unsigned int setjmp, longjmp もあります。また , を変更してしまう可能性があるからて、す。 と int を組み合わせて使う作業にはかなりの stdargs. h の中の可変引数 ()a arg) マクロの malloc ( 0 ) に関して , これを使って次に確 問題が発生するという経験をされているか 問題もあります。 保されるヒープの先頭を知るというような 問題の本質としてはそれほど大きなもの と思います。この問題に関しては , いくつ 方法はポータブルて、はないといったような て、はありませんが , C 言語については , 以上 かの解決策を出していますが , 基本的には たいへんばかげた議論を委員会て、重ねてし まだ問題として存在しています。たとえば , のような問題が存在しています。 まいました。そのままにしてしまえばよか 負の数字を unsigned int に加算すると正し 問題が発生した点 ったのて、すが , 結局 , 投票になって , malloc ( 0 ) い答えが出ないという問題があります。 の動作は implementation defined の扱いに ・ goto 0 リプロセッサのトークン処理に関し goto ステートメントは非構造的て、す。ス なりました。 テートメントのプロックの中にジャンプイ てのルールをて、きるだけ簡素化した 採用されなかった ンてきますが , そのため , 最適化が難しい いと考え , ルールのひとっとしてプリプロ もの という問題があります。これまて、よりも , セッサて、の数値処理のルールを決めました。 そうしたなかて、 , 0X12E 十 5 というような より大型のコンパイラ , トランスレータが れまて、 , 解決されなかったものにつ 必要になる要因て、す。 順番て、出てくる文字の場合に , 新しいルー 、いて説明してきましたが , 採用され ・外部名称 ルのために問題が発生してしまいます。 16 なかったものもたくさんあります。それら C と古いアセンプラ , リンカを組み合わせ 進数表記の場合には , とくに注意しないと はいいものかもしれませんが , 多くの人を て使ったときに外部名称が短いものて、なけ いけません。 混乱させるかもしれません。しかし私たち ればならなことが問題になります。もう少 にとって重要なものて、入っていないものが し具体的にいいますと , 外部名称をほんと #include く / * . h> フ 64 CMAGAZINE 19 5

7. 月刊 C MAGAZINE 1990年5月号

ス ) ′ 0 11 1 ーー 一ー 1 へ乙 月、 コマンド 表示 ( 数値 ) せ挙式行 書実 印刷 高橋武大 中里正阯 6 佐藤功 92 岡本吉夫 37 大谷子代子 = 山田義 ファイル ロード セープ ファイル名 . 3 訂・ ′まソを・ 朝躔に ー画面作成の基本画面 鞴型はル旧Ⅲ 2 13. 4 8 Ⅵ、 2 リれ一 縦損飾りク行数行幅刈 F Nt い i 一ⅵ .0 ー (C) 一 00 代 co.. は d. ーアプリケーションの開発を 強力にサポート 「で ~ ぐ 3 」は画面レイアウトの設言 t および作成を 行うためのツールです。イメージデータ作成のため のバターンエデイタと、文字やペクトルの線・円な どて祚成する画面作成、そして入力する項目を定義 する画面定義の 3 つのツールか用意されています。 アプリケーションの M Ⅵに必要な機能をすべてサ ポートしました。文字・数値・選択・ファイル名選 択などの単項目の入力に加え、表計算ソフトのよう に項目を並べた表形式での入力も可能です。もちろ ん上下左右にスクロールします。そして pf キー、アイ コン、コマンドなども強力な機能をサポートします。 ー画面作成 試行名部呉を繰り返し目的に沿った最適の画面を作 成できます。図形の挿入をはじめ線、円弧、ペ イントなど 1 頁の豊富なエレメントと文字て個面 を構成します。また強力な編集機能ですばやい変更 カ河能です。 16 色とバレットをサポートしています ので豊富な表現力河能です。 影ヾターンエテイタ イメージデータの作成と生成、そしてバターンの 登録などを主に行います。図 0X48 ドットの範囲内 て経意の大きさのバターンを作成します。 1 倍、 2 倍、 4 倍、 8 倍の大きさに拡大した画面てイ第成や編 集を行います。マルチフォント日 OM ポードとイメー ジスキャナからの取り込みをサポートしています。 ・体験版「で ~ ぐ 3 」を用意しました。 こ・希望の方は 1.58 円 ( 切手でも可 ) をお送りください。 ・無料バージョンアップ ( v3. 1 ) を行っています。こ・購入 の方は登録カードをご返送ください。 ー画面定義 画面作成て祚った画面を元にして文字や数値や表 形式の項目を定義します。また pf キーやアイコンの 定義では、キーを返すのか、ユーサのルーチンをコ ールするのかを指定できます。コマンドはロータス 123 の様なツリー状の機能をサポートしていますので どんなー複雑なコマンドも処理できます ー C 言語のソース生成 画面定義が終わると自動的に C 言言吾を生成します。 各レベルでユーザルーチンをコールする機能がある ので、例外的な入力処理にすばやく対応できます。 プロのイ士様に耐える機能とノウハウを盛り込みまし た。ライプラリの、レ 0 操作の関数や、項目の単独入 力などの関数を公開してますので、ユーザルーチン てイ吏用できます。 い : に孖 , い: に FF 翡 5 : 討 2 日 2 6 フォント ぐ 3 価格 58 ′ 000 円 ( 格には消は含まれておりません ) 〔イ吏用環境〕「転 c pc-ml シリーズ (pc-9801/I.n 98XA / 98LT 、 98XL / RL のハイレゾリューションモー ドは除く ) EPS•a•-•å PC -2 シリーズ。パスマウスと MS - (X)S は必す必要です。 16 色と′くレットは使用できなし があります。マルチフォントポードを使用するときは MS -8S3.3A が膨要です。 C8 語は MS C& 、 Q-nck-C 、 Lattice-C をサポート。 株式会社アークビット 〒 272 千葉県市川市ニ俣 1 -12-1 石元ビル 4F 電話 0473 ( 28 ) 1275 FAX 0473 ( 28 ) 12 ヾターンエテイタの基本画面 PC -9801 用の C ライフラリ 新発売 ・コンソール入出力・ 49 種 ・テキストウインドウ・ 4 種 以上の関数が組み込まれた強 ・グラフィック制御 20 種 力なライプラリて、 MS-C 、 ・マウスコントロール・ ・・ 16 種 TURBO-C 、 Quick-C 、 Lattice-C ・プリンタコントロール・ 6 種 て動作します。「て ~ ぐ 3 」には ・日 S -232C 制御 9 種 含まれています。詳細はカタロ ・タイマー時間制御 8 種 グをご請求ください ・文字列攫作 ・・・ 15 種 9 種 ・ PC ー 0 ライプラリ・・・・ 9.8 円 ・メモリ管理機構

8. 月刊 C MAGAZINE 1990年5月号

付録、イス収録 S-ProIog er 0 について 佐 付録ディスクに収録した S ー prolog について説明します。 Ca] : ( また S-Prolog は , エジンバラ prolog に準拠した prolog インタブリタで , 動作可能な環境は MS ー DOS です ( ただし , 付属のバイナリファイル は , 98 版の TurboC でコンバイルしてあるので , PC ー 9801 以外では動作 しないことがあります ) 。 no 次に実行をトレースしてみます。 trace という組み込み述語を用い 翻訳の割線法のプログラム•sec. pro" が入っていますから , これ ます。 を実行してみましよう。まず , コマンドラインから , ー ?-trace, append(Ca, b] A 〉 slog sec.pro@ ① と入力します。これで , S ー prolog が立ち上がり , プログラムも読み込 0 Exit trace ② append(Ca, b] まれます。まもなく Ready と表示されて , プロンプト感にが表示さ 0 Call append(Cb] ( 3 ) れます。さっそく例題を解いてみましよう。 Prolog に質問するときに 1 Call append( ロ ④ は , ツー″という記号を用います。 2 Call append( ロ ( 4 ) l?-solve(x = cos(x)) . 2 Exit append(Cb] ( 3 ) これで , 割線法のプログラムが実行され , 次のように表示されま 1 Exit append(Ca, b] ② 0 Exit Ca, b, c, d] 2 .000000 0 .765035 yes トレースを止めるには , notrace という組み込み述語を用います。 0 .742299 0 . 739 田 3 —notrace . [Found a satisfactory solution] yes S ー P 「 olog を終了するには , X ニ 0.739085 ー ?-exit. 解が求まり , 入力待ちになります。ここで別解が必要な場合は第″ を入力するのですが , この場合は必要ないので , 固キーだけを押します。 と入力します。 付属のドキュメントファイル og. doc" は次のような構成になっ すると , ています。興味のある方はこ・覧ください。 yes 【はじめに / 使用にあたって】 と表示されて実行が成功裡に終わります。実行の確認として , 本文 プログラムの版権についての表示 のいうとおり *dif" が定義されているかどうか見てみましよう。 【起動方法 / 練習】 ー ?-listing(dif) . 起動時スイッチの説明 , 実行例 と入力します。すると , 【ファイル & コンバイル】 dif( 0 , 1 ) 付属のファイル一覧と , コンバイルに関する注意事項 ー cos( 0 ) . 【文法 / 演算子 / 組み込み述語 / 工ラーメッセージ】 と表示され , たしかに定義されていることがわかります。 s ー pr 。 log の文法事項と組み込み述語の説明 もうひとつの例として , append を定義してみましよう。ノを入 【データ構造 / 制御構造】 力しない場合は , 定義が追加されます。次のように入力します。 lappend( ロ , Y, Y) . S-ProIog の実行のしくみ lappend()A は ] , Y, CA に ] ) 【組み込み述語の追加方法】 s ー prolog に新たに組み込み述語を追加する場合についての説明 では , 動作を見てみましよう。 【バグ & 注意事項】 現在確認しているバグについての記述 【参考文献 / おわりに】 その他 S ー p 「 olog の作成に要した文献リスト , te 「 log について , で , を入力する ) [c, dJ , Cc, d] , 46 ) ? 48 ) ? す。 ー append(), Y, Z) . ″を入力して別解を求めます。 PROLOG による数式の解法 41

9. 月刊 C MAGAZINE 1990年5月号

イロ入 putc ー機能要約ストリームに 1 文字出力 ( マクロ定義 ) #include く stdio . h 〉 ■用法 putc (), stream) ; ■引数 intc 書かれる文字 : ファイル構造体へのポインタ FILE * stream ー戻り値 int . 書き出した文字 ・エラー int EOF ■注意 EOF がエラーによるものかどうか調べるには , fe 「 ror を使用 fwrite ■機能要約データ ( 指定バイト長 ) を特定数だけストリームに書き込む #include く stdio . h 〉 ■用法 fwrite ( buffer, size, count, stream ) ; ■弓ー数 const void * buffer : データを格納している場所へのポインタ Size t Size : データ項目ひとつ当たりのバイト数 Size t : 書き出す項目の最大個数 FILE * stream : ファイル構造体へのポインタ ー戻り値 size t : 実際に書かれた全データ項目の個数 ( バイト数ではない ) ・エラー size t : 戻り値が count より小さくなる ー注意 stream のファイルポインタは実際に書いたバイト数だけ進む。 st 「 eam が テキストモードでオープンされている場合は , 復帰 ( CR ) を復帰 / 改行 ( CR / (F) で置き換えるが , この置き換えによる戻り値への影響はない。工ラ ーが発生した場合 , アクセス位置インジケータの値は参照できなくなる fputc ・機能要約ストリームに 1 文字出力する #include く stdio . h 〉 ■用法 fputc( c, stream ) ; ■引数 int c : 出力する文字 FILE *stream : ファイル構造体へのポインタ ー戻り値 int c : 出力した文字自身 ・エラー : 工ラーか EOF ( という値 ) かを判定するためには , fer 「 or int EOF を使用する ■注意 fput, fputchar は putc, putchar と似ているが , マクロ定義ではなく関数で ある getc ・機能要約ストリームから 1 文字読み込む #include く stdio . h 〉 用法 getc ( stream ) ; ■引数 FILE *stream : ファイル構造体へのポインタ ■戻り値 int : 読み込まれた文字 : ファイルの終わり int EOF ・エラー int EOF ・注意工ラーかファイルの終わりかを判定するには , ferro 「関数または feof 関数 を使用する。 getc は関数ではなくマクロとして定義されている rewind ・機肯皀要約ストリームのファイルポインタをファイルの先頭に移動する #include く stdio . h 〉 ・用法 rewind( stream ) ; ・引数 FILE *stream : ファイル構造体へのポインタ ・戻り値 void ■工ラーなし ■注意 fseek( stream, OL, SEEK SET ) とほば同じ ( EOF やエラ ーのインジケー タをクリアする。戻り値がない ) fgetc ー機能要約ストリームから 1 文字読み込む #include く stdio . h 〉 ー用法 fgetc ( stream ) ; ・引数 FILE *stream : ファイル構造体へのポインタ ー戻り値 int : 読み込んだ文字自身 : ファイルの終わり int EOF ■工ラー int EOF : 工ラーかファイルの終わりかを判定するためには , feof または fe or を使用 ■注意 fgetc, fgetchar は getc, getchar と似ているが , マクロ定義ではなく関数 である setbuf ー機能要約ストリームのバッフアを変更する #include く stdio . h 〉 ー用法 setbuf ( stream, buffer ) ; ■引数 FILE * stream : ファイル構造体へのポインタ : ユーザが割り当てたバッファ ( NULL の場合にはバッ char * buffer ファ化しない ) ■戻り値 void ■工ラーなし ■注意 stderr と stdaux はデフォルトではバッフアがないが , これによりバッファ 化が可能 C プログラマのためのランタイムライプラリ入門 85

10. 月刊 C MAGAZINE 1990年5月号

コンヾイラ の内部を詳解 switch 文はネストすることが可能なた識されるとブッシュ , switch 文の処理が終 けを重複チェック対象にて、きます。これら わるとポップします。このメカニズムによ め , case ラベルーーー飛び先ラベル対応テー の swit 曲文関連の関数は , stmt. c て、定義さ プルもスタック構造にして , switch 文が認 って , つねにいちばん内側の case ラベルだ れています。 switch 文のオプジェクトコード (List 2 をコンバイルしたもの ) goto 文とラベル near 最後に残るのが悪名天下にとどろく goto bp, sp 文て、す。 goto 文のラベルは , 専用のシンポ ax, word ptr —i ルテープルによって管理します。ラベルを 登録する関数は regLabeI( ) , サーチする関 数は searchLabel( ) て、す。 また , 関数処理終了時には endFunc() が , 未定義のラベルの有無をチェックし , もし未定義のラベルがあれば工ラーメッセ ージを表示します。これら 3 つの関数は stmt. c て、定義されています。 最後に これまて、 8 回にわたって , コンパイラの 仕組みについて勉強してきました。筆者に とって 8 回の連載はたいへんな長丁場て、し たが , 顧みると取り上げきれなかった話題 もたくさん残されています。これは , 筆者 の能力が至らなかったのはもちろんて、すが , コンパイラのもっ奧行きの深さを示すもの , ともいえるて、しよう。 この連載が , コンノヾイラというプラック ポックスの仕組みを理解するうえて、 , 少し て、も役立てば筆者の苦労もむくわれるとい うものて、す。苦労といえば , 私事になりま すが , まがりなりにも完結まて、こぎつけら れたのは , 家族の理解 , 協力そして辛抱の おかげて、す。この場を借りて感謝の気持ち を表したいと思います。 最後になってしまいましたが , 最終回ま て、おっき合いいただいた読者の皆様 , 本当 にありがとうございました。 なお , 来月号からはアルゴリズムとデー タ構造を解説する連載を始めます。こちら の連載もよろしくお願いします。 List 3 -4 1 1 よっ 0 -4 -. 0 C..D 行ー 8 9 0 11 っ乙っ 0 -4 - -0 C.D ー 8 0 14 っ 0 っ 0 -4 C..D 々ー 8 9 0 -1 っ 0 っ 0 4 ′ 0 6 ー 8 9 0 1 り 0 00 -4 eD ー 8 9 0 1 つな -4 -0 ー 8 1 よ、 1 1 よ・ 1 1 よ 11 1 よ 11 1 よ 1 っ 0 っ 0 っ 0 っ 0 っ 0 っ 0 ワ】っ朝っ 0 っ 0 CO っ 0 っ 0 っ 0 っ 0 っ 0 00 っ 0 っ 0 00 4 -4 4 、 4 ・ 4 -4 4 -4 4 -4 戸 0 ド 0 -- 0 ′ 0 0 戸 0 -0 ′ 0 -. 0 proc push mov ma 1 n ( 1 ) switch 文の式を評価して結果を AX レジスタに得る mov cx, cs:@2 bx, offset cs:@3 ax,cs:[bx] @6 cs: Cbx + 2] bx, 4 cs: [bx] mov mov Jne Jmp add ー 00P Jmp AX レジスタの内容でジャンプ 2 テープルをひいて分岐する case 1 : word ptr -x, 1 break,• case 2 : mov Jmp word ptr _x, 2 break,• case 100 : mov Jmp = 100 : X break; default: = 99 : X break; switch 文で break しない場合は , ( 3 ) こにくるので , このジャンプ 命令でテープル部分をスキップする ジャンプテープルのエントリ数 4 ) ( case ラベルの数と等しい ) ジャンプテープル本体 case ラベル飛び先 1 2 100 default のときの飛び先 switch 文の出口ラベル word ptr -x, 100 mov Jmp word ptr x, 99 mov JIIP JTIP 3 dw 2.08 100 , 四 010 POP ret endp _mam 76 CMAGAZINE 19 5