Golang でプログラミング言語を作る__Part19
前回まで、各タイプのASTノードに対して、評価機能(その値の意味付け)を行っていきました。
次の例を見ていきます。下のコードを走らせた時に、処理はどのように流れていくか確認していきます。
let counter = fn(x) {
if (x > 100) {
return true; } else {
let foobar = 9999;
counter(x + 1);
}
};
counter(0);counterが最後にtrueを返すまでに、再帰的に101回counterは呼ばれています。
counterを呼ぶ度に、使われない変数foobarも入れて、何回もオブジェクトのインスタンス化が起こります。
結果、counterを呼び出すたびに、インタープリタプロセスのメモリ使用量は、最終的にメモリ不足になります。そして、オペレーティングシステムがそれを強制終了するまで上昇することになります。
しかし、上記のスニペットを実行している間にメモリ使用量を監視すると、着実に上昇せず、決して下がらないことがわかります。代わりに、それは増減します。
何故なら、GC(Go’s garbage collector)が、どのオブジェクトが到達可能であり、どのオブジェクトが到達可能でないかを追跡しているからです。
オブジェクトが到達可能でないことに気付くと、GCはオブジェクトのメモリを再び利用可能にします。
つまり、今回の例では、1から100までのIntegerLiteralと、100回分のfoobarなどが到達不能なオブジェクトとなります。また、その際に生み出される環境(Environment)も不達のオブジェクトなります。
これらの到達不能なオブジェクトは役に立たず、メモリを占有します。
そのため、GCはそれらを収集し、使用したメモリを解放します。
以上がGC(Go’s garbage collector)の機能の説明になります。
次回は、より多くのデータ型と関数を追加することによって、より機能的な言語に拡張してきます。
