Aula 7
Ferramentas de desenvolvimento
Alessandro Garcia LES/DI/PUC-Rio
Abril 2019
Especificação
• Objetivo dessa aula
– Apresentar algumas das ferramentas utilizadas ao desenvolver programas modulares
• Referência básica:
– Capítulo 7
• Referências complementares
– Ierusalimschy, R.; Programming in Lua; Rio de Janeiro:
Lua.org; 2004
– Staa, A.v.; Utilitário GMAKE: Gerador de diretivas MAKE; LES - Laboratório de Engenharia de Software, Departamento de
Informática, PUC-Rio; 2006
Sumário
• Ambientes de engenharia de software
• Atividades do desenvolvimento modular
• A ferramenta MAKE
• A ferramenta GMAKE
• Ferramentas “feitas em casa”
Ambientes de engenharia de software
• Processos de desenvolvimento
– documentos descrevendo, passo a passo, o que e quando deve ser realizado
• Procedimentos (métodos)
– documentos descrevendo como devem ser realizadas as atividades do processo
• Padrões
– conjuntos de regras, recomendações e diretrizes a serem obedecidas ao desenvolver determinada classe de
artefatos
• Técnicas
– formas de apresentar ou habilidades de fazer algo
Ambientes de engenharia de software
• Plataformas de desenvolvimento
– hardware – rede
– sistema operacional – software de suporte – . . .
• Repositórios
– arquivos organizados contendo todas as informações relativas aos sistemas objetivo
• Ferramentas
– software de apoio ao desenvolvimento
– CASE – Computer aided software engineering
Ambientes de engenharia de software
• Papéis
– descrições das funções a serem desempenhadas por pessoas
• Pessoas com
– proficiência
• experiência profissional
• formação
• know how
• habilitação
Atividades do desenvolvimento modular
Especificar programa
Arquitetar programa
Implementar módulo Desenvolver casos de teste
Completar a especificação
do módulo Especificar
interfaces dos módulos Revisar
especificação
Revisar arquitetura
Testar módulo Revisar
especificação de módulos Repositório
de artefatos aprovados
Para todos construtos
Para todos construtos
Para todos construtos
Para todos módulos do
construto
Revisar código do
módulo
Integrar construto
Testar construto
Revisar teste do construto
OK
OK OK
OK OK
OK OK OK
Módulo
Script de teste Laudo do teste
Revisar teste do módulo
Ferramentas básicas
• Editor de texto
– editor convencional
– editor sensível à sintaxe
• Editor de linguagens de representação gráficas
– editor de diagramas
• Processador de linguagem
– compilador de programas, pode gerar:
• linguagem nativa
• byte code
• Interpretador
– puro, ex. batch; printf
– byte code
Exemplo: Interpretador de expressões
Atr =
Var x Bin /
Bin + Bin *
Cte 12 Fun RQ
Var y
Var y Cte 4 Tabela
X Y
X = ( 12 + RQ( Y ) ) / ( Y * 4 )
Ferramentas básicas
• Bibliotecas e frameworks
– Framework de apoio aos testes
• Compositor de bibliotecas (LIB)
– compõe uma biblioteca de módulos objeto
• Ligador (LINK)
• MAKE
– controla a reconstrução de artefatos compostos
• Depurador (debugger)
– executa um programas compilado de modo que se possa controlar, visualizar e modificar o progresso da execução
• Backup
Make
• Problema
– tenho 1000 módulos, altero o módulo m512 o que fazer para reconstruir o programa?
• Recompilar tudo é
– muito caro
– desnecessário: grande parte dos componentes não varia de
uma compilação para outra
Make
• Problema
– tenho 1000 módulos, altero o módulo m512.c o que fazer para reconstruir o programa?
• recompilar m512
• ligar tudo
– tenho 1000 módulos, altero o módulo m512.h o que fazer para reconstruir o programa?
• procurar todos os clientes de m512 e recompilá-los
• recompilar m512
• ligar tudo
– Risco: não recompilar todos que deveriam ser recompilados – Risco: recompilar vários que não deveriam ser recompilados – Custo: trabalho para descobrir quem deve ser recompilado
• Que tal desenvolver uma ferramenta?
Make
• O make é uma ferramenta que interpreta um arquivo (.make) de diretivas (script file) contendo instruções de
como deve ser regerado um determinado artefato composto
• Exemplo de um conjunto de diretivas
modulo1.obj: modulo1.c modulo1.h modulo2.h tabdef1.inc compilaC modulo1.c
tabdef1.inc: tabdef1.def
GeraDefinicoes /X /Y /Z tabdef1.def linha em branco
linha em branco
Coluna 1 da linha
Coluna > 1 da linha
Make
modulo1.obj : modulo1.c modulo1.h modulo2.h \ tabdef1.inc
compilaC modulo1.c
• Elementos de uma diretiva
– arquivo objetivo
• é o arquivo a ser gerado
– arquivos dependentes
• é a lista dos arquivos usados para gerar o objetivo
– uma ou mais linhas de comandos que realizam a geração – terminado com linha em branco
• A partir do script, o make cria uma árvore de dependências e ao final interpreta esta árvore de dependências
indica que a lista
continua na próxima
linha
Exemplo de um arquivo make 1 / 3
### Nomes globais
NOME = TesteArvore
### Nomes de paths
Pinc = ..\Tabelas Ph = ..\Fontes Pobj = ..\Objetos Perr = ..\Produto PDEFAULT = ..\Fontes Pc = ..\Fontes
### Nomes de diretórios para geração Finc = ..\Tabelas Fh = ..\Fontes Fobj = ..\Objetos Ferr = ..\Produto FDEFAULT = ..\Fontes Fc = ..\Fontes
diretórios onde procura por um arquivo
diretório onde grava
Exemplo de um arquivo make 2 / 3
### Macros da plataforma
O = /D_CRT_SECURE_NO_DEPRECATE
OD = /Zi /Od /D_CRT_SECURE_NO_DEPRECATE L =
LD = /DEBUG /DEBUGTYPE:CV
!IFDEF PRD
O = /Ox /D_CRT_SECURE_NO_DEPRECATE
!ENDIF
OPT = /c /J /W4 /nologo
INCLUDE = $(INCLUDE);$(PDEFAULT)
### Regras de geração all : limpa \
$(Fobj)\arvore.obj $(Fobj)\testarv.obj \ Construto
### Limpar arquivos limpa :
..\..\Ferramnt\CompileBanner /c$(NOME)
..\..\Ferramnt\CompileBanner /c$(NOME) >$(Ferr)\$(NOME).err
Exemplo de um arquivo make 3 / 3
### Dependências de módulos objeto a compilar
$(Fobj)\arvore.obj : {$(Pc)}\arvore.c \
..\tabelas\idtiposespaco.def {$(Ph)}arvore.h {$(Ph)}cespdin.h \
{$(Ph)}conta.h {$(Ph)}generico.h ${(Pdef)}tiposespacosarvore.def \ {$(Ph)}tst_espc.h
cl $(O) $(OPT) /Fo$(Fobj)\ $(Fc)\$(@B).c >> $(Ferr)\$(NOME).err
$(Fobj)\testarv.obj : {$(Pc)}\testarv.c \
{$(Ph)}arvore.h {$(Ph)}cespdin.h {$(Ph)}generico.h \ {$(Ph)}lerparm.h {$(Ph)}tst_espc.h
cl $(O) $(OPT) /Fo$(Fobj)\ $(Fc)\$(@B).c >> $(Ferr)\$(NOME).err
### Terminação Construto : \
$(Fobj)\arvore.obj $(Fobj)\testarv.obj cd $(Fobj)
LINK $(L) @$(NOME).build >> $(Ferr)\$(NOME).err
### Fim de diretivas MAKE para o construto: TesteArvore
Exemplo de um arquivo make: .build
• Diretivas .build são utilizadas pelo linker
• Exemplo
/OUT:..\produto\TesteArvore.exe /INCREMENTAL:NO
/MACHINE:IX86
arvore.obj testarv.obj
ArcaboucoTeste.lib
GMAKE - Gerador de script de make
• Redigir um script de make tende a ser enfadonho e sujeito a erros
• Solução:
– desenvolver uma ferramenta que gere o script make a partir de:
• um script de composição
– específico para um construto
• um script de plataforma de desenvolvimento
– genérico para todos os construtos de um projeto
GMAKE exemplo de composição
[Diretorios]
Nome = TesteArvoreDebug PathDefault = ..\Fontes
err = ..\Produto obj = ..\Objetos h = ..\Fontes espstr = ..\Tabelas lista = ..\Tabelas [Modulos]
TabelaString.lista g TesteTabelaString.espstr g Arvore /D_DEBUG
TestArv /D_DEBUG [BuildInicio]
/OUT:..\produto\TesteArvoreDebug.exe /INCREMENTAL:NO
/MACHINE:IX86 [BuildFim]
ArcaboucoTeste.lib
GMAKE Exemplo plataforma
[Comandos]
c => obj
cl $(O) $(OPT) /Fo$(Fobj)\ $(Fc)\$(@B).c >> $(Ferr)\$(NOME).err lista => tab
geratab /L$(Ftab)\$(@B).lista /T$(Ftab)\$(@B).tab >> $(Ferr)\$(NOME).err espstr => inc
geratbdf /E$(Ftab)\$(@B).espstr /T$(Ftab)\$(@B).inc >> $(Ferr)\$(NOME).err [MacrosGerais]
O = /D_CRT_SECURE_NO_DEPRECATE L =
!IFDEF PRD
O = /Ox /D_CRT_SECURE_NO_DEPRECATE
!ENDIF
OPT = /c /J /W4 /nologo
INCLUDE = $(INCLUDE);$(PDEFAULT) [Limpa]
CompileBanner /c$(NOME)
CompileBanner /c$(NOME) >$(Ferr)\$(NOME).err [DefaultLink]
cd $(Fobj)
LINK $(L) @$(NOME).build >> $(Ferr)\$(NOME).err [Fim]
Exemplo de script make gerado
##################################################
###
### Diretivas de MAKE para o construto: ExemploTabela
### Gerado a partir de: ExemploTabela.comp
###
### --- Arquivo gerado, NÃO EDITE!!! ---
###
##################################################
### Nomes globais
NOME = ExemploTabela
### Nomes de paths
Pobj = . Ptab = . Pinc = . Ph = . Perr = . PDEFAULT = . Pespstr = . Plista = .
Exemplo de script make gerado
### Nomes de diretórios para geração Fobj = .
Ftab = . Finc = . Fh = . Ferr = . FDEFAULT = . Fespstr = . Flista = . Fc = .
### Macros da plataforma
O = /D_CRT_SECURE_NO_DEPRECATE
OD = /Zi /Od /D_CRT_SECURE_NO_DEPRECATE L =
LD = /DEBUG /DEBUGTYPE:CV
!IFDEF PRD
O = /Ox /D_CRT_SECURE_NO_DEPRECATE
!ENDIF
OPT = /c /J /W4 /nologo
INCLUDE = $(INCLUDE);$(PDEFAULT)
Exemplo de script make gerado
### Regras de geração
all : limpa \
$(Ftab)\TabelaString.tab $(Finc)\TesteTabelaString.inc $(Fobj)\Tabstr.obj \
$(Fobj)\TestTbs.obj \ Construto
### Limpar arquivos
limpa :
CompileBanner /c$(NOME)
CompileBanner /c$(NOME) >$(Ferr)\$(NOME).err
Exemplo de script make gerado
### Dependências de módulos objeto a compilar
$(Ftab)\TabelaString.tab : {$(Plista)}\TabelaString.lista \
{$(PDEFAULT)}STR_APIC.DEF {$(PDEFAULT)}STR_SEGL.DEF {$(Pespstr)}TesteTabelaString.espstr
geratab /L$(Ftab)\$(@B).lista /T$(Ftab)\$(@B).tab >> $(Ferr)\$(NOME).err
$(Finc)\TesteTabelaString.inc : {$(Pespstr)}\TesteTabelaString.espstr
geratbdf /E$(Ftab)\$(@B).espstr /T$(Ftab)\$(@B).inc >> $(Ferr)\$(NOME).err
$(Fobj)\Tabstr.obj : {$(Pc)}\Tabstr.c \
{$(PDEFAULT)}TabStr.H {$(Ptab)}TabelaString.tab
cl $(O) $(OPT) /Fo$(Fobj)\ $(Fc)\$(@B).c >> $(Ferr)\$(NOME).err
$(Fobj)\TestTbs.obj : {$(Pc)}\TestTbs.c \
{$(Ph)}TST_Espc.h {$(Ph)}TabStr.h {$(Ph)}generico.h
\
{$(Ph)}lerparm.h {$(Ph)}tst_espc.h
cl $(O) $(OPT) /Fo$(Fobj)\ $(Fc)\$(@B).c >> $(Ferr)\$(NOME).err
Exemplo de script make gerado
### Terminação
Construto : \
$(Fobj)\Tabstr.obj $(Fobj)\TestTbs.obj cd $(Fobj)
LINK $(L) @$(NOME).build >> $(Ferr)\$(NOME).err
##################################################
###
### Fim de diretivas MAKE para o construto: ExemploTabela
###
##################################################