O sistema CWEB

Programming is best regarded as the process of creating works of literature, which are meant to be read.
— D.E. Knuth, Literate Programming

If you are in the software industry and do not use CWEB but your competitors do, your competitors will soon overtake you — and you'll miss out on a lot of fun besides.
— D.E. Knuth

CWEB é uma linguagem, ou sistema, que permite escrever programas C bem documentados, em pequenos pedaços interligados. Veja minha página sobre o CWEB.

De onde vem o sigla?  C é o nome da linguagem de programação e WEB significa teia (de pequenos pedaços interligados). O sistema WEB foi criado por Donald Knuth; Silvio Levy adaptou o sistema à linguagem C.

O que CWEB tem a ver com a teoria dos grafos?  Quase nada. Eu só preciso do CWEB para entender os programas de manipulação de grafos do Stanford GraphBase.

Quanto CWEB será preciso aprender?  Pouco. Basta aprender a ler um documento CWEB, o que é muito fácil. Mas encorajo todos os leitores a aprender mais que esse mínimo e usar CWEB nos seus projetos de programação em C. Consulte minha página sobre programação letrada.

Exemplo?  Preparei uma amostra de documento CWEB. Se você tiver dificuldade em entender o documento, veja a nota Como ler programas CWEB.  Um dos detalhes da nota é a seguinte correspondência entre símbolos que aparecem nos documentos CWEB e os correspondentes símbolos em código C:

CWEB C significado
<=
>=
!=
==
- subtração
->
&& e lógico
|| ou lógico
¬ ! não lógico
& & e bit-a-bit
^ ou exclusivo bit-a-bit

Arquivos .w, .c, .tex, .dvi

O código-fonte de todo programa CWEB fica em um arquivo que tem sufixo .w.  Tomemos isort.w como exemplo. Esse arquivo será submetido a dois programas diferentes:

  1. O programa ctangle (to tangle = entrelaçar, embaraçar) transforma isort.w em um arquivo isort.c, que está pronto para ser submetido a um compilador C.
  2. O programa cweave (to weave = tecer) transforma isort.w em um arquivo isort.tex, que será convertido em um arquivo isort.dvi pelo programa TeX. O arquivo isort.dvi contém o documento CWEB e pode ser facilmente convertido em isort.pdf.

Exercícios 1

  1. Escreva um pequeno ensaio criticando meu programa isort (e seus arquivos auxiliares).
  2. Escreva um pequeno ensaio criticando meu programa mdp.
  3. Faça uma copia do arquivo mdp.w. Em seguida, use um editor de texto para simular o efeito de ctangle sobre o arquivo.

Algumas observações sobre documentação de programas

O CWEB é uma ferramenta que ajuda o programador a escrever programas legíveis e bem documentados. Mas o que é bem documentado? Para produzir uma boa documentação, basta fazer o seguinte:

para cada função do seu programa, escreva, de maneira curta, grossa, e exata, o que a função faz: diga o que a função recebe, o que devolve, e qual a relação entre as duas coisas.

Em outras palavras, escreva um pequeno manual-do-usuário para cada função do seu programa. Exemplo: Digamos que meu programa tem uma função ord que ordena vetores. Digamos que o protótipo da função é

void ord (int a[], int n);

Eis uma boa documentação: A função ord recebe um vetor a[1 .. n] e rearranja os seus elementos de modo que eles fiquem em ordem crescente, ou seja, de modo que a[1] ≤ a[2] ≤ … ≤ a[n]; a função supõe que n ≥ 1.

Veja um exemplo de má documentação: A função ord recebe um vetor a e rearranja os seus elementos de modo que eles fiquem em ordem. Essa documentação é muito vaga.

É muito mais importante dizer o que a função faz de que explicar como ela faz o que faz. Assim, não é necessário explicar se ord usa o método heapsort, ou o quicksort, ou outro qualquer, para fazer o serviço.