クリーン
パラダイム関数型
設計ナイメーヘン・ラートバウド大学ソフトウェア技術研究グループ
初出1987年; 38年前 ( 1987 )
安定版リリース
3.1 / 2022年1月5日; 3年前 ( 2022-01-05 )
型付け規律強力静的動的
OSクロスプラットフォーム
ライセンス簡易BSD [ 1 ]
ファイル名拡張子.icl、.dcl、.abc
ウェブサイトclean .cs .ru .nl
影響を受けたもの
LeanMirandaHaskell
影響を受けたもの
HaskellIdris [ 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)が含まれています。

[編集]

Hello world

 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からマシンコードへのコンパイルは、次のように行われます。

  1. ソースファイル(.icl)と定義ファイル(.dcl)は、Cleanで書かれたコンパイラフロントエンドによって、Cleanの基本バージョンであるCore Cleanに変換されます。
  2. Core Cleanは、CleanとCで書かれたコンパイラバックエンドによって、Cleanのプラットフォームに依存しない中間言語(.abc)に変換されます
  3. 中間ABCコードは、 Cで書かれたコードジェネレータによってオブジェクトコード(.o)に変換されます
  4. オブジェクトコードは、モジュールおよびランタイムシステム内の他のファイルとリンクされ、システムリンカー(使用可能な場合)または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-32X86-64AArch64 )で利用できます。[要出典]

一部のライブラリは、Windowsでのみ利用可能なObjectIOなど、すべてのプラットフォームで利用できるわけではありません。また、ダイナミクスをファイルに書き込む機能もWindowsでのみ利用可能です。[要出典]

Cleanのプラットフォームごとの可用性は、バージョンによって異なります。[ 16 ] [ 17 ]

バージョン日付LinuxmacOSOracle SolarisWindowsその他
IA-32x86-64AArch64Motorola 68040PowerPCx86-64SPARCIA-32x86-64
3.12022年1月5日はいはいはいいいえいいえはいいいえはいはい
3.02018年10月2日はいはいいいえいいえいいえはいいいえはいはい
2.42011年12月23日はいはいいいえいいえいいえはいいいえはいはい
2.32010年12月22日はいはいいいえいいえいいえいいえいいえはいはい
2.22006年12月19日はいはいいいえいいえはいいいえはいはいはい
2.1.12005年5月31日はいいいえいいえいいえはいいいえはいはいいいえ
2.1.02003年10月31日はいいいえいいえいいえはいいいえはいはいいいえ
2.0.22002年12月12日はいいいえいいえいいえはいいいえはいはいいいえ
2.0.12002年7月4日はいいいえいいえいいえはいいいえはいはいいいえ
2.02001年12月21日いいえいいえいいえいいえいいえいいえいいえはいいいえ
1.3.32000年9月13日はいいいえいいえいいえはいいいえはいはいいいえ
1.3.21999年7月1日いいえいいえいいえはいはいいいえはいはいいいえ
1.3.11999年1月はいいいえいいえいいえはいいいえはいはいいいえ
1.31998年5月22日はいいいえいいえいいえはいいいえはいはいいいえ
1.2.41997年6月いいえいいえいいえはいはいいいえいいえはいいいえ
1.2.31997年5月いいえいいえいいえはいはいいいえいいえはいいいえ
1.21997年1月13日いいえいいえいいえはいはいいいえいいえいいえいいえ
1.1.31996年10月いいえいいえいいえいいえいいえいいえはいいいえいいえOS/2 ( i80386 )
1.1.21996年9月はいいいえいいえいいえいいえいいえはいいいえいいえSunOS 4 ( SPARC )
1.11996年3月はいいいえいいえはいいいえいいえいいえいいえいいえ
1.0.21995年9月はいいいえいいえはいいいえいいえはいいいえいいえOS/2 ( i80386 ); SunOS 4 ( SPARC )
1.01995年5月いいえいいえいいえはいいいえいいえいいえいいえいいえOS/2 ( i80386 )
0.8.41993年5月11日はいいいえいいえはいいいえいいえいいえいいえいいえ実験的なT800トランスピュータのリリース
0.8.31993年2月26日いいえいいえいいえはいいいえいいえいいえいいえいいえ
0.8.11992年10月19日いいえいいえいいえはいいいえいいえいいえいいえいいえ
0.81992年7月13日いいえいいえいいえはいいいえいいえいいえいいえいいえOS/2 ( i80386 ); SunOS 3–4 ( SPARC )
0.71991年5月いいえいいえいいえはいいいえいいえいいえいいえいいえSunOS 3–4 ( SPARC )

Haskellとの比較

[編集]

Cleanの構文はHaskellと非常に似ていますが、いくつか顕著な違いがあります。一般的に、HaskellはCleanよりも多くの糖衣構文を導入しています。[ 10 ]

HaskellClean備考
[ 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

参考文献

[編集]
  1. ^ 「Download Clean」 . Clean . 2019年7月23日閲覧
  2. ^ 「Idris - Uniqueness Types」 . 2018年11月20日閲覧
  3. ^ 「Clean 0.7: Readme」 . 2019年5月24日時点のオリジナルからのアーカイブ
  4. ^ 「Clean 1.0: Readme」 。 2019年5月5日時点のオリジナルよりアーカイブ。
  5. ^ 「Clean 1.3: Readme」 。 2019年4月27日時点のオリジナルよりアーカイブ。
  6. ^ 「ナイメーヘン・ラートバウド大学:ソフトウェア科学科:ソフトウェア」
  7. ^ 「FAQ」。Clean 2021年11月26日閲覧
  8. ^ 「出版物」 . Clean . 2021年11月26日閲覧
  9. ^ 「ホーム」 . TOP Software Technology . 2021年11月26日閲覧
  10. ^ a b 「FTPリンク」(PDF) . ftp.cs.ru.nlFTP). [デッドFTPリンク] (ドキュメントを表示するには、ヘルプ:FTPを参照してください)
  11. ^ 「どのプログラミング言語が最速か?」 . Computer Language Benchmarks Game . 2011年6月28日時点のオリジナルからのアーカイブ。{{cite web}}:CS1 maint: bot: 元のURLの状態不明 (リンク)
  12. ^ Jansen, Jan Martin; Koopman, Pieter; Plasmeijer, Rinus (2008). 「From Interpretation to Compilation」(PDF) . FTPサーバーFTP. 2016年5月21日閲覧 [デッドFTPリンク] (ドキュメントを表示するには、ヘルプ:FTPを参照してください)
  13. ^ Koopman, Pieter (1990年12月10日).実行可能仕様としての関数型プログラム(PhD). ナイメーヘン・カトリック大学. p. 35. ISBN 90-9003689-X.
  14. ^ 「CleanとiTasks / ABCインタープリター · GitLab」 . CleanとiTasks on GitLab . 2023年4月13日閲覧.
  15. ^ Staps, Camil; van Groningen, John; Plasmeijer, Rinus (2021年7月15日). 「サンドボックスと分散システムのためのコンパイル済みコードとインタープリタコードの遅延インターワーキング」.第31回関数型言語の実装と応用に関するシンポジウムの議事録. pp.  1– 12. doi : 10.1145/3412932.3412941 . ISBN 9781450375627. S2CID  202751977.
  16. ^ リリース履歴」 . Clean . 2022年1月7日閲覧。
  17. ^ 「/Cleanのインデックス」. 2022年1月7日閲覧。
[編集]