翻訳|はメモリ管理-第一部(全部で三部)を理解しています.
2323 ワード
マシンの中のメモリを箱のように見てもいいです.オフィスの中のメールボックスや子供用の収納箱のようです.
他の子供のために残したいものがあれば、箱に入れてもいいです.
各箱のそばに数字があります.これらの数字はメモリの住所です.他の人にどこであなたが残したものを見つけたらいいですか?
これらの箱の中のどれも同じサイズを持っていて、一定量の情報を入れることができます.箱のサイズは機械によって決まります.この大きさを長字といいます.これは通常32ビットまたは64ビットです.でも、表示が便利なために、ここでは8桁の字を使っています.
もし私たちが数字2をその中の一つの箱に入れたいなら、私たちはそれを簡単に行うことができます.数字はバイナリに変換しやすいです.
もし私たちが欲しいものが数字でないとどうすればいいですか?たとえばアルファベットH
これらのものの代わりに、UTF-8のようなコードが必要です.これらを数字に変換するためには、エンコーダリングのようなツールが必要です.その後は保存できます.
箱から取り出したい時は、デコーダを通してHに変換しなければなりません.
自動メモリ管理
JavaScriptを使用している場合、メモリを考慮する必要はありません.メモリは抽象的に出てきて、直接にそれに接触することはできません.
代わりにJSエンジンを仲介してメモリを管理します.
例えば、あるJSコードは変数を作成するために使われています.(このJSコードがReactを使用していると仮定して).
JSエンジンはエンコーダを利用してこの値をバイナリに変換します.
メモリの中にこのバイナリを収容できる空間を見つけます.このプロセスを割り当てメモリといいます.
その後、エンジンは変数がプログラムのどこからでもアクセスできるかを追跡します.この変数が再アクセスできない場合、JSエンジンは回収されたメモリに新しい値を保存することができます.
このようなメモリ内で変数(文字列、オブジェクトまたは他のタイプ)を監視し、使用しない変数によって占有されているメモリを削除するプロセスをゴミ回収といいます.
JavaScriptのようにメモリを直接処理しない言語をメモリ管理言語といいます.
この自動メモリ管理は開発者を楽にすることができます.しかし、いくつかのオーバーヘッドも増加し、このオーバーヘッドは、性能を予測できない場合がある.
手動メモリ管理
自動的にメモリを管理する言語と比べて、手動でメモリを管理する言語は少し違っています.例えば、ReactがどのようにC言語でメモリに書き込むかを見てみましょう.
C言語にはJavaScriptのメモリ上の抽象層がありません.直接メモリ上で実行します.メモリから荷物をロードしてもいいし、内容をメモリに保存してもいいです.
C言語または他の言語をWebAsssembleにコンパイルすると、使用するツールはWebAsssembleに補助コードを追加します.例えば、バイトをエンコードしてデコードするためのコードが追加されます.これらのコードを実行環境と呼びます.運行環境はJSエンジンのやるべきことを処理します.
ただし、手動で管理する言語については、ゴミの回収は含まれません.
これはあなたが完全に自分で処理するという意味ではありません.手動メモリで管理されている言語でも、通常は言語の実行時に助けを得ることができます.例えば、C言語では、実行時にどのメモリアドレスを一枚のテーブルに記録することができますか?この表をアイドルリストといいます.
関数
malloc
(メモリ割り当ての簡略化)を使用して、データを格納できるメモリアドレスを申請することができます.これらの住所をアイドルリストから持って行きます.これらのデータを処理し終わったら、関数free
を呼び出して、malloc
の関数で申請されたメモリを解放してください.その後、これらのアドレスはアイドルリストに追加されます.これらの関数はいつ呼び出されるかを確認しなければなりません.これはなぜマニュアルメモリ管理と呼ばれるのですか?自分でメモリを管理しなければなりません.
開発者として、いつ違う部分のメモリをクリアするかを確認するのは難しいかもしれません.間違った時間に作業をすると、バグが発生したり、セキュリティ・ホールにつながる恐れがあります.そうしないとメモリが無くなります.
これはなぜ多くの現代語が自動メモリを使って管理されているかという原因です.しかし、これは性能を代価としています.次の文章でこの点をもっと説明します.
iKcampのオリジナル新書「モバイルWebフロントエンドの効率的な開発実戦」はアマゾン、京東ですでに発売されています.