51
Traduciendo y ejecutando programas

Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Embed Size (px)

Citation preview

Page 1: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Traduciendo y ejecutando programas

Page 2: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 2

El camino de un programa en C

Page 3: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 3

CompiladorCompilador

Traduce de lenguaje C a lenguaje ensamblador.

Page 4: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 4

Hola Mundo en C# include <stdio.h>

void main (){

printf ("Hola mundo\n");}

Page 5: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 5

Ensamblador (BCC55)ifdef ??versionif ??version GT 500H.mmxendifendifmodel flatifndef ??version?debug macroendmendif?debug S "hola_mundo.c"?debug T "hola_mundo.c"

_TEXT segment dword public use32 'CODE'_TEXT ends_DATA segment dword public use32 'DATA'_DATA ends_BSS segment dword public use32 'BSS'_BSS endsDGROUP group _BSS,_DATA

Page 6: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 6

Ensamblador (BCC55)_TEXT segment dword public use32 'CODE'_main proc near?live1@0: ; ; void main () ;

push ebpmov ebp,esp

; ; { ; printf ("Hola mundo\n"); ;@1:

push offset s@call _printfpop ecx

; ; } ;@2:

pop ebpret

_main endp_TEXT ends

Page 7: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 7

Ensamblador (BCC55)_DATA segment dword public use32 'DATA's@ label byte

; s@+0:db "Hola mundo",10,0align 4

_DATA ends_TEXT segment dword public use32 'CODE'_TEXT ends

public _main extrn _printf:near

?debug D "c:\Borland\BCC55\Include\_nfile.h" 10459 6176?debug D "c:\Borland\BCC55\Include\_null.h" 10459 6176?debug D "c:\Borland\BCC55\Include\_defs.h" 10459 6176?debug D "c:\Borland\BCC55\Include\_stddef.h" 10459 6176?debug D "c:\Borland\BCC55\Include\stdio.h" 10459 6176?debug D "hola_mundo.c" 14910 22993end

Page 8: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 8

Programa EnsambladorAcepta un programa en lenguaje

ensamblador y genera un archivo objeto.El archivo objeto contiene:

Instrucciones en lenguaje de máquina.Datos.Información necesaria para cargar el programa

en memoria.

Page 9: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 9

Típico OBJ de Unix1. Encabezado. Describe el tamaño y posición

de otras secciones del archivo objeto.2. Segmento de texto. Contiene el código en

lenguaje máquina.3. Segmento de datos estáticos. Variables

accesibles durante todo el programa (globales y variables static de C).

4. Información de relocalización. Identifica instrucciones que dependen de direcciones absolutas.

Page 10: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 10

Típico OBJ de Unix5. Tabla de símbolos. Etiquetas que no han

sido definidas como variables externas.6. Información útil para un debugger. Permite

asociar instrucciones de máquina con líneas del código fuente original.

Page 11: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 11

Microsoft COFFCommon Object File Format.Inicialmente definido para Unix V, fue

extendido por Microsoft para Windows 3.1.Se usa en todas las versiones de Windows de

32 y 64 bits.

Page 12: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 12

Microsoft COFFEncabezado

Encabezados de sección

CódigoDatosInformación para relocalizarInformación para depuración

Page 13: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 13

LinkerPega (link) varios archivos objeto compilados

posiblemente por separado.Resuelve referencias externas e internas.En algunos sistemas como Windows, el linker

relocaliza el código.Produce un solo archivo ejecutable.

Page 14: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 14

RelocalizaciónEnsamblador

bne $t0, $t1, brinco ; if t0 != t1 goto brinco

…brinco: etc.

Lenguaje máquina1000 bne $8, $9, 1020

…1020 etc.

Page 15: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 15

RelocalizaciónLa instrucción

1000 bne $8, $9, 1020está asumiendo que va ser cargada en la dirección 1000.

Los sistemas operativos modernos (multiusuario y/o multitarea) cargan en memoria varios programas a la vez y pueden ser colocados en áreas distintas cada vez que corren.

Page 16: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 16

RelocalizaciónLa solución (para este caso) es hacer el

brinco relativo.1000 bne $8, $9, +20

En general, hay que guardar información sobre dependencias en el código.

Page 17: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 17

Ejemplo – archivo objeto AEncabezado Nombre: Procedure A

Tamaño de código: 0x100

Tamaño de datos: 0x20

Segmento de texto Dirección Instrucción Significado

0 lw $a0, 0($gp) $a0 ← Mem[X]

4 jal 0 call B

… … …

Segmento de datos 0 (X)

… …

Información de relocalización

Dirección Tipo de instrucción Dependencia

0 lw X

4 jal B

Tabla de símbolos Etiqueta Dirección

X ---

B ---

Page 18: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 18

Ejemplo – archivo objeto BEncabezado Nombre: Procedure B

Tamaño de código: 0x200

Tamaño de datos: 0x30

Segmento de texto Dirección Instrucción Significado

0 sw $a1, 0($gp) Mem[Y] ← $a1

4 jal 0 call A

… … …

Segmento de datos 0 (Y)

… …

Información de relocalización

Dirección Tipo de instrucción Dependencia

0 sw Y

4 jal A

Tabla de símbolos Etiqueta Dirección

Y ---

A ---

Page 19: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 19

Ejemplo - relocalizandoEl procedimiento A necesita encontrar la

dirección de la variable X y del procedimiento B.El procedimiento B necesita encontrar la

dirección de la variable Y y del procedimiento A.En MIPS, el segmento de texto comienza en la

dirección 400,00016.

A se carga a partir de 400,00016 y como el código de A mide 10016, B se carga a partir de 400,10016.

Page 20: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 20

Ejemplo - relocalizandoEl segmento de datos comienza en la dirección

10,000,00016.

Los datos de A se cargan en 10,000,00016 y como miden 2016, los datos de B se cargan en 10,000,02016.

El registro $gp se inicializa en 10,008,00016.

Los datos de A se accesan con $gp – 8,00016.

Los datos de B se accesan con $gp – 7,98016.Con esta información, el linker puede relocalizar

el código y generar un archivo ejecutable.

Page 21: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 21

Ejemplo - ejecutableEncabezado Tamaño de código: 0x300

Tamaño de datos: 0x50

Segmento de texto Dirección Instrucción

0x400,000 lw $a0, 0x8000($gp)

0x400,004 jal 0x400100

… …

0x400,100 sw $a1, 0x8020($gp)

0x400,104 jal 0x400000

… …

Segmento de datos Dirección

0x10,000,000 (X)

… …

0x10,000,020 (Y)

… …

Page 22: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 22

Referencias externasSe generan al compilar archivos por separado.Archivo “hola.c”

void foo (void); // prototipo

void main (){

foo (); // referencia externa}

Page 23: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 23

Referencias externasArchivo “mundo.c”

#include <stdio.h>

void foo (){ printf ("hola mundo\n");}

Page 24: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 24

Referencias externasCompilación usando Borland C 5.5

1. bcc32 –c hola.cCompila sin ligar y genera hola.obj

2. bcc32 –c mundo.cCompila sin ligar y genera mundo.obj

3. bcc32 hola.obj mundo.objInvoca al linker y genera hola.exe

Page 25: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 25

Archivos ejecutablesDefinición del Merriam-Webster:

Archivo que hace que una computadora “realice tareas de acuerdo a instrucciones codificadas.”

Formatos más comunes:a.out (Unix).com (CP/M y MS-DOS).exe (MS-DOS y Windows) formalmente

llamado PE (Portable executable).

Page 26: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 26

Microsoft PE Portable Executable. Formato:

1. Encabezado EXE de MS-DOS (por compatibilidad).

2. Mini-programa MS-DOS: “This program cannot be run in DOS mode”.

3. Encabezado PE.4. Encabezados de las secciones.5. Sección .text: código.6. Sección .data: datos estáticos.

Page 27: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 27

Microsoft PE7. Sección .edata: tabla de símbolos exportados

(usado por DLLs).8. Sección .idata: tabla de símbolos importados.9. Sección .rdata: datos de solo lectura

(constantes y strings).10. Sección .tls: variables globales que pueden

ser accesadas como variables locales por hilos (threads).

11. Sección .rsrc: recursos como menús y diálogos.

12. Sección .reloc: información de relocalización.

Page 28: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 28

Microsoft PE

Page 29: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 29

Cargadores Conocidos en inglés como “loaders”. Carga el programa ejecutable en la memoria

y le cede el control. En algunos sistemas operativos como MS-

DOS el cargador es el que relocaliza el código.

Page 30: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 30

Cargador típico de Unix1. Lee el ejecutable y determina el tamaño de

los segmentos de texto y datos.2. Crea un espacio de direcciones

suficientemente grande para el texto y los datos.

3. Copia las instrucciones y datos a la memoria.

4. Copia los parámetros del programa principal (si es que existen) en la pila.

Page 31: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 31

Cargador típico de Unix5. Inicializa los registros incluyendo el

apuntador a la pila (sp).6. Brinca a una rutina de start-up que copia los

parámetros en los registros y llama a la rutina principal.

7. Cuando la rutina principal regresa, la rutina de start-up termina el programa con una llamada al sistema de exit.

Page 32: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 32

Resumen1. Compilador. Traduce el programa a lenguaje

ensamblador.2. Ensamblador. Genera un archivo objeto por

cada archivo en ensamblador.3. Linker. Resuelve referencias, relocaliza y

genera un ejecutable.4. Cargador. Carga el ejecutable en memoria y lo

corre.

El compilador típico incluye los 3 primeros pasos.

El cargador es parte del sistema operativo.

Page 33: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 33

Camino de un programa en Java

Page 34: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 34

CompiladorEl compilador de Java genera un archivo class por cada clase compilada.

El archivo class contiene:Tabla de métodos válidos con sus bytecodes.Información extra, como la clase padre.

Los bytecodes son las instrucciones de la máquina virtual de Java (JVM) y son independientes del hardware.

“Compila una vez, corre donde sea” (compile once, run anywhere).

Page 35: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 35

JVMLa máquina virtual de Java interpreta y

ejecuta los bytecodes.Algunas JVMs incluyen un compilador JIT

(just-in-time) que compila los bytecodes a código máquina conforme el programa está corriendo.

Page 36: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 36

Page 37: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 37

ExplicaciónAlgunos mnemónicos usan un prefijo:

a – dirección.b – byte (8 bits).i – entero (32 bits).s – short (16 bits).

I8 es una constante de 8 bits.I16 es una constante de 16 bits.

Page 38: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 38

ExplicaciónLa JVM usa una pila para guardar resultados

intermedios.Los operandos se guardan en la pila, se hace

la operación y se sacan.El compilador sabe el tamaño máximo de la

pila de operandos para cada método y le asigna espacio en el frame actual.

Page 39: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 39

ExplicaciónTOS = tope de la pila.NOS = siguiente posición debajo del TOS.NNOS = siguiente posición debajo del NOS.pop. Quita el TOS.pop2. Quita el TOS y el NOS.push. Agrega un elemento a la pila.Const[] se refiere al pool de constantes de la

clase creado por la JVM al momento de correr.Frame[] a las variables en el frame local del

método.

Page 40: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 40

Diferencias entre JVM y MIPS1. Para guardar resultados temporales: MIPS

usa registros, JVM una pila.2. Tamaño de instrucción: MIPS 4 bytes, JVM

de 1 a 5 bytes para ahorrar espacio.3. JVM tiene seguridad integrada. Por ejemplo,

en un arreglo, la JVM checa que la referencia al arreglo sea válida y que el índice esté dentro del límite.

Page 41: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 41

Diferencias entre JVM y MIPS4. Para que el recolector de basura encuentre

los apuntadores “vivos”, JVM tiene instrucciones distintas para operar con direcciones y para operar con enteros.

5. JVM tiene instrucciones complejas como crear espacio para un arreglo o invocar un método.

Page 42: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 42

Comparación entre JVM y MIPSCompilar el siguiente código en C/Java a

MIPS y JVM:

while (save[i] == k)i += 1;

Page 43: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 43

MIPS; s3 = i, s5 = k, s6 = dirección de save

ciclo:

sll $t1, $s3, 2 ; t1 = i * 4 / t1 = tiene el offset

add $t1, $t1, $s6 ; t1 apunta a save[i]

lw $t0, 0($t1) ; t0 = save[i]

bne $t0, $s5, Exit ; if save[i] k goto Exit

add $s3, $s3, 1 ; i++

j ciclo ; goto ciclo

Exit:

Page 44: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 44

JVM; i, k y save son las primeras tres variables locales.

0 aload_3 ; push variable local 3 (save)

1 iload_1 ; push variable local 1 (i)

2 iaload ; pop TOS y NTOS y push save[i]

3 iload_2 ; push variable local 2 (k)

4 if_icompne, Exit ; compara TOS y NTOS, los saca y ; brinca si no son iguales

7 iinc, 1, 1 ; i++

10 go to 0 ; brinca al inicio (byte 0)

Page 45: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 45

Comparación entre JVM y MIPSMIPS: 6 instrucciones, 24 bytes.JVM: 7 instrucciones, 13 bytes.

La diferencia es mayor si tomamos en cuenta que la JVM checa automáticamente que los accesos al arreglo estén dentro del rango.

Ciclo while modificado en MIPS para checar rangos ocupa 11 instrucciones, es decir, 44 bytes.

Page 46: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 46

Ciclo while en MIPS; s3 = i, s5 = k, s6 = dirección de save; s6 apunta a la lista de métodos legales para save; s6 + 4 apunta al tamaño del arreglo; s6 + 8 apunta a save[0] (primer elemento)

lw $t2, 4($s6) ; t2 = tamaño del arreglociclo:

slt $t0, $s3, 0 ; if i < 0bne $t0, $zero, IndexOutOfBounds ; goto Errorslt $t0, $s3, $t2 ; if i tamañobeq $t0, $zero, IndexOutOfBounds ; goto Error

Page 47: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 47

Ciclo while en MIPSsll $t1, $s3, 2 ; t1 = i * 4 / t1 = tiene el offset

add $t1, $t1, $s6 ; t1 apunta a save[i]

lw $t0, 8($t1) ; t0 = save[i]

bne $t0, $s5, Exit ; if save[i] k goto Exit

add $s3, $s3, 1 ; i++

j ciclo ; goto ciclo

Exit:

Page 48: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 48

Invocando métodos en Java El compilador escoge el método apropiado

dependiendo del tipo (clase) del objeto. El compilador genera código para:1. Revisar que objeto no sea nulo, y en su caso

brincar a una rutina de error.2. Cargar la lista de métodos válidos para ese

objeto. La primera palabra guarda un apuntador a esa tabla.

3. Cargar la dirección del método apropiado, dejando la dirección de regreso en la pila.

4. Brincar al inicio del método.

Page 49: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 49

Compilado vs. InterpretadoVentaja de un programa interpretado:

portabilidad.

Ventaja de un programa compilado: rapidez de ejecución.

Los compiladores JIT tratan de reducir esa ventaja.

Page 50: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 50

Compilado vs. Interpretado

Page 51: Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

Universidad de Sonora Arquitectura de Computadoras 51

Conceptos importantesCompilador.Ensamblador.Linker.Cargador o loader.Relocalización.Referencias internas.Referencias externas.Intérprete.Compilador JIT (just-in-time).