参照透過性

参照透過性とは



参照透過性(Referential transparency)とは、プログラミングにおける重要な概念の一つで、ある式がその式の値で置き換えられても、プログラム全体の振る舞いが変わらない性質を指します。つまり、同じ入力に対して常に同じ出力が得られるという、純粋関数が持つべき性質です。

具体的には、以下の特徴を持ちます。

変数の不変性: 一度定義された変数の値は、プログラム実行中に変更されることはありません。常に最初に定義された値のままです。
関数の純粋性: 同じ引数が与えられた場合、関数は常に同じ値を返します。関数の実行によって、プログラムの状態や他の変数に影響を与えることはありません。

参照透過性が成り立つ言語は、式の値がプログラムのテキストから一意に定まるため、宣言型言語と呼ばれることもあります。一方、変数の値を変更できる言語は、手続き型言語や命令型言語と呼ばれます。ただし、近年では、純粋関数型言語だけでなく、代入を伴う関数型言語も増えており、関数型言語という用語はより広い意味で使われるようになっています。

また、分散処理の文脈では、あるデータがどのノードにあるかを意識せず、透過的にアクセスできる性質も参照透過性と呼ばれることがあります。

代入と参照透過性



参照透過性が成り立つ言語では、変数の値を再定義する代入操作は存在しません。これにより、プログラムの各部分が他の部分に影響を与える可能性が低減し、コードの理解やデバッグが容易になります。

参照透過性の有無は、計算理論上は言語の記述能力に影響を与えません。代入を伴う言語はチューリングマシンで、純粋関数型言語はラムダ計算でモデル化できますが、両者で記述できるプログラムの集合は同じです。しかし、人間にとっての記述しやすさ、可読性、実行効率は大きく異なります。

参照透過性のメリットとして、変数が参照する値の所在を意識する必要がないため、プログラムの記述が簡潔になる点が挙げられます。一方で、データの管理と最適化は言語処理系に依存するため、実行効率を上げるためには高度な最適化が必要です。例えば、大きなデータ構造の一部を変更する際、既存のデータ構造を直接変更できないため、新しいデータ構造を作成する必要があり、効率が悪くなる場合があります。

また、参照透過的な言語では、共有されたメモリ領域を監視するようなコードは書けません。これにより、プログラムの動作を副作用なしに追跡でき、最適化の可能性が広がる一方、変数を介した並行・並列処理が難しくなります。入力動作や出力順序を制御するために、さまざまな工夫が必要となります。

このような理由から、ML言語のように、基本は関数型言語でありながら、代入機能を補助的に備え、式に状態を持たせる言語も存在します。Haskellでは、モナド型と構文糖衣を使って、参照透過性を保ったまま手続き型的な表現を可能にしています。また、Clean言語では、値が一度しか参照されないことを型に付与することで、代入を使いつつ参照透過性を維持し、効率も高めています。

参照透過性の解釈の変化



当初、参照透過性は代入操作を厳格に禁止するものとされていましたが、Haskellでは、STモナドのような仕組みを導入し、代入を関数の内部に閉じ込め、副作用を発生させないように工夫することで、参照透過性を維持したまま代入を使うことができるようになりました。

例えば、再帰関数は、代入を使った反復処理でも、与えられた引数が同じなら結果も同じになります。代入を関数の内部だけにとどめ、結果の取得は変数のコピーを返す関数を使うことで、副作用から切り離すことができます。この考え方が、STモナドとして結実しました。

まとめ



参照透過性は、プログラムの理解や検証を容易にする重要な概念です。代入を厳格に禁止するだけでなく、モナドなどの仕組みを利用することで、柔軟に適用できるようになりつつあります。関数型プログラミングを理解する上で、参照透過性の概念を深く理解することは不可欠です。

参考文献



Søndergaard, Harald; Sestoft, Peter (1990). “Referential transparency, definiteness and unfoldability”. Acta Informatica 27 (6): 505–517. doi:10.1007/bf00277387. http://www.itu.dk/people/sestoft/papers/SondergaardSestoft1990.pdf.

関連事項



関数 (プログラミング)
関数型言語
手続き型言語
変数 (プログラミング)
モナド (プログラミング)
Lisp
ML (プログラミング言語)
Haskell
分散処理
メモ化
副作用 (プログラム)
* 冪等

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。