Está en la página 1de 8

Sistemas Operativos Laboratorio N° 02 – Introducción al lenguaje C

Introducción al lenguaje C
Objetivos

1. Comprender y usar el lenguaje de programación C.


2. Aprender a emplear de manera básica el GCC (GNU compile colection)
para codificar y compilar programas en C.
3. Codificar aplicaciones en C haciendo esta herramienta.

Introducción al GCC

Elementos necesarios
Existen muchas herramientas de compilación; sin embargo, a lo largo del
laboratorio se va a hacer uso de GCC, el cual es el compilador por excelencia
para Linux. Para compilar un programa se necesitan 3 elementos
principalmente. En nuestro caso:

1. PC con un sistema operativo: puede ser cualquier sistema operativo, pero


para desarrollo, el sistema operativo por excelencia siempre va a ser
Linux.
2. Un compilador: las versiones de Linux suelen venir con el compilador gcc;
en el caso de Windows, es necesario descargarlo, existen dos que pueden
ser útiles: el Cygwin y el MinGW.
3. Un Editor de textos o entorno de desarrollo (IDE): existen muchos tanto
en modo texto (vi, emacs, vim, etc) como en modo grafico (codeblocks,
qtcreator, eclipse, devc++, visual studio code, etc.).

Proceso de compilación de aplicaciones


La siguiente figura muestra el proceso que se sigue generalmente para codificar
y compilar una aplicación un programa.

Ing. Carlos Enrique Chinga Ramos 1


Sistemas Operativos Laboratorio N° 02 – Introducción al lenguaje C

Figura 1. Proceso de compilación.

Actividad 1

Tome como base el tutorial How to Compile and Run a C Program on Ubuntu


Linux. A continuación se muestra el código C que alli se muestra:

#include <stdio.h>

main() {
printf("Hello World\n");
return 0;
}

Codifique el programa, guardelo como hello.c. Ahora realizar el primer commit


y suba a github el archivo fuente, luego, compilelo y ejecutelo empleando los
siguientes comandos:

gcc -o hello hello.c


./hello

Finalmente borre el archivo ejecutable hello:

rm hello

Comprendiendo los comandos anteriormente vistos


Como lo pudo notar en el caso anterior, se generó un ejecutable a partir de un
archivo fuente. Vamos a tratar con un poco mas de detalle esta y otra forma de
llevar a cado este proceso:

Ing. Carlos Enrique Chinga Ramos 2


Sistemas Operativos Laboratorio N° 02 – Introducción al lenguaje C

1. Generando el ejecutable en un solo paso

gcc archivoFuente –o nombreEjecutable -Wall

Dónde:

 archivoFuente: Archivo de extensión .c que será compilado y enlazado.


 nombreEjecutable: Nombre del ejecutable generado tras la ejecución
del comando.
 -Wall: Esta opción activa todos las advertencias más comunes ¡se
recomienda usar siempre esta opción!. Por defecto GCC no produce
advertencias a menos que estén activadas. Las advertencias del
compilador son una ayuda esencial detectando problemas al programar
en lenguaje C.

La anterior forma de uso del comando gcc, suele ser la más sencilla para
compilar y enlazar un archivo fuente (archivo .c) de modo que se genera un
ejecutable con nombre dado por nombreEjecutable.

Ejemplo: Recordando el ejemplo anterior, si queremos generar a partir de


hello.c un ejecutable llamado hello.out tenemos:

gcc hello.c -o hello.out

2. Generando el ejecutable mediante compilacion por pasos (se


eliminan los archivos intermetios)

El proceso de obtener un archivo ejecutable (entendible por la máquina) a partir


de un archivo fuente (escrito en lenguaje de programación y entendido por el
programador) involucra 4 etapas, las cuales son principalmente:

1. Pre-procesamiento.
2. Compilación.
3. Ensamblado.
4. Enlazado.

La siguiente figura tomada de GCC and Make - Compiling, Linking and Building
C/C++ Applications resume los pasos anteriormente explicados:

Ing. Carlos Enrique Chinga Ramos 3


Sistemas Operativos Laboratorio N° 02 – Introducción al lenguaje C

 
Figura 15. Resumen del proceso completo de compilación y enlazado.

La siguiente tabla resume los comandos aplicados anteriormente:

Pas
Acción Comando
o

Pre-
1
procesamiento gcc -E archivoFuente <-o archivoResultante>

2 Compilación gcc -S archivoFuente <-o archivoResultante>

3 Ensamblado gcc -c archivoFuente <-o archivoResultante>

4 Enlazado gcc archivoObjeto <-o ejecutable>

Ejemplo: Recordando el ejemplo anterior, si queremos generar a partir de


hello.c un ejecutable llamado hello.out pero queremos hacerlo por pasos
teniendo en cuenta la tabla anterior tenemos:

gcc -E hello.c
gcc -S hello.c
gcc -c hello.c
gcc hello.o -o hello.out

3. Todo en un solo paso (generando el archivo ejecutable y dejando los


archivos intermedios)

Cuando se ejecuta el comando gcc con la opción -save-temps los archivos


intermedios resultantes de cada uno de los pasos no son eliminados, la forma
como se ejecuta este comando es la siguiente:
gcc -save-temps archivoFuente <–o nombreEjecutable>

Ing. Carlos Enrique Chinga Ramos 4


Sistemas Operativos Laboratorio N° 02 – Introducción al lenguaje C

Ejemplo: Recordando el ejemplo anterior, si queremos generar a partir de


hello.c un ejecutable llamado hello.out pero queremos hacerlo en un solo paso
generando los archivos intermedios:

gcc -save-temps hello.c -o hello.out

Figura 2. Resultado del comando gcc conservando los archivos intermedios del
proceso

1. Otras opciones con el gcc A continuación mostramos algunas de las


opciones más habituales al usar gcc:

Opción Descripción

-help Indica a gcc que muestre su salida de ayuda (muy reducida).

El archivo ejecutable generado por gcc es por defecto a.out.


-o <file> Mediante este modificador, le especificamos el nombre del
ejecutable.

-Wall No omite la detección de ninguna advertencia (warning).

Incluye en el binario información necesaria para utilizar un


-g
depurador posteriormente.
-O <nivel> Indica a gcc que utilice optimizaciones en el código. Los
niveles posibles van desde 0 (no optimizar) hasta 3

Ing. Carlos Enrique Chinga Ramos 5


Sistemas Operativos Laboratorio N° 02 – Introducción al lenguaje C

Opción Descripción

(optimización máxima). Utilizar el optimizador aumenta el


tiempo de compilación, pero suele generar programas que se
ejecutan más rápido.

Sólo realiza la fase del preprocesador, no compila, ni


-E
ensambla, ni enlaza.

-S Preprocesa y compila, pero no ensambla ni enlaza.

-c Preprocesa, compila y ensambla, pero no enlaza.

Especifica un directorio adicional donde gcc debe buscar los


-I <dir>
archivos de cabecera indicados en el código fuente.

Especifica un directorio adicional donde gcc debe buscar las


-L <dir>
librerías necesarias en el proceso de enlazado.

- Especifica el nombre de una librería adicional que deberá ser


l<library> utilizada en el proceso de enlazado.
Ejemplo: Recordando el ejemplo anterior, si queremos generar a partir de
hello.c un ejecutable llamado hello.out pero hagamos uso de alguna de las
opciones mas comunes

gcc -Wall hello.c -o hello.out

La colección completa de modificadores a utilizar con gcc se encuentra en su


página de manual, man gcc, o también si esta muy embalado puede llamar a
nuestro santo favorito google.

Actividad 2 - Reforzando los conceptos anteriormente vistos

1. Compilando una primera aplicación: En el editor de textos codifique el


siguiente código fuente:

#include <stdio.h>

int main()
{
printf( "Sr. Carlos, Bienvenidos!!!\n" )
return 0;
}

2. Guarde el archivo fuente en una ruta adecuada (por ejemplo, la carpeta


de trabajo actual asociada al codigo descargado del git) con el nombre
de hola_mundo.c

Ing. Carlos Enrique Chinga Ramos 6


Sistemas Operativos Laboratorio N° 02 – Introducción al lenguaje C

3. Compile el programa usando GCC y los parámetros adecuados para


generar un ejecutable llamado ejecutable.
4. Si hay errores, volver al código y corregirlos. De lo contrario ejecute el
programa.

Nota: Para los puntos 2 y 3 cree un arhivo de texto y consigne alli las
explicaciones de las preguntas que se hacen.

2. Investigue Análisis de código: En el siguiente video se explica el paso


de parametros por linea de comandos.

#include "stdio.h"
#include "string.h"

// Codigo tomado de: http://bluefever.net/Downloads/BeginC/ch51.c

int main(int argc, char *argv[]) {


printf("\nmain() : argc : %d \n", argc);
int index = 0;
for(index = 0; index < argc; ++index) {
// printf("main() : argv[%d] : %s\n",index,argv[index]);
if( strncmp( argv[index], "debug", 5) == 0 ) {
printf("main() : PROGRAM DEBUG MODE\n");
} else if ( strncmp( argv[index], "-file", 5) == 0 ) {
printf("main() : PROGRAM READ FILENAME : %s\n", argv[index + 1]);
}
}
printf("\nmain(): Program Quit\n");
return 0;
}

Responda las siguientes preguntas en el archivo de texto:

 ¿Que hacen los parametros argc y argv?

3. Análisis de código: Codifique el siguiente archivo fuente:

#include <stdio.h>
#include <stdlib.h>
#define N 20

int edad_en_meses(int);

int main(int argc, char *argv[])


{
int edad = atoi(argv[1]);
int meses = edad_en_meses(edad);
printf("Edad %d \n", meses);
return 0;
}

int edad_en_meses(int anios){


int mes = anios * 12;
return mes;

Ing. Carlos Enrique Chinga Ramos 7


Sistemas Operativos Laboratorio N° 02 – Introducción al lenguaje C

3. Responda las siguientes preguntas:

 ¿Que hace la funcion atoi?


 Ademas de atoi existen otras funciones que permitan convertir cadenas
de caracteres a numeros reales ¿cuales?
 Existen funciones que convierten valores numericos a cadenas de
caracteres ¿cuales?

Ing. Carlos Enrique Chinga Ramos 8

También podría gustarte