A verbosidade é uma tendência ao uso de grandes quantidades de texto, e a dispersão o uso de muito pouco texto ...
A verbosidade é ruim porque:
- introduz mais oportunidade para erro tipográfico
- dificulta a leitura de código na tela ou no papel e / ou entra no cartão perfurado
- isso aumenta os tempos de depuração
- isso dificulta a compreensão do código para atualização / manutenção
- isso pode levar à duplicação de código não intencional
- aumenta um pouco a probabilidade de erro de sintaxe
- diminui a flexibilidade de codificação, pois a maioria das linguagens verbais é altamente estruturada e não possui várias maneiras de dizer a mesma coisa.
- aumenta o tempo de codificação e compilação
- pode levar mais espaço de armazenamento.
Um certo nível de verbosidade é essencial para a clareza, no entanto ...
um nível mínimo de verbosidade é bom porque:
- é mais fácil para os humanos ler e anexar valor semântico ao código puramente simbólico
- Na nomeação de variáveis e funções, facilita a depuração, porta e manutenção do código
- nas operações de idioma de nível básico e nas palavras-chave de idiomas complexos, isso leva a menos atribuições incorretas de operação / palavra-chave.
Alguns exemplos maravilhosos de comandos excessivamente concisos para muitas pessoas incluem as antigas esperanças BASIC de val(x$)
, str$(x)
e chr$(x)
... retornam um número de sua representação de string, retornam uma string para um número e retornam um único caractere com o valor ASCII x como uma string.
Ou o ponteiro C / C ++ e por operadores de referência &
e *
versus a byref
palavra-chave BASIC . No C / C ++, posso ter uma variável X e passar um ponteiro para essa variável, mas preciso lembrar qual é o ponteiro e qual é o "use o ponteiro como a variável para a qual ele aponta"; no básico, simplesmente passo a referência com uma palavra-chave byref na chamada de função, que é mais clara, mas menos flexível:
def fn Foo(x byref as float) foo= (x += x+1)
...
Foo(x)
Nesse código, o conteúdo de x é modificado devido ao sinalizador byref. Alguns sabores permitem byref na chamada, outros na definição, alguns em qualquer um.
A verbosidade é importante para programadores casuais poderem usar o simbolismo mais facilmente; BASIC ou python são mais legíveis por humanos e mais detalhados que C / C ++ e, portanto, muito mais úteis para programadores casuais; a dispersão do C / C ++ torna muito melhor para programadores mais experientes, que precisam ver mais código e código mais complexo em uma tela, mas tiveram que aprender as várias convenções de estrutura simbólica. No outro extremo está o APL, que é quase completamente humano ilegível.
Uma questão intimamente relacionada é a clareza - o código conciso geralmente não é claro e o código excessivamente detalhado (como no AppleScript) pode ser igualmente obscuro. A familiaridade com uma determinada linguagem aumenta a clareza do código conciso dentro dessa linguagem - um iniciante bruto, enfrentando o código C ++, provavelmente será capaz de analisar apenas as fórmulas, e mesmo muito código BASIC ou Python funcional é muito conciso para a compreensão, mas o AppleScript pode ser confundido, geralmente, sem recorrer a dicionários de idiomas. O menos claro que encontrei sem ofuscação intencional é o Inform 7 ...
Nos velhos tempos
Outra consideração importante no passado, mas que não é mais tão importante para o codificador de hobby, é a operação e o espaço de armazenamento. (Ainda é vital para os avançados.) Tendo em mente que muitos idiomas foram interpretados, especialmente os sabores do BASIC, e muitos outros foram compilados em tempo de execução, o espaço do código era importante, especialmente quando os discos mantinham apenas 128KiB e os punchcards individuais, apenas 80B.
Existiam várias soluções - a tokenização era extremamente comum no BASIC; as palavras-chave do idioma individual foram reduzidas a uma palavra de 1 ou 2 bytes no espaço superior de 128 ou no caractere de controle. A tokenização também leva à compilação de bytecodes (como no Inform e na Z-Machine).
A compilação e a vinculação de vários arquivos de objetos também foram usadas para contornar as limitações de espaço. Uma seção de código Pascal de 100KiB pode ser compilada para apenas 5KiB; ao vincular vários arquivos compilados, era possível criar aplicativos massivos sem ter acesso a unidades de grande formato (lembrando que 10MiB eram surpreendentemente grandes e comprar um carro novo).
Linguagens mais concisas, no entanto, inseriram mais código em um determinado pedaço de disco e ram e, assim, compilaram pedaços maiores de cada vez. Lembre-se: os "minicomputadores" do início da década de 1970 podem ter apenas 64KiB de ram (o Honeywell 800 tinha uma instalação básica de 4 bancos cada um com 2048 palavras de 8B cada). O APL e linguagens simbólicas similares aproximaram-se de 1B por instrução mais seus operandos, em comparação com os muito maiores 3B-10B por instrução mais operandos. (Foi um pesadelo digitar em cartões perfurados, especialmente porque os símbolos eram essencialmente uma fonte na bola tipo, e muitos perfuradores de cartões não tinham os símbolos nas teclas ...)
Além disso, lembre-se de que os cartões não podem ser apagados ... e muitos programas foram inseridos nos cartões. Embora não seja caro individualmente, quanto mais compactado o código puder estar no cartão, menos você precisará e quanto maior o programa, ou menos caro. Isso é parte do motivo pelo qual o BASIC tem uma concatenação de várias instruções por linha na maioria dos sabores - foi introduzido para economizar em cartões perfurados. (É o que diz meu texto de programação do Vax Basic.) Embora eu não tenha programado para um leitor de cartão, já perfurei um cartão Honeywell 800 em FORTRAN, BASIC, APL e algumas outras linguagens altamente simbólicas.