2012/09/11

パラダイムシフトを受け入れよう

プログラミングは複雑な作業であるため,これまでに多くのノウハウが蓄積され,その多くがプログラミング言語の仕様として取り込まれています.そのためノウハウの取り入れ方の異なる数多くの言語が存在しています.

最も根本的なノウハウはプログラミングパラダイムと呼ばれ, プログラミングパラダイムの取り入れ方の違いでプログラミング言語の基本仕様が異なります.

プログラミング
パラダイム
説明
命令型 CPUへの命令を順番に記述していく.
命令の構造化 CPUへの命令をループ・条件分岐・式などのブロックに分けて記述していく.
データの構造化 複数のデータをまとめて1つのデータとして扱う.
オブジェクト指向 複数のデータと処理を関連付けて,それらを1つの「もの」として扱う.
関数型 複数の関数を組み合わせて関数を作っていく.関数と値を区別しない.
アスペクト指向 呼び出す関数の処理の詳細を,呼び出している側で把握,改変できるようにする.
論理型 論理を記述して,結果を得る.


各プログラミングパラダイムの詳細な説明はかなり長くなるのでここでは割愛します. 各プログラミング言語は複数のプログラミングパラダイムを持つことが多く,パラダイムの影響度も言語によって異なります. 更に1つの言語をとってみても何回かのバージョンアップで異なるプログラミングパラダイムを取り入れていることも珍しくありません.

1つのプログラミングパラダイム(言語)に慣れ親しむとそのやり方(=ノウハウ)だけでほとんどのプログラムは作成できてしまいます. それで十分なときもありますが,もっと簡単な方法がある場合が多いので複数のプログラミングパラダイムを体験することは (同じ言語を使うときでも!)今後の作業を大幅に短縮してくれることでしょう. もともとプログラミングパラダイムは言語仕様以前のノウハウなのです.

最近ではほとんどの言語でOO(Object Oriented=オブジェクト指向) が取り入れられているので知らないうちにオブジェクトを使っていることが多いです.

しかし,使い道がわからない道具は無いのも同然で, オブジェクト指向が何かがあいまいなままでは,どんな道具も同じ釘を打つ物体にしかなりません.

オブジェクト指向プログラミングにおいて,最も重要なのはオブジェクトの存在と, そのオブジェクトがどのようなものかです.

オブジェクトがどのようなものかをコンピュータ上で表す方法に型システムというものがあります. これは元来,コンピュータ上のデータを意味のあるものとして扱えるように導入されたノウハウですが, さらに拡張されてオブジェクトがどのようなものかを表すために用いられています.

プログラミング言語は型の扱い方とそれに伴う言語仕様で大きく以下の3つに分類されます. この分類は言語の実行環境との関係も深いです.

型システム 説明
1 型システム無し  初期・低レベルのプログラミング言語に多い.
 CPUの機能を最大限活用できるが,データの意味を間違いやすい(わかりにくい).
 C言語などプログラマ自身でメモリ管理を行える(しなければならない)言語は高速なコードが生成可能.
アセンブラ
C言語
COBOL
BASIC
強引に型を変換する

弱い静的型付け
2 型をコンパイル時に確認し,型変換エラーを検出する

強い静的型付け
 型の間違いをコンパイル時に見つけることができるが,記述が面倒.
 コードから型が判別でき,エディタでのサポートが充実しているものが多いが,コンパイルなどの実行のための作業が面倒.
C#
C++
F#
Java
Fortran
Haskell
Objective-C
ObjectiveCaml
ObjectPascal(Delphi)
Scala
VB.NET
3 型を実行時にインタプリタが確認し,強引に型変換する

弱い動的型付け
 型の宣言が不要で簡素な記述ができるが,実行するまで間違いに気付けない.
 エディタのサポートがない反面,多くの言語に記述と実行が同義のインタラクティブな環境があり,すぐコードがテストできる.
 コードから型が判別でき,エディタでのサポートが充実しているものが多いが,コンパイルなどの実行のための作業が面倒.
 弱い型付けは型の概念が希薄で初心者にとってわかりやすいが,強い型付けよりもエラーに気づきにくい.
Erlang
JavaScript
Parl
PHP
MATLAB
型を実行時にインタプリタが確認し,型変換エラーを検出する

強い動的型付け
Lisp
Mathematica
Prolog
Python
R
Ruby
Scheme
Smalltalk


OOとは何か,簡単にいえばただのノウハウですが,OO言語を使えば否応なしに型の存在と向き合うことになります. その時,型が「コンピュータ上のデータ+αを表すもの」ということを, OO言語(OOとしての機能)を使い始めた方は意識するとよいでしょう.

型システムはもはや無くてはならないプログラミングのノウハウなのです.

0 件のコメント:

コメントを投稿