OKLab - プログラミング言語の進化と志向
プログラミング言語の進化
プログラミング言語ができる前は、どうやってプログラミングをしていたのでしょう。元々の仕組みは簡単で電気のスイッチを点けたり消したりしてました。電球が1つや2つだったら、1つ目を点けて、2つ目を消してという風に誰でもそのパターンがわかります。人が直接コンピュータとやり取りしていました。はじめはコンピュータの言葉であるマシン語を人間が話していたのです。
しかし、電球が安くなってきて1万個ぐらい安く使えるようになったら、すべてのパターンを覚えておくのは大変です。 そこで、アセンブラという考え方が生まれてきました。人間は英語や日本語で物事を考えるのでパターンに名前を付けました。
例えば、1つ目の電球を点ける.2こ目の電球を点ける....1万個目の電球を点ける。と続けることは、「全部点ける」と名前を付けます。他にも「全部消す」など いろいろなパターンに名前を付けていきます。そうすると、
「全部点ける」、「全部消す」と書くだけで、いままでたくさん書いていた事を簡単にできるようになりました。これをアセンブラといいます。
人間が考える - アセンブラ君 - コンピュータ(マシン語)
人間の分かりやすいように作った言葉を、コンピュータのマシン語に翻訳するアセンブラというソフトウェアが必要になるけど、電球の個数を考える手間が省けて、よりどういうことしたいかを考えるためだけに頭を使えるようになりました。
この人間とコンピュータの間に翻訳させる機能を加えることでプログラミング言語は進化していきました。これ以降、どれだけ人間の分かりやすい言葉で書いて、コンピュータの言葉に訳すかの戦いになります。
はじめは一部の数学者が使っていましたが、どんどん書きやすくなるといろいろな人が計算につかうようになります。そうすると当然いろいろなコンピュータが作られていきます。それでコンピュータもいろいろなコンピュータの言葉を話すようになりした。
人間が考える - アセンブラ君A - コンピュータA(マシン語A)
- アセンブラ君B - コンピュータB(マシン語B)
- アセンブラ君C - コンピュータC(マシン語C)
ただ計算がしたいだけなのに、いろいろなコンピュータのためにそのアセンブラ君の言葉を覚えなければいけない状況になってしまいました。例えばアセンブラ君Aは「全部点ける」、アセンブラ君Bは「all on」などなど。。。
コンピュータが普及してしまうと全部これから統一するのは不可能です。そこでコンピュータは変えなくても、おなじ言葉にできる方法を考えました。それがコンパイラです。
人間が考える - コンパイラ - アセンブラ君A - コンピュータA(マシン語A)
+-アセンブラ君B - コンピュータB(マシン語B)
`-アセンブラ君C - コンピュータC(マシン語C)
アセンブラを直接書いてマシン語に訳するのをやめて、コンパイラ君にそれぞれのアセンブラを書くように頼むことにしました。このときに、たくさんのアセンブラ君が作られてきていたので、それを踏まえてコンパイラ君はもっと人間が分かりやすいように作りました。
このころ、すごい人が現れます。
「プログラミングは3つの方法ですべて作れます。」といった人がいました。その3つとは、順番、選択肢、繰り返しです。自動車と道路で例えてみましょう。
1.信号を見る 2.青ならアクセルを踏む 3.車が100m進む
学校の授業でも仕事でもスケジュールがあります。そういう決まった順序をまずつくります。でも2を見ると普通は青以外にも信号の色はあるので現実の世界では可笑しいはずです。そこで、「選択肢」を加えます。
1.信号を見る 2-1.青ならアクセルを踏む 3.車が100m進む 2-2.黄色ならブレーキを踏む 3.車が止まる 2-3.赤ならブレーキを踏む 3.車が止まる
選択肢を与えることで、いろいろな状況に対応できるようになります。でも車が止まったままでは大渋滞なので「繰り返し」を加えます。
1.信号を見る 2-1.青ならアクセルを踏む 3.車が100m進む 4. 1へ戻る 2-2.黄色ならブレーキを踏む 3.車が止まる 4. 1へ戻る 2-3.赤ならブレーキを踏む 3.車が止まる 4. 1へ戻る
このように3つの基本行動を組み合わせるとどんなこともできると皆が分かってきました。これは現代のプログラミングの大原則で「構造化プログラミング」と呼びます。
コンパイラ君の誕生と「構造化プログラミング」により、計算だけではなくいろいろな仕事で使えることが分かってきました。普通の人もどんどん使うようになってきました。そうすると、コンパイラ君がもっと人の考え方に近い方法を使うようになっていきました。コンパイラができたはじめは、とりあえず言葉の数を増やすことが多かったようですが、もっと人間的な考え方を取り入れるようになっていきます。
人間の考え方とは
人は知らず知らずに物事をグループ分けしたりします。学校のクラスだったり、本の分類だったりします。グループの考え方ができると曖昧に物事を考えることができます。
例えば、「男の人は右向いて、女の人は左向いて」だと、男の子という大きなグループに対して右を向いてという命令をすることができます。女の子に書き直せば、直ぐに「右を向いて」という命令を利用できるし、曖昧さは便利です。こういう多様化はいろいろな場面で使ってます。だったらコンパイラ君も使えるようにしましょう。
また日本には有名な諺があります。、「蛙の子は蛙」。 「蛙の親が平泳ぎできれば、子供も同じ。」 いろいろな意味で使われますが、 普通、下の例のように「蛙」や「平泳ぎ」は分かりきっているので書きません。
「蛙の親が平泳ぎできれば、蛙の子供も平泳ぎができます。」
こういうのもコンパイラ君に覚えさせました。
自分の思っている事を人に伝えるとしましょう。自分の思っていること(データ)は誰にも話していないので自分の中だけのプライベートな情報です。これを声に出して話す(処理)ことで思っていることを人に伝えることが出来ます。
人間ではこれが当たり前ですが、コンピュータの世界では、他の人がいきなり自分の情報を知ることができたり、勝手に変更するのが普通でした。それで、誰がいつどのように変更したかを追跡するのが困難になったりする問題も生まれてきたので、自分のことは自分で管理するようになってきました。
多様化する考え方、蛙の子、自己管理の方法を組み合わせるとより多くの問題をプログラムを作っている人が分かりやすくなってきました。この3つはまとめて「オブジェクト指向」と呼ばれています。
オブジェクト指向=(多様化の考え方) + (蛙の子) + (自己管理の方法)
=(ポリモーフィズム) + (継承) + (カプセル化)
もともとこの発想は1970年代からあったのですが、そのころはコンピュータの性能も高くはなかったのでコンパイラ君にこの機能を加えると、プログラムを作ったり動かしたりするときにすごく重くなることがあったので構造化プログラミングばかり使ってました。けれど、最近はパソコンでテレビも見れるほどの性能なので、コンパイラ君も問題ありません。
どんどん人間の考え方に近づいているので、将来は人と会話をしながら問題を解決するコンパイラ君が生まれてくるかもしれません。
おまけ
コンパイラの進化を辿ると面白い。最近は大きく二つの流れがあるようです。ひとつ今回の説明のように、より人間の話す言葉など普段使う考え方に進化して行く方向です。もうひとつは、数学という言葉へ進む方向です。普段、数学を言葉として考えることはあまりありませんが、英語を話すことができなくても、数学という世界共通の言葉で全世界の人と会話することができます。
オブジェクト指向前書き
オブジェクト指向(ObjectOriented)とは、設計やプログラミングにおける1960年代から存在する方法の1つです。Java言語がビジネスにおいてオブジェクト指向の普及を牽引していますが決して新しいものではありません。
構造化指向(Structure Oriented)の代表的な言語はC言語です。処理をする機能とデータを分割し、なるべくデータと処理が依存しないようにします。また構造化指向の特徴は、構造化するための機能として、コードのブロック化、変数のスコープ、再帰処理などを備えています。構造化言語は現在多くのプロジェクトで利用されていることから分かるとおり非常に使いやすいものです。処理を上から下に読めば理解できるからです。
今日様々なプログラミング言語があることでも分かるようにGUIに強いプログラミング言語、バッチ処理に強いプログラミング言語などが存在します。つまり万能なプログラミング言語は存在せず、開発にはプロジェクトに合ったプログラミング言語を選択することになります。指向(Oriented)も同様に、構造化、オブジェクト、アスペクトなど多種多様な方法が存在し、得意な範囲があります。
オブジェクト指向は、処理とデータの分離などを踏まえた上で、より人間が考える上で分かりやすいように設計されています。そのためコンピュータの概念(CPU,Memory,ストレージ)を意識せずにビジネスロジックを直ぐに実装できるメリットがあります。数年前からオブジェクト指向にすれば、性能が上がる、分かりやすくなると誇大広告が多く出回りましたが、多くの技術者に受け入れられた背景には、詳細な技術を学ばなくてもなんとなく実装できてしまうこと事が要因の一つであると思います。
技術者としては、このメリットを「諸刃の剣」として認識しなければなりません。コンピュータが何であるか?、ソフトウェアが何であるか?という思考を技術者から奪ってしまう怖さもあります。私は「言語とは何であるか?」という問いに非常に興味があるためこのサイトを少しずつ更新しています。現在は、文法や基本的なことしか記述できませんが、5年、10年とこのサイトを続けていく限りその真意に近づけると信じています。
オブジェクト指向の重要な3つ
カプセル化(Encapsulation)
構造化指向では、データと処理を切り離す事を心がけていました。昔のコンピュータではデータ領域とプログラム領域が完全に別でした。このような背景からデータと処理は区別し、メンテナンス性を向上させるためにはこの方法が正しいとされてきたのでしょう。また当時のリソースを考えるとこの選択肢が妥当だと思います。
一方オブジェクト指向では、データと処理をひとつのまとまりにします。これをオブジェクトと呼びます。
人間をイメージすれば理解しやすいと思います。自分の思っている事を人に伝えるとしましょう。自分の思っていること(データ)は誰にも話していないので自分の中だけの情報です。これを声に出して話す(処理)ことで思っていることを外部に伝えることが出来ます。
この例のように、人間という枠(オブジェクト)の中に思っていること(情報)と話すこと(処理)を包んでしまいます。(カプセル化)
このような、データを処理をオブジェクトにカプセル化する機能がオブジェクト指向言語には一般的に言語仕様として組み込まれています。C言語などは組み込まれていませんが、逆にいうと自分でこのような仕組みを作ってしまえばC言語でもオブジェクト指向が可能です。
ポリモーフィズム(Polymorphizm)
ギリシャ語で多数の形態を意味する言葉です。構造化指向ではデータを曖昧にすることが出来なかったので加算(add)をする場合、以下のようにいくつも必要になります。つまり、データが変わった場合に、関数を追加しなければなりません。
int addI (int a); double addD (double d); float addF (float d);
オブジェクト指向の場合には、物事を曖昧にする機能があります。以下のようにデータを曖昧にする事で関数を減らせます。関数が減るということはソースコード量も減りメンテナンス性が基本的に上がります。
Object add (Object a)
他にもいろいろなポリモーフィズムがありますが、オブジェクト指向では1つのインタフェースで多数の処理を実行する。という定義がポリモーフィズムの概念です。簡単にいうと入り口を1つにして、その内部で処理を対応させる。という感じです。
理解しやすいために関数を例に取りましたが、オブジェクト指向というものは様々な場面でこのテクニックを利用しています。今後様々な言語を学ぶとき、言語特有の機能を学ばなければならない状況に出会うかもしれません。そのような場合は、オブジェクト指向の三大要素のどれを実現するためにこの機能が必要であるかを意識すれば、ある程度容易に学習できると思います。
継承(Inheritance)
向日葵の種は、また向日葵を咲かせます。このように遺伝的に能力を受け継ぐようなイメージです。親の向日葵に向日葵の仕組みを記述しておけば、子供の向日葵にはその仕組みを書かなくてすみます。 プログラミングで一番メリットがある場面は、一度書いたことを二度書かずにすむところです。
オブジェクト指向まとめ
オブジェクト指向について簡単説明しましたが、結論としてIT技術がより人間の思考に近づくことで私達が理解しやすいようになっています。メモリ構造や、 CPUについて考えていた時間を業務ロジックを作るために費やすことができます。これにより、開発の様々なコストを減らすことが出来ます。ここでの説明では、詳細を記述していませんので、言語を学ぶ際に、その言語ではどの文法がカプセル化、ポリモーフィズム、継承を考えてみてください。
更新日付
- 2006/09/24 - XHTMLに対応.
- 2006/07/26 - メモを追加.
- 2006/07/08 - リンクなどを修正.
- 2005/07/06 - 新規作成
