|
C/C++プログラマへアドバイス - やまざき@BinaryTechnology
「デスマーチと戦う武蔵流プログラマ やまざき のページ」 |
|||||||||||||||||||||
|
やまざきが書いた本
やまざきが寄稿した本 |
|||||||||||||||||||||
|
最近、メールや掲示板などで、C/C++プログラミングに関する質問が増えてきました。 何度も同じ質問に答えるのも時間の無駄というか、いま自分が思っていることをまとめると言う意味で、ある程度「プログラマもしくは、プログラマを目指す人へのアドバイス的なモノ」をここに書き連ねてみます。アドバイスとはいえ、私の力量ではたいしたことは書けませんので、あまり期待しないように。ただのリンク集になる可能性も・・・無いとは言えない^^;。 (なお、ここにあるリンクはほぼすべて無断でリンクさせていただいています。リンクしないでほしいという方がおられましたら、メール下さい。即刻対応させていただきます。m(__)m)
プログラミングを勉強したいのでC/C++を勉強したいという人は多いと思います。 まず最初に注意点として「C/C++は、言語として、高度で、奥が深く、簡単にすべてを見通せるものではない!」ということです。驚かしていますが、それだけの覚悟が必要な言語であることをまずは理解してください。 確かにC/C++を習得すれば、他の言語を知らなくてもまったく問題ないほど「ほとんどのプログラム」を作ることができます。そのことは逆に「それだけいろいろなことができる」「それだけ奥が深い」ことも意味しているのです。 もともと、誰でも簡単にプログラミングできるように配慮されて作られた言語ではなく、UNIXのカーネルを記述するために、プロな人がコンピュータの資源をフルに引き出すために、なんでもできるような強力なツールとして作ったモノなのです。 そのため、よりハードウェアに密着した知識、物理メモリの概念や、実行時のメモリの状態(静的とか、動的とか)、CPUのタイプ(ビックエンディアンとか、リトルエンディアンとか)の知識が必要とされ、あきらかにその他の言語(FORTRAN,BASIC,COBOL,Pascal,etc...)より多くの知識が必要となります。 よって、C/C++はプログラミングの勉強に「適した言語では無い」とも言えます。他の言語を簡単に習得した後、C/C++にステップアップする道をお薦めします。 で、純粋にプログラミングの勉強をしたいのであれば「JavaScript」がお薦めです。JavaScript は FORTRAN,BASIC,COBOL,Pascal などの言語と同じ用に、ハードウェアの概念は隠蔽されていてプログラミング時に考慮する必要はありません。普通の言語はハードウェアは隠蔽されるのが一般的で、C/C++が例外的とも言えます。 まずはこれで、一通り「プログラミングとはどういうモノか?」を習得し、その後(メモリとはどういうものか?勉強しつつ^^;)C/C++へステップアップすると良いでしょう。 「JavaScript」の良いところは、
ちなみに、JavaScript は Java とはまったく違う言語なので、混同しないように、ご注意下さい。 インターネットで JavaScript と検索すれば、たくさんの文献が見つかると思いますが、お薦めはこちら↓。(長い間更新されていないみたいだけど^^;) 独学JavaScript http://www.ueda.info.waseda.ac.jp/~gaku/js/ さらに JavaScript は マイクロソフトによって、JScript と名前を変えて、いろいろ強化され、現在も強化は進行中?(最近は更新されていないけど、そろそろ消えたりして^^;)であり、WSH(WindowsScriptingHost)など Windows系のバッチ処理言語として使われています。JScript や WSH は JavaScript はマスターしたので、さらに極めたいというプログラマにお薦めです。 JScript は JavaScript に Windows系の処理オブジェクトが追加され、さらに構文も C++ に近くなるよう強化されています。JScript と WSH についてはこちら↓を参照のこと。サンプルプログラムや、Win95/98で WSH を動かす環境が無料で手に入ります。 Microsoft Scripting Technologies http://www.microsoft.com/japan/developer/scripting/default.htm 2003/06/02: 追伸: 最近思うのは、Flash でプログラミングの勉強とかするのもいいかも…と。ActionScript という言語でコードが書けるのですが、Flashの体験版なら無料ですし…コードを書かなくても遊べますし。いろんな入門にいいかもしれません。
C/C++の本はたくさんありますね。どれでも良いと思いますし、どれもそんなに変わらないと思います。(そんなに細かくチェックしているわけではないので、詳しくはわからないです。柴田 望洋 氏や、林 晴比古 氏の本がわりとメジャーですね。) で、はっきり言ってしまえば「初心者に適切な本は無い」ような気がします。どれも文法や書き方の説明に重視し、C言語の危険性や、間違いやすいコード、初心者の陥りやすいバグなどの解説はまずありません。逆に、危険なコードをサンプルとして載せている本がたくさんあります。 たとえば、サンプルコードに「while(*p++){ ...」などというコードがなんの警告も無く書かれていたらその本は「要注意」です。 理由はたくさんありますが、まず変数名が 'p' 一文字というのは意味不明だしバグの元なので危険です。 また、while 文は条件式を書くところなのに「短く書けるから」という理由だけで実行文を書き込んでいるところも「危険」です。 だいたいこのコードを見てどんな動きをするのか?簡単に理解できないとこを知りつつ、それでもサンプルとして書いているというスタンスもヤバイです。 そもそもC言語で「コードが短く書ける」のはただの特徴の1つであって、必ずしも「短く書かなければならない」とか、「長いコードはそれだけ性能が落ちる」とか、そんなことはまったく無いのに、それを知りつつ短いコードを書くメリットなんてなにも無くて、それはデメリットだと思うのですけど、なぜサンプルに載せるのでしょうね。そんなに紙とインクが勿体無いのでしょうか?。勿体無いのでしょうね。うーん、思わず愚痴ってしまいました。失礼。^^; そんなわけで「どの本でも同じ」なので「お薦めの本は無い」ってことで納得していただけないでしょうか?。^^; ただ、これは必須というか、熟読はしなくても机においておいて辞書のようにパラパラと見る本として、以下の2冊をお薦めします。 ですが「初心者用の本ではない」のでくれぐれも気をつけてください。はじめて読んでも読み切れないと思うし「さっぱりわからない」とも思います。しかし、この本は「わかりやすい本」ではなくて、教科書というか、C/C++の基本が書いてあり、みんながこれを読んでいて、これを元にこの世界が動いているという背景が重要なのです。くれぐれもその点を誤解の無いよう気を付けてください。 「プログラミング言語C 第2版」 共立出版ISBN4-320-02483-X C3041 P2800E と、 「プログラミング言語C++ 第3版」 アスキーISBN4-7561-1895-X C3004 P7000E この2冊は外せないと思います。 どちらも「腐ってもANSI規格準拠」ってやつでして、たとえボロでも標準規格があるととってもたすかるのです。ホントに私はそう思ってます。 なぜって、標準規格が無いと、このコンパイラでは動くのに、別のコンパイラではエラーになる などという、なんとも不便なことが起こるのです。これが、標準規格のおかげで、この標準規格を守っていればどのコンパイラでも問題無く動くコードが書けるのです。これは、プログラマにとって、とっても助かることなんです。 また、人に説明する時や、答える時でも「これらの本の何ページに載っている」などの話がよくあるので、買っておいて損は無いです。というか、買いましょう。^^; で、プログラミング系の本は全体的に値段が高いので、値段を見てしり込みする人も多いようですが、この世界の運命というか、そんなに数が出ないので、しかたがないですね。あきらめましょう(^^;。 最後に、やまざきの内緒の一押し本を紹介しておきます。それは 「C/C++によるプログラミングスタイルブック」林 晴比古 著 A5判 ISBN4-7973-1183-5 です。 C/C++プログラマの中には林氏を嫌う人もいるようですが、この本は良い本だと思います。(他の林氏の本はあまり読んだことがないのですが^^;) どこがどう良いのか?というと、私がプログラミング時に一番気をつけている「可読性」について書かれている本だからなのです。こういった可読性に焦点をあてた本は少なく、貴重な本だと思っています。ただ、これはC/C++の解説本ではないので、C/C++が知りたい人は他の本も合わせて買いましょう。
よく「お薦めのC/C++環境は?」と聞かれますが、お薦めできるモノって、無いんです。(^^; その人に合った環境が有るだろうし、そんなに安いものでも有りませんので。「なにをしたいか?」によって決まると思うのです。 で代わりというか、今、私が主に使っている環境を書きますと、基本は Windows で、VC++6.0です。 買ったのはこっち↓。 Microsoft Visual Studio 6.0 Professional Edition http://www.microsoft.com/catalog/display7.asp?site=737&subid=36ですが、 使っているのはこれ↓。 Microsoft Visual C++ 6.0 Standard Edition http://www.microsoft.com/catalog/display7.asp?site=755&subid=36です。 私が、VC++ を使っている理由は、とにかく C++ としてのポテンシャルの高さがあります。 最新の STL や、テンプレートをサポートしていますし、コンパイルの速度、最適化の能力、強力なデバッガ、至れり尽くせりのエディタ、ヘルプの情報量、ほとんどの項目でトップクラスなのです。(それなりにお金をかけて作っているだけのことはあるということ^^;) また、使っている人も多く、文献が多い(多すぎる)のもメリットだと思います。 で、VC++ は C++ としては良い環境なのですが、Windows系のプログラムを作ろうとすると、MFCというクラスライブラリが出てきて、急に難しくなるのです。(個人的にはMFCは VC++ の唯一の汚点だとも思っています^^;)ので、Windows系のプログラムを作るならこれ↓ ボーランド http://www.borland.co.jp/の C++Builder http://www.borland.co.jp/cppbuilder/index.htmlが良いと思います。 VB と似た RAD 環境と C++ というなんとも不思議な取り合わせの環境です。(というか VC++ もこのくらい簡単に Windows プログラムが作れるべきであると思いますけど。^^;) そうそう、C++Builderの「三角の実行ボタン」は挙動が怪しいので、押さないほうが良いと思います。ファンクションキーを使いましょう。微妙に挙動が違うようです^^;。 で、私が使っているのは C++Builder ver.5です。 あとは互換性のチェックのために、GCC を使っています。汎用性のあるコードを書かないとせっかく書いたコードも無駄になってしまいますので。自分の書いたコードが、ANSI 仕様なのか、VC++ 特有の機能なのか、よく把握しておくことも重要です。 知らずに VC++のみのコードを書いていて、あとで泣くのもいやですから。こまめに、複数の環境を使いこなすのも良いことだと思います。 VC++ で出ないエラーも、GCC で出たり、またその逆もあります。両方の環境でエラーの出なくなったコードこそ互換性のあるキレイなコードであると私は思っています。 たとえば、CString は VC++ でしか使えないクラスですが、std::string は VC++ でも GCC でも使えます。ってことは、std::string を使ったほうが、互換性が高く、今後「何かとお得」ということなのです。 で、GCC は いろいろな種類がありますけど、Windows系なら DJGPP が良いかと。 DJGPP を動かすために必要な最小限度のものは http://www.delorie.com/djgpp/
わりと簡単に C++ の環境が「ただ」で手に入ります。挑戦してみてください。 でも「MS-DOSプロンプトってなに?」な人には使いこなせないので、そこは勉強して下さい。 あと、小さくて、フリーなC言語として有名なのは「LSI-C-86試食版」があります。 いきなり、C++へ行くよりも、C言語からゆっくり勉強したい人はこちらが最適でしょう。 最低限の知識として DJGPP と同じように「MS-DOSプロンプト,LZH解凍,テキストエディタ」は必要です。難しい話ではないので、こちらも勉強勉強^^;。 「LSI-C-86試食版」は エル・エス・アイジャパン株式会社 http://www.lsi-j.co.jp/index.htmlの フリーソフトウェア集 http://www.lsi-j.ab.psiweb.com/freesoft/index.htmlにあります。 ここを見てもよくわからない人は C言語入門インターネット版->LSI C-86 v3.30cについて http://homepage1.nifty.com/toshio-k/prog/c/ を参照のこと。
JavaScript へ戻ることができるなら、そちらから再スタートと言うのも1つの選択肢だと思います。 C/C++をはじめて最初につまずくのはおそらく「型ってなに?」「型変換(キャスト)ってなに?」 と、この当たりでつまずいている人も多いと思います。 JavaScript や perl など「型」という概念の無いプログラミング言語は実はたくさん有ります。(VBもそうかも)(型の指定ができるのに指定しなくてもOKという言語は「型の概念が無い」と解釈してます。) なぜ、「型」という概念が必要になってくるかと言うと、小さなプログラムを組む場合はそれほど問題無いのですが、大きな(100行とかを超える)プログラムになってくると、変数の数が増えてきます。それに伴い、その変数を「なにに使っていたのか?」「数値を入れていたのか?」「文字を入れていたのか?」わからなくなってしまい「数値を入れるところなのに文字を入れてしまったり」またその逆をしたり、まちがいやすくなるのです。(バグが入りやすいとも言う) ここで「型」という概念を持ち込んで、この変数は「数値(int)専用」とかこの変数は「文字列(string)専用」とかを決めることで誤って数値(int)の変数に文字列(string)を入れることをなくそう、という概念なのです。 Cコンパイラが型のチェックをしますので、型の違う代入はエラーとなり実行できないのです。 逆に、エラーの無いプログラムでは型の違う代入は無い(数値(int)の変数に文字列(string)などは入れていない)ちゃんとしたプログラムである ことになるのです。 要するに、大きなプログラムになると変数の管理が大変なので、変数の使い方の間違い探しをコンパイラがチェックして手伝ってくれる ありがたい仕組みなのです。^^; で、こういったC/C++の質問を受け付けてくれる掲示板がいくつかあるので、そこで質問すれば、たいていの問題は解決します。 でも、質問する前に、自分の力で問題を解く努力をしましょう。必ずしも前を歩いている人がいるとは限らないので。 お薦めはこちら↓。 VC++ 超初心者のページ http://cgi.members.interq.or.jp/gold/marken/のなかの お気楽掲示板 http://cgi.members.interq.or.jp/gold/marken/bbs.htm辺りで聞きましょう。 で、質問するときは「どんな環境で、どんな現象になって、何がわからないのか?」ちゃんと日本語で書きましょう。なかには「わかりません、教えてください」という文だけという、幼稚園児のような質問もありますが、そんな質問は完璧に無視されますので、って、ここで書くほどのことではないのですけど。たまに見かけるので気をつけてください。 ここでちょっと蛇足!。「VC++6.0 のちょー簡単な使い方」をこっそりお教えしましょう。 VC++ って、多機能で、沢山のボタンがあって、メニューもいっぱい、設定もいろいろ。はじめて起動したときは何をして良いのか唖然とするでしょう。 そこで、私が習得した簡単な使い方をお教えします。(って知っている人は読み飛ばしてください。こんなことを自慢するのははずかしいので。^^;)
VC++を使うときに特に注意してほしいのは、そのコードは「MFC なのか?、Win32APIなのか?、ANSI準拠なのか?」ということなのです。C++の勉強をしているつもりで一生懸命 MFC の使い方を勉強している人をたまに見かけます。また、個人的には MFC はC++のお手本として良い題材とは思いません。STL の勉強をお薦めします。 VC++を終了すると、先ほど作ったフォルダの中に、いろいろなファイルが作られますが、それは VC++ が作ったファイルです。残しておけば、いろいろなことを覚えておいてくれて、次回からの起動が楽になります。できれば、.dsw プロジェクトワークスペースから起動してください。そちらが2回目からの正しい起動方法になります。最悪 .cxx ファイルがあれば、[F5] を押すだけ で復活できますけど。^^; あとは適当にサンプルプログラムを入力して「[F5] を押す」の繰り返しです。include?, puts()?, getchar()??? わからないことが出てきたらどうするのでしたっけ?(^^)。では、 がんばってください。
C/C++の上達への道は、 人のコードを、読む、読む。そして、自分でコードを書く、書く。 わからないところは、調べる、調べる。そして、コードを書く、書く。 それでもわからないところは、聞く、聞く。そして、コードを書く、書く。 この繰り返し、です。 要するに、自分でコードを書くのが一番の上達方法だと思います。 で、最初はなにをどう書くのかわからないと思うので、それは人のコードを参考にしましょう。(まずは上の2つの本が良いです。基本ですから。) 最近は、コードをインターネットで公開してくれる人が増えまして、良い世の中ですね。 で、参考にする時に「なんだかわからないけど、動いているからいいや」 ですまさないで、ちゃんと自分の書き方で書き直して、自分のモノにすることをお薦めします。 どんなコードでも、自分で書くことに「上達への道」があると思います。 また、ここが重要なのですが「書く」のと「読む」のでは、圧倒的に「書くほうが簡単」なんです。実は。^^; なぜか?って、書くのは自分の理解しているコードを吐き出せは良いだけで、逆に、読むには、自分の知らないコード(相手の書き方)も理解しないと、読めない ということだからです。 たとえば、while() 文なんて知らなくても、for() 文さえ理解していればプログラムは書けます。しかし、誰かが while() 文を使ったコードを書いていたら while() 文を理解していないと読むことはできないのです。 同じように、ポインタを知らなくても(理解していなくても)ある程度のコードは書けますが、逆に、ポインタで書かれたコードを読むにはポインタを理解していないと読めないということなのです。 このように、実は「書く」のは簡単なことなのです。(自分の土俵で相撲をとるようなものですから。) しかし、人のコードを読むのは大変です。知らない文法を使っていたり、変数の意味がわからなかったり、バグがあるかもしれない。 とにかく、文法が読めても、相手の「考えていること」まで読まないといけないので大変なのです。 で、なにが言いたいのか?というと、「人のコードが読めないから自分はC/C++が出来ない」 と勝手に決め付けないでください。と言うことなのです。 確かに、読めないよりは読めた方がよいですが、読んでもよくわからないコードは結構氾濫しているのです。 それに惑わされないように、参考にしたコードを鵜呑みにせず、必ず自分で書き直して、自分のモノにしてください。 それでは、サンプルコードのご紹介。 まずはC言語のサンプルコード 奥村晴彦のホームページ http://www.matsusaka-u.ac.jp/~okumura/の中の 『C言語による最新アルゴリズム事典』全ソースコード http://www.vector.co.jp/soft/data/prog/se002453.html このコードは DeepFreezer を作る時にいろいろお世話になりました。 ここにあるコードをそのまま DeepFreezer で使っているというわけではありませんので、念のため。^^; で VC++ 用の Windows系プログラムのサンプルコードは エキスパートマグネティックス株式会社 http://www.expertmg.com/のなかの VC++によるWin32プログラミングTips http://www.expertmg.com/html/cti/vctips/index.htm このコードは 枠ピタ を作る時にいろいろお世話になりました。 同じく、ここのコードを 枠ピタ の中で使っているというわけではありません。参考にさせてもらいました。ということ。^^;
一番の難関はポインタですね。 まず、「ポインタと配列は、まったく別のモノである。」という認識をして下さい。 C/C++の解説で、よく見かける「ポインタと配列は、同じようなモノ」という記述があるのですが、これを鵜呑みして「同じ」と思い込んでいる人も多いと思います。 「え?違うの?」と思った方は以下の文献を読んで、更に上をめざしてください。 あと、私の経験では、バグには傾向というか、出て当たり前というか、考え方や書き方の違いで、簡単に出たり、出なくなったりするのです。 バグが出やすい人は、おそらく、なぜバグが出たのか特に追求せずに、「なんだかわからないけど、バグった。けど、いつのまにか直ったから、いいや」 という考え方をしている人が多いと思います。 この考え方というかスタンスでは、いつまでたってもバグのお友達です。(^^; ちゃんと、バグには、出る理由があるし、その理由を把握すれば、バグを出なくする、もしくはバグを出にくくする方法もちゃんとあるのです。 で、このあたりを解説した文献は非常に少なく、この部分をクリアすれば、もう「C/C++なんてドンと来い」なのですけど、明快な出口の見えないこの問題に対して、多くの人はここで混沌とした日々を過ごすことになるようです。 まずは、FAQがあるので、それは一通り目を通しておきましょう。 C言語 FAQ 日本語訳 http://www.catnet.ne.jp/kouno/c_faq/c_faq.html この日本語訳は、いろいろなページにコピーされているいるようですが、とりあえず、ここ^^;。 結構、高度なレベルのことが書かれているので、なめてかかると痛い目を見ます。Cはマスターしたと思っている方も、再確認のつもりで、一度目を通すことをお薦めします。 次に、UNIX システムコールのFAQ Unix Programming Frequently Asked Questions 日本語訳 http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_toc.html これは、UNIX 系の話ですが、VC++ でもかなりの UNIXシステムコールが用意されていますので、VC++,GCC 互換のコードを書くのにやくにたちます。でも、知っていたほうが良いというレベルなので、理解できなくても全然問題はないです。 で、さらに、バグらないための習慣とかの概念を書いている数少ない文献を紹介します。 C/C++の文献は結構たくさんあるのですが、初級レベルのモノが多く、さらなるレベルアップのための(将棋の駒の動かし方の本ではなく、戦術の解説ような)文献が少ないのがさみしいです。もっとたくさんの人にこの手の本を書いてほしいものです。 まずは、 藤原博文の館 http://www.pro.or.jp/~fuji/のなかの Cプログラミング診断室 http://www.pro.or.jp/~fuji/mybooks/cdiag/index.html ここは本の紹介のページなのですが、この本の内容のすべてが書かれています。 はっきり言って凄い量なので、ネットで読むより本を買ったほうが楽(らく)かも。^^; 下手なプログラマが読むと、ショックを受けて、いままでのコードを消去するかも知れないので注意が必要です。(冗談^^;)
C++って、Cより難しいですよね。CとC++の本の厚さを比べれば、その複雑さが一目でわかります。それに、オブジェクト指向とか、カタカナばかりだし、抽象的な話ばかり・・^^; 「Cもマスターしたし、Cができれば大抵のプログラムは書ける。わざわざ難しいC++を習得し、わかりにくいコードを書く意味はあるのだろうか?。」 そう、思っている人もいるかと思います。私も最初はC++の良さがわからない人でした。 そんな人のために「C++はCとはここが違う!」という項目を挙げてみます。
そんなわけで、上に書いたように、私は「オブジェクト指向」や「継承」などとは、直接関係の無いところで、C++のメリット(良さ)を感じています。 このC++の良さはおそらく実際にコードを書いてみないと、実感できないこととは思いますが、ぜひ、一度、試してみてください。きっと病みつきになって、C++の魅力から逃れられなくなると思います。^^;
これで終わりですが、なんか、アドバイスというよりリンク集になっていますね。それはそれで、そういうモノだと思ってください。 なにか「これを読んだけど、まだわからないことがある」とか「ここは違うんじゃない」などのご意見も受け付けていますので、メールまたは掲示板のほうへどうぞ。 では。 last update 2003/06/02 since 1999/12/19 |
|
||||||||||||||||||||
|
Copyright(c) 1998-2006. YAMAZAKI Satoshi. All rights reserved. since 1997/12/15 |
● このページのURLをメールで送る(友人・知人に教えてあげる) ● このページを「お気に入り」に追加する(忘れないように…) ● お手紙はこちら↓。仕事の話は大歓迎です。(忙しくて返信できなかったらごめんなさい。) |
||||||||||||||||||||