大きなプログラムを組む(4)
2021/07/04
|
[Prev]
[Next]
[Top]
,
Perl
[Prev]
[Next]
,
[Perl Top]
|
メモリ管理とリファレンスカウント
- 前回及び前々回レポートにて、Perlのリストとハッシュはメモリ確保や解放を自動で行ってくれることを説明しました。
- さて、このメモリ管理ですが、Perlに限らず様々なプログラム言語においてメモリ管理とは下記を指します。
- 必要なメモリの確保
- 確保したメモリの使用
- 使用終了したメモリの解放
- "必要なメモリの確保"と"確保したメモリの使用"は、プログラマが意識して変数やオブジェクトを使っているので、メモリ確保は言語のコンパイラ/インタープリタ側で比較的簡単にやってくれます。
- 少しわかりにくいのが"使用終了したメモリの解放"です。"使用終了"という判断をどうしているかですが、Perlは"リファレンスカウント(Reference Count)"と呼ばれる方法でメモリ解放を自動化(*1)しています。
オブジェクトの有効範囲
では改めてリファレンスカウント
- "use strict;"を適用することで、大抵の場合オブジェクトはローカルになりました。この状況で"ある程度大きなオブジェクトの中身"を他のスコープへ渡すにはリファレンスを経由することになります。大きなプログラムで扱うデータは構造化されているので、その面から考えてもリファレンスの使用は必須になります。
- リファレンスを使用して他のスコープに値を"参照渡し"する場合、プログラマが"意図"をもって関数への引数としてリファレンスを記述します。
- このリファレンスは、構造化されたコーディングでは様々な関数やクラスオブジェクトから呼び出されていくわけですが、Perl側でそのリファレンスの参照数をカウントしており、その値が0になったとき、該当オブジェクトは役目を終了したとしてメモリ解放を自動で行ってくれます。
- つまり"use strict;"でローカルオブジェクト使用を強制し、そのオブジェクトをリファレンス経由で扱うと、メモリの使用/解放をプログラマが意図的にコントロールできるようになるわけです。
- またメモリ管理、特に解放の仕組みを理解していれば、メモリリーク(メモリが解放されずに積み上がる状況)が起きたときでも「どこかリファレンスが残っている?」という観点で問題を調べることができます。例えば循環参照とかですね。
Perlではリファレンスの理解が必須
- ここまでPerlのリファレンスについて説明してきましたが、その重要性を理解いただけたでしょうか。プログラミングの自由度が一気に上がるはずです。
- Perlではリファレンスを使用したデータ構造化の自由度が非常に高いため、ハッシュとリストを自分の都合に合わせて組み合わせたオブジェクトを容易に作成することができます。
- またメモリ解放の仕組みがリファレンスカウントのため、リファレンスを経由した構造化データのハンドリングは、メモリ管理も暗黙で行っていることになります。
- ここまでが参照/リファレンスに関する説明でした。次回は文字データの処理に便利な正規表現に話を移したいと思います。
|
Notes
- 使用終了したデータを自動的に開放する仕組みを一般にガベージコレクション(Garbage Collection)と呼びます。リファレンスカウントは実現手段の一つになります。
- でも明確な手抜き目的以外にグローバルオブジェクトを使うのであれば、コードの再検討を勧めます。
|
|
[Prev]
[Next]
[Top]
,
Perl
[Prev]
[Next]
,
[Perl Top]
|