Niklaus Wirth, o la importancia de ser simple

Los defensores de la filosofía “la simplicidad primero” de Niklaus Wirth reflexionan sobre Pascal, Modula, Oberon y sus descendientes, contrastándolos con lenguajes más complejos y dominantes como C, C++ y Rust. Los comentaristas valoran cómo las restricciones de diseño del lenguaje, la velocidad de compilación y la ergonomía afectan a la productividad real, la enseñanza y la programación de sistemas, citando a menudo Go, D y Modula‑3 como herederos modernos de las ideas de Wirth. El hilo también aborda la influencia histórica del trabajo de Wirth —desde Apple y Borland hasta Logitech— y se pregunta si las herramientas actuales y las presiones de la industria siguen premiando los lenguajes mínimos y de diseño estrecho.

Pascal frente a C y las compensaciones del diseño de lenguajes

  • Varios comentaristas dicen que el Pascal “estándar” era demasiado limitado; pasaban tiempo buscando soluciones alternativas que desaparecían al cambiar a C.
  • Otros sostienen que la simplicidad y la estructura de Pascal los hacían productivos y aclaraban conceptos centrales de programación.
  • Hay debate sobre si el éxito de C se debe a que era más simple/más genérico, a una mejor ergonomía (sintaxis más corta y menos verbosa), a la sinergia con el ecosistema Unix, o a todo lo anterior.
  • Las extensiones (Turbo Pascal, Object Pascal, Clascal, Modula-2, etc.) se consideran necesarias para hacer viable Pascal en el desarrollo de sistemas y aplicaciones.

Lenguaje para enseñanza vs sistemas de producción

  • Muchos señalan que el Pascal original fue diseñado explícitamente para la enseñanza y la compilación de una sola pasada en hardware محدودado, no como un lenguaje de sistemas.
  • Algunos se quejan de que se usó mal en la industria (“nos dijeron que caváramos una zanja con un coche de escuela de conducción”), culpando a las decisiones de gestión más que al lenguaje en sí.
  • Los tiempos de compilación cortos se destacan como críticos en entornos educativos y de tiempo compartido.

Funciones anidadas y cierres

  • Se discuten las funciones anidadas con acceso a ámbitos externos (estilo Pascal) y cómo se implementan usando un “enlace estático” a los marcos de pila englobantes.
  • Comparaciones con las lambdas de C++ y los trampolines; algunas VMs artesanales intentaron esquemas más simples y se toparon con problemas de recursión.

Módulos, interfaces e implementaciones

  • Hay confusión sobre los “lenguajes modulares”: algunos se refieren a módulos al estilo Modula/Oberon/Ada, otros a interfaces al estilo Java.
  • En sistemas de módulos como Modula-2/Oberon/C/C++, un encabezado de interfaz dado puede tener múltiples implementaciones globalmente, pero solo una se elige por compilación.
  • Las interfaces al estilo Java (y algunos sistemas de módulos al estilo ML) permiten múltiples implementaciones de forma más flexible a nivel de tipos.

Simplicidad, complejidad y velocidad de compilación

  • Una postura: la velocidad de compilación es una prueba decisiva de la simplicidad de un lenguaje; los lenguajes que compilan rápido (Go, Pascal clásico) reflejan diseños simples.
  • Contraargumentos: la velocidad de compilación está influida por la implementación y las herramientas (por ejemplo, LLVM, cabeceras, plantillas), no solo por la complejidad del lenguaje; ejemplos como OCaml muestran compiladores rápidos para lenguajes no triviales.
  • Debate sobre los módulos modernos de C++, las cachés y las herramientas como soluciones parciales frente a la complejidad fundamental.

Influencia en lenguajes posteriores

  • Se habla mucho de Go: algunos lo ven como un descendiente simple, inspirado en Wirth, de Modula/Oberon; otros dicen que su linaje principal pasa por Newsqueak y CSP, con solo una influencia superficial de la familia Pascal (sintaxis, paquetes).
  • D se menciona por tomar prestadas ideas específicas (por ejemplo, funciones anidadas), pero no el minimalismo general al estilo Wirth.
  • Modula-3 es elogiado como un lenguaje “completo” pero ágil que anticipó los problemas de complejidad de C++.

Concurrencia y simplicidad

  • Subhilo ampliado sobre añadir concurrencia a Oberon (Oberon+): canales frente a monitores, actores, CSP y cuántos primitivos debería exponer un lenguaje “simple”.
  • No hay consenso: algunos argumentan que un solo constructo (por ejemplo, canales) debería bastar; otros citan evidencia de Go y otros ecosistemas de que siguen usándose ampliamente múltiples primitivos.

Reflexiones sobre Wirth y el contexto histórico

  • Muchos expresan admiración por el énfasis en la simplicidad, los compiladores pequeños y el co-diseño estrecho entre hardware y software.
  • Algunos sostienen que Wirth podía centrarse en la simplicidad por las limitaciones y el ritmo más lento de su época; otros lo rechazan firmemente y consideran que su trabajo sigue siendo relevante y está infrautilizado.