Gli umani commettono errori. Più un umano deve fare, più errori fa. Pertanto, ci sono due cose che una lingua può fare:
- Aiuta a rilevare gli errori in anticipo, ad es. attraverso un sistema di tipo strong. Questo è stato coperto da altre risposte.
- Riduci la quantità di lavoro che l'umano deve fare.
Il secondo punto non riguarda semplicemente la durezza. "Lavorare" l'umano deve fare non solo la digitazione del codice. Gran parte del lavoro è nella mappatura dalla tua idea di come qualcosa funzioni a un modo di esprimerlo nel codice.
Di conseguenza, più direttamente le tue idee mappano ai costrutti del linguaggio di programmazione, meno traduzioni devi fare e meno errori introduci in quella traduzione. Ad esempio, in una lingua senza funzioni di ordine superiore, se hai una lista di cose e vuoi un elenco di cose che derivano dalle cose originali, devi tradurre dall'idea astratta "dammi una lista di derivati di cose in un'altra lista "per" creare una lista, andare oltre la lista originale, calcolare la derivata dell'elemento corrente, aggiungerla alla lista di destinazione "e poi tradurla in codice come
result = new List();
for each element in source { // what if you don't even have foreach?
result.add(derive_from(element));
}
In una lingua che ha funzioni di ordine superiore, puoi esprimere più chiaramente la tua idea, perché devi solo tradurla per "usare la cosa che mi dà una lista con elementi corrispondenti ad un'altra lista, dargli il modo di ricava un nuovo elemento ", o nel codice:
result = map(source, derive_from);
Il codice è succinto, ma soprattutto, esprime più direttamente l'intenzione. C'era meno traduzione mentale e quindi meno spazio per l'errore.