Bibliotecas en ANSI C

18
Ing. José María Sola Página 1 de 18 Universidad Tecnológica Nacional Facultad Regional Buenos Aires Ingeniería en Sistemas de Información Sintaxis y Semántica de los Lenguajes Bibliotecas en ANSI C por Prof. Ing. José María Sola 1.0.0.20030808 – 2.1.20120328 Objetivos Presentar el concepto de biblioteca. Presentar los pasos necesarios para la creación de una biblioteca con ANSI C. Presentar los pasos para la construcción de biblioteca con BCC32. Presentar los pasos para compilar (y linkeditar) con BCC32 programas fuente que utilizan bibliotecas a parte de la Standarad. Los objetivos se cumplen mediante la presentación de dos casos de estudio. Objetivo secundario Presentar el Lenguaje Unificado de Modelado (UML - Unified Modeling Language) aplicándolo en los modelos de este artículo. Introducción En este artículo se introduce el concepto de biblioteca y dos casos de estudio que presentan aplicaciones prácticas del concepto. El diseño de la solución para cada caso de estudio se modela con UML. El proceso para la creación de una biblioteca es genérico y puede ser reproducido en diferentes entornos de desarrollo ANSI C, teniendo en cuentas las características de cada uno. En este artículo se ejemplificar mediante el compilador de línea de comando “C++ Compiler 5.5 with Command Line Tools1 , también conocido como BCC32. 1 http://www.borland.com/ y ftp://ftpd.borland.com/download/bcppbuilder/freecommandLinetools.exe

Transcript of Bibliotecas en ANSI C

Page 1: Bibliotecas en ANSI C

Ing. José María Sola Página 1 de 18

Universidad Tecnológica Nacional

Facultad Regional Buenos Aires

Ingeniería en Sistemas de Información

Sintaxis y Semántica de los Lenguajes

Bibliotecas en ANSI C por Prof. Ing. José María Sola 1.0.0.20030808 – 2.1.20120328

Objetivos

Presentar el concepto de biblioteca.

Presentar los pasos necesarios para la creación de una biblioteca con ANSI C.

Presentar los pasos para la construcción de biblioteca con BCC32.

Presentar los pasos para compilar (y linkeditar) con BCC32 programas fuente que

utilizan bibliotecas a parte de la Standarad.

Los objetivos se cumplen mediante la presentación de dos casos de estudio.

Objetivo secundario

Presentar el Lenguaje Unificado de Modelado (UML - Unified Modeling Language)

aplicándolo en los modelos de este artículo.

Introducción

En este artículo se introduce el concepto de biblioteca y dos casos de estudio que presentan

aplicaciones prácticas del concepto. El diseño de la solución para cada caso de estudio se modela con

UML.

El proceso para la creación de una biblioteca es genérico y puede ser reproducido en diferentes

entornos de desarrollo ANSI C, teniendo en cuentas las características de cada uno. En este artículo se

ejemplificar mediante el compilador de línea de comando “C++ Compiler 5.5 with Command Line

Tools”1, también conocido como BCC32.

1 http://www.borland.com/ y ftp://ftpd.borland.com/download/bcppbuilder/freecommandLinetools.exe

Page 2: Bibliotecas en ANSI C

UTN FRBA • Sintaxis y Semántica de Lenguajes Bibliotecas en ANSI C

Ing. José María Sola Página 2 de 18

Contenidos

OBJETIVOS .................................................................................................................................................................................. 1 Objetivo secundario ................................................................................................................................................................................ 1

INTRODUCCIÓN ........................................................................................................................................................................... 1 CONTENIDOS .............................................................................................................................................................................. 2

1. CONCEPTOS ...........................................................................................................................................................................3

1.1. BIBLIOTECAS ....................................................................................................................................................................... 3 1.2. ARCHIVOS HEADER ............................................................................................................................................................. 3 1.3. FUNCIONES PÚBLICAS.......................................................................................................................................................... 3 1.4. FUNCIONES PRIVADAS (STATIC) .......................................................................................................................................... 3 1.5. DIRECTIVAS AL PREPROCESADOR ........................................................................................................................................ 4 1.6. MODELOS UML ................................................................................................................................................................... 4

2. CASO DE ESTUDIO 1 – TIEMPO .........................................................................................................................................5

2.1. DIAGRAMA DE CASOS DE USO ............................................................................................................................................. 5 Aplicación .............................................................................................................................................................................................. 5 Biblioteca ............................................................................................................................................................................................... 5

2.2. DISEÑO ................................................................................................................................................................................ 6 2.2.1. Diagrama de Clases..................................................................................................................................................... 6 2.2.2. Diagrama de Secuencia ............................................................................................................................................... 6 2.2.3. Diagrama de Componentes.......................................................................................................................................... 7

2.3. PROCESOS DE TRADUCCIÓN ................................................................................................................................................. 7 2.3.1. Generación de la Biblioteca ........................................................................................................................................ 7 2.3.2. Generación de la Aplicación ....................................................................................................................................... 8

2.4. CONSTRUCCIÓN ................................................................................................................................................................... 8 2.4.1. Archivos Fuentes.......................................................................................................................................................... 8 2.4.2. Entorno de Desarrollo ................................................................................................................................................. 9 2.4.3. Procesos ....................................................................................................................................................................... 9

Crear objeto para la biblioteca ................................................................................................................................................................ 9 Crear biblioteca ...................................................................................................................................................................................... 9 Generar programa ................................................................................................................................................................................. 10 Ejecución .............................................................................................................................................................................................. 10

2.4.4. Generación de Componentes y Prueba ...................................................................................................................... 10

3. CASO DE ESTUDIO 2 – SALUDOS .................................................................................................................................... 11

3.1. DIAGRAMA DE CASOS DE USO ........................................................................................................................................... 11 3.2. DISEÑO .............................................................................................................................................................................. 12

3.2.1. Diagrama de Clases................................................................................................................................................... 12 3.2.2. Diagrama de Secuencia ............................................................................................................................................. 13 3.2.3. Diagrama de Componentes........................................................................................................................................ 14

3.3. PROCESOS DE TRADUCCIÓN ............................................................................................................................................... 15 3.4. CONSTRUCCIÓN ................................................................................................................................................................. 16

3.4.1. Archivos Fuentes........................................................................................................................................................ 16 Biblioteca Saludar ................................................................................................................................................................................ 16

Saludar.h .......................................................................................................................................................................................... 16 Saludar.c .......................................................................................................................................................................................... 16

Biblioteca SaludarMuchasVeces .......................................................................................................................................................... 17 SaludarMuchasVeces.h .................................................................................................................................................................... 17 SaludarMuchasVeces.c .................................................................................................................................................................... 17

Aplicación ............................................................................................................................................................................................ 17 Aplicación.c ..................................................................................................................................................................................... 17

3.4.2. Generación de Componentes y Prueba ...................................................................................................................... 18

4. CONCLUSIÓN ....................................................................................................................................................................... 18

5. BIBLIOGRAFÍA .................................................................................................................................................................... 18

Page 3: Bibliotecas en ANSI C

UTN FRBA • Sintaxis y Semántica de Lenguajes Bibliotecas en ANSI C

Ing. José María Sola Página 3 de 18

1. Conceptos

1.1. Bibliotecas

Una biblioteca es una colección de herramientas para el programador. En una biblioteca se

encuentran subprogramas (funciones para ANSI C), tipos de datos, constantes, enumeraciones y otros

identificadores. Las bibliotecas permiten la modularización, el desacoplamiento y la centralización de

funcionalidad común.

Una biblioteca tiene una parte privada, la implementación, y otra pública, la interfaz. La

biblioteca encapsula la implementación, y la interfaz debe estar diseñada para que oculte

información sobre el diseño de la implementación.

ANSI C provee una biblioteca Standard, y varios archivos header que hacen de interfaz. Cada

archivo header representa una agrupación funcional (e.g. string.h para el manejo de cadenas y stdio.h

para la entrada y salida).

Las bibliotecas se utilizan también para el desarrollo de Tipos de Datos Abstractos (TADs).

Una biblioteca puede contener la implementación de un TAD y venir acompañada por su interfaz; o

bien una misma biblioteca puede contener varios TADs y estar acompañada por diferentes interfaces,

una por cada TAD.

Las bibliotecas son utilizadas por programa u otras bibliotecas.a

1.2. Archivos Header

Los archivos header (encabezados) son archivos con código fuente ANSI C que deben ser

compartidas por varios programas. En su gran mayoría, son declaraciones y macros; no contienen

definiciones de funciones, sino declaraciones de funciones (i.e. prototipos).

Los archivos header, por convención, tienen como extensión ".h".

No se debe confundir el concepto de archivo header con biblioteca. Por ejemplo, la biblioteca

Standard posee varios archivos header, en los cuales header hay declaraciones para utilizar las

funciones que están precompiladas (i.e. código objeto) en la biblioteca Standard.

1.3. Funciones Públicas

Una función pública de una biblioteca es una función que puede ser invocada por diferentes

programas u otras bibliotecas.

En ANSI C, por defecto, las funciones son públicas; pueden ser invocadas desde otros

programas o bibliotecas (i.e. unidades de traducción).

Leer la sección 4.6 Static Variables del capítulo 4. Functions and Program Structure de

[K&R1988].

1.4. Funciones Privadas (static)

Una función privada de una biblioteca es una función que el programa o biblioteca llamante no

necesita conocer para poder hacer uso de la biblioteca.

En general son funciones helper ("auxiliares") que ayudan al diseño de la implementación de la

biblioteca. Por ejemplo, la función pública Alumno *ImprimirAlumno(int legajo) puede,

internamente, invocar (i.e. hacer uso) de la función privada BuscarAlumno para abstraer la tarea de

la búsqueda del alumno a imprimir.

Page 4: Bibliotecas en ANSI C

UTN FRBA • Sintaxis y Semántica de Lenguajes Bibliotecas en ANSI C

Ing. José María Sola Página 4 de 18

En ANSI C, las funciones privadas se implementan precediendo el prototipo y la definición de

la función con la palabra clave static. Las funciones static sólo pueden ser invocadas desde la

unidad de traducción (i.e. archivo fuente) dónde están definidas, no pueden ser invocadas por otras

programas o bibliotecas. El prototipo de una funcione static se encuentran al comienzo del archivo

fuente donde está definida, junto a otras declaraciones externas; sus prototipos no se escriben en los

archivos header.

Leer la sección 4.6 Static Variables del capítulo 4. Functions and Program Structure de

[K&R1988].

1.5. Directivas al Preprocesador

Permiten dirigir las acciones del preprocesador. Otorgan funcionalidades de compilación

condicional y de substitución.

La directiva #include incorpora el contenido completo del archivo indicado. Existen dos

sintaxis, la primera es particular para los headers Standard (e.g. #include <time.h>), y la

segunda es para otros archivos fuente no Standard (e.g. #include "stack.h").

La directiva #define introduce un identificador, opcionalmente asociándolo con una porción

de código fuente.

La expresión defined <identificador> se reemplaza por cero o por uno en función de

si el identificador ya fue definido o no.

Las directivas de preprocesador #ifndef <expresión constante> y #endif le

indican al preprocesador que procese el bloque que encierran si y solo si la expresión constante es cero

(falsa), permiten la compilación condicional.

Las siguientes líneas son equivalentes

#if ! defined <identificador>

#ifndef <identificador>

La siguiente estructura sintáctica evita que el contenido de un archivo header sea procesado más

de una vez.

#ifndef <identificador>

#define <identificador>

Líneas de código fuente del archivo header.

#endif

Leer de [K&R1988] las siguientes secciones del capítulo A.12 Preprocessing

A.12.3 Macro Definition and Expansion

A.12.4 File Inclusion

A.12.5 Conditional Compilation

1.6. Modelos UML

El Lenguaje Unificado de Modelado es un lenguaje para especificar, visualizar, construir y

documentar los artefactos de sistemas de software, también como para modelado de negocio y otros

sistemas no-software. El UML representa una colección de las mejores prácticas ingenieriles que han

sido exitosamente probadas en el modelado de largos y complejos sistemas.2

En este artículo, se utilizan los diagramas de caso de uso para representar funcionalidad, los de

clase para representar la estructura lógica de las entidades, los de secuencia para representar el

comportamiento en función del tiempo y los de componente para representar la estructura física.

2 OMG-Unified Modeling Language, v1.5, http://www.omg.org.

Page 5: Bibliotecas en ANSI C

UTN FRBA • Sintaxis y Semántica de Lenguajes Bibliotecas en ANSI C

Ing. José María Sola Página 5 de 18

2. Caso de Estudio 1 – Tiempo

Este caso trata de un programa llamado “reloj” el cual invoca a una función de la biblioteca

“tiempo”. La función en cuestión es “GetTimeAsString” que, como su nombre lo indica, retorna el

tiempo (i.e. hora y fecha actual como una cadena).

2.1. Diagrama de Casos de Uso

Aplicación

El usuario utiliza el programa reloj para conocer la hora y fecha actual.

Biblioteca

Cualquiera Unidad de Traducción puede utilizar la biblioteca para obtener el tiempo como una

cadena de caracteres.

reloj

Usuario

Mostrar hora y

fecha actuales

<<library>>

tiempo

TransaltionUnit

GetTimeAsString

Page 6: Bibliotecas en ANSI C

UTN FRBA • Sintaxis y Semántica de Lenguajes Bibliotecas en ANSI C

Ing. José María Sola Página 6 de 18

2.2. Diseño

El domino del problema abarca tres entidades. Dos bibliotecas, la Standard y tiempo, y un

programa, reloj que usa ambas bibliotecas. La biblioteca Standard es también utilizada por la

biblioteca tiempo.

2.2.1. Diagrama de Clases

2.2.2. Diagrama de Secuencia

+GetTimeAsString(out s : char*) : char*

«utility»

Tiempo

+main() : int

Reloj «uses»

+time(in timer : time_t*) : time_t

+ctime(in time : const time_t*) : char*

+printf(in format : const char*, in ...) : int

+strcpy(out t : char*, in s : constchar*) : char*

«utility»

Standard

«uses»«uses»

: Reloj«utility»

: Tiempo

«utility»

: Standard

main()

GetTimeAsString()

time()

printf()

ctime()

strcpy()

Page 7: Bibliotecas en ANSI C

UTN FRBA • Sintaxis y Semántica de Lenguajes Bibliotecas en ANSI C

Ing. José María Sola Página 7 de 18

2.2.3. Diagrama de Componentes

2.3. Procesos de Traducción

2.3.1. Generación de la Biblioteca

«library»

tiempo«executable»

reloj

«source code»

rejol.c

«trace»

«includes»

«trace»

«source code»

tiempo.c

«header»

tiempo.h

«library»

standard

«header»

stdio.h

«header»

time.h

«includes»

Diferencia de tiempo (antes y después del proceso de traducción)

«includes»

«includes»

«header»

string.h

«includes»

«source code»

tiempo.c«library»

tiempo

«header»

time.h

«includes»

«header»

tiempo.h

«includes»

«header»

string.h

«includes»

Compilador y "Librarian"

Page 8: Bibliotecas en ANSI C

UTN FRBA • Sintaxis y Semántica de Lenguajes Bibliotecas en ANSI C

Ing. José María Sola Página 8 de 18

2.3.2. Generación de la Aplicación

2.4. Construcción

2.4.1. Archivos Fuentes

Compilador y Enlazador

«library»

standard

«library»

tiempo

«source code»

rejol.c

«header»

tiempo.h

«includes»

«header»

stdio.h

«includes»

«executable»

reloj

Page 9: Bibliotecas en ANSI C

UTN FRBA • Sintaxis y Semántica de Lenguajes Bibliotecas en ANSI C

Ing. José María Sola Página 9 de 18

2.4.2. Entorno de Desarrollo

2.4.3. Procesos

Crear objeto para la biblioteca

> bcc32 -c tiempo.c

Crear biblioteca

> tlib tiempo.lib +tiempo.obj

Page 10: Bibliotecas en ANSI C

UTN FRBA • Sintaxis y Semántica de Lenguajes Bibliotecas en ANSI C

Ing. José María Sola Página 10 de 18

Generar programa

> bcc32 reloj.c tiempo.lib

Ejecución

> reloj.exe

2.4.4. Generación de Componentes y Prueba

Page 11: Bibliotecas en ANSI C

UTN FRBA • Sintaxis y Semántica de Lenguajes Bibliotecas en ANSI C

Ing. José María Sola Página 11 de 18

3. Caso de Estudio 2 – Saludos

Este caso presenta dependencias más complejas entre bibliotecas y un programa. La

dependencias están dadas por la relación de invocación y de inclusión. Una de las bibliotecas utiliza

una función privada.

El programa hace uso de dos bibliotecas y también de la Biblioteca Standard. Una biblioteca

llama a la otra, y la última invoca a una función de la Standard.

La única y simple acción del programa es la emitir por stdin un saludo una determinada cantidad

de veces.

3.1. Diagrama de Casos de Uso

<<library>>

SaludarMuchasVeces

<<library>>

Saludar

TransaltionUnit

Saludar a alguien

Aplicacion

Usuario

Realizar

diferentes saludos

TransaltionUnit

Saludar a alguien

varias veces

Page 12: Bibliotecas en ANSI C

UTN FRBA • Sintaxis y Semántica de Lenguajes Bibliotecas en ANSI C

Ing. José María Sola Página 12 de 18

3.2. Diseño

3.2.1. Diagrama de Clases

-SaludarEnCastellano()

+Saludar(in unNombre : const char*)

«utility»

Saludar

+main() : int

Aplicacion «uses»

+printf(in format : const char*, in ...) : int

+puts(in string : const char*) : int

+EXIT_SUCCESS : int

«utility»

Standard«uses»«uses»

+SaludarMuchasVeces(in unNombre : const char*, in cuantasVeces : int)

«utility»

SaludarMuchasVeces«uses»

«uses»

Page 13: Bibliotecas en ANSI C

UTN FRBA • Sintaxis y Semántica de Lenguajes Bibliotecas en ANSI C

Ing. José María Sola Página 13 de 18

3.2.2. Diagrama de Secuencia

: Aplicacion«utility»

: Saludar

«utility»

: Standard

main()

: SistemaOperativo«utility»

: SaludarMuchasVeces

Saludar("Mundo")

SaludarEnCastellano

puts("Hola")

puts("")

SaludarMuchasVeces("Mundo", 4)

Saludar(unNombre)

printf(", %s\n", unNombre)

puts("")

Itera lo indicado

por el parámetero

cuantasVeces

Page 14: Bibliotecas en ANSI C

UTN FRBA • Sintaxis y Semántica de Lenguajes Bibliotecas en ANSI C

Ing. José María Sola Página 14 de 18

3.2.3. Diagrama de Componentes

«library»

SaludarMuchasVeces

«executable»

Aplicacion

«source code»

Aplicacion.c

«includes»

«source code»

Saludar.c

«header»

Saludar.h

«library»

Standard Library

«header»

stdlib.h

«includes»

Diferencia de tiempo (antes y después del proceso de traducción)

«includes»

«header»

stdio.h

«includes»

«header»

SaludarMuchasVeces.h

«source code»

SaludarMuchasVeces.c

«includes»

«includes» «includes»

«library»

Saludar

«trace»

«trace»

«trace»

«source code»

Saludar.c

«source code»

Aplicacion.c

«source code»

SaludarMuchasVeces.c

«invokes»

«invokes»

«library»

Standard Library

«invokes»«invokes»

Relaciones de invocación

«invokes»

Relaciones de inclusión y dependencia antes y después del proceso de traducción

«includes»

Page 15: Bibliotecas en ANSI C

UTN FRBA • Sintaxis y Semántica de Lenguajes Bibliotecas en ANSI C

Ing. José María Sola Página 15 de 18

3.3. Procesos de Traducción

Compilador

«library»

Standard Library

«library»

SaludarMuchasVeces

«executable»

Aplicacion

«library»

Saludar

Enlazador

«object file»

Aplicacion.obj

Generación de la Aplicación

«source code»

Aplicacion.c

«header»

Saludar.h

«includes»

«header»

stdlib.h

«includes»

«header»

SaludarMuchasVeces.h

«includes»

«header»

stdio.h «includes»

«library»

SaludarMuchasVeces

Compilador Adminstrador

de Bibliotecas

«object file»

SaludarMuchasVeces.obj

Generación de la Biblioteca Saludar Muchas Veces

«source code»

SaludarMuchasVeces.c

«header»

SaludarMuchasVeces.h

«header»

Saludar.h

«includes»

«includes»

Generación de la Biblioteca Saludar

«library»

Saludar

Compilador Adminstrador

de Bibliotecas

«object file»

Saludar.obj

«source code»

Saludar.c

«header»

Saludar.h

«includes»

«header»

stdio.h

«includes»

Page 16: Bibliotecas en ANSI C

UTN FRBA • Sintaxis y Semántica de Lenguajes Bibliotecas en ANSI C

Ing. José María Sola Página 16 de 18

3.4. Construcción

3.4.1. Archivos Fuentes

Biblioteca Saludar

Saludar.h #ifndef SaludarHeaderIncluded #define SaludarHeaderIncluded /* Saludar.h */ void Saludar( const char* unNombre ); #endif

Saludar.c /* Saludar.c */ #include <stdio.h> /* printf */ #include "Saludar.h" /* Saludar */ /* Prototipo de función privada */ static void SaludarEnCastellano( void ); static void SaludarEnCastellano( void ){ printf("Hola"); return; } void Saludar( const char* unNombre ){ SaludarEnCastellano(); printf(", %s\n", unNombre); return; }

Page 17: Bibliotecas en ANSI C

UTN FRBA • Sintaxis y Semántica de Lenguajes Bibliotecas en ANSI C

Ing. José María Sola Página 17 de 18

Biblioteca SaludarMuchasVeces

SaludarMuchasVeces.h #ifndef SaludarMuchasVecesHeaderIncluded #define SaludarMuchasVecesHeaderIncluded /* SaludarMuchasVeces.h */ void SaludarMuchasVeces( const char* unNombre, int cuantasVeces ); #endif

SaludarMuchasVeces.c /* SaludarMuchasVeces.c */ #include "SaludarMuchasVeces.h" /* SaludarMuchasVeces */ #include "Saludar.h" /* Saludar */ void SaludarMuchasVeces( const char* unNombre, int cuantasVeces ){ int i; for( i = 0; i < cuantasVeces; i++) Saludar( unNombre ); return; }

Aplicación

Aplicación.c /* Aplicacion.c */ #include <stdio.h> /* puts */ #include <stdlib.h> /* EXIT_SUCCESS */ #include "Saludar.h" /* Saludar */ #include "SaludarMuchasVeces.h" /* SaludarMuchasVeces */ int main ( void ){ /* de biblioteca Saludar */ Saludar("Mundo"); puts(""); /* de biblioteca Saludar */ /* pero no se puede invocar porque es static */ /* SaludarEnCastellano("Mundo"); */ /* puts(""); */ /* de biblioteca SaludarMuchasVeces */ SaludarMuchasVeces("Mundo", 4); puts(""); return EXIT_SUCCESS; }

Page 18: Bibliotecas en ANSI C

UTN FRBA • Sintaxis y Semántica de Lenguajes Bibliotecas en ANSI C

Ing. José María Sola Página 18 de 18

3.4.2. Generación de Componentes y Prueba

4. Conclusión

Las bibliotecas demuestran ser una excelente forma de implementar la modularización y para

la construcción de TADs.

Se debe prestar especial cuidado al diseño de las interfaces que exponen las bibliotecas para

cumplir con determinada funcionalidad, se debe aplicar el ocultamiento de información. Mediante la

abstracción se debe evitar que el cliente de la biblioteca necesite conocer los detalles de

implementación para hacer uso de la biblioteca. ANSI C permite encapsulamiento de componentes de

las bibliotecas mediante la palabra clave static.

5. Bibliografía

[K&R1988] "The C Programming Language, 2nd

Edition", B. W. Kernighan & D. M.

Ritchie, 1988, Prentice-Hall, ISBN 0-13-110362-8

Documentación Borland C++ Compiler 5.5 with Command Line Tools

OMG-Unified Modeling Language, v1.5, http://www.omg.org .—