Herramientas de Desarrollo
Nos acercaremosalusode diversasherramientas utiles paraelprogramador.
Existenentornosintegrados parael desarrollo desoftware pero no sonde usocomun.
ClasicamenteenUNIXsehaceusodediversasherramientasquecumplenconlasdiversas
etapasdel desarrollo.
Estaparte delcursoeseminentementepractica. Elalumnodebera consultarlaayuda
disponible. Como metodo rapido de consulta, se dispondra de trpticos con resumenes
utiles de variasherramientas.
5.1 Editor
Vamosavertreseditorestipo. Elalumnodeberaescogeraquellaopcionquemasseadecue
a susnecesidades.
Enprimera instancia, serecomienda queuseel pico.
pico Simple Text Editor
Es el editor que internamente usa la herramienta para correo electronico pine. Es muy
sencillo deusar pero pocopotente.
Amodode introduccion asuuso realice lassiguientestareas:
pico T 5.1
Arranca el editor.
Ctrl G T 5.2
Accedea laayuda para aprenderlos pocos controles que tiene.
Ctrl X T 5.3
Abandonael editor.
vi VIsual Editor
Elvieseleditormasclasicoyloencontraremosen cualquiermaquinaUNIX.Esporeso
que,apesardeserpocoamigable,haymuchagentequelopreereaotrosmassosticados.
Existe una versionmasmoderna ypotentellamada vim.
vim T 5.4
Arranca el editor.
Esc T5.5
Cambia a \modo mandato".
:help T5.6
Accedea laayuda navegable.
:q T5.7
Abandonala edicion actual.
vimtutor T5.8
Arranca el editor enlarealizacionde untutorial del mismo.
emacs GNU project Editor
Elemacs,desarrolladoporFSFbajolicenciaGNU,esmuchomasqueunsimpleeditor. Es
un entorno sobre el que se integran multiples aplicaciones, correo electronico, navegador
web,news, etc.,etc., etc. Esta escritosobre uninterpretede lisp.
Existe una version llamada Xemacsmasadaptada alentorno graco X, ytotalmente
compatible conelanterior.
emacs T5.9
Arranca el editor.
Ctrl G T5.10
Aborta laacciono mandato a medioespecicar.
Ctrl H T T5.11
Accedea larealizacionde un tutorial.
Ctrl X Ctrl C T5.12
Abandonala edicion actual.
Ejercicios
Para el editor de su eleccion, o para cada uno de ellos, realice los siguientes ejercicios
practicos:
p
Arranque eleditor para crear unnuevo chero.
T5.13
p
Lea el chero deejemplo \estilos.c" desdeel editor.
T5.14
p
Sin modicar su funcionalidad, formatee el texto con el estilo que considere mas T5.15
legible.
p
Guardeel texto editado con elnombre\mi estilo.c".
T5.16
p
Abandone el editor.
T5.17
Compilar un lenguaje de alto nivel, lease C, es traducir el chero o cheros fuente en
cherosobjeto, quecontienenunaaproximacionallenguajemaquina,masunalistadelos
smbolos externosreferenciadospero noresueltos.
La etapa de montaje es capaz de enlazar unos cheros objeto con otros, y a su vez
conlasbibliotecasnecesarias,resolviendotodaslasrefefrencias asmbolosexternos. Esta
etapa producenalmenteunchero ejecutable.
Un chero ejecutable tiene un formato interno que el sistema operativos es capaz de
entender, quedescribecomo situar elproceso en memoriaparasuejecucion.
math.h stdlib.h
stdio.h
libc.a
libm.a gcc −c
prim.h main.c
main.o
ld primes
Ficheros estandard
de
cabecera Compilación
Ficheros Objeto
Librerías estandard
Montaje
Ejecutable Módulos
de usuario
prim.c
gcc −c prim.o
Leyen da
Herram
Fich Producto
Auto
Dependen entre si
Figura5.1: Fases de compilacion ymontaje.
En lagura 5.1se observa lacompilacion separada de dosmodulosmain.cyprim.c
yelmontajede losdoscherosobjetoresultantes paralaobtencion delcheroejecutable
primes.
Extensiones
Ciertossujos oextensionesde losnombresde chero, leindicanalcompiladorlos conte-
nidos delmismo, ypor lotantoeltipode tratamientoquedebe realizarse:
.c Fuentede C. Debe serpreprocesado, compiladoyensamblado.
.h Fichero de cabecera de C. Contiene declaraciones de tipos de datos y prototipos de
funciones. Debe ser preprocesado.
.o Fichero objeto. Es el resultado de la compilacion de un chero fuente. Debe ser
montado.
estandard quehemosusadoennuestroprograma yque porlotantoaunquedan sin
resolveren los cheros objeto.
Errores y Warnings
Como ya habra constatado, los lenguajes de programacion, y entre ellos el C, presenta
una sintasis bastante estricta. Una de las misiones basicas del compilador es indicarnos
los errores quehayamos cometidoalcodicar, dondeestan yen que consisten.
Losavisosque un compiladorescapaz de noticarsonde dostipos:
Errores. Son problemas graves, tanto que evitan que el proceso de compilacion pueda
concluir. No obstante el compilador seguira procesando el chero o cheros, en un
intentodedetectar todoslos errores quehaya.
Es imprescindible corregir estos errores para que el compilador puede terminar de
hacer sutrabajo.
Warnings. Son problemas levesoalertas sobre posiblesproblemasen nuestro codigo.
Aunque elcompilador podra terminarde hacersutrabajo,es imprescindible co-
rregir los problemas que originan estos warnings, porqueseguramente seran
fuentede futurosproblemasmasgraves.
La compilacion de un programa correctamente realizado no debera dar ningun tipo
de mensaje,yterminarlmpiamente.
gcc GNU C and C++ Compiler
ElnombrequesuelerecibirelcompiladordelenguajeCenUNIXescc. Nosotrosusaremos
el gccqueesun compilador deC yC++,desarrollado por FSFbajolicencia GNU.
Esun compilador muy bueno, rapido y eciente. Cubre las etapas de compilacion y
montaje. Partedeunoomasfuentesen C,objetosy/obibliotecasynalmentegeneraun
ejecutable autonomo.
Admitemultitud de opciones,entre lascuales cabedestacar:
-c le.c Realizatansolo el pasode compilacion delchero indicado, pero noel de mon-
taje.
-o name Solicitaqueel resultadode lacompilacion seaun cheroconeste nombre.
-Wall Activa la deteccion de todo tipo de posibles errores. El compilador se comvierte
en masestricto.
-g A~nade al chero objeto o ejecutable informacion que (como veremos mas adelante)
permitira ladepuracionsimbolicadelmismo.
-O Activamecanismosdeoptimizacionqueconseguiranunejecutable masrapido,acosta
de una compilacion maslarga.
-llibrary Solicitaelmontaje contralabibliografaespecicada.
Tienemuchisimas masopciones. Consulteelmanualsilo precisa.
minimo.c T 5.18
Escriba el chero con el editor de su preferencia y los contenidos indicados en el
captuloanterior 2.3.
gcc minimo.c T 5.19
Usamos elcompilador para obtener elejecutable resultante deeste fuente.
ls T 5.20
Observe que si no le indicamos al compilador otra cosa, el ejecutable resultante to-
mara el nombre por defecto a.out.
./a.out T 5.21
Ejecutamosel chero, indicando quese encuentra enel directorioactual. Esto sera
necesariosi notenemos el directorio \." en lavariablede entorno PATH.
Ahoravamos a trabajarunprograma mascomplejo.
factorial.c T 5.22
Escriba el chero con el editor de su preferencia y los contenidos indicados en el
captulo anterior. El objetivo sera mostrar el factorial de los numeros de 0 al 20
usando un bucle.
gcc -g -c factorial.c T 5.23
Con este paso compilaremos, para obtener el chero objeto factorial.o. Este -
chero contendra informacionsimbolica.
gcc factorial.o -o factorial T 5.24
Cuando compilecorrectamente, montaremos para obtenerel ejecutable.
./factorial T 5.25
Ejecute el mandato y compruebesu correcto funcionamiento.
5.3 Depurador
La compilacion sin macula de un programa no implica que sea correcto. Es muyposible
que contenga errores que solo se haran visibles en el momento de su ejecucion. Para
corregirestoserroresnecesitamosuna herramientaquenospermitasupevisarlaejecucion
de nuestroprograma yacorralarelerrorhasta localizarlo en elcodigo.
Existendepuradoresde bajoyde altonivel. Losdebajonivelnospermiteninspeccio-
narelcodigo maquinaoensamblador,ysuejecucionpaso apaso. Losaltonivel,tambien
llamadosdepuradoressimbolicos,permitenvisualizarycontrolarlaejecucionlneaalnea
del codigo fuente que hemos escrito, as como inspeccionar el valor de las variables de
nuestroprograma..
Paraqueunprograma puedaserdepurado correctamente,suejecutabledeberaconte-
nerinformacion queloasociealcodigo fuentedelquederivo. Paraello deberahabersido
compiladoconla opcion -g.
Algunasde lasfunciones deldepuradorson:
Examinarel valor de variables
Ejecutarel programalneaa lnea
Nosotrosusaremoselgdbdesarrollado por FSFbajo licenciaGNU.
Tambien veremos en dddqueesun frontend gracopara elgdb.
Fichero core
Trabajando en UNIXnos sucedera a menudo, que alejecutar un programa este termine
bruscamenteyapareciendoalgun mensajede errorcomo por ejemplo:
segmentation fault: core dumped.
Estemensajenosinformadequenuestroprogramaenejecucion,estoes,elproceso,ha
realizadoun accesoilegala memoriayelsistema operativo loha matado. Asmismonos
indicaqueseha generadouncherode nombrecore. Elcherocoreesunvolcado dela
memoriadelprocesoenelprecisoinstanteenquecometoelerror,estoesunainstantanea.
Este cheronosservira parapoderestudiar contodo detalle lasituacion quedio lugaral
error.
gdb prog [core] GNU debugger
Invocaremos al gdb indicadole el programa ejecutable que queremos depurary opcional-
menteindicaremosen cherocorequegenerosuanomalaejecucion.
Una vez arrancado el depurador, proporciona una serie de mandatos propios para
controlar ladepuracion:
help Daaccesoa un menude ayuda.
run Arrancala ejecucion delprograma.
break Estableceun breakpoint(unnumerode lnea o elnombre de unafuncion).
list Imprime las lneasde codigo especicadas.
print Imprime elvalor de unavariable.
continue Continua laejecuciondelprograma despuesde un breakpoint.
next Ejecutalasiguientelnea. Sisetratadeunallamadaafuncion,laejecutacompleta.
step Ejecuta la siguiente lnea. Si se trata de una llamada a funcion, ejecuta solo la
llamada ysepara alprincipiode lamisma.
quit Terminalaejecucion deldepurador
Paramasinformacionsobre eldepuradorconsultesuayudainteractiva,elmanualoel
trptico.
Masadelantetendremosoportunidadde hacer unusoextenso del depurador.
Esunfrontendgracoparaelgdb,estoes,nosofreceuninterfazgracobastanteintuitivo
para realizar la depuracion, pero en denitiva estaremos usando el gdb. Como carac-
terstica a~nadida, nosofrece facilidades paralavisualizacion gracade las estructuras de
datos de nuestros programas, lo cual sera muy util. Para usar el ddd es presiso tener
arrancadas las X-Windows.
5.4 Bibliotecas
Unaregla basicapara realizarsoftwarecorrecto es utilizarcodigoque ya este probado,y
no estar reinventandosistematicamentela rueda. Siexisteuna funcion de biblioteca que
resuelve un problema deberemosusarla ynoreescribir talfuncionalidad.
Existen muchas muchas bibliotecas con facilidades para realizar todo tipo de cosas:
aritmeticade multiple precision, gracos,sonidos,etc., etc.
Para poder hacer uso correcto de esas funciones de biblioteca debemos consultar el
manualquenosindicara lanecesidadde incluir ennuestrocherofuentecierto cherode
cabecera (ej. #include <string.h>), quecontienelas declaraciones de tipos de datos y
los prototiposde lasfunciones debiblioteca.
Serecomienda queconsulte eltriptico deANSIC.
Destacaremosaqudosbibliotecasfundamentales:
libc.a Es la biblioteca estandard de C. Contiene funciones para: manejo de tiras de
caracteres,entrada ysalidaestandard, etc.
Se correspondeconlasfunciones denidasen loscheros de cabecera:
<assert.h> <ctype.h> <errno.h> <float.h> <limits.h>
<locale.h> <math.h> <setjmp.h> <signal.h> <stdarg.h>
<stddef.h> <stdio.h> <stdlib.h> <string.h> <time.h>
El montaje contra esta biblioteca se realiza de forma automatica. No es preciso
indicarlo, pero loharamosinvocando alcompiladorconlaopcion -lc.
libm.a Es la biblioteca que contiene funciones de calculo matematico y trigonometrico:
sqrt,pow,hypot,cos,atan,etc. . Parahacerusodelasfuncionesdeestabiblioteca
habraque incluiren nuestrochero <math.h>.
El montaje contra esta biblioteca se realiza invocando al compilador conla opcion
-lm.
ar -opts [member] arch files... Manage Archive Files
Cuando desee realizar medianos o grandes proyectos, podra realizar sus propias biblio-
tecas utilizando esta herramienta. Es una utilidad para la creacion y mantenimiento de
bibliotecasde cheros.
Para usar una biblioteca, se especica en la lnea de compilacion la biblioteca (por
convencionlibnombre.a) en vezde losobjetos.
Algunasopcionesfrecuentementeusadasson:
-d Eliminade labiblioteca los cheros especicados
labiblioteca secrea
-ru Igualque -rpero soloreemplazasi elcheroes masnuevo
-t Muestrauna lista de loscheros contenidos enlabiblioteca
-v Verbose
-x Extrae dela bibliotecalos cheros especicados
Acontinuacion semuestran algunosejemplos delusode este mandato.
ParaobtenerlalistadeobjetoscontenidosenlabibliotecaestandardeC,seejecutara:
ar -tv /usr/lib/libc.a
Elsiguientemandatocreaunabibliotecaconobjetosquemanejandistintasestructuras
de datos:
ar -rv $HOME/lib/libest.a pila.o lista.o
ar -rv $HOME/lib/libest.a arbol.o hash.o
Unavezcreadalabiblioteca,habradosformasdecompilarunprogramaqueuseesta
biblioteca yademaslamatematica:
cc -o pr pr.c -lm $HOME/lib/libest.a
cc -o pr pr.c -lm -L$HOME/lib -lest
5.5 Constructor
Si el programa o aplicacion que estamos desarrollando esta convenientemente descom-
puesto en multiples modulos, el proceso global de compilacion puede ser automatizado
haciendouso dela herramientamake.
make Aplication Mantainer
Estautilidad facilitaelprocesodegeneracion yactualizacion deunprograma. Determina
automaticamente que partes de un programa deben recompilarse ante una actualizacion
de algunos modulos y las recompila. Para realizar este proceso, make debe conocer las
dependencias entrelos cheros: uncherodebe actualizarsesialguno de losquedepende
esmasnuevo.
La herramiente make consulta un chero (Makefile) que contiene las reglas que es-
pecican las dependencias de cada chero objetivo y los mandatos para actualizarlo. A
continuacion,semuestraun ejemplo:
# Esto es un comentario
CC=gcc # Esto son macros
CFLAGS=-g
OBJS2=test.o prim.o
all: primes test # Esta es la primera regla
primes: main.o prim.o # Esta es otra regla
gcc -g -o primes main.o prim.o -lm
# Este es el mandato asociado
test: $(OBJS2) # Aqu usamos las macros
${CC} ${CFLAGS} -o $@ ${OBJS2}
main.o prim.o test.o : prim.h # Esta es una dependencia.
clean: # Esta no depende de nada, es obligatoria.
rm -f main.o ${OBJS2}
Observe que las lneas que contienen los mandatos deben estar convenientemente ta-
buladashaciendousodeltabulador,node espacios. Denohacerloas, laherramientanos
indicara queel formatodel chero eserroneo.
Ejecutaremos
make paraquesedisparelaprimeraregla,o
make clean explicitando
lareglaque queremosdisparar. Entonceslo quesucederaes:
1. Se localiza lareglacorrespondienteal objetivo indicado.
2. Se tratansusdependencias como objetivos ysedisparanrecursivamente.
3. Sielcheroobjetivo esmenosactualquealgunode los cherosde los quedepende,
serealizan los mandatos asociadosparaactualizar elcheroobjetivo.
Existen macros especiales. Por ejemplo, $@ corresponde con el nombre del objetivo
actual. Asimismo, se pueden especicar reglas basadas en la extension de un chero.
Algunas deellas estan predenidas(p.ej. laquegenera el .oapartir del.c).
Ejercicio 5.1.
5.6 Otras herramientas
Existen variedad de otras herramientas que podran serle de utilidad cuando desarrolle
codigoen un sistemaUNIXCitaremostres:
gprof
Es una herramienta que nos permite realizar un perl de la ejecucion de nuestros
programas, indicando donde sepierde el tiempo, de menera quetendremos criterio
paraoptimizar si esconvenienteestaszonas de nuestro codigo.
gcov
Essemejantealaanterior,perosuobjetivoesdistinto. Enlafasedevericaciondel
programa,permitecubrirelcodigo,esdecir,asegurar quetodaslaslneasde codigo
de nuestroprograma hansido probadasconsuciencia.
indent
Permite indentarelcheros fuenteen C. Esmuyparametrizable, paraqueel resul-
tadonal secorrespondaconelestilo delpropio autor.