También voy a ir contra la corriente aquí y tratar de hacer un caso estético (ligeramente humorístico) para C. Mientras que algunas personas podrían llamarlo "feo" por diferentes razones, como la falta de construcciones de alto nivel como clases o su dependencia de punteros, me parece que no es el caso para mí .
TL; DR : En mi opinión, C es simple, el buen C es legible y hay cierta alegría en golpear bits.
C es simple
El estándar C define solo unos pocos tipos y mecanismos básicos para crear funciones, punteros y matrices a partir de ellos. Además de eso, hay una pequeña cantidad de construcciones de composición para hacer tipos más complejos de las primitivas (como estructuras y uniones). Observe cómo describí la mayor parte del lenguaje en dos oraciones. Esto significa que no tiene que mantener demasiadas reglas y formas sintácticas en su cabeza mientras codifica.
Lo simple es hermoso .
C no es arcano
A diferencia de muchos lenguajes de nivel superior, sería difícil encontrar muchos símbolos extraños e ininteligibles en C. En el mundo C, la función principal para la abstracción y la "compresión sintáctica" es la función, semánticamente, muy simple y construcción autoexplicativa. El buen estilo C fomenta una belleza casi poética y legible. Para ilustrar, intentemos leer el siguiente fragmento del núcleo de Linux. Incluso sin tener conocimiento de las estructuras de datos subyacentes y los detalles de implementación, podemos tener mucho sentido de lo siguiente:
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();
}
El centro de la función dice "en el improbable caso de que la corriente se esté congelando, pregunte al refrigerador si realmente ocurrió la congelación". El Dr. Seuss no podría haberlo escrito mejor.
Legible es hermoso .
C es transparente
A menos que una instrucción C incluya una llamada de función, generalmente puede tener una muy buena idea de su costo de tiempo de ejecución y sus efectos secundarios. C le da control al programador y finalmente confía en él o ella para hacer lo correcto. Podemos tener una idea de lo que sucede cuando este fragmento (ligeramente reformateado para SE) sale de la implementación strlen()
en la biblioteca GNU C, porque cada operador tiene una semántica bien definida. No hay sobrecarga en C.
for (char_ptr = str; ((unsigned long int) char_ptr & (sizeof (longword) - 1)) != 0;
++char_ptr)
if (*char_ptr == '\0')
return char_ptr - str;
Para fines de "optimizabilidad", esta propiedad es excelente. Podría decirse que algunos lenguajes de nivel superior hacen que la expresión concisa de algoritmos de nivel superior sea más fácil (como C ++ con clases y sobrecarga), pero a los efectos de C fue diseñada para, actuando como un ensamblador portátil, C es ideal. A veces, tras la ejecución exitosa de código de bajo nivel, un programador puede sentirse uno con la máquina, en cierto sentido (o cero, es un detalle de implementación). Esto no quiere decir que otros idiomas sean malos, no lo suficientemente "zen" o algo así de tonto, solo que IMO C puede ser interesante en formas que muchos otros idiomas han elegido no ser, por muchas razones válidas.
En mi opinión, los tres puntos presentados anteriormente hacen manejable la creación de sistemas complejos, aunque eficientes, incorporados en mi mente por Linux. Me parece que este mundo atrae a mi sensibilidad estética y aconsejaría a cualquiera que considere a C como su próximo objetivo que considere estos puntos. Siento que los argumentos sobre los sistemas operativos y otras cosas están mejor respaldados al declararlos explícitamente porque ciertamente no es necesario comprender los núcleos para ser un programador exitoso, pero uno podría encontrar estos campos convincentes subjetivamente.