Niklaus Wirth, ou a Importância de Ser Simples

Defensores da filosofia “simplicidade em primeiro lugar” de Niklaus Wirth refletem sobre Pascal, Modula, Oberon e seus descendentes, contrastando-os com linguagens mainstream mais complexas como C, C++ e Rust. Os comentaristas avaliam como restrições de design de linguagem, velocidade de compilação e ergonomia afetam a produtividade no mundo real, o ensino e a programação de sistemas, citando frequentemente Go, D e Modula‑3 como herdeiros modernos das ideias de Wirth. A discussão também aborda a influência histórica do trabalho de Wirth — da Apple e Borland à Logitech — e questiona se as ferramentas de hoje e as pressões da indústria ainda recompensam linguagens minimalistas e cuidadosamente projetadas.

Pascal vs C e Compromissos no Design de Linguagens

  • Vários comentaristas dizem que o Pascal “padrão” era restritivo demais; eles gastavam tempo com gambiarras que desapareciam ao mudar para C.
  • Outros argumentam que a simplicidade e a estrutura do Pascal os tornavam produtivos e esclareciam conceitos centrais de programação.
  • Há debate sobre se o sucesso de C se deve a ser mais simples/mais genérico, a uma melhor ergonomia (sintaxe mais curta e menos verbosa), à sinergia com o ecossistema Unix, ou a tudo isso.
  • Extensões (Turbo Pascal, Object Pascal, Clascal, Modula-2, etc.) são vistas como necessárias para tornar o Pascal viável para desenvolvimento de sistemas e aplicações.

Linguagem de Ensino vs Sistemas em Produção

  • Muitos observam que o Pascal original foi explicitamente projetado para ensino e compilação em uma passagem em hardware limitado, não como linguagem de sistemas.
  • Alguns reclamam que ele foi mal utilizado na indústria (“mandado cavar uma trincheira com um carro de autoescola”), culpando escolhas de gestão e não a linguagem em si.
  • Tempos curtos de compilação são destacados como críticos em ambientes educacionais e de time-sharing.

Funções Aninhadas e Closures

  • Discussão sobre funções aninhadas com acesso a escopos externos (estilo Pascal) e como elas são implementadas usando um “static link” para os frames de pilha envolventes.
  • Comparações com lambdas de C++ e trampolins; algumas VMs caseiras tentaram esquemas mais simples e encontraram problemas com recursão.

Módulos, Interfaces e Implementações

  • Há confusão sobre “linguagens modulares”: alguns querem dizer módulos no estilo Modula/Oberon/Ada, outros interfaces ao estilo Java.
  • Em sistemas de módulos como Modula-2/Oberon/C/C++, um determinado header de interface pode ter múltiplas implementações globalmente, mas apenas uma é escolhida por compilação.
  • Interfaces no estilo Java (e alguns sistemas de módulos ao estilo ML) permitem múltiplas implementações de forma mais flexível no nível de tipos.

Simplicidade, Complexidade e Velocidade de Compilação

  • Um ponto de vista: a velocidade de compilação é um teste decisivo para a simplicidade de uma linguagem; linguagens que compilam rápido (Go, Pascal clássico) refletem designs simples.
  • Contra-argumentos: a velocidade de compilação é influenciada pela implementação e pelas ferramentas (por exemplo, LLVM, headers, templates), não apenas pela complexidade da linguagem; exemplos como OCaml mostram compiladores rápidos para linguagens não triviais.
  • Debate sobre módulos modernos de C++, caches e ferramentas como correções parciais versus complexidade fundamental.

Influência em Linguagens Posteriores

  • Go é frequentemente discutido: alguns o veem como um descendente simples, inspirado em Wirth, de Modula/Oberon; outros dizem que sua linhagem principal passa por Newsqueak e CSP, com apenas influência superficial da família Pascal (sintaxe, packages).
  • D é citado por emprestar ideias específicas (por exemplo, funções aninhadas), mas não o minimalismo geral no estilo de Wirth.
  • Modula-3 é elogiada como uma linguagem “completa”, porém enxuta, que antecipou problemas de complexidade do C++.

Concorrência e Simplicidade

  • Subthread estendido sobre adicionar concorrência ao Oberon (Oberon+): channels vs monitors, actors, CSP, e quantos primitivos uma linguagem “simples” deveria expor.
  • Não há consenso: alguns argumentam que um único construto (por exemplo, channels) deveria bastar; outros citam evidências de Go e outros ecossistemas de que múltiplos primitivos continuam amplamente usados.

Reflexões sobre Wirth e o Contexto Histórico

  • Muitos expressam admiração pela ênfase em simplicidade, compiladores pequenos e co-design estreito entre hardware e software.
  • Alguns argumentam que Wirth podia focar na simplicidade por causa das restrições e do ritmo mais lento de sua época; outros rejeitam fortemente isso e veem seu trabalho como ainda relevante e subutilizado.