時代は手続き型から宣言型に
わたしのソフトウエア開発は、マイクロソフトのフレームワークを使ったものが中心になってしまっている。
最近はアーキテクトとして開発に当たるようになり始め、その傾向はもう止められなくなってしまった。アーキテクトの職種として、使用する技術、プラットフォームの知識は不可欠だからだ。というのは、マイクロソフト以外のフレームワークでアーキテクトとして仕事をするには、相当苦労しないと結果が出せる技術レベルになれないと思うからである。もちろんチャンスをくれる雇用者が現れれれば、JavaでもPHPでもRubyでも何でも、チャレンジできるし、短期間に必死で技術を習得して、アーキテクトとしての結果を出せる自信はある。
ということで、マイクロソフト、つまり.NETという限られた分野だけのことだが、最近のソフトウエア開発のトレンドを概観する。一言でいうと、「宣言型プログラム」ということだろう。つまり、コンピュータにやってほしいことを記述する時、つまりプログラムする時、事細かに処理内容や処理の順序、つまり手続きを事細かに記述するのではなく、やってほしい内容を、それをやらせるオブジェクト他に、そのオブジェクトが持つ属性、他を設定することによりプログラムを記述するというこである。
オブジェクト指向開発でも、あるオブジェクトに何かをやらせたい時、やってほしい内容をメッセージ、プロパーティーを使って指示するだけで、そのオブジェクトがそれをどういう手続きで行うかを意識する必要がない。これは上で記述したい内容そのものだが、オブジェクト指向の限界はそのオブジェクトを記述するコード、つまりクラスの実装はやはり手続き型で記述されると言うことである。
宣言型は、そのクラスを記述するプログラムまでが、宣言型になる。そういう形態ですでに実用的になっているものとして、SQL文やHTMLのタグ、ASP.NETの世界なら xxxx.ASPX がある。
SQLのクエリでは、例えばSELECT文で、テーブル内のデータを読み出すことができるが、その時読み出すための手順をこと細かく記述する必要はない。例えば、SELECT文を受けたデータベースは、データを読み出すための仮のメモリーエリアを確保し、その後データをそのエリアにコピーして、と逐次の手順があるはずであるが、プログラマはそういうことを記述する必要がない。
HTMLでは、Web上に表示するコントロールをHTMLで規定されてルールに則って配置、必要に応じてスタイル等の属性を設定してやれば、それですむ。それぞれのコントロールが、どうやってWeb上に表示されるかを記述する必要がない。最近のトレンドはこの宣言型のプログラム記述が、通常のプログラムの中にまで入り込みつつある。
極々最近登場してきた例として、WPF(Window s Presentation Foundation)やSilverlightのXAMLや、LINQ などが、宣言型の例である。
LINQの例 数字文字列の配列の合計を求めるコーディングの方法、2例。今までのコードでは、合計すると言う処理を、事細かに指示する必要があるが、LINQを使うと、合計すると言うこと ("Sum" )と、文字列からどうやって数字を引き出すか ("s => int.Parse(s)") を指定するだけで、コードができる。
List<String> lst = new List<string>() { "1", "2", "3" };
// 古き良き時代のコード
int Total = 0;
foreach( string s in lst )
{
Total += int.Parse(s);
}
// 最新のコード (LINQを利用)
Total = lst.Sum(s => int.Parse(s));
F#は、どうもすべてが宣言型で記述していく言語らしい。
この宣言型、何がうれしいのか? であるが、プログラムがより分かりやすくなり、開発効率の向上、メンテナンスの効率化、は勿論であるが、一番うれしいのは、マルチコアへの対応だと思う。プロセッサのMoor法則はまだ有効らしいが、今までの1チップあたりのトランジスタ数アップの結果の方向性が1チップ当たりの性能アップだったが、量子力学だと思うが、物理法則による限界で、それが頭打ちになってしまった。その代わり今は、横への広がり、つまりマルチコア化がMoorの法則に従う結果の方向として伸びている。
わたしが今使っているPCはCorei7、 なんと4コアー。さらに、ハイパースレッディングのお陰で、8コアに見せかけられている。それはつまり8 スレッドが同時並行的に走ることができるということである。ところが、そのマルチコアを生かした形で作られているアプリケーションはまだまだ少ない。マルチコアーを生かすアプリケーションはマルチスレッドで作ることになるが、マルチスレッドのアプリケーションを作るためにはに、越えなければならない技術の壁が、非常に高いからである。
ところが、宣言型でアプリケーションを作ると、それをある程度克服できるのである。宣言型なら、マルチスレッドの部分は宣言される側のコンポーネント、つまりフレームワーク提供者が実装すれば良いだけになる。それは普通のプログラマではなく、フレームワークを作るベンダー、マイクロソフトの従業員などで、少数の優秀な開発者が担うことになる。普通のプログラマは、マルチスレッドを意識することなく、今まで通りビジネスルールの実装に集中し、それでいて、マルチスレッドのアプリケーションを作れることになる。
コメント
みりゅ
ありがとうございました。
XMLなどの「宣言型」でのプログラムが益々増えていくだろうという
ことが、分かったような気がします。
そうなると、プログラマは、より業務や設計を重視すること。
ソースコードもよりきっちりしたものとそうでないもので差が
でるような気がしました。
あと、脱線なのですが。
LINQの例では、個人的には
> (s => int.Parse(s))
の部分は、まだ泥臭いかなぁと思いました
( C言語の if (argc >= s++) のようなものを思い浮かべてしまいました )。
Total = lst.Sum.Parse(s); とか (Total, Sum(Parse(s)))
よく知らないことなので勘違いがあるかも知れませんが。
マルチコア化の流れは、消費電力が関係しているようです。
後藤弘茂のWeekly海外ニュース :
http://pc.watch.impress.co.jp/docs/column/kaigai/index.html
実は、アプリケーションでのマルチスレッドの話は、何だか
ピンときませんでした。処理の部分はOSやハードウェアも有る程度
吸収してくれるからです。宣言型であれ手続き型であれ、フレームワークや
ライブラリが対応していれば出来る問題だと思われます。
Windowsアプリケーションでスレッド処理がないものでも、
シングルCPUなら、あるプロセスがどのくらいの時間の範囲で収まるか
予想できる場合があるように思います。
ただ、そういうプログラムでも、ハイパースレディングやマルチCPUでは、
処理をOSなどが割り振り直すので、処理時間の範囲に結構ばらつき
が出たりします。
ここで気づいたのは宣言型と手続き型は互いの得意な部分で、
やはり「共存」していくのだろうなぁと思いました。
ありがとうございました。
みりゅ
まぁ、マルチCPUでも、プロセスそのものは分割できないので
タイムシェアリングのほかの部分が速くなっているだろうという点で
すごい勘違いを書いたようです。
山本
マルチスレッド化の最大のネックは、リソースを複数のスレッドでシェアしたときの排他制御。この問題を一気に取り除く方法として、F#で採用のすべての変数をInnumalableにすると言うのがあるそうです。F#自体が難易度の高い言語なので、あまり解決してないようなきがします。とにかく、言いたいのはマルチコア化のプログラマになるための難易度はどんどん大きくなっていることです。
後、宣言形と手続きがた、共存していきます。.NETの世界では、複数の言語が簡単に共存しますので、便利です。