« 霊夢塗ってみた | メイン | IE7 Beta2 Preview版 リリース »
2006年02月06日
プログラミング言語に幻滅した瞬間 [プログラミング]
私は新しい物好きで巷に出回っているものにはすぐに飛びつくたちだから、そこそこの数のプログラミング言語も独学で学んできた。現在は段々各言語間の違いも少なくなっている気がするが、それだけに言語ごとの使いやすさや使いにくさがよりはっきりとわかるようになってきた。
完璧なプログラム言語は存在しない。それは日々進歩していくものだし、プログラマの好みも様々だ。そんな中で、私がそれぞれの言語に幻滅した瞬間をベースに各言語を比較していきたいと思う。大変消極的に見えるかもしれないが、それぞれを特徴付けている部分を知るためには「ここがもう少しこうであれば」と感じた瞬間を知ることこそ、その近道ではないだろうか。
C / C++
C言語で幻滅した瞬間は、ずばり『ポインタ』とメモリ管理の問題にぶち当たった時だ。
Cコンパイラは不要になったメモリを自動的に解放してくれない。動的に確保したメモリは、自分で解放してやらなければならない。これを忘れるとメモリリークという厄介なバグが残るわけだが、この管理が非常に面倒なのだ。最近の高級言語は『ガベージコレクタ』を実装しているから、こんな面倒なことをプログラマがしなくてもすむ。こんなことに一々神経を使いたくないというのが本音だ。
そして文字列と配列の扱いにくさも幻滅した理由の一つだ。とりわけCの文字列処理は非常に面倒くさい。文字列を扱うというのは多くのプログラムで頻繁に行うことなのにも関わらず、それを行おうとするとかなりの処理コードを記述しなければならなくなるのだ。そうすると、必然的にバグも潜みやすい。
VB6.0 / VBScript
はじめてVBを触れたときは、GUIウィンドウをこんなに間単に表示できるものなのかと非常に驚いたものだ。当時まだCとPerlにしか触れたことの無かった自分にとって、それは革命のようなものだった。
しかし += や ++ といった演算子が使えないのには閉口した。さらに{}でブロックを作るのではなく、End If や Next などでブロックを閉じなければならないのはタイプ手間の無駄だと思った。慣れてくるとそれほど違和感は感じなくなったが。
最も幻滅した瞬間は、VB6はクラスの継承を行うことができない事だった。継承が行えないとなると委譲に頼るなどしてオブジェクト設計をかなり調整しなければならない。これは非常に面倒だ。ASPでシステムを作ったときは、これを理由にVBScriptではなくJScriptを止む無く使うことになったほどである。継承の使えないオブジェクト指向はこれほど不便なのかと感じた瞬間だった。
Perl5.x
Perlは素敵な言語だ。私は簡単な処理を自動的に行いたい時は、ほとんどの場合Perlで書いている。
Perlは非常にパワフルでしかも扱いやすい。特に配列の手軽さときたら、他の言語にこれに匹敵するものはほとんどない。もちろん正規表現もPerl魅力の一つだが、最近のプログラム言語は大抵正規表現を扱うクラスが用意されているので、以前ほど注目されるものでも無くなった。
Cのポインタに相当するものが、Perlは『リファレンス』というかたちで用意されている。これが非常に合理的で、C / C++ のように厄介なメモリ管理に煩わされることもないし、かといってJavaのように融通が利かないわけでもない。Perlの魅力は配列の扱いやすさと、このリファレンスにあると言っていい。
しかしPerlはやや古い言語であるといわざるを得ないのも確かである。とりわけPerl5.xのオブジェクト指向の実装方法は極めて特殊だ。私がPerlに幻滅した瞬間は、メソッド呼び出しを一般的なドット(.)で行うのではなく、矢印演算子(->)を使わなくてはならないと知ったときだ。 それはタイプする量が増えるばかりか、見栄えが大層に悪い。くだらないことだが、慣れるまでは結構違和感を感じるものだ。これはPerlのバージョン6でも改善されていない。
そして何と言っても、Perlには優れた統合開発環境が無い。
Java
Javaはオブジェクト指向を実装した言語として有名だが、この言語に幻滅するまでに要した時間は比較的短かった。
最大のものは、メンバ変数を隠蔽してクラスのフィールドとして扱うための手段だ。VBやC#などはこれをプロパティというかたちで実装して、外から見るとあたかもメンバ変数のひとつであるかのように扱わせることが出来る。しかしJavaが取った方法は、getXXX()、setXXX() という名前を持ったメソッドを定義するという、単なる名前付けの習慣に頼ることだった。これは見てくれが悪いし、代入演算子を使って左辺値とすることもできない。
そして値型変数と参照型変数の相互変換も問題となる点である。例えば一般的な可変長配列のクラスに整数を代入しようとするとエラーになる。スーパークラスであるObject型をint型が継承していないからだ。これを解消するには、一度参照型の数値オブジェクトに格納してからObject型として渡す必要がある。取り出すときには、もう一度値型に戻してやらなければならない。この一連の処理を C# はBoxing / Unboxing によって暗示的に行ってくれるが、Javaプログラマは一々手打ちしなければならない。しかもこの処理を必要とするケースは非常に多いのだ。
C#
C#はかなり素晴らしい言語だ。オブジェクト指向を完璧に実装しているし、Javaのように中途半端に使いにくいということもない。C / C++ にあったポインタとメモリ管理に煩わされることもなく、快適にコーディングすることができる。Boxing /Unboxing や列挙型変数、インデクサなど、コードをよりわかりやすく効率的に組むためのツールが沢山用意されている。一通り使ってみたが、C# に非難すべき点は未だに見つかっていない。
しかし欲を言うならもう少し配列が扱いやすくなってもいいはずだ。とも思う。言語仕様として用意されているのは固定長配列だけで、可変長配列を実現するにはクラスを通すしかない。固定長配列なんて使いにくくてほとんど使ったためしがないし、可変長配列やハッシュを使わないプログラムなど実践レベルではまず存在しない。それほど使用頻度が高いのだから、クラスなんかでこそこそと対応せずにばっさりと言語の中に組み込んでしまっても良いのではないかと思う。そう、Perlがそうであるように。
JavaScript / JScript / ECMAScript
JavaScriptはWebページ上でのみ動くスクリプト言語だと思われがちだが、WindowsScriptHostやASPなど、プラットフォームは意外に広い。とりわけWSHはWindowsの簡易シェル言語として活躍することもできる。とは言え、やはりJavaScriptの一番輝く時は、HTMLに組み込まれたスクリプトとして働く時だろう。 JavaScript単体でHTMLを操作するのは大変不毛だが、DOMのメソッドを使うことによって飛躍的に自由度が広がることになる。基本的な関数群は6つのオブジェクトによって提供されているから、一般的な処理に困ることも無い。
しかしJavaScriptの最大の欠点は、include文等を使ってモジュールの呼び出しを行う仕様が言語内に無いことだ(ASPでは辛うじて可能だが、WSHでは完全に無理)。コードを部品化することができないので、必要な関数はコピー&ペーストで持ってくるしかない。これは大変生産性が悪い。せっかくオブジェクト指向的側面があっても、それを使う機会はほとんど無くなってしまう。
各ブラウザ間の違いやバージョンによる違いも非常に厄介だ。あまりに違うため、時にコードを2倍書かなければならないときもある。大変に頭が痛い話である。
Ruby / PHP / ActionScript
これらの言語はマニュアルに目を一通り目を通したけれども、せいぜい HelloWorld くらいで、実践レベルのプログラムを書いたことが無い。故に幻滅した点も特にまだ見つかっていない。もっと使い込めば色々見えてくると思う。
まとめ
| C/C++ | VB6 | Perl | Java | C# | Jscript | |
|---|---|---|---|---|---|---|
| 文字列 | ×intの配列で実装 | ○関数で頑張る | ◎正規表現で楽々 | ◎正規表現クラス | ◎正規表現クラス | ◎正規表現クラス |
| 配列 | ×連続したアドレス | △固定長 | ◎非常に柔軟で手軽 | ○可変長があるが不便 | ○可変長はクラス | ◎可変長でハッシュも可 |
| 参照型変数 | ×メモリ管理が面倒 | △Set/Letで使い分け | ○リファレンス | ○自動で区別 | ◎boxing / unboxing | ○全てオブジェクト |
| オブジェクト指向 | ○基本的(C++のみ) | △継承がない | △やや特殊 | ○プロパティが無い | ◎完璧 | △かなり特殊 |
| 統合開発環境 | ○VisualStudio | ◎VisualStudio(GUI豊富) | ×ほとんど無し | ○Eclipse(無料) | ◎VisualC#.NET(無料) | △いまいち |
| モジュール | ◎非常に多い | ○そこそこ | △CPANからインストール | ○だいたい間に合う | ○だいたい間に合う | ×モジュール化できない |
投稿者 : 13:45 | コメント (2) | トラックバック (0)
トラックバック
このエントリーのトラックバックURL:
http://totora.jpn.org/mt/mt-tb.cgi/103
コメント
JScript->モジュール化できますよ。
WSCなどコンポーネント作って使ったりとか。
URL参照してね。
投稿者 通りすがり : 2006年03月12日 21:06
なるほど、WSH2.0以降ではできるんですか。
これは勉強不足でした。
投稿者 無重力 : 2006年03月14日 11:28