Introducción a la programación en C y C++ con ulinux_vem 1.1

download Introducción a la programación en C y C++ con ulinux_vem 1.1

of 17

Transcript of Introducción a la programación en C y C++ con ulinux_vem 1.1

  • 8/17/2019 Introducción a la programación en C y C++ con ulinux_vem 1.1

    1/17

    Programación con microLinux_vem 1 punto 1Teoría y ejercicios prácticos

    BLOQUE Título

    1 Introducción a la programación

    Aspectos considerados

    Programación estructurada y Lenguaje C

    Fundamentos Teóricos

    Introducción

    Un PROGRAMA es un conjunto de mandatos que puede someterse, comouna unidad, a un ordenador y utilizarse para dirigir su comportamiento. Cadauno de los mandatos recibe el nombre de SENTENCIA o INSTRUCCIÓN.

    Todo programa está constituido por uno o varios algoritmos. UnALGORITMO es sencillamente un conjunto de reglas para efectuar algún cálculo.La construcción de un algoritmo debe ser lo más independiente posible de loslenguajes de programación. Para llegar a la solución (algoritmo) que resuelve unproblema, se debe pasar por varios niveles de abstracción. El nivel máximo ha deser totalmente independiente de los lenguajes de programación; en cambio, elnivel menos abstracto ha de estar orientado al lenguaje de programación que se

    utilice.

    Programación estructurada

    La programación estructurada es una técnica para diseñar programasbasada en los siguientes principios:

    ● Modularidad : Un programa puede construirse a partir de unidades lógicas,razonablemente pequeñas, que se denominan módulos (en lenguaje C,funciones).

    1

  • 8/17/2019 Introducción a la programación en C y C++ con ulinux_vem 1.1

    2/17

    ● Diseño Descendente : El diseño se hace de los general a lo particular,considerando que una determinada función está resuelta y dejando suconstrucción para un paso posterior.

    ● Teoría de la estructura : Cualquier programa puede ser diseñadoempleando sólo tres tipos de estructuras de control:

    ○ Secuencial : conjunto de acciones ejecutadas una a continuación deotra una sola vez.

    ○ Condicional : Permite ejecutar un grupo de acciones u otro,dependiendo de que se cumpla o no una condición.

    ○ Repetitiva : Ejecuta una o varias acciones un número controlado deveces.

    Los programas así diseñados serán fáciles de verificar, depurar yMantener.

    Ciclo de vida de un programa o aplicación

    Diseñar un programa no se reduce sólo a escribir un determinadoalgoritmo en algún lenguaje de programación; esto sólo se corresponde dentrodel ciclo de vida de un programa con la fase de codificación.

    La vida de un programa abarca desde el momento que se establece ladefinición del problema hasta que dicha aplicación es desechada.

    Las etapas en la vida de un programa son:

    ● Definición y enunciado.● Diseño y análisis.● Codificación.● Comprobación y depuración.● Documentación y mantenimiento.

    A continuación se describe cada una de ellas.

    DEFINICIÓN Y ENUNCIADO

    En esta fase debe definirse con claridad todo lo que atañe al problemaque se quiere resolver. Esta definición incluirá una lista completa de todos losrequisitos que se deben cumplir y se especificará la solución esperada tanto paralos datos de entrada correctos como para los incorrectos. El programa ha deresponder en todos los casos sin que se origine una finalización anormal del

    mismo.

    2

  • 8/17/2019 Introducción a la programación en C y C++ con ulinux_vem 1.1

    3/17

  • 8/17/2019 Introducción a la programación en C y C++ con ulinux_vem 1.1

    4/17

    Los programadores deben documentar el código producido por ellos. Estaúltima documentación consiste en colocar los comentarios que sean precisosentre las líneas de código.

    Los programas no son entes estáticos, sino que deben ser revisados yactualizados constantemente porque se descubren nuevos errores, se modificaalguna especificación, se cambia de ordenador, etc. La fase en la cual seefectúan estas modificaciones posteriores se denomina mantenimiento. Unabuena documentación facilita el mantenimiento de los programas de formaclara, sistemática y legible, la etapa de mantenimiento puede ser muy difícil,incluso imposible.

    Si se descubren errores en las fases anteriores, se tendrá que empezar denuevo desde la etapa correspondiente. La fase de mantenimiento implicará, enmuchos casos, repetir varias de las etapas anteriores, según se trate de cambiosen la especificación, sustitución de un algoritmo por otro considerado mejor uotros motivos.

    Lenguajes de programación

    A la hora de describir al ordenador como resolver un problema, esnecesario formalizarlo adecuadamente para que pueda entenderlo. Estaformalización se realiza a través de un lenguaje de programación.

    Se entiende por LENGUAJE DE PROGRAMACIÓN la notación para ladescripción precisa de algoritmos o programas informáticos. Los lenguajes deprogramación definen de forma estricta la sintaxis y la semántica.

    Existen cinco generaciones de lenguajes de programación:

    PRIMERA GENERACIÓN

    Está formada por los siguientes lenguajes: binario, máquina, ensambladory macroensamblador. El alfabeto del lenguaje binario es el 0 y el 1, es decir,cada instrucción se corresponde con una determinada configuración de ceros yunos. A partir del lenguaje máquina, las instrucciones (mandatos) se representanmediante identificadores que están compuestos de caracteres alfanuméricos;estos lenguajes necesitan de un traductor para transformar los programas allenguaje binario. A estos lenguajes también se les llama lenguajes de bajo nivel.

    SEGUNDA GENERACIÓN

    La componen los siguientes lenguajes: FORTRAN, COBOL, ALGOL y BASIC.También llamados lenguajes de alto nivel y de programación clásica. Loslenguajes de esta generación se pueden dividir en dos amplias categorías:

    científicos y de gestión.

    4

  • 8/17/2019 Introducción a la programación en C y C++ con ulinux_vem 1.1

    5/17

  • 8/17/2019 Introducción a la programación en C y C++ con ulinux_vem 1.1

    6/17

    Si el lenguaje fuente es de alto nivel (como FORTRAN, BASIC o Pascal) y el

    lenguaje objeto es un lenguaje de bajo nivel (como ensamblador o lenguajemáquina), el traductor correspondiente se llama compilador . El compilador

    toma como entrada las instrucciones del lenguaje fuente y genera como salidainstrucciones del lenguaje objeto; éste puede ser binario o máquina.

    El intérprete a medida que traduce cada instrucción la ejecuta sobre losdatos que le corresponden (cero o más de un conjunto de datos). Cuando haterminado de ejecutar esa instrucción de alto nivel, repite el mismo proceso conla siguiente instrucción. De esa manera va avanzando hasta que se hayaejecutado todo el programa de alto nivel según los datos de partida. Elintérprete es, en general, más pequeño que un compilador; pero el tiempo quetarda en traducir y ejecutar un programa fuente es más grande que el empleadopor el compilador. Cuando se interpreta un bucle de instrucciones, éstas setraducen y ejecutan tantas veces como se repite el bucle.

    Cuando el lenguaje fuente es ensamblador y el lenguaje objeto es códigode máquina, entonces el traductor se llama ensamblador.

    Si, por ejemplo, un compilador puede ejecutarse en un procesador (INTEL80486) y producir código para otro procesador (MOTOROLA 68040), entonces sehabla de un compilador cruzado.

    El lenguaje de programación CC es un lenguaje de programación de propósito general que ofrece como

    ventajas economía de expresión, control de flujo y un rico conjunto deoperadores. Ha sido estrechamente asociado con el Sistema Operativo UNIXpuesto que tanto el propio SO como los programas que corren en él estánescritos en C. Sin embargo, este lenguaje no está ligado a ningún sistemaoperativo en particular ni a ninguna equipo informático.

    C a demostrado ser un lenguaje agradable, expresivo y versátil para unaamplia variedad de programas. Es fácil de aprender y se obtienen mejoresresultado a medida que aumenta la experiencia con él.

    Obtención de un programa en lenguaje C

    Para la creación de un programa informático que pueda ejecutarse en elordenador (binario), deben suceder varias etapas:

    ● Generación del programa en código fuente (“ .c ” )● Compilación, obtención del módulo objeto (“ .o ”)

    ● Linkado.

    6

  • 8/17/2019 Introducción a la programación en C y C++ con ulinux_vem 1.1

    7/17

    Una vez concluido este proceso, el fichero generado puede ser ejecutadopor el PC de forma autónoma generalmente.

    GENERACIÓN DEL PROGRAMA EN CÓDIGO FUENTE

    El primer paso consiste en el diseño de un fichero de texto (obtenido apartir de un editor “ ASCII”, es decir, que no incorpore caracteres de control,por ejemplo el editor ‘vi ’) que contendrá un número determinado de sentencias(instrucciones propias del lenguaje C): estructuras de control, órdenes deentrada y salida, etc. En un formato legible por el programador y que debencumplir las reglas marcadas por el compilador (como la sintaxis).

    Una vez finalizado el fichero con extensión “ .c ” (regla no obligatoriaaunque establecida convencionalmente por los programadores para señalar unfichero fuente escrito para este lenguaje) hay que proceder a su compilación.

    COMPILACIÓN

    Esto es, convertir el fichero para que sea comprensible al ordenador(módulo objeto).

    Generalmente el compilador realiza dos “pasadas” sobre el fichero detexto. En la primera buscará aquellas instrucciones dirigidas al propiocompilador y que no pertenecen al lenguaje de programación en sí. La misión deestas pseudoinstrucciones (denominadas directivas o instrucciones del

    preprocesador) es la de realizar un tratamiento determinado sobre el contenidodel fichero, por ejemplo la directiva:

    # include

    Manda al preprocesador que la información del archivo que la acompaña(“ .h ” inicial de “ header ” representa un fichero cabecera que guardainformación sobre las funciones contenidas en la biblioteca de C) sea incluida enel propio fichero fuente.

    LINKADO

    Durante la fase de reubicado o linkado el enlazador ( linker ) recorre elmódulo objeto con el fin de encontrar las funciones de la biblioteca que se handeclarado al compilador con la directiva correspondiente pero se encuentranpendientes de incorporarse. A partir de este momento las añade, ya compiladas,en el lugar donde han sido realizadas las llamadas.

    El enlazador es una herramienta que combina el programa de usuario conlas funciones requeridas de la biblioteca. Dichas funciones son de formatoreubicable. Esto significa que dichas funciones no definen las direcciones

    absolutas de la memoria para las diversas instrucciones en código máquina,

    7

  • 8/17/2019 Introducción a la programación en C y C++ con ulinux_vem 1.1

    8/17

    sino que mantienen la información de los desplazamientos relativos a la posiciónfinal que ocupe en la memoria del programa donde se inserte.

    Ejercicios Propuestos1. Usando la distribuciónmicrolinux_vem 1.0, escribe con el editor ‘ vi ’,

    dentro del archivo “ /home/root/hola.c ”, el siguiente código fuente deun programa basado en el lenguaje de programación C:

    /* Mi primer programa en C */#include int main (void){

    printf(“Hola Mundo. Este es mi primer programa escrito en lenguajeC…\n”);return(0);

    }

    2. Una vez comprobada la correcta edición del archivo, pasa a compilar elprograma con el fin de convertirlo en ejecutable por medio de esta orden:

    # tcc -o hola hola.c

    Nota: Si el proceso de compilación produjo algún tipo de mensaje de error, compruebael archivo fuente y corrige las diferencias sobre el texto propuesto. A continuación repiteel proceso de compilado.

    3. Comprueba ahora la existencia del programahola y su propiedad deejecutable con la orden ‘ # ls -l ’.

    4. Llama al programa por el procedimiento habitual (‘ #./hola ’ ) y comparala acción que realiza con el código fuente escrito en el primer apartado.

    5. Repite los apartados 1, 2, 3 y 4 con el código fuente propuesto del archivo“ /home/root/cuadradoYcubo.c ”:

    /* Calcula el cuadrado y el cubo de un valor propuesto por el usuario */#include

    int cuadrado(int a);int cubo(int b);

    int main(void){

    int cantidad;

    printf(“\nEscriba un valor decimal: ”);scanf(“%d”, &cantidad);

    printf(“\nEl cuadrado es: %d”, cuadrado(cantidad));printf(“\nEl cubo es: %d\n\n”, cubo(cantidad));

    8

    http://www.educa2.madrid.org/web/educamadrid/principal/files/26e8ee68-b235-4616-8c49-c1ec907a4d49/uLinux1vem_portable.zip

  • 8/17/2019 Introducción a la programación en C y C++ con ulinux_vem 1.1

    9/17

    return(0);

    };

    int cuadrado(int a)

    { return a*a;};

    int cubo(int b){

    return b*b*b;};

    Bloque Título

    2 Aplicaciones de usuario. Compiladores I

    Aspectos considerados

    Compilador TCC ( Tiny C Compiler )

    Fundamentos Teóricos

    Introducción

    TinyCC (también conocido como TCC) es un pequeño pero muy rápidocompilador de programas escritos en el lenguaje de programación C. TCC no solosoporta ANSI C, sino también el nuevo estándar ISO C99 y las extensiones GNUCincluyendo el ensamblador en línea.

    TCC puede ser usado para hacerscripts en C.

    Aunque TCC permite trabajar con las librerías estándar (“ stdio.h ” ,“ stdlib.h ” , etcétera) la versión disponible en micro LINUX_vem requiere el usode un único fichero de cabecera: que reúne las funciones estándarmás comunes.

    En esta distribución están incluidos un extenso grupo de programasescritos en C para demostrar la versatilidad de este compilador, además seacompañan, en forma de comentario de texto, los ficheros de cabecera “ .h ”

    9

  • 8/17/2019 Introducción a la programación en C y C++ con ulinux_vem 1.1

    10/17

    necesarios para compilar estos fuentes en otros compiladores que admitan ANSIC.

    Invocación desde la línea de comandos

    Para la llamada al compilador usaremos la orden:

    # tcc [opciones] [f1_c f2_2 ...] [-run fic_c argumentos ...]

    Donde las opciones más generales son:

    ● -v : Muestra la versión actual de TCC.● -c : Genera un fichero objeto (también debe indicarse la opción

    -o ).● -o nombre_fichero : Convierte el fichero objeto .o en ejecutable(binario) llamado “ nombre_fichero ”.● -r : Genera un fichero objeto combinando todos los ficheros de

    entrada.

    Ejemplos en el uso de TCC:

    # tcc -c f1.c

  • 8/17/2019 Introducción a la programación en C y C++ con ulinux_vem 1.1

    11/17

    A. Poseer permisos de ejecución (si fuera necesario usaremos ‘ # chmod +xbinario ’).

    B. Llamar al fichero con la expresión ‘ # ./nombre_del_ejecutable ’.

    Scripts en C

    TCC puede ser invocado desde unscript , de igual forma que un script deshell. Solo es necesario añadir la cadena “ #! /usr/local/bin/tcc -run ” parainiciar la ejecución del código C.

    Observa el contenido del archivo “/home/todos/lenguajeC/ex1.c ”:

    #! /usr/local/bin/tcc -run#include

    int main(){

    printf("Hello world\n") ;return 0 ;

    }

    Si consultamos los permisos del archivo antes de su ejecución

    obtendremos la siguiente respuesta:#cd /home/todos/lenguajeC #ls -l ex1.c-rwxr-xr-x 1 alumno 100 107 Oct 5 2003 ex1.c #./ex1.cHello world#

    Tal y como se indicó anteriormente aparecen los permisos de ejecución yen la llamada se utilizó el prefijo “ ./ ”.

    Ejercicios Propuestos1. Edita y ejecuta el script C mostrado al final de la actividad.

    Nota: el fichero no funcionará correctamente si tiene extensión .sh .

    2. Dirígete al directorio “ /usr/src ” y desde allí buscar algún fichero fuentepara compilar y ejecutarlo posteriormente.

    11

  • 8/17/2019 Introducción a la programación en C y C++ con ulinux_vem 1.1

    12/17

    3. Lee la información del compilador TCC ejecutando ‘ # ayuda.sh tcc ’.

    Bloque Título

    3 Aplicaciones de usuario. Compiladores II

    Aspectos considerados

    Compilador GCC ( the GNU Compiler Collection ). Automatización del proceso de

    compilación con Make.

    Fundamentos Teóricos

    Introducción a GCC

    El compilador GNU C Compiler (GCC) fue inicialmente desarrollado porRichard Stallman quien fundó en 1984 el proyecto GNU con el fin de crear unsistema operativo tipo Unix ® en forma de free software ( software libre) parapromover la libertad y cooperación entre los usuarios y programadores decomputadores.

    Desde entonces, GCC ha crecido hasta soportar muchos lenguajes deprogramación tales como C++, Objetive‐C, Java, Fortran y Ada. De hecho, hoy endía se conoce como “GNUCompiler Collection ”.

    No solamente encontraremos GCC en sistemas operativos basados en Linuxsi no también en otras plataformas para las que ya existe la versióncorrespondiente como SO Windows ® (MinGW y Cygwin) o en OS X ® de Apple ©.Además, disponemos de la posibilidad de compilar un programa para unaplataforma distinta a la que se encuentra el propio programa (compiladorcruzado); como los incluidos (compiladores propietarios ) en la distribuciónmicroLINUX_vem2rev2 , ya que incluye herramientas para compilar códigodestinado a ser ejecutado dentro de un dispositivo microcontrolador (AVR o PIC).Es decir, un ordenador integrado en un chip .

    Obtendremos ayuda sobre el compilador escribiendo ‘ # gcc --help ’.

    Compilando programas en lenguaje C y C++

    12

  • 8/17/2019 Introducción a la programación en C y C++ con ulinux_vem 1.1

    13/17

    Igual que sucedía con TCC, este compilador trabaja desde la línea decomandos. Con la orden adecuada crearemos nuestro programa a partir delcódigo fuente que tengamos.

    Ejemplo de compilación del siguiente fichero fuente “ hola.c

    ”:

    // hola.c#include

    int main() {printf("¡Hola Mundo!\n");return 0;

    }

    # gcc -o hola1 hola.c#./hola1

  • 8/17/2019 Introducción a la programación en C y C++ con ulinux_vem 1.1

    14/17

    Herramienta de automatización de compilador ‘ Make’

    El comando ‘make ’ facilita la tarea de compilado en proyectos compuestospor varios ficheros fuente y librerías, incluso repartidos en distintos lugaresdentro del árbol de directorios.

    Su misión es determinar automáticamente qué elementos de un programanecesitan ser recompilados, lanzando las órdenes correspondientes.

    Se puede utilizar con cualquier lenguaje de programación cuyo compiladorpueda ejecutarse con una consola de comandos.

    En cada llamada, make busca un fichero de configuración (“Makefile ” ó“ makefile ” por defecto) en el directorio actual con las relaciones entre losficheros de nuestro programa así como las órdenes necesarias para actualizarcada fichero. Esta simple orden:

    # make

    Basta y sobra para que se realicen todas las recompilaciones necesarias.

    Obtendremos ayuda con:

    # make --help | more

    Contenido de un fichero “ Makefile”

    Las órdenes del archivo de configuración se construyen a partir demacros yreglas . Una MACRO es equivalente a una variable entorno de un SO, es decir,sirve para sustituir a una cadena, a veces grande, de texto. Siempre se colocaantes que las reglas. Sintaxis:

    MiMacro=CadenaDeTexto -> Definición de la Macro.

    ...

    $(MiMacro) -> En el lugar donde make encuentra $(...)situará el texto original asociado a la MACRO.

    Una macro puede tener cualquier nombre compuesto por caracteresalfanuméricos.

    A la hora de insertarla en la regla correspondiente, ha de ir precedida delsignodollar ($). Además, si consta de más de un carácter, el nombre de lamacrose pondrá entre paréntesis.

    14

  • 8/17/2019 Introducción a la programación en C y C++ con ulinux_vem 1.1

    15/17

    Las REGLAS constan de tres partes:

    ● Una etiqueta cuya función es la de distinguir un conjunto de

    órdenes.● Dependencias, esto es, aquellos ficheros necesarios para llevar acabo las acciones que corresponden a la etiqueta.

    ● Los comandos a ejecutar. Cada línea de comando, make creará unproceso distinto.

    La sintaxis de las reglas es:

    etiqueta: [dependencia1 ...] [;comandos][ comandos]

    En cualquier parte del fichero se admiten comentarios (texto no tenido encuenta por ‘ make ’). El símbolo “# ” identifica su comienzo hasta el final de lalínea.

    Si una línea es demasiado larga se puede escribir “ \ ” y continuar en lasiguiente, tanto en la definición de macro como en la de comandos.

    Reglas implícitas en ‘ Make’

    A la hora de tratar los ficheros, ‘make ’ los reconoce a partir de suextensión.Dado un fichero concreto, si alguno de los que depende ha sido modificado, alreconocer el tipo puede actualizarlos de manera eficiente. Las extensiones máscomunes son:

    ● “.c ” : Fichero fuente de código C● “.s ” : Fichero fuente de Ensamblador

    Ejemplo de un fichero “ Makefile ” utilizado para generar el ficheroejecutable de un microcontrolador obtenido a partir del compilador cruzadoavr‐gcc:

    # Esto es un comentarioCC=avr-gcc # CompiladorOBJCOPY=avr-objcopy # Generador de fichero .hexCFLAGS=-g -mmcu=at90s2313 # Parámetros del compilador

    rom.hex: demo.out # Regla 3 (necesita el fichero de la regla 2)$(OBJCOPY) -j .test -O ihex demo.out rom.hex

    demo.out: demo.o # Regla 2 (necesita el fichero de la regla 1)

    $(CC) $(CFLAGS) -o demo.out -W1,-Map,demo.map

    15

  • 8/17/2019 Introducción a la programación en C y C++ con ulinux_vem 1.1

    16/17

    demo.o: # Regla 1 (genera demo.o a partir de demo.c)$(CC) $(CFLAGS) -Os -c demo.c

    # ̂# |

    # +- Recuerda poner aquí un tabulador (si no lo haces ‘ make

    ’ falla)#La regla 2 requiere demo.o para realizarse.

    #La regla 3 requiere demo.out para realizarse.#Fichero final: rom.hex

    Instalación de programas a partir de los ficheros fuente

    Si u n usuario de un SO LINUX desea instalar un nuevo programa del quedispone únicamente de los ficheros en formato fuente (sin compilar)normalmente está obligado a realizar una serie de acciones dirigidas apersonalizar satisfactoriamente el proceso de compilado e instalación de laaplicación en el sistema.

    Por lo general, de entre los archivos incluidos, encontraremos eldocumento de ayuda “README” con información detallada del procedimiento aseguir.

    Supongamos que hemos descargado el código fuente de un programallamado “ juego.tgz ” desde internet y deseamos ejecutarlo en nuestroordenador con LINUX. Los pasos que seguiremos serán los siguientes:

    1. Descomprimimos el archivo “j uego.tgz ” con la orden y parámetrosapropiados. En este caso:

    # tar xfvz game.tgz

    2. Buscamos el archivo “ README” con el fin de obtener las órdenes deinstalación de la aplicación. Básicamente suelen ser tres tareas a realizaren el mismo directorio donde se encuentra el conjunto de archivos

    fuente :

    a. ‘ # ./configure ’ : Este script extrae toda la informaciónnecesaria de nuestro sistema para saber si el compilado es posibley, en caso afirmativo, ajustar el contenido del archivo “ Makefile ”.

    b. ‘ # make ’: Genera ahora el/los archivo/s ejecutable/es.

    c. ‘ # make install ’: Coloca todos los elementos de la aplicación ennuestro árbol de directorios para su correcta ejecución dentro delSO.

    16

  • 8/17/2019 Introducción a la programación en C y C++ con ulinux_vem 1.1

    17/17

    Ejercicios Propuestos1. Estudia el código fuente del programa de usuario ‘cifras-0.2 ’. Para ello:

    a. Dirígete a “ /mnt/w2ul/LenguajeC/programas/cifras-0.2 ” y leeel archivo “README.txt”.

    b. Entra en el directorio “ fuentes ” y analiza el contenido del archivo“ Makefile ”.

    c. Genera el archivo ejecutable por medio de ‘ # make’.

    2. ¿Se encuentra instalada por defecto la aplicación TinyCC en este SistemaOperativo?. Comprueba su existencia con ‘ # tcc ’.

    3. Estudia el proceso de ajuste e instalación personalizada de la aplicaciónTinyCC ( tcc‐0.9.25.tar.bz2 ) a partir de los ficheros fuente disponibles enel directorio: “/mnt/w2ul/LenguajeC/programas/tcc-0.9.25 ”. Paraello:

    a. Abre el fichero “ README ” y lee las instrucciones de instalación de laaplicación: ‘ # nano README