Что дает Smalltalk возможность сохранять изображения и почему такие языки, как Ruby/Python, не могут сериализовать себя?

В smalltalk вы можете сохранить состояние мира в файл изображения. Я предполагаю, что это связано со способностью Smalltalk "сериализовать" себя, то есть объекты могут создавать свой собственный исходный код.

1) Это точное понимание?

2) В чем проблема добавить эту возможность в современные языки (очевидно, не шепелявые)?

3) Является ли «сериализация» правильным словом? Какой правильный жаргон?


person dave paola    schedule 16.11.2012    source источник


Ответы (4)


Это намного проще, чем "сериализация". Образ Smalltalk — это просто снимок памяти объекта. Он берет все содержимое ОЗУ (после сборки мусора) и выгружает его в файл. При запуске он загружает этот снимок с диска в ОЗУ и продолжает обработку с того места, где остановился. Есть несколько хуков для выполнения специальных действий со снимком и при возобновлении, но в основном это работает так.

(добавлено: см. комментарий Лукаса Ренггли ниже для важного выбора дизайна, который делает его таким простым по сравнению с другими средами)

person Vanessa Freudenberg    schedule 16.11.2012
comment
Обратите внимание, что это хорошо работает, потому что smalltalk работает на своей собственной виртуальной машине, поэтому он сам организует свое состояние памяти и управляет им. Если вы попытаетесь сделать это с помощью программы на языке C, не предназначенной для этого, в большинстве случаев это, вероятно, будет хорошо, но могут возникнуть краеугольные случаи. - person Marcin; 17.11.2012
comment
Моментальным снимкам помогает то, что состояние выполнения (например, процессы, кадры стека) является частью обычной объектной памяти. Это делает особенно простым создание моментальных снимков и возобновление выполнения кода. - person Lukas Renggli; 17.11.2012

Продолжая отличный ответ Берта Фройденберга.

1) Является ли это (т.е. способность объекта сериализовать свой собственный исходный код) точным пониманием?

Неа. Как заметил Берт, образ Smalltalk — это просто снимок памяти. Единственным источником достоверности как объектов Smalltalk, так и программ Smalltalk является их представление в памяти. Это огромная разница с другими языками, где программы представлены в виде текстовых файлов.

2) В чем проблема добавить эту возможность в современные языки (очевидно, не шепелявые)?

Технически загрузка приложения из моментального снимка памяти должна быть возможна для большинства языков. Если я не ошибаюсь, есть решения, использующие этот подход для ускорения запуска Java-приложений. Однако вам нужно будет согласиться с каноническим представлением памяти, и вам нужно будет позаботиться о повторной инициализации собственных ресурсов при перезапуске программы. Например, в Smalltalk повторно открываются открытые файлы и сетевое подключение. А также есть хук запуска, чтобы исправить порядок следования чисел.

3) Является ли «сериализация» правильным словом? Какой правильный жаргон?

Спящий режим – это термин.

person akuhn    schedule 17.11.2012
comment
Где я могу прочитать о том, как виртуальная машина Smalltalk может повторно открывать файлы и сетевые подключения? И что такое представление в памяти? Я нигде не вижу легко читаемых источников Smalltalk... большое спасибо. - person dave paola; 28.02.2013
comment
Загрузите изображение Pharo одним щелчком мыши с сайта pharo-project.org и просмотрите источники. Я не помню соответствующих сообщений макушки, но они должны быть найдены в классах файлов и соединений. - person akuhn; 28.02.2013

Принципиальное отличие состоит в том, что Smalltalk рассматривает программу как группу объектов. И IDE — это просто набор редакторов, редактирующих эти объекты, поэтому, когда вы сохраняете-загружаете изображение, весь ваш код остается там, где вы остановились.

Для других языков это можно было бы сделать, но я предполагаю, что будет больше возни, в зависимости от того, насколько много отражения. В большинстве других языков рефлексия является дополнением или даже второстепенной задачей, но в Smalltalk она лежит в основе системы.

person Davorin Ruševljan    schedule 19.11.2012

Это происходит уже в некотором роде, когда вы переводите свой компьютер в спящий режим, верно? Ядро записывает запущенные программы на диск и загружает их позже? Предположительно, ядро ​​​​может переместить работающую программу на новую машину по сети, предполагая ту же архитектуру на другом конце? Java может сериализовать все объекты также благодаря JVM, верно? Может быть, препятствием является просто архитектура, подразумевающая различные схемы памяти?

Изменить: Но я полагаю, что вы заинтересованы в использовании этой функции из самой программы. Поэтому я думаю, что это просто вопрос реализации этой функции в интерпретаторе Python/Ruby и стандартной библиотеке, а также наличие какой-то виртуальной машины, если вы хотите иметь возможность перейти на другую аппаратную архитектуру.

person David Stolarsky    schedule 16.11.2012
comment
просто вопрос реализации функции в интерпретаторе Python/Ruby и stdlib Вы имеете в виду, просто вопрос создания собственной реализации? Что ж, это не займет много времени ;) - person Marcin; 17.11.2012
comment
Да, ваша собственная реализация функции гибернации. Вам не нужно писать весь интерпретатор. Не то, чтобы я вызывался добровольно. - person David Stolarsky; 18.11.2012