ソース - みる会図書館


検索対象: 月刊 C MAGAZINE 1993年10月号
77件見つかりました。

1. 月刊 C MAGAZINE 1993年10月号

の行番号を意味する。すなわちコンパイラ は , あたかも現在のソースファイルの行番 号が指定された行番号てあるかのように解 釈し , その後の処理を続けるのて、ある。ま た「ファイル名」は , これが指定されている と , あたかも現在のソースファイル名がそ こて示されたファイルて、あるかのように解 釈して処理を継続する。 のだが・・ うというような用途や , 特定のシンポルを , 実は , この指令の与える効果が何て、ある その場合に問題になるのが , トランスレ なんらかの形て、定義していなければならな かを ANSI 規格は規定していない。考えられ ータがすべてのエラーを検出て、きればよい いのに , それを定義していないことを検出 ることは , その後のコンパイル作業におい のだが , そこて、は検出しきれなかったコー してエラーにするといった用途に用いる。 て , ソースファイル中て、エラーが検出され ディングエラーが存在し , それがコンパイ たとえば , コンパイラの種別の見分け方て、 ラによって検出されてしまった場合に , コ たときに , そこて、表示されるエラーメッセ あるが , 通常はプリプロセッサがコンパイ ージには , 工ラーの内容だけて、なくファイ ンノヾイラが表示するエラーメッセージのフ ラやバージョンを識別することがて、きるよ ァイル名 / 行番号と , もともとのソースプロ ル名と行番号を表示することになるだろう うな「定義済みの識別子」を用意しているた が , そこて、表示する値をこの指令て、制御て、 グラムとの対応が取れないということて、あ め , それを利用する ( List 7 ) 。 きるということて、ある。 る。つまりエラーが発生したことはわかる また , 識別子がマクロとして定義されて また , オプジェクト内部にデバッグ情報 が , トランスレータのユーザにとっては , いるかどうかというのは , たとえば , として同様のファイル名 / 行番号といった情 ソースファイルのどこが悪くてエラーにな #if !defined (OS) 報を埋め込み , 後にデバッガがそれを参照 っているのかが判然としないのて、ある ( トラ # error Define symbol OS ンスレータのユーザは , あくまて、処理系全 したり , あるいは実行時工ラーを起こした #elif OS 場合に , OS によってはトレースパックとい 体を C 十十とか PascaI のコンパイラて、あると / * UN Ⅸ * / う処理が行われ , どのソースのどの行に対 考えていることに注意 ) 。 応するオプジェクト部分て、エラーが発生し そこて、 , トランスレータの作者は , C にト たのかを表示してくれたりするのだが , そ ランスレートした後の出力ファイルの適当 のための情報として使われることになるだ なところに , しかるべき # line 指令を挿入す こうしておけば , トランス るようにする。 ただし , このプリプロセッサ指令は , 普 レート後の C ソースをコンパイルしたとき 通のプログラミングて、は使うことはないだ もし工ラーが発生したとしても , そこ #endif ろう。普通に C て、コーディングしているかぎ て、表示されるファイル名や行番号は , もと のように用いる。 りにおいては , そのようなことを気にしな もとのソースファイルのファイル名や行番 余談だが , この #error というのは , ないと くてもコンパイラがきちんとそれらの情報 号 ( ないしはそれに近い番号 ) となり , 容易 どうしようもないという種類のものて、はな にソースとの対応を取ることがて、きる。 を管理してくれるはずて、ある。 い。要するに , 特定の条件て、エラーを起こ て、はどんなときに使うのかというと , せばよいのて、あるから , むちゃくちゃなソ error 例としては , C 十十 to C とか , PascaI to C ースを書いておけばよいのて、ある。 # error が のようなトランスレータを作るとき ( 使うと ANSI 規格になって新設されたプリプロセ なかった時代によく使われたのは , ッサ指令て、ある。端的にいえば , 工ラーを きて、はない ) に利用することになる。それ #ifndef OS 発生させる指令て、ある。オペランドに指定 らのトランスレータが生成した C コードて、 You lose. Please define symbol OS. は , 当然ながら , プログラマが直接コーデ したプリプロセッシングトークンを , あた #endif イングした C 十十なり PascaI なりて記述した のようなフレーズて、あった かもエラーメッセージて、あるかのようにし ソースプログラムとは行番号が対応しなく て表示する。たとえば , よくあるケースと #pragma なる。たとえば , C 十十て、は 1 行の記述て、済 しては , 特定のべンダの特定のバージョン むことが , C て、は数行を費やさなければなら ( 以降 ) が備える機能に依存したコーディン プラグマはコンパイラに対する , コンパ ないということもあるからだ ( 改行を入れな イラ依存の指令を与えるために用いる。た グをしているときなど , それを見分けて , ければ , 何て、も 1 行て、済むというのも確かな 条件にあっていなければ工ラーにしてしま とえば , 最適化の程度とか , 同じ最適化て、 「定義済みの識別子」を利用する LiSt #if defined(C-MAGAZINE_C) & & VERSION > : 600 # se # error Use C-magazine C version 6.0 or later #endif 1 #elif OS 2 / * M 爪Ⅸ * / #elif OS 140 C MAGAZINE 1993 10

2. 月刊 C MAGAZINE 1993年10月号

TabIe 1 ANSI 規格による C 言語のトランスレーションフェーズ分類 段階 8 7 5 4 2 6 3 1 分類 写像 , トライグラフの処理 改行の導入 , 文字セットの 実行文字集合への変換 プリプロセスの実行 論理行の構築 ンへの分解 プリプロセッシングトーク リンク コンノヾイル 文字列定数トークンの連結 内容 物理的なソースファイルの文字を , 必要に応じてソース文字集合 (Source character set ) へと写像する ( ここで , 行末を示すために改 行文字を導入する ) 。トライグラフを対応する 1 文字の内部表現で置 換する。 改行文字の直前にバックスラッシュ文字が置かれていたら , それら をともに削除し , 物理的なソース行をつなきあわせて , 論理的なソ ース行を形成する。空ではないソースファイルは改行文字で終了し ていなけれはならず , かっ , その改行文字の直前はバックスラッシ ュ文字であってはならない。 ソースファイルをプリプロセッシングトークンと空白文字の並びに れにはコメントが含まれる ) へと分解する。 ソースファイルは , プリプロセッシングトークンやコメントの途中 で終了してはならない。それぞれのコメントは , ひとつの空白文字 に置き換える。 プリプロセッサ指令 (preprocessing directives) を実行し , マクロ 呼び出しを展開する。 # include プリプロセッサ指令があれば , 名前 が指定されたヘッダあるいはソースファイルに対して , 上記フェー ズ 1 から 4 のそれぞれを適用する。 文字定数ないしは文字列定数内の , ソース文字集合の要素とエスケ ープ表現が , それそれ実行文字集合 ( Execution characterset) の要素へと変換される。 隣接する文字列定数トークンを連結する。また , 隣接する幅広文字 列定数トークンを連結する。 トークンを区切っていた空白文字は , これ以降は意味を持たない。 それぞれのプリプロセッシングトークンを , トークンへと変換する。 その後 , トークンを構文的 , および意味的に解析して , 翻訳を行う。 外部のオプジェクトおよび関数への参照を解決 (reso ⅳ e ) する。現翻 訳単位では定義していない関数およびオプジェクトへの外部参照を 充足するために , ライプラリの構成要素を結合する。そのような翻 訳系の出力をすべて集めて , プログラムイメージを形成する。この プログラムイメージは , その実行環境において実行に必要な情報を 備えている。 たとすると , そこに記された文字列を構成 する各文字の文字コードは EBCDIC て、ある。 ところが , 実際に実行するときには ASCII コ ードに従って文字列の出力を行わなければ 正しい結果が得られない。プログラマはあ くまて、、、 he110 , world" という文字列が出力さ れることを望んだのて、あり , それがどのよ うなコードて、書かれているかは間題にして いない ( はずて、ある ) 。そのためには , どこ かの段階て、コード変換をしなければならな ただし , コンパイルするマシンと実行す るマシンが同じ場合など , ふたつの集合が 同じて、あれば , そのようなコード変換は不 要て、あり , フェーズ 1 の大部分とフェーズ 5 は行う必要がなくなる。ただし , ANSI 規格 136 C MAGAZINE 1993 10 の規定を忠実に解釈すれば「自分と同じ文字 に変換する」という作業が入ると考えること になろうか。 それから , フェーズ 1 の中に「行末を示す ために改行文字を導入する」という部分があ る ( 原文は「 introducing new-line characte rs for end-of-line indicators 」 ) 。何のこと か一見意味不明かもしれない。これは大型 機などて、 , パンチカード環境て、プログラム を入力するケースを想定したものと思われ る。パンチカードの場合には , 改行文字と いうのはとくに存在しないのが普通て、ある。 なぜならば , 行が変わったことは , カード が変わったことによって自明だからて、ある。 そうして , パンチカードによる入力をその ままファイルに落とすと , 1 行 ( たとえば ) 80 文字の固定長として表現されることが多 い。そのような場合には , まずトランスレ ーションフェーズの 1 において改行文字を挿 含めることがて、きるだろう。一方 , フェー 4 まて、は , プリプロセッサと呼ばれる範囲に ことにすると , 上記フェーズ 1 からフェーズ ッサフェーズというものを仮定して考える ということて、 , 慣例に従ってプリプロセ を用いることにする。 定着してしまっているのて、 , ここてもそれ プリプロセッサ指令という用語はある程度 が独立しているものと考えることは多く , ただ , 慣例的にプリプロセッサというもの シング指令とするのが正しいのて、あろう。 指令」と訳すのも誤訳て、ある。プリプロセッ reprocessing directive 」を「プリプロセッサ セッサ」と名づけたのは間違っているし , 「 p その意味て、は , 今回のテーマを「プリプロ て、ある。 べしと定めていたとすると都合が悪いから リプロセッサ」なるものが独立して存在する だろう。そのような場合に , ANSI 規格が「プ るコンパイラベンダが出てくることもある どというものを独立させたくない , と考え ンパイラ構成上の都合て、プリプロセッサな なっている。それは当然かもしれない , コ コンパイル処理全体に組み込まれて一体と 在することを前提にしているわけて、はなく , プロセッサという独立したプログラムが存 の規定はない。つまり , ANSI 規格て、はプリ こからどこまてがプリプロセッサて、あるか 行 , マクロの展開などの概念はあるが , ど サトークンとか , プリプロセッサ指令の実 かりのように , ANSI 規格て、はプリプロセッ 以上のフェーズ分割をご覧になるとおわ プリプロセッサの守備範囲はどこか この点については後ほど論じたい プリプロセスの特徴のひとつなのて、ある。 トークン」という概念の導入が ANSI 規格の いただきたい。実は , この「プリプロセッサ てきて , 使い分けられている点に注目して と , ただの「トークン」という言葉が両方て、 もうひとっ , 「プリプロセッサトークン」 入せよ , といっているのて、ある。

3. 月刊 C MAGAZINE 1993年10月号

C コンバイラ さらにグレ セ = ナー中 『 C プログラミング 技術養成コース』 開催場所 . 東京 ・詳しくは、営業企画部 までお問合せ下さい。 An Optimizing ( Cross CompiIer ・ ANSI 標準規格に準拠した 8080 / 8085 / Z80 / 64180 のソフトウェア開発をサポー トする C クロス・コンパイラ。レジスタの自動割り付け。 ROM 化に最適。 ■コンパイラ走行環境 : MS-DOS ver. 2.11 以上、メモリ 384KB 以上必要。 ・供給メディア : 5 " 2HD 、 3.5 " 2HD 他。 ・価格 98 , 000 円 ー。囘圄 An Optimizing ( CompiIer ■ ANSI 標準規格に準拠した 8086 のソフトウェア開発をサポートする C コンパイラ。 アセンプラ、リンカ、標準装備。 ROM 化のための初期設定モジュールのソース 付き。 ■コンパイラ走行環境 : MS-DOS Ver. 2.11 以上、メモリ 384KB 以上必要。 ・供給メディア : 5 " 2HD 、 3.5 " 2HD 他。 ・価格 48 , 000 円 Debugger FO 「 [ 引 ( -80 ■ LSI C -80 て、開発したソフトウェアのデバッグ環境を、 MS - DOS 上て、実現するた めのソースレベル・クロスデバッガて、す。ソフト開発の生産性が向上します。 ・デバッガ走行環境 : MS-DOS Ver. 2.11 以上、メモリ 384KB 以上必要。 ■対応機種 : NEC PC -9800 シリーズ ( XA , XL, XL,2 RL のハイレゾリューション モード含む ) 、 PC - H98 シリーズ、 EPSON PC -286 シリーズ、℃ -386 シリーズ、 PC -486 シリーズ。 ■供給メディア : 5 " 2HD 、 3.5 " 2HD ■セット価格 128 , 000 円 (LSI C-80 + LDB-80X) LDB-80X は LSI C -80 専用デパ、ツガのため、単体売りは致しません。 LSI C -86 体験 ( 試食 ) 版が、下記ノヾソコン通信でダウンロー ドできます。 日経 M Ⅸ :lsi. J 会議 NlFTY-Se 「 ve : FLABO 当↓ = ~ 0 = ・アイジ 0 株式会社 〒 151 東京都渋谷区千駄ヶ谷 1 丁目 8 番 14 号 谷 ( 03 ) 3404 ー 1341 ( 代 ) ・ FAX ( 03 ) 3478 ー 0576 ※表示価格に消費税は含みません。 ※ MS ー DOS は Mic 「 050ft 社、 Z80 は z ⅱ og コ nc. , 日経 M Ⅸは日経 BP 社、 NlFTY-Serve はエヌ・アイ・エフ株式会社の それぞれの商標です。その他、 CPU 名、製品名等は一般に各開発メーカーの商標です。 く資料請求番号 F03 〉

4. 月刊 C MAGAZINE 1993年10月号

exe ウードプロセッサ TeX は , もともとスタンフォード大学の Knuth 先生が自分の著作を電子出版するた めに作ったものて、す。 TeX という文書整形 システムて、は , 表や数式の入った文書を扱 うことがて、き , 活字を組んだのとほば同等 な仕上がりが期待てきます。 実際 , TeX を使って作成された本や論文 集が多数作成されており , 複雑な数式の入 った文書を活字に組む職人が次第にいなく なることを考えると , 今後ますます用いら れる機会が多くなると思われます。 原稿を作成する側から考えると , 原稿か ら活字を拾う際に生じるエラーがなくなる ため , 校正の手間が格段に減ります。実際 , プレビューアを使って , 仕上がりと同様な ものをディスプレイて、見て , 原稿の手直し がて、きます。また , ひとつの原稿を , さま ざまなスタイルて ( たとえば , 投稿論文な eX について どこが訳注て、 , どこが引用文献て、 , どこが 原稿に , どこがセクションの始まりて、 , し , 出版者側て行うこともてきます。これ これは , 著者の側て、行うこともて、きる ら , それの規定にあった形式に ) 出力て、きま は , す。 文書のソースと表記します ) 。 あたります ( 以下 , TeX のテキストのことを 理する文書の原稿はプログラムのソースに TeX がコンパイラだとすれば , TeX が処 て、文書の原稿を書くということになります。 情報 (TeX のテキスト ) を書くことが , TeX ていくかを TeX コンパイラが決めるための ープロてす。一方 , どのように活字を置い 置いていく情報をそのまま作成するのがワ 情報はほとんど扱いません。いわば活字を 普通のワープロて、は , そのような意味の のて、す。 て・・・・・・という情報が入っているからて、きる 数式て、 , どの文字がどれのサプスクリプト この文書のソースには , 文書に現れる文 字だけてなく , いろいろな情報が入ってい るものなのて , それを作成するには , 単な るワープロより余計に手間がかかります。 また , コンパイラのソースを書くようなも のて、すから , どうしてもマニュアルが必要 て、す ( C て書くなら , C のマニュアルが必要な ように ) 。 TeX のソースを書くのは , C のソースを書 くようなものだといいましたが , 簡単な普 通の文章のソースを書く場合は , 普通のワ ープロて、文書を書くのとあまり変わりませ ん。たとえば , plain TeX<, 、、 Hello wor ld ! 〃という 1 行だけからなる文書のソース は , Hello world! *end て OK て、す ( \ て、始まる部分は , TeX のキーワ ードて、す ) 。 長い文章は , 見やすいように適当に改行 を入れて書きます。この改行は , て、きあが りの文書の改行とは無関係て、す。段落の切 れ目には , 空の行を入れます。ジャスティ フイケーションや , 行末て、ハイフンにより 単語を切ることは , 自動的に TeX がやって くれます。ふたつ以上の空白をあけても , それはひとつの空白と同じに解釈されます (C などのソースと同じ ) 。 数式て、簡単な例として , 円の方程式は , $ xA2 十 yA2 と書けます。 は上っき (superscript) を , 、、 $ $ クて、挟まれた部分は数式を表します ( x や y は , 式以外の本文におけるのとは異なっ たフォントが , 上っきの 2 は自動的に小さな フォントが用いられます ) 。 一方 , C のプログラムのソースと同じよう に , 引数つきのマクロを使うことがて、き , これをうまく利用すると , 入力の手間を大 幅に減らすことがて、きるのて、 , ワープロを 使うよりも TeX て文書を作成するほうがめ んどうとは , 一概にはいえません。 また , TeX< 作成されるようなハイクオ リティの文書を普通のワープロて作ろうと すると , 余計に手間がかかるてしよう ( とく 「 2 $ に , 複雑な数式の入った文章ては ) 。ギリシ ャ文字や数学記号はキーワードを使って表 し , たとえば〃は , "*alpha" と書きま す。 TeX には , 通常 , 工デイタは付属してい ませんから , コンパイラのソースを書くと きのように , 適当なエデイタて、文書のソー スを書くことになります。 TeX は , フォントのデータをディスクな どから取り込んて , 出力するようになって いて , 本来 , 画像や曲線を描く機能はあり ません。これに関しては , LaTeX のように いくっかの曲線や線分を組み合わせて , 簡 単な図形が描けるようにしたり ,PostScrip t 画像やビットイメージなどをほかのソフト て、作って組み込めるようになっているもの などがあります。 一方 , 日本語て、は , とくに高解像度のプ リンタに対して各種フォントを取り揃える ことは , データの量からも , 速度の点から もよい方法とはかぎらず , うまくプリンタ の内蔵フォントを取り込めるようにするこ とも (TeX のもともとの趣旨に反するかもし れませんが ) 実際には考慮の対象となりま す。 eX2 バイラ TeX のコンパイラは , Knuth 先生によっ て , WEB という言語て書かれています。これ は , プリプロセッサ tangle と weave を通すと , TeX コンパイラの Pascal のソースとプログ ラムのドキュメント ( 文書の TeX ソース ) が それぞれ作成されるというおもしろいものて、 す。その後 , C にも書き直されました。 これらはフリーてすが , 多くのメモリを 必要とするため , そのままては 8086 系の DO S ては動かすことがてきません。 DOS 上て動 かすために , さまざまな工夫が必要て , DO S 上て動くようになったものとしては , Mic roTeX, PC-TeX, DosTeX, pubTeX, S BTeX, emTeX などがあります。最初のふ たつは市販品て最初に作られ , あとの四つ はフリーてす。 特集 TeX 41

5. 月刊 C MAGAZINE 1993年10月号

はなく , "plain. bas" を作っている人は、、 & m f クの代わりに & plain クとします。すると , 次のような画面が現れます。 This is METAFONT, C Version 2.7 、、 * ″はプロンプトて、す。ここからメタフォ ントのコマンドを入力していきます。これ は , fThe METAFONTbook 』 (Addison W esley Publishing Company) に載っている 例て、すが , 次のように打ち込んて、みてくだ * drawdot ( 65 , 70 ) ・ * drawdot ( 35 , 70 ) ; てリターンキーを押すと , またテキスト画 わり , おもしろい ( ? ) 絵が現れます。 入力すると , 画面はグラフィックに切り換 ーンキーを押します。最後の、、 showit : 〃を うにしてください。セミコロンの後てリタ 各行の終わりのセミコロンを忘れないよ * showit ; * draw ( 20 , 4 の .. ( 50 , 25 ).. (80, (0) ; と入力します。 * end 面に戻ります。終了するには , 70 C MAGAZINE 1 3 10 X 関係の話題が出ているポードて、 , ftp て、き 通信しか利用て、きないという場合には , Te りにくいかもしれません。もし , パソコン のが多く , パソコン通信て、は直接は手に入 ftp site にアクセスしないと入手て、きないも れらのものはネットワークを通じて海外の ーヴァナーガリー , タイ文字などて、す。 ル文字 , ギリシア文字 , アラビア文字 , デ のためのものがあります。たとえば , キリ の言語以外のさまざまな言語や各種の記号 メタフォントソースを発表しており , 欧米 オント以外にも , これまて、に , 多くの人が になります。 Knuth の ComputerModern フ あればどんなフォントて、も利用て、きるよう てしまえば , あとは , ソースファイルさえ 一度メタフォントソースの使い方を覚え そのほかのメタフォントソース る人に頼んて、みるというのもひとつの手段 て、しよう。 さて , 筆者自身もそれほど多くのメタフ オントソースを試してみたわけて、はないの て、すが , 自分の専門の関係て、いくつか自作 した , あるいはほかの人々と共同て、作った メタフォントソースがありますのて、 , それ を紹介しておきましよう。 ・ TSIPA 音声記号 ( 国際音声字母 ; IPA) メタフォントソース十 LaTeX て、使うため のマクロ。作者 : 小林肇 , 白川俊 , 福井 玲。 PC-VAN SSIENCE OSL # 629 。 ・ KoreanTeX ハングルメタフォントソー ス十 LaTeX て、使うためのマクロ。作者 : 福井玲。 PC-VAN SSCIENCE OSL # 自分でメタフォントソース を作る 自分て、メタフォントソースを書くには , Knuth の『 The METAFONTbook 』をひ もとく必要があります。今のところ ( ' 93 年 8 月 ) 邦訳はまだ出ていません。 日本語の文献て、このことにふれたものと しては , 大野義夫編『 TeX 入門』と , 磯崎 秀樹「 LaTeX 自由自在』がありますが , あ 784 。 Fig. 17 floppy. mf によって描かれる図形 まり詳しいものはまだありません。 List 13 にごく簡単なメタフォントソース の例をあげておきます。これは Fig. 17 のよ うなフロッヒ。ーディスクの絵を描くものて、 す。これを見ればわかると思いますが , メ タフォントソースの基本的な構造は次のよ うになります。 ①定数の設定 ( フォントの寸法を含む ) こて、は解像度に依存しない寸法て、記述 します ② mode setup これによって mode =... て、指定した出力 装置に応じた種々の設定が行われます。 またこのあたりて、 , 必要に応じて define pixels ( ) などのマクロによって , 任意の コラム 2 縦線の怪 ? dviout/dviprt の開発が行われている PC- VAN の SIG SSCIENCE て、 , dviout て、プレ ビューをしていると諏一部のフォント を表示させるし妙な縦線みたいなものが 表示され , 様子がおかしいという報告が複 数の方から寄せられましな。 問題を起こすフォントは cmtt8 や cmitt10 て、 , その中て、い M ″などの文字が含まれる部 分て、このようなことが起きることがわかっ てきました。 そこて、 , 詳しく調べてみたら , オリジナ ルの modes. mf に含まれる、、 bitgraph" の設定 て : blacker =. 55 となっているのが問題 て : これを blacker =. 2 程度に直すとこのよ うな問題が起きないことが判明しました。 今回の付録ディスクに含まれる modes. mf て、 はこの点は修正してあります。ただし , 解 像度を bitgraph の 118 より低くすると ( たと えば 85 ) 、 blacker を調節してもうまくいか ことがあります。 なぜこのような問題が起きるかて、すが , これは ComputerModern フォントのソース がこのような低解像度に完全には対応して いないとしかいいようがありません。 なお , TeX 用のフォントを「回覧」などの 方法て、配布している場合に ,bitgraph 用の p k フォントカ市 lacker =. 55 のままて作られた ものが出回っていることもあるようて、す。

6. 月刊 C MAGAZINE 1993年10月号

これらは C コンパイラて、いうと , コマンド バーションの C コンパイラに当たり (Turbo C て、は tcc. exe) , MicroTeX とか , PC-TeX というのは Lattice C, MS-C, Turbo C な どの違いのようなものて、 , 文書のソースを 処理したときに , 本質的に異なるものが作 られるわけて、はありません。 C コンパイラは , たとえば printf ( ) という 関数を使ったソースを処理しますが , コン パイラ自身が printf( ) の関数の意味を知って いるわけてなく , C のライプラリにすて、にコ ンパイルして収められている printf ( ) をリン クして , それに任せるように処理するだけ て、す。一方 , printf ( ) 自身も , そのソースは C て、書かれていて , あらかじめ C コンパイラ て、処理されてライプラリに収められている わけて、す ( アセンプラなども使っているかも しれませんが ) 。 つまり , よく使われる関数は , そのたび にコンパイルするのて、なくて , あらかじめ コンパイルしてライプラリにしまってある わけて、す。そして C て、は標準の関数とその働 きは決まっていて , どの C のシステムて、も同 じように使うことがて、きます。 これらのことは TeX のコンパイラて、も同 様て、す。ただ標準の関数というものが決ま っているわけて、はなくて , いくっかの異な ったライプラリがあるようなものて、す。 pla in TeX, AMS-TeX, LaTeX などというの は , いわば C のライプラリ ( のソース ) に当た るものて、す。 通常は , これらをあらかじめコンパイル した形て、しまっておき , 必要なときにそれ をインクルードして文書のソースをコンパ イルするわけて、す。て、すから , たとえば pla in TeX のソース ( 普通 , マクロと呼びます ) と , 文書のソースとは本質的に差はなく , それらをつなげたファイルを作ってコンパ イルすれば , より時間はかかりますが , 同 じ結果になります。 もともとの TeX コンパイラは , initex と v irtex というふたつのプログラムからなって います oinitex は , plain. tex などのマクロを 読み込んて、処理し , 高速読み込みがて、きる 42 C MAGAZINE 1993 10 フォーマットファイル ( 拡張子が fmt となっ ているファイル ) として出力します。 virtex は , このフォーマットファイルと文 書のソースを読んて、 , dvi ファイルを作成す るプログラムて、すが , フォーマットファイ ルを読み込んだ実行ファイルを作る ( プリロ ードといわれる ) こともてきるようになって います。そうすれば , plainTeX や , AMS ー TeX , LaTeX などの実行ファイル ( プログ ラム ) がて、きます。 C のコンパイラは , ソースをコンパイルし て , 拡張子が obj という汎用的な ( すなわち , コンパイラに依存しない ) オプジェクトに変 換します。 TeX のコンパイラは , 文書のソ ースをコンパイルして , dvi(DeviceIndep endent) ファイルに変換します。 この dvi ファイルは , TeX のコンパイラ (MicroTeX, emTeX など ) や , マクロ (pla in TeX, LaTeX など ) , ド ( パソコン か , 大型のマシンか ) , あるいは , 最終的に 出力するプリンタとか画面とかに依存しな い , 共通の形式になっています。具体的に は , 各ページのどの位置にどのフォントの どの文字を置くかという情報がおもに入っ ています。位置はたいへん高い精度て、指定 されているのて、 , 高性能 ( 高解像度 ) のプリ ンタて、も誤差が問題になることはありませ ん。実際 , 長さの単位は , TeX 内部や dvi フ ァイルて、は sp ( スケールドボイント ) が用い られており , 65536SP = lpt = 0.3513mm て、 , 長さは 4 バイト整数て、表現されます。 TeX コンパイラて処理したあと , 実際に プリンタて、打ち出したり , 画面て、見たりす るには , デバイスドライバというプログラ ムを使います。これは , dvi ファイルを読ん て、出力機器に合わせて , 必要な解像度の文 字のラスターデータ ( ビットイメージデータ ) をファイルから取り込み , その出力機器に あった出力を行います。 dvi ファイルはハードに依存しないのて、 , たとえばパソコンて、作成した dvi ファイルを ニコンに転送して高性能のプリンタて、打 ち出すというようなことも可能て、す。 TeX は基本的には , 文字のフォントデー タのファイルを使い , ( 本来は ) いわゆるプ リンタの内蔵フォントを用いないのて、 , の点て、も機種依存性が少なくなっています。 日本語〒 eX TeX は今まて、人手に頼っていた組版作業 をコンヒ。ュータ化するものて、した。日本て、 は日本語も ( すなわち 2 バイト文字が ) 扱える ように拡張しようと努力がなされ , 日本語 が扱える TeX が作られました。 現在 , 主としてふたつのものが使われて います。それは NTT 版 jTeX と , アスキー日 本語 TeX て、す。どちらもフリーて、すが , 思 想はかなり違っています。 前者は , 内部構造をいじらずに , マクロ のようなて、きるだけ外側の変更て、済まそう という考えが基本になっています。 TeX の フォントファイルは通常 256 ( または 128 ) ま て、しか文字を持たないのて、 , ひとつの 2 バイ ト文字のフォントを , JIS コードに応じて何 十もの別のフォントに分割して対処してい ます。ひとつのフォントを多くに分割して いるため , 同一のフォントの中て、定義され ている処理が扱えなくなります ( たとえば , 特定のふたつの文字が組み合わさった場合 の処理 ) 。 作成される dvi ファイルは , 従来の TeX の ものと同じ仕様なのて、 , フォントファイル が存在すれば , 従来の欧文用のデバイスド ライバて、出力することがて、きます。 後者は , TeX のソースレベルから日本語 に適合するように書き直すという考えのも のて、す。 そのため , 日本語特有の種々の問題に対 応て、き , 機能も自由に拡張て、きます。フォ ントファイルや tfm ファイルも 2 バイト文字 用のものを独自に作って使っています。前 者は , JXL4 フォーマットと , 後者は JFM フ ァイル ( 拡張子は , 同じ tfm ) と呼ばれていま す。この日本語 TeX の dvi ファイルを扱うに は , デバイスドライバも拡張しなければな りません。ただし , 英文のみの文書のソー スの場合は , 作成される dvi ファイルは従来

7. 月刊 C MAGAZINE 1993年10月号

プリプロセッサ mo 祀 第 21 回 きたあきら C 言語において , 忘れてはならないのがプリプロセッサである。 また , 意外に知られていないようだが , AN 規格により , も っとも大幅な仕様変更を受けたもののひとつかプリプロセッサ なのである。今回はプリプロセッサについて考察する。 そもそもプリプロセッサとは C がプリプロセッサを備えることは , いう まて、もないだろう。ひとことて、いえば , C の ソースの中て、 , 、、 # クて、始まる行がプリプロセ ッサに対する指令て、ある。ただし , プリプ ロセッサはとくに C にかぎった概念て、はな い。プリプロセッサとは , pre-processor, すなわち本来の主処理 (main process) の前 (pre) に別な処理を行う処理系 (processor) のことて、ある。そこて、処理する対象も , C の 場合はソースプログラムだが , これにかぎ られるわけて、はなく , 本来は処理て、きる対 象て、あれば何て、もよい K&R の場合 , プリプロセッサは必ずしも C 言語の一部て、あるとは考えられていなかっ た節がある。そもそも , K & R 第 1 版の言語リ ファレンスの記述において , プリプロセッ サの機能の説明は , 相当いい加減て、あった。 そのため , 後て、詳しく述べるが , プリプロ セッサにはかなりの方言が生まれてしまっ どうもプリプロセッサの重要性を一段 低く見ていたのて、はないかという疑いが生 じてしまう。すなわち , コンパイルという 主処理が提供しているのが「本来の C 言語」て、 あり , プリプロセッサはそこに備わってい いくつかの機能を提供するための方 便として使うのだという認識だったのて、は ないかと思われる。 これは , UNIX 上にインプリメントされた 初期の C コンパイラ ( そして , UNIX のコン パイラて、は , 現在て、も大部分 ) が , プリプロ セッサ部のみを独立したプログラムとして , C て、記述されたソースファイルを , 最終的な 実行形式・・・・・・ロードモジュール・・・・・・の形へ と変換していく過程て、の独立したフェーズ として取り扱っていたことと無縁て、はない だろう。 逆に , プリプロセッサは , このような経 緯て、成立しているため , それが提供してい る構文的な機能も , C 言語そのものとは ( あ る程度 ) 独立に提供て、きるという強みがあ る。たとえば , あたかも新しい制御構造な どが備わったかのような機能を提供するこ とがて、きる。 ANSI 規格における プリプロセッサの位置づけ さて , ANSI 規格においては , プリプロセ ッサはどのような位置を与えられているの だろうか。それを理解するためには , ANS I 規格がコンパイル作業 (ANSI 規格て、は Tra nslation と呼ぶ ) をどのようにフェーズ分割 しているかを調べる必要がある。 AN 規格のトランスレーション フェーズ分類 ANSI 規格の規定によれば , C プログラム の Translation( コンノヾイル作業 ) は Table 1 に示す 8 段階に分解される (ANSI 2.1.1.2 Translation phases) 。処理系の実際の処理 の都合上 , いくつかのフェーズを統合して しまうことはあるだろうが , それて、も , 「あ たかもこの 8 段階のフェーズが存在するかの ように」処理をしなければならないことにな っている。 さて , このフェーズ分割については , 若 干の補足説明を要する部分があるだろう。 まず , ANSI 規格て、は文字集合をふたっ規 定している。ソースファイルが書かれる文 字集合て、ある「ソース文字集合」と , 実行時 に用いられる文字集合て、ある「実行文字集 合」て、ある。 これはクロスコンパイルの可能性を考慮 したものて、あることはいうまて、もない。 2 種 類の文字集合として , いちばんありそうな 可能性は , ASCII( および , それをベースに 拡張した ) 文字集合と , EBCDIC 文字集合が 考えられる。 EBCDIC 文字集合を使っている マシン ( 多分メインフレーム ) の上て、 , ASC Ⅱ文字セットを使っているマシンて、実行させ るプログラムをクロス開発するような状況 を想像してほしい。その場合には , ソース ファイルて、は EBCDIC コードて、書かれる。そ の中に puts('hello, WO 日 d つ・ などという関数呼び出しを伴う式文があっ ANSI C ー more 135

8. 月刊 C MAGAZINE 1993年10月号

defined を用いれば簡潔に書ける 2 種類のマクロの例 List List / * オプジェクト風マクロの例 * / #define EOF #define Sign0n ” Hello, world ” #de f i ne D i g i t #define f00 bar #define NL putchar('\n') / * 関数風マクロの例 * / #define addl(n) ((n) + I) #define sqr(x) #define PRINT(val, fmt) printf(#val ' #if defined(ANSI) & & defined(UNIX) & & defined(SYSV) / * ANSI & & UNIX & & SYSV . #endi f BSD 系 UN Ⅸの C ソースでよく見かける記述 LiSt (val)) #fmt, / * これは ANSI 準拠ではない * / #ifdef LITTLE_ENDIAN / * LITTLE_ENDIAN が定義されている * / #else LITTLE_ENDIAN / * LITTLE_ENDIAN は定義されていない * / #endif LITTLE_ENDIAN マクロ定義されていれば , 正しい再定義 LiSt #define F00 / * comment * / ( x + Y ) / * another comment * / $define F00 ( / * comment * / x + Y / * more comment*/ ) #define BAR(x) ( x ) + 1 $define BAR( x ) ( / * comment * / ( x ) + 1 対応関係を明示したい場合はコメントで示す List / * こうすれば AN 準拠である * / #ifdef LITTLE_ENDIAN / * LITTLE_ENDIAN が定義されている * / #else / * LITTLE_ENDIAN * / / * LITTLE_ENDIAN は定義されていない * / #endi f / * LITTLE-ENDIAN * / 再定義として許されない例 LiSt #define F00 (x + Y) / * 空白を除去した * / #define F00 ( y + x ) / * マクロ本体のトークン順序が異なる * / ( ( y ) + 1 ) / * マクロ引数名が違う * / #define BAR(Y) ( (x) + 1 ) / * 空白が挿入されている * / #define BAR(x) ロ名を再び # define て、指定して別の定義を与 その定義が破棄される。指定した識別子が は識別子がマクロ名として定義されていな えることは実質的にはて、きない。たとえば , マクロ定義がされていなかった場合には , ければ , 引き続くソース行をコンパイルし 次の例を考えてみよう。まず , 単に何もしないだけて、エラーにはしない もし条件が成立しなければ , 引き ていく。 #define F00 ( x 十 y ) 続くソース行はコンパイルせずにスキップ 件コンノヾイル #define BAR (x) ( (x) 十 1 ) していく。条件コンパイルが終了するのは , とマクロ定義を行ったものとする。その後 , 条件コンパイルを開始するプリプロセッ #endif List 2 のような定義を行ったとしても , すべ サ指令は 3 種類ある。なお , ANSI 規格て、は というプリプロセッサ指令が出現したとき て正しい再定義て、ある。つまり , 実質的に 条件コンノヾイノレ (conditional compilation) て、ある。 同じ定義を繰り返しているとみなされる。 という言葉は使わず , conditional inclusion さらに , 次の二つの制御指令がある。 関数風マクロの場合 , マクロ引数リスト #elif 定数式 ( 条件取り込み ) という用語を用いている。 の中に余分な空白を挿入するのはかまわな 実際には , 必ずしもコンパイルの対象とな #el se い。逆にマクロ引数リストからは空白を除 らないソースを取り込むこともあるため , 最初の # elif は , else if の意味て、あり , 直前 厳密には ANSI 規格の用語のほうが正しいの にテストした条件コンパイルの条件が成立 去してもかまわない しかし , 定義そのものの場合には , 空白 かもしれない。しかし , 条件取り込みとい していて現在コンパイルが行われていたな がないところに挿入してはならず , 逆に空 う用語は一般的て、はないのて、 , ここて、は条 らば , 対応する # endif まて、スキップすること になり , 逆に直前の条件が成立せずにスキ 白があったのを削除してしまってはならな 件コンパイルと呼ぶことにする。 い 0List 3 に示すのはいずれも再定義として ップしている最中に出会った場合には , 新 #if 定数式 許されない例てある。 たに定数式を評価し , その結果が 0 て、なけれ #ifdef 識別子 もし , どうしてもあるマクロ名の定義を ば引き続くソース行をコンパイルしていく #ifndef 識別子 変更したければ , # undef を用いればよい ことになる。 0 て、あれば , 依然としてスキッ 最初の形式は , 定数式を評価し , その結 #undef 識別子 果が 0 て、なければ引き続くソース行をコンパ プを続ける。 #else のほうは , スキップ中に これによって , オペランドに指定した識 イルしていく。 2 番目の形式は識別子がマク この指令を見つけると , 引き続くソース行 別子がもしマクロ定義されていたとしたら , のコンパイルを行う。もし直前の条件が成 ロ名として定義されていれば , 3 番目の形式 138 C MAGAZINE 1993 10

9. 月刊 C MAGAZINE 1993年10月号

プログラムの変化に対応でき るドキュメント作成システム マイクロドック V3.0 プログラムソース付き¥ 48 , 00 L2 セジュー 4 ー C ソースメイン第 をリュール名 - し 1 インクルードファイルー表 れ・ド 1 村ーファイ 4 名 L4 グ 0 ーバ、 - 表 ドキュメントデそプログラム そジ議ールー インク 4 ードフイル使用ー継 ′ローバ 4 ー第一、を : 恥ずかしながらドジりましオ DOJI ティスクサービスについて : ANSI C ー more ANSI CZATU : C 言語雑学講座 本誌付録ディスクに収録した TeX システ BOHYOH : プログラミング道場 ムはディスク容量の都合上 , 必要最小限に : X68k 活用講座 X68K 機能を限定したものてす。ついては , 24 ド APPARE : あつばれご意見番 PUZZLE : C マガ電脳クラブ ット JIS フォント , 118dpi 欧文文字フォン ト , plainTeX, LaTeX などのディスクサ NIWA : 迷走プログラミング ービスを準備中て、す。 TeXi•イスクサービ : インフォメーション INFO スの詳細は次号 11 月号に掲載いたします。 READ. M E 参照ユーティリティ 本誌掲載プログラム 本誌 ' 92 年 5 月号「新 MS ー DOS プログラミ ・旧仕 & ℃ : 特集 TeX ング入門」て紹介した READ. ME 参照ューテ イリティの実行ファイル (READM. EXE) を MAC Welcome to Macintosh UNDOC : MS ー DOS 非公開情報詳説 README と同じディレクトリに収録しまし た。付録ディスクをセットしたドライプに : A 級 B 型 C 十十入門 ABCPP カレントを移し .README@て、README フ : ゲームプログラミング大作戦 GAME ァイルが画面に表示されます。 LESSON : プログラミングレッスン Fig. 1 収録ファイル ・ No. 1 ティスク 付録ティスクについて ( テキストファイル ) R EA D M E READ. ME 参照ユーティリティ ( 実行ファイル ) README. EXE ・ EastWind 版日本語 TeX( 自動解凍圧縮ファイル ) TEXMAIN. EXE ・ dviout/dviprt( 自動解凍圧縮ファイル ) DRIVER. EXE ・ ・・ PC ー 9801 用ファイル ( 自動解凍圧縮ファイル ) PC98. EXE フォーマットトランスレータ「 Japan2HD 」くティレクトリ > JAPAN2HD く D 旧 > ・ No. 2 ティスク ・・ PC / AT 用ファイル ( 自動解凍圧縮ファイル ) PCAT. EXE ・ FK 日版 METAFONT ( 自動解凍圧縮ファイル ) MF. EXE ・・ ・・フォントファイル自動生成 ( 自動解凍圧縮ファイル ) MFBATCH. EXE ・・ ・・本誌掲載プログラムくティレクトリ > C MAGA く D 旧 > ・ d より取り込み ( ソースを - してそ′ - を 4 ・ファイルにはきだす . ! 鏨人力ファイル置が・な引 スカフ , イル名ー・、、 - デみ込 て一ュメトみりフ , イル名設み込み いファイルを分一 - 対第ソースみ込み 物日れフ , イ履をジュ 復物・設物分取り、 出をジュール名出力、・・ ! ー ! C ソースからドキュメントを自動作成 マイクロドックは、 C 言語ソースを解析して詳細仕 様書 ( 内部仕様書 ) を自動作成します。 表紙、目次、モジュール構成図、モジュール一覧表、 インクルードファイル使用一覧、グローバル変数使 用一覧表、関数仕様書等を 1 刪の仕様書として罫線 でレイアウトして出力します。また、用紙のサイズ 合わせ、出力項目の選択等ができます。 ソース上に決められた型でコメントを記述すれば仕 様書の説明郎に取り込む事がてきます。これによっ てドキュメントの完全自動作成も可能です。てきあ かりの文書をワープロ等て編集てきます。 プログラム設計時のドキュメント作成支援 マイクロドックは、プログラム設計時のドキュメン ト作成にも利用できます。プロック・フロー付きの 設計書が簡単に作成できます。 V3.0 から追加された主な機能 ・英語スタイルのドキュメント出力 ・ AN 規格の引数に対応 ・ # inc 旧 de ファイルの解析および使用一覧出力 ・グローバル変数使用一覧出力 ・実行部のソースのコメントより構造化フローを出 力。これに依ってソースと対応のとれたプロック フロー付きのドキュメントが作成できます 対応機種 . PC9801 シリーズ・ MS - ロ OS マシン 解析対象 . AN 仕様に準拠した C ソース I•. 記製品はデモ・ディスク ( 無料 PC98-5 インチ FD ) があります。資料及びデモのご請求は FAX でも受付ています。 Fig. 2 環境変数の設定例 set G032=ansi handle 30 emu a : /tex/bin/emu387 ・ a : /tex/jmacros ・ a : /tex/macros ・ set TEXINPUTS=. set G032TMP:a : /tmp set TEXPOOL:a : /tex/bin set TEXFORMATS=. ・ a : /tex/bin set TEXFONTS=a : /tex/jfms : a : /tex/tfm ・ a : /tex/pkfont set TEXEDIT=MIFES %%s 十 %%d set TEXCFG:a : /tex/driver set MFPOOL:a : /mf set M 日 N PUTS:. ・ a : /mf/inputs : a : /mf/cm ・ a : /mf/latex ・ a : /mf/bases set MFBASES= set TZ=J ST- 9 set PATH:a : \ ・ a : *tex*bin ・ a : *tex*driver : ( あとはご自分の環境に合わせてください ) M ICROART INC. マイクロアート株式会社 〒 2 幻瑾浜市神奈川区鶴屋町 2 ー 9 ー 22 ー引 4 電話 045 ー引 6 ー 6508 FAX 045 ー 6 ー 6509 受付時間響田 : 圓ー響 5 : 00 ( 月 ~ 全祭日除く ) く資料請求番号 183 〉 ディスク内容のお知らせ 183

10. 月刊 C MAGAZINE 1993年10月号

X 68 k 活用講座 List List st 日 en の代わりに使うマクロ ( GCC てしか使えません ) st 「 cpy の代わりに使うマクロ #define mystrlen(S) ( { char *—s = (S) ; char * ー店 while (*—s) s + + ; #define mystrcpy(), S) ) while ( の do { char *—d = (D) ;char *—s = (S) : 視されます。ちょっとポータビリティにつ て、きない」こともあり得るのて、す。そういっ 最後に いて考えてみましよう。個人的に去年くら た意味て、は , 今回の連載て、ディスクに収録 いから市販のゲーム開発にかかわってきた したプログラム群が読者の方々の環境て、コ 経験上 , 今のところ MS-DOS マシンから X ンパイルて、きたのかがいささか不安て、もあ 約 2 年に及んだ連載も今回て、最後になって 680X0 に移植するのは UNIX から X680X0 より ります。実際に sprite. h という XC て、は標準の しまいました。 どうも話が行ったりきたり も困難て、す。 DOS マシンの場合 , とくにゲ ヘッダと同名のヘッダを作ってしまったり , て、同じことを何度も書いたような記憶もあ ームて、はそうて、すが処理時間とメモリ不足 interupt. h を改名したりといろいろやってし ります。連載当初の目的て、あるスプライト を補うためにコンパイラの拡張仕様を使う まった点が気がかりて、す ( ちゃんとコンパイ を使った簡単なゲームを動かすまて、 2 年もか ことやアセンプラとの混在リンクが常識的 ルて、きてますか ? ) 。 かってしまったことになりますね。最近 , に行われています。これは実はそれほど大 X680X0 のような特殊なマシンて、のゲーム とみに扱いが悲惨になってきている X680X0 きな障害にはならないのて、すが , もっとも て、すが , まだまだその能力は枯れてはいな ソースというのは , ほかのマシンに移植す 厄介なのは「開発者の独自環境」て、コーディ るということは比較的考えにくそうなのて、 いと思います。どうも長い間ありがとうご ングされたソースて、す。 すが , ひょっとしたら同じ CPU て、あるメガ ざいました。 #include く mygame. h > ・・・・・・お ~ ~ いな ドライプなどはターゲットになるやもしれ €<mygame. h> なのお ? て、す。 GNU の ません。究極に機種依存て、あり , かっポー 注 1 最近の『バックアップ活用テクニック』 ような UNIX 系統のソースて、はまずこんなコ タブルな C 言語て、のゲームソースはたぶん # ( 三才ブックス ) の読者投稿に「 IOCS て、画面モ ーディングは見られません。なんとなく , include <.. > て、使うシステムヘッダを一 ードを設定していると , ューザ側て、操作する コピーコンパイラを使ってヘッダを全部コ 切インクルードしないて、全部を自前のヘッ のが難しい」と記述されてましたが , 普通逆 ピーしておいてそこに自分のヘッダまて、作 ダとマクロや関数て、行うゲームソースだと て、しよう OIOCS て、設定してるヤツならちょ ってしまう・・ ・・という恐ろしい邪推すら生 思われます ( コラムを参考に・ っとした常駐プログラムて、簡単にフックて、 まれます。まっとうな人ならこんなことは もし , 手元にゲームのソースを温められ ・。デバッガて、追う必要もないし。 きるから・・ しないて、しよう。 ている方がおられたら , 一度ほかの機種へ 注 2 ラスタースクロールを使っているゲー の移植性を考えてみられたらいかかて、しょ ムて、は , 安易に画面モードを変史するとま コンパイラ付属のシステムヘッダから , 自 分の作ったヘッダまて、全部 # include <... > ったく動かなくなります。 う ? 新しい発見があるかもしれません。 て、やってのける環境に問題があります。自 分はそれていいてしようが , 後て、それをメ XGCC で処理速度を稼ぐマクロ群 ンテナンスする他人や移植にかかわる他人 プの変数を使ったマクロを多用すれば相当 XGCC では , 覗き穴最適化を独自に行っ はひどい迷惑を被ります。 ています。環境変数 GCC ー OP 引 ON に文字 に高速なコードを XGCC は生成します。ほ パソコンの世界て、は , UNIX のように「ほ ℃ ' を設定しておくと , ListA のようなマク かにも送り先の重なりに制限のある memc ば標準」というディレクトリ構成があるわけ 口が高速に展開されます。また , GCC では {} py や汎用の memset などをマクロにすれば て、はないのて、 , 普通ゲームのソースといえ で囲うことで式の中に文をおけるので , List 高速に処理されます。このようなコーディ B のような便利なマクロも記述できます。 ングは in ⅱ ne 関数よりメモリを使わないでコ ばこういった類のものが多いものて、す。下 とくに文字列操作系列の関数のように単 ンバイルできるので , 少ないメモリの X68 手をすると開発者のハードディスクをまる 純である場合には , このような短いスコー 0X0 でも有利です。 ごと持参していただかないと「同じ物を再現 Column X68k 活用講座 163