SICPを読んでいると、プログラムの作り方が全て基本的な設計思想に従っているような気がする。
それは、階層性のプログラムということだ。プログラムが層別の複数のモジュールに分かれている。各々のモジュールのなかには、基本要素とその要素を組み合わせる演算規則があり、その演算規則と要素を組み合わせてできるプログラムが次のレベルの基本要素となっている。 モジュールごとの実装は独立しており、下の層のプログラムの実装の変更は、上のレベルには影響しないようになっている。 たとえば、スクリプト言語がそうだ。スクリプト言語でプログラムを作るプログラマーは、そのスクリプト言語の基本要素がどのようなデータ構造で実装されているかを意識したりはしない。数値や、文字列を基本的な要素と考えてそれを組み合わせてプログラムを作ることになる。 SICPのサンプルプログラムもそのような形式になっている。例えば画像処理のプログラムなら、最上層に画像を反転させたり、並べたり、変形させたりを組み合わせる層があり、その層の下には、画像を描画するプログラムについて、それを変形させたり、反転させたりする操作を実装する層がある。その層の下には、実際に画面に画像を表示するための層がある。 こういう、階層構造はどのようなプログラムでも存在するが、SICPのプログラムは各々の層が独立していて、それらがそれぞれに基本要素と演算規則をもったミニスクリプト言語のような構成になっているのだ。そうして、下の層のプログラムが上の層の基本要素となるが、しかし、下層の実装の変更が上層の演算規則には影響しないようになっているのだ。 つまり、プログラム全体が、ミニスクリプト言語を積み重ねたような構造になっているのだ。 プログラムをこのような構造に組み立てるためのキーポイントは下層と上層の間のインターフェースだ。このインターフェースを作り上げるのに活躍するのが、オブジェクト指向であり、高階関数であり、再帰的プログラムである。 また、こういうプログラムを開発するにはトップダウンで設計するほうがいいようだ。SICPではどのページを見てもプログラムの設計をトップダウンで始めている。トップレベルの層で基本要素と演算規則の仕様を決めると、トップレベルでどのようなプログラムを作っていけるかが決まる。トップレベルの基本要素の実装はその後に行うことになる。トップレベルの基本要素の実装は、それを組み合わせて作られるトップレベルの階層内のプログラムには影響しないので、実装の変更はプログラム全体の変更を引き起こしたりはしない。 実装の隠蔽はどのようなプログラムでも行われているだろうが、おのおのが基本要素と演算規則を持ったミニスクリプト言語を積み重ねてプログラムを作るという発想はSICPにユニークではないのかと思った。 このようなSICPのプログラムの実現を支えている概念が2つある。ひとつは、高階関数だ。関数を引数や戻値として使うことができるため。下層で実装したプログラムを関数として上層の基本要素にすることができる。これを、パラメータ渡しだけで実現するのは不可能だ。関数として渡すことによって内部のパラメータを隠蔽することができる。 もうひとつは再帰的プログラムだ。これを利用することで、単純な演算規則を定義すればどのような複雑なプログラムにも対応できる。例えば加算という二項演算を定義するだけで、((1 + 2) + ((3 + 4)+ 5))のような複雑な計算もプログラムをしているという意識もせずに実行できてしまう。各階層をミニスクリプト言語にしたのは理由があるのだ。 SCIPの簡潔で読みやすく保守しやすい階層性のプログラムは、高階関数と再帰的プログラムの力で組み立てられているのだ。
by tnomura9
| 2008-03-17 08:06
| 考えるということ
|
Comments(1)
Commented
by
stc2008 at 2008-03-28 16:39
【参加者募集】開発者・技術者の支援プロジェクト
『スプリング・テック・キャンプ2008』(STC2008)の運営開始! 突然のメッセージにて失礼致します。 初めまして、ALITO株式会社と申します。開発者・技術者の方々向けの情報の1つとしてご覧頂けましたら幸いです。 国内外企業のインキュベーション事業を展開する弊社は、開発者及び、技術者に焦点を当てた起業家支援プロジェクト『スプリング・テック・キャンプ2008』(以下、STC2008)を開始しました。このプロジェクトは、開発者及び、技術者がこれまで培った技術を活用して頂くために、当社が最大限に支援するプロジェクトとなります。 【STC2008の詳細ウェブ】 http://www.alito.co.jp/stc2008.html もし、興味がありましたら、このプロジェクトに参加して、色々なプログラマーやエンジニアの方々とそれぞれの目標に向って頑張ってみませんか?
0
|
カテゴリ
新型コロナウイルス 主インデックス Haskell 記事リスト 圏論記事リスト 考えるということのリスト 考えるということ ラッセルのパラドックス Haskell Prelude Ocaml ボーカロイド 圏論 jQuery デモ HTML Python ツールボックス XAMPP Ruby ubuntu WordPress 脳の話 話のネタ リンク 幸福論 キリスト教 心の話 メモ 電子カルテ Dojo JavaScript C# NetWalker ed と sed HTML Raspberry Pi C 言語 命題論理 以前の記事
最新のトラックバック
最新のコメント
ファン
記事ランキング
ブログジャンル
画像一覧
|
ファン申請 |
||