C
C言語初学者に最適の開発環境は?
以前から、C言語初学者に最適の開発環境は何だろうという疑問を持っていました。自分なりにいろいろ考えたり、他のひとに相談したりしながら模索してきましたが、なかなか結論に達しません。そこで今回は、現段階の自分なりの考えを整理してみたいと思います。
まず、C言語初学者といっても、実際にはいろいろな人がいます。C言語を学んで何に使うのか? C言語をしっかり身に付けたいのか、それとも手っ取り早くプログラムを作りたいのか? こうした事情によって、答えは変わってくるようです。
C言語自体はどうでもよくて、例えばゲームならゲームのプログラムを手っ取り早く作りたいということであれば、そもそもC言語を選択した事自体が間違っています。(C言語ではなく)C++にすべきだということもあるでしょうが、手っ取り早く結果を得たいのであれば、何とかツクールでも使っておく方がよいでしょう。
ビルドエラーと実行時エラーの区別が付かない?
最近感じることですが、IDEが便利になったせいか、ビルドエラーと実行時エラーの区別がつかない人が増えているようです。もう少し具体的にいうと、Visual Studioの場合、コーディングを行うとすぐにCTRL + F5で実行させようとします。IDEは、ビルドを実行し、ビルドに成功すればデバッグなしで実行するわけですが、この過程でエラーが発生すると、単に「エラーが出た!」というだけの認識しか持たず、どんな過程でどんなエラーが出たのかを確認しようとしないのです。
仮に実行時エラーだということが理解できても、CTRL + F5でデバッグなしで実行するものですから、デバッガで調べようという発想がありません。ブレークポイントやステップ実行を教えてあげると、驚くほど感動されたりします。デバッグなしで実行するのは、おそらく、デバッグ開始にすると、コンソールアプリケーションではプログラム終了時にコンソールが閉じてしまうために、そういう指導を受けたのではないかと思います。
C言語は難しいのか?
前回、「簡単で難しい“正確なC言語”」に対する意見を書きました。こんなところで陰口を叩いているだけというのも申し訳ないので、本家サイトでも一部コメントしたところ、ある程度訂正されたようです。今回は、そうした"標準Cトリビア"のような話題を持ち出してC言語を"難しい"と評価するのが本当に正しいことなのかについて考えてみます。
Q1とQ2は移植性に関する話題でした。普段使っている処理系はこうだけれども、あらゆる処理系でそれが通用するとは限らないという話です。例えば、intのサイズは処理系定義なので難しいというわけです。では、比較的易しいとされるスクリプト言語はどうかというと、PHPにせよRubyにせよ、整数型も浮動小数点数型もそのサイズはプラットフォーム依存です。これが理由で、Cが難しいのなら、PHPやRubyも同様に難しいはずです。しかも、Cのように少なくとも-32767~+32767の表現範囲が保証されているわけでもありません。
「簡単で難しい“正確なC言語”」を読んで
ITProの記事「簡単で難しい“正確なC言語”」を読みました。その中に「標準Cトリビア3題」というちょっとしたクイズがあったので挑戦してみたのですが、期待されている回答ができたとはとてもいえない状況でした。まずは問題を引用します。
Q1:main関数の型はintである。
Q2:int型は少なくとも-3万2768〜3万2767を扱えなければならない。
Q3:\0はナル文字と定義されている。
まずはQ1からです。私の見解はこうです。main関数は、int main(void)、int main(int argc, char *argv[]),、これら2つと等価な方法、または処理系定義の方法で定義されるわけですが、いずれにせよ「関数型」であり、「オブジェクト型」である int ではありません。よって×です。
PP0906 - 初級者向け擬似プロセッサ
PP0906は、初級者向けのごく簡単な擬似プロセッサです。C言語を使って実装していますが、ポインタが苦手な人でも理解しやすいように工夫しています。ただ、ワードマシンですので、現在の多くのプロセッサとはかなり雰囲気が異なります。
先日からごそごそやっていますが...
先日、C言語の入門サイトを自分で作る気になってきたことを書きました。そこで、ざっと書き散らかしたものを、C言語何でも質問掲示板でご意見を聞きながら、少しずつ進めています。
細かな点はともかく、第1章に関してはすいすい進みましたが、第2章では文字列を扱いますので、いろいろ思案することが多くなっています。そもそも、アセンブラから入った私としては、ポインタが分からないとかいっている人の感覚が理解できないからです。
一方で、JavaやC#の参照の考え方が分からないという話はあまり聞きませんので(私が聞かないだけ?)、オブジェクトの参照については理解できるのかな、とも考えています。あるいは分からないまま進んでもどうにななってしまっているのかもしれませんが。
今書いている解説は、伝統的なアプローチとはまったく異なるので、うまくいくかどうかはまったく分かりませんが、書くこと自体は楽しくできているのでまあいいでしょう。
やっぱり自分でやろうかな
先日、よそのC言語入門サイトを応援したい旨を書きました。ただ、その後の状況を見ると、どうもそこに協力してどうにかするというのは困難なようです。しかたがないので、自分で作ろうかなという気になりつつあります。
そんなものより先に書くべきものがあるだろうと、自分でも思うのですが、いずれは手をつけようを考えていたので、今がそのときなのかもしれません。
興味本位で名前だけ入れてもらった TOPPERS/JSP for iPhone
先日、TOPPERSユーザーズメーリングリストで知ったTOPPERS/JSP for iPhoneプロジェクトですが、私も一応名前だけ入れてもらっています。多分、ほとんど時間をとれないので、本当に形だけの参加になってしまう可能性大ですが、何とか時間を見つけて少しぐらいは貢献したいところです。
ゆくゆくは、JSPカーネルではなく、ASPカーネルを動かしたいと思いますので、来年の春頃にでも何らかのアクションを起こしたいとは思っていますが、具体的なことはまったく決まっていません。
「C言語無双」は最高峰となれるか?
C言語何でも質問掲示板のトピックスで、「C言語無双」というウェブサイトを知りました。何でも、C言語サイトの最高峰を目指しているらしいです。いろいろ意見はあると思いますが、私としてはこういうのは何とか応援したいと考えていますので、可能な範囲で意見をいうようにしたいと考えています。
肝心の内容ですが、現時点では、突っ込みどころ満載の状況です。分かりやすさが大事なことはもちろんですが、それ以前に間違いがないことが大前提です。その点について、現状ではかなり問題があります。
サイト管理者のC-manさんの意向もありますので、どうなるかは現時点ではわかりませんが、今後に期待したいと思います。そして是非、最高峰を目指してほしいと思います。そして、いずれは自分で最高峰をめざすのもよいかなと、考えてみたりすることもあります。
[迷信] abs は常に非負の値を返す
abs 関数というのは絶対値を求める関数です。C では int 型の引数を受け取り int 型の値を返します。C++ では、int 版以外に、long 版、float 版、double 版、long double 版、std::complex クラステンプレート版が多重定義されています。絶対値を求める関数ですから、ゼロまたは正の値を返すのが数学的に正しい振る舞いです。
ところが、現実には必ずしもそうはならない場合があります。まずは、浮動小数点数や複素数の引数として非数(NaN)が渡された場合がそうです。これについては、それほど大きな問題になることはないでしょう。問題は整数の場合です。
abs 関数に INT_MIN を与えた場合を考えてみてください。負の値の内部表現に 2 の補数を使う処理系(実質的にすべての処理系と考えても、あながち間違いとはいえません)では、INT_MIN の絶対値は INT_MAX + 1 になることが大多数です。つまり、INT_MIN の絶対値を int 型で表現することができなくなるのです。

