BorIand C 十十 Ve 「は 0 の機能 実に多くの機能を搭載している Borland C 十十 Ver. 3.0 であるが , MS - DOS 上での開発能力の良否は C & C 十十プ ログラマにとって最重要ポイントになるだろう。本章では M S - DOS 上の C 言語と C 十十の開発環境に焦点を当てる。 ーフリンケージしかり。 こに , C 十十の優 すね。 位が明らかてあるにもかかわらず , C を完全 つまり , TurboC 十十 /BorlandC 十十は に捨てて C 十十へ走れない原因があるのて、は C 十十処理系て、あると同時に , C 処理系て、も ないて、しようか。 あるのて、す。コンパイルするソースファイ TurboC 十十 Ver. 1 . 0 が登場してからと ルが C か C 十十かは , ファイルの拡張子て、識 いうもの , BorIand の言語製品には純粋な 別するようになっています。、、 . c" が C ソース 、℃〃コンパイラというものは存在しません。 ファイルて、 , 、、 . CPP" が C 十十のソースファ 巷のうわさて、 , 「 C 十十というものは C の上 イルとして認識されます。 位互換らしい」「けれども , 完全上位互換て、 さて , C 十十は非互換部分はあるものの , 拡張子が標準と異なる場合には , C ソース はないらしい」など耳にされたことがあるて、 基本的に C の上位互換て、す。ほとんどの部分 とみなすのか C 十十ソースとみなすのかを しよう。実際のところ C 十十て、は , C に対す が互換て、あるならば , ひとつの処理系て、両 ー P オプションて、指定て、きます。ー P をつけると る上位互換性をかなり意識してはいます。 方サポートすることも難しくないようて、す。 強制的に C 十十としてコンパイルされ , -P- けれども , 明らかに「廃れている」あるいは 実際 , BC 十十て、は C と C 十十のコンパイラは をつけると , C ソースとして扱われます。 B 「よくない」とみなすポイントにおいては , 分かれておらず , いずれも同じ EXE ファイ C 十十 2.0 以則て、は , コンノヾイラのデフォル C の上位互換て、あることを自ら捨て , 本来あ ルを使用します。ということて、 , BC 十十を ト ( 拡張子をつけない場合 ) は C ソースて、した るべき姿を採用しています。プロトタイピ 購入すると , 自動的に C コンパイラと C 十十 が , BC 十十 3.0 からは C 十十に変更されてい ングやキャストの必須性しかり , タイプセ コンパイラの両方を入手て、きます。お得て、 ます。以前作った Makefile にも念のため , CFLAGS TabIe 2 PIum HaII Validation Samp 厄「の結果 などをつけておいたほうが無難て、しよう。 テスト項目 1 . BacksIash-splicing 2. Phases Of translation 3. Trigraphs 機 の て し と 五ロ セクション 天元広海 五ロ 十 十 と 五ロ BC 十十 3.0 における C サポート 結 果 ANSI C コンバイラ としての BC 十十 コンバイル不可 コンバイル不可 コンノヾイル不可 ( ただし , trigraph. exe を通した後では OK) コンノヾイル不可 気がっくと ANSIC が制定されてから結構 月日が経ってしまいました。いまや , JIS C 15. N-char characte 「 constants 30 C MAGAZINE 1 2 9
かせてチェックしたほうが安全て、しよう。 コンバイル速度の向上と プロテクトメモリの活用 いう結構苦し紛れの解決策もありました。 互換機ては , QEMM を組み込んて、いないの て、すが , 386CPU が普及してきた今日この て、フリーエリアは 540K バイトほどて、すが , 頃 , BC 十十 3.0 て、はついにプロテクトメモリ BC. EXE から子プロに抜けても , まだ 470K が必須となりました。プロテクトメモリを バイトもフリーエリアが残っています。 使用する際のインタフェイスにもいくつか れならば , 結構大きなプログラムの開発も 最適化なんて必要ないよ , ましてや Wind あります。 大丈 V て、すね ( 笑 ) 。 ows なんて , という人も , コンパイル速度が BC 十十 2.0 て、は EMS による VROOMM 版 向上したと聞けば手放して、嬉しいのて、はな コンパイラに加え , VCPI 版コンパイラをサ いて、しようか。コンパイルスヒ。ードの測定 ポートしていました。 BC 十十 3.0 て、は DPM は ' 92 年 4 月号に出ていますが , 数か月使用 I のみのサポートに変わりました。時代は W indows へと流れていますから , Windows が してみた筆者の体感て、はイライラがかなり 以上のように , BC 十十 3.0 は , C コンパイ 低減されました。最強のオプティマイズを サポートしている DPMI の採用にはうなづけ ラだけ取ってみても十分に魅力的な処理系 指定しても , コンパイル速度が大して落ち るものがあります。 て、す。プロテクトメモリの活用により , 狭 ことも特筆すべきことて、す。 プロテクトメモリがどれくらい載ってい 苦しい DOS のコンべンショナルメモリの残 りを気にすることなく , 工デイタの子プロ メモリに関しては , C 十十はサポートする るかにもよりますが , ェデイタの子プロな わ , オプティマイズはサポートするわて、い どて、コンべンショナルメモリが 200K バイト セスだろうが何だろうがほいほいとコンパ つのまにか Turbo 処理系は巨大なものに成り くらいしかなくても , 楽勝て、コンパイルて、 イルて、きてしまいます。 きます。ありがたいことて、す。 上がってしまいました。 もはや , MS-DOS デバッグだって , メモリがたくさんあれ のコンべンショナルメモリだけて、はどうし プロテクトメモリを使用て、きるのて、 , 環 ばそれだけ大きなプログラムがデバッグて、 ようもありません。 DOS の設計が 8086 依存 境版コンパイラて、ある BC. EXE 使用時のフリ きるというもの。 て、あったため , EMS を使った VROOMM と ーメモリも , たつぶりあります。筆者の AT 取りあえず C 十十を使う予定がなくても , Borland の IDE という環境が好きな人 , MS TabIe 4 オプションによる実行速度の違い -Windows のプログラムに興味がある人 , オ プティマイズのついた TurboC がほしい人 オプションなし は BorlandC 十十 3.0 はうってつけだと思い ます。 ただねえ , ちょっと値段が高いんて、すよ まとめ -Ov ー 02 実行時間 (s) 3.40 5.38 2.91 2.74 参考 : f00 ( ) の中身を空にしたときの実行時間 0.76 「 e O. 76us 「 O. OO 十 1 4sys ( 0.76C ロ u O.OO 十 Odisk) 新しく導入された C 十十機能 山本浩文 AT&T C 十十も , ノホホンと手をこまねい になっています。とはいうものの , AT&T ていたわけて、はなく , fTheC 十十 Progra C 十十 Ver. 3.0 からサポートされている機 C 十十処理系としての実力 mming Language Second Edition 』の仕様 能の大部分が BC 十十 3.0 て、は実装されていま をフルに満たすべく , バーションアップを す。 Turbo C 十十 Ver. 1.0 , Turbo C 十十 行ってきました。 AT & T から提供される C 十十処理系は , Ver. 1.0 Second Edition, Borland C 十十 現在ては , AT & TC 十十のバージョンは 「トランスレータ」と呼ばれる形を取ってい Ver. 2.0 を経て , BorlandC 十十はバージョ 3.0 になっていますが , BC 十十 Ver. 3.0 て、 ます。トランスレータとは , C 十十のソース ンが 3.0 になりました。この間 , 本家本元の は AT&T C 十十 Ver. 2.1 準拠ということ ファイルを C ソースファイルに変換するもの セクション 34 C MAGAZINE 1 2 9
ダの あつばれ ご意見番 第 5 回 イラスト / 椙村嘉ー 「ソフトウェアは誰のもの ? 」 リーソフトウェア作者の苦労 6 月 20 日 , フリーソフトウェア大賞の授賞 記念パーティと記念講演会があった。フリ ーソフトウェアというのは , なんらかの意 味て、自由に使えるソフトウェアのことて、あ る。裏を返せば , ある意味て、自由に使うこと ができないソフトウェアて、あるともいえる。 講演会のフリートークの時間は , フリー ソフトウェア作者らの生の声を聞くことが て、きた。ディスカッションを行うのかと思 っていたが , 結局時間がなかったせいか , 単に順番に意見を述べただけだった。司会 の石田晴久氏とともに , 授賞者から 7 名がス テージに上がった。私は観客席から見てい ただけて、ある。 フリートークて、は「フリーソフトウェア を作るうえて、苦労したことは何か ? 」とい う質問が石田晴久氏からあり , それに対し て作者らが回答する場面があった。 もっと も多かったのは , メールの返事がたいへん という意見て、ある。人気のあるフリー ソフトウェアの場合 , 少なくとも数万人の 利用者がいる。これを頭に入れずに「感想が あればぜひお願いします」などとドキュメン トに書いてしまうと「いつも使っています」 といったメールが何千通もきてしまうかも しれない。フリーソフトウェアの場合 , 感 想だけて、はなく , 使い方がわからないとか , 動かない といったメールもくるだろう。 殺到するメールにどう対応するのがよいか は , 早急に解決しなければならない間題て、 もある。 利は誰の手に ? フリーソフトウェア作者らの声を聞いて , ひとつだけ不思議に感じたことがあった。 権利問題に対する苦労の声がなかったのて、 ある。私の場合もっとも苦労したのはなん といっても権利に関する問題だったから。 今から数年前 , フリーソフトウェアの数 もそれほどなかった頃 , ネット上て、「 MS ー C て、コンパイルしたプログラムをフリーソフ トとして公開しても構わないのか」という議 論が盛り上がった。プログラムをコンパイ ルすると , 最終的な実行形式のオプジェク トには , 自分が書いたプログラムから生成 されたオプジェクト以外の部分が含まれる。 Fig. 1 BPL v3E を一 x オプションで起動したときの表示 A> bpl -x Compiled by Turbo C 十十 (Turbo C 十十 Version 1 .01 Copyright (c) 1990 Borland lnternational) BPL. EXE v3E, by Phinloda for CompuServe B Plus P 「 otoc (SM) 98 版 使い方 : bpl [-aefhpstvl 37 ] [ ファイル名 ] Fig. 2 BPL. EXE v3E に添付されている READ. ME より 7 ) 本ソフトウェアは Turbo C 十十を用いてコンノヾイルされています。 Turbo C 十十の 使用承諾条件に従い , Copyright 表示を追加しました ()x option)0 4 ) に加え , ソフトウェア内のこの箇所を編集しないことを利用条件とさせていただきます。 91 / 04 / 07 Phinloda 152 C MAGAZINE 1992 9 ランタイムルーチンや , リンク時に追加さ れるライプラリ関数に対応するオプジェク トて、ある。これらの権利はコンパイラのメ ーカーが所有しているため , コンパイラを 買った人が勝手に配ることはて、きない。し かし , コンパイラを買った人が自分て、作っ たプログラムを配れないというのも問題て、 ある。ランタイムルーチンやライプラリも 全部自前て、揃えたら , メーカーの権利は消 滅するのだろうか ? この間題は錯綜した。実際にメーカーに どうなのか尋ねた人がいたのだが , その回 答がはっきりしなかったのが原因となった。 たとえば , このような権利表示をしろと指 示されたり , 表示するなと指示されたりし たのて、ある。これて、はわけがわからない さすがに今て、は明確な指示があると思う。 私が持っていたのは Turbo C だったから , このような問題は発生しなかった ( 実際は話 は逆て、 , このような問題のないことを確か めたうえて、 TurboC を選択したのだ ) 。すな わち , Turbo C て、コンパイルしたプログラ ムは , 自由にフリーソフトウェアとして公 開したり , 営利目的て、売っても構わない とを知っていたのだ。この原則は今も変わ のて、ある。つまり , 著作権通知を行わなけ 払わずに寄贈・販売て、きると書かれている を行った場合にかぎりライセンス料金を支 使って作成したプログラムは , 著作権通知 わかる。そこには , Turbo 言語コンパイラを ンス規定および制限付保障」の項目を読めば のご使用条件」の「ナンセンスて、ないライセ rbo C 十十に添付されている「ソフトウェア 現困難て、ある。理由は BorlandC 十十や Tu いと何度か書いた。しかし , 現在これが実 ネットて、は , BPL. EXE は将来 PDS にした る間にひとつの変化があった。 っていないのだが , 実は BPL を制作してい
五ロ 用 応 C の道具箱 mybox( ) 関数が四角 , そして daen ( ) 関数が 楕円を描画する関数て、ある。これらの関数 の書式は , Fig. 13 , Fig. 14 , Fig. 15 のとお りて、ある。 3 個の関数の上にある area_patte rn ( ) 関数は , 図形内部の塗りつぶしパター ンを指定する関数て、ある。 CIRCLE3 を実行すると Fig. 16 のような図 形がプリントされる。 道具箱に追加された関数 LASER SHOT の 凵 PS 関数群 6(List 2 ) Table 2 に , LASER SHOT のページ記述 言語て、ある LIPS のコマンドを利用した関数 のうち , 今回追加したものを示す。 コンバイル 道具箱に追加された関数は , TurboCV er. 2.0 および MS-CVer. 6.0 上て、コンパイ ル可能なものて、ある ( UNIX 用のものは , S UN ワークステーションおよびその互換機て、 コンパイル可能のものて、ある ) 。いずれの場 合にも各プログラムは分割コンパイル用の ものなのて、 , コンパイル後オプジェクトフ ァイルを読者のライプラリに追加していだ 。なお , 1iPS9209. c ( 付録ディスク収 録 ) については , 前回まて、の lips 関数群をす べて含んて、いるのて、 , 前回の 1iPS9208. c はラ イプラリから削除していただきたい Turbo C Turbo C て、コンパイルする場合には , コ ンパイルスイッチを以下のように設定する とともに , Turbo C コンパイラのディレク トリ下の INCLUDEi•ィレクトリの中に , c onfig. h として以下の内容のファイルを入れ ておく必要がある。また統合環境の中て、コ ンパイルするのて、はなく , TCC を使用す tcc -v -K -J -w -ml -c ( デバッガを使用 /char を unsigned cha Fig. 6 90 to_vector( ) 関数の書式 go_to vectO 「 (genten) char * genten : ←座標原点の移動 座標原点を移動しない 現在印字位置 ( CAP ) を座標原点とする 1 Fig. 7 start_picture( ) 関数の書式 start_picture (label) ←画像の名称 , ただしコメントの意味しかない char *label,• Fig. 8 zahyov unit( ) 関数の書式 zahyov unit(unit, kakudai) ←基本単位 long unit : 1 / 720 インチ ー 1 1 / 100mm long kakudai : ←拡大率 Fig. 9 line width( ) 関数の書式 line width (width) ←線幅 long width 1 ドット幅 ー 1 3 ドット幅 ー 2 5 ドット幅 ー 3 7 ドット幅 ー 4 1 ~ 255 の任意の幅 1 以上の整数 Fig. 10 line kind( ) 関数の書式 line kind(kind, kakudai) ←線種 long kind , 実線 0 長鎖線 1 長点線 2 1 点鎖線 3 2 点鎖線 4 短鎖線 短点線 ユーサ線種ー 1 0 ~ long kakudai : ←ラインバターンの偏倍率 0 ~ 255 Fig. 1 1 線幅の異なる直線 0 12 Fig. 線種の異なる直線 応用 C 言語 131
ln 川 a ⅱ行 OIII m 川計 Ma れ門 ライフボート WATCO M C / 386 Q WATCOM C / 386 でリンクす るときに cstart が undefined re ference 工ラーになります。どうす ればいいでしようか ? A WATCOM LINKER は , 未 定義参照名を解決する処理を行っ て , 実行可能ファイルを作成しま す。参照はほかのソースファイル て、宣言されている関数やデータを 参照するプログラムによって起こ ります。未定義参照工ラ—undefin ed reference を起こす原因はいく っかあります。リンカが未定義参 照ェラーメッセージを表示するの は , 関数またはデータが見つから ないからて、すが , このメッセージ の原因は , リンカに正しいオプジ ェクトファイルかライプラリを指 定していないことかもしれません。 代表的な未定義参照ェラーについ て以下に説明します。 undefined reference ” cstart cstart が未解決参照になるの は , リンカが C のランタイムライ プラリを見つけられなかったこ とを示します。たとえば , 引数 がレジスタ渡しになるフラット メモリモデルの C ランタイムライ プラリは , math387r. lib と math 3r. lib のいずれかと cIib3r. lib て、 す。環境変数 WATCOM に WA TCOM C / 386 をインストールし たディレクトリが設定されてい るかどうかを確認してください リンク時に option nodef を指定するか , コンパイル時に / zl を指定しているときは , ライプ ラリ名を明示的に指定しなけれ ばなりません。 undefined reference ” fltused す。 あることを認識て、きないからて、 コンノヾイラは main モシュールて、 ますが , 小文字て、書かなければ を認識して適切な情報を生成し ラは main モジュールて、あること ません。というのは , C コンパイ は , 小文字て、書かなければなり りません。、、 main" という名前 いう関数を含んて、いなければな べての C のプログラムは main と を開発するのて、ないかぎり , す Windows のアプリケーション undefined reference ” main ばなりません。 ラリ名を明示的に指定しなけれ / zl を指定しているときは , ライプ ef を指定するか , コンパイル時に リンク時に option nod してください 設定されているかどうかを確認 ンストールしたディレクトリが COM に WATCOM C / 386 をイ b を使用します。環境変数 WAT pc を指定した場合には math3r. li した場合には , math387r. lib, /f によっています。 / fpc 以外を指定 に関するコンパイラオプション この違いは , 浮動小数点演算 す。 r. lib か math3r. lib のどちらかて、 モリモデルに対しては , mth387 数がレジスタ渡しのフラットメ られるようにすることて、す。引 な数値演算ライプラリを見つけ ます。解決策は , リンカが適切 が行われていることを示してい ジュールの中て、浮動小数点演算 は , このエラーを出しているモ fltused が未解決参照になるの Q WATCOM C / 386 を使ってい て , 外部変数が 0 に設定されていな かったり , 動作がおかしくなるこ とがあります。なぜですか ? A リンカは。ードとデータを組 み立てて実行可能ファイルを作成 します。 C 言語の規格て、は , 初期化 されない外部データ ( 変数や配列 ) と static データは 0 になることにな っています。 BSS 領域には C のプロ グラムの初期化されない外部デー タと static データが入っています。 (BSS という名前は , UNIX の C コ ンパイラの名残りて、す ) 。 0 にすべ きデータが BSS 領域に集められる という利点を利用して , ほとんど の C コンパイラて、実行可能ファイル の大きさを小さくしています。プ ログラムが正しく働くためには (m ain が呼ばれる前に ) BSS 領域をク リアするコードが必要て、す。 main の前に実行されるこのコードをス タートアップコード呼びます。リ ンカはどこに BSS 領域がロードさ れているかをスタートアップコー ドに知らせなければなりません。 このため ,WATCOM のリンカ ( W LINK) は , BSS セグメント ( 領域 ) を特別な方法て、処理します。 WLI NK は特別な変数 edata と end を 作り , スタートアップコードに BS S 領域の始まりと終わりを知らせま VRAM 直接アクセス Lsit 1 す。 WLINK 以外のリンカを使用す る場合には , 特別な注意が必要て、 す。たとえば , DOS/4G のリンカ (GLU32) を使う場合には , /DOSSE G オプションを指定しなければなり ません。 386 ー DOS Extender の 38 6LINK を使う場合には , -DOSOR DER オプションを指定しなければ なりません。一般的に , これら以 外のリンカを使う場合モジュール CSTART を clib3 ? . lib ( ? はメモ リモデルによって変わります ) から 取り出し , オプジェクトファイル cstart. obj を最初のオプジェクトフ ァイルとして , リンカが処理て、き るように指定します。オプジェク トファイル cstart. obj には , 実行可 能ファイルを正しく作成て、きるよ リンカに必要な情報が含ま うに れています。 Q WATCOM C / 386 で , VRAM に 直接書き込むには , どのようにプ ログラムすればよいのでしようか ? A DOS/4G て、はリ = アな 32 ビッ トアドレスの最初の IM バイトは物 理アドレスの最初の IM バイトと一 致しています。したがって , near ポインタに VRAM のリニアアドレ スを設定してアクセスすることが て、きます (List 1 ) 。 1 : #define SCREEN_LINEAR_ADDRESS 0Xa0000 2 : void main() 4 : 5 : 6 : char *Ptr; ptr = (char * )SCREEN_LINEAR_ADDRESS ; *ptr lnformation from Compiler Makers 155
特集 oBorland 3 』研究 そのまま IBM 以外の機種て、も利用て、きました。 TurboCVer. 1.0 の登場に際しては , さ まざまな衝撃がありました。まず , 99.95 米 ドルという価格て、す。それまて、にも , 安価 なコンパイラは存在しました。しかし , そ のほとんどがスモールモデルしかサポート していなかったり , 機能が低いものて、した。 フルセットのものを購入しようとすると , どうしても価格の高い製品を購入せざるを 得なかったのて、す。 TurboC は , タイニィ からヒュージまて、の 6 メモリモデルをサポー トし , レジスタ変数やムダなジャンプの最 適化を行い , 充実したライプラリ関数をサ ポートするなど , 従来のコンパイラがサポ ートしていたおもな機能はほとんど取り込 んて、いました。 また , ANSIC に対する積極的な対応も行 っていました。規格に対する姿勢も積極て、 言語仕様に対する拡張もまた積極 したが , 的て、した。 TurboC は , 当時の MS ー C がサポ ートしていた near/far/huge という修飾子の ほかに , interrupt て、割り込み関数を定義し たり , cs, ds などの特定のセグメントに対 するデータポインタ修飾子を定義したり , 疑似レジスタ変数を使って直接 C プログラム の中て、 CPU レジスタを操作させられるよう になっていました。 きめ細かい警告の設定も可能て、した と くに , 条件式の中の代入文 ( = ) を警告とし て判断する機能は , 従来のコンパイラには ないものて、した。 こうした多くの機能をサポートしながら も , コンパイル速度は驚異的に高速て、した。 ほかの処理系に比べて何倍も高速だったの て、す。さらに , 生成されるコードも当時と しては十分良質なものて、した。 また , Turbo PascaI と同じくエデイタ , コンパイラ , リンカがまとめられた統合開 発環境 (IDE, lntegrated Development En vironment) が提供されました。 もはや , 工 スケープシーケンスによる制御て、はなくな り , 直接テキスト VRAM をアクセスしてプ ルダウンメニューやポップアップメニュー による操作がて、きるようになりました。 Tu rbo Pascal と違って , Turbo C には数多く のコンパイルオプションが存在しましたが , それらはすべてメニューて、設定て、きました。 ウインドウに表示されたエラーや警告に対 応するソースコードに直ちに表示したり , 分割コンパイルのためにプロジェクトファ イルを使って必要なファイルだけをコンパ イルするメイク機能が組み込まれたり , オ ンラインヘルプによって今何をしているか を調べることがて、きました。このときの ID E のスタイルは現在にも引き継がれていると ころがあります。 細かいことかもしれませんが , ライプラ リソースコードが 150 米ドルて提供された とも重要なことて、しよう。それまて、 , ほか の処理系て、はライプラリ関数のソースコー ドを入手することがて、きないか , 多額のロ イヤリティを支払わなければならなかった のて、す。 まもなくアップデートされた Turbo C V er. 1.5 て、は , IBM ー PC に依存するテキスト / グラフィックスや BIOS に対応するライプラ リが提供されました。コンパイラが機種依 存性を持つライプラリをサポートするとい うことは , それまて、にはあまりなかったこ とて、す。オンラインヘルプて、は , ライプラ リ関数ごとに解説を参照て、きるようになり ました。日本語版への移植が行われたのも このバーションて、した そして , その 1 年後 , Turbo C Ver. 2.0 が登場しました。最大の特徴は , ソースレ ベルデバッガが組み込まれたことて、しよう。 Turbo C Ver. 1. x まて、は , IDE からは「実 際に走らせてみる」以外には作成したプログ ラムのデバッグはて、きなかったのて、すが , TurboCVer. 2.0 て、は , ソースレベルて、の トレース / ステップ実行 , プレークポイント やウォッチ式の指定などがサポートされま した。 TurboCVer. 2.0 には , 強力な助つ人が いました。同時に発売された TurboAssem bler&Debugger て、す。 MASM 互換の Turb 0 Assembler もそうて、すが , 何よりも Turb 0 Debugger の強力さが Turbo C Ver. 2.0 の開発環境をより快適なものにしたといえ るて、しよう。 Turbo Debugger の操作性はコ マンド行からの入力を排除し , すべての機 能がプルダウンメニューやウインドウに特 有のローカルメニューて、選択て、きるように なっていました。 また , Turbo Debugger て、は i80386 の仮想 86 モードを使うことて、 MS ー DOS のメインメ モリを消費することなくプログラムのデバ ッグがて、きました。それまて、のデバッガは デバッガのためにプログラムを小さくしな ければならなかったのに対して , Turbo D ebugger は MS-DOS の 640K バイトて、動作す るプログラムをそのままデバッグ情報っき て、デバッグて、きるようにしてしまったのて、 す。 Borland は , Turbo C Ver. 2.0 に Tur bo Assembler&Debugger をバンドルして 「 Turbo C Ver. 2.0 ProfessionaI 」という名 前をつけました。 TurboCVer. 2 . 0 は , フロッピーベース て使われているマシンが決して少なくない 日本て、は , 現在て、も愛用されている方がい らっしやるようて、す。 Turbo C Ver. 2.0 が発売されて 1 年がす ぎ , 新しい C コンパイラが登場しました。 B orland は , このコンパイラに TurboCVer. 3.0 という名前をつけませんて、した。 Turbo C は , Turbo C 十十として新しいスタートを 切ることになったのて、す。 名前のとおり , TurboC 十十は C 十十をサ ポートしたことが最大の特徴て、す。すて、に オプジェクト指向の考え方を Turbo Pasca 1 に取り入れていた BorIand は , オプジェク ト指向こそが大規模化するアプリケーショ ン開発への解決策て、あり今後の主流になる と考えていました。 Turbo C 十十という名 前は , その主張の表現だったのて、しよう。 特集 Borland C 十十 Ver. 3.0 研究 27 Turbo C 十十の登場
B 0 R ー A 0 The レⅲ Obiect-Onented Programming あなたの健康のため、 コンバイラは きちんと選びましょラ ンドタ Others BORLAND C 十十 3.0 FO 「 Y00 「 health, h005e your BEST ( ompi 厄「・ BORLAN D C++ 3.0 NEW 今、お使いのコンパイラ。スピードは充分ですか ? 遅いコンパイラは、イライラをつのらせ、ストレスの原因になりますもし、 あなたのコンパイラか、、体に悪い″ようなら、迷わず「 BORLAND C 十十 3.0 」を選んでください。 DOS と Windows 上 の AP 開発を強力にサポートするツール群や、 c 十十言語に対して多くの実績を持つポーランドならではの快適な開発 環境とともに、この最適化機能を備えたコンパイラの圧倒的なスピードを実感していただけることでしよう。あなたの健 康のためにも、コンパイラはきちんと選びましよう。•BORLAND C 十十 3.0 は、 BC 十十 & AFX 3.0 から AppIication Frame w 。 rks とソースコードのみを省いた、普及タイプの超高速・最適化 C / C 十十両用コンパイラ製品です・動作環境・・使 用機種 : NEC PC ー 9800 シリース ( ハイレゾモード対応、 XA を除く ) 、 EPSON 286 / 386 シリース (CPLJ 80286 以上のマシ ン ) ・メモリ . 要プロテクトメモリ・ IMB 以上 ( 推奨 5MB 以上 ) ・ OS : MS - DOS ver. 3.0 以上、 MS-WindowsVer. 3.0 以上 ( Windows アプリケーション作成時のみ ) ・周辺機器 : ハードティスク・ 15MB 以上の空き領域 ( 推奨容量 50MB ) 、パスマ ウス対応・価格 BORLAND C 十十 3.0 : ¥ 58 , 000 / BC 十十 & AFX 3.0 : \ 98 , 000 ( 本製品の価格には消費税は含まれておりません ) ボーラント株式会社 〒 151 東京都渋谷区笹塚 1-64-8 笹塚サウスビル TEL. 03-5350-9370 ( 代 FAX. 03-5350-9390 ※ AII Borland Products are trademarks 0 「 registered t 「 ademarks Of Borland lnternational, 抦 c. CBorland lnternational, lnc. ※ M osoft 、 Windows は米国マイクロソフト社の登録商標です。その他、商品名は一般に各社の商標です BORLAND 0 ◆ ND ・ 0 ・ ー 0 を一義 N 0 ※詳しくは、カタログをこ請求ください。 旧Ⅲ懼Ⅲ III Ⅲ く資料請求番号 F04 〉 雑誌 14325 ー 9 0 ソフトパンク凸版印刷 printed inJapan TI 01 4 ろ 25090980
再帰降下型構文解析 第回 実践刀レゴリズム戦略 解法のテグニック 松田晋 コンバイラの構文解析に用いられ る「再帰降下型構文解析」について 解説します。原理の説明から始め て , 簡単な関数電卓を作ってみます いる場合 , 記述言語は C 言語に限定されます 理していき , EOF になったらやめるという が , 再帰降下型構文解析ならどんな言語に ものて、すから , プログラムの概略は List 1 に て、も適用て、きますからね : ー ) 。 示すような疑似コードて、表せます。 再帰アルゴリズムの学習の仕上げとして , この後の節て、は , 簡単な電卓のプログラ 次に考えなければならないのは , 1 行の式 再帰降下型構文解析を取りあげます。この ムを紹介し , この機能を拡張していく過程 て、再帰降下型構文解析の手法を説明します。 手法は , コンパイラの構文解析の部分 ( パー 大域変数 サ ) を手書きする方法としては , もっとも手 簡単な電卓プログラム 軽に使用て、きるものて、す。したがって , 電 大域変数の濫用はよくない書法とされて おり , 世の中には大域変数が死ぬほど嫌い 卓のように , コンパイラほどおおがかりて、 だという方をときどき見かけます oget token もっとも簡単な電卓を作るこ はないが , 構文解析が必要なプログラムに ともかく , ( ) を大域変数を使わないよう改造すること とから始めましよう。電卓の仕様は , 「 1 行 はうってつけて、す。 を考えるのも , 練習問題としてはおもしろ の式を読み込み , その式の評価結果を表示 筆者は以前 , Pascal 言語によって記述さ いて、しよう。 れた Pascal コンパイラ「 Cabezon 」を開発し することを EOF まて続ける」というものにし 間題になるのは , 先読みした字句を即座 た経験があります。このコンパイラの構文 ます。式の種類は四則演算のみて、 , 演算子 に使わない場合て、す。いい換えれば , 読ん 解析には , ここて、説明する「再帰降下型構文 の優先度は取りあえず考慮しないことにし て、みたら , すぐには使わない字句だった場 ます。このため , 式「 2 十 3 * 5 」は演算子の優 解析」を用いました。しかし , Cabezon より 合て、す。この場合は , 字句を「読まなかった」 先度を考慮しないために式の値は 25 となり 後に書いたコンパイラは , すべて yacc 十 C と ことにします。 unget_token() という名前 ます。一般に , 「式」は数値と演算子が交互 の関数をこの目的のために作るとよいてし いう組み合わせを用いています。 よう。 ungetc ( ) の字句版て、す。 に現れる形になります。なお , 空白は無視 やはり生成系の威力は絶大て、 , yacc に慣 実際にやってみるとわかるのてすが , 文 して読み飛ばす仕様とします。 れると手書きとは比較にならないほど楽に 法が大きくなると unget_token( ) だらけに この程度の簡単な電卓て、も , すらすらと パーサを記述て、きます。しかし , yacc に習 なって , 意図とは逆に , わかりにくいプロ 書き下ろせる人は相当のべテランて、しよう 熟するには時間がかかるため , コンパイラ グラムがて、きます oget token ( ) の結果を大 から , ここて、は順を追って段階的に説明し の専門家て、ない方が手軽に利用するという 域変数て、返すのは定石のひとってすが , 定 ていくことにします。 のは少し難しいようて、す。このため , 手軽 石に従うということはそれなりに意味があ まずはプログラム全体の構造を決めます。 な構文解析の手法として再帰降下型構文解 るということのようてす。 前述のように , プログラムは式を 1 行ずっ処 析はまだまだ現役て、す。さらに , yacc を用 はじめに コラム 実践アルゴリズム戦略解法のテクニック 61
ll 川 a ⅱな om 町ⅱ計 Makers マイクロソフト MS-C Ver. 7.0 前回に引き続き , MS - C の最新バ ングガイド』第 2 章参照 ) 。 text プラグマの代わりになりま の使い方に誤りがあるプログラム ージョン Microsoft C/C 十十 Dev p-code す。 は MS-CVer. 7.0 て、はコンパイル elopment System for Windows プログラムまたはその一部を p- セグメント名の最後に TEXT が て、きません。 version 7.0 ( 英語版 , 以下 MS-C code にコンパイルすると , 一般に つくとき , コンパイラはこのセグ ポインタ based ( (_segment) Ver. 7.0 ) について説明いたしま 4 分の 1 ぐらいにコードのサイズを メントをデータセグメントて、はな If ) に変換てきるのは , 左辺値 す。 小さくて、きます。 く , コードセグメントに変換しま のみて、す。代入式の右辺は左辺の なお , 今回の情報は , IBM PC ま プラグマ す (Fig. 3 ) 。 MS-C Ver. 6.0 て、は , 型に変換されるのて , based(( たは互換機をご使用のユーザのみ autO inline, code seg, data s MY TEXT はデータセグメントに segment) self) ポインタに対し 利用可能てす。また , 今回の情報 eg, hdrstop, inline depth, inlin なりますが , MS-C Ver. 7.0 は , て代入を行うときは , 明示的なキ は , 将来発売される日本語版て、は e recursion, native caller, war MY TEXT をコードセグメントに ャストを使う必要があります。た 必ずしも有効とはかぎりません。 ning などのプラグマが新しく用意 変換します。 とえば ,Fig. 1 ( a ) て、は , ( b ) のよう 今回はとくに , MS-CVer. 6.0 されています。一方 , same_seg, ランタイムライプラリ関数 に解釈されます。しかし , 式 1(Fi と MS-CVer. 7.0 のコンノヾイラの 10 叩ー opt がサポートされなくなっ MS-CVer. 7.0 て、は , 仮想メモ g. 1 (a) のアミの部分 ) はセグメン 機能の違いについて説明します。 たのて、 , それぞれ based キーワー リをサポートする関数が追加され トを持たないのて、 , これは無効に MS-CVer. 7.0 て、は , いくつか ド , optimize プラグマを代用して ています。 なります。オフセット 1 をこの ba の機能が追加 , 削除 , 変更されて ください フ変数 osmajor, osminor, OS sed ポインタに置くには , Fig. 1 の います。そのうちいくつかは , AN インライン関数 version, osmode に加えて , 変数 (c) のように based (void) ポイン SI の C 言語の規格に対応するため inline キーワードは , 関数定義 cpumode が提供されています。 タにキャストする必要があります。 の変更て、す。 内のコードを , それぞれの関数呼 の変数は REAL MODE, または 同様に , Fig. 2 の ( a ) のようなステ 旧バージョンの MS ー C て、作成 , コ び出して、置き換えるようにコンパ PROTECT MODE のどちらかを ートメントて、 , ui の内容を base ンパイルしたコードに影響を与え イラに指示します。コードの置き 返し , 現在のプロセスモードを示 d ( ( segment) self) ポインタに るような変更点はほとんどありま 換えはコンパイラの判断て行いま します。 移動するには , Fig. 2 の ( b ) のよう せんが , 場合によっては既存のコ す。 inline キーワードは , それぞ 関数 fatexit と fonexit を使う にします。また , MS-CVer. 7.0 ードを変更または修正する必要が れの関数に対して個別に指定しま と , プログラムの終了時にモデル ては , 関数を特定のセグメントに あります。 す。 /Ob2 コマンドラインオプション に依存しない処理を実行て、きます。 割り当てる必要があるときに , 関 を指定すると , てきるだけ多くのイ また , ライプラリ関数 snprintf と 数をセグメント定数をベースとし 新しい機能 ンライン関数を作成することによ vsnprintf を使うと , ノヾッフアに書 て宣言て、きます。この機能は a110C まず , MS-C Ver. 7.0 て、新しく ってコードを最適化します。 inl based ( void ) ポインタへのキャスト ( その 1 ) 追加された機能について説明しま ine キーワード ( および / Ze オプショ (a) int _based ( ( segment) self) * piself , す。 ンを使ってコンパイルしていると piself = 国 : (b) (int based(( segment) self)) 1 ・ piself C 十十のサポート きの inline キーワード ) は ,MS-CV (c) (int based(void) * ) 1 ・ piself MS-C Ver. 7.0 て、提供されてい er. 7.0 の新しいキーワードてす。 組み込み関数 る C 十十コンパイラは Margaret A. Fig. 2 based ( void ) ポインタへのキャスト ( その 2 ) 組み込み関数を最適化するコマ EIIis, Bj arne Stroustrup 著 fAnn (a) unsigned short us . p iself ンドラインオプション (/Oi) または otated C 十十 Reference 』に記述 (int based(void) * ) ui . (b) piself intrinsic プラグマを使うと , コンノヾ されているプログラミング言語 コードセグメントに変換される例 Fig. 3 イラは関数のインラインコードを C 十十を実現します。 void functl ( ) 作成します。 プリコンバイルヘッダファイル static char based( segname("MY TEXT")) a 「「 [ ] A string*n based キーワードによる関数の割 プリコンパイルヘッダファイル を使うと , C および C 十十プログラ り当て Fig. 4 宣言における const 属性 ムのコンパイル時間を短縮て、きま MS-CVer. 6.0 コンノヾイラのノヾ typedef const int CI. / * lllegal * / const Cli . す ( 製品に添付される「プログラミ グ修正のため , based キーワード / * lllegal! * / 150 C MAGAZINE 1992 9
実践 C プロクラミンク by St 第 6 回 奥村晴彦 ポインタ ( 続 ) , 情報処理試験予測 今月はポインタの勉強の仕上げです , キャストや ty pedef についても学びます。最後に , 今秋からの第 2 種情報処理技術者試験の C 言語の予想問題 ( ? ) を 兼ねて , バイオリズム計算プログラムを載せます。 ポインタ ( 復習 ) 前回はポインタについてかなり詳しく説 明しましたが , MS-DOS'€ソコンのポイン タについては , もう少し説明が必要て、す。 まず復習から。コンピュータの記憶装置 ( メモリ ) には 8 ビット = 1 バイト単位て、番地 ( アドレス ) がついています。ひとつの番地 の内容は 8 ビットて、すから , 数値にして 0 ~ 255 の値をとります。 C 言語て、は 0 ~ 255 の値 をとる変数は , unsigned char 変数名 宀言します。また , アドレスを p とすると き , そのアドレスの内容のことを * p と書き ます。そこて、 , アドレスを格納するための ポインタ変数 p を作るには , C 言語て、は「アド レス p の内容 *p は unsigned char 型て、ある」 という意味て、 , unsigned char *p と宣言するのて、した。 ところが , MS-DOS 上の C コンパイラて、普通に ( スモールモデル て、 ) コンパイルした場合 , p は 0—0xFFFF の 値しかとれず , しかも実際に参照される番 地は p の値そのものて、はありません ( 0x は 16 進法を意味する冠詞 ) 。 p の範囲を 0 ~ 0xFF 1992 9 FFFFFF にして , p の値と実際のアドレスと 78 C MAGAZINE を一致させるには , unsigned char far *p , と宣言すればよいのて、した ( ラージモデルて、 コンパイルすれば far は省略て、きます ) 。 まて、が復習て、す。 セクメントとオフセット て、は , unsigned char far * p ; と宣言し た変数に , 0XA0000000 , P のように数値を代入したらどうなるて、しょ うか。コンパイラによっては , 左辺と右辺 の型が違うといって , 警告またはエラーを 0 出します。実際 , この左辺は unsigned char far *p として宣言したポインタ p て、す。 p の型は unsigned char far * このとき , 型て、あるといいます。一方 , 右辺はこの場 ロ unsigned long 型て、す。型を合わせるに は , 右辺を unsigned char far * 型に変換 しなければなりません。そのためには , (unsigned char far * ) P 0XA0000000 , のように , 型の名前をカッコに入れて冠し ます。このようなカッコに入れた型の名前 をキャスト (cast) といいます。 て、は , これて、 printf("%d", (p) ・ とすれば , 何番地の内容が表示されるて、し ようか ? これが実は 0XA0000000 番地て、はな いのて、す。 MS-DOS 上の C コンパイラて、は , この左側 4 桁を右に 3 桁ずらして , それに右 側 4 桁を加えた番地 , つまり A0000 番地にな ってしまうのて、す (Fig. 1) 。 もう少し詳しく説明しましよう。 MS ー DOS パソコンは 8086 というインテル 社製の CPU ( コンピュータの頭脳にあたる I C) 用に作られています。この CPU は IM ( メ ガ ) バイト , つまり 1048576 バイトのメモリ 16 進て、左に 1 桁ずらすことに相当します。た という公式て、決めます。 16 倍することは , セグメント x 16 十オフセット の範囲て、すが , 実際の番地は , ントもオフセットも 16 進 4 桁 ( 0 ~ 0xFFFF ) いうふたつの部分に分けて扱います。セグメ て , アドレスをセグメントとオフセットと ところが , この CPU は一風変わってい えるのて、す。 て、 , この CPU は 16 進て、 5 桁のアドレスまて、扱 ついています。 1048575 は 0xFFFFF なの には 0 から 1048575 まて、の番地 ( アドレス ) が ( 記憶装置 ) を扱えます。この 1048576 バイト