連鎖性言語

プログラミング言語を分類する方法はたくさんありますが、そのうちの一つが連鎖性 (concatenative) と適用型 (applicative) とを対比させる方法です。適用型言語 (applicative language) では、引数を関数に適用することによって評価が行われます。よく使われているプログラミング言語のほぼすべては、適用型言語です。たとえば、CPythonMLHaskellJava は、いずれも適用型言語です。連鎖性プログラミング言語 (concatenative programming language) では、1 つのデータのかたまりを操作する関数を複数作成し、このデータのかたまりが関数から関数へと渡されることで評価が行われます。通常、このデータのかたまりはスタックの形で表現されます。また連鎖性言語では、この関数の合成は、複数のプログラムを連鎖させる (concatenate) ことによって記述されます。連鎖性言語には、ForthJoyPostScriptCatFactor などがあります。

連鎖性言語とスタック型言語

スタック型言語 (stack language) と 連鎖性言語 (concatenative language) という 2 つの用語が使われることがあります。どちらも似たような種類の言語を指す言葉ですが、厳密には同じではありません。ただし、ほとんどの部分については、両者に違いはありません。

スタックはコンピュータサイエンスの重要な基本概念で、多くの言語がその実装において内部的にスタックを利用しています。再帰的定義の可能な言語はいずれも、関数呼び出しのリターンアドレスを格納するために何らかのタイプのコールスタックを使っており、しばしばレジスタに割り付けることのできない値を格納するためにも同じスタックを使っています。ただし、これらのことは細かな実装の領域に属することであって、こうしたコールスタックが直接プログラマの目にふれることはありません (ただし、ファーストクラスの継続を取り入れた言語は除きます。この点については、あとでもう一度取り上げます)。

では、スタック型言語は、ほかの言語とどこが違うのでしょうか。重要なのは、スタック型言語には複数のスタックがあるという点です。すべてのスタック型言語は再帰を可能にするためにコールスタックを持っていますが、そのほかに、関数間で値をやり取りするためのデータスタックも持っています (データスタックはオペランドスタックと呼ばれることもあります)。スタック型言語のプログラマが言う「スタック」とは、後者のスタックの意味です。

今日広く使われているほとんどの言語は適用型言語です。言語の中核をなす部分は、何らかの形の関数呼び出しです。関数には一連のパラメータが適用され、各パラメータはそれ自体、関数呼び出しの結果か、変数の名前か、または定数です。スタック型言語では、目的の関数の名前を記述するだけで関数呼び出しが行われます。パラメータは暗黙で、関数呼び出しが行われる時点ですでにスタック上に存在している必要があります。関数呼び出しの結果 (結果がある場合) は、関数が戻った後にスタック上に置かれ、次の関数が取り出し、これが繰り返されます。関数は名前を記述するだけで呼び出され、付随的な構文は一切必要ないので、Forth と Factor では関数のことを「ワード (word)」と呼びます。実際、構文の中では、関数は単なるワード、つまり単語に過ぎません。

内容の変わるスタックが 1 つあると考えるか、関数の入力がスタックで出力もスタックと考えるか

プログラマによっては、ワードが値を「スタック」に積む (プッシュする)、あるいは取り出す (ポップする) という言い方をすることがあります。一方、別のプログラマ、特に「連鎖性言語」という用語を好んで使うプログラマの場合は、スタックを入力に取り、まったく新しい (一般には異なる) スタックを出力として返す関数として、ワードという言葉を使う傾向があります。前者の視点の方が直観的には理解しやすく、現実に多くの実装もそのように動作します。つまり、実際にメモリ内に 1 つの場所があって、それがデータスタックになっています。後者の視点は、より形式推論になじみやすいもので、作成した関数が純粋であれば、書き換え規則と型システムの取り扱いはより容易になります。ただし、2 つの視点は結局は同じものです。なぜなら、ある与えられた実行スレッドの中では、時間軸上のある 1 点で「生きている」スタックは 1 つだけで、そのスタックをその場で (インプレイスに) 更新することは、純粋関数的視点に立てば、意味論的に同じだからです。詳細については、Manfred von Thun の論文『Mathematical Foundations of Joy』を参照してください。

連鎖性言語の基本

連鎖性言語の語法

その他の主な属性

刊行物

This revision created on Mon, 27 Jul 2009 07:48:31 by slava