Los procesos en Erlang y los objetos en Smalltalk son de hecho la misma cosa.
A primera vista, esto no es terriblemente sorprendente: Erlang es un lenguaje de modelo de actor . El modelo de actor fue inventado por Carl Hewitt, quien basó el modelo de evaluación basado en mensajes en el modelo de evaluación basado en mensajes de Smalltalk. (Realmente, los actores y los objetos son lo mismo; solo difieren en algunos detalles). Alan Kay, a su vez, fue influenciado por el PLANIFICADOR de Carl Hewitt, cuando diseñó Smalltalk.
Por lo tanto, existe una estrecha relación entre los actores y los objetos, y por lo tanto, no debería sorprendernos que los procesos de Erlang y los objetos de Smalltalk sean tan similares.
Excepto por una cosa: ¡los diseñadores de Erlang no sabían sobre el modelo de actor ! Solo se enteraron más tarde, particularmente cuando Joe Armstrong escribió su Tesis doctoral bajo Seif Haridi (coautor del libro definitivo sobre Paradigmas de programación) a fines de la década de 1990.
Joe Armstrong escribió un artículo en el que abogó firmemente contra OO ( Why OO Sucks ), pero luego cambió de opinión cuando se dio cuenta de que Erlang en realidad está muy orientado a objetos. De hecho, incluso llegó a afirmar que Erlang es el único lenguaje orientado a objetos en esta entrevista con Joe Armstrong y Ralph Johnson .
Este es un caso interesante de lo que los biólogos evolutivos llamarían evolución convergente , es decir, dos especies no relacionadas que evolucionan para ser similares en respuesta a presiones externas similares.
Sin embargo, todavía hay muchas relaciones entre Erlang y Smalltalk:
Erlang comenzó como una extensión de concurrencia de Prolog (e incluso cuando Erlang se convirtió en su propio idioma, las primeras implementaciones se escribieron en Prolog) y hasta el día de hoy todavía está muy arraigado en Prolog. Prolog está fuertemente influenciado por el PLANIFICADOR de Carl Hewitt.
Smalltalk también estuvo fuertemente influenciado por lo que luego se convertiría en ARPANet (e incluso más tarde en Internet); Erlang fue diseñado para sistemas en red.
Sin embargo, una de las diferencias importantes entre Erlang y Smalltalk es que no todo es un Proceso. 1
Es un número, no un proceso. No puedes enviar un mensaje a un número.
Hay múltiples "capas" de Erlang:
- Erlang funcional : un lenguaje funcional de tipo dinámico, en su mayoría típico, con algunas "rarezas" heredadas de Prolog, por ejemplo, unificación.
- Erlang concurrente : Erlang funcional + Procesos y mensajes.
- Erlang distribuido : Erlang concurrente + procesos remotos.
- Erlang tolerante a fallas : Erlang distribuido + ciertos patrones de diseño codificados en las bibliotecas OTP, por ejemplo, árboles de supervisión y
gen_server
.
Un sistema tolerante a fallas escrito en Erlang / OTP generalmente se verá como algo que podríamos reconocer como "orientado a objetos". Pero el interior de esos objetos a menudo se implementará en un estilo más funcional que orientado a objetos.
Curiosamente, la "presión evolutiva" a la que Erlang estaba sometido, en otras palabras, el problema que los diseñadores de Erlang intentaban resolver (confiabilidad, replicación, redundancia, ...) es la misma presión que condujo a la evolución de las células. Alan Kay estudió microbiología y modeló explícitamente OO en células biológicas. Este es otro paralelo entre Erlang y Smalltalk.
Escribí un poco sobre esto en otra respuesta mía .