Lenguajes de Alto Nivel

4
Lenguajes de alto nivel Representación simbólica de las instrucciones de máquina ( 1 sentencia = 1 instrucción de máquina ). Ventaja: se puede alcanzar la máxima flexibilidad, performance, y manejo del HW. Desventaja: baja productividad, baja confiabilidad, difícil verificación y debugging, mantenimiento, costoso, baja portabilidad, etc. Lenguaje de alto nivel (HLL): Expresan los algoritmos de una manera adecuada a la capacidad cognitiva humana. Generan código más sencillo ( 1 sentencia HLL, varias instrucciones de máquina ). Portabilidad: código portable a diversas arquitecturas y sistemas operativos. Modularidad, facilidad de modificación y mantenimiento Productividad en la generación de código. Compiladores Un compilador es un programa que traduce un lenguaje fuente (source) en un lenguaje objetivo (target) equivalente • Un programa C traducido a Assembler. • Un programa Pascal traducido a Assembler. • Un programa Java traducido a JVM. • Un programa Java traducido a C. • Un programa LaTex traducido a Tex. • Un programa Assembler traducido a instrucciones de máquina. • Un programa HDL traducido a circuitos de HW. Procedimientos & Funciones Procedimiento: es una construcción que permite dar nombre a un conjunto de sentencias y declaraciones asociadas que se usan para resolver un subproblema dado. Una función es un procedimiento que

description

Programación

Transcript of Lenguajes de Alto Nivel

Page 1: Lenguajes de Alto Nivel

Lenguajes de alto nivel

Representación simbólica de las instrucciones de máquina ( 1 sentencia = 1 instrucción de máquina ).

Ventaja: se puede alcanzar la máxima flexibilidad, performance, y manejo del HW.

Desventaja: baja productividad, baja confiabilidad, difícil verificación y debugging, mantenimiento, costoso, baja portabilidad, etc. Lenguaje de alto nivel (HLL):

• Expresan los algoritmos de una manera adecuada a la capacidad cognitiva humana. • Generan código más sencillo ( 1 sentencia HLL, varias instrucciones de máquina ). • Portabilidad: código portable a diversas arquitecturas y sistemas operativos. • Modularidad, facilidad de modificación y mantenimiento • Productividad en la generación de código.

Compiladores

Un compilador es un programa que traduce un lenguaje fuente (source) en un lenguaje objetivo (target) equivalente

• Un programa C traducido a Assembler.• Un programa Pascal traducido a Assembler. • Un programa Java traducido a JVM. • Un programa Java traducido a C. • Un programa LaTex traducido a Tex. • Un programa Assembler traducido a instrucciones de máquina. • Un programa HDL traducido a circuitos de HW.

Procedimientos & Funciones

Procedimiento: es una construcción que permite dar nombre a un conjunto de sentencias y declaraciones asociadas que se usan para resolver un subproblema dado. Una función es un procedimiento que devuelve resultados. Se lo llama también subrutina, subprograma, rutina, etc.

• Puesto que un subproblema puede codificarse como un procedimiento, un problema complejo puede dividirse en subproblemas más simples, quienes a su vez pueden ser subdivididos hasta llegar a la descripción de subproblemas muy simples (Divide & Conquer, diseño Top-Down, etc.)

• Ventajas: reutilización del código y de la memoria, distribución entre programadores, simplicidad del testeo y debugging, mantenimiento, programación estructurada, etc.

• Desventajas: overhead moderado, y cuidados para el proceso de llamado y retorno E0

Page 2: Lenguajes de Alto Nivel

La Pila

Se utiliza para guardar variables locales. Es un arreglo (array) de dimensiones variables que crece típicamente hacia las direcciones más bajas de memoria y se achica hacia arriba.

Marco de Pila

Los lenguajes de programación modernos (HLL) tienen típicamente variables locales. Cada invocación de una función tiene su propia instancia de variables locales. La porción de la pila usada para invocar a una función o procedimiento se denomina Marco de Pila (Marco de Pila (stack frame, SF) frame, SF) o también o también activation activation record (AR) record (AR).

Organización

Un compilador puede usar cualquier esquema de layout que sea conveniente. Los fabricantes de microprocesadores especifican esquemas de layout estándar para su utilización para todos los compiladores. Si todos los compiladores usan las mismas calling conventions, entonces funciones compiladas con un compilador pueden llamar a funciones compiladas con otro compilador.

Pasaje de Parámetros

F (a , a , ..., a ) Los registros son más rápidos que la memoria. En lo posible el compilador debe mantener los valores en registros. Calling Calling convention convention moderna moderna: mejor que poner a , a , ..., a en stack frame, van a , ..., a ( )en registros r , r ,r ,r ,y a ,a ,a , ..., a en la pila. Si r ,r ,r ,r son necesarios para otro propósito, la función llamada deberá salvar los argumentos en juego en el stack frame. Este espacio debe ser reservado en el stack frame aún si los parámetros se pasan vía registros.

Los Registros guardan:

• Algunos Parámetros. • Valor de Retorno. Variables Locales • Resultados intermedios de expresiones (temporarios)

El Marco de Pila guarda

Variables pasadas por referencia o que tienen la dirección tomada Variables accedidas por procedimientos anidados dentro del corriente. Variables que son demasiado grandes para entrar en el register file. Array variables (se requiere arimética de direccionamiento para acceder elementos).

Page 3: Lenguajes de Alto Nivel

Registros – Asignación

• •Los compiladores típicamente ubican variables en la pila hasta que pueden determinar si pueden ser promovidos a un registro (p.ej. sin referencias).

• •La asignación de variables a registros la realiza el Register Allocator (etapa de optimización del compilador)

Registros - resguardo

El estado de los registros debe guardarse antes que la función invocada los utilice.

• Caller-save: los registros son responsabilidad de la función llamante. • Callee-save: los registros son responsibilidad de la función llamada.

Calling Conventions

• Los registros R0 hasta R3 son usados para pasar parámetros a la función. Dentro de la función se pueden usar para cualquier propósito y no necesitan preservarse.

• Los registros R4 hasta R11 deben ser preservados por la función llamada. Si los usa hay que enviarlos a la pila en el prólogo de la función (push, inst. STM) y recuperarlos al epílogo (pop, inst. LDM).

• Los registros R12 hasta R15 tienen propósitos especiales. R13 es el Stack Pointer (SP), R14 es el Link Register (LR), R12 es de scratch y R15 es el Program Counter (PC

• El valor de la función se devuelve en R0 (y en R1 de ser necesario).