コード - みる会図書館


検索対象: 月刊 C MAGAZINE 2001年4月号
63件見つかりました。

1. 月刊 C MAGAZINE 2001年4月号

4 後藤謙太郎 最終回 モジュールとクラスの使い方 す。また , ここから Ruby でのプログラミングスタイルについても紹介します。 Ruby の主なプログラムの構造となるモジュールとクラスの使い方について解説しま 最後となります。その締めくくりの内容として , コードの読みやすさなどの視点から 半年以上にわたり Ruby の魅力的なところや使い方をひもといてきた本連載も今回で オフラインで Ruby の話になったときに ときたま「難しいコードもあるよね」という 話になります。難しいというのは読むのが 難しいという意味です。 Ruby は Perl と比べ て暗号つばくなりにくいということを 1 つ のウリにしているのですが , コードの読み やすさは言語だけでは強制できないもので す。ではこの読みやすさとは何でしよう ? 古い例をあげると COBOL という言ロロ 新が 出た当初は , 「これでプログラミング言語 を勉強する必要がなくなった」なんてこと がいわれたそうです。英語が理解できれば COBOL は読み書きできるというのが の言葉のいわんとするところなのですが , COBOL のメンテナンスコストの高さがソ フトウェア工学を発展させたといっても過 言でないくらい読みにくいうえに書きにく いことは周知の事実です。もっとも COBOL がたいへんだったのはべつに自然言語に似 ていたせいではないでしよう , たぶん。と いうか英語に似てると思いますか ? コードの読みやすさとは ? まあ COBOL は極端だとしても , たとえ ば Ruby のよきお手本でありライバルでも ある Python でも似たようなことは起こり ます。 thon は自然と読みやすいコードに なるように設計されているといわれてい て , 実際その抑制の効いた文法ではアルゴ リズムがコードを決定することが少なくな いのも事実です。スタイルの重要性を学ば せるために注 1 ] 最初の言語として学生に th on を使わせたいという人もいます。しかし , プログラミング言語というものは強力であ れば強力であるだけ何でもできるわけで , 文法や基本機能だけではコードの読みやす さを支配できません。取 thon でも読みにく いコードというのはやつばりあります。ス タイルや基本機能の支援も重要ですが , そ れを守っているからといってそれだけでコ ードが読みやすいわけではなさそうです。 [ 注 1 ] Python は制御のプロックをインデ ントで表現することが文法で決められてい ます。 慣習の重要性 Python にしろ Ruby にしろそれは当ては まるわけで , どんな言語を使っても , いや , むしろマトモな言語でこそ読みにくいコー ドが書けます。スタイルを強制することで ある程度の読みやすさを確保することはで きますが , プログラムの読みやすさとはそ れだけではありません。要するに ・どれだけロジックと構造を追いかけや すいか ・断片を見ただけでどれだけのことが予 期できるか が問われているのです。これは会話の中で 相手がいっていることを把握するのに似て います。どうもプログラミング言語も純粋 な機械への命令ではなく , 人に考えを伝え るメディアという意味で「コミュニケーシ ョンの道具」であることにも読みやすさ / 読みにくさの起源はあるようです。いい替 えれば読みやすさというものはある種の慣 習に沿っているかどうかで決まるような相 対的なものであって , 世の中の慣習と独立 に読みやすさを数学的に定義するようなこ とはできません。 余談ですが , 実は数学自体もそうです。 計算機の利用におけるプログラムは数学で 伝授 ! 極めよ Ruby 道 91

2. 月刊 C MAGAZINE 2001年4月号

00 フログラミング入門 TabIe 9 演算子 演算子 説明 正符号単項プラス演算子 ) 負符号単項マイナス演算子 ) 乗算 除算 余り 加算 減算 char c [ 5 ] = ″ CD ”・ また , 文字型の場合も数値の場合と同様 に添え字を省略して初期化しても , 上記の 例と同じことと解釈され同じように初期化 することができます。 文字列の場合は文字数を数えることは間 違いの元になりやすいため , 添え字を省略 して初期化できることはとても便利です。 char a ロ = { 65 , 66 , 67 , 68 , 0 島 char c ロ = ” CD ” 文字コード 先ほどから何度も出てきていますが , 文 字の内部表現である文字コードは 10 進数 , 8 進数 , 16 進数ではそれぞれ表現が異なり ます。初心者でもそれぞれのコードと文字 表現の対応がわかるように TabIe8 の表にし ました。この文字コード表から , 次の値は すべて同じものだとわかります。 ・・・文字表現 ・・・ 10 進数コード ・ c = 65 , ・ c = 0101 ; ・・・ 8 進数コード 例 補 足 十 a -b 十 a=b*c a=b/c 除算の結果の余りの値が格納される a=b%c a=b + c a = b-c Fig. 5 数値定数 数値定数 整数定数 1 0 進数 0 以外の数字と + , - で始まる数字列 1 6 進数 Ox または OX で始まる英数字列 , 指定可能な値は 0 ~ 9 と a ~ f もしくは A ~ F 0 で始まる数字列 , 指定可能な値は 0 ~ 7 倍長整数 lon ) 数字のあと口または L ( 工ル ) を明記する 例 ) 123456789L 数定数 小数点と指数部表現を混在して 10.23e4 ( = 102300 ) といった指定も可能 指数 e または E で始まる英数字列 この e / E は 10 の n 乗という意味がある 小数点 小数点を用いる表現 文字定数は 1 文字を表現します。 ' ( シングルクオート ) で囲む a' , 'b' これは実際内部ではそれぞれ a ' , ' b ' の文字コードを示している たとえば c = ' a ' : と指定すると , 変数 c には実際には ' a ' という文字に相当する文字コード 97 が代入されることになる 先ほど説明をしたエスケープ文字列 ( 工スケープシーケンス ) もこの文字定数にあたる 実際にはそれそれの文字コードが認識され , それぞれ特別な意味を持っている 文字列定数は複数の文字を連続して指定する方法 文字列定数はダブルクオート ) で囲む 文字列定数 " He Ⅱ 0 " とした場合 , 実際には ' H ' , 'e', ' にド , ' 0 ' , ' ¥ 0 ' というように文字列の終 端にはゼロ ( ヌル・ NULL ) が格納される。したがって , ' ¥ 0 ' を検索することによって文字 の終端を認識することができる 例 ) 256 , 1 , -IOO 例 ) 0xab, 0x00 例 ) 011 , 055 例 ) 5e2 ( = 500 ) 型変数 C 言語の文字型変数は char 型ですが , 実 際には文字表現の特別な機能があるという わけではありません。整数の文字コードが 格納されることで ASC Ⅱ文字を 1 文字だけ表 現できるというだけです。ですから , char 型とⅲ t 型はその機能上はまったく同じで , 表現有効範囲 ( サイズ ) だけが異なるもので こで注意しなければならないのは , す。 BASIC などとは違って C 言語には文字列表 現をするデータ型が存在しないのです。 cha r 型はあくまでも 1 文字のデータを格納でき る領域にすぎません文字列を扱うために char 型変数の配列を使用するということは c 言語の特徴の 1 っといえます。 五ロ 一三ロ 例 ) 1 .23 , 24.56 文字定数 子ダ疋数 38 C MAGAZINE 2001 4

3. 月刊 C MAGAZINE 2001年4月号

五ロ プログラミングをした本人だけしかプロ グラムの内容がわからないということでは 後々困ります。また , 作成した本人でさえ も時間が経ってから見直すと理解するのが 困難な場合がよくあるものです。どういう 処理を行っているのか , 処理の意味などを わかりやすくコメントとして記述するよう に心がけましよう。 ・関数 printf ( 5 行目 ) printf 関数は , 引数で与えられた内容を 画面に出力するという機能があります。 の pr ⅱⅲ関数を呼び出し , 'hello c world}n というデータを画面上に出力しています。 の代表を TabIeI にあげておきます。 関数は自分で作成するか , あらかじめ誰 が指示します ( 自動的に復改される標準関 かが作成しておかなければなりません。 数もあります ) 。その指示をするのが , Yn List4 は復改文字を複数指定したときの の prin ばはあらかじめ C 言語に用意されてい ( 工スケープ文字列 ) です。なお , \ は英語 プログラム例で , Fig. 1 がその実行例です。 る関数です。このような関数を , 標準関数 圏では同じ文字コードの \ ( バックスラッシ C 言語では二重引用符の中に書かれた全 ( 標準ライプラリに含まれています ) といい ュ ) にあたります。ですから英語圏のコン 角文字はそのまま出力されますが , ほかの 場所 ( 変数名など ) では全角文字は使用でき ます。 C 言語には多くの標準関数が用意さ ピュータ書籍では \n と表現されます。日本 で用いられる JIS キーポードでは \ と表現さ れています。 ません。 れます。ェスケープ文字列は先頭に \ があ ・プログラムを読みやすくする ・復改を指示するエスケープ文字列 ( 5 行目 ) ることによって本来の文字の意味を離れ ( 工 スケープ ) , 特別の文字を意味します。そ インデント 出力される復改 ( 復帰改行 ) はプログラマ C 言語は桁位置にしばられることのない 復改文字を複数指定したプログラム Fig. 1 実行結果 フリーフォーマットで記述することができ さあ c 言語を勉強しよう ! ! ます。文法規則に違反しなければ , どのよ 1 #include し d 土 0. h > he Ⅱ 0 2 main ( ) うな形式で記述することも可能です。しか / * 画面に出力する * / しプログラムの構造を把握しやすくするた p て土 n ( ”さあ 5 : て土 n ( ” c 言語をつ・ 6 : め , 字下げ ( 4 文字ぶん程度 ) をすることは , p て土 n し f ( ”勉強しよう ! ! ” ); 7 : printf("hello*n%n 0 n 響 0 ⅵ d ” 8 : C 言語に限らずすべてのプログラミング言 語で習慣づけることが必要です。 Fig. 2 実行ファイル作成の流れ ②コンバイル ③リンク ①プログラムソース作成 ⑤デバッグ OK OK OK OK 完成 ④工ラー処理 List world コンバイルと 工ラー処理 TabIe 1 工スケープ文字列 ( 工スケープシーケンス ) 工スケープ文字列 警報音 復改 水平タブコード 垂直タブコード 3 文字までの 8 進数 000 1 6 進数 hh 文字コード 0 ASC Ⅱコード ( 16 進 ) 07 OA 09 OB 000 ( 8 進 ) hh 00 ¥ 000 vxhh ¥ 0 次に , 今まで説明したプログラムを実行 してみることにしましよう。実際にプログ ラムとして動作した結果を見てみないと プ 0 グラミングをなかなか実感することカ : できないものです。 プログラムの実行のためには , 正しく動 作するまで Fig. 2 の処理を繰り返し行うこ 特集プログラミング入門 c 言語入門講座 31

4. 月刊 C MAGAZINE 2001年4月号

/ * 重なっている * / という式で得られます。 ( & 1 ) というのが当 たり判定で使われる範囲となります。キャ ラクタの大きさによってこの部分を変える ようにします。 ほかにもいろいろなプログラミングの方 法があります。専用の 2 次元配列を用いた り , 重なり具合を矩形ではなく円などとし WonderWitch でのデバッグは , 何かとめん どうなところがあります。ソースコードレベ ルのテパッグはできませんし , WonderWitch へいったんプログラムを転送したうえでプロ グラムを実行させるというわずわらしい手順 が必要になります。また , 致命的なミスがあ ると表示などがすぐにうまくいかなくなり , テパッグ作業がスムーズに行えません。 セオリーだとは思いますが , デバッグに関 する筆者の私見は , 「バグがあるかどうか検 証して動作を確認した部分を積み重ねていき , 問題があればその一歩手前の状態に戻す」と いうことを繰り返しているだけというもので す。「何々をしている処理」 , 「何々から受け取 る処理」というように部分ごとに分けてプロ グラミングをしている場合 , その部分でバグ がないことがわかっているなら , ほかの部分 に問題が必ずあるとすぐにわかります。この ようにバグがない部分を増やしていきながら , バグがあると思われる範囲を狭めていくよう にプログラミングを行います。 これを Wonde 「 Witch で実践するには , 筆者 の場合 , その方法の 1 っとして , ・始めに仕組みやアルゴリズムを実装する ・そのあとで Wonde 襯 itch 特有の処理を加 ・ WonderWitch 特有の処理は , それぞれの 処理が自分で使いたい形にできるかどう かテスト用ソースコードを作る というようにしています。 て計算で確認する方法などがよく使われて います ただ , この方法のままでは現在表示され ているキャラクタすべてに対して調べなけ ればいけません。そのため配列やハッシュ などを利用してできるだけ計算量を減らす 方法が使われています。 今回の当たり判定については , X 軸方向 にキャラクタがいるかどうかを示すバッフ アを作り , まずここでいったん調べてから 前述の式で当たったかどうかを判定するよ デバッグ方法 もっともバグが入りやすいのは , 自分で作 ったアルゴリズムや関数の連係など「ゲーム そのものに関係する処理や仕組み」です。シ ューティングゲームでは , 敵の動きを実現す るところや進行管理などがこれにあたります。 アドベンチャーゲームではシナリオテータを 解釈する部分などです。こうしたところは , Wonde 「 Witch で実際の画面表示などを行わな くてもテストできる場合がほとんどのはずで す。 それなら WonderWitch の処理を使わないよ うにしていったんソースコードをまとめ , そ れらをテストしてから WonderWitch の機能を 使うという流れでプログラミングするように してみましよう。こうして WonderWitch の機 能を使っていないソースコードにしておくし 通常の統合開発環境を使ったソースコードレ ベルでのデバッグ作業が行えます。 筆者は Borland C + + Builder 5 を愛用してい るので , こうしたアルゴリズムや処理の流れ をまとめたら , Borland C + + Builder 5 上でソ ースコードのトレースなどのデバッグ作業を 行い , ある程度処理の流れを完成させていま す。そのあとで表示など WonderWitch で提供 される機能を加えるようにしています。変数 値なども別ウインドウで確認することができ , ソースコードを 1 行ずつ解釈して実行するス テップ / トレース実行の機能によってプログラ ムの処理の流れが直感的に追いやすくなるの で , 非常に気分よくデバッグできます。 コラム 2 うにしています。この当たり判定は「キャ ラクタが移動したとき」に行うようにしま す。 ■当たり判定の注意点 スプライトとして設定したときに周囲が 空いているキャラクタ同士がぶつかった場 合 , その状態によっては「ぶつかったよう には見えない」場合が出てきます。このと きはそのぶんも含めて当たり判定を考えな ければいけません。 もちろん , ほかの開発環境でもかまいませ ん。フリーのテパッガとしてはたとえばボ ーランド ( 株 ) が無償配布している TurboDebu gger などがあります。このようにしてある程 度仕組みなどを完成させてからプログラミン グを進めるとよいでしよう。 Wonde 「 W 瓰 h の各機能は魅力的ですが , そ れが自分の思ったとおりの処理をしてくれる かどうかはわかりません。実際にそれらをテ ストする簡単なプログラムを作って試すこと が必要になるはずです。このとき , ただ単に テストをするだけではもったいないものです。 作っている本当のプログラムにその機能を組 み込むことを考えて , 呼び出す順番や関数な どを整えておくようにします。そうしておく し前述の仕組みを作ったソースコードとこ のテストプログラムから取り出した関数など を組み合わせることが簡単にでき , それによ ってバグがそれほど含まれないソースコード を作り出すことができます。 とはいえ , ある程度完成したプログラムを WonderWitch 上で微調整するときは , 昔なが らの変数など直接表示して行う p ⅱ ntf デバッグ (sprintf + text_put_string デバッグ ? ) をしてい ます。このとき表示が乱れることがあるので , 画面上の特定の部分はデバッグ用として使う ように分けることをしています。 このようにいろいろと気をつかっていけば スムーズなデバッグ作業は可能になるもので す。がんばってみてください。 1 3 イ C MAGAZINE 2 1 4

5. 月刊 C MAGAZINE 2001年4月号

Standard スレッドロックの本質的な規範は , ロック操作をクラス内部 ・標準 C + + ライブラリはスレッドロックの必要性を最小にす にカプセル化することだ。ロックのコードをコンストラクタに べきである コードをスレッドセーフにする最上の方法は , マルチスレッ 置き , ロック解除のコードをデストラクタに置く。クリティカ ルセクションは次のように複文のような形式で記述することに ド処理と無関係にすることである。たとえば , sqrt のような純 粋関数は , 何も心配する必要がない。この関数はすべての仕事 なる。 {-Lockit ユ oc 新 / / このプロックをロックする をローカルメモリで行う。ローカルメモリはスレッドごとに固 有である。このような関数で問題を引き起こそうとするなら , 〃クリティカルセクション 回り道をしなければならない。 Silicon Graphics の人たちは , Hewlett-Packard で始まった素晴 問題を引き起こす方法の 1 つは , クラスや関数の中で書き込 らしい伝統を継承し , 無料で利用可能なプロダクトとして STL み可能な静的オプジェクトを管理することである。標準 C ライ の拡張を続けている。彼らは素晴らしく実用的な , 訂 L コンテ プラリには , そういうどうしようもない関数がいくつかある。 ナのためのスレッドセーフに関する定義を次のように提示して たとえば , st れ。 k の場合 , 呼び出しの間の状態情報を格納してい る。少なくとも若干の保護コードを追加しない限りは , 2 つ以上 いる。 ・コンテナオブジェクトは 2 つ以上のスレッドから安全に読 のスレッドで s ok をうまく利用するようにサポートすること むことができる ( コンテナは保護されない mutab 厄オブジェ はかなり難しい。標準 C + + ライプラリでは , このような書き込 クトを持たない ) み可能な静的領域の共有を必要としないようにしている。優良 ・同じ型の別のオブジェクトがほかのスレッドから書き込ま な処理系は , 本当に必要でない限り , 書き込み可能な静的領域 れている場合でも , コンテナオブジェクトは 1 つのスレッド を加えることはない。 から安全に読むことができる ( コンテナクラスは保護され もう 1 つ , さらに微妙な方法は , mu ね ble なメンバオプジェク ない共用可能静的オブジェクトを持たない ) トを使うことで複数スレッド処理の問題に対応することだ。あ ・ほかのスレッドから読み出し , 書き込みされている場合 るオプジェクトの中身を読み出しているだけだと思っている場 コンテナオブジェクトは 1 つのオブジェクトから安全に書 合でも , 実際はその内部状態を変更している場合がある。たと き込むことはできない ( 明らかな衝突の回避はプログラマ えば , 見かけは読み出しでも , キャッシュの更新を伴っている の責任である ) 場合がある。 単純にいえば , これらの規則は , 複数スレッドプログラムで , 2 つのスレッドが何も考えずに共有しているオプジェクトを 標準 C + + ライプラリ ( 少なくとも L 部分 ) が驚かせるような挙 読み出そうとする場合 , 一般には保護を必要としない安全な操 動を示さないことを約束している。同様に , 下手に助け舟を出 作であるが , 見えない書き込みにより干渉が生じ , 読み込みの してかえって迷惑をかけてもいけないので , プログラマを助け 際にフリーズしたり , オプジェクトが一貫性のない状態に置か れたりする可能性がある。良質な実装では必要なところでだけ , るために自分のやり方から逸れることもない。 mutable なメンバオプジェクトを使い , ロックされたアクセスを 重要な例として , Microsoft から販売されている Visual C + + は 完全にスレッドセーフではない。 Microso れはこの既知の問題を 提供することで , 読み込みを外部から見たままの安全な状態に 修正するためにいくらか努力しているが , これは V5.0 , V6.0 の する。 どちらも完全にスレッドセーフではない。他方で , 修正の完全 ・すべてのロックはカプセル化しなければならない 例外は生じるものだ ( バンパーステッカーによく書いてある なセットを ことわざだが ) クリティカルセクションの中でさえ例外が生じ http : //稲喞.dinkumware.com/vc-fixes.h し る。例外が生したときに , もともやりたくないことは 0 、 , ク から入手することができる。 を永久にそのままにしておくことだ。だから , そうならないた この変更により , V1sual C + + は , 少なくとも Silicon Graphics めに例外が投げられた場合でも確実に実行される場所にロック の人たちが定義するのと同程度には本当にスレッドセーフにな を解除するためのコードを置いておくことだ。その場所とは , る。 どなたでも絶対にご存じの場所 , ローカルオプジェクトのデス あなたが使っているコンパイラの STL がスレッドセーフかど うかについては , それを書いた人に尋ねてみてほしい。 トラクタの中である。 Standard C/C + +

6. 月刊 C MAGAZINE 2001年4月号

00 フログラミング入門 考えていくことにします。 よって Java の「一度書けばどこでも動く :w ラスとインタフェイスが 2130 個 , フィール rite once, run anywhere 」という性質が実現 ドが 4006 個にメソッドが 17158 個あります。 されています。 さらに , この本に載っているのは標準 AP もっともこういう方式ではなく , Java ソ I [ 注 2 ] だけです。 Java には標準 API 以外にも拡 プログラミング言語としての Java を特徴 ースコードから直接機械語プログラムを生 張 API が多数あります。 Java MediaAPI, Ja 付けるものは何かと考えてみると , 成するコンパイラも存在します。ただ当連 拡張 API がノヾージョン vaMail , など・・ ・オブジェクト指向言語である 載では , とくに断わらない限り , Java プロ アップ時に標準に取り込まれることもあり , ・バイトコードインタブリタ方式である グラムはバイトコードインタブリタ方式で Java のライプラリはいまだ成長を続けてい ・膨大なクラスライブラリが用意されて 動かすと考えてください。 ます。ここでは拡張 API は取り上げません。 いる また , Java のシステムとして主にパソコン 膨大なクラスライブラリ などがあげられます。これらに関してはす で動く「 Standard Edition (JavaSE) 」と , サ でにご存じだと思いますが , ちょっと復習 Java には膨大な量のクラスライプラリが ーノヾアプリケーション用の「 EnterpriseEditi しておきましよう。 存在します。 Wmdows 用の C + + コンパイラ on (JavaEE) 」と , 組み込み用の「 Micro Edit などにも膨大なライプラリは付いています ion (JavaME) 」の 3 種類がありますが , Stand オブジェクト指向 が , 大部分がコンパイラ独自の機能です。 ard Edition のみを扱う予定です。 Java を純粋にプログラミング言語として Java の場合はライプラリが言語仕様 [ 注 1 ] に含 [ 注 1 ] こでは「言語仕様」を JDK の規格の意味に 使っています 見れば , 最大の特徴はやはりオプジェクト まれており , 画像 , GUI, ネットワーク , [ 注 2 ] この場合の「 API 」は , ライプラリと同じよう 指向言語ということでしよう。筆者は個人 な意味だと思ってください。ただ「ライプラ 数学 , データ型などの機能を , どこでも使 リ」が実装を含めた意味があるのに対し , 「 A 的に , このオプジェクト指向という言葉に うことができます。ほとんどの言語が文字 PI 」は実装とは無関係に仕様だけを取り決 めたものというニュアンスの違いがありま コンプレックスというか愛情と敵意という の入出力しかサポートしていないのに比べ す か , ちょっと複雑な感情を持っているので ると , きわめて異例です ( 聞くところによ すが , そのあたりに関しては特集「 " オプジ ると EiffeI という言語にも巨大なライプラリ ェクト指向 " をこう考えてみよう」をお読み が存在するそうですが ) 。 ください。 C 言語専門のニュースグループあたりで JDK ジョン オプジェクト指向のことは , 当連載でも 「画面に円を描くにはどうしたらよいです ときどき説明していこうと思います。 か」などと聞くと , 「処理系定義です」と答 Java は何回かパージョンアップを繰り返 えられて悲しい思いをすることが多かった バイトコードインタブリタ しており , そのたびに JDK の番号が増えて のですが , Java の場合はそんなことはあり います。 ' 98 年の JDKI. 2 へのアップグレード 先ほども言いましたが , 通常 Java はバイ ません。グラフィックも Java の機能として のときには , 言語仕様とライプラリ構成に トコードインタブリタ方式で実行されます。 扱ってくれます。もっとも「簡単だから自 いくらかの変史があったため , それ以降の まず , われわれがエデイタなどで Java の 分で調べなさい」と言われるかもしれませ Java を「 Java2 」といって区別することになり ました。当時 , ーーー・般の新聞に「 Sun が Java に プログラムを書きます。それを javac という んが。 続く新しい言語 Jav を発表」なんて記事が コンパイラにかけると , バイトコード (. clas 筆者の手元に『羽 le Java Devel 叩 ers 載ったのですが , 新しい言語というわけで s ファイル ) が生成されます。 C 言語などの Almanac 2000 』という本があります。 B5 判 はなく : ava の枠内でのパージョンアップ 場合 , コンパイラで作られるのは CPU に直 より少し小さい判型で , 厚さが 5cm 強。ペ です。 接作用する機械語プログラムですが , javac ージ数は 1057 ページ。ちょっとした電話帳 現在 ( 2001 年 1 月 ) , Sun 提供 JDK の最新バ で作られたバイトコードは単独では動きま なみです。これがどういう本かというと , ージョンは 1.3 です。しかしそのほかのプラ せん。各機種・各 OS ごとに Java を実行する Java のライプラリに入っているクラスとそ ットホームの場合 , リリースが遅れること プログラム , J 、盟が用意されています。 JV のメンバの名前だけを記述した本なのです。 があり , たとえば Macintosh にはまだ JDKI. M はバイトコードを受け取って , それを読 ほんとに名前だけ。説明はほとんどなし。 1.8 相当の開発環境しかありません。番号が み取り , 実際の動作を行います ( Fig. 1 ) 。 1.1 以降ならあまり支障はありませんが , な 小さな文字でクラスとその内容の名前だけ るべく最新の JDK を入れるようにしてくだ 一度コンパイルされたノヾイトコードはどの が書かれているのです。この本によると , JVM でも同じように動きます。この方式に JDKI. 3 においては , パッケージが 77 個 , ク Java の基礎概念 イ 6 C MAGAZINE 2001 4

7. 月刊 C MAGAZINE 2001年4月号

は証明に相当するといってもよいのです が , 証明にはプログラム同様 , 読みやすい 証明と読みにくい証明があり , その読みや すさもスタイルに起因するものだけでなく ロジックの自然さもあります。つまり口ジ ックの立て方やその並べ方ですら慣習に支 配されているといえます。そこで数学者は 日々 , 他人の書いた証明を読むことで証明 の慣習を知り , それを実践しているんです ね。数学の論文も正しければそれでよいわ けではないのです。 言語ゲームは幻という考え方は認めたく もその濫用はときには難解なコードを導き とも楽しい部分の 1 つだと感じます。けれど ろっており , Ruby のプログラミングのもっ 的なプログラミングのための道具も多くそ のオプジェクトです。このことを使った動 さて , Ruby ではクラスやモジュールも 1 つ なるわけです。 果 , 読みにくいコードになるということに なっていってしまうことでしよう。その結 のコードはどんどん慣習から外れたものに 方というものを押えておかないと , あなた できます。しかし , まずはストレートな使い ッコいいコーディング法を開発することも でコードをとても短くしたり , 自分的にカ いるので , これらの機能を使いまくること 負担を軽減する多くの機能から成り立って です。いつばうで Ruby はプログラミングの Ruby のやり方というのがやつばりあるよう とです。明示的ではないものの Ruby には ば既存のコードを読む必要があるというこ きないということになります。いい替えれ ードを書くにはプログラマの習慣を無視で 話を戻すと , プログラマが読みやすいコ あとで自分がわかるように 観 [ 53 ] ある」とするヴィトゲンシュタインの言語 [ 注 2 ] 「言語の意味は存在せず利用だけが かに持っているようです。 はその利用によって規定される側面をたし ありませんが , およそ言語と名の付くもの ます。そこで今回はクラスとモジュールの 役割とその使い方を見ていきましよう。典 型的な使い方は目的を正しく理解すること で身に付けることができるものです。また 使い方のよい悪いをいくつか議論します。 モジュールの役割 まずは基本からやってみましよう。 Ruby でモジュールの果たす役割は , 大きく分け て 2 つあります。 1 つは名前空間の生成です。 定数や関数の名前がぶつかりそうなときそ の名前をひとまとめにして遮蔽する効果が あります。もう 1 つの役割は , m ⅸ - in のためで す。多重継承を意図的にサポートしていな い Ruby のような言語では必須の機能で , 1 つ のクラスに複数のモジュールを組み込むこ とができます。 名前空間としてのモジュール とくに定数のように名前がぶつかるかも しれないものを分けておくのには , 長い名 前を作るよりも名前空間を分けるほうがよ いことが多いでしよう。また , 名前空間を分 けておけば , あとでその名前空間を別の場 所に展開できます。典型的な例としては Fi le::Constants があります。 File はクラスです が , CIass は ModuIe のサプクラスなので , の場合は名前空間としても使われています。 そして名前空間としての File の中に Cons ね nts というモジュールが用意されています このモジュールは File オプジェクトのメソ ッドで用いられる各種の定数をまとめてあ るところです。その名前と値の一覧は次の end p [c, k. const—get (c) ] k. constants. each do lc ー k = File : :Constants ようにして表示できます。 た名前の定数の値を返します。 ソッドです。また const et は引数で指定し 数名を文字列として格納した配列を返すメ ModuIe#constants はそのモジュールの定 もし , あるモジュールやクラスでこのモ ジュールをインクルードすれば , そこでは これらの定数を名前演算子「 : : 」を使うことな しにアクセスできます。現実的な例ではプ ロトコルを実装する場合があります。プロ トコルのライプラリではコマンド名やデフ ォルト値など多くの定数が必要になります が , これらの定数をアプリケーションで利 用することがある場合は , ちょうど File : : Co nstants のように定数だけをモジュールにま とめておくと便利でしよう。 mix - in としてのモジュール m ⅸ - in は多重継承の欠如を補います。まず , あるモジュールを複数のモジュールやクラ スにインクルードできます。組み込みにあ るモジュールでは EnumerabIe や Comparable が複数のクラスにインクルードされていま す。また逆に 1 つのクラスに複数のモジュー ルをインクルードできます。組み込みでは String が Enumerable と Comparable をインク ルードしています。 後者の用法は原理的には多重継承と同等 の機能を与えるのですが , 前者の用法を目 指したモジュールの設計のほうは , 汎用性 を考える機会となり楽しいものです。たと えば , 総和や平均などの統計処理を行いた いことがあります。そこで統計処理を行う ための m ⅸ - in として Ma 市 : : S ねⅱ s ⅱ cs を作って みましよう。統計が行えるために必要な条 件は , ・要素を列挙できること ・要素数がわかること ・要素の四則演算ができること です。 1 番目の条件から Sta ⅱ stics に必要な機 能として , each があることが期待されます。 2 番目の条件は size を持っていることを期待 します。この 2 つの要求は Enumerable であれ ば満たされます。そして最後の条件からは 要素の四則演算ができることが期待されま すが , たとえばハッシュの値に関する統計 をとりたい場合などには , 要素そのものの 四則演算をしたいわけではありません。そ 92 C MAGAZINE 2001 4

8. 月刊 C MAGAZINE 2001年4月号

五ロ 一三ロ です。 偽の値については今後よく出てくるのでし ・整数値で除算を行うと小数点以下は切 っかり覚えておきましよう。 り捨てられる 条件判断には if 文を使用します。処理を ・整数に対して % 演算子を使用すると , 行うときに「もし ~ なら」という条件を与え 余りを求めることができる る場合に使用します。 迂 ( 条件 ) { 条件に合った場合の処理 } ・ 0 で除算を行うことはできない。工ラ ーになるので変数の値に注意が必要 と記述します。 List7 は関係演算子と条件 ・計算は左側から順に計算される 文の使用例です。 ・優先順位は数学と同じ。「 * , / 」は 論理演算子 「 + , - 」より優先され , 「 ( ) 」 ( カッコ ) があるとその中がさらに優先される ・計算処理時には基本的には整数同士 , 論理演算子は真偽値を否定したり , 先ほ 次に , プログラミングには必ず必要な演 実数同士で行うが , 混合させて計算す ど説明した条件を複数組み合わせたりする 算子の基本事項を説明します。はじめに覚 ることもできる。その場合 , その答え 演算子です。論理演算子の一覧を TabIe 11 えなければいけない演算子は以下の 3 つです。 は実数表現になることがある に示します。 ・算術演算子・・・数値の計算を行う List 6 は算術演算子の使用例で , Fig. 6 が Table 11 の演算子 ! ( 否定 ) の例で , ・関係演算子・・・ 2 つの数値 ( cha 「型は文字 実行結果です。 Fig. 6 List 6 の実行結果 コード i 猷型として認識される ) の 関係演算子 大小関係を判定する ・論理演算子・・・真偽値を否定したり , 複 数の条件を組み合わせたりする 関係演算子は , 2 つの数値 (char 型は文字 コード int 型として認識される ) の大小関係 算術演算子 を判定し , 真 ( 与えられた条件を満たす場 合 ) なら 1 , 偽 ( 与えられた条件を満たさな い場合 ) なら 0 を返す演算子です。関係演算 算術演算子の一覧を TabIe 9 に示します。 子の一覧を TabIe 10 に示します。この真と 以下は算術演算子を利用するときの注意点 TabIe 10 関係演算子 演算子 より小さい より大きい より小さいか等しい より大きいか等しい 等しい 等しくない TabIe 11 論理演算子 説 明 演算子 ・ c = 0X41 ; ・・・ 16 進数コード 文字コードをすべて覚える必要はありませ んが , これらの表現方法とその違いは覚え ておきましよう。 また , このほかに先ほど登場したエスケ ープ文字列を含む , 表示用の文字コードで はなくそれぞれの意味や機能を持つ文字コ ードもありますが , ここでは省略します。 演算子 整数 積 = 33 整数 商 = 3 整数 余り = 2 整数 和 = 14 整数 差 = 8 実数 商 = 3.666666 List 演算子を使ったプログラム 、 1 : #include く 8 セ dio. h> 4 int ia, ib, , id, ie, ih, 土新 float fa, fb, fc; 土 a = 1 土 b = ic=a*b ー 9 : id=a/b; ユ 0 : 土 e = a 宅 ユ 1 : 土 h = a 十 12 : 13 ま p て土れ tf ( ”整数 積 = 宅 d % 土 0 ユ 4 : p て i れ tf ( ″整数 商 = 貊 % 土 d 15 : て intf ( ”整数 余り = 記”は e ユ 6 p て土 ntf げ整数 和 = 宅 d % 土 h 17 ま p て土 ntf ( ”整数 差 = 宿 d ” , 土土 18 19 : 20 : fa=ll. 21 : 。 fb = 3. fc=fa/ fb; 22 ま pr 土北 f ( ”実数 商 = 社 % fc 23 : 補足 例 説明 a<b a>b a く =b a>=b 等値演算子 否定演算子 例の意味 a が真 ( 0 以外 ) でなければ ~ a が 0 より小さくなければ ( a = = 0 または a > 0 ならば ) 0 く a かっ a く 100 ならば ~ a = = 10 または a = = 100 ならば ~ 例 if(!a) 否定 論理積 ( ~ かっ ~ ) 論理和 ( ~ または ~ ) if(!(a く 0)) if(0<a & & a く 1 00) if ( a = = 10 Ⅱ a = = 100 ) 39 特集 プログラミング入門 C 言語入門講座

9. 月刊 C MAGAZINE 2001年4月号

Microsoft VisuaI Studio 0 ProfessionaIEdition 1 & VisuaIC + + 6.0 プログラミング入門編 Ⅵ 0 に + + 6.0 フログラミング 0 1 名 Windows 阪 / Me / NT / 2000 など の OS を提供するマイクロソフト の C / C + + 言語統合開発環境。機 能修正のための Se Ⅳ ice Pack 5 も配布が開始され , より安定し た環境を提供する。あわせて , Ⅵ sualC + + を利用したウインド ウブログラミングの入門書をセ ットで提供。ウイザードを利用 しないプログラムの解説で , ウ インドウアプリケーションの知 識を学ぶ。 マイクノフトビジュアルスタディオ 0 , メントンム プ 0 フェンヨナルエアイン一ン C プログラマーのための Ⅷ n 面 ws プログラミング入門 田中正道ーーー 門 0S0 代 professionat Edition 提供 : マイクロソフト株式会社 ソフトバンクバブリッシング株式会社 価格 . オープン価格 ( 推定小売価格 148 , 000 円 ) 価格 . 2 , 800 円 動作環境 . Windows 95 / 98 / NT4.0 / 2000 ISBN コード :ISBN 4-7973-1053-3 URL : http:″www.asia.microsofi.com/japan/ U RL : http ://books. softbank. co.jp/ BorIand C + + BuiIder 5 ProfessionaI 2 詳説 C + + 1 名 実績のある C / C + + コンパイラと , GUI 開発に貢献する RAD ツール を兼ね備える開発環境。最新技 術のサポートはもちろん , RAD とソースコードが常に連動する 2Way - T001 機能によって , さまざ まな開発スタイルに柔軟に対応 する。本誌連載をもとに書籍化 された , C + + プログラムを安全に 作るための C + + 解説書とセットで 提供。 Windows ′ 9 & 95 , NT / 2 网 詳説 Hi 曲印 e 面 rm 聞 s + + visualdevelopment with Database and InternetT001s ーーー画第目 er 新 使いやすいビジュアル開発環境 ・ 0 以上のコンポーネント ・メモリバグを検出する c 。 G d ・インターネット対応 ・多彩なデータベース機能 ・既有の資産の再利用 十十 ANSI C + + 完全理解 圧倒的な生産性を誇り、多様なニーズに応える C + + で実現されたビジュアル開発ツール 大城正慢】 円 0 SSion 提供 . ボーランド株式会社 価格 : 68 , 000 円 動作環境 . Windows 95 / 98 / NT4.0 / 2000 URL : http://www.borland.co.jp/ ソフトバンクバブリッシング株式会社 価格 : 3,000 円 ISBN コード :ISBN 4-7973-1225-4 URL : http://books.softbank.co.jp/ 1 2 C MAGAZINE 2001 4

10. 月刊 C MAGAZINE 2001年4月号

五ロ 吉野智 本章は「 C はある程度わかるけれど C + + は未経験 ! 」という人のため の入門講座です。 C と C + + は兄弟ですが , C + + は C に比べて異様な ほど油がのっていて消化に悪い言語です。とりあえず , この講座が みなさんの消化薬として役立てば幸いです。 四則演算をプログラマが定義した処理で行 るのかを考えてみましよう。 うことができます。したがって , C と比較した C + + の複雑さの壁 C + + の母体となっている C はその言語仕様 は , i がどのようなオプジェクトかによって が非常にシンプルで , 1 度でもアセンプラ 大きく意味が違い , 発生する機械語は想像 C + + は C を母体とした高級言語です。 C は で開発を行った経験があれば記述した C の すらできないことがあるのです。 アセンプラの代用にも使用できるため , 今 日では近代 OS の記述言語としては非常にポ コードがどのような機械語に展開されるか 言葉の壁 ピュラーです。これに対して C + + は , OS の をある程度想像できるようになります。実 C + + を学ぶうえでのもう 1 つの大きな障壁 際 , 筆者もデバッガ上のアセンプラコード 記述言語というよりはアプリケーション記 に「言葉」の違いがあげられます。すでに を見てバグに気がついたりします。これは 述言語としての地位が主という趣がありま こまでの説明でも「オプジェクト」といった C がもともとそういった用途に設計されて す。もっとも , OS 開発を頻繁に行わなくて いる点と , 最近のコンパイラの最適化が高 言葉が「不用意に」出現しています。 C + + は はならないというケースは非常にまれなの 「メソッド」「オーバロード」といったカタ 度になり , 実行コードにムダな部分がほと で , アプリケーション開発を主目的とする カナ言葉はもちろん , 「継承」「派生」とい んどない点が大きく貢献しています。これ C + + のほうが , 求められる機会が多いこと った普段はほとんど使わない日本語も出て に対して , C + + は C のシンプルな部分はその は間違いないでしよう。実際 , 現在使用さ まま受け継いではいますが , 追加された仕 きます。「 A さんのところの子供は 3 歳にな れている処理系で純粋に C のみを処理する 様があまりにも巨大なため非常に複雑な言 っていて , 母親から性格をそのまま継承し ものは少数派で , 多くのコンパイラが C を ている」とは普通は言いませんよねえ。 含む C + + 処理系として提供されています。 語になっています。 C + + のもっとも難解な点は「言葉」が表し また , 筆者が C + + に出会ってから 10 年近 C + + コンパイラを持っていても今まで C の ている「プログラム言語上の概念」です。英 この講 く経過していますが , この 10 年間だけでも 機能しか使えなかったという人は , 語を日本語に翻訳するとき , その「プログ べンダ拡張 , ANSI 規定をも含めてかなりの 座で C + + を学んでください。 ラム言語上の概念」までは正確に日本語に 変更・拡張が施されています。要は「拡張」 C + + 学の壁 直すのは困難です。たとえば , 身近な Wind を「現実」にすり合わせするためつぎつぎと ows でよく使われている「プロバティ」に該 変貌をしたわけですが , これが C + + の複雑 当する日本語はあるのでしようか ? 筆者 さに輪をかけています。 C + + はいわゆる「オプジェクト指向」の言 筆者が C に比べて C + + がとくに難しいと感 は一晩考えてあきらめました。 じる点は , だとわれていますが , 実際に C + + コン ロロに一 本講座の方針 「 C + + ではコードからコンパイル後の機 パイラを使用している人でも , オプジェク 械語を想像できない」 ト指向を取り入れた「本当に C + + らしいプロ ことです。 グラム」ではなく , C + + の一部の機能だけを たとえば , C + + では言語仕様上「演算子の つまみ食いした C プログラムを書いている C + + 学習の 2 つの壁を考慮した結果 , 本稿 オーバロード」が・・・・・・すいません , 言い換 ケースが少なくありません。まずは , C か 座は次の 2 点を遵守して進めます。 えます。 C + + では + とか * とか / とかいった 1 . サンプルコードのコンパイル結果 ( 機械 ら C + + に移行する際に何が " 壁 " になってい はじめに 1 特集プログラミング入門 c + + 言語入門講座 41