smalltalk では、世界の状態を画像ファイルに保存できます。これは、Smalltalk 自体を「シリアル化」する機能、つまり、オブジェクトが独自のソース コードを生成できることに関係していると思います。
1) これは正確な理解ですか?
2) この機能を現代の言語 (明らかに非 Lisp) に追加する際の課題は何ですか?
3) 「シリアル化」は正しい言葉ですか? 正しい専門用語は何ですか?
smalltalk では、世界の状態を画像ファイルに保存できます。これは、Smalltalk 自体を「シリアル化」する機能、つまり、オブジェクトが独自のソース コードを生成できることに関係していると思います。
1) これは正確な理解ですか?
2) この機能を現代の言語 (明らかに非 Lisp) に追加する際の課題は何ですか?
3) 「シリアル化」は正しい言葉ですか? 正しい専門用語は何ですか?
「シリアル化」よりもはるかに簡単です。Smalltalk イメージは、オブジェクト メモリの単なるスナップショットです。RAM の内容全体 (ガベージ コレクション後) を取得し、ファイルにダンプします。起動時に、そのスナップショットをディスクから RAM にロードし、中断したところから処理を続行します。スナップショットや再開時に特別なアクションを実行するためのフックがいくつかありますが、基本的にはこのように動作します。
(追加: 他の環境と比較して非常にシンプルにする重要な設計上の選択については、以下の Lukas Renggli のコメントを参照してください)
Bert Freudenbergの優れた回答を拡張します。
1) これ (つまり、オブジェクトが独自のソース コードをシリアル化する機能) は正確に理解されていますか?
いいえ。Bert が指摘したように、Smalltalk イメージは単なるメモリ スナップショットです。Smalltalk オブジェクトと Smalltalk プログラムの唯一の信頼できる情報源は、それらのメモリ表現です。これは、プログラムがテキスト ファイルとして表現される他の言語との大きな違いです。
2) この機能を現代の言語 (明らかに非 Lisp) に追加する際の課題は何ですか?
技術的には、メモリ スナップショットからアプリケーションをブートストラップすることは、ほとんどの言語で可能です。私が間違っていなければ、このアプローチを使用して Java アプリケーションの起動時間を短縮するソリューションがあります。ただし、正規のメモリ表現に同意する必要があり、プログラムの再起動時にネイティブ リソースを再初期化するように注意する必要があります。たとえば、Smalltalk では、開いているファイルとネットワーク接続が再度開かれます。また、数値のエンディアンを修正するスタートアップ フックもあります。
3) 「シリアル化」は正しい言葉ですか? 正しい専門用語は何ですか?
冬眠は用語です。
決定的な違いは、Smalltalk が Program を単なるオブジェクトの集まりとして扱うことです。そして、IDE はそれらのオブジェクトを編集するエディターの集まりにすぎないため、画像を保存して読み込むと、中断したときと同じようにすべてのコードがそこにあります。
他の言語では可能かもしれませんが、リフレクションの量によっては、さらに手間がかかると思います。他のほとんどの言語では、リフレクションはアドオンとして、または後付けでさえありますが、Smalltalk ではシステムの中心にあります。
これは、コンピューターをスリープ状態にしたときにすでに発生していますよね? カーネルは実行中のプログラムをディスクに書き込み、後で再度ロードしますか? おそらく、カーネルは実行中のプログラムをネットワーク経由で新しいマシンに移動できますが、反対側に同じアーキテクチャがあると仮定しますか? Java は、JVM のおかげですべてのオブジェクトをシリアライズできますよね? 多分ハードルは、さまざまなメモリレイアウトを暗示するアーキテクチャにあるのでしょうか?
編集:しかし、プログラム自体からこの機能を使用することに興味があると思います。したがって、Python/Ruby インタープリターと stdlib に機能を実装し、別のハードウェア アーキテクチャに移行できるようにしたい場合は、ある種の仮想マシンを用意するだけの問題だと思います。