Vado anche contro il grano qui e cercherò di creare un caso estetico (leggermente divertente) per C. Mentre alcune persone potrebbero chiamarlo "brutto" per motivi diversi, come la mancanza di costrutti di livello superiore come le classi o la sua dipendenza dai puntatori, trovo che non sia il caso per me .
TL; DR : A mio avviso, C è semplice, buona C è leggibile e c'è una certa gioia da trovare nei colpi.
C è semplice
Lo standard C definisce solo alcuni tipi e meccanismi di base per creare funzioni, puntatori e matrici da essi. Inoltre, c'è un piccolo numero di costrutti di composizione per creare tipi più complessi dalle primitive (come le strutture e i sindacati). Nota come ho descritto la maggior parte della lingua in due frasi. Ciò significa che non devi tenere troppe regole e moduli sintattici nella tua testa durante la codifica.
Semplice è bello .
C non è arcano
A differenza di molte lingue di livello superiore, sarebbe difficile trovare molti simboli strani e incomprensibili in C. Nel mondo C, la funzione principale sia per l'astrazione che per la "compressione sintattica" è la funzione - semanticamente un metodo molto semplice e costrutto autoesplicativo. Il buon stile C incoraggia la bellezza quasi poetica e leggibile. Per illustrare, proviamo a leggere il seguente frammento dal kernel Linux. Anche senza avere una comprensione delle strutture di dati e dei dettagli di implementazione sottostanti, possiamo avere molto senso di quanto segue:
bool kthread_freezable_should_stop(bool *was_frozen)
{
bool frozen = false;
might_sleep();
if (unlikely(freezing(current)))
frozen = __refrigerator(true);
if (was_frozen)
*was_frozen = frozen;
return kthread_should_stop();
}
Il centro della funzione indica "nell'improbabile caso in cui la corrente si sta congelando, chiedere al frigorifero se il congelamento si è effettivamente verificato". Il dottor Seuss non avrebbe potuto scriverlo meglio.
Leggibile è bellissimo .
C è trasparente
A meno che un'istruzione C includa una chiamata di funzione, in genere è possibile avere un'ottima idea del costo di runtime e degli effetti collaterali. C dà al programmatore il controllo e alla fine si fida di lui o lei per fare la cosa giusta. Possiamo avere un quadro di ciò che accade quando questo frammento (leggermente riformattato per SE) esce dall'implementazione strlen()
nella libreria GNU C, perché ogni operatore ha una semantica ben definita. Non c'è sovraccarico in C.
for (char_ptr = str; ((unsigned long int) char_ptr & (sizeof (longword) - 1)) != 0;
++char_ptr)
if (*char_ptr == '\0')
return char_ptr - str;
Ai fini di "ottimizzabilità", questa proprietà è eccezionale. Probabilmente, alcuni linguaggi di livello superiore rendono più semplice l'espressione concisa di algoritmi di livello superiore (come C ++ con classi e sovraccarico), ma ai fini C è stato progettato per - agendo come un assemblatore portatile - C è l'ideale. A volte, dopo aver eseguito con successo il codice di basso livello, un programmatore potrebbe sentirsi un tutt'uno con la macchina, in un certo senso (o zero - è un dettaglio di implementazione). Questo non vuol dire che altre lingue siano cattive, non abbastanza "zen" o qualcosa di così sciocco, solo che l'IMO C può essere interessante in modi in cui molte altre lingue hanno scelto di non esserlo, per molte valide ragioni.
A mio avviso, i tre punti presentati sopra rendono gestibile la creazione di sistemi complessi, ma efficienti, incarnati nella mia mente da Linux. Trovo che questo mondo faccia appello alla mia sensibilità estetica e consiglierei a chiunque consideri C il suo prossimo obiettivo di considerare questi punti. Ritengo che gli argomenti sui sistemi operativi e quant'altro siano meglio supportati affermandoli esplicitamente perché non è certo necessario comprendere i kernel per essere un programmatore di successo, ma si potrebbero trovare questi campi convincenti soggettivamente.