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.