2. ¿Que es un compilador?¿Que es un compilador?
Un compilador es un programa informático que traduce un programa
escrito en un lenguaje de programación a otro lenguaje de programación,
generando un programa equivalente que la máquina será capaz de
interpretar. Usualmente el segundo lenguaje es lenguaje de máquina, pero
también puede ser un código intermedio (bytecode), o simplemente texto.
Este proceso de traducción se conoce como compilación.
Un compilador es un programa que permite traducir el código fuente de
un programa en lenguaje de alto nivel, a otro lenguaje de nivel inferior
(típicamente lenguaje de máquina). De esta manera un programador puede
diseñar un programa en un lenguaje mucho más cercano a como piensa
un ser humano, para luego compilarlo a un programa más manejable por
una computadora.
Como parte importante de este proceso de traducción, el compilador
informa a su usuario de la presencia de errores en el programa fuente.
3. Fases de la Compilacion.Fases de la Compilacion.
La primera fase consiste en escribir el código fuente en lenguaje C o C++ (archivos con
extensión .c y .h en C y .cpp y .hpp en C++). Luego se efectúa la compilación, por ejemplo con gcc
(en C) o g++ (en C++). La compilación se desarrolla en tres grandes fases.
1) El preprocesado
El compilador comienza por aplicar cada instrucción pasada al preprocesador (todas las líneas que
comienzan con #, entre estas las #define). Estas instrucciones son en realidad muy simples ya que
únicamente copian o eliminan secciones de código sin compilarlas.
Es en esta fase que las #define que se encuentran en un archivo fuente (.c o .cpp) o en un header
(.h o .hpp) son reemplazadas por código C/C+. Al final de esta etapa, no habrán instrucciones
comenzando por #.
2) La compilación
Luego, el compilador compila cada archivo fuente (.c y .cpp), es decir crea un archivo binario (.o)
para cada archivo fuente, excepto para el archivo conteniendo la función main. Esta fase
constituye la compilación propiamente dicha.
Estas dos primeras etapas son realizadas por cc cuando se utiliza gcc/g++.
3) El enlazado
Finalmente, el compilador une cada archivo .o con los archivos binarios de las librerías que son
utilizadas (archivos .a y .so bajo Linux, archivos .dll bajo Windows).
Especialmente, verifica que cada función llamada en el programa no esté solamente declarada
(esto es hecho durante la compilación) sino también implementada. También verifica que una
función no esté implementada en varios archivos .o.
Esta fase constituye la fase final para obtener un ejecutable (.exe bajo Windows, generalmente sin
extensión bajo Linux).
4. Compilador para Linux G++,GCC.Compilador para Linux G++,GCC.
G++Saltar a: navegación, búsquedaG++Saltar a: navegación, búsqueda
g++ es el alias tradicional de GNU C++, un conjunto gratuito deg++ es el alias tradicional de GNU C++, un conjunto gratuito de
compiladores de C++. Forma parte del GCC, GNU Compiler Collection (delcompiladores de C++. Forma parte del GCC, GNU Compiler Collection (del
inglés, colección de compiladores GNU).inglés, colección de compiladores GNU).
En sistemas operativos GNU, gcc es el comando usado para ejecutar elEn sistemas operativos GNU, gcc es el comando usado para ejecutar el
compilador de C, mientras que g++ ejecuta el compilador de C++.compilador de C, mientras que g++ ejecuta el compilador de C++.
GCC: es un compilador integrado del proyecto GNU para C, C++, ObjectiveGCC: es un compilador integrado del proyecto GNU para C, C++, Objective
C y Fortran; es capaz de recibir un programa fuente en cualquiera de estosC y Fortran; es capaz de recibir un programa fuente en cualquiera de estos
lenguajes y generar un programa ejecutable binario en el lenguaje de lalenguajes y generar un programa ejecutable binario en el lenguaje de la
máquina donde ha de correr.máquina donde ha de correr.
La sigla GCC significa "GNU Compiler Collection". OriginalmenteLa sigla GCC significa "GNU Compiler Collection". Originalmente
significaba "GNU C Compiler"; todavía se usa GCC para designar unasignificaba "GNU C Compiler"; todavía se usa GCC para designar una
compilación en C. G++ refiere a una compilación en C++.compilación en C. G++ refiere a una compilación en C++.
5. Grandes Etapas para escribir un programa en C.Grandes Etapas para escribir un programa en C.
Escribir el código fuenteEscribir el código fuente
Un simple bloc de notas puede ser suficiente, por ejemplo podemos escribir en el fichero plop.c:Un simple bloc de notas puede ser suficiente, por ejemplo podemos escribir en el fichero plop.c:
#include <stdio.h>#include <stdio.h>
int main(){int main(){
printf("plop !n");printf("plop !n");
return 0;return 0;
}}
CompilarCompilar
Bajo Linux llamamos directamente a gcc (-W y –Wall permiten mostrar más mensajes para verificar si elBajo Linux llamamos directamente a gcc (-W y –Wall permiten mostrar más mensajes para verificar si el
código es “limpio”, -o plop.exe indica que el ejecutable que será creado debe llamarse plop.exe):código es “limpio”, -o plop.exe indica que el ejecutable que será creado debe llamarse plop.exe):
gcc -W -Wall -o plop.exe plop.cgcc -W -Wall -o plop.exe plop.c
Implícitamente el compilador hace las tres etapas descritas anteriormente.Implícitamente el compilador hace las tres etapas descritas anteriormente.
1) El preprocesado1) El preprocesado
/* Todo lo que es definido por <stdio.h>, incluyendo printf() *//* Todo lo que es definido por <stdio.h>, incluyendo printf() */
int main(){int main(){
printf("plop !n");printf("plop !n");
return 0;return 0;
}}
2) Compilación (encuentra sin problemas printf ya que éste es declarado en <stdio.h>)2) Compilación (encuentra sin problemas printf ya que éste es declarado en <stdio.h>)
6. 3) Enlazado (encuentra sin problemas printf en el binario de la lib c). También lo podemos verificar bajo3) Enlazado (encuentra sin problemas printf en el binario de la lib c). También lo podemos verificar bajo
Linux con ldd:Linux con ldd:
ldd plop.exeldd plop.exe
Lo que da:Lo que da:
linux-gate.so.1 => (0xb7f2b000)linux-gate.so.1 => (0xb7f2b000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7dbb000) /lib/ld-linux.so.2(0xb7f2c000)libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7dbb000) /lib/ld-linux.so.2(0xb7f2c000)
En la segunda línea podemos ver que utiliza la lib c. luego crea plop.exe. Por otra parte comprobamos queEn la segunda línea podemos ver que utiliza la lib c. luego crea plop.exe. Por otra parte comprobamos que
no hay error ni warning.no hay error ni warning.
EjecuciónEjecución
Tan solo queda ejecutarlo:Tan solo queda ejecutarlo:
./plop.exe./plop.exe
Lo que da como esperado:Lo que da como esperado:
plop!plop!
Si algún error se produce aquí (error de segmentación, falta de memoria, etc.), por lo general habrá queSi algún error se produce aquí (error de segmentación, falta de memoria, etc.), por lo general habrá que
recurrir a un depurador (por ejemplo gdb o ddd), revisar el código fuente, etc. En todos los casos, no serárecurrir a un depurador (por ejemplo gdb o ddd), revisar el código fuente, etc. En todos los casos, no será
un problema de compilación.un problema de compilación.
Articulo relacionado: error de segmentaciónArticulo relacionado: error de segmentación
Atención: Bajo Windows existen dos métodos para ejecutar un programa:Atención: Bajo Windows existen dos métodos para ejecutar un programa:
Método 1: podemos ejecutar un programa a través de los comando ms-dos (haciendo clic en Inicio /Método 1: podemos ejecutar un programa a través de los comando ms-dos (haciendo clic en Inicio /
Ejecutar y escribir “cmd”). Con el comando cd nos colocamos en el directorio y ejecutamos el programa.Ejecutar y escribir “cmd”). Con el comando cd nos colocamos en el directorio y ejecutamos el programa.
En este caso todo ira bien.En este caso todo ira bien.
Método 2: Si ejecutamos el programa desde el explorador, no podremos ver el programa a menos queMétodo 2: Si ejecutamos el programa desde el explorador, no podremos ver el programa a menos que
pongamos una pausa justo antes del final del programa.pongamos una pausa justo antes del final del programa.
#include <stdio.h>#include <stdio.h>
int main(){int main(){
printf("plop !n");printf("plop !n");
getchar(); /* el programa se detiene a menos que presionemos una tecla */getchar(); /* el programa se detiene a menos que presionemos una tecla */
return 0;return 0;
}}
7. Instalacion de un Compilador.
Bajo LinuxBajo Linux
En general se utiliza gcc y g++. Para instalarlo se utiliza su gestor de paquetesEn general se utiliza gcc y g++. Para instalarlo se utiliza su gestor de paquetes
habitual. Por ejemplo bajo Debian (o cualquier distribución basada en debian)habitual. Por ejemplo bajo Debian (o cualquier distribución basada en debian)
basta con escribir como root o con un sudo:basta con escribir como root o con un sudo:
aptitude updateaptitude update
aptitude safe-upgradeaptitude safe-upgrade
aptitude install gcc g++aptitude install gcc g++
Del mismo modo podemos instalar un entrono de desarrollo como por ejemploDel mismo modo podemos instalar un entrono de desarrollo como por ejemplo
kdevelop (bajo KDE) o anjuta (bajo gnome).kdevelop (bajo KDE) o anjuta (bajo gnome).