Está en la página 1de 46

INSTITUTO TECNOLOGICO DE TAPACHULA

LENGUAJES Y AUTOMATAS 2

CATEDRATICO: DR. CERECEDO GARCIA MANUEL

INVESTIGACIÓN DE LAS UNIDADES
INTEGRANTES:
1. JANRY TRUJILLO GARCIA
2. JUAN CARLOS MONTES LOPEZ
3. JAVIER ALEXANDER AVENDAÑO GARCIA
4. WILBER MAURICIO MORALES GARCIA
5. MARIA ZENYISE GARCIA DE LEON
6. EDUARDO PEREZ SANDOVAL
7. JOSE FRANCISCO ALVARES JAVALOIS
8. FERNANDO DE JESUS VAZQUEZ DIAZ

CARRERA: ING. EN SISTEMAS COMPUTACIONALES

TAPACHULA, CHIAPAS A 27 DE MAYO DEL 2016

1 ANALISIS SEMANTICO
1.1. ARBOLES DE EXPRESIONES.
1.2. ACCIONES SEMANTICAS DE UN ANALIZADOR SINTACTICO.
1.3. COMPROBACIONES DE TIPOS EN EXPRESIONES .
1.4. PILA SEMANTICA EN UN ANALIZADOR SINTACTICO.
1.5. ESQUEMA DE TRADUCCION.
1.6. GENERACION DE LA TABLA DE SIMBOLO Y DE DIRECCIONES.
1.7. MANEJO DE ERRORES SEMANTICOS.
2 GENERACION DE CODIGO INTERMEDIO.
2.1 NOTACIONES
2.1.1 NOTACION PREFIJA
2.1.2 NOTACION INFIJA
2.2.3 NOTACION POSTFIJA
2.2 REPRESENTACIONES DE CODIGO INTERMEDIO.
2.2.1 NOTACION POLACA
2.2.2 CODIGO P
2.2.3 TRIPLOS
2.2.4 CUADRUPLOS.

2.3 ESQUEMA DE GENERACION.
2.3.1 VARIABLES Y CONSTANTES.
2.3.2 EXPRESIONES.
2.3.3 INSTRUCCIÓN DE ASIGNACION.
2.3.4 INSTRUCCIONES DE CONTROL.
2.3.5 FUNCIONES
2.3.6 ESTRUCTURAS
3 OPTIMIZACION
3.1 TIPOS DE OPTIMIZACION.
3.1.1 LOCALES.
3.1.2 CICLOS.
3.1.3 GLOBALES.
3.1.4 DE MIRILLA.
3.2 COSTOS.
3.2.1 COSTO DE EJECUCION. (MEMORIA REGISTROS PILAS)
3.2.2 CRITERIOS PARA MEJORAR EL CODIGO.
3.2.3 HERRAMIENTAS PARA EL ANALISIS DEL FLUJO DE DATOS.

4 GENERACION DE CODIGO OBJETO.
4.1 REGISTROS.
4.2 LENGUAJE ENSAMBLADOR.
4.3 LENGUAJE MAQUINA.
4.4 ADMINISTRACION DE MEMORIA.
-

Un árbol de expresión sirve para evaluar expresiones del tipo: (a + b)*c/d Para que un árbol represente una expresión se deben tomar en cuenta 2 características muy importantes:  Cualquier hoja está etiquetada sólo con un operando. Cada nodo del árbol de expresión representa una expresión. Los datos se almacenan en una estructura con forma de árbol.-ARBOLES DE EXPRECIÓN Arboles de expresiones Los árboles de expresiones representan el código de nivel del lenguaje en forma de datos.-ANALISIS SEMANTICO 1. como x < y. por ejemplo. una llamada al método o una operación binaria. .  Cualquier nodo interior n está etiquetado por un operador.1. UNIDAD 1 1.

-ACCIONES SEMANTICAS DE UN ANALIZADOR SINTACTICO.Completar la Tabla de Símbolos 3. · Comprobaciones del flujo de control. · Comprobaciones de unicidad. . · Comprobaciones de emparejamiento. El chequeo semántico se encarga de que los tipos que intervienen en las expresiones sean compatibles o que los parámetros reales de una función sean coherentes con los parámetros formales FUNCIONES PRINCIPALES 1. El análisis semántico dota de un significado coherente a lo que hemos hecho en el análisis sintáctico..-Realizar distintas comprobaciones y validaciones: · Comprobaciones de tipos.2.-Identificar cada tipo de instrucción y sus componentes 2. 1.

Sentencias “ejecutables”: Realizar comprobaciones de tipos entre los operandos implicados. ACCIONES SEMÁNTICAS Dependiendo del tipo de sentencias. 6. La especificación de la semántica puede realizarse de dos formas: 2.-Identificación de variables: Comprobar si un identificador ha sido declarado antes de utilizarlo. 2. 5. semántica de notacionales.-Conversiones y equivalencias de tipo: Verificación. 8. Gramáticas con Atributos.-Lenguaje natural 3. 7..Etiquetas: Comprobar si hay etiquetas repetidas y validación.. semántica Axiomática.Sentencias de Declaración: Completar la sección de tipos de la Tabla de Símbolos.Funciones y procedimientos: Comprobar el número. las acciones semánticas pueden agruparse en: 1. orden y tipo de los parámetros actuales en cada llamada a una función o procedimiento. en la cual se comienza a generar el código objeto...-Especificación formal: Semántica Operacional.-Constantes: Comprobar que no se utilicen en la parte izquierda de una asignación. .-Sobrecarga de operadores y funciones: Detectar y solventar.El Analizador Semántico finaliza la fase de Análisis del compilador y comienza la fase de Síntesis. 3. 4.

Si el tipo de alguno de los operandos es CHAR haremos una conversión explícita al tipo INT (líneas 17-18): nereida:~/doc/casiano/PLBOOK/PLBOOK/code/Simple- Types/lib/Simple> sed -ne '66.-COMPROBACIONES DE TIPO EN EXPRESIONES Comprobación de Tipos: Las Expresiones La comprobación de tipos la haremos expandiendo nuestro programa árbol con nuevas transformaciones para cada uno de los tipos de nodos. 0).3. 19 20 if (($x->{t} == $INT) and ( $y->{t} == $INT)) { 21 $_[0]->{t} = $INT. 23 } . 22 return 1. 1). 18 $y = char2int($_[0].trg | cat -n 1 bin: / PLUS 2 |MINUS 3 |TIMES 4 |DIV 5 |MOD 6 |GT 7 |GE 8 |LE 9 |EQ 10 |NE 11 |LT 12 |AND 13 |EXP 14 |OR 15 /($x.90p' Trans. 1. $y) 16 => { 17 $x = char2int($_[0]. Expresiones Binarias Las operaciones binarias requieren que sus operandos sean de tipo entero.

Por supuesto. si la gramática es ambigua una frase podría tener dos árboles y la ejecución de las acciones para ellos podría dar lugar a diferentes resultados.24 type_error("Incompatible types with operator '". 25 } 1. calculan y modifican los atributos asociados con los nodos del árbol sintáctico. Obsérvese que. en general.($_[0]->lexeme). $_[0]->line). si en la regla insertamos un fragmento de código: La acción se ejecutará después de todas las acciones asociadas con el recorrido del subárbol de y antes que todas las acciones asociadas con el recorrido del subárbol . ESQUEMA DE TRADUCCION Un esquema de traducción es una gramática independiente del contexto en la cual se han insertado fragmentos de código en las partes derechas de sus reglas de producción. Dichos fragmentos actúan."'". Si se quiere evitar la multiplicidad de resultados (interpretaciones semánticas) es necesario precisar de que árbol sintáctico concreto se está hablando. para poder aplicar un esquema de traducción hay que construir el árbol sintáctico y después aplicar las acciones empotradas en las reglas en el orden de recorrido primero-profundo. Por ejemplo. El orden en que se evalúan los fragmentos es el de un recorrido primero-profundo del árbol de análisis sintáctico. El siguiente esquema de traducción recibe como entrada una expresión en infijo y produce como salida su traducción a postfijo para expresiones aritmeticas con sólo restas de números: .5. Los fragmentos de código asi insertados se denominan acciones semánticas.

"} { $expr{TRA} = $NUM{VAL} } Las apariciones de variables sintácticas en una regla de producción se indexan como se ve en el ejemplo.$NUM{VAL}. las comprobaciones semánticas y la generación de código. el lenguaje y los parámetros. el cómputo del atributo $expr{TRA} depende de los atributos en los nodos hijos. Ejercicio 2. así como simplificar el análisis sintáctico.7. Esto ocurre a menudo y motiva 1. En este ejemplo.6.1 Muestre la secuencia de acciones a la que da lugar el esquema de traducción anterior para la frase 7 -5 -4. Análogamente $expr{TRA} denota el atributo ``traducción'' de los nodos de tipo . mientras tanto el analizador semántico es el encargado de añadir los tipos de símbolos para que aparezca en la tabla. GENERACION DE LA TABLA DE SIMBOLO Y DE DIRECCIONES Una tabla de símbolos está compuesta por frases o instrucciones de un lenguaje libre de contexto." ". { $expr{TRA} = $expr[1]{TRA}. Aquí VAL es un atributo de los nodos de tipo denotando su valor numérico y para accederlo escribiremos $NUM{VAL}. Cuando hablemos del atributo de un nodo utilizaremos una indexación tipo hash. o lo que es lo mismo. si estos son agregados y calificados de una sola pasada se en ese m ismo instante son detectados por ambos analizadores." . su principal función es identificar palabras que son seguidas por otras. están estructuradas por el símbolo y los atributos de este mismo y dependen de la gestión de la memoria. para distinguir de que nodo del árbol de análisis estamos hablando. depende de los atributos de los símbolos en la parte derecha de la regla de producción. . Para construir una tabla de símbolos trabajan en conjunto dos tipos de analizadores en principio el analizador léxico quien es el encargado de insertar los símbolos detectados a la tabla y crearla y señalar la línea del programa fuente en la que aparece.

En la organización de la tabla de símbolos(TS). el lenguaje SIN estructura de Bloque está estructurado por una lista que puede estar ordenada por medio de árboles binarios y tablas de Hash o simplemente no ordenada. donde el número de argumentos que posee y sus tipos para la reserva de memoria. Un formato variable aquí es donde se introducen los símbolos de modo consecutivo donde se sustituye el nombre del símbolo por la longitud. la manera de implementación dependerá de la distribución de la información según las características del lenguaje y sus restricciones y está estructurada por varios campos establecidos de la siguiente manera: *Campos para el símbolo: contiene un formato fijo que es utilizado cuando tiene un límite de caracteres es decir un área fija para almacenar el símbolo. son declaraciones para INSERTAR y referencia solo para CONSULTAR. *Campos Lista Cruzada de referencia y Puntero de orden: es el traductor con el objeto para facilitar el uso de la tabla de símbolos. y Reset(fin del bloque). *Campo Tipo: se utiliza para el almacenamiento de la memoria y la comprobación de los tipos y se aplica cuando una variable es implícita o explícita. que son declaradas según el lenguaje y se clasifica en dos tipos de variables: Explicitas. que pueden tener acciones de CONSULTAR. mientras tanto los lenguajes CON estructura de Bloque utilizan una tabla para cada Bloque como una PILA + Índice que nos muestra el principio y el final de un bloque además podemos consultar. *Campo dirección: se clasifica en dos tipos de lenguaje el SIN estructura de Bloque su función es asignar las direcciones según el orden en el que son declaradas. y los Lenguajes CON estructura de Bloques. INSERTAR y crear su tablas. insertar y modificar los bloques utilizando operaciones como set(inicio del bloque).CONSULTAR. para cada bloque se asigna una sub tabla con dos campos y se utiliza en la fase de generación de código. otra variable son lasImplícitas. MODIFICAR. . *Campo Nº de dimensiones /Nº de parámetros: se trata de una función o procedimiento.También una tabla de símbolos cuenta con operaciones como INSERTAR.

Si el tipo de un operando no concuerda con los requisitos de tipo del operador. el error semántico sea informado al programador. .32. la mayoría de los errores semánticos pueden ser detectados mediante la revisión de la tabla de símbolos. Error: Ej2. se suprimirá la generación de código. Al hacerlo. también es conveniente reemplazar el operando con una variable ficticia de tipo universal. x = 4.int Es mucho más difícil introducir métodos formales para la recuperación de errores semánticos que para la recuperación de errores sintácticos. Sin embargo. ya que dependen de él. por tanto. que se le ignore y que.7. evitamos la producción de un mensaje de error cada vez que se use la variable no definida. 1. por lo menos. suponiendo un tipo que se base en el contexto donde ocurra o un tipo universal que permita al identificador ser un operando de cualquier operador del lenguaje. este tipo de error es el más difícil de depurar. puede requerirse que.java [7:1] operator || cannot be applied to int. MANEJO DE ERRORES SEMANTICOS Los errores que puede detectar el analizador sintáctico son aquellos que violan las reglas de una gramática independiente del contexto. No obstante. Ya hemos mencionado que algunas de las características de un lenguaje de programación no pueden enunciarse con reglas independientes del contexto. ya que a menudo la recuperación de errores semánticos es ad hoc.java [6:1] possible loss of precision Variables usadas y no definidas Operandos de tipos no compatibles if (x || 5) x = 0. Error: Ej1. Por lo tanto. En cierto modo. los principales errores semánticos son: Conversiones de tipos no permitidas int x. por ejemplo. la restricción de que los identificadores deben declararse previamente. ya que ni el compilador ni el sistema proporcionan información sobre qué está fallando.

. algunos compiladores generan una representación intermedia explicita del programa fuente. Después de los análisis sintáctico y semántico. Esta representación intermedia debe tener dos propiedades importantes. UNIDAD 2 2. debe ser fácil de producir y fácil de traducir al programa objeto. Un error semántico se produce cuando la sintaxis del código es correcta. . y permitir más fácilmente la transportabilidad de unas máquinas a otras.Lo único cierto es que el programa no se está comportando como debería. pero la semántica o significado no es el que se pretendía.GENERACIÓN DE CÓDIGO INTERMEDIO El objetivo del código intermedio es reducir el número de programas necesarios para construir traductores.

Las expresiones aritméticas se pueden expresar de tres formas distintas: infija. 2 + 2) usando un estilo de infijo. como la notación de prefijo (ej.) por las computadoras.1. el resultado es una sintaxis que carece de paréntesis u otros signos de agrupación. Si la aridad (es el número de argumentos necesarios para que dicho operador o función se pueda calcular. y el álgebra. 2 2 +).) de los operadores es fija. Su característica distintiva es que coloca los operadores a la izquierda de sus operandos. para indicar el orden en el cual deben ser . en la cual se escriben los operadores entre los operandos en que están actuando (ej. 2.1 NOTACIONES Las notaciones sirven de base para expresar sentencias bien definidas. 2. prefija y postfija. a diferencia de las notaciones de prefijo o posfijo. No es tan simple de analizar (parser. es una de las partes de un compilador que transforma su entrada en un árbol de derivación.2 NOTACIÓN DE INFIJA La notación de infijo es la notación común de fórmulas aritméticas y lógicas.1. 2. es una forma de notación para la lógica. aunque muchos lenguajes de programación la utilizan debido a su familiaridad. En la notación de infijo. El uso más extendido de las notaciones sirve para expresar operaciones aritméticas. + 2 2) o la notación de postfijo (ej. es necesario rodear entre paréntesis a los grupos de operandos y operadores. la aritmética. también conocida como notación de prefijo o notación prefija. y todavía puede ser analizada sin ambigüedad. La diversidad de notaciones corresponde en que para algunos casos es más sencillo un tipo de notación.1 NOTACIÓN PREFIJA La notación prefija.

lo próximos que están a las maquinas reales y lo fácil que es trabajar con ellos.realizadas las operaciones. Llamada también polaca inversa. Ejemplos:  a*b  ab*  a*(b+c/d)  abcd/+*  a*b+c*d  ab*cd*+ Ejemplo Si deseamos representar las expresiones (2+3(3*4))=x y ((2+3)*4)=x en las tres notaciones mencionadas anteriormente seria: (2+3(3*4))=x ((2+3)*4)=x Notación Prefija =+2*34x =*+234x Notación Infija 2+3*4=x (2+3)*4=x Notación postfija 234*+x= 23+4*x= 2. otros tipos de código intermedio que representan los programas como árboles o grafos y representaciones mixtas que combinan grafos o árboles y representaciones lineales. se usa para representar expresiones sin necesidad de paréntesis. La notación postfija pone el operador al final de los dos operandos. ciertas reglas de prioridad determinan el orden de las operaciones.2 REPRESENTACIÓN DE CÓDIGO INTERMEDIO Estas notaciones simplifican la traducción de nuestro código fuente a nuestro código objeto ya que ahorran y acotan símbolos de la tabla de símbolo. Existen diversos tipos de códigos intermedios que varían en cuanto a su sencillez. Lenguaje Intermedio . por lo que la expresión queda: ab+5- La notación postfija utiliza una estructura del tipo LIFO (Last First Out) pila. Generación de Código Intermedio Proceso de Síntesis. 2.2. En la ausencia de paréntesis.3 POSTFIJA La notación postfija pone el operador al final de los dos operandos. la cual es la más utilizada para la implementación.

Aumentar la portabilidad del compilador de una máquina a otra. Aumentar la portabilidad del compilador de una máquina a otra Se puede utilizar el mismo analizador para diferentes generadores Se pueden utilizar optimizadores independientes de la máquina Tipos de representaciones intermedias La representación del código intermedio depende de la máquina objeto: 0-direcciones: código para máquinas de pila (código P). Notación Polaca Inversa (RPN). de fácil optimización. Se puede utilizar el mismo analizador para diferentes generadores. Fácil de traducir a código máquina real. Propiedades: Fácil de producir en el análisis semántico. Instrucciones simples y concisas. 2-direcciones: códigos para máquinas con operaciones sobre registros de memoria. En todo caso. Generación de Código Ventajas del código intermedio. 3-direcciones: código para máquinas de arquitectura RISC. Facilitar la fase de optimización. Tipos Árboles de Sintaxis Abstracta. . añade un recorrido descendente adicional para generar el código final.

En todos los mencionados.2 CÓDIGO P Prolog. es decir. Código P Códigos de tres direcciones  Cuartetos  Tercetos  Tercetos Indirectos. Warren desarrolló un compilador capaz de traducir Prolog en un conjunto de instrucciones de una máquina abstracta denominada Warren Abstract Machine. a mediados de los 70. Pascal. 2. bastante popular en el medio de investigación en Inteligencia Artificial. etc.D.1. NOTACIÓN POLACA La notación polaca es la originada por un Autómata con pila. o abreviadamente. proveniente del francés Programation et Logique. en el . es un lenguaje de programación lógico e interpretado. WAM. C. Desde entonces Prolog es un lenguaje semi-interpretado. David H. Inicialmente se trataba de un lenguaje totalmente interpretado hasta que. Se trata de un lenguaje de programación ideado a principios de los años 70 en la universidad de Aix-Marseille por los profesores Alain Colmerauer y Phillipe Roussel. lo que lo diferencia enormemente de otros lenguajes más populares tales como Fortran. en la que los operadores siempre preceden a los operandos sobre los que actúan. Prolog se enmarca en el paradigma de los lenguajes lógicos. y que tiene la ventaja de no necesitar paréntesis: Estándar Ejemplo 1: 2 * (3 + 5) Ejemplo 2: 2 * 3 + 5 Polaca Ejemplo 1: * 2 + 3 5 Ejemplo 2: + * 2 3 5 2. las instrucciones se ejecutan normalmente en orden secuencial.2. una a continuación de otra.2.

pero en los cuádruplos requiere que ellos tengan nombre implícitos. Su ejecución se basa en dos conceptos: la unificación y el backtracking. Los programas en Prolog se componen de cláusulas de Horn que constituyen reglas del tipo “modus ponendo ponens”. que consiste en deshacer todo lo ejecutado situando el programa en el mismo estado en el que estaba justo antes de llegar al punto de elección. Cada objetivo se separa con una coma y puede considerarse similar a una instrucción o llamada a procedimiento de los lenguajes imperativos. Esta clase incluye un amplio número de representaciones diferentes entre las cuales encontramos cuádruplos y triples. cada objetivo determina un subconjunto de cláusulas susceptibles de ser ejecutadas. La principal diferencia entre estas notaciones y la notación postfija es que ellos incluyen referencias explicitas para los resultados de los cálculos intermedios. entonces es verdad el consecuente”. es decir. Prolog selecciona el primer punto de elección y sigue ejecutando el programa hasta determinar si el objetivo es verdadero o falso. En caso de ser falso entra en juego el ‘backtracking’.2.3 TRIPLOS En la historia de los compiladores han sido utilizadas una amplia variedad de representaciones intermedias como lo es la siguiente clase de representación de código intermedio de un árbol de 3 direcciones. 2. Gracias a la unificación. pero ellos dependen de su posición. El antecedente puede ser una conjunción de condiciones que se denomina secuencia de objetivos. En Prolog no existen instrucciones de control.  Los triples tienen una ventaja obvia de ser más consistente. “Si es verdad el antecedente. Primero se escribe el consecuente y luego el antecedente. . No obstante. una instrucción condicional o una transferencia). mientras que la notación posfija los resultados son implícitos al representarlos en una pila.mismo orden en que están escritas. que sólo varía cuando se alcanza una instrucción de control (un bucle. y hacen que la optimización presente cambios de código mucho más compleja.  La diferencia entre triples y cuádruplos es que con los triples es referenciado el valor intermedio hacia el número del triple que lo creo. 2 para los operandos y una para la ubicación del resultado. Cada una de ellas se denomina punto de elección. la forma de escribir las cláusulas de Horn es al contrario de lo habitual.

Tomaremos algunos esquemas de generación del lenguaje C. Sin embargo. la proposición de tres direcciones x = y + z se podría representar mediante el cuádruplo (ADD. . en esta notación.y. arg2 y resultado. Por ejemplo. Los operadores unarios como x:=-y no utilizan arg2. De esta manera. Es una estructura tipo registro con cuatros campos que se llaman: op. 2. se hace referencia a un valor temporal según la posición de la proposición que lo calcula. Los esquemas de generación son las estrategias o acciones que se deberán realizarse y tomarse en cuenta en el momento de generar código intermedio. arg1. OP tiene un código intermedio. La implementación se hace mediante registros de solo tres campos (op. Como se necesitan cuatro campos se le llama representación mediante cuádruplos. arg1. Los esquemas de generación dependen de cada lenguaje. arg2 y resultado son valores de tipo puntero y apuntan a una entrada en la tabla de símbolos. Generalmente arg1. un optimizador podría mover una instrucción reordenando la lista. 2. Las propias instrucciones representan el valor del nombre temporal. Los campos que no se usan se dejan vacíos o un valor NULL. Las proposiciones con operadores unarios no usan el arg2. x. trasladar una proposición que defina un valor temporal exige que se modifiquen todas las referencias a esa proposición  Una forma de solucionar esto consiste en listar las posiciones a las tripletas en lugar de listar las tripletas mismas.  En la notación de tripletes se necesita menor espacio y el compilador no necesita generar los nombres temporales. arg2).4 CUÁDRUPLOS.3 ESQUEMA DE GENERACIÓN.  Para evitar tener que introducir nombres temporales en la tabla de símbolos.2. z). sin tener que mover las tripletas en sí.

or y not) aplicados a los elementos que son variables booleanas o expresiones relacionales. condiciones entre otros. saltos. En los lenguajes de programación hay estructuras y operadores que permiten controlar el flujo de la ejecución. Se utilizan para calcular valores lógicos y como expresiones condicionales en proposiciones que alteran el flujo del control. Algunos lenguajes permiten expresiones más generales donde se pueden aplicar operadores booleanos. como las proposiciones if-else o do-while. las expresiones booleanas tienen dos propósitos principales. . Esquema de generación de código 2. Expresiones booleanas En los lenguajes de programación.4 INSTRUCCIONES DE CONTROL. sin diferenciar valores booleanos de aritméticos. si es necesario se realiza una coerción. Las expresiones booleanas se componen de los operadores boleanos (and. aritméticos y relacionales a expresiones de cualquier tipo.3. estos pueden ser ciclos.

3.Saltos En el código de los saltos los operadores lógicos &&. propósitos y servicio que se le da al lenguaje al comunicarse. 2. . en donde la función que prevalece es el factor en donde más se pone énfasis al comunicarse. las funciones del lenguaje son los diferentes objetivos. mandatos o sugerencias. || y ! son traducidos a saltos aunque estos no aparecen realmente en el código. Diversos lingüistas (Karl Bühler. Roman Jakobson. mediante la que se influye en el receptor del mensaje a través de órdenes. Michael Halliday…) han propuesto distintas clasificaciones de las funciones del lenguaje: Bühler propuso que existían únicamente tres funciones:  La Representativa (por la cual se trasmiten informaciones objetivamente)  La Expresiva o emotiva (que expresa sentimientos del emisor)  La Conativa. entendemos que es el uso de la lengua que hace un hablante. se puede traducir como las siguientes instrucciones: If x < 100 goto L2 If False x > 200 goto L1 If False x != y goto L1 L2: x =0 L1: Si la expresión es verdadera se alcanza la etiqueta L2 y se realiza la asignación en caso contrario no haría nada. dándose una función del lenguaje por cada factor que tiene éste.5 FUNCIONES Función del Lenguaje. En simples palabras. Por ejemplo la expresión: if (x < 100 || x > 200 && x!= y ) x=0.

Aunque un programa fuente se puede traducir directa mente al lenguaje objeto. de forma que sea posible traducir este código intermedio a cualquier máquina real. tan sólo son necesarios 2*n traductores. sino que corresponde a una máquina abstracta.3. Así por ejemplo un fabricante de compiladores puede construir un compilador para diferentes máquinas objeto con tan sólo cambiar las dos últimas fases de la tarea de síntesis. algunas ventajas de utilizar una forma intermedia independiente de la máquina son:  Se facilita la re destinación: se puede crear un compilador para una máquina distinta uniendo una etapa final para la nueva máquina a una etapa inicial ya existente. . Sin embargo si se construye un lenguaje intermedio. Sería necesario construir n*(n-1) traductores. Supóngase que se tienen n lenguajes. 2. y se desea construir traductores entre ellos.6 ESTRUCTURAS El código intermedio no es el lenguaje de programación de ninguna máquina real. y permitir más fácilmente la transportabilidad de unas máquinas a otras. que se debe de definir lo más general posible. El objetivo del código intermedio es reducir el número de programas necesarios para construir traductores.

pág. Unidad VI Generación de Código Intermedio. 1-28.  Se puede aplicar a la representación intermedia un optimizador de código independiente de la máquina.C. . M. Universidad técnica de México pág. Año 2010.pdf.itmorelia.mx/~jcolivares/courses/ps207a/ps2_u6. Generación de código procesador de lenguaje. Lenguaje y autómata II. 1-36. http://dsc. Juan Carlos Olivares Rojas. BIBLIOGRAFÍA Lenguaje y Autómatas II.edu.

1 Tipos De Optimización La optimización va a depender del lenguaje de programación y es directamente proporcional al tiempo de compilación. Las optimizaciones pueden realizarse de diferentes formas. La mayoría de . Como el tiempo de optimización es gran consumidor de tiempo (dado que tiene que recorrer todo el árbol de posibles soluciones para el proceso de optimización) la optimización se deja hasta la fase de prueba final. entre más optimización mayor tiempo de compilación. espacio. es decir. etc. La optimización se realiza reestructurando el código de tal forma que el nuevo código generado tenga mayores beneficios. es decir. La optimización es un proceso que tiene a minimizar o maximizar alguna variable de rendimiento. generalmente tiempo. UNIDAD 3. Las optimizaciones se realizan en base al alcance ofrecido por el compilador de programación y es directamente proporcional al tiempo de compilación. entre más optimización mayor tiempo de compilación. procesador. Desafortunamente no existen optimizador que hagan un programa más rápido y que ocupe menor espacio.OPTIMIZACIÓN 3. Algunos editores ofrecen una versión de depuración y otra de entrega o final.

los compiladores tienen una optimización baja. se necesita de compiladores especiales para realmente optimizar el código. .

Como el espacio de soluciones es más pequeño la optimización local es más rápida.1 Locales La optimización local se realiza sobre módulos del programa. La optimización local sirve cuando un bloque de programa o sección es crítico por ejemplo: la E/S. clases. Optimización Local La optimización local sirve cuando un bloque de programa o sección es crítico por ejemplo: la E/S. Optimización Local La optimización local sirve cuando un bloque de programa o sección es crítico por ejemplo: la E/S. Como el espacio de soluciones es más pequeño la optimización local es más rápida. 3. procedimientos. la . métodos. la rapidez y confiabilidad de un conjunto de instrucciones. En la mayoría de las ocasiones a través de funciones. etc. la concurrencia. La característica de las optimizaciones locales es que sólo se ven reflejados en dichas secciones. procedimientos. métodos. la concurrencia. En la mayoría de las ocasiones a través de funciones. La característica de las optimizaciones locales es que sólo se ven reflejados en dichas secciones. Locales Optimización La optimización local se realiza sobre módulos del programa.1. clases. la rapidez y confiabilidad de un conjunto de instrucciones. etc. Las características de las optimizaciones locales es que solo se ven reflejados en dichas secciones.

a=3+i f=a b=f+c d=a+m m=f+d ! a=3+i b=a+c d=a+m m=a+d . Propagación de copias Ante instrucciones f=a.5 ! j=4 f = 6. la rapidez y confiabilidad de un conjunto de instrucciones.5 2. concurrencia. EJEMPLOS: 1. sustituir todos los usos de f por a. Ejecución en tiempo de compilación Pre calcular expresiones constantes (con constantes o variables cuyo valor no cambia). 3! i = 5 j=4 f = j + 2. Reutilización de expresiones comunes a=b+c d=a-d e=b+c f=a-d ! a=b+c d=a-d e=a f=a–d 3.

Eliminación redundancias en acceso matrices Localizar expresiones comunes en cálculo direcciones de matrices.1. Transformaciones algebraicas: Aplicar propiedades matemáticas para simplificar expresiones o Eliminación secuencias nulas o Reducción de potencia o Reacondicionamiento de operandos 3. 5. el problema se hace N veces más grandes. y si dichas acciones están mal realizadas.4.2 Ciclos Los ciclos son una de las partes más esenciales en el rendimiento de un programa dado que realizan acciones repetitivas. La mayoría de las optimizaciones sobre ciclos tratan de encontrar elementos que no deben repetirse en un ciclo. .

utilizar instrucciones en ensamblador. } En este caso es mejor pasar el int c =a. E/S. Ciclos El problema de la optimización en ciclos y en general radica es que muy difícil saber el uso exacto de algunas instrucciones. ciclos y saltos de rutinas.Ciclos while(a == b) { int c = a. etc. c = 5.) 3. . •Algunas optimizaciones incluyen utilizar como variables registros del CPU. •Otros uso de la optimización pueden ser el mejoramiento de consultas en SQL o en aplicaciones remotas (sockets. De mirilla •La optimización de mirilla trata de estructurar de manera eficiente el flujo del programa. •Este tipo de optimización es más lenta pero mejora el desempeño general de todo programa. sobre todo en instrucciones de bifurcación como son las decisiones.1. Así que no todo código de proceso puede ser optimizado. …. •Las optimizaciones globales pueden depender de la arquitectura de la máquina.3 Globales La optimización global se da con respecto a todo el código. •En algunos casos es mejor mantener variables globales para agilizar los procesos (el proceso de declarar variables y eliminarlas toma su tiempo) pero consume más memoria. fuera del ciclo de ser posible.

utilizar instrucciones en ensamblador.•La idea es tener los saltos lo más cerca de las llamadas. La lluvia de ideas pensamiento creativo pensamiento prejuicioso el pensamiento emocional el pensamiento intuitivo. Una Definición Propuesta: El pensamiento crítico debe ser contrastado con el pensamiento no- critico.1. La definición de Huitt: El pensamiento crítico es la actividad mental disciplinada de evaluar los argumentos o proposiciones haciendo juicios que puedan guiar el desarrollo de las creencias y la toma de acción. Constituye una nueva fase aislada. siendo el salto lo más pequeño posible Optimización de tipo Mirilla (Peephole optimization) Aplicable en código intermedio o código objeto. 1994). 1993. Algunas optimizaciones incluyen utilizar como variables registros del CPU. secuencias reemplaza.4 De Mirilla El pensamiento crítico es un elemento importante para el éxito en la vida (Huitt. Pensamiento habitual o rutinario. Se utiliza una ventana de instrucciones y un conjunto de patrones de transformación (patrón.) Si las instrucciones de la ventana en cajan con algún patrón se reemplazan por lo secuencia de reemplazamiento asociada de Variables y eliminarlas toma su tiempo) pero consume más memoria. 3. Idea Básica Se recorre el código buscando combinaciones de instrucciones que puedan ser reemplazadas por otras equivalentes más eficientes. Thomas y Smoot. .

Ejemplos:  Eliminación de cargas innecesarias  Reducción de potencia  Eliminación de cadenas de saltos 3. remplazan). La idea es tener los saltos lo más cerca de las llamadas.  Se utiliza una ventana de n instrucciones y un conjunto de patrones de transformación (patrón. secuencias. siendo el salto lo más pequeño posible. Ideas básicas:  Se recorre el código buscando combinaciones de instrucciones que pueden ser reemplazadas por otras equivalentes más eficientes. ciclos y saltos de rutinas.2 Costos Los costos son el factor más importante a tomar en cuenta a la hora de optimizar ya que en ocasiones la mejora obtenida puede verse no reflejada en el programa final pero si ser perjudicial para el equipo de desarrollo. Optimización de Mirilla La optimización de mirilla trata de estructurar de manera eficiente el flujo del programa. sobre todo en instrucciones de bifurcación como son las decisiones.  Las nuevas instrucciones son reconsideradas para las futuras optimizaciones. La optimización de una pequeña mejora tal vez tenga una pequeña ganancia en tiempo o en espacio pero sale muy costosa en tiempo en generarla. .

la mejora obtenida puede ser N veces mayor por lo cual el costo se minimiza y es benéfico la mejora. En algunos programas se tiene un mínimo para ejecutar el programa. la gran mayoría de las veces requieren de procesadores rápidos (e. Las aplicaciones multimedios como los videojuegos tienen un costo de ejecución alto por lo cual la optimización de su desempeño es crítico. .2. i< 10000. Los dispositivos móviles tienen recursos más limitados que un dispositivo de cómputo convencional razón por la cual. por lo que el espacio y la velocidad de los microprocesadores son elementos que se deben optimizar para tener un mercado potencial más amplio. En algunos casos es preferible tener la lógica del negocio más fuerte en otros dispositivos y hacer uso de arquitecturas descentralizadas como cliente/servidor o P2P. si la ganancia es de 30 ms 300s. Registros. i++). Otro tipo de aplicaciones que deben optimizarse son las aplicaciones para dispositivos móviles. el mejor uso de memoria y otros recursos de hardware tiene mayor rendimiento.1 Costo de Ejecución (Memoria. tarjetas de video) o de mucha memoria. 3.Pero en cambio si esa optimización se hace por ejemplo en un ciclo. Pilas) Los costos de ejecución son aquellos que vienen implícitos al ejecutar el programa.g. Por ejemplo: for (int i=0.

2. Existen algunas herramientas que permiten el análisis y la correcta optimización del flujo de datos entre las más importantes están: DEPURADOR DESAMBLADOR DIAGRAMA DE FLUJO DICCIONARIO DE DATOS . Muchos de estos criterios pueden modificarse con directivas del compilador desde el código o de manera externa. el problema radica en que el costo podría ser muy grande ya que tendría que codificar más y/o hacer su código más legible. La optimización al igual que la programación es un arte y no se ha podido sistematizar del todo.2 Criterios para Mejorar Código La mejor manera de optimizar el código es hacer ver a los programadores que optimicen su código desde el inicio. Los criterios de optimización siempre están definidos por el compilador. entre ellas tenemos los depuradores y desambladores. 3. 3.2.3 Herramientas para Análisis del Flujo de Datos Existen algunas herramientas que permiten el análisis de los flujos de datos. Este proceso lo realizan algunas herramientas del sistema como los ofuscadores para código móvil y código para dispositivos móviles.

en que está dirigido a un lenguaje de alto nivel en vez de al lenguaje ensamblador.com/doc/243502906/manual-programacion-de-sistemas-1. la transformación de entradas en salidas. Un desensamblador se diferencia de un compilador. y también de cálculos intermedios. permitiendo al usuario ejercer cierto control sobre los mismos a medida que los estos se ejecutan. registros. DICCIONARIO DE DATOS El Diccionario de Datos es un listado organizado de todos los elementos de datos que son pertinentes para el sistema.scribd. banderas.doc . DIAGRAMA DE FLUJO DE DATOS Es una herramienta de modelización que permite describir. el DFD también es conocido con el nombre de Modelo de Procesos de Negocios. BIBLIOGRAFIA http://es.) en el momento en que se presente algún problema. de un sistema.DEPURADOR Es una aplicación que permite correr otros programas. con definiciones precisas y rigurosas que le permite al usuario y al proyectista del sistema tener una misma comprensión de las entradas. DESAMBLADOR Es un programa de computadora que traduce el lenguaje de máquina a lenguaje ensamblador. de las salidas. la operación inversa de la que hace el ensamblador. y examinar el estado del sistema (variables. etc.

que es una dirección de memoria. Registros de uso general: AX = Registro acumulador. 0). 3. Los registros son direccionables por medio de una viñeta. 13…. se numeran de derecha a izquierda (15.. GENERACIÓN DE CÓDIGO OBJETO 4. BX = Registro base. después de la operación arroja un resultado. 1.UNIDAD 3. dividido en BH y BL. . por conveniencia. 2. dividido en AH y AL (8 bits cada uno).- Interviene en las operaciones aritméticas y lógicas.Se utiliza en transferencias de datos entre la memoria y el procesador. manejar direccionamiento de memoria y proporcionar capacidad aritmética. Los registros se dividen en:  Registros de segmento  Registros de apuntadores de instrucciones  Registros apuntadores  Registros de propósitos generales  Registro índice  Registro de bandera. Los registros son espacios físicos dentro del microprocesador con capacidad de 4 bits hasta 64 bits dependiendo del microprocesador que se emplee.1 Registros Lenguaje Ensamblador Los registros del procesador se emplean para controlar instrucciones en ejecución. los registros están divididos en seis grupos los cuales tienen un fin específico. 14. Los bits.

Registros de segmento. Cuando algunas instrucciones piden comparaciones o cálculos aritméticos cambian el estado de las banderas.. Que son las operaciones de punta. ES. SS (pila). Registro Apuntador de instrucciones. (IP) El registro apuntador de instrucciones (IP) de 16 bits contiene el desplazamiento de dirección de la siguiente instrucción que se ejecuta. Registro índice. . Los registros de banderas sirven parar indicar el estado actual de la máquina y el resultado del procesamiento. dividido en CH y CL. FS y GS.Se utiliza en operaciones de multiplicación y división junto con Ax y en operaciones de entrada y salida de puertos.CX = Registro contador. DS (datos). Un registro de segmento tiene 16 bits de longitud y facilita un área de memoria para direccionamientos conocidos como el segmento actual..Se utiliza como contador en bucles (LOOP). DX = Registro de datos. y en desplazamientos (CL). Un registro de segmento se utiliza para alinear en un límite de párrafo o dicho de otra forma codifica la dirección de inicio de cada segmento y su dirección en un registro de segmento supone cuatro bits 0 a su derecha. Registro de bandera. su mitad inferior DL contiene el número de puertos. en operaciones con cadenas (REP). dividido en DH y DL. Los registros de segmento son: CS (código). Los registros SI y DI están disponibles para direccionamientos indexados y para sumas y restas.

2 Lenguaje Ensamblador Características El lenguaje Assembly es un tipo de lenguaje de bajo nivel utilizado para escribir programas informáticos. evitando tediosos cálculos y direccionamiento manual después de cada modificación del programa. . y constituye la representación más directa del código máquina específico para cada arquitectura de computadoras legible por un programador. especialmente cuando se requiere la manipulación directa del hardware o se pretenden rendimientos inusuales de los equipos. 4. El uso de referencias simbólicas es una característica básica de los ensambladores. Ensambladores Un ensamblador crea código objeto traduciendo instrucciones mnemónicas a códigos operativos. e interpretando los nombres simbólicos para direcciones de memoria y otras entidades. pero actualmente sólo se utiliza en contadas ocasiones. Fue usado ampliamente en el pasado para el desarrollo de software.

como por ejemplo MIPS. Sofisticado procesamiento de macros. uniones. . Los ensambladores son por lo general más fáciles de programar que los compiladores de lenguajes de alto nivel. y han estado disponibles desde la década de 1950. completando una instrucción de ensamblador típica. especialmente para arquitecturas basadas en RISC. Los ensambladores modernos. elegido por los diseñadores de la colección de instrucciones para abreviar “move” (mover). a fin de generar series de instrucciones cortas que se ejecutan en tiempo real. clases y conjuntos. Los ensambladores de alto nivel ofrecen posibilidades de abstracción que incluyen: Control avanzado de estructuras. Tipos de datos que incluyen estructuras. un procesador x86 puede ejecutar la siguiente instrucción binaria como se expresa en código maquina: Binario: 10110000 01100001 (Hexadecimal: 0xb061) La representación equivalente en Assembly es más fácil de recordar: Mov al. Por ejemplo.El opcode es seguido por una lista de argumentos o parámetros. El mnemónico “mov” es un código de operación u “opcode”. SPARC y PA-RISC optimizan las instrucciones para explotar al máximo la eficiencia de segmentación del CPU. declaración de funciones. en lugar de utilizar subrutinas. Procedimientos de alto nivel. Lenguaje Un programa escrito en lenguaje Assembly consiste en una serie de instrucciones que corresponden al flujo de órdenes ejecutables que pueden ser cargadas en la memoria de una computadora. registros. 061h Esta instrucción significa: Mueva el valor hexadecimal 61 (97 decimal) al registro “al”.La mayoría de los ensambladores también incluyen facilidades para crear macros..

y “si = 0″ sobre el resultado de la condición anterior. A diferencia de los lenguajes de alto nivel. y los respectivos lenguajes Assembly reflejan tal diferencia. en algunos casos. un ensamblador puede utilizar una pseudo instrucción al grupo “haga si menor que”. la forma en que lo hacen difiere. aquí hay usualmente una correspondencia 1 a 1 entre las instrucciones simples del ensamblador y el lenguaje máquina. Aunque la mayoría de las computadoras son capaces de cumplir esencialmente las mismas funciones. Los ordenadores difieren en el tipo y número de operaciones que soportan. y en consecuencia su propio lenguaje Assembly. . Cada arquitectura de computadoras tiene su propio lenguaje de máquina. Por ejemplo. un ensamblador puede proveer “pseudo instrucciones” que se expanden en un código de máquina más extenso a fin de proveer la funcionalidad necesaria. y distinta representación de los tipos de datos en memoria. Sin embargo. para un código máquina condicional como “si X mayor o igual que”. Los ensambladores más completos también proveen un rico lenguaje de macros que se utiliza para generar código más complejo y secuencias de datos.La transformación del lenguaje Assembly en código máquina la realiza un programa ensamblador. y la traducción inversa la puede efectuar un desensamblador. también pueden tener diferente cantidad de registros.

Una sola instrucción compleja hace lo mismo que en otras computadoras puede requerir una larga serie de instrucciones. incluyendo operaciones lógicas (AND/OR/XOR/NOT) comparar valores entre registros (mayor. igual). Las operaciones más complejas se realizan combinando estas instrucciones sencillas. multiplicar o dividir los valores de dos registros. direccionamiento o control de funciones. restar. Las operaciones disponibles en la mayoría de los conjuntos de instrucciones incluyen: mover llenar un registro con un valor constante mover datos de una posición de memoria a un registro o viceversa escribir y leer datos de dispositivos computar sumar. pero guardar el punto de salida para retornar (CALL. menor. que dependiendo de la estructura del procesador. que pueden ser ejecutadas secuencialmente o mediante instrucciones de control de flujo. colocando el resultado en uno de ellos o en otro registro realizar operaciones binarias. por ejemplo: Salvar varios registros en la pila de una sola vez mover grandes bloques de memoria operaciones aritméticas complejas o de punto flotante (seno. llamada a subrutinas) Algunas computadoras incluyen instrucciones complejas dentro de sus capacidades.pueden especificar: Registros específicos para operaciones aritméticas.Código máquina (o lenguaje de máquina) El lenguaje de máquina está formado por instrucciones sencillas. raíz cuadrada) El nivel de lenguaje Assembly . coseno. Posiciones de memoria específicas (offset). Modos de direccionamiento usados para interpretar operandos. Efectar el flujo del programa saltar a otra posición en el programa y ejecutar instrucciones allí saltar si se cumplen ciertas condiciones (IF) saltar a otra posición.

Se inventó para facilitar la tarea de los primeros programadores que hasta ese momento tenían que escribir directamente en código binario. en los cuales se encuentra (ISA y sistema operativo) estos dos se utilizan para la traducción en lugar de la interpretación. la . Se usa la traducción cuando se cuenta con un procesador (ya sea hardware o un intérprete) para el lenguaje objeto pero no para el lenguaje fuente. Con respecto al ensamblador. el lenguaje en que está escrito el programa original se llama lenguaje fuente. El código máquina. Almacenamiento Lenguaje Ensamblador Una de las principales ventajas del uso del ensamblador. Si la traducción se realiza correctamente. Hay dos diferencias entre traducción e interpretación. el lenguaje original que sea modificado se llama lenguaje objeto. las bifurcaciones y el paso de parámetros. en la traducción no se ejecuta directamente el programa original. Distribución Lenguaje Ensamblador La distribución es el proceso en el que el programa generado puede ejecutarse en otras máquinas. en el lenguaje fuente se convierte en un programa equivalente llamado programa objeto o programa binario ejecutable y este funciona solo cuando se ha acabado la traducción. la ejecución del programa traducido dará exactamente los mismos resultados que habría dado la ejecución del programa fuente. Algunas características del lenguaje se describen a continuación Los programas que sirven para traducir algún programa para el usuario se llama traductores. Además nos permite acceder directamente a los recursos de la máquina para un mejor desempeño. es que se encarga de administrar de manera transparente para el usuario la creación de memoria. un simple patrón de bits. es hecho legible reemplazando valores crudos por símbolos denominados mnemónicos.tiene aspectos importantes de los niveles de micro arquitectura.

En general se utiliza este tipo de lenguaje para programar controladores (drivers). En el caso de programas compiladores se necesitan de las librerías.  Mayor dificultad en la programación y en la comprensión de los programas. se refiere a la reducida abstracción entre el lenguaje y el hardware. si son dinámicas no pero el programa es más pequeño. Uso: ventajas e inconvenientes.  Posibilidad de obtener la máxima velocidad con mínimo uso de memoria. Consecuentemente es fácilmente trasladado a lenguaje de máquina.  Pero también tiene importantes inconvenientes:  Imposibilidad de escribir código independiente de la máquina. .3 Lenguaje Maquina Características Un lenguaje de programación de bajo nivel es el que proporciona poca o ninguna abstracción del microprocesador de un ordenador.mayoría del direccionamiento se hace relativo para que el programa sea re localizable por un programa llamado cargador. La palabra “bajo” no implica que el lenguaje sea inferior a un lenguaje de alto nivel. si son estáticos se incluyen en el ejecutable por lo que el programa se hace gráfico. 4. La programación en un lenguaje de bajo nivel como el lenguaje de la máquina o el lenguaje simbólico tiene ciertas ventajas:  Mayor adaptación al equipo. Debido a la complejidad del software actual se necesitan de asistentes para poder instalar y ejecutar un programa.

su programación es al más fino detalle. El lenguaje máquina no puede ser escrito o leído usando un editor de texto. Características Se trabaja a nivel de instrucciones. Primera generación El lenguaje de programación de primera generación (por sus siglas en inglés. y por lo tanto es raro que una persona lo use directamente.  El programador debe conocer más de un centenar de instrucciones. 1GL). es el lenguaje de código máquina. es decir. Segunda generación .  Es necesario conocer en detalle la arquitectura de la máquina. Es el único lenguaje que un microprocesador entiende de forma nativa. Está orientado a la máquina.

. de tal modo que su mal o buen uso tiene una acción directa sobre el desempeño de memoria. El direccionamiento directo también recibe el nombre de direccionamiento absoluto y el acceso a las direcciones se hace de manera directa. Si la dirección base es el inicio de la memoria fija el direccionamiento pasa a ser un variante de direccionamiento absoluto.4 Administración De Memoria La administración de la memoria es un proceso hoy en día muy importante. Recordar que un programa no puede ejecutarse sino se encuentra en memoria principal. generalmente el inicio del programa. Direccionamiento Lenguaje Maquina Es la forma en cómo se accede a la memoria. es el lenguaje ensamblador. 4. 2GL). La forma de acceder a la memoria depende del microprocesador.El lenguaje de programación de segunda generación (por sus siglas en inglés. El direccionamiento indirecto también recibe el nombre de direccionamiento relativo y se basa a partir de una dirección genérica. En general un ensamblador tiene un administrador de memoria más limitado que un compilador. un programador de lenguaje ensamblador debe conocer la arquitectura del microprocesador (como por ejemplo las particularidades de sus registros o su conjunto de instrucciones). Se considera de segunda generación porque. aunque no es lenguaje nativo del microprocesador. Para acceder a una dirección relativa se suma a la dirección base el número de espacios de memorias necesarias. El direccionamiento relativo hace a los programas relocalizables e independientes. pero en general existen dos tipos de direccionamiento: directo e indirecto.

MEMORIA VIRTUAL. generalmente en disco duro de la maquina. ESQUEMA BASICO. Los lenguajes más recientes controlan el uso de punteros y tienen un programa denominado recolector de basura que se encarga de limpiar la memoria no utilizada mejorando el desempeño.En la mayoría de los lenguajes de programación el uso de punteros no estaba vigilado por lo que se tienen muchos problemas con el uso de memoria. Un sistema de memoria virtual se implementa utilizando paginación como método de administración de memoria básica y algún mecanismo de intercambio (para descargar páginas de la memoria principal hacia el disco duro y para cargar esas páginas de nuevo a la memoria). Es un método mediante el cual. un sistema operativo simula tener mas memoria principal que la que existe físicamente. . Para implementar la memoria virtual se utiliza un medio de almacenamiento secundario de alta velocidad de acceso.

gayatlacomulco.htm#MEMO RIA VIRTUAL.com/tutorials/sistemasoperativos2/unidad1.En las tablas de páginas se agrega un campo más a cada entrada: El bit valido/invalido (p). deberá ir al disco duro y cargarla a memoria principal para continuar el procesamiento. Este proceso se muestra en la siguiente figura: BIBLIOGRAFIA http://es. . en los procesadores 80386 y posteriores.com/doc/243502906/manual-programacion-de- sistemas-1.scribd.doc http://www. Cuando el sistema operativo haga referencia a una página invalida. que indica si la página a la que se está haciendo referencia en un momento dado se encuentra en la memoria principal (valido) o en el disco duro (invalido).