コンピューター技術書の温故知新
第七回
大野典宏
●具象数学と抽象数学の狭間にあるもの
アルゴリズムという言葉の起源は古い。それはともかく、数学的な問題を簡単かつ確実に解く手段として古くから様々なものが考案されてきた。それを一般的にアルゴリズムと称しているわけである。したがって、アルゴリズムは一般的な言葉や抽象的な数式として記述されるのが一般的である。
しかし、それをコンピュータで使おうとすると面倒な事が起こる。コンピュータは具体的な数値や論理で演算しなければならないからである。コンピュータのソフトウェアで面倒なのは、「プログラム言語」という縛りに依存してしまう事である。だが、これは仕方がない。利便性や記述性など、ざまざまな要因によって、今あるだけでも数え切れないほどのプログラム言語が考案され、実際に使われている。そんな現状に対して異を唱える人もいるようだが、ソフトウェアを作る側の利便性を考えてのことなので、とやかく言う筋合いは無い。
さて、そこで困るのは、プログラム言語によって特定のアルゴリズムを記述する方法が違ってくる点である。プログラム言語は、一通り覚えるだけでも時間がかかるので、ガタガタ言っても仕方がない。抽象的なアルゴリズムの記述をプログラム言語に書き直す必要があるのは当然であり必然なのだ。
Javaと言うと、発表された時には熱狂的な姿勢で迎え入れられた。ネットワークと非常に相性が良いからである。とはいっても、Javaだけですべてが解決するという万能のものでは無かったのも事実である。今は、隠れた場所、たとえば組み込み機器のソフトウェアやサーバ系の場所で使われているので、目立っていないのも事実だが確実に根付いている。
最初はサンドボックス(隔絶されて他には影響を与えない実行環境)を想定して仮想マシンが考案されていたのだが、今では直接バイナリに変換して実行されていることもある。しかし、ソフトウェアの実力は速さだけで評価される世界なので、それに文句を言うつもりもないし、安全ですらあれば何でも受け入れてしまう筆者なので、全く無関心だったりする。
まぁともかく、最初からマルチスレッドを前提として、ネットワークとの相性も良いとなると、これを使わない手は無いのである。
というわけで、ここで紹介したのはJavaを対象として、各種のアルゴリズムを記述する方法を紹介した本である。同じような本はC言語などでは出版されているのだが、そのような本はC言語からJavaに翻訳できる人しか読めない。英語版で出ているからと言って、日本語で出版する必要は無いといった無茶な要求は通らないのである。
というわけで、今後も新たなプログラム言語が考案され、普及させる際には同じ目的の本が書かれなければならないのである。
これは筆者が翻訳もやっているから書いているのではない。言語を覚えるって並大抵のくろうではないからである。
書評 2009年3月27日
いつの時代も書かれ続けるべきプログラミング入門書
『Java データ構造とアルゴリズム基礎講座』
大和田尚孝著
技術評論社
ISBN-10: 4774136972
ISBN-13: 978-4774136974
224ページ
2,580円(税別)
2008年12月
アルゴリズムという言葉は,問題を簡単に解く方法を定式化したもののことです.
ですから,アルゴリズムという言葉はコンピュータが登場する前からありました.しかし,数的な計算をプログラミング言語によって手順を実装していくことが不可欠になったために,一般的に用いられるようになりました.
アルゴリズムは,一般的に数式やフローチャートで表されます.それをプログラム言語で実現するのですが,コンピュータ特有の問題としてデータ構造も重要な要素だということがわかりました.それゆえに,コンピュータ書では一緒に語られることが多いのです.古典的名著といわれる「アルゴリズム+データ構造=プログラム」という本の題名がそのままの本質を示しているのです.
さて,これまで,本書と同じような題名の本が何冊も発行されてきました.それはなぜでしょうか.問題は,プログラミング言語の文法にあります.
数式やフローチャートだけを見て,自分が必要としている言語で実装できる人だったら問題はないでしょう.しかし,それには相当の経験と慣れ,スキル,数学的センスが必要となります.
また,これまでに数々の実装例がありながら,参照した本に掲載されている言語が違うとなると,その言語の読み方まで学習しなければなりません.それは翻訳以外の何物でもありません.
経験を積んだ人ならそれでも十分かもしれませんが,初学者でコンピューティングの基本,つまりは計算処理の方法を学ぶという目的には使えません.
現在はオブジェクト指向言語の時代です.これからは,代表的なオブジェクト指向言語であるJavaの需要が増えていくことでしょう.もちろん,それは他の言語が駆逐されるというわけではなく,CやFortran,LISP,Cobolなどは目的に応じて今後も使われ続けるでしょう.
しかし,それはこれまでの資産が活かせて,しかも処理の目的を実装するのに適した言語を選択するという話です.ですから,これからは,アプリケーション・ソフトウェアで使われる言語としてJavaが増え続けて行くことは間違いありません.
また,学校などでの授業や,アプリケーション開発においては,最初からオブジェクト指向の言語を習得した方が,時代の要請にも合っています.ですから,これからは学校でもJavaでプログラミング実習が行われたり,新入社員にJavaを教えるという例も増えてくるだろうことが予想されます.
でも,オブジェクト指向なのであれば,あらかじめデータ構造が定義されているのに,なぜにわざわざそれを学ばなければならないのでしょうか.
その答えは,「プログラムという処理の本質」を理解していなければ,プログラマとしては不十分だからです.
どんな局面において,どんな処理方法が考えられるのか,それにはどんな特徴があり,どれが最適な処理となり得るのか,それを知っていなければ,ソフトウェア・エンジニアとしてはスキル不足だと言われても言い返せないでしょう.
したがって,データ構造とアルゴリズムは,プログラミングにおいて基本的かつ本質的な事柄です.それゆえに,これまで数多くの本が書かれているわけです.その本質を,プログラム言語の文法を学ぶのと並行して行うという教育方法が理にかなっているという評者の主張に異を唱える人は少ないと思います.
本書で取り上げられているのは,本当に基本的なアルゴリズムばかりです.配列,スタックとキュー,リスト,ツリー,グラフ,検索,ソートといった,これまで何回となく実装例が示されてきたアルゴリズムが掲載されているにすぎません.
しかし,本書の場合,「それがJavaで書かれている」という点が重要なのです.初学者に数式やフローチャートの読み方,ほかの言語を同時に習得することを求めるのは無理です.Javaの「いろは」を学ぶのと同時に処理方法の定石を知るには,例文もJavaで書かれていなければならないのです.
ですから,本書は決して陳腐な本ではありません.これからの時代に合わせてアップグレードされた本なのです.
また,Javaの場合,プログラミングにEclipseを使わない手はありません.いったんEclipseの使い方を覚えてしまえば,CでもC++でも使えるので,初学者が上達してほかの言語を使えるようになっても開発環境を変えずに済みます.
そして最後には,応用編として,漸化式の解き方やフラクタルの実装といった難しいけれど挑戦のしがいがある付録も用意されているので,学習書としては親切な構成になっています.
学校の教科書や,新入社員のテキストとしては,よく書かれた本だと思います.