連載:[完全版]究極のC#プログラミング

おわりに ― C# 1.xから3.0への進化とは?

川俣 晶
2010/07/05
Page1 Page2 Page3

 結局のところC# 3.0とは何だったのだろうか? 個々の機能ではなく、大きな流れとして考えてみたい。

 まずプログラミング言語の大きな流れから見てみよう。ここでは大ざっぱに次のような流れがあると仮定して話を進める。

マシン語 → 高級言語 → 構造化言語 → 旧世代オブジェクト指向言語 → 新世代オブジェクト指向言語

 マシン語とは、コンピュータが直接理解できる言語であり、人間にはわかりにくいものであった。そして、高級言語とは、より人間にわかりやすい書式で記述を可能にしたものである。FORTRANや初期のBASICはこれに当たる。

 ここでプログラムの構造そのものを決まった型に強制することで、より短い時間でわかりやすいプログラムを作成できる構造化言語が生まれてきた。PascalやC言語はこれに当たる。

 しかし、プログラムの複雑さが爆発的に増すことで、構造化言語でも十分な生産性を示すことができなくなってきた。そこで注目されたのがオブジェクト指向言語ということになる。最初に注目されたのは、クラスという機能をすべての基礎に置くタイプのオブジェクト指向言語である。これを、ここでは「旧世代オブジェクト指向言語」と呼んでいる。C++やJavaがこれに当たる。

 さて、筆者の感想を述べると、ここで「プログラミング」は1つの挫折を迎えている。マシン語 → 高級言語 → 構造化言語までの流れは、素直に生産性の向上が達成できていた。つまり、より短い時間でコードを書くことができ、より短いコードでより大きな仕事が行えたのである。

 しかし、旧世代オブジェクト指向言語は必ずしも生産性を上げてはいないのである。その状況は、次の2つの問題が複合して発生したためと筆者は考える。

  • すべての機能をたった1つのクラスという機能を通じて実現するのは硬直的すぎ、無理がある
  • 「正しいオブジェクト指向」を習得すればすべてがうまくいくという幻想が幅広く信じられた

 つまり、現実的にクラス“だけ”を用いてプログラムを構築する方法論がうまく機能しないにもかかわらず、うまくいかない理由を錯覚させる風説が信じられていたのである。その結果、筆者もすっかり旧世代オブジェクト指向言語の奴隷として拘束されてしまっていた。

 このような状況は、20世紀から21世紀に時代が移り変わる頃には限界状況を呈していたと感じる。そして、それを打破したのが新世代オブジェクト指向言語といえる。ここでいう新世代オブジェクト指向言語とは、クラスという機能を持たない、あるいはクラスだけにすべての役割を押し付けない言語を意味する。JavaScriptやC#がそれに当たる。

 このような流れの中では、C#は「旧世代オブジェクト指向言語の奴隷」からの解放者として出現した感がある。事実として、筆者は、C# 1.0の登場により大きな解放感を感じることができた。Javaで行き詰まっていたプログラムが、C#にソースをコンバートすることで生き返り、開発を進めることが可能になったのである。

 さて、ここまでは前振りでしかない。

 解放者として出現したC# 1.xは、確かに旧世代オブジェクト指向言語から筆者を解放してくれた。だが、C# 1.xがやってくれたのは、ただ単に筆者の手に繋がれた鎖をはずしただけである。「さあ、君はもう奴隷ではないよ」と告げられただけである。

 ここで問題となるのは、解放され、自由になった筆者はどこへ行けばよいのか……である。JavaではうまくできなかったプログラムをC# 1.xでまとめ上げるまでは気持ち良くプログラミングができたが、そこまでである。それ以後、筆者はどこにも行き先がないことに戸惑ってしまったわけである。

 C# 2.0の存在意義とは、まさにここにある。

 実は、C# 1.xが解放者であるとすれば、C# 2.0とは進むべき道筋を示す予言者であったといえる。予言者とは、あまりにも突飛で信じがたい未来を語る者であり、頭のおかしい人物と見えることもある。事実、筆者もC# 2.0はおかしいのではないかと思ったことがある。

 しかし、そうではなかった。匿名メソッドを使い、整数や文字列のようにコードの断片を気軽に代入して受け渡すプログラミングは、常軌を逸した奇行に見えたが、それは有効であったのだ。そのようなテクニックは、より短いコードでより強力かつ柔軟なプログラムを実現してくれる。つまり、マシン語 → 高級言語 → 構造化言語といった劇的な変化により実現された生産性の向上が、再び得られたのである。

 つまり、オブジェクト指向言語の台頭後、本当の意味での劇的な一歩はC# 2.0によって踏み出されたと筆者は感じるわけである。この一歩を踏み出すか否かは非常に重要な選択となる。たとえば、アセンブラに熟練したプログラマーがC言語に乗り換えるか否か、FORTRANに熟練したプログラマーがPascalに乗り換えるか否か、といった決断に匹敵する大きな意味を持つのではないかと思う。

 さて、C# 1.xが解放者、C# 2.0が予言者だったとすると、C# 3.0は何に当たるのだろうか?

 C# 3.0は開拓者だというのが、現在の筆者の考えである。つまり、C# 2.0が指し示した「可能性」としての未来は、C# 3.0では「現実」に置き換えられた。

 C# 3.0が現実となり、期待どおりの手ごたえをC#プログラマーに対して提供している現在、C# 3.0は終着点ではないことがすでに示されている。本書執筆時点でVisual Studio 2010 CTPが提供され、C# 4.0の開発中バージョンがすでに利用可能となっている。

 では、C# 1.xが解放者、C# 2.0が予言者、C# 3.0が開拓者だとすると、C# 4.0は何になるのだろうか? おそらく、移住者ではないかと思う。移住者とは、開拓済みの新天地に移住してくる者たちを意味する。

 C# 3.0は、新しい境地を切り開く機能が揃っているがために、それを使う側にも開拓者スピリッツが要求されたという側面がある。それゆえに、ハードルの高さを感じた技術者も多いのではないだろうか? しかし、C# 4.0の時代になれば、もはやそれは新しくはない。実績のある安定した機能でしかない。

 さらにいえば、移住者は開拓者と違って、さまざまなタイプの人たちが押し寄せることになる。そういった多様な相手の多様な要求に対応するためには、C#自体も偏りの少ない全方位的な機能を獲得する必要がある。これまでずっと静的に型付けされた言語であったC#が、4.0になって動的な型付けを導入するのはそのような文脈で見るとわかりやすいだろう。

 もはやC#は、C#的な理想に賛同する人だけの言語ではなく、幅広い技術者層に対して広い間口を提供していかなければならないのである(ちなみに、比較的リフレクションを多用する筆者は、動的な型付けの導入でコードが簡素化できそうなので歓迎である)。

 しかし、4.0時代になっても、3.0時代の技術が消えるわけではない。いや、むしろ3.0的な使い方がよりスマートかつパワフルになるとすらいえる。たとえば、LINQのクエリを複数のCPUコアに分散するパラレルLINQ(P-LINQ)などの新技術が提供され、3.0流のやり方もパワーアップしている。これは、たとえ間口を広げるとしても3.0流のやり方が間違っていなかったと判断されているためだろう。C# 4.0を目指すためであっても、C# 3.0にチャレンジしてマスターする価値は高いだろう。

 最後に、本書の出版にご尽力いただいた遠藤孝信さん、小川誉久さん、跡部和之さんにお礼を申し上げる。皆さんのご尽力で、本書は世に出ることができた。

著者記す

 

 INDEX
  [完全版]究極のC#プログラミング
  Special Appendix/おわりに
    1.Special Appendix 1 現役C#プログラマーが語るC#を使いこなすツボ
    2.Special Appendix 2 ステート集約プログラミング
  3.おわりに ― C# 1.xから3.0への進化とは?
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間