①現代のプログラミングではオブジェクト指向は欠かせない
次にオブジェクト指向プログラミングです。こっちはちょっと話が長くなります・・・。
世にある教科書だとオブジェクトとは何ぞや・・・というところから話が始まるのが普通です。全部読んでいるわけじゃないのでおおよそですが、簡潔に言えば、まずはオブジェクトというのが何で、クラスというのが出てきて、「オブジェクト指向」にはこういう特徴・要素があって、それを使うと生産性が上がるのだ、だから現代のプログラミングにオブジェクト指向は欠かせない・・・と説明されます。
その手のもので、良い資料(ネット記事)とか後で紹介しますね。
わたしからはちょっと違うアプローチで説明してみようかなと思っています。念のために、言い訳なんですが先に言っておくと、わたし、まともにオブジェクト指向プログラミングしたことがありません。わたしのプログラマ・SE現役時代は、FORTRANとC言語で仕事してました。それ以外では、ほんの若干ですが、BASICとアセンブラ、PL/Iと大型計算機のプロシジャーで何ていう名前だったか忘れましたが、シェルプログラミングみたいなプロシジャー言語も使いました。使ったと言い難い程度ですが、COBOLの仕事もしました。全てオブジェクト指向ではありません。言語仕様としてはね。
「言語仕様」としては・・・オブジェクト指向ではない・・・という言い方はちょっと含みがあります。
C言語のオブジェクト指向型(発展形)としてC++というのがあります。最初はプリプロセッサ(プログラムの整形をする前処理プログラム)だったと思いますが、これって、C言語の言語仕様に追加でオブジェクト指向となる仕様を入れて、C++プログラムを書いた後で整形処理をし、それに見合ったCプログラムに変換してくれる。つまり、言いたいことは、言語仕様としてオブジェクト指向の考え方でなくても、そういう変換プログラム(ここではC++プリプロセッサ)を作れば、いいじゃない・・・ということです。このC++プリプロセッサに似たようなものに、Ratfor (ラットフォー:Rational FORTRAN)というのがありました。構造化プログラミングの言語仕様(Ratfor言語)で書いたプログラムをFORTRANプログラムに整形(変換)するのです。カーニハン大先生とプローガー大先生の書いた「プログラム書法」という昔の書籍に出てきます。ちょっとうろ覚えですが・・・。
もしくは、C言語(とか他の言語)を使って、意識して「オブジェクト指向」になるようにプログラムを書いてやればいい・・・。
豪傑ですね。すごいですね。言語仕様に頼らなくても、書けるんだよと。そういうのを昔、何人かの達人に教えてもらったことがあります。
例えばですが、リカーシブコール(再帰処理)は言語上書けないBASICやFORTRANで再帰処理をやる人たちがいましたね。これは教えてもらうと、ああそうか、そう書けばいいんだ・・・と分かるレベルでしたが、あえて自分でやる機会はありませんでした。スタック構造のデータ領域を用意してデータをPUSHしたり、POPしたりしないといけない。細かいところ、忘れかけてます。そもそも、リカーシブコールなんて限られた状況の中でないと実際は使わないですし。
それと、昔、ゲーム業界で、あるヒット製品を作り出したっていう人が知り合いにいて、事も無げにC++使わなくってもCでオブジェクト指向するから・・・とか言うのです。おお、天才は違う。彼は独立して自分でゲームを作って販売もしていた。一部の熱狂的なファンがいましてね、彼のことを天才◯◯◯さんと呼んでましたからね。天才で、豪傑です。オブジェクト指向の何たるかが分かっているから、言語仕様がそうなっていないC言語で、そうなるような仕組みを作り込んで書くのね。
さすがにわたしはそこまでしようと思いませんし、多分できませんから、オブジェクト指向プログラミングが必要な場合は、今ならJavaかな、Rubyかな・・・対象となるプログラムによってはPythonでもいい。日本語プログラミング言語プロデルだって確かオブジェクト指向言語だから、そういうの使います。ということですが、オブジェクト指向が必要ならって、どういう時かって言う事が問題ですね。
前振りはそんな感じですが・・・(実はまだ、前振りの前振りくらいです)、いよいよオブジェクト指向プログラミングへ足を踏み入れます。いや、まだかな・・・何言ってるの?ですよね。すみません。
②オブジェクト指向へのアプローチはC言語
私が昔仕事で使っていたC言語から話を始めます。C言語はいいプログラミング言語です。リッチー大先生が作ったのかなぁ。「プログラミング言語C」はC言語のバイブルですが、著者はカーニハンとリッチー。日本語訳は石田晴久先生です。石田先生は東大名誉教授で、今は退官されてるでしょうね。最初「プログラミング言語C」を買って読んだのですが、Cプログラミングはすぐには分からなかった(苦笑)。他に色々書籍を読みまくって、Cでプログラムをそれなりに書けるようになってから読み返すと、ああそういう事だったのかと分かるようになりました。どこかで「プログラミング言語C」の解説もできたらいいんですが、手に余るかもしれません。この本は”バイブル”ですから解説がないとすぐには分からない。ちょっと前に新人プログラマさんが、上司から読めと言われて渡されてたので「それって只の教則本じゃないから・・・(難しいよね)」みたいなことを立ち話でしました。
それで、わたしなりの理解のポイントがあります。いや、低レベルの理解ですけれどね。プログラマとしてのレベルが理解のレベルにまともに反映します。それがこの本「プログラミング言語C」の特徴です。他の人たちはどうだかわかりませんが、わたしがこの書物から学んでいた頃、読みながら経験的に身に付けたことを上げると、
- コンピュータの中央処理装置(CPU)がどう動いているかを知ることが必要
- 「物理(的)」という事と「論理(的)」という事とを理解することが必要
- コンピュータの処理方式(CPUがレジスタとメモリを使って処理は実行される)について知っていると性能のよいプログラムが書ける
- メモリの実体は一続きのものだけれど、コンピュータ自身やプログラミング言語やOS(オペレーティングシステム)がそれを区分け(領域分け)したり、目的別に使ったりしている
- 高級言語と呼ばれるプログラミング言語は人(プログラマ)に代わって、いろいろ配慮してくれるが、それに頼っていると思わぬしっぺ返しが来る。低級言語(アセンブラ)とまではいかなくても、中級言語くらいのC言語で書き、自分自身で必要なことはしてやらないといけない
- プログラムは部品の積み上げで作れる(構造化プログラミング)
- 積上げる部品とは関数(function )である(構造化プログラミング)
- プログラムの制御構造は3つの基本的な形式で書ける(構造化プログラミング)
- その中で注意すべきはループ(繰り返し)処理
- コンピュータが扱うデータは突き詰めて言えば「ファイル」で、入出力はデータだから、それが何であっても「ファイル」である
- C言語では部品である関数とデータを別々に意識している
(これは後でオブジェクト指向の時に考えなくてはならない入口になります) - C言語では関数を構造化してプログラムを書くが、データ(内部データ、内部変数)も構造化できる
- Cプログラムが扱う内部データは「変数、配列、構造体、共用体」とかいろいろあるが、結局はメモリをどういう形で扱うかということで実体はみんな同じ。それを扱うのに必要なのはポインタ(ポインタ変数)
- ポインタとはメモリを操作するための仕組み(変数)で、全ての内部データを扱う方法を提供する
- ちなみに関数も結局はメモリ上に展開された命令セットの塊なのでポインタを使って扱うことができる。関数もデータである変数も全部同じメモリ上の塊で本質は同じ・・・人(プログラマ)からみた役割が違うだけ
- したがってデータを扱うつもりが、誤って関数の一部を「データ」のつもりで扱ってしまい、プログラムの実行が”わや”になることがある。(わやになる・・・ダメになるの意)
- C言語はアセンブラよりちょっと高級な「アセンブラもどき」でおよそ何でもできる
- 構造化を進めて同時に部品化も進むと、部品を集めてライブラリにする
こんな感じでしょうか。色々、前もって勉強しておくことってあるんですよね。
コメント