Anche qui andrò contro il limite e cercherò di creare un caso estetico (leggermente umoristico) per C. Mentre alcuni potrebbero chiamarlo "brutto" per ragioni diverse, come la mancanza di costrutti di livello superiore come le classi o la sua dipendenza dai puntatori, trovo che non è il caso di me .
TL; DR : A mio parere, C è semplice, buona C è leggibile e c'è una certa gioia da trovare nei bit "bang".
C è semplice
Lo standard C definisce solo alcuni tipi e meccanismi di base per creare funzioni, puntatori e array al di fuori di essi. Oltre a ciò, c'è un piccolo numero di costrutti di composizione per rendere i tipi più complessi fuori dalle primitive (come le strutture e i sindacati).
Notate 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 molti linguaggi di livello superiore, sarebbe difficile trovare un sacco di simboli strani e incomprensibili in C. Nel mondo C, la funzione principale sia per l'astrazione che per la "compressione sintattica" è la funzione - semanticamente costrutto molto semplice e auto-esplicativo. Il buono stile C incoraggia la bellezza quasi poetica e leggibile. Per illustrare, proviamo a leggere il seguente snippet dal kernel di Linux. Anche senza aver compreso le strutture di dati e i dettagli di implementazione, possiamo dare un senso a 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();
}
La parte centrale della funzione indica "nell'improbabile caso che la corrente si blocchi, chiedi al frigorifero se il congelamento è effettivamente avvenuto". Dr. Seuss non avrebbe potuto scrivere meglio.
Leggibile è bello .
C è trasparente
A meno che una dichiarazione C includa una chiamata di funzione, in genere è possibile ottenere un'idea molto buona dei costi 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 ottenere un'immagine di ciò che accade quando questo frammento (leggermente riformattato per SE) dall'implementazione di strlen()
nella libreria GNU C viene eseguito, poiché 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 == '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();
}
')
return char_ptr - str;
Ai fini dell '"ottimizzazione", questa proprietà è ottima. Probabilmente, alcuni linguaggi di livello superiore rendono più facile l'espressione concisa di algoritmi di livello superiore (come C ++ con classi e sovraccarico), ma per gli scopi per cui C è stato progettato - agendo come un assemblatore portatile - C è l'ideale. A volte, dopo aver eseguito con successo un codice di basso livello, un programmatore potrebbe sentirsi uno con la macchina, in un certo senso (o zero - è un dettaglio di implementazione).
Questo non vuol dire che altri linguaggi siano cattivi, non abbastanza "zen" o qualcosa di stupido, solo che IMO C può essere interessante in modi che molte altre lingue hanno scelto di non essere, per molte valide ragioni.
A mio parere, i tre punti sopra presentati rendono gestibile la creazione di sistemi complessi ma efficienti, incorporati nella mia mente da Linux. Trovo che questo mondo faccia appello alla mia sensibilità estetica e consiglierei a chiunque consideri C come il suo prossimo obiettivo a considerare questi punti. Ritengo che le argomentazioni sui sistemi operativi e su quelle non siano supportate meglio specificandole esplicitamente perché non è necessario comprendere i kernel per essere un programmatore di successo, ma si potrebbero trovare soggettivi questi campi.