mcommit's message

大阪でソフトウェア開発の仕事をしている simotinといいます。記事の内容でご質問やご意見がありましたらお気軽にコメントしてください\^o^/

C言語とRuby 〜型について〜

変数に型がないということの利点について考える

というエントリーが盛り上がっていたので私も思うところを書いてみたいと思います。

私は、最近C言語Rubyのコードを書くことが多いですが、
基本的にこのブログの筆者の方に賛成です。※PerlとかPythonとかは書けません。

筆者の方はテストを書くことを重要視されていますが、私も開発においては
テストが大切だと考えています。

「テストコードを書く時間がもったいないだろ!」
コンパイル時の静的チェックで手間が省けるだろ!」
という意見があると思いますが、

畏れ多くもRubyにおいては1行当たりの生産性が強烈に高いので、

C言語でmain関数から書き始めて

「しまったprintfに\nがなかった」
「あれ、ループ用のi を宣言してなかったわ」

とかやってる間にRuby側ではテストコードが書き終わって動作確認もすんでたりします。
「楽しくプログラミングできること」がRubyのモットーですが、これは伊達ではないです。
なんていうか、コードを書くのが苦じゃないんです。動かすまでが圧倒的に早い。

私もC言語からRubyに入った時に、実行時に

nil

を参照してプログラムがよく止まりました。

当時は

C言語の方がコンパイルエラーではじいてくれるからいいや」

とか

Rubyってどこで落ちてるか分かり辛いんだよ!」

とかよく思っていましたが、最近はそうでもなくなりました。
※単純にRubyにちょっと慣れてきただけなのかも知れませんが。

C言語には型があるから安全という意見についてですが、
ポインタとかキャストを使う以上、型チェックがあるから安全とは言えないですよね
たいていの場合、ヌルポやセグ落ちは動かしてみて初めて気づきます。
※そもそもC言語の型ってメモリのサイズとその使い方を決めているだけですよね。
コンパイラが変わったら挙動も変わることだってあります。

型があることによってコードの安全性が高まるというのはその通りだと思いますが、
やはりデバッグとテストが大事だと思います。
Cの場合はテストは大変だけど、デバッグはやりやすいかもしれないですね。
開発環境とかGDBを使ってプログラムカウンタ飛ばしたり、変数の値変えたりできるので
たいていのバグの要因は突き止めることはできます。

ただし、デバッグという行為は人間が行わないといけないのでデバッグに費やした時間は
コストにしかなりません。

Rubyの場合は、そんなことはできないから動作を確かめたいパスを通るテストコードを書くしかないですね。
ユニットテスト化しておけばテストコードは回帰的に動作を確認するりっぱな「資産」になりますから、
開発時に毎回毎回デバッガでデバッグするよりいいことだと思います。
Rubyでは適切に例外の補足を入れ、バックトレースで追っかけれるようにしておくと効率よく
開発を進めれるように思います。


ただし、スクリプト系言語で大規模開発を行う場合は注意しないと、
「統一感が取れてない感」が高くなりそうな気はします。
※私はまだRubyを使った大規模開発の経験はありませんが。
まぁこれはC言語でも同じで、コーディングルール決めたり、実装のテンプレートを用意しても
まだ統一感を取れなかったりします。

大規模開発ってやはり大変ですよね。