Antes de empezar, permítanme defender el título algo escandaloso de este artículo con una analogía: Puedes hacer tu propio pan con una mezcla pre-empacada, una máquina de pan y un poco de electricidad, o puedes armar los ingredientes crudos, un tazón para mezclar, una cuchara robusta, una cuchilla para amasar, encender el horno y hacer un poco de cardio a través del amasado. Si lo que buscas es pan fresco, la máquina te lleva hasta allí.
Pero si se quiere entender el proceso subyacente y tener más opciones cuando se trata del producto final, hay que poner el esfuerzo del método manual. Esto es muy parecido a abordar el lenguaje de programación C: Tienes que cavar en la harina y empolvarte las manos, pero terminas entendiendo el proceso a un nivel íntimo.
Primero, distingamos entre alguien que quiere aprender cualquier lenguaje de programación (el tipo que sólo quiere el pan) y alguien que desea ser un programador políglota (el panadero artesano). No me malinterprete, hay muchas buenas razones para aprender un lenguaje de programación, e incluso si sólo se aprende un lenguaje de programación de nivel superior como Python o JavaScript, se sigue siendo un programador. Dominar un solo lenguaje sigue siendo un desafío y un objetivo digno.
Sin embargo, el programador al que me dirijo aquí es alguien que quiere entender la programación a un nivel más profundo sólo por el bien de la programación. Es alguien que naturalmente tiene el deseo de convertirse en ese programador políglota.
Originalmente, quería titular este artículo «Por qué todo programador debe aprender primero el C», pero me alejé de eso. Claro que hay ventajas en aprender primero el C; no te dejas seducir por un lenguaje como el de Python y no vuelves nunca más. De hecho, si estuviera enseñando a estudiantes de secundaria, casi seguro que les enseñaría primero un lenguaje de nivel superior como el pitón. Luego tomaría a mis mejores estudiantes y les enseñaría el lenguaje de programación C en segundo lugar. Si estuviera enseñando a una clase de ingenieros eléctricos, probablemente empezaría con C. Afrontémoslo, si aprendieran las ecuaciones de Maxwell, una pequeña indicación indirecta no va a inducir mucha angustia.
Sin embargo, creo que hay ventajas en aprender primero el prgoramming C sobre C++ o Java. Cuando trabajas en lenguajes como Java, C# e incluso Python, inmediatamente empiezas a alejarte del aprendizaje de los fundamentos de un lenguaje de programación y empiezas a aprender las bibliotecas y marcos asociados. Pero con C recibes unas cuantas llamadas a la biblioteca, te mantienes centrado en la semántica del lenguaje durante más tiempo, y C a menudo te obliga a pensar más y más profundamente en lo que está pasando bajo el capó.
La C es un lenguaje de nivel medio. Cuando la gente hable de ello, escuchará frases como «codificar al metal» o «codificar cerca del cable». El C es el lenguaje de los compiladores, intérpretes, editores, sistemas operativos y programación integrada. Cuando aprendes a programar en C casi tienes que entender cómo se ejecutan los programas. Sabes lo que significan cosas como el registro, la pila, el montón y la memoria mapeada IO. Empiezas a pensar cuánto mejor habría sido la vida si hubieras nacido con dieciséis dedos.
El código C es simple, elegante y rápido, es compacto y eficiente. Debido a que C tiene punteros crudos, operadores de bits, y las palabras clave: externo, volátil, estático y de registro, significa que entenderás más sobre la escritura de un código eficiente que lo que puedes deducir de cualquier lenguaje de nivel superior. Lo único que te enseñará mejor estas cosas es un lenguaje de bajo nivel, y con los procesadores modernos no le desearía ensamblador a nadie.
La sintaxis C es la razón por la que los programadores hablan de la «Familia de Lenguas C», que generalmente incluye lenguas como: C, C++, C#, Java, EcmaScript (alias JavaScript), Objective-C y muchos otros. Los wikipedialistas son muchos más, pero creo que su lista es un poco chiflada.
C también resulta ser exigente, fastidioso, quisquilloso y a veces totalmente críptico. Puedes escribir fácilmente código difícil de leer, difícil de mantener en C. Pero, y este es un punto clave, no tienes que hacerlo. Aprender a escribir código mantenible en C requerirá (y esperamos que inculque) disciplina de codificación. En la mayoría de los idiomas, corregir errores de sintaxis puede rayar en lo trivial. Por ejemplo, los mensajes de error del compilador de Ada son tan buenos que bien podría haber arreglado el código por ti. Encontrar y corregir un punto y coma faltante o adicional en C puede ser a veces una tarea épica.
La C no es un lenguaje orientado a objetos para que no te distraigas con cosas como la herencia y el polimorfismo. No estoy diciendo que no sean conceptos importantes, es sólo que puedes simplificar las cosas un poco aprendiendo primero la programación de procedimientos. De hecho, una vez que has aprendido C, y escrito un par de programas incrustados en algunos ordenadores monoplaca, aprender C++ es el siguiente paso natural. Tendrás que conseguir que alguien te saque los dedos de las macros y las directivas del preprocesador, pero aparte de eso será sencillo. Estaría tentado a enseñar cómo codificar en C con un compilador de C++, y sólo destacaría las pocas diferencias que no son compatibles con un estricto compilador de C.