純粋関数型システム言語Cargryを開発しています
Cargryの仕様を決めていくにつれ、定義すべき言葉も増え、一度整理してみようと思い、この記事に用語集としてまとめました
Cargryを知らない方は過去の記事をご覧ください
https://qiita.com/compalog/items/47b35d2e4ebe102f81d2
用語
Cargryの用語です
Cargry
言語そのもの。基本的に「カルグライ」と呼ぶが、綴りから読めると判断できる呼び方であれば良い
CRM
「Cargry Resource Management Rules」の略。Cargryのメモリ管理ルール。管理モデルは「独占モデル」
CrIR
「Cargry Intermediate Representation」のこと。基本的に「クリア」や「クライア」と呼ぶが、綴りから読めると判断できる呼び方であれば良い。ソースコードからCranelift / LLVMへ変換する途中の中間表現
Lewekk
Cargryの字句解析器のコードネーム
Popdack
Cargryの構文解析器のコードネーム
Actoa
Cargryの型推論器のコードネーム
純粋スコープ
関数が純粋関数である時、その関数のスコープを「純粋スコープ」という
副作用スコープ
副作用ハンドラ内の、関数のスコープを「副作用スコープ」という
値
メモリ上に配置された実体のこと。構造体によって定義される
参照
特定の値を指し示すこと、またその変数
独占
変数を宣言、及び束縛後のコードで、その値や参照が他の変数にも束縛されない状態のこと
独占者
値を独占している変数のこと
嫌われ者
その値の参照が存在しない独占者、または値のこと。必ず、一時的な値は嫌われ者となり、変数は独占者になる時と、嫌われ者になる時が交互に現れる
インドア派 / アウトドア派
構造体の種別を表す
インドア派
スコープの返り値にできない構造体のこと。「-の構造体」と言う。構造体名の終端に感嘆符!が要求される。フィールドに参照をもつ構造体
アウトドア派
スコープの返り値にできる構造体のこと。「-の構造体」と言う。すべてのフィールドが値である構造体
破棄
メモリを解放すること
DIP
「Drop In Pure」の略。Cargryの最適化に関わる。純粋スコープの終端で、指定した引数を破棄する仕組み。CRMでは、値が破棄される位置はスコープの終端だが、DIPにより早期の破棄が可能である
SIE
「Swap In Effect」の略。Cargryの最適化に関わる。副作用スコープ内で、指定した引数を用いての再代入を許可する仕組み
消失者
SIEによって、使用できなくなる嫌われ者のこと
感嘆符!呼び出し
ある関数をDIP / SIE最適化で呼び出すこと。最適化される関数のみ可能である
ルールの定義
CRM、DIP、SIEについての定義
CRM
- あるスコープにおいて、変数は値、または参照を独占する
- 値が破棄されるまで、その値の参照をとることができる
- 値が作られたスコープの終端で、その値が破棄される
- 関数の引数は必ず参照で、返り値はアウトドア派の構造体の値のみである
DIP
- ある関数が、感嘆符呼び出しされること
- 関数のDIP / SIE最適化が適用される引数には、嫌われ者が渡されていなければならない
- 関数呼び出し側のスコープ内で、関数呼び出し後、嫌われ者が一度も使われていないこと
SIE
- ある関数が、副作用として感嘆符呼び出しされること
- 関数のDIP / SIE最適化が適用される引数には、嫌われ者または消失者が渡されていなければならない
- 関数呼び出し側のスコープで、関数呼び出し後、消失者が一度も使われていないこと
終わりに
最後まで読んでくださり、ありがとうございました。少しでもCargryの世界を理解していただけたら幸いです