Lenguaje C: introducción y caracteristicas
El lenguaje C está mayormente orientado a la escritura de sistemas operativos, aunque se trata de un lenguaje de medio nivel de propósitos generales, por lo que puede ser utilizado para programar casi cualquier tipo de tareas.
C es un lenguaje estructurado, no orientado a objetos, pero C++ es la modificación de C que permite la incorporación de clases, métodos y atributos, encapsulación y polimorfismo, y respeta toda la sintaxis de C, por lo que programadores de C que deseen incursionar en la programación orientada a objetos podrán hacerlo sin problemas, más que un cambio de «paradigma mental» a la hora de diseñar el código.
Los objetivos del lenguaje C
Con la cantidad de lenguajes que disponemos actualmente, muchos se pensarán que el lenguaje C es obsoleto, y muy «duro» para trabajarlo comparado con otros lenguajes más amigables con el programador.
Esto no es del todo cierto. Si bien C tiene una curva de aprendizaje más lenta, quien programa en C tiene un campo enorme de posibilidades, que van desde programas simples de gestión, comandos del sistema operativo, funcionalidades nuevas, hasta módulos del kernel y controladores de dispositivos.
El lenguaje C es el lenguaje utilizado para la programación de sistemas, o software de base, con lo que podemos afirmar que casi la totalidad del código fuente de muchos sistemas operativos está escrito, sin duda, en C. Ejemplos son Unix y derivados (*nix, como Linux), o Windows.
No es un lenguaje pensado para escribir directamente aplicaciones de gestión gráficas en forma nativa, pero sí dispone de muchísimas librerías o bibliotecas de funciones que se pueden incorporar en un código para extender su funcionalidad.
C y su biblioteca estándar
El lenguaje C posee un núcleo muy simple, una serie de muy pocas palabras reservadas, y pocos tipos nativos de datos, pero resulta un lenguaje extremadamente extensible a nuevas funcionalidades mediante definiciones de nuevos tipos de datos de usuario, incluso independiente de la arquitectura, y la suma de una gran cantidad de funciones de biblioteca estándar y bibilotecas especializadas en diferentes tareas.
Por ejemplo, un código fuente de C puede enriquecerse con bibliotecas de OpenSSL para permitirle al programador trabajar con funciones de cifrado y hash propias de la criptografía. También pueden incorporarse librerías gráficas como gtk o qt para entornos Unix/Linux, lo que permite fácilmente escribir aplicaciones gráficas de muchísima potencia.
En nuestros sistemas podremos instalar cualquier tipo de biblioteca que necesitemos, y utilizarlas dentro de nuestro código, lo que hace de C un lenguaje extremadamente flexible a la hora de cumplimentar objetivos.
Estandar ANSI: la portabilidad del fuente
Cuando hablamos de portabilidad de aplicaciones nos referimos a aplicaciones que pueden ejecutarse en varias plataformas de software de base, o, en definitiva, en varios sistemas operativos, como Unix, Linux o Windows.
Una aplicación escrita en C es portable a nivel de código fuente, es decir, podemos portar el fuente de la aplicación de un sistema a otro, y compilarla para obtener los ejecutables para dicho sistema, sin mayores modificaciones.
Por supuesto, deberemos tener instaladas las bibliotecas de desarrollo utilizadas, en el sistema operativo en el que vamos a compilar.
C no es portable a nivel de código ejecutable, lo que significa que una aplicación compilada para Linux en formato, por ejemplo, ELF de 32 bits, no podrá ser ejecutada en windows, que utiliza formatos EXE o COM. Y viceversa, un .EXE de Windows no podrá ser ejecutado en un sistema *nix.
El código fuente sí puede compilarse, y para ello es encesario, o al menos muy recomendable, que el código fuente haya sido escrito siguiendo el estándar ANSI C, ya que muchos compiladores para diferentes plataformas de sistemas operativos podrán compilarlo sin problemas, tales como GCC en Linux/Unix, o DevCpp o MinGW en Windows.
Si el código fuente no fue escrito siguiendo ANSI, seguramente solo podrá ser compilado con el compilador o IDE en el que fue programado. Tal es el caso de Borland y sus compiladores Turbo, que generalmente incitan al programador a utilizar bibliotecas propietarias que no están disponibles en otros sistemas operativos como Linux.
C y la administración de las tareas del sistema
Una de las características que tenemos en sistemas GNU/Linux es la de programar scripts para facilitarnos la administración de tareas. Esos lenguajes de scripts, si bien son muy potentes e interpretados, tales como el bash o python, no llegan a tener toda la potencia de un lenguaje compilado como C/C++.
Es por ello que quien puede programar en C podrá, además, escribir sus propias utilidades, simples o complejas, y ejecutarlas como aplicaciones gráficas o como comandos en el sistema, y de esta forma portar esas utilidades de un sistema Linux a otro y continuar utilizándolas.
Incluso podrá además empaquetar toda su aplicación en un tarball fuente, o código pre-compilado para algún repositorio de distribución, como .deb o .rpm.
Y por supuesto, también podrá licenciar su código fuente como GPL o alguna licencia libre, y compartirlo con el resto de la comunidad, y de esta forma obtener aportes retro alimentados o feedback de programadores más experimentados, lo que logrará sin duda que el código aportado crezca mucho más de lo imaginado.
C y sus posibilidades en el mundo *nix
Por si no lo sabes, el kernel Linux, y el sistema operativo GNU están casi en su totalidad escritos en C y en C++. Muchas de las aplicaciones que utilizamos todo el tiempo son códigos fuente C/C++ compilados para Linux en formato ELF, lo que significa que quien programe en C/C++ tiene muchísimas posibilidades a la hora de optimizar y personalizar en medio/bajo nivel su sistema operativo, e incluso escribir nuevos controladores, módulos y software para facilitarle la tarea de administración.
Además, y particularmente en sistemas GNU/Linux, podremos utilizar el lenguaje C del estandar ANSI C para programar diversos mecanismos de comunicación de procesos UNIX, también conocidos como IPC (Inter-Proccess Communication), lo que le permitirá al programador administrar diversas características del manejo de procesos del sistema, como ser, por ejemplo:
- Gestión de prioridades de planificación.
- Envío y recepción de señales entre procesos.
- Generación de segmentos de memoria compartida.
- Mecanismos de envío de información entre procesos mediante pipes o tuberías.
- Envío de información mediante named-pipes, o FIFOs.
- Envío de información utilizando colas de mensajes.
- Envío de información entre procesos locales mediante sockets de familia UNIX.
- Envío de información entre procesos locales o remotos mediante sockets de familia INET.
- Control de acceso a recursos mediante semáforos.
Conclusiones
Hemos hecho una introducción a la programación en C, sus características principales, principios y objetivos, y una descripción de los principales usos de C en entornos *NIX.
Próximamente estamos pensando publicar un curso sobre programación en C desde nivel inicial hasta nivel avanzado, programación *NIX y temas afines, incluidos temas de seguridad en código, como buffer olverflow y otros tópicos. Si estás interesado por favor déjanos un mensaje en juncotic.com/contacto, estamos planificando capacitaciones nuevas, y este es uno de los temas pendientes.
Quizás pueda interesarte estos artículos:
- Lenguaje C: ¿Un programa sin función main?
- Compilación en C: desde un fuente hasta un binario ejecutable
- Video en nuestro canal de youtube: Libs y headers: https://youtu.be/217zVq9LKFA
Sin mas, te dejo un saludo geek 🙂
die@tuta2:~$ echo -e "\nCompilamos la despedida... \n" ; echo -e '#include<stdio.h>\nint main(int argc, char** argv){\n\tprintf("bye! :)\\n\\n");\n\treturn 0;\n}\n' | tee /tmp/bye.c ; gcc /tmp/bye.c -o /tmp/bye && echo -e "... y la ejecutamos :D\n";/tmp/bye Compilamos la despedida... #include<stdio.h>int main(int argc, char** argv){ printf("bye! :)\n\n"); return 0;} ... y la ejecutamos :D bye! :)
Si te interesa, puedes visitar nuestro canal de youtube, periódicamente vamos publicando nuevo contenido, incluidos tópicos de programación en C: