プログラマyasuhoの隠れ家

某ソフトウェア企業に勤務するおじさんプログラマyasuhoです

プログラミング言語の進化に必要なこと


プログラミング言語言語の進化は基本的に考え方の導入のようです。プログラミング言語は従来の機能を継承しつつ進化しているわけで、それはそうなのですが、やはり根本はノイマン型コンピュータの枠を超えていない、あるいは出来ないということなのだと思います。ここを超えることが出来ない限り、単なるメモリ付き計算機では限界に達する時は以外に早く来るのではないでしょうか。

なぜソフトウェアは複雑なのか


目指せ一人前のプログラマ - ソフトの複雑さ増大は抑えられないのか
たかみちえの開発日誌 - 今のわたしたちにできること


なぜソフトウェアは複雑なのか。このテーマについて、自分なりに少し考えてみました。


プログラムコードが複雑になってしまう最も大きな原因は実現したい機能と実装とのギャップにあるのだと思います。


プログラムで実現したい「機能」があります。それを実現するためにプログラマはプログラムコードを書くわけですが、機能をプログラムでそのまま表現できることは少ないです。それはプログラムがコンピュータを実行する原理に問題があると考えられます。

機能と実装の隔たり


CPUはメモリ上に置かれたプログラムの命令を上から順番に実行します。命令の多くは何らかの計算です。それはデータに意味を持たせ、加工するための計算です。結果はやはりメモリに格納され、後に命令から参照される。というのがプログラムの基本動作ですよね。


プログラムで扱う命令・データなどは全て2進数で表現されています。ディスプレイに表示されるウィンドウや文字などはメモリ上のビット列をディスプレイアダプタが投影したもの。デジカメの写真はビットの集まりで色を表す。キーボードからの文字入力は対応する文字コードに置き換えられる。プログラムはほとんど人間が理解するオブジェクトとデータとの相互変換で構成されていると言っても過言ではありません。


プログラマは、まずユーザの入力するデータを内部でどう表現するか考える必要があります。そしてユーザの望む結果をどのように処理して人間に分かるように出力するかをイメージしながらプログラムを作ります。プログラムが実際に行う処理である実装と、プログラムが実現したい機能との間には大きな隔たりがあるため、プログラムは複雑にならざるを得ないのでしょう。一見実現したい機能が簡単そうに思えても、実装が複雑になってしまうことはよくあることです。


人間の考える機能をそのまま実現するにはどうすればよいのか。プログラミング言語はそういった命題を解決するべく進化を続けています。この記事では、プログラミング言語の進化の歴史を振り返りながら、これからの言語について考えてみたいと思います。

プログラミング言語の歴史


まずはプログラミング言語がどのように進化してきたかを振り返ってみることにします。詳しい方には退屈なものだと思いますが、どうかご容赦を。

機械語アセンブラの時代


機械語はCPUが直接解釈して実行可能な命令群であり、最もコンピュータに近い言語といえます。直接CPUが解釈実行できることから実行効率はよいのですが、さすがに人間が実現したい機能を機械語で置き換える作業は大変な労力を必要とします。もっとも、初期のプログラミングは他に選択肢がなかったわけですが。

高級言語の時代


アセンブラの次に出てきたのがFORTRANCOBOLといった高級言語と呼ばれるプログラミング言語です。これらは英語に似た表現で書くことができるので、プログラミングの効率は大幅に向上しました。


しかし、この高級言語もさらに大規模なプログラムを作成しようとすると問題が生じてきます。この時代の言語は多くの分岐や、データ構造を把握しにくい傾向があって、プログラマはかなり広範囲にプログラムを読まないと流れを追うのが難しかったのです。

構造化プログラミングの時代


次に現れたのは構造化プログラミング。CやPascalなどが代表的な処理系でしょうか。流れの追いにくいgotoを極力排除できる制御構造やモジュール化などにより、だいぶロジックが追いやすくなりました。また、ローカル変数の導入も、プログラマが見る範囲を局所化するのに役立ちました。


論理構造は見やすくなったものの、実装の手間はあまり改善されませんでした。プログラマはインタフェースのミスやメモリリークといった問題に苦しんでいたわけです。

オブジェクト思考の時代


現在主流の方式でしょうか。構造化をさらに推し進めたオブジェクト思考。C++Javaなどがそうですね。制御構造だけでなく、データ構造もまとめて隠ぺいしてしまうことで、プログラマはある程度データ構造を意識しなくてもすむようになりました。データ構造を抽象化することで、実装にかかっていた手間を減らすことができます。


とはいえ、プログラマが完全に実装から開放されたわけではなく、基本的な部分は他のプログラミング言語と同じです。

将来のプログラミング言語


言語の進化を書いていて気がついたことがあります。それはこれら進化が基本的に考え方の導入であるという点です。


オブジェクト指向言語であっても、いわゆる高級言語っぽく書くことは可能です。Cを使ったら必ず構造化プログラミングが出来るわけではない。あくまで「こういった書き方もできる」という機能を処理系が用意しているだけであって、必ずそう書かなくてはならないわけではない。基本的にプログラミング言語は従来の機能を継承しつつ進化しているわけで、それはそうなのですが、やはり根本はノイマン型コンピュータの枠を超えていない、あるいは出来ないということなのですね。


過去にはそれらを変えるような試みも多くなされましたし、現在も行われています。しかし、それらは難解であったり、実用的な性能が出せなかったり、様々な理由から主流となるには至っていません。やはり言語はコンピュータのアーキテクチャーに沿ったものがあっているということなのか・・・


現在のコンピュータの性能はソフトウェアだけの仮想計算機でも十分実用になるほど高くなりました。ネットワークの普及によりコンピュータはどんどん人間に近くなっています。単なるメモリ付き計算機では限界に達する時は以外に早く来るのではないでしょうか。


[2/4/2007 追記]


面白かったのでリンクを追加します。なんか他人のような気がしないblogタイトルですね。:)


らいおんの隠れ家 - ポール・グレアム「プログラミング言語が解決するもの」




過去の関連記事:
yasuhoの隠れ家 -どのプログラミング言語を学ぶべきか