プログラムの安全性を高めるためにー今注目を集める関数型言語に迫るー

理学部・コンピュータ科学科 三好 博之教授

 私たちの生活に欠かせないものとなったコンピュータ。便利になった反面、金融機関での大規模なシステムエラーなど、ひとつ間違えば社会全体を混乱に巻き込むような事故もひき起こしてしまいます。
 今まで以上に安全性が高いシステムを構築するにはどうすればいいのでしょうか。その答えのひとつとなる「関数型プログラム言語」が専門の三好 博之先生に、それを使うことのメリット・デメリット、また現在のプログラムで使う関数や数学における関数との違いなどをお話いただきました。

数学の関数とコンピュータの関数は違う?

 みなさんは数学の授業で関数というものを習っていますね。簡単なものは、f(x)=x+3、などと表されますが、実は関数と一言で言っても、数学で学ぶものとコンピュータで使うものとでは、厳密に同じではありません。
 たとえば、f(x)=x+3の場合ですと、f(x)が表しているのは、“関数fのxにおける値”なのか、それとも、“変数xに3を足すという関数それ自体”なのか区別がつかないのです。それでも私たちに大きな混乱が起こらないのは、理解する側の人間が、ある程度のあいまいさがあっても暗黙の了解によってそれを補いながら運用しているからなのです。
 このことを20世紀前半、コンピュータが発展する前に論理学者は気が付いていました。アメリカの数学者・論理学者アロンゾ・チャーチは、この両者を厳密に区別するために「ラムダ記法」という表記法を提案しています。ラムダ記法では、関数自体を現す場合はλx.f(x)と表記し、単にf(x)と記した場合と区別しています。
 その発想は、当初、数学の表記をより厳密にするためのものでしたが、コンピュータの登場後、あいまいさの許されないプログラム言語に応用され、後で説明する「関数型言語」の基礎となったのです。

私たちはコンピュータの副作用を使っている

 ところで、みなさんは、現在の一般的なコンピュータを使うとき、キーボードやマウスによってコンピュータに意思を伝えることを「入力」、コンピュータが画面に表示したり、印刷物をプリントしたりすることを「出力」と思っていませんか?
 実は、現在の一般的なコンピュータのなかの関数は、私たちが入力や出力と考えているものとはまったく関係のない数値を入力・出力として計算しています。たとえば、キーボードから「Hello!」と打ち込んだとします。このとき「Hello!」という文字の列はコンピュータのなかの関数にとって、ただ副作用として受け取られ、別の副作用を通じて、「Hello!」と画面に表示されます。では、その間、関数は何をやっているのかというと、「Hello!」という文字列とは全く関係のない数値を入力として受け取り、出力としてプログラムの次の手順に引き渡しています。コンピュータにとっては、この全く関係のない数値が計算を行ううえで重要なのですが、それは私たちが使いたいコンピュータの機能ではありません。
 つまり、私たちはコンピュータの「副作用」を見て、それをコンピュータの主要な働きと見なしているのです。
 このようなタイプのコンピュータでは、副作用が主な働きとなるため、関数とは関係のないところで外部からの数値などの代入が許されてしまいます。それにより関数が影響を受け、同じ関数に対して、同じ入力なのに出力結果が異なるという事態が起こってしまいます。
 このように外部の環境に依存する要素が多く含まれてくると、コンピュータの挙動が予測しにくくなり、プログラム全体が正しく動くものなのかどうかのチェックが難しくなります。
 コンピュータが登場したばかりの頃のプログラムは、人の目で欠陥部分を見つけることができましたが、現在のソフトウェアはその頃と比較にならないくらい複雑になっていて、もはや人の目では見つけることができなくなっています。

システムの安全性を高める関数型言語

 これらの問題点を解決するものとして考えられるのが、「関数型言語」と呼ばれるタイプのプログラム言語です。
 C ++などの現在の主流な言語との大きな違いは、同じ「関数」を使うといっても、関数型言語では、ユーザが期待する成果である副作用まで、関数という枠組み,たとえば出力に含めてしまうという点です。この方式をとることによって、プログラム中には関数の入力→出力→入力という連続した動作だけが存在することになります。そのため、すべての計算がプログラムの中で完結し、プログラム全体の挙動を数学的に検証することが飛躍的に容易となるのです。
 ただ、実行される関数のすべての場面で外部とのやりとりが行われないと、ユーザにとって使いにくいということもありますから、実際には理論的に扱いやすい程度に制限した副作用を生じさせたり、ある程度外部からの代入も許容したりするようにしています。
 このようにして構築されたプログラムは、バグが起きにくく安全性・確実性の高いものとなります。一昔前であれば、安全性や確実性はプログラマーが途方もない労力を使って確保していたものでした。コンピュータの性能が十分に向上し、マシンパワーに余裕が出てきた現在、ようやくそのためにコンピュータ自身の性能を使えるようになってきました。
 もちろん、形式的に完全であるということと人間にとって使いやすいということとは両立しにくいものです。そのため、あらゆるプログラムを関数型言語で記述すれば良いというわけではありません。多少のバグが出ても、使い勝手を優先するのであれば、あいまいさを残した言語のほうが向いていることもあるでしょう。しかし、原子力発電所や交通機関の制御プログラムのように、万が一にもエラーが許されないシステムの構築には、関数型言語が威力を発揮するのです。
 近年、大手のソフトウェア会社が関数型言語の研究のために多くの人材を集めています。新しく発表されるプログラム言語にも関数型言語の研究成果がたくさん活かされているようです。関数型言語は今後ますます注目されていくことでしょう。

クローズアップ

私の高校時代

 高校時代はあまりガリガリと勉強するタイプではなく、物理研究部と軽音楽サークルの活動などクラブ・サークル活動に打ち込みました。特に軽音楽サークルについては、軽音楽系のクラブが学校になかったため、自分たちで立ち上げて活動していました。物理研究部では、アマチュア無線を主にやっていました。軽音楽サークルでは、キーボードやシンセサイザーを演奏し、ヴォーカルもやっていました。エフェクターを自作したこともあります。このサークルには、他のクラブの部長や幹部クラスのアクティブで多彩な連中がいて、いい意味での刺激になったと思います。高校生のみなさんにとって、今は大学の序列が昔ほどはっきりとしていないし、そこで学ぶ内容についても選択肢が広く、我々の頃とはだいぶ状況が違います。しかし、高校時代というのは人生の中でも活動的になれる時期ですから、勉強もがんばりながら、課外活動などの高校生活も楽しむスマートさも持って欲しいと思います。

トピックス

計算するとはどういうことだろう?

 コンピュータとは「計算する機械」です。現在ではありふれたものになり、当たり前のように使っていますが、ではそもそも計算とは何なのでしょうか?
1.数を数えたり、暗算をする。2.紙とペンを使って筆算をする、そろばんを使って計算をする。3.電卓やコンピュータに計算させる。4.人に頼んで計算してもらう。
 1.や2.が計算なのは当たり前のように思えますが、3.になると計算している主体が分かりにくくなってきます。計算しているのは、人でしょうか、電卓やコンピュータでしょうか、それとも両方でしょうか。また、3.と4.の違いはどこにあるのでしょう。
 さらに、現在のデジタルコンピュータをモデルとした場合の計算と、今後実用化されるであろう量子コンピュータが行う計算とでは、計算の概念も大きく違ってくると考えられます。計算とは何なのか、みなさんも一度考えてみてください。

理学部・コンピュータ科学科 三好 博之教授

プロフィール

 専攻は理論計算機科学、圏論など。大阪府立北野高等学校OB。大学時代に消去法でたまたま選んだコンピュータ科学だが、その後、理論的な研究を行う一方で,日本で初めてのインターネット構築に立ち会った。慶応義塾大学・湘南藤沢キャンパス立ち上げ時には情報環境の構築に関わるなど、常にコンピュータ科学の最前線で活躍してきた。現在は、哲学、人文系の研究者などと協力して、「計算とは何か」という哲学的な問いに対して、科学と哲学の両面からの探求に取組んでいる。

PAGE TOP