| クリーン | |
|---|---|
| パラダイム | 関数型 |
| 設計 | ナイメーヘン・ラートバウド大学ソフトウェア技術研究グループ |
| 初出 | 1987年 ( 1987 ) |
| 安定版リリース | 3.1 / 2022年1月5日 ( 2022-01-05 ) |
| 型付け規律 | 強力、静的、動的 |
| OS | クロスプラットフォーム |
| ライセンス | 簡易BSD [ 1 ] |
| ファイル名拡張子 | .icl、.dcl、.abc |
| ウェブサイト | clean |
| 影響を受けたもの | |
| Lean、Miranda、Haskell | |
| 影響を受けたもの | |
| Haskell、Idris [ 2 ] | |
Cleanは汎用の 純粋関数型 プログラミング言語です。元々はConcurrent Clean System [ 3 ]またはClean System [ 4 ] [ 5 ]と呼ばれ、1987年からナイメーヘンのラドバウド大学の研究者グループによって開発されてきました。[ 6 ] [ 7 ]言語の開発は鈍化していますが、一部の研究者は現在もこの言語に取り組んでいます。[ 8 ] 2018年には、Cleanを使用するスピンオフ企業が設立されました。[ 9 ]
特徴
[編集]Cleanは、弟分言語であるHaskellと多くの特性と構文を共有しています。参照透過性、リスト内包表記、ガード、ガベージコレクション、高階関数、カリー化、遅延評価などです。しかし、CleanはHaskellのモナドの使用とは対照的に、一意性型システムを通じて可変状態と入出力(I/O)を処理します。コンパイラは、プログラムの実行中のどの時点でも、一意の型を持つ値への参照は1つしか存在できないことを認識しているため、一意性型システムを利用してより効率的なコードを生成します。したがって、一意の値はインプレースで変更できます。[ 10 ]
Cleanのディストリビューションには、 Microsoft Windows用の統合開発環境(IDE)が含まれています。
例
[編集] Start = "Hello, world!"
階乗:
fac :: Int -> Int fac 0 = 1 fac n = n * fac ( n -1 )
Start = fac 10
|
fac :: Int -> Int fac n = prod [ 1 .. n ] // 1からnまでの数の積
Start = fac 10
|
fib :: Int -> Int fib 0 = 1 fib 1 = 1 fib n = fib ( n - 2 ) + fib ( n - 1 )
Start = fib 7
|
fibs :: Int Int -> [ Int ] fibs x_2 x_1 = [ x_2 : fibs x_1 ( x_2 + x_1 )]
fib :: Int -> Int fib n = ( fibs 1 1 ) !! n
Start = fib 7
|
中置演算子:
( ^ ) infixr 8 :: Int Int -> Int ( ^ ) x 0 = 1 ( ^ ) x n = x * x ^ ( n -1 )
型宣言は、関数が優先度8の右結合中置演算子であることを示しています。つまり、はとx*x^(n-1)同等であり、x*(x^(n-1))はと異なることを示しています。この演算子は、Clean標準ライブラリ(x*x)^(n-1)であるStdEnvで事前定義されています。
Cleanの仕組み
[編集]コンピューティングはグラフ書き換えと縮約に基づいています。数値などの定数はグラフであり、関数はグラフ書き換え式です。これとネイティブコードへのコンパイルを組み合わせることで、高度な抽象化を使用するCleanプログラムは、The Computer Language Benchmarks Gameによると比較的高速に実行されます。[ 11 ] 2008年のベンチマークでは、Cleanネイティブコードは、ベンチマークによっては、 Glasgow Haskellコンパイラ(GHC)と同等のパフォーマンスを示すことが示されました。[ 12 ]
コンパイル
[編集]Cleanからマシンコードへのコンパイルは、次のように行われます。
- ソースファイル(.icl)と定義ファイル(.dcl)は、Cleanで書かれたコンパイラフロントエンドによって、Cleanの基本バージョンであるCore Cleanに変換されます。
- Core Cleanは、CleanとCで書かれたコンパイラバックエンドによって、Cleanのプラットフォームに依存しない中間言語(.abc)に変換されます。
- 中間ABCコードは、 Cで書かれたコードジェネレータによってオブジェクトコード(.o)に変換されます。
- オブジェクトコードは、モジュールおよびランタイムシステム内の他のファイルとリンクされ、システムリンカー(使用可能な場合)またはWindows上のCleanで書かれた専用リンカーを使用して通常の実行可能ファイルに変換されます。
Cleanコンパイラの以前のバージョンは完全にCで書かれていたため、ブートストラップの問題を回避していました。
ABCマシン
[編集]上記のABCコードは、抽象マシンの中間表現です。ABCコードのマシンコード生成は比較的簡単なので、新しいアーキテクチャへのサポートが容易です。ABCマシンは命令型の抽象グラフ書き換えマシンです。[ 13 ]書き換え中のCleanグラフを保持するグラフストアと3つのスタックで構成されています。
- A(引数)スタックは、グラフストア内のノードを参照する引数を保持します
- B(基本値)スタックは基本値(整数、文字、実数など)を保持します。これらの値はグラフストアのノードになることもありますが、効率化のため別のスタックが使用されます。
- C(制御)スタックはフロー制御用の戻りアドレスを保持します。
すべての実行ファイルにリンクされているランタイムシステムは、Startグラフストアにノードを構築し、Aスタックにプッシュします。その後、必要に応じて評価しながら出力を開始します。
ブラウザでCleanを実行する
[編集]Cleanは通常、ネイティブ実行ファイルを生成するために使用されますが、いくつかのプロジェクトではWebブラウザでアプリケーションを実行できるようにしています。現在は中止されているSAPLプロジェクトは、Core CleanをJavaScriptにコンパイルし、ABCコードを使用していませんでした。2019年以降、 WebAssemblyで記述されたABCコードのインタープリターが代わりに使用されています。[ 14 ] [ 15 ]
プラットフォーム
[編集]Cleanは、Microsoft Windows ( IA-32およびX86-64 )、macOS ( X86-64 )、Linux ( IA-32、X86-64、AArch64 )で利用できます。[要出典]
一部のライブラリは、Windowsでのみ利用可能なObjectIOなど、すべてのプラットフォームで利用できるわけではありません。また、ダイナミクスをファイルに書き込む機能もWindowsでのみ利用可能です。[要出典]
Cleanのプラットフォームごとの可用性は、バージョンによって異なります。[ 16 ] [ 17 ]
| バージョン | 日付 | Linux | macOS | Oracle Solaris | Windows | その他 | |||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| IA-32 | x86-64 | AArch64 | Motorola 68040 | PowerPC | x86-64 | SPARC | IA-32 | x86-64 | |||
| 3.1 | 2022年1月5日 | はい | はい | はい | いいえ | いいえ | はい | いいえ | はい | はい | |
| 3.0 | 2018年10月2日 | はい | はい | いいえ | いいえ | いいえ | はい | いいえ | はい | はい | |
| 2.4 | 2011年12月23日 | はい | はい | いいえ | いいえ | いいえ | はい | いいえ | はい | はい | |
| 2.3 | 2010年12月22日 | はい | はい | いいえ | いいえ | いいえ | いいえ | いいえ | はい | はい | |
| 2.2 | 2006年12月19日 | はい | はい | いいえ | いいえ | はい | いいえ | はい | はい | はい | |
| 2.1.1 | 2005年5月31日 | はい | いいえ | いいえ | いいえ | はい | いいえ | はい | はい | いいえ | |
| 2.1.0 | 2003年10月31日 | はい | いいえ | いいえ | いいえ | はい | いいえ | はい | はい | いいえ | |
| 2.0.2 | 2002年12月12日 | はい | いいえ | いいえ | いいえ | はい | いいえ | はい | はい | いいえ | |
| 2.0.1 | 2002年7月4日 | はい | いいえ | いいえ | いいえ | はい | いいえ | はい | はい | いいえ | |
| 2.0 | 2001年12月21日 | いいえ | いいえ | いいえ | いいえ | いいえ | いいえ | いいえ | はい | いいえ | |
| 1.3.3 | 2000年9月13日 | はい | いいえ | いいえ | いいえ | はい | いいえ | はい | はい | いいえ | |
| 1.3.2 | 1999年7月1日 | いいえ | いいえ | いいえ | はい | はい | いいえ | はい | はい | いいえ | |
| 1.3.1 | 1999年1月 | はい | いいえ | いいえ | いいえ | はい | いいえ | はい | はい | いいえ | |
| 1.3 | 1998年5月22日 | はい | いいえ | いいえ | いいえ | はい | いいえ | はい | はい | いいえ | |
| 1.2.4 | 1997年6月 | いいえ | いいえ | いいえ | はい | はい | いいえ | いいえ | はい | いいえ | |
| 1.2.3 | 1997年5月 | いいえ | いいえ | いいえ | はい | はい | いいえ | いいえ | はい | いいえ | |
| 1.2 | 1997年1月13日 | いいえ | いいえ | いいえ | はい | はい | いいえ | いいえ | いいえ | いいえ | |
| 1.1.3 | 1996年10月 | いいえ | いいえ | いいえ | いいえ | いいえ | いいえ | はい | いいえ | いいえ | OS/2 ( i80386 ) |
| 1.1.2 | 1996年9月 | はい | いいえ | いいえ | いいえ | いいえ | いいえ | はい | いいえ | いいえ | SunOS 4 ( SPARC ) |
| 1.1 | 1996年3月 | はい | いいえ | いいえ | はい | いいえ | いいえ | いいえ | いいえ | いいえ | |
| 1.0.2 | 1995年9月 | はい | いいえ | いいえ | はい | いいえ | いいえ | はい | いいえ | いいえ | OS/2 ( i80386 ); SunOS 4 ( SPARC ) |
| 1.0 | 1995年5月 | いいえ | いいえ | いいえ | はい | いいえ | いいえ | いいえ | いいえ | いいえ | OS/2 ( i80386 ) |
| 0.8.4 | 1993年5月11日 | はい | いいえ | いいえ | はい | いいえ | いいえ | いいえ | いいえ | いいえ | 実験的なT800トランスピュータのリリース |
| 0.8.3 | 1993年2月26日 | いいえ | いいえ | いいえ | はい | いいえ | いいえ | いいえ | いいえ | いいえ | |
| 0.8.1 | 1992年10月19日 | いいえ | いいえ | いいえ | はい | いいえ | いいえ | いいえ | いいえ | いいえ | |
| 0.8 | 1992年7月13日 | いいえ | いいえ | いいえ | はい | いいえ | いいえ | いいえ | いいえ | いいえ | OS/2 ( i80386 ); SunOS 3–4 ( SPARC ) |
| 0.7 | 1991年5月 | いいえ | いいえ | いいえ | はい | いいえ | いいえ | いいえ | いいえ | いいえ | SunOS 3–4 ( SPARC ) |
Haskellとの比較
[編集]Cleanの構文はHaskellと非常に似ていますが、いくつか顕著な違いがあります。一般的に、HaskellはCleanよりも多くの糖衣構文を導入しています。[ 10 ]
| Haskell | Clean | 備考 |
|---|---|---|
[ x | x <- [ 1 .. 10 ] , isOdd x ]
|
[ x \\ x <- [ 1 .. 10 ] | isOdd x ]
|
リスト内包表記 |
x : xs
|
[ x : xs ]
|
cons演算子 |
データTree a = Empty | Node ( Tree a ) a ( Tree a )
|
:: Tree a = Empty | Node ( Tree a ) a ( Tree a )
|
代数的データ型 |
( Eq a , Eq b ) => ...
|
... | Eq a & Eq b
|
クラスアサーションとコンテキスト |
fun t @ ( Node l x r ) = ...
|
fun t =: ( Node l x r ) = ...
|
as-patterns |
if x > 10 then 10 else x
|
if ( x > 10 ) 10 x
|
if |
参考文献
[編集]- ^ 「Download Clean」 . Clean . 2019年7月23日閲覧。
- ^ 「Idris - Uniqueness Types」 . 2018年11月20日閲覧。
- ^ 「Clean 0.7: Readme」 . 2019年5月24日時点のオリジナルからのアーカイブ
- ^ 「Clean 1.0: Readme」 。 2019年5月5日時点のオリジナルよりアーカイブ。
- ^ 「Clean 1.3: Readme」 。 2019年4月27日時点のオリジナルよりアーカイブ。
- ^ 「ナイメーヘン・ラートバウド大学:ソフトウェア科学科:ソフトウェア」。
- ^ 「FAQ」。Clean 。2021年11月26日閲覧
- ^ 「出版物」 . Clean . 2021年11月26日閲覧。
- ^ 「ホーム」 . TOP Software Technology . 2021年11月26日閲覧。
- ^ a b 「FTPリンク」(PDF) . ftp.cs.ru.nl(FTP). [デッドFTPリンク] (ドキュメントを表示するには、ヘルプ:FTPを参照してください)
- ^ 「どのプログラミング言語が最速か?」 . Computer Language Benchmarks Game . 2011年6月28日時点のオリジナルからのアーカイブ。
{{cite web}}:CS1 maint: bot: 元のURLの状態不明 (リンク) - ^ Jansen, Jan Martin; Koopman, Pieter; Plasmeijer, Rinus (2008). 「From Interpretation to Compilation」(PDF) . FTPサーバー(FTP). 2016年5月21日閲覧 [デッドFTPリンク] (ドキュメントを表示するには、ヘルプ:FTPを参照してください)
- ^ Koopman, Pieter (1990年12月10日).実行可能仕様としての関数型プログラム(PhD). ナイメーヘン・カトリック大学. p. 35. ISBN 90-9003689-X.
- ^ 「CleanとiTasks / ABCインタープリター · GitLab」 . CleanとiTasks on GitLab . 2023年4月13日閲覧.
- ^ Staps, Camil; van Groningen, John; Plasmeijer, Rinus (2021年7月15日). 「サンドボックスと分散システムのためのコンパイル済みコードとインタープリタコードの遅延インターワーキング」.第31回関数型言語の実装と応用に関するシンポジウムの議事録. pp. 1– 12. doi : 10.1145/3412932.3412941 . ISBN 9781450375627. S2CID 202751977.
- ^ 「リリース履歴」 . Clean . 2022年1月7日閲覧。
- ^ 「/Cleanのインデックス」. 2022年1月7日閲覧。
外部リンク
[編集]- Clean Wiki
- clean-lang.org:Cleanパッケージの公開レジストリ
- cloogle.org:Cleanパッケージを検索するための検索エンジン