[index]

Concurrent Clean : brief overview

オリジナルは FAQ for comp.lang.functionalClean の項目 です。

あらゆる意味におけるコメントを強く強く希望します。


brief overview

Concurrent Clean system は、関数型言語 Concurrent Clean のプログラミング環境で、オランダのナイメーヘン大学ソフトウェア科学技術研究グループ、およびそこを母体とした Hilt (High Level Software Tools B.V.) で開発されています。 Concurrent Clean は、グラフ書き換えを基盤とし、逐次的、並列的、分散的な実用アプリケーション開発用に設計されており、汎用で、高階関数を実現し、純粋な、遅延評価機能を持った関数型言語です。 このシステムはこれを書いている時点 (1999 年 12 月時点) で最速の関数型言語の実装の一つです。 型付けの単一性一意型の使用によって、ウィンドウ、メニュー、ダイアログなどを含んだ、対話的で純粋な関数プログラムを書くことができます。 また、関数型システムとは以て異なるシステムと界面を接する、ホンモノの (real-life) アプリケーションを書くこともできます。 1995(?) 年のヴァージョン 1.0 で、以前の中間言語から、 Miranda や Haskell の構文スタイルを持った真の算譜言語となって登場してきました。 1999 年 12 月時点での最新版は 1.3.2 (プラットフォームによっては 1.3.1) です。 この言語は以下のような特徴を持っています。

蛇足ながら、当然 garbage collection の機能も持っています。為念。

Concurrent Clean はフリーソフトウェアではありません。 非営利団体や個人での教育、研究などの非商用利用に限り、無料で使用することができ、無変更の再配布が可能ですが、いかなる商用利用も、商用ライセンスが必要です。

Concurrent Clean は、 Machintoshs (MacOS: Motorola, PowerPC の両方), PCs (OS2, Linux), Sun4s (Solaris, SunOS), PowerPC based Macintoshs (MkLinux, LinuxPPC) で動きます。 システムは以下から ftp できます。

Concurrent Clean に関する詳しい情報は以下の web ページから手繰ることができます。

Concurrent Clean の背景と実装を述べた本が出ています。 ただし、この本はヴァージョン 0.8 に基づいています。このヴァージョンは Concurrent Clean の概念的な基盤となっています。 ヴァージョン 0.7 以降の版は、 ftp サーバ から取得できます。ありがたや。

Rinus Plasmeijer (ボス) を含めたチームが Concurrent Clean による関数プログラミングの書籍 "Functional Programming in CLEAN", を執筆中です。 一部分のドラフトを web から取得することができます。

新しい版が出るたびに言語報告も配布されています。 またアナウンスおよび議論の 2 種類のメイリング・リストなども用意されています。

正格性 (Strictness) に関する一つの見方

引数が未定義であるときはつねに関数の値も定義されないならば、このような関数を正格である (strict) ということを思い起こそう。
R. Bird, P. Wadler, "関数プログラミング", 武市正人 訳, 近代科学社, 1991., ISBN4-7649-0181-1, p. 148.

関数型言語のコミュニティでは、 正格と非正格な言語の相対的なメリットに関しての議論が盛んです。 しかしながら、これら二つのアプローチを混合させてサポートすることは可能です。例えば、関数型言語 Hope のいくつかのヴァージョンが、このやり方をサポートしています。 Concurrent Clean の場合では、標記を切り替えることによって、引数の扱いを正格/非正格に切り替えることができます。その他いろいろ。

プログラミング言語のモデルとしては、書き換えの順序 (評価順序) をも規定した計算のモデルを定義する必要がある。プログラミング言語の代表的な評価順序は以下のようなものである。
  1. 同一のレベルの式については左から順に評価する
  2. 関数適用の前に関数の引数を評価する
  3. 関数定義の内部は評価しない
この書き換え方式を call-by-value 評価 (値による関数呼び出し) または strict な評価と呼ぶ。上の例では、 (2) の書き換えが call-by-value 評価に対応する。これに対して、関数の引数を、それが必要になるまで評価しない call-by-need 評価または lazy な評価と呼ばれる評価方式も可能である。 call-by-need 評価方式は、無限のデータ構造等を容易に表現できるという利点があるが、 call-by-value 評価方式の方がより効率的な実装が可能であり、また、後に説明する参照型データなどの非関数的機能を取り入れるのも容易である。
大堀淳, "プログラミング言語の基礎理論", 共立出版, 1997., ISBN4-320-02659-4, p. 85.

備考

グラフ書き換え (graph rewriting)
Concurrent Clean は「項書き換え」をグラフ書き換えで実現しています。
純粋な (pure)
「純粋な」とは「参照透過性を保つ」ことですが、副作用を持つプログラミングも可能になっています。この辺は微妙なところ。
参照透過性を保つこと
「同じものを同じもので置き換えても結果が変わらない」という性質を保つこと。公理的意味論の枠組みの基本。
参照型の操作とラムダ計算の理論とのミスマッチは、参照型を操作するプログラムの「手続き的な性質」による。すなわち、参照型を含んだプログラムは、 (暗黙に与えられた) 記憶領域の状態の変更を行う手続きであり、それ自身で独立した意味を持っていないことによる。参照型の操作を含んだプログラムの意味は、そのプログラムを囲む全体のプログラムと、そのプログラム各部分の評価順序に依存する。
(中略)
 ラムダ計算は、歴史的には関数のふるまいを記述する論理学として構築された。参照透明性 (以下、「参照透過性」とする) や簡約関係の合流性を持たないシステムは、論理学としては意味を持たない。しかしながら、プログラミング言語のモデルとしては、これらの性質は必須ではない。実際、現実的な汎用プログラミング言語のほとんどは実世界との入出力を行うための機構が用意されており、それらを使用するプログラムは、参照透過性を持ち得ない。同様の理由から、プログラミング言語の行う計算を簡約関係とみた場合、それらは合流性を持ち得ない。このため、現実のプログラミング言語の意味は、表示的意味論や公理的意味論によってではなく、評価順序に依存した操作的意味論によって記述される。
大堀淳, "プログラミング言語の基礎理論", 共立出版, 1997., ISBN4-320-02659-4, p. 139.
Annotations
ここでは「標記」としています。
uniqueness typing
ここでは「型付けの単一性一意型」としています。
Existential types
ここでは「存在型」としています。
real-life applications
ここでは「実用アプリケーション」としています。
intermediate language
ここでは「中間言語」としています。

Created: Dec 10, 1999.
[index]