久保拓也さん (北大→地球フロンティア研究システム)が1999年の 日本生態学会で 自由集会「計算生態学」 を主催し,私も話す機会をいただきました. その時,久保さんから,Windows上でのプログラミング環境について テクニカルノートのようなものを書け,との課題をいただきました. 以下の文書がそれです.適宜加筆,訂正など行ってます.
First uploaded in March 1999 | Latest update on 31 July 2000
多量の計算をするシミュレーションプログラムをWindows上で効率よく開発し動かすためにはどのような言語、環境、ツールを選択したらよいかについて、私のごくごく限られた経験にもとづく個人的な意見をとりとめもなく書き連ねてみました。
想定する読者は,プログラミングの経験があまりないけれど,できることなら自分でもシミュレーションなどしてみたい,と考えている生態学の研究者です(別段生態学に限ることはないのですが).
これはWindows上のプログラム開発についての文章ですからOSはWindowsに決まっているのですが、Windows にも種類がいくつかあります(まとめてWindows family と呼ばれる)。そのなかで数値計算プログラムの開発・実行環境としてはWindows NT(最新バージョンはWindows 2000)がもっとも適当だと思います。
売り物のソフトウエアでもときに(あるいはしばしば)暴走し、フリーズします。自分で書いたプログラムはなおのことしばしば暴走し、フリーズします(言語および開発環境にもよりますが)。そんなとき、OSごと応答不能になってしまってリセットしたり電源を落としたりするしかなくなってしまうのでは困ります。いちいち再起動する手間はかかるし、ほかのソフトで作業中だった場合にはそちらもおしゃかになってしまうし、ディスク中のファイルが壊れてしまうこともあります。
Windows 95/98ではひとつのソフトがこけるとOSごとこける、という状況がしばしば起こります。Windows NTは、ひとつひとつのプロセスの独立性が高く、ユーザーが個々のプロセスを個別に強制終了させることができます。ひとつのプログラムがまったく応答しなくなっても、それだけを終わらせてしまうことが可能です。計算機をリセットするしかないという状況にはなりにくいOSです(あくまでWindows family の中で)。というわけで、95/98よりはNT/2000をすすめます。 NT/2000にはworkstation版とより高価なserver版というふたつのバージョンがありますが、workstation版でけっこうです。
もちろん,95/98ではだめというわけではありません.すでに95/98でそれなりに 快適な環境を作ってるのに,わざわざOSを入れ換えて1からやりなおすのも 大変です.プログラム開発を始めてみて,しょっちゅうコケてリセットを繰り返す ようならOSの入れ換えを考えてみたらよいでしょう.
ウインドウシステム上でのGUI(Graphic User Interface)プログラミングはいろいろ面倒な手続きをともないます。計算作業の本筋とは関係がない部分の学習に時間とエネルギーを使うのはもったいないです。 Windows上といえどもGUIにこだわるのは得策ではありません。
Windows 95/98, NT/2000では、DOS窓とかコマンドプロンプトとか呼ばれるCUI(Character User Interface)環境が用意されています。DOS窓は、名前の通りDOSのプログラムも動作する環境ですが、この環境での計算の実力ははるかにDOSのそれを上回っています。計算機の計算能力をフルに引き出せる環境です。とにかく数値計算をさせようということであれば、このDOS窓で動作するコンソールアプリケーションと呼ばれるCUIプログラムから始めるのがよいと思います。そのうえで、興味・必要と時間があればおいおいGUIプログラミングに挑戦すればよいでしょう。
多くのパラメータ設定が必要なシミュレーションプログラムで,パラメータを少しずついじりながら結果をリアルタイムで見たい,などという場合にはGUIが生きるかもしれません.
計算結果をきれいな絵にしたいだけならなら、そういうことが得意なアプリケーションソフトにまかせるのがよいと思います。そうしたソフトの入力ファイルとして使えるような形の出力ファイルを作り、あとはそのソフトに任せてしまう。いちばん簡単なのは表計算ソフトで読み込んでグラフにすることです。また、3次元のレンダリングソフトなぞを使うととても見栄えのよいものができ、人目をあざむくことができます。
いずれにせよ,DOS窓の使い方をひととおり勉強しておくことは無駄になりません. 少なくとも,カレントディレクトリ,標準入出力,パイプ,リダイレクト程度の概念は 押さえておきたいところです.
どの言語を選ぶべきかは、どのぐらい習得時間をかけられるか、どのぐらいの計算量か、作るのは使い捨てプログラムか末長くメンテしながらつきあうシステムか、などに依存します。できれば複数の言語をマスターして用途に応じて使い分けるのがベストです。
じゅうぶん時間をかけて勉強し、大量の計算を行う大規模でしっかりしたシステムを構築したい人は、メインの言語としてC++を使い、データの前処理、後処理、さまざまな設定の自動化などさざまざな雑務にPerl、というのがお薦めです。C++とPerlに習熟すれば、まず困ることはありません。
とりあえず動く小規模から中規模プログラムを作りたい、あまり大量の計算はしない、という人はPerlになんでもやらせるというのも有力な選択肢です。あまり大量の計算はしないがやっぱりオブジェクト指向したいという人は、メインの計算にはPython、それにくわえて雑務の処理にPerlの二刀流でしょうか。PythonはC++よりは気軽に使える言語であり、かつ正面からオブジェクト指向を目指しています。
そのほか、以前の(構造化プログラミングに対応していない、もちろんCUIの)BASICをちょっとかじったことがあるという人で、とりあえず動く小規模プログラムを手早く作ってみたい人は、構造化された BASICの方言を使うという選択もあります。
なお、大量の計算というのは、たとえばかけ算や足し算を何百億回から何十兆回ぐらい行うような計算のことです。また、小規模なプログラムというのは行数にして数行〜数百行程度のもの、大規模なプログラムとは1万〜数万行程度のもの、中規模とは小規模と大規模のあいだのものです(あたりまえか)。※世の中でいう大規模プログラムというのはもう一桁から二桁ぐらい大きなものです。
以下に、各言語について簡単なコメントを書いてみます。
Cを、オブジェクト指向プログラミングがやりやすいように拡張して作られた、比較的新しい言語です。現在、パソコン上のソフト開発の主流です。多量の計算を伴う大規模シミュレーションプログラム開発を目指す人にお薦めの理由は、(1)オブジェクト指向のパラダイムはシミュレーションという用途にとても合っていること、(2)C++のコンパイラがつくる実行ファイルの計算速度は早いこと、の2点です。 これより遅い言語は山ほどあり、ほぼ匹敵するものが少しあり、もっと速いものはまずない、と考えていいでしょう。
問題点は、文法が少々複雑で、学習に時間がかかること。文法の習得そのものよりも、その文法を生かしてきちんとオブジェクト指向したプログラムが書けるようになるまでかなりの経験が必要だ、ということです。ゼロから出発して、そこそこプログラムが書けるまでに1、2ケ月、きちんとオブジェクト指向するまでに1年、というのがプログラミングにある程度の適性がある人の標準所要時間のようです。
また,Windows上で動作する市販のC++処理系はどれもかなりゴテゴテとしたもので,その使い方を覚えるだけで一苦労です.プログラミング初心者がいきなりWindows上でC++でGUIしようとすると,C++の勉強,オブジェクト指向プログラミングの勉強,WindowsのGUIプログラミング作法の勉強,処理系の使い方の勉強,そして処理系附属のGUI用ライブラリの勉強,といっぺんに勉強することがてんこもりになり,その泥沼のなかで,いったい自分は何が分からないのかも分からなくなる危険があります.
そうした意味からも,C++に取り組むならば,DOS窓で動作するCUIプログラミングから始めるのが得策でしょう.
Web pageでのCGIプログラミングによく使われることで一気に知名度が上がりましたが、それ以前から数行で書くテキストファイル処理プログラムから数百、数千行のプログラムまで、さまざまな用途に使われている柔軟な言語です。これだけで十分という人も多いでしょうし、C++で大規模なシステムを、という人でもデータの前処理、後処理や、シミュレーションの設定ファイルのたぐいの自動生成など、さまざまな用途に利用できます。覚えて絶対損のない言語だと断言してしまいます。
なお、最近のバージョン((5.0以上)ではオブジェクト指向のサポートを標榜していますが、やや無理をしている感もあります。オブジェクト指向プログラミング用にはC++かPythonがよいと思います。
現在売り出し中のスクリプト言語で、オブジェクト指向の本格的サポートが売りです。日本での浸透度はまだ低いですが、なかなか使い勝手はいいです。Perlの手軽さで、より整ったプログラムを書くことができます。
ただし,まだ勉強用の文書がほとんどないという難点はあります.2000年夏の段階で,9日本語で読める書籍は,オライリージャパンから出ている上下2冊のニシキヘビ本があるだけだと思われます.プログラミングの初心者がこの本を読みこなすのはちょっと厳しいかもしれません.C,C++ないしは Perlの経験がある人なら大丈夫でしょう.
ふた昔まえ、日本の国産パソコンについてきたN88-BASICというものがありました。当時は 市販のアプリケーションソフトがきわめて限られていたので、パソコンを使うというのは、 ほとんどBASICでプログラムを書くことと同義に近いものでした。とはいえ、当時のBASIC は大規模プログラムや大量の数値計算をゴリゴリやらせるにはとても不向きなものでした。
その後、いわゆる構造化プログラミングに対応した拡張がなされた方言が作られ、簡単に GUIプログラムができる(という触れ込みの)Visual BASICという開発環境で採用された りもしています。プログラミングの通人たちからは疎んじられながらもそれなりの存在 感を維持している言語です。
とにかくGUIでなきゃいやだ,計算速度はあまり重要ではない,というような場合には 有力な選択肢のひとつでしょう.MS社のExcel上で動くVBA (Visual Basic for Application) も,それなりに使えます.ワークシート上でパラメータをいじって,シミュレーション計算をVBAにさせて,その結果のグラフ化もVBAで自動化,といった利用法もあります.
科学技術計算の標準言語としての地位に長きにわたって君臨してきた由緒正しい言語です。とはいえ、文法上にさまざまな不自由さと不自然さも抱えており、C++よりもすぐれている点はほとんどないといってよいと思います。
というわけでその寿命ももはや尽きんとしている....とずっと言われつづけているようですが、なおもしぶとく生き残っています。多量のプログラム資産が蓄積していることがその理由でしょうか。ともあれ、プログラミングをこれから勉強しようという人があえてFORTRANを選ぶ積極的理由はないでしょう。
今、あえてC++でなくCを選ぶ理由はないでしょう。C++のC部分だけを使うということはあり得ますが、それでもC++の便利になった機能をわざと使わないということに積極的な意味はないでしょう。Windows上で動作する市販の処理系も、CのみサポートしてC++はサポートしないというものはほとんどありません。ただ、C++の勉強のための第一歩としてCを勉強するという選択肢はあり得ます。また、C++ のプログラムから、Cのプログラム資産を利用することは簡単です。
禁欲的な(=許される書き方が限定された)言語仕様で、教育用にひろく使われていたようです。この言語の拡張版が、Imprise社(前Borland社)のDelphi に使われています。DelphiはWindows上のGUIソフトを手軽に作るツールとして人気があります。
オブジェクト指向のプログラミングとは、データ処理のプロセスの設計を中心に開発するのでなく、問題領域に登場する「もの」や「こと」をプログラムの中でどのように表現するかの設計を中心してプログラミングしていこう、という設計技法です。そのような設計を支援するような文法構造を持った言語が、オブジェクト指向プログラム言語と呼ばれます。
オブジェクト指向プログラム言語の元祖としては、Smalltalkという言語があげられることが多いようです。設計は美しいものの、当時の計算機の能力では使い物になる開発・実行環境を用意できず、実用言語としては広まりませんでした。その後、計算機の能力があがるにつれて、一部でリバイバルしているようです。
Smalltalkに先んじるオブジェクト指向言語として、Simulaという言語がありました。その名前から想像がつくように計算機シミュレーションシステムの開発のためにつくられた言語です。 シミュレーションとはすなわち世界の「もの」や「こと」を計算機中に再現してみることですから、 オブジェクト指向の技法とはまさにぴったりの相性です。 生態学の問題領域に登場する「もの」や「こと」をシミュレートする場合にも、オブジェクト 指向技術を生かすことで拡張性のある自然な計算システムが作れるのではないかと思います。