見出し画像

🛠️サンクと遅延評価 call-by-nameとメモ化 Redux STG (Spineless Tagless G-machine, G-machine は Graph reduction machine 

コンピュータプログラミングにおいて、サンクとは、ある計算を他のサブルーチンに注入するために使用するサブルーチンのことです。

サンクは主に、計算結果が必要になるまで計算を遅らせたり、他のサブルーチンの先頭や末尾に演算を挿入するために使用されます。その他にも、コンパイラのコード生成やモジュール化プログラミングなど、多くの用途がある。
この用語は、動詞thinkの気まぐれな不規則形が起源である。ALGOL 60コンパイラでサンクを使用する際、どのようなルーチンを生成するかを決定するために特別な分析(思考=サンク)が必要であったことに由来している。

https://en.wikipedia.org/wiki/Thunk

サンクという言葉は、Algol 60のコール・バイ・ネームの実装について議論していた非公式なワーキンググループによって考案された。彼らは、式の解析(「考える」こと)のほとんどはコンパイル時に行うことができ、したがって実行時には式はすでに「サンク」されているだろうと観察しました(Ingermanら、1960年)。

https://en.wikipedia.org/wiki/Thunk

遅延させた引数は評価されず、サンクというオブジェクトに変換される1。サンクには、引数の値が必要なときに、あたかも適用時に評価されていたかのように、その値を生成するために必要な情報が含まれていなければならない。したがって,サンクには,引数式と関数アプリケーションが評価されている環境が含まれていなければならない

一般に,サンクはその値が必要とされるときだけ強制される。サンクの値を使う原始関数に渡されるとき,条件式の述語の値であるとき,関数として適用されようとしている関数式の値であるときである。私たちが利用できる設計上の選択の1つは、セクション3.5.1のストリームに対する最適化と同様に、サンクをメモ化するかしないかとなる。メモ化によって、サンクが最初に強制されたとき、計算された値を保存しておき、それ以降の強制では、計算を繰り返すことなく、単に保存された値を返すことができる。

関数型プログラミング言語では、プログラマが明示的にサンクを生成することもできるようになった。これは、ソースコードの中で、引数式をそれ自身のパラメータを持たない無名関数で包むことで実現される。これにより、受け取った関数が無名関数を呼び出すまで式は評価されず、call-by-nameと同じ効果を得ることができる

https://en.wikipedia.org/wiki/Thunk

相互運用性サンクに関する文献の多くは、MS-DOS、OS/2[10] Windows[11][12][13][14] および .NET を含むさまざまな Wintel プラットフォームと、16 ビットから 32 ビットへのメモリアドレスの移行に関連している。顧客があるプラットフォームから別のプラットフォームへ移行する際、Thunkは古いプラットフォーム向けに書かれたレガシーソフトウェアをサポートするために不可欠なものでした

サンクは、まだ評価されていない値である。遅延評価によって非厳密なセマンティクスを実装する Haskell システムで使われる。遅延ランタイムシステムは、必要でない限りサンクを評価しない。式はグラフに変換され、STG (Spineless Tagless G-machine, G-machine は Graph reduction machine の略) がそれを縮小し、評価されないで不要なthunkは捨てられる。

https://wiki.haskell.org/Thunk

Thunks を使うと、UI レイヤーとは別に Redux 関連のロジックを追加で書くことができます。このロジックには、非同期リクエストやランダムな値の生成などの副作用や、複数のアクションのディスパッチやReduxストアの状態へのアクセスを必要とするロジックが含まれることがあります。

https://redux.js.org/usage/writing-logic-thunks

いいなと思ったら応援しよう!

あたり帳簿
お願い致します