serialize serializar que serialization persistence smalltalk interpreted-language

serialization - serializar - ¿Qué le da a Smalltalk la capacidad de hacer persistencia de la imagen y por qué los idiomas como Ruby/Python no pueden ser serializados?



serializar json (4)

En smalltalk, puedes guardar el estado del mundo en un archivo de imagen. Supongo que esto tiene que ver con la capacidad de Smalltalk para "serializarse" a sí mismo, es decir, los objetos pueden producir su propio código fuente.

1) ¿Es esta una comprensión precisa?

2) ¿Cuál es el desafío de agregar esta capacidad a los idiomas modernos (obviamente, no es claro)?

3) ¿Es "serialización" la palabra correcta? ¿Cuál es la jerga correcta?


Ampliando sobre la excelente respuesta de Bert Freudenberg.

1) ¿Es esto (es decir, la capacidad del objeto para serializar su propio código fuente) una comprensión precisa?

No Como Bert señaló, una imagen de Smalltalk es simplemente una instantánea de la memoria. La única fuente de verdad de los objetos Smalltalk y los programas Smalltalk es su representación en la memoria. Esta es una gran diferencia en otros idiomas, donde los programas se representan como archivos de texto.

2) ¿Cuál es el desafío de agregar esta capacidad a los idiomas modernos (obviamente, no es claro)?

Técnicamente, el arranque de una aplicación desde una instantánea de memoria debería ser posible para la mayoría de los idiomas. Si no me equivoco, hay soluciones que utilizan este enfoque para acelerar los tiempos de inicio de las aplicaciones Java. Sin embargo, tendría que acordar una representación de memoria canónica y tendría que asegurarse de reinicializar los recursos nativos al reiniciar el programa. Por ejemplo, en Smalltalk, los archivos abiertos y las conexiones de red se vuelven a abrir. Y también, hay un gancho de inicio para arreglar el endianness de los números.

3) ¿Es "serialización" la palabra correcta? ¿Cuál es la jerga correcta?

Hibernación es el término.


Es mucho más simple que "serializar". Una imagen de Smalltalk es simplemente una instantánea de la memoria de objetos. Toma todo el contenido de la RAM (después de la recolección de basura) y lo descarga en un archivo. En el inicio, carga esa instantánea del disco en la RAM y continúa procesando donde se detuvo. Hay algunos ganchos para realizar acciones especiales en la instantánea y cuando se reanuda, pero básicamente así es como funciona.

(agregado: vea el comentario de Lukas Renggli a continuación para una elección de diseño crucial que lo hace tan simple en comparación con otros entornos)


Esto ya sucede de una manera cuando pones tu computadora en suspensión, ¿verdad? ¿El kernel escribe los programas en ejecución en el disco y los carga de nuevo más tarde? Presumiblemente, el kernel podría mover un programa en ejecución a una nueva máquina a través de una red, asumiendo la misma arquitectura en el otro extremo. Java puede serializar todos los objetos también debido a la JVM, ¿verdad? Tal vez el obstáculo sea simplemente la arquitectura que implica diseños de memoria variados?

Edición: Pero supongo que está interesado en utilizar esta funcionalidad desde el propio programa. Así que creo que es solo una cuestión de implementar la función en el intérprete y estándar de Python / Ruby, y tener algún tipo de máquina virtual si desea poder cambiar a una arquitectura de hardware diferente.


La diferencia fundamental es que Smalltalk trata al Programa como un conjunto de objetos. Y el IDE es solo un grupo de editores que editan esos objetos, de modo que cuando guarda y carga la imagen, todo su código está allí como cuando lo dejó.

Para otros idiomas podría ser posible, pero supongo que habría más problemas, dependiendo de cuánta reflexión haya. En la mayoría de los otros lenguajes, la reflexión viene como complemento, o incluso como una idea posterior, pero en Smalltalk está en el corazón del sistema.