Programación: el compilador gcc
GNU gcc es una herramienta esencial si vas a comenzar a programar en Linux. De hecho, los ejemplos de código C que mostraré en próximos artículos de esta serie de programación los compilaré todos con gcc. Puedes usar otros compiladores o entornos IDE si lo prefieres, pero yo prefiero usar éste.
Si recuerdas un artículo previo de programación donde hablaba de las etapas, una de ellas era la compilación, es decir, traducir nuestro lenguaje de alto nivel en un binario para que la máquina en la que estamos trabajando lo pueda interpretar. Es decir, pasarlo a un formato binario con una serie de instrucciones y datos que serán almacenados en la memoria y ejecutados por la CPU. Pues bien, de eso se va a encargar gcc…
¿Qué es gcc?
Los compiladores de Unix han sido tan importantes que se han tomado como estándar para la industria del software. Aunque existen varios compiladores, el más famoso en Linux es GNU gcc (Gnu Compiler Collection). Escrito inicialmente por Richard Stallman y Leonard H. Tower.
Aunque se creó para C, admite también C++, y dispone de front-ends para lenguajes como VHDL, Java, Fortran, Ada, Pascal, Objetive-C, Go, etc. Lo interesante es que el código que genera está bastante bien optimizado, reconoce todos los estándares del lenguaje C y el ANSI C. De hecho, otros IDEs lo usan como compilador base.
Si por algo no te gusta usar el modo texto, puedes contar con IDEs con entornos gráficos basadas en gcc como Anjuta, KDevelop, Qt Creator, Eclipse, etc.
Si no usas ningún IDE, puedes usar cualquier editor de texto para escribir el código que luego compilarás con gcc. Si el editor reconoce la sintaxis del lenguaje que estás usando y resalta el texto, mucho mejor, ya que te ayudará mucho a diferenciarlo y hará la lectura algo más intuitiva para repasarlo. Por ejemplo:
nano hola.c
#include <stdio.h> int main() { printf(“Hola ArchiTecnologia\n”); return 0; }
Y luego lo compilarías como ya sabes de ejemplos anteriores de la serie de artículos de programación:
gcc -o hola hola.c
Y ya tendrías el binario para poderlo ejecutar:
./hola
Usos y parámetros básicos
Ya sabes que para más información te recomiendo o leer la documentación GNU gcc o echarle un vistazo al manual:
man gcc
No obstante, aquí te voy a mostrar algunas opciones y parámetros que usarás con mayor frecuencia. Por ejemplo, si vas a usar un estándar específico del lenguaje C, puedes indicarlo con:
#Para el estándar de 1999 gcc -std=c99 -o hola hola.c #Para el estándar 2011 gcc -std=c11 -o hola hola.c
Por cierto, si usas eso puede compilar más lento, pero mejorará el resultado del binario final. Otra de las cosas importantes, ya sabes que gcc si no le pasas un nombre con la opción -o genera un binario llamado por defecto como a.out:
gcc hola.c ./a.out
Si en vez de generar un binario quieres generar el código ensamblador correspondiente a tu código fuente, puedes usar la opción -S:
gcc -S hola.c cat hola.s
Ese fichero generado es un ASM pero por defecto lo hace en formato AT&T, si quieres especificar un formato concreto, puedes usar por ejemplo:
gcc -S -masm=att hola.c gcc -S -masm=Intel hola.c
Puedes obtener un código objeto sin enlazar con -c:
gcc -c hola.c
Si necesitas incluir bibliotecas o ficheros de cabecera (.h), puedes usar -L o -I respectivamente, para indicar las rutas donde se encuentran (en este caso en lib y proyecto/src):
gcc hola.c -Llib -o hola gcc -Iproyecto/src hola.c -o hola
Para que el compilador optimice el código, aunque eso implique una domora mayor, puedes usar la opción -O o si quieres mayor nivel de optimización -O2, etc., es decir, puedes elegir el nivel de optimización. Por ejemplo:
gcc -O -o hola hola.c gcc -O2 -o hola hola.c
Si lo que pretendes es optimizar el binario para una microarquitectura de CPU concreta o para una CPU, como por ejemplo AMD Zen, o para una familia concreta, etc., gcc tiene una serie de opciones para especificar esto. Por ejemplo:
#Para una de estas familias o tipos de CPU gcc -m486 hola.c -o hola gcc -m386 hola.c -o hola #Para una CPU concreta (anteriormente -mcpu) gcc -mtune=k8 hola.c -o hola gcc -mtune=prescott hola.c -o hola gcc -mtune=athlon-4 hola.c -o hola #Para un tipo de FPU o extensiones específicas. Por ejemplo, para SSE gcc -mfpmath=sse hola.c -o hola #También puedes combinar opciones, por ejemplo, para un nivel de optimización 3 y para AMD Zen 2 gcc -O3 -march=znver2 hola.c -o hola
En los primeros artículos de la serie de programación comenté cosas básicas sobre teoría, las etapas, etc. Ahora con estos nuevos artículos quiero dejar presentadas las herramientas, y luego ya comenzaremos a aprender lenguaje C como tal. Bueno, realmente tengo pensado algo más que eso, también veremos Bash scripting…
Pingback: Compatibilidad binaria entre sistemas *nix | ArchiTecnologia