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 |
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:
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.