関数型システムプログラミング言語のCargryを開発しています
3つの規則の内、LMBU規則は廃止しています
3つの規則
Cargryは現時点で、以下の規則を持っています
CRM規則
これは、Cargry Resource Management Ruleの略で、その名の通りCargryのリソース管理に関する規則です
もっとも基本的な規則は以下の3つです
- あるスコープにおいて、変数は値を独占する
- 参照はスコープ内かつ、値の存在している間だけである
- スコープの終端で値は解放される
FBIP規則
これは、KokaのFBIPのCargry版で、Functional But In-Place Ruleの略です
基本的な規則は以下です
- 値の参照が存在しないなら、その値は破棄可能である
FBIPは文法で明示して登場し、他2つより規則の数は少ないため、わかりやすいです
LMBU規則
勝手に、「ラミュー規則」と呼んでいるこれは、Local Mutable Before Using Ruleの略で、これも名前の通り、変数の使用前、その上非常に短い間だけ再代入などの可変操作を行うことを許可する規則です1
LMBU規則はCRM規則に依存します
基本的な規則は以下です
- 可変操作を行う関数(演算子も含む)は値に対してのみ作用させられ、参照には作用させられない
- 値そのままで使うことはできず、参照をとって使う
- 値の参照をとった時点で、それ以降そのスコープでは、コピーしない限り値に対して可変操作を作用させることはできない
例外として、軽量で常にコピーされることが保証されている型は値そのものも使うことができます
Cargryは関数型言語ながら、システムプログラミング言語として存在し耐えるために、以上の規則を持っています
Cargry replaces Rust?
CargryはCargryの設計思想と、3つの規則によって、メモリ安全性、並行・並列安全性を目指しています。複雑な借用規則、ライフタイムが無く、Rustよりそこまで難しくなさそうです
だからと言って、「CargryはC/C++、Rustまでも置き換える新しい言語」「CargryはRustより簡単で、同じ安全性を得られる」と主張するのは、間違いです
Cargryは意外と「Rustではこう書ける」が書けなかったり、「ああ実装したい」が普通には実装できなかったりできます。なにより、Cargryでは厳しい制約下でプログラムを書くことを常に要求されます
どちらが優れているかを決めるのは適切ではありません
Cargryの考え方
Cargryの考え方の一つに
「Cargryは他の言語を蹴落とさない。むしろ他の言語を推す」
というのがあります
つまり、「長所と短所を認め、場面によって適切な言語を使うことをすすめる」ということです。Cargryと他の言語とを比較することは、Cargryは嫌うのです
終わりに
Cargryは、「実装を他のクレートに依存させたくない」という理由で、使うクレートは最小限で、ほとんどフルスクラッチです2
また何か進展があれば、お伝えします