Escolar Documentos
Profissional Documentos
Cultura Documentos
Sistemas de Linguagens
• Introdução
• A sequência clássica
• Sobre o;mizações
• Variações da sequência clássica
• Depuradores (Debuggers)
• Suporte em tempo de execução
INTRODUÇÃO
Linguagens de Programação
Ambiente de Desenvolvimento Integrado
Consiste normalmente de
– Um editor de código-fonte
– Ferramentas para construção
automática
– Depurador
– Dentre outros...
Linguagens de Programação
A Sequência Clássica
Pré-
Editor
C Processador C
Compilador Assembler
ASM OBJ
Ligador Carregador
EXE
Editor
Pré-
Editor
C Processador C
Compilador Assembler
ASM OBJ
Ligador Carregador
EXE
Editor
cube.c
Pré-Processador
Pré-
Editor
C Processador C
Compilador Assembler
ASM OBJ
Ligador Carregador
EXE
Pré-Processador
• Exemplo
gcc –E \
–o cube_pre.c \
cube.c
cube_pre.c
Compilador
Pré-
Editor
C Processador C
Compilador Assembler
ASM OBJ
Ligador Carregador
EXE
Compilador
• Exemplo
gcc –S –o cube.S \
cube_pre.c
Sintaxe:
AT&T
Assembler
Pré-
Editor
C Processador C
Compilador Assembler
ASM OBJ
Ligador Carregador
EXE
Assembler
Pré-
Editor
C Processador C
Compilador Assembler
ASM OBJ
Ligador Carregador
EXE
Ligador i: 0
x: 2
sum: 0
• Arquivos objetos não são executáveis main: xxxx i
– Ainda faltam códigos xx x x
x sum x
– Ainda têm alguns nomes
xxxx i
– Maioria código de máquina, mas não completamente xx x xx
sum xx
• Ligador coleta e combina todas as partes diferentes xxxxxx
– Por exemplo, o código do show foi compilado show
em outro lugar e pode ter sido até feito em xxxxxx
outra linguagem de programação show: xxxxxx
xxxxxx
• Resultado é o arquivo executável
xxxxxx
xxxxxx
• Exemplo
ld –o cube.exe cube.o show.o ... str: the sum
gcc –o cube.exe cube.o show.o is %d\n
Carregador
Pré-
Editor
C Processador C
Compilador Assembler
ASM OBJ
Ligador Carregador
EXE
10: the sum
(str)
Carregador is %d\n
20: xxxx 80
(main) xx 84 x
• Arquivo "executável" ainda não é executável x 88 x
– Ainda tem alguns nomes xxxx 80
x 84 xx
– Maioria código de máquina, mas não completamente
88 xx
xxxxxx
• Exemplo: assumindo uma memória primitiva
show
– Organizada como array de bytes xxxxxx
– Índice de cada byte são os endereços
50: xxxxxx
(show) xxxxxx
• Antes de ser executado, não se sabe onde
60: xxxxxx
o programa será carregado nessa memória; (printf) xxxxxx
o carregador acha um endereço para cada
pedaço e substitui por endereços 80 (i): 0
84 (x): 2
88 (sum): 0
Executando
Linguagens de Programação
Sobre OBmizações
int i = 0;
int i = 0;
int temp = x*x*x;
while (i < 100) {
while (i < 100) {
a[i++] = x*x*x;
a[i++] = temp;
}
}
Linguagens de Programação
Variações da Sequência Clássica
1. Escondendo os passos
2. Ambientes de desenvolvimento integrado
3. Interpretadores
4. Máquinas virtuais
5. Ligação tardia
6. Instrumentação de código (Perfilamento)
7. Compilação dinâmica (JIT)
1. Escondendo os Passos
Qual a vantagem
de se fazer isso?
4. Máquinas Virtuais
– Segurança reforçada
• O programa em execução nunca está
diretamente com o controle do processador
• Interpretadores podem intervir se o programa
tentar fazer algo que não deveria
4. Máquinas Virtuais
Alguma outra
• Exemplo de máquina virtual máquina virtual?
• Muitas variações
– Compila cada função apenas quando é chamada
– Começa com interpretação, e compila apenas aqueles pedaços
que são chamados frequentemente
– Compila grosseiramente inicialmente (para código intermediário,
por exemplo); gasta mais tempo em pedaços de códigos
executados frequentemente (compilar para código na;vo e
o;mizar, por exemplo)
Linguagens de Programação
Depuradores
• Algumas perguntas:
– Em que ponto do programa está a execução?
– Qual é a pilha de chamada que levou a esse ponto?
– Quais são os valores das variáveis na memória?
Linguagens de Programação
Suporte em Tempo de Execução
Linguagens de Programação