La verbosità è una tendenza ad usare grandi quantità di testo e Terseness l'uso di pochissimo testo ...
La verbosità è cattiva perché:
- introduce maggiori opportunità di errore tipografico
- rende più difficile leggere il codice sullo schermo o sulla carta e / o inserire sulla scheda perforata
- questo aumenta i tempi di debug
- questo rende più difficile la comprensione del codice per l'aggiornamento / la manutenzione
- questo può portare alla duplicazione involontaria del codice
- aumenta in qualche modo la probabilità di errore di sintassi
- diminuisce la flessibilità di codifica, in quanto la maggior parte delle lingue verbose sono altamente strutturate e non hanno più modi di dire la stessa cosa.
- aumenta i tempi di codifica e compilazione
- può richiedere più spazio di archiviazione.
Un certo livello di verbosità è essenziale per la chiarezza, tuttavia ...
un livello minimo di verbosità è buono perché:
- è più facile per gli umani leggere e associare un valore semantico a un codice puramente simbolico
- Nella denominazione delle variabili e delle funzioni, semplifica il debug, il port e il mantenimento del codice
- nelle operazioni linguistiche di livello base e parole chiave di lingue complesse, porta a un minor numero di operazioni / assegnazioni di parole chiave errate.
Alcuni meravigliosi esempi di comandi troppo concisi per molte persone includono i vecchi standbys BASIC di val(x$)
, str$(x)
e chr$(x)
... restituiscono un numero dalla sua rappresentazione di stringa, restituiscono una stringa per un numero e restituiscono un singolo carattere con valore ASCII x come stringa.
O il puntatore C / C ++ e dagli operatori di riferimento &
e *
rispetto alla byref
parola chiave BASIC . In C / C ++, posso avere una variabile X e passare un puntatore a quella variabile, ma devo ricordare quale è il puntatore e quale è "usa il puntatore come variabile a cui punta"; in base, passo semplicemente il riferimento con una parola chiave byref nella chiamata di funzione, che è più chiara, ma meno flessibile:
def fn Foo(x byref as float) foo= (x += x+1)
...
Foo(x)
In questo codice, i contenuti di x vengono modificati a causa del flag byref. Alcuni sapori consentono il byref a chiamata, altri nella definizione, alcuni in entrambi.
La verbosità è importante per i programmatori occasionali per poter usare il simbolismo più facilmente; BASIC o Python sono più leggibili dall'uomo e più dettagliati di C / C ++ e quindi molto più utili per programmatori occasionali; la terseness di C / C ++ lo rende molto migliore per i programmatori più esperti, che hanno bisogno di vedere più codice e codice più complesso in una schermata, ma hanno dovuto imparare le varie convenzioni della struttura simbolica. In fondo c'è APL, che è quasi completamente illeggibile per l'uomo.
Un problema intimamente correlato è la chiarezza: il codice conciso è spesso poco chiaro e un codice eccessivamente dettagliato (come in AppleScript) può essere altrettanto poco chiaro. La familiarità con un determinato linguaggio aumenta la chiarezza del codice terse all'interno di quel linguaggio - un principiante grezzo, che affronta il codice C ++ è probabilmente in grado di analizzare solo le formule, e anche molto codice BASIC o Python funzionale è troppo conciso per la comprensione, ma applecript può essere perplesso, generalmente, senza ricorrere ai dizionari linguistici. Il meno chiaro che ho incontrato senza offuscamento intenzionale è Inform 7 ...
Ai vecchi tempi
Un'altra considerazione importante in passato, ma che non è più così importante per il programmatore hobby, è il funzionamento e lo spazio di archiviazione. (È ancora vitale nella fascia alta.) Tenendo presente che molte lingue sono state interpretate, in particolare i sapori BASIC, e molte altre sono state compilate in fase di esecuzione, lo spazio del codice era importante, soprattutto quando i dischi contenevano solo 128 KiB e le schede perforate individuali solo 80B.
Esistevano diverse soluzioni: la tokenizzazione era estremamente comune in BASIC; le parole chiave della singola lingua sono state ridotte a una parola di 1 o 2 byte nella parte superiore 128 o nello spazio dei caratteri di controllo. La tokenizzazione porta anche alla compilazione di bytecode (come in Inform e Z-Machine).
La compilazione e il collegamento di più file oggetto sono stati utilizzati anche per aggirare le limitazioni di spazio. Una sezione di codice Pascal da 100 KiB potrebbe essere compilata in soli 5 KiB; collegando più file compilati, è possibile creare applicazioni di grandi dimensioni senza avere accesso a unità di grande formato (ricordando che 10 MiB era sorprendentemente grande e acquistare una nuova auto costosa).
Linguaggi più concisi, tuttavia, ottennero più codice in un determinato blocco sia di disco che di ram, e quindi compilarono blocchi più grandi alla volta. Tenendo a mente: i "minicomputer" dei primi anni '70 potrebbero avere solo 64 KiB di ram (il Honeywell 800 aveva un'installazione base di 4 banchi ciascuno di 2048 parole di 8B ciascuno). APL e linguaggi simbolici simili si sono avvicinati a 1 B per istruzione più i suoi operandi, rispetto al 3B-10B molto più grande per istruzione più operandi. (È stato un incubo digitare su schede perforate, soprattutto perché i simboli erano essenzialmente un carattere sulla palla di tipo, e molti lanci di carte non avevano i simboli sui tasti ...)
Inoltre, tieni presente che le carte non possono essere cancellate ... e molti programmi sono stati inseriti nelle carte. Sebbene non sia individualmente costoso, più il codice potrebbe essere compresso sulla scheda, meno necessario e più grandi potrebbero essere i programmi o meno costosi. Questo è uno dei motivi per cui BASIC ha una concatenazione di più istruzioni per riga nella maggior parte dei gusti: è stato introdotto per risparmiare sulle schede perforate. (O almeno così dice il mio testo di programmazione Vax Basic.) Mentre non ho programmato per un lettore di schede, ho eseguito la perforazione della scheda per un Honeywell 800 in FORTRAN, BASIC, APL e un paio di altri linguaggi altamente simbolici.