manie's blog

@cz500c

「オブジェクト指向の価値ってよく分からないですよね」について

そういえばCORBAとかROSEとかUMLとかやってた気がします。

プログラミング勉強中の人にオブジェクト指向とは何なのかを何となく伝えたい話 - かまずにまるのみ。

 

オブジェクト指向の価値ってよく分からないですよね。」

 

誕生の歴史を知ればよい。環境によっては価値がある。

 

 

コンピュータは情報数学と電子回路から誕生した。電子回路は半導体によってハードウェアからソフトウェアとなり、機械語(そしてアセンブリ言語)が必要になった。C言語アセンブリ言語に配列と構造体を加えたものだ。手続型言語ではデータ構造とアルゴリズムを同時に設計するが別々の保守が必要だった。保守は同時にやるべきだ。データ構造とアルゴリズムを同時に同じ場所で実装し保守出来る仕組みがクラスだ。

 

 

情報数学と電子回路

情報数学は乱暴に言えばビット演算学だ。NOTとORとANDを使ってあらゆる命題論理を電子回路で置き換え可能な式に書き下す方法を学ぶ。例えば足し算を定義する方法を学べる。足し算は「電子回路として記述出来る」のである。

加算器 - Wikipedia

 

電子回路は乱暴に言えば電池と豆電球だ。情報数学で考えた回路を組んでみて電源を入れ、豆電球が光り、答えが出る。電流の速度の方が人間の思考より速い。問題は電子回路を作り上げるのに膨大な時間がかかることだ。初期は電磁リレーを使い、電流で電流を制御することで電子回路を組み替えた。半導体が登場すると、組み替えではなく電子回路自体が電荷の移動で記述されるようになる。電子化だ。

シーケンス制御 - Wikipedia

 

半導体の登場で、情報数学はモノとしての電子回路が不要になった。電流の流れ方で数式を表現出来るようになり、電子化した数式が出現した。同じ機械でさまざまな電子回路の振舞をする。これがソフトウェアである。

 

CPUの登場と機械語

1+1を計算するときも、2+3を計算するときも、7+10を計算するときも、新たに電子回路を作って計算する必要があった。違うのは入力する数だけなのだから、演算する部分と入力数値だけ変える回路があれば便利だと考えた。演算装置の登場である。

演算装置 - Wikipedia

演算は繰り返し行う。記憶装置から入力値を演算装置に入れ、演算結果を記憶装置に格納する。この手順を指示するだけで動く機械があると便利である。これをCPUと呼ぶ。

 

CPUへの指示は情報数学や電子回路に依存しない。演算の種類や入力値を持ってくる方法など、さまざまな実装がある。指示するための決まりを機械語と呼び、CPUごとにバラバラである。数値の羅列では保守しづらいので、とりあえず文字で書けるようにしたものがアセンブリ言語アセンブラ)である。

 

C言語を覚えればすべてのコンピュータが使える

機械語のソフトウェアは、異なるコンピュータでは使えない。演算器の演算種類を示す番号が合致しないし、記憶装置からCPUに一時的に入れる場所(レジスタ)の向き(!)や数や大きさが違うし、そもそも演算命令がなかったりする。だが、やりたいことは大体同じだ。

 

やりたいことをなんらかの言語で表現し、コンピュータごとの差異を吸収しながら機械語を出力する仕組みがあれば便利だ。C言語と翻訳機(コンパイラ)の誕生である。C言語を覚えればあらゆるコンピュータが使える。

 

データ構造とアルゴリズムを再利用したい

C言語などの手続型言語は、データ構造とアルゴリズムを同時に設計してソースコード全体に個別に実装する必要がある。アイデアは再利用出来るが、データ構造やアルゴリズムを変更するとソースコード全体に修正が必要になる。データ構造とアルゴリズムを保守作業から分離し、ソースコードの再利用性を高める必要があった。

手続型言語の配列と構造体は、アセンブリ言語における番地(アドレス)のラベルの別名に過ぎない。データ構造とアルゴリズムを記述する仕組みが必要だ。

 

クラスはデータ構造とアルゴリズムを同時に記述できる

アルゴリズムは計算手順のことだ。データ構造は扱う数値の説明だ。データ構造とアルゴリズムを同時に同じ場所に記述するためにクラスができた。

クラスは説明に過ぎず、実際に使うにはデータを置く場所とアルゴリズムが動作する場所が必要になる。場所の確保がコンストラクタの仕事であり、場所に置かれるものがインスタンスである。撤収作業はデストラクタが行う。

 

オブジェクト指向プログラミング言語の利点

叡智の共有である。手続型言語は実装結果のみであり、設計の残滓を感じさせる程度である。オブジェクト指向プログラミング言語は、設計も実装も示すことが出来る。残念ながらソフトウェア要件までは示せない。次世代の言語はここに踏み込むだろう。

 

プログラミング言語は道具である。目的に合わせて使いやすい道具を使うべきだ。