La simplicidad y coherencia de Smalltalk frente a otros lenguajes (2022) [video]

La sintaxis mínima de Smalltalk y su modelo unificado de “todo es un objeto” son elogiados por su elegancia conceptual y por sus potentes entornos de desarrollo en vivo, donde código, GUI, editor y depurador conviven en una sola imagen. Los comentaristas responden que esta simplicidad oculta compromisos reales: implementaciones complejas de VM y JIT, desafíos de rendimiento frente a JavaScript o Java, dificultades de empaquetado, control de versiones y multithreading, y un runtime pesado que limita su uso generalizado. La conversación se amplía hacia cuánto importan el lenguaje y las herramientas frente a la resolución de problemas, y por qué plataformas más expresivas o experimentales como Smalltalk, Lisp, F# o Elixir luchan por ganar tracción frente a ecosistemas dominantes como Python, C++ y Java.

Simplicidad, sintaxis y compromisos

  • La sintaxis de Smalltalk es extremadamente mínima y uniforme, pero los comentaristas subrayan que esto no hace automáticamente que el código sea más fácil de leer/escribir ni que los compiladores sean fáciles de optimizar.
  • Los bloques y el paso de mensajes unifican las estructuras de control con las llamadas normales a métodos, pero requieren casos especiales en el compilador (p. ej., inlining de ifTrue: / whileTrue:) para evitar grandes ralentizaciones.
  • El modelo de “todo es un mensaje a un receptor” empuja el diseño hacia la distribución del comportamiento entre jerarquías de clases/traits, lo que algunos ven como elegante y otros como una complejidad añadida frente a las funciones simples de otros lenguajes.
  • La familiaridad influye fuertemente en lo que se percibe como “simple”; un lenguaje demasiado minimalista puede complicar las soluciones.

Rendimiento y optimización de la VM

  • Hay un debate animado sobre por qué históricamente las VMs de Smalltalk quedaron por detrás de los motores JS de alto rendimiento.
  • Un lado lo atribuye en parte al diseño del lenguaje/VM (por ejemplo, bloques, despacho dinámico) más difícil de compilar bien con JIT, comparando la trayectoria de Smalltalk con la de Python.
  • Otros argumentan que las diferencias de rendimiento se deben sobre todo a la inversión: JS tiene equipos grandes y bien financiados; OpenSmalltalk depende de voluntarios. Usar Squeak/Pharo como referencia de rendimiento se califica de engañoso.
  • Se citan ejemplos de sistemas tipo Smalltalk de alto rendimiento (Self, Strongtalk, variantes de SOM basadas en Truffle/Graal, TruffleSqueak) que pueden igualar o superar a JS en algunos benchmarks, cuestionando las afirmaciones de que “Smalltalk es lento”.
  • En el caso de Python, se describe que las razones subyacentes de la dificultad de optimización no están claras; se menciona la fuerte acoplamiento de CPython con extensiones en C, pero sin resolverlo.

Entornos de programación en vivo

  • Muchos se sienten fascinados por el entorno vivo e basado en imágenes de Smalltalk, donde el código, la GUI, el depurador y las herramientas están integrados y siempre en ejecución.
  • Esto se contrasta con los flujos de trabajo convencionales que requieren recompilar/reiniciar, vistos como un paso atrás.
  • Se mencionan Emacs y los sistemas Lisp/Interlisp como espiritualmente similares (extensibles, vivos, con historia basada en imágenes), pero no idénticos en la experiencia; Smalltalk se ve como más coherente, Emacs como más “kludgy”.
  • Desventajas: los entornos Smalltalk modernos pueden ser pesados (p. ej., 1 GB+ de RAM) y torpes de desplegar porque es necesario distribuir la VM/imagen.

Practicidad, herramientas y experiencia en proyectos

  • Algunas anécdotas describen una productividad y herramientas impresionantes en sistemas Smalltalk (bases de datos OO, motores de flujo de trabajo, automatización integrada en el IDE).
  • Contraanécdota: un gran proyecto secreto en Smalltalk que casi no produjo nada demostrable; el lenguaje no fue el único problema, pero el secretismo, la falta de validación y las dificultades históricas de SCM/configuración en Smalltalk jugaron un papel.
  • Preocupaciones sobre la practicidad moderna de Smalltalk: percibida falta de bibliotecas “batteries included”, multithreading débil o ausente en implementaciones FOSS comunes, y UIs torpes (editores pequeños, flujos centrados en el ratón).
  • Otros señalan que los Smalltalk comerciales anteriores estaban “batteries included” para su época; lo que es práctico varía según la década.

Filosofía del lenguaje y realidad profesional

  • Algunos participantes sienten que los lenguajes dominantes (Python, C++, Java) son mucho menos agradables o expresivos que Smalltalk, Lisp, F#, Elixir, etc., pero se ven obligados a usarlos por razones profesionales.
  • Consejo dado:
    • Prototipa en tu lenguaje preferido y demuestra una productividad/valor drásticamente superiores para influir en la elección del stack.
    • Prepárate para enseñar a tus compañeros si introduces un lenguaje de nicho.
    • Alternativamente, adopta herramientas populares pero aplica ideas de lenguajes “mejores” en el estilo de diseño y las abstracciones.
  • Hay tensión entre amar las herramientas y centrarse en resolver problemas:
    • Un bando dice que la estética de las herramientas es una distracción; lo que importa es la eficacia.
    • Otro sostiene que las herramientas de alta calidad “disuelven” los problemas y que dominar las herramientas es crucial.
    • Algunos proponen un punto intermedio: no estar románticamente apegado a las herramientas, pero tampoco ignorar su impacto.

Comparaciones con otros lenguajes y sistemas

  • Smalltalk se compara repetidamente con:
    • Lisp y las antiguas Lisp machines/Interlisp (imágenes, GC, desarrollo interactivo).
    • JS, Python, Ruby y modelos de despacho dinámico; la búsqueda de métodos basada en diccionarios se considera a la vez potente y un lastre para el rendimiento.
    • Tcl y GNU Smalltalk como opciones de scripting; GNU Smalltalk se caracteriza más como “scripting con sabor a Smalltalk” que como un entorno Smalltalk completo, con un estado de mantenimiento cuestionable.
  • Se debate la “homoiconicidad”:
    • Algunos afirman que Smalltalk es homoicónico como Lisp; otros argumentan que en los Lisps compilados y entornos modernos, la noción clásica de “código como datos con la misma representación” realmente no se aplica.

Aprendizaje, configuraciones mínimas y experimentos

  • La gente pide más vídeos de Smalltalk con “live coding”; se comparten enlaces a tutoriales de Pharo, charlas sobre edición en vivo y juegos, y demos introductorias de Smalltalk.
  • Glamorous Toolkit (sobre Pharo) se destaca como un entorno moderno de “moldable development” donde la documentación en sí misma es código vivo y editable.
  • Algunos quieren configuraciones Squeak ultraminimalistas (sin gráficos/sonido, solo REPL en dispositivos pequeños como Raspberry Pi Zero); se describe como algo no trivial, sin una ruta simple y documentada en el hilo.
  • Se plantean ideas para:
    • Un sistema tipo Smalltalk sobre la VM BEAM de Erlang/Elixir para ganar concurrencia y distribución.
    • Usar VMs de JS como destinos de despliegue para Smalltalk (por ejemplo, squeak.js).
    • Considerar Objective-C (inspirado en Smalltalk) como una alternativa dinámica más práctica hoy en día; esto se menciona pero no se discute en profundidad.