Daily Archives: 2010-03-16

シミュレーション技術と計算機科学

今日の夕方、JSTの「シミュレーション技術の革新と実用化基盤の構築」領域の打上げ会があります。7年ほど、アドバイザとしてお手伝いしました。というよりも、むしろ、各プロジェクト実施の研究者の方々から計算科学の実態をお教えいただいたように思います。これまでにも取り上げたことのある Parallelism-Oblivious Parallel Programming (POPP) という考え方が大事ではないかと思ったきっかけの一つだといえます。

余談になりますが、以前から、どうしようかと迷っていたのですが、Parallelism-Oblivious Programmingよりも、上に書いたPOPPのほうが誤解がないと考え、これからはPOPPにしようと思います。一月前、2010/2/16の「並列性忘却プログラミング」にもそのようなことを書きました。

モデル化を行ってシミュレーションによって物理的・化学的な現象を検証するというアプローチを「計算科学 (computational science) 」と呼ぶのが一般的でしょう。そこでは、スーパーコンピュータが活躍しますが、そのために(並列)プログラムを開発することが大きな課題となります。このような計算科学は、「理論」、「実験」に続く第3の研究方法論だそうです。科学の方法論には詳しくありませんので、このようなメタな議論には参加できません。しかし、シミュレーション技術が自然科学の方法論に影響を与えたことは分かります。

計算的手法による研究は多くの分野で一般的になってきています。いくらか抽象的ですが、計算科学を超えて(?)既存の知を高度に活用する第4の方法論として 「E-サイエンス (E-science) 」というものもあるそうです。目新しい用語に人が群がる姿はこれまでにも多くありましたが、ことばにしても概念にしても外国からの移入がほとんどです。E-サイエンスについては、計算科学とどこがどう違うのか、概念やねらいを正確に理解してから考えたいと思います。

このように、もう第4の足音が聞こえてきているところだそうですが、それでもなお、第3の方法論と言われる計算科学の核となるシミュレーション技術が多くの分野の研究を支えることはたしかでしょう。その基礎となるプログラム開発の手法、プログラミング方法論など、「計算機科学 (computer science) 」の研究が縁の下の力持ちとして支えることが大事だと思います。新たな方法論だけに向かうことだけでは困るでしょう。

今夕の打上げの後のことはまたいつか書くことにしたいと思います。

プログラムのレイアウト

昔から、プログラムの表記法にはいろいろな話題が尽きません。

今でも、多くのプログラミング言語は英字、数字、記号などの文字(いわゆる、ASCII文字)で書くのがほとんどだと言ってよいでしょう。それを1次元の文字列として考えるかどうかということもあります。さすがに、今では、大昔の(いわゆる)IBMカードを重ねたカードデック(カードの束)のように、物理的に2次元(?)の形状をとることはないでしょう。

最近は、Emacsに言語ごとにモードが設定できて、賢いレイアウトを行って、読みやすいレイアウトが自然にできるようになっています。1次元の文字列のプログラムを2次元にレイアウトして分かりやすく表示しているわけです。

関数型言語では、かなり前から、レイアウトによって区切り記号(デリミタ, delimiter)を省略しようとするのも一般的になっています。Haskellにも「オフサイドルール」が使われています。大雑把に言えば、前行よりも前に出ない部分はその前の行の文法上の構成の中の部分要素になっているというものです。また、一列に書くときにセミコロン(;)で区切るところを改行によって代用することもあります。

「オフサイドルール」は、1966年にLandinが提案したISWIM

http://ja.wikipedia.org/wiki/ISWIM

にすでに現れているということです。ISWIMは実用的な言語ではありませんが、その後の関数型言語の設計に大きな影響を与えたものです。Landinは英国人だからというわけでもないでしょうが、サッカーやフットボールのオフサイドと発想に関連があるかも知れないと思ったりすることがあります。

http://en.wikipedia.org/wiki/Peter_J._Landin

2/16に「並列性忘却プログラミング」のことを書きましたが、最近、ときどき、Fortressという新しい言語を使ってみています。

http://projectfortress.sun.com/Projects/Community

この言語、大胆な試みが行われているのですが、なかでも、乗算(数のかけ算)の演算子は「とくにない」、いいかえれば、数学で普通に書くように、「空白」だというのです。一般のプログラミング言語で使うアステリスク (*) のように、目に見えるものは使わないのです。先日も、うっかりしていて、空白を一つ置いたのがエラーだというのが分からなくて難儀しました。もちろん、意識して乗算を表すときはよいのでしょうが、レイアウトの関係で空白を置いてしまったら、そこに乗算演算子があるというのは、なかなか気がつきません。

プログラムの表記を数学の表記に近づけるのはよいのですが、「幼児体験」としての先入観が邪魔をするところもあるようです。