Anda di halaman 1dari 67

TECNOLOGICO DE ESTUDIOS SUPERIORES DE IXTAPALUCA

ING. EN SISTEMAS COMPUTACIONALES

ASIGNATURA: PROGRAMACION DE SISTEMAS

(ANALOGIA DE LOS TEMAS EN CLASE)

PROF.: GARCIA CORTES DAVID

ALUMNA: GOMEZ MERCADO GUADALUPE

GRUPO: 1502

MATRICULA: 200920834

FECHA DE ENTREGA: 30 DE ENERO DE 2012

INDICE
1

Introduccin .6 Unidad I.- Introduccin a la programacin de Sistemas7 1.1 Qu es y que estudia la programacin de sistemas? 1.2 Herramientas desarrolladas con la teora de P.S. 1.3 Lenguajes 1.3.1 Lenguajes naturales 1.3.2 Lenguajes artificiales 1.3.3 Proceso de la comunicacin 1.4 Traductor y su estructura 1.4.1 Ensambladores 1.4.2 Compiladores 1.5.3Interpretes 1.5 Generadores de cdigo para compiladores (compilador de compilador) Unidad II Introduccin al diseo de los lenguajes de programacin..12 2.1 Visin del problema 2.2 Consideraciones preliminares 2.3 Objetivos y filosofas del diseo de los lenguajes de programacin 2.4 Diseo detallado 2.5 Caso de estudio

Unidad III Anlisis Lxico.. 15 3.1 Introduccin a los Autmatas finitos y expresiones regulares. 3.2 Analizador de lxico. 3.3 Manejo de localidades temporales de memoria (buffers). 3.4 Creacin de tablas de smbolos. 3.6 Manejo de errores lxicos. 3.6 Generadores de cdigo lxico: Lex y Flex. Unidad IV Anlisis Sintctico.. ..23 4.1 Introduccin a las Gramticas libres de contexto y rboles de derivacin. 4.2 Diagramas de sintaxis. 4.3 Precedencia de operadores. 4.4 Analizador sintctico. 4.4.1 Analizador descendente (LL). 4.4.2 Analizador ascendente (LR, LALR). 4.5 Administracin de tablas de smbolos 4.6 Manejo de errores sintcticos y su recuperacin 4.7 Generadores de cdigo para analizadores sintcticos: Yacc, Bison.

Unidad V Anlisis Semntico 35 5.1 Analizador semntico 5.2 Verificacin de tipos en expresiones. 5.3 Conversin de tipos. 5.4 Acciones agregadas en un analizador sintctico descendente (top-down). 5.5 Pila semntica en un analizador sintctico ascendente (bottom-up). 5.7 Administracin de la tabla de smbolos. 5.7 Manejo de errores semnticos. Unidad VI Generacin de Cdigo Intermedio 41 6.1 Lenguajes intermedios. 6.2 Notaciones. 6.2.1 Infija. 6.2.2 Postfija. 6.2.3 Prefija. 6.3 Representacin de cdigo intermedio. 6.3.1 Notacin Polaca. 6.3.2 Cdigo P. 6.3.3 Triplos. 6.3.4 Cudruplos. 6.4 Esquemas de generacin.
4

6.4. Expresiones. 6.4. Declaracin de variables, constantes 6.4. Estatuto de asignacin. 6.4. Estatuto condicional. 6.4. Estatuto de ciclos 6.4. Arreglos. 6.4. Funciones. Unidad VII Optimizacin 46 7.1 Tipos de optimizacin. 7.1.1 Locales. 7.1.2 Bucles. 7.1.3 Globales. 7.1.4 De mirilla. 7.2 Costos. 7.2.1 Costo de ejecucin. 7.2.2 Criterios para mejorar el cdigo. 7.2.3 Herramientas para el anlisis del flujo de datos.

Unidad VIII Generacin de cdigo intermedio 49 8.1 Lenguaje mquina.


5

8.1.1 Caractersticas. 8.1.2 Direccionamiento. 8.2 Lenguaje ensamblador. 8.2.1 Caractersticas. 8.2.2 Almacenamiento. 8.3 Registros. 8.3.1 Distribucin. 8.3.2 Asignacin. 8.4 Administracin de memoria. Bibliografa ..53

INTRODUCCION En esta antologa tenemos un resumen de todo lo visto durante la asignatura de programacin de sistemas. Esta asignatura es muy importante para la carrera de ing. En sistemas computacionales ya que tocan temas fundamentales de ella. La programacin es un sistema es un conjunto de componentes que se relacionan entre si, para lograr un objetivo comn. Las personas se comunican en un lenguaje que es un sistema formado por palabras y smbolos que tienen un significado para quien lo habla y quien loe escucha, lo mismo es para las computadoras. La programacin consta de convertir las especificaciones de los sistemas en instrucciones de mquina que producen resultados deseados.

Unidad I Introduccin a la programacin de Sistemas 1.1 Qu es y qu estudia la programacin de sistemas? Programa: conjunto de instrucciones que ejecuta una computadora para realizar una actividad. Sistema: conjunto de elementos autnomos que trabajan en armona para alcanzar un objetivo en comn. Tipos de sistemas Sistemas fsicos: reales, Hardware equipo, maquinaria, objetos

Sistemas abstractos: ideas, hiptesis, conceptos, planes, Software Sistemas abiertos y cerrados dependiendo del ambiente en que se ejecutan. Caractersticas de un sistema Un sistema puede interactuar con su medio ambiente a travs de una interfaz de entradas y salidas que recibe el nombre de parmetros del sistema. Un sistema puede ser componente de otro sistema 1.2 Herramientas desarrolladas con la teora de programacin de sistemas

El caso ms sencillo de programacin de sistemas es la construccin de compiladores para ejecutar lenguajes de programacin. Pero no slo se aplica en lenguajes de programacin, sino tambin se aplica en cualquier programa que se tenga que hacer un anlisis o extraccin de informacin Software de sistemas Editores de texto inteligentes (IDEs con autocompletar, revisores ortogrficos, etc) Impresoras estticas (impresin de gran calidad sin un editor visual, Latex, etc.) Intrpretes (Shells de sistemas operativos o de alguna aplicacin como un SMBD) Bsqueda de informacin que no es tan comn en base a patrones, etc. 1.3 Lenguajes Conjunto de palabras y reglas que permiten comunicar informacin entre dos entidades. El lenguaje que entienden las mquinas (lenguaje formal) es muy diferente del lenguaje que entendemos los humanos Lenguaje: Son las cadenas que pueden generarse a travs de una gramtica Repaso de lenguajes y autmatas Smbolo: representacin abstracta de alguna entidad Alfabeto: conjunto finito de smbolos

Cadena: yuxtaposicin de smbolos de un alfabeto que representan a un objeto


9

Lenguaje: conjunto de cadenas vlidas que se pueden formar a travs de un alfabeto 1.3.1 Lenguajes naturales El lenguaje natural es inherentemente ambiguo, por lo que se necesita crear un lenguaje que permita eliminar esas ambigedades, es mejor crear otro lenguaje, denominado de alto nivel que es el encargado de mediar entre la abstraccin humana y la abstraccin de lenguaje de mquina 1.3.2 Lenguajes artificiales Los lenguajes artificiales son aquellos que los humanos hemos creado para comunicarnos Las computadoras slo saben 0 y 1 Un lenguaje artificial permite implementar un algoritmo en una computadora para resolver un problema. Lenguajes de bajo nivel Una abstraccin ms entendible del lenguaje mquina es el uso de lenguajes ensambladores en donde cada instruccin o mnemnico es traducido a una instruccin mquina. ADD AX, 5 LOAD A, 5

10

Lenguajes mquina El lenguaje mquina es dependiente de cada tipo de arquitectura de computadoras por lo que el cdigo no es fcilmente portable a otras arquitecturas. Los lenguajes de alto nivel son ms portables en lo que respecta al cdigo fuente pudiendo llevarse a otras arquitecturas de computadoras sin mayor problema. Clasificacin de Chomsky Lenguajes sin restricciones (gramtica 0) Lenguajes dependientes del contexto (tipo 1) Lenguajes independientes del contexto (tipo 1.3.3 Proceso de la comunicacin Para entablar una comunicacin se necesita que tanto el emisor como el receptor conozcan el mismo lenguaje o en su defecto tengan un traductor. En este sentido, los humanos escribimos algoritmos en un lenguaje formal que una computadora pueda transformar a un lenguaje entendible por ella. 1.4 Traductor y su estructura Un traductor es un mediador entre dos entidades: emisoras y receptoras, los mediadores enmascaran la complejidad y heterogeneidad de los lenguajes, un traductor convierte un lenguaje de entrada (cdigo fuente) a uno de salida (cdigo objeto). La traduccin puede ser sencilla (literal) o compleja (revisar el contexto) dependiendo del tipo de lenguaje de entrada y salida.

11

Traduccin espaol a ingls si se hace de manera literal es una mala traduccin, se necesita de al menos otra revisin (pasada) para hacer una buena traduccin. 1.4.1 Ensambladores Ensamblador es el traductor que se encarga de convertir instrucciones de bajo nivel a instrucciones de una mquina en general. //Encabezados 00 MOV AX, 58d 4F0188 03 CMP 0 3A00 05 JMP etiqueta 9918 Etiqueta: 18 MUL AX, FF 4401FF 1.4.2 Compiladores Es el traductor que se encarga de convertir un lenguaje de alto nivel a cdigo mquina. La caracterstica de este traductor radica en el hecho de que necesita revisar todo el cdigo fuente para poder realizar la traduccin. Ejemplo: la traduccin de un libro, discurso, o artculo tcnico o de investigacin Ejemplos de compiladores: C, C++, Pascal, etc. Entre ms pasadas se de a un cdigo fuente mayor es la optimizacin que se puede hacer. El problema radica en el tiempo y en los recursos para hacerlo
12

Antes de compilar un programa fuente se sigue una etapa de Pre procesamiento. Preprocesadores: Macros (expansin de funciones) Inclusin de archivos (bibliotecas) Procesadores racionales Extensiones al leguaje (inclusin de ensamblador en C) 1.4.3 Intrpretes Se ejecutan lnea por lnea, instruccin por instruccin. Lenguajes interpretados: PHP, PERL, BASIC En algunas ocasiones se necesita de una traduccin rpida de algunas instrucciones, como en el Shell, instrucciones SQL, etc. Java es compilado o interpretado? Java al igual que otros lenguajes como C# son lenguajes hbridos. Por una parte se compila un programa fuente para generar cdigo objeto para una mquina virtual (bytecode o MSIL) para posteriormente ejecutarse de manera interpretada en las diferentes mquinas virtuales de cada plataforma. A este compilador se les llama jitter de JIT (Just in Time).

1.5 Generadores de cdigo para compiladores (compilador de compilador)

13

Los dos primeros lenguajes de alto nivel desarrollado fueron FORTRAN y COBOL. Desarrollar FORTRAN tard alrededor de 14 aos. Desarrollar nuestro compilador tardar menos de 6 meses Son herramientas que auxilian algn aspecto del proceso de traduccin Herramientas auxiliares para programacin de sistemas Cargadores y editores de enlace Generadores de analizadores lxico Generadores de Analizadores sintcticos Traductores dirigidos por sintaxis Generadores automticos de cdigo Dispositivos para el anlisis de flujo de datos

14

Unidad II Introduccin programacin 2.1 Visin del problema

al

diseo

de

los

lenguajes

de

Cul es el propsito de un lenguaje? Los lenguajes de computacin pueden ser de propsito general o especficos. C, C++, Java, Pascal, etc. Son lenguajes de programacin de propsito general SQL, PROMELA, Actionscripts son lenguajes especficos Por qu tal diversidad de lenguajes? Los lenguajes de programacin son como los carros, existen para todos los gustos y/o usos. Quin cargara una tonelada de papas en un auto deportivo? Los lenguajes de propsito general son como los autos sedn, sirven para casi todo Se debe identificar que es lo que se piensa hacer con el lenguaje, ya que puede ser slo la estructuracin de contenido Web, visualizar informacin o bien realizar la conversin de un documento. HTML es lenguaje de representacin visual OWL es lenguaje de descripcin de elementos

15

C es un lenguaje programacin 2.2 Consideraciones preliminares Debemos tomar en cuenta las palabras reservadas del lenguaje, los operadores, los tipos de datos. Debemos considerar el objetivo del lenguaje, si es un lenguaje de enseanza, si es un lenguaje para profesionales, si el cdigo desarrollado va a ser mejor. 2.3 Objetivos y filosofas del diseo de los lenguajes de programacin Algunos usos de los lenguajes de programacin son: Comunicacin humana Prevencin y Deteccin de errores Usabilidad Portabilidad Independencia de la mquina Filosofas Es ms importante que un programa sea leble que escribible, ya que un programa generalmente se escribe una vez y se lee muchas veces (documentacin, mantenimiento, etc.) La tendencia actual implementacin es separa la interfaz de la Tratar de hacer lenguajes para mltiples arquitecturas de computadoras (mquinas virtuales) Control de apuntadores Control de tipo de datos robustos

16

Simplicidad por eficiencia 2.4 Diseo detallado Considerar caractersticas como: Patrones de diseo Paquetes (bibliotecas, APIs, componentes) Excepciones Validaciones Marco de trabajo Utileras auxiliares (preprocesador, enlazador) Inclusin de otros lenguajes 2.5 Caso de estudio Explicar el lenguaje que se va a desarrollar en el curso: Por qu se va a desarrollar (problemtica)? Vocabulario del lenguaje (lxico palabras clases que hacen) Reglas de estructura (gramtica, sintaxis) Semntica Si existe cdigo intermedio Si se mejora ese cdigo El cdigo objeto final

17

Unidad III Anlisis Lxico 3.1 Introduccin a los Autmatas finitos y expresiones regulares Qu es un autmata? Es un modelo matemtico que sirve para determinar si una cadena pertenece a un lenguaje no.
18

M=(Q, , &, F) Q = conjunto de estados = alfabeto de entrada & = funciones de transicin F = conjunto de estados de aceptacin Autmatas finitos La caracterstica que tienen los autmatas finitos es que solo existe una funcin de transicin definida para un smbolo de entrada. Esto elimina ambigedades Una expresin regular representar lenguajes: es una forma abreviada de

a Representa el lenguaje de las letras a a* Representa el lenguaje que tiene 0 hasta n as Autmatas Oprel <|>|<=|>=|=|<>

Un solo autmata varios sub_autmatas Programar un autmata: Identificador letra (letra|digito|gb)*

Expresin Regular Generar la expresin electrnicos vlidos. Formato:


19

regular

para

identificar

correos

jcolivar@itmorelia.edu.mx id@dominio Expresiones Regulares y una gramtica Una gramtica sirve para generar cadenas de un determinado lenguaje pero tambin sirve para generarla. Existente una relacin uno a uno entre Lenguajes, Autmatas, Expresiones regulares y gramticas. Gramtica de un if prop _ if expr then prop | if expr then prop else prop |_ expr _ termino oprel termino | termino termino _ id | num oprel _ < |>|=|<=|<>|>=| id _ letra (letra | digito)* num _ digito+ (.digito+)?(E(+|-)?digito+)? eb _ delim+ delim _ blanco | tab | linenueva 3.2 Analizador Lxico Primera fase de la compilacin Leer caracteres de entrada y generar como salida una secuencia de componentes lxicos Eliminar espacios en blanco Eliminar comentarios Proporcionar informacin acerca de errores lxicos

20

Anlisis Lxico El anlisis lineal, se llama lxico o exploracin. Posicion := inicial + velocidad * 60 Posicion: identificador := smbolo de asignacin Inicial: identificador +: signo de suma Velocidad: identificador *: signo de multiplicacin 60: numero Se elimina todos los espacios en blancos (espacios, tabuladores, salto de lnea, etc. Reconocedores de identificadores y palabras clave. La tabla de smbolo debe insertar y buscar componentes lxicos. La tabla de smbolos es utilizada por el analizador sintctico y por otras fases del proceso de traduccin Un patrn es una regla que describe el conjunto de lexemas que puede representar a un conjunto lxico. Los componentes lxicos se tratan como terminales de la gramtica del lenguaje fuente. La devolucin de un componente lxico se hace a travs de un nmero entero. Especificacin de componentes lxicos Expresiones regulares (patrn). Cada patrn concuerda con una serie de cadenas. Las expresiones regulares dan el nombre al conjunto de cadenas con que concuerdan. Expresiones regulares
21

Se construyen a partir de otras expresiones regulares ms simples, cada expresin regular r, representa un lenguaje L(r) Letraaubucuuz Dgito1u2u3uu0 Identificador letra(letra u dgito)* Abreviaturas * cero o ms casos + uno o ms casos [a-zA-Z] maysculas y minsculas [0-9] dgitos ? Cero o un caso 3.3 Manejo de localidades temporales de memoria (buffers) La forma ms fcil de leer un programa es carcter por carcter pero es ineficiente. La forma ms eficiente es realizar una copia a la memoria de todo el cdigo fuente. Pero esto en la gran mayora de las ocasiones es imprctico por las dimensiones de los programas. Para solucionar este problema se sugiere utilizar buffers Manejo de buffers Existen muchas formas de dividir el trabajo, pero siempre se deber llevar dos punteros, uno al carcter actual y otro al inicial del lexema. El manejo de buffers es esencial para realizar el anlisis de grandes programas de mejor manera 3.4 Creacin de tablas de smbolos

22

En general el proceso de anlisis lxico puede describirse simplemente como el reconocimiento de caracteres de un lenguaje para generar una tabla de smbolos. El primer paso consiste en crear un escner, el cual se encarga de verificar que no existan caracteres no presentes en el lenguaje. Tabla de smbolos La tabla de smbolos va a guardar cada palabra analizada, la va identificar como un lexema y le va asociar un identificador numrico para posteriormente utilizarlo. La tabla de smbolos debe estar en memoria para realizar un anlisis rpido. 3.5 Manejo de errores lxicos Son pocos los errores que se pueden detectar al hacer anlisis lxico fi (a == f(x)) //Error de sintaxis Pero puede existir algn error si ninguno de los patrones con cuerda con el prefijo de entrada Tcnicas de recuperacin de errores Borrar un carcter extrao Insertar un carcter que falta Reemplazar un carcter incorrecto por otro correcto Intercambiar dos caracteres adyacentes Tcnicas para realizar analizadores lxicos

23

Utilizar un analizador lxico como FLEX. El generador se encarga de manejar buffers Escribir el analizador en un lenguaje de alto nivel haciendo uso de la E/S del lenguaje Escribir el lenguaje ensamblador y manejar explcitamente la E/S Anlisis Lxico en XML El anlisis lxico en documentos XML lo realiza cualquier herramienta o API que utilice XML, ya que debemos cerciorarnos que el lenguaje est bien formado. Si el lenguaje no cumple con las reglas de construccin de documentos XML, falla el proceso. Realizar anlisis lxico de XML en Java o C# 3.6 Generadores de cdigo lxico: Lex y Flex FLEX es la versin de software libre del popular generador de analizadores lxicos LEX para sistemas *NIX, genera cdigo C aunque existen otras herramientas que generan cdigo en otros lenguajes Analizador.lex flex lex.yy.c gcc

Programa ejecutable analizador $gcc lex.yy.c o analizador lfl

Programa Lex %{ Definiciones globales C


24

}% Definiciones flex %% Acciones %% Cdigo C auxiliar Definiciones regulares en flex %% Separadores de secciones Def Acciones {def} {cdigo C asociado} @ {cdigo C asociado} Programa que reconoce flotantes % { #include <stdio.h> Int ocurrencias; }% Digito[0-9] Punto [\.] Exp [eE] Signo[\+\-] Digitos {digito}+
25

expresin

Decimal {punto} {digitos}({exp}{signo}{digitos})? Flotante {digitos}{decimal}? Programa que reconoce flotantes % % {flotante} { printf(flotante encontrado\n) ocurrenicas++; } @ { printf(Arroba\n); } . { printf(Invlido: %s\n, yytext); } %% main(int argc, char *argv[]) { FILE *f; F = fopen(argv[1], r); yyin = f; while(yylex()); printf(%d flotantes encontrados\n, ocurrencias); fclose(f); } Programa para reconocer direcciones IP Digito [0-9] Punto [\. ]
26

IP {digito}+{punto}{digito}+{punto}+{digito} {punto}{digito}+ %% {IP} { strcpy(aux, yytext); strcat(aux, .); for(i =0 ; i<4; i++) { cadnum = strtok(aux, .) ; if(atoi (cadnum)>255) { printf(Error\n); break; } if(i==4) printf(Direccin IP: %s\n, yytext); }

27

Unidad IV Anlisis Sintctico 4.1 Introduccin a las Gramticas libres de contexto y rboles de derivacin Todo lenguaje posee una serie de reglas para describir los programas fuentes (sintaxis). Un analizador sintctico implementa estas reglas haciendo uso de GICs Gramticas Son un formalismo matemtico que permite decidir si una cadena pertenece a un lenguaje dado. Se define como la cuarteta G= (N, , S, P), en donde N es el conjunto de smbolos terminales, S es conjunto de smbolos terminales, S es el smbolo inicial (S pertenece a N) y P es un cojunto de reglas de produccin. Los smbolos no terminales (N) son aquellos que pueden seguir derivando en otros; mientras que los terminales el proceso finaliza all. Reglas de produccin Son las reglas que permiten decidir si la cadena pertenece a un lenguaje y la estructura que lleva: S A|aB A aA|bC S B C e e

Genera cadenas del lenguaje a*b u a


28

Tipos de gramticas Las gramticas ms sencillas son las gramticas regulares, debido a que no presentan anomalas de ningn tipo. Desafortunadamente este tipo de gramticas no permiten expresar todos los lenguajes posibles y en especial los humanos por lo que se necesitan otros tipos de gramticas. Las ms utilizadas en informticas son las libres del contexto.

Gramticas Regulares Son las que se forman a travs de Autmatas Finitos Deterministas y Expresiones regulares. No presentan ambiguedades. Gramticas Independientes del Contexto Son aquellas G cuya reglas de produccin son de la forma: , en donde a pertenece aNy pertenece (N u )* Las ventajas de uso de GICs son: Proporcionan una estructura sintctica precisa y fcil de comprender Proporciona al lenguaje fuente una estructura adecuada para la generacin del cdigo. Por medio de las GICs es fcil construir analizadores sintcticos Es sencillo aadir funcionalidades a un analizador sintctico GICs
29

Hay que revisar que la gramtica no sea inherentemente ambigua para poder eliminar esa ambigedad o redisear la gramtica sin anomalas. Algunas formas de eliminar esa ambigedad es utilizando tcnicas como algoritmos CYK y las formas normales de Chomsky (FNCh) y Greibach (FNG). Ejemplos de GICs Expresiones vlidas en lenguajes C: Expr NUM Error sintctico: cuando la secuencia de componentes lxicos no puede ser generada por la gramtica del lenguaje fuente. (expr) | -expr | expr op expr| VAR |

Jerarqua de Chomsky

Las otras dos gramticas en las cuales clasific Chomsky (GR tipo 3, GIC tipo 2) son las gramticas sensible al contexto (tipo 1, donde ||<||, donde a y pertenecen a (u N)* salvo ) y las ramticas del tipo 0 o sin restricciones, las cuales sus reglas de produccin pueden ser de cualquier tipo. rboles de Derivacin
30

Es la representacin grfica de la derivacin de una cadena. Se crea utilizando el smbolo inicial como la raz, los smbolos N representan nodos del rbol y los smbolos S las hojas del rbol. A travs de los rboles de derivacin se puede verificar la sintaxis de un lenguaje as como comprobar el significado de las palabras. Si para la misma cadena existen dos o ms rboles de derivacin la gramtica es ambigua.

BNF La Forma Backus-Naur es una meta-sintaxis; es decir, una sintaxis para representar sintaxis. Es un estndar para representar lenguajes. Los parntesis triangulares < y > sirven para indicar los smbolos no terminales. La barra vertical | para representar O La doble flecha ::= indica indica las derivaciones las producciones

[] indican elementos opcionales {} indican trminos repetitivos

4.2 Diagramas de sintaxis


31

Es otra forma (al igual que los rboles de derivacin) de especificar gramticas del tipo 2. La caracterstica de este esquema es que permite ver las derivaciones al instante de que ocurren.

<W>::=<W1> < W2> <W3>

<W>::=ab <W>

<W>::=< W1> < W2> | <W1>a | ab <W2>

4.3 Precedencia de operadores La precedencia de operadores es de vital importancia en el proceso de anlisis sintctico ya que nos representar la forma en que debe construirse el rbol de derivacin. En aritmtica existen prioridades, por ejemplo: * y / tienen preferencia sobre + y -. () indican la mxima prioridad. Prioridad de operadores La instruccin a = b + c / 2 en la mayora de los lenguajes no se evala de la forma a = (b + c) /2, sino de la forma a = b + (c/2)
32

La forma de evaluacin depende de cmo se construyan los operadores, ya sea en infijo, postfijo o prefijo. Las operaciones se realizan de abajo hacia arriba.

33

4.4 Analizador sintctico Un analizador sintctico (Parser) es un programa que reconoce si una o varias cadenas de caracteres forman parte de un determinado lenguaje. Los lenguajes habitualmente reconocidos por los analizadores sintcticos son los lenguajes libres de contexto. Los analizadores sintcticos fueron extensivamente estudiados durante los aos 70 del siglo XX, detectndose numerosos patrones de funcionamiento en ellos, cosa que permiti la creacin de programas generadores de analizadores sintcticos a partir de una especificacin de la sintaxis del lenguaje, tales y como YACC, GNU bison y javacc. Es el proceso de determinar si una cadena dada puede ser generada por una gramtica. Los analizadores sintcticos de lenguajes de programacin suele hacerse de izquierda a derecha, viendo un componente lxico a la vez Los analizadores pueden clasificarse dependiendo de la forma en como se construyen los nodos del rbol de derivacin sintctico: ascendentes y descendentes Tipos de analizadores sintcticos LL (left to left) leen la cadena de izquierda a derecha y derivan por la izquierda LR (left to right) S A B C aA aBbC b c

4.4.1 Analizador descendente (LL)


34

Existen diferentes mtodos de anlisis sintctico. La mayora caen en una de dos categoras: ascendentes y descendentes. Los ascendentes construyen el rbol desde las hojas hacia la raz. Los descendentes lo hacen en modo inverso. Un analizador ampliamente utilizado se denomina mtodo de anlisis predictivo descendente recursivo que es muy sencillo.

4.4.2 Analizador ascendente (LR, LALR) Algunos problemas no se pueden resolver de forma descendente ya que no estn fcil quitar la ambigedad. En algunos casos es ms fcil demostrar algo ya existente. Generalmente los analizadores sintcticos LR(k) son del tipo bottom-up. El analizador trata de reducir la cadena de entrada w al smbolo inicial S. En un proceso que recorre el rbol de derivacin en sentido inverso que se llama reduccin. No slo es necesaria una gramtica que no presente ambigedades sino que tambin tenga el valor de k ms pequeo. 4.5 Administracin de tablas de smbolos La tabla de smbolos se crea durante la fase de anlisis lxico a travs de los componentes lxicos, pero en el proceso de anlisis sintctico sufren algunas modificaciones. Generalmente se agregan valores de tipo y significado para el anlisis sintctico. 4.6 Manejo de errores sintcticos y su recuperacin. Si los traductores tuvieran que procesar programas correctos el proceso de implantacin se simplificara mucho.
35

Cmo debe de responder un compilador de pascal a un cdigo Fortran? Ningn mtodo de recuperacin de errores resuelve todos los problemas Tipos de errores Lxicos: como escribir mal un identificador, palabra clave u operador. Sintcticos: como una expresin aritmtica con parntesis no equilibrados. Semnticos: como un operador aplicado a un operando incompatible. Lgicos: como una llamada infinitamente recursiva La mayora de los errores se centra en la fase de anlisis sintctico. El manejador de errores debe: Informar la presencia de errores con claridad y exactitud.

Administrador de errores Recuperar de cada error con la suficiente rapidez como para detectar errores posibles. No debe retrasar de manera significativa procesamiento de programas correctos. Debe indicar informativo la lnea del error y algn el

mensaje

Estrategias de recuperacin de errores


36

Modo Pnico Nivel de Frase Producciones de error Correccin global Recuperacin en modo pnico Es el ms sencillo de implantar. El analizador sintctico desecha componentes lxicos hasta encontrar un carcter de sincronizacin. Estos caracteres son el punto y como (;) entre otros. int a.b,c; struct c { . } main( ) { int a; }

Recuperacin a nivel de frase

37

Esta tcnica utiliza una correccin de caracteres adyacentes, ya sea por insercin, eliminacin o intercambio. Esta tcnica permite sustituir , por ;, etc. Son traductores que corrigen errores. Desafortunadamente para muchos casos no aplican por lo que no se utilizan demasiados. Producciones de error Se pueden generar gramticas para generar producciones de error y as de esta forma seguir con el proceso. La dificultad radica en el sentido de encontrar esas reglas gramaticales para generar error. En algunos casos sera inclusiva ms extensa que la gramtica del propio lenguaje. For (i<3, a<10; i++) Correccin global Idealmente, sera recomendable que un traductor hiciera el mnimo de cambios para procesar una entrada invlida. Este algoritmo genera menores costos globales para realizar cambios. El problema radica en que el implementar estas estrategias son muy costosas en tiempo y espacio. 4.7 Generadores de cdigo para analizadores sintcticos: Yacc, Bison YACC (YET ANOTHER COMPILERCOMPILER): provee una herramienta general para describir la entrada de un programa de computacin. El usuario de YACC especifica las estructuras de su entrada, junto con el cdigo que ser invocado en la medida en que cada una de esas estructuras es reconocida. YACC/BISON

38

YACC convierte esa especificacin en una subrutina que maneja el proceso de entrada. La subrutina de entrada producida por YACC llama a la rutina provista por el usuario para devolver el prximo tem bsico de la entrada. GNU Bison es un generador de parsers de propsito general que convierte una descripcin gramatical desde una gramtica libre de contexto LALR en un programa en C para hacer el parser. Es utilizado para crear parsers para muchos lenguajes, desde simples calculadoras hasta lenguajes complejos. GNU Bison tiene compatibilidad con Yacc: todas las gramticas bien escritas para Yacc, funcionan en Bison sin necesidad de ser modificadas. Cualquier persona que est familiarizada con Yacc podra utilizar Bison sin problemas. Es necesaria experiencia con C para utilizar Bison. YACC Yet Another Compiler-Compiler Analizador.y (#include lex.yy.c) analizador.c (y.tab.c) gcc analizador $gcc analizador.c o analizador -lfl Estructura de un programa en Bison %{ Declaraciones globales C }% Declaraciones bison
39

bison

%% Gramticas Nombre:prod1|prod2||prodn; %% Cdigo auxiliar C Tips Todo lexema debe ser un entero

#define VAR 200 (256) return (VAR); Gramtica vaca Gramtica: prod1| prod2| ; Reduce/Reduce Shift/Reduce S A A A A b a|b|c demasiada profundidad x|y|z S b ambigedad infinita

Analizador.lex %{ #include ytab.h


40

}% sp [\n\r\t] If [i][f] %% {if} {return (IF);} ( {return (PI); } . return (ERROR); %% Analizador.y %{ #include lex.yy.c }% %token IF PI PD LLI LLD %token ID NUM OPREL OPLOG %% programa: linea programa | ; Linea: if linea | ; if: if PI condicion PD LLI campo LLD ;
41

.: {printf(Error sintctico);} %% main(int argc, char *argv[]) { FILE *f = fopen(argv[1], r) ; yyin = f; while (yyparse()) ; fclose(f) ; }

Bison $flex analizador.lex $bison analizador.y $gcc analizador.c o analizador lfl yytext componente lxico yyin flujo de entrada yylineno lnea de error %%
42

yyerror() { printf(Error sintctico en %d linea, yylineno); }

Unidad V Anlisis Semntico 5.1 Analizador semntico Ajuste significativo Comprobacin de tipos: operandos-operadores Comprobacin del flujo de control:
43

for(;; ) { break; w= a+2; } Analizador semntico Comprobacin de unicidad int a; char a; //una sola vez Comprobacin relacionadas con nombres Tabla de smbolos: Estructura en memoria Almacena informacin sobre los tipos Sistemas de tipo: Tipo bsico: entero, carcter, real, lgico Nombres de tipo Constructores de tipo: estructuras, uniones, objetos Apuntadores: referencias a tipos Funciones a=suma();

44

Sistema de tipos: conjunto de reglas que determinan el criterio para asignar expresiones de tipo a las diferentes partes del cdigo fuente Cada analizador semntico implementa un sistema de tipos Comprobacin dinmica y esttica Esttica: compilacin Dinmica: Ejecucin char a[5]; strcpy(a, abcdefghijk) ; Fuertemente tipificado Dbilmente tipificado Smbolo { nombre; tipo; mbito; } 5.2 Verificacin de tipos en expresiones La verificacin de los tipos de datos se hace asignando el valor de tipo de cada una de los componentes lxicos. Estos valores se comparan para verificar que los tipos de datos coincidan y sean congruentes, de lo contrario no se pueden realizar los clculos. 5.3 Conversin de tipos
45

Hay situaciones en las cuales se tiene un valor de un tipo dado y se desea almacenar ese valor en una variable de un tipo diferente. En algunos tipos es posible almacenar simplemente el valor sin una conversin de tipos; lo que se denomina conversin automtica. Esto slo es posible en algn lenguaje de programacin, si el compilador reconoce que la variable destino tiene la suficiente precisin para contener el valor origen. En Java se puede almacenar un valor byte en una variable int, dado que este tipo de datos es de mayor precisin que el primero. A esto se le llama ensanchamiento o promocin, dado que el tipo ms pequeo se ensancha o promociona al tipo compatible ms grande. Si por el contrario, se desea asignar un valor de variable int a una variable byte se necesita realizar una conversin de tipos explcita. En algunos casos se puede realizar la conversin pero se pueden perder datos, como por ejemplo al pasar un valor flotante a un entero. A esto se le llama estrechamiento, dado que se estrecha explcitamente el valor para que quepa en el destino. La conversin de un tipo se realiza poniendo delante un nombre de tipo entre parntesis, por ejemplo, (tipo) valor. byte a; int b; a=(byte) b; Comprobacin de tipos Existen dos tipos de comprobacin: esttica y dinmica. La comprobacin ayuda a evitar la mayora de los errores de programacin. Ejemplos:
46

Comprobacin de tipos. Para saber si el operador aplicado a los operadores es correcto Comprobacin de flujo de control. Se debe verificar que las instrucciones que cambia el flujo de un programa sean vlidos. Ejemplo: break, goto. Comprobacin de unicidad: definir un objeto una sola vez. Comprobacin relacionadas con nombres. El mismo nombre debe aparecer dos veces. Variables que se declaran pero no utilizan Comprobacin de tipos La comprobacin de tipos es la ms complicada. Las dems comprobaciones son rutinarias. El operador % ocupa que los dos operandos sean enteros. + es una funcin suma(a,b) que est sobrecargada para distintos tipos de datos Siempre se disean reglas de tipos como los valores numricos se convierten al de mayor jerarqua o el tipo de datos punteros slo apunta al tipo de datos declarado. Algunos lenguajes revisan el tamao de los arreglos (Java) de manera esttica otros lo hacen de manera dinmica (en tiempo de ejecucin). Diferenciar el uso de +, * enteros que con punteros (aritmtica de punteros) Al conjunto de reglas que se definen para la comprobacin de los tipos de datos se denomina sistema de tipos La mayora de veces la recuperacin de errores se suele omitir ya que el programa no finaliza pero tal vez no obtenga los valores deseados
47

Polimorfismo: una funcin puede tener el mismo nombre con diferentes elementos. El tipo de datos debe ser diferente. Un ejemplo de polimorfismo son las plantillas en algn lenguaje de programacin. Se debe considerar el mbito de las variables (locales y globales).

5.4 Acciones agregadas descendente (top-down)

en

un

analizador

sintctico

Muchas de las actividades que realiza un analizador semntico no son estndares, dependern del objetivo del lenguaje de programacin; por ejemplo, en algunas aplicaciones es interesante conocer que los datos estn en algn rango vlido o que ciertos valores se utilicen para uso reservado Acciones agregadas a un analizador semntico En algunas ocasiones nos interesa conocer el significado de las palabras de algn lenguaje dependiendo del contexto (gramticas de tipo 1) para diferenciar palabras polisemnticas. La Web es una base de datos en la mayora de los casos sin sentidos por lo que la tercera generacin de la Web ser la llamada Web semntica. 5.5 Pila semntica en un analizador sintctico ascendente (bottom-up). El diseo ascendente se refiere a la identificacin de aquellos procesos que necesitan computarizarse con forme vayan apareciendo, su anlisis como sistema y su codificacin, o
48

bien, la adquisicin de paquetes de software para satisfacer el problema inmediato. Pila semntica Los problemas de integracin entre los subsistemas son sumamente costosos y muchos de ellos no se solucionan hasta que la programacin alcanza la fecha limite para la integracin total del sistema. Se necesita una memoria auxiliar que nos permita guardar los datos intermedios para poder hacer la comparacin. 5.6 Administracin de la tabla de smbolos La tabla de smbolos tambin recibe el nombre de ambiente. Un ambiente contiene un conjunto de parmetros que slo son visibles en ese ambiente. La tabla de smbolos se mantiene durante todo el proceso de traduccin agregando elementos especficos en cada paso.

Operaciones sobre la tabla de smbolos Inserta(smbolo) Existe(nombre) Tipo(nombre) Declaracin PYC Listavar {inserta(simbolo);} Var TIPO {tipo=obtengo(yytext());} listavar var {inserta(smbolo);} | var

ID {simbolo=yytext; smbolo.tipo=tipo;

simbolo.amb=ambito;}
49

Exprlog

PI exprlog {A=A;} PD

|NOT exprlog {A=A;} |exprlog {A1=A;} OPLOG exprlog {A2=A If(A1==INT && A2==INT) A=INT; Else A=ERROR_TIPO;} 5.7 Manejo de errores semnticos Los errores semnticos son pocos y los que existen no se pueden detectar tan fcilmente. Hasta esta etapa los errores son mostrados a los usuarios. Los dems errores ya son muy difciles de detectar y generalmente se dan en tiempo de ejecucin. Algunos problemas se presentan durante la fase de gestin de memoria al pasar argumentos o al crear la pila semntica. Muchos errores se generan durante la etapa del enlazador, al tratar de obtener cdigo existente de algunas funciones/mtodos ya implementadas en bibliotecas/APIs.

50

Unidad VI Generacin de Cdigo Intermedio La administracin de la memoria se da en esta etapa. Se debe considerar tanto la memoria esttica como dinmica, y en esta se utilizan generalmente pilas. Los lenguajes intermedios generalmente tienen rboles de derivacin ms pequeos que su contraparte original. Se puede representar un rbol sintctico con un Grafo Dirigdo Acclico (GDA). La notacin postfija es una manera linealizada de representar un rbol sintctico. a := b*-c+b*-c abc -*bc -*+= x:=yopz x+y*z t1:=y*z t2:=x+t1 6.1 Lenguajes intermedios

51

Los lenguajes intermedios nos sirven para representar la produccin final de nuestro lenguaje fuente. Existen muchos lenguajes intermedios, la mayora de ellos son una representacin ms simplificada del cdigo original para facilitar la traduccin hacia el cdigo final. Otros lenguajes intermedios sirven de representacin parcial de otros procesos. base o como

Por ejemplo al compilar un programa en C en Windows o DOS, se produce un cdigo objeto con extensin .obj para que posteriormente el enlazador cree finalmente el cdigo executable .exe En sistemas basados en Unix, tambin ocurre algo similar generndose un archivo .o y el executable a.out. Otros lenguajes intermedios famosos son los generados para la mquina virtual de Java el bytecode; y para la mquina virtual de .NET el MISL para luego ejecutarse en tiempo de ejecucin JIT (Just in Time) Otros lenguajes intermedios se utilizan en sistemas distribuidos como RPC, CORBA y su IDL, etc. En este caso estos lenguajes intermedios se encargan de enmascarar toda la heterogeneidad de las comunicaciones distribuidas en una computadora 6.2 Notaciones Las notaciones sirven de base para expresar sentencias bien definidas. El uso ms extendido de las notaciones sirve para expresar operaciones aritmticas. Las expresiones aritmticas se pueden expresar de tres formas distintas: infija, prefija y postfija. La diversidad de notaciones corresponde en que para algunos casos es ms sencillo un tipo de notacin. Las notaciones tambin dependen de cmo se recorrer el rbol sintctico, el
52

cual puede ser en inorden, preorden o postorden; teniendo una relacin de uno a uno con la notacin de los operadores. 6.2.1 Infija La notacin infija es la ms utilizada por los humanos por que es la ms comprensible ya que ponen el operador entre los dos operandos. Por ejemplo a+b-5. No existe una estructura simple para representar este tipo de notacin en la computadora por esta razn se utilizan otras notaciones. 6.2.2 Postfija La notacin postfija pone el operador al final de los dos operandos, por lo que la expresin queda: ab+5.La notacin posftfija utiliza una estructura del tipo LIFO (Last In First Out) pila, la cual es la ms utilizada para la implementacin. 6.2.3 Prefija La notacin prefija pone el operador primero que los dos operandos, por lo que la expresin anterior queda: +ab-5. Esto se representa con una estructura del tipo FIFO (First In First Out) o cola. Las estructuras FIFO son ampliamente utilizadas pero tienen problemas con el anidamiento aritmtico. 6.3 Representacin de cdigo intermedio Existen maneras intermedio. formales para representar cdigo

Estas notaciones simplifican la traduccin de nuestro cdigo fuente a nuestro cdigo objeto ya que ahorran y acotan smbolos de la tabla de smbolos 6.3.1 Notacin Polaca
53

La notacin polaca, tambin conocida como notacin de prefijo o notacin prefija, es una forma de notacin para la lgica, la aritmtica, y el lgebra. Su caracterstica distintiva es que coloca los operadores a la izquierda de sus operandos. Si la aridad de los operadores es fija, el resultado es una sintaxis que carece de parntesis u otros signos de agrupacin, y todava puede ser analizada sin ambigedad. El lgico polaco Jan ukasiewicz invent esta notacin alrededor de 1920 para simplificar la lgica proposicional. 6.3.2 Cdigo P El cdigo P hace referencia a mquinas que utilizan o se auxilian de pilas para generar cdigo objeto. En muchos caso la P se asociado a cdigo portable el cual garantiza que el cdigo compilado en una mquina se pueda ejecutar en otras. Para garantizar la portabilidad del cdigo se necesita que el lenguaje este estandarizado por algn instituto y que dicho cdigo no tenga extensiones particulares. Tambin se recomienda la no utilizacin de carctersticas especiales exclusivas de alguna arquitectura de computadoras en particular. 6.3.3 Triplos Las proposiciones de tres direcciones se parece mucho al ensamblador, el cual es un lenguaje intermedio ms entendible para la mquina. Las estructuras de control (if, switch, while, do-while, for) son realmente etiquetas goto disfrazadas. El problema de utilizar cudruplos radica en que se tienen que colocar los valores temporales en la tabla de smbolo. Con una estructura de tres campos se pueden omitir los valores temporales, dicha estructura recibe el nombre de triples y tiene los siguientes campos: op, arg1 y arg2
54

Generalmente el cdigo que generan los triples recibe el nombre de cdigo de dos direcciones, aunque en ocasiones puede variar. Cuando se utilizan triples se ocupan punteros a la misma estructura de los triples. * b t1 t2 //cudruplos * b (0) //triple Se debe tener en cuenta el proceso de asignacin, de declaracin, expresiones booleanas. Las expresiones lgicas tambin pueden pasarse a cdigo de tres direcciones, utilizando para ello expresiones en corto circuito. La evaluacin de expresiones en corto circuito implica que se evalan condiciones revisando valores anteriores; por ejemplo, para el operador AND con una condicin que se detecte como falsa toda la expresin es falsa, en el caso del operador OR si se encuentra una condicin verdadera todo ser verdadera

6.4.3.1 Intrpretes Los intrpretes generalmente utilizan este triplos para generar el cdigo intermedio para ejecutarse una vez considerado la instruccin como vlido. En este sentido, un compilador es ms difcil de implementar ya que tendr que mantener todas las estructuras generadas que en muchas ocasiones sern cuadrplos.
55

6.3.4 Cudruplos Es una estructura tipo registro con cuatros campos que se llaman: op, arg1, arg2 y resultado. OP tiene un cdigo intermedio. Los operadores unarios como x:=-y no utilizan arg2. Generalmente arg1, arg2 y resultado son valores de tipo puntero y apuntan a una entrada en la tabla de smbolos. 6.4 Esquemas de generacin Los esquemas de generacin son las estrategias o acciones que se debern realizarse y tomarse en cuenta en el momento de generar cdigo intermedio. Los esquemas de generacin dependen de cada lenguaje. Tomaremos algunos esquemas de generacin del lenguaje C. 6.4.1 Expresiones Para generar expresiones estas deben representarse de manera ms simple y ms literal para que su conversin sea ms rpida. Por ejemplo la traduccin de operaciones aritmticas debe especificarse una por una, de tal forma que una expresin sea lo ms mnimo posible. 6.4.2 Declaracin de variables, constantes Las declaraciones de variables y constantes deben separarse de tal manera que queden las expresiones una por una de manera simple. Por ejemplo int a,b,c; se descompone a int a; int b; intc; respectivamente. 6.4.3 Estatuto de asignacin Las operaciones de asignacin deben quedar expresadas por una expresin sencilla, si est es compleja se debe reducir hasta quedar un operador sencillo.
56

Por ejemplo: x = a+b/5; debe quedar de la forma y = b/5; z = a+y; x=z.

6.4.4 Estatuto condicional Las condiciones deben expresarse de manera lo ms sencilla posible de tal forma que puedan evaluarse en cortocircuito. Por ejemplo una instruccin como: if (a == b && f!=5 && f %3==0) se evala primero x = (a==b && f!=5) y = x && f %3==0; if (y) Las instrucciones de decisin compleja como switch se reducen a una versin complejas de ifs 6.4.5 Estatuto de ciclos Los ciclos se descomponen en un ciclo genrico, por lo que ciclos while, for y dowhile tienen la misma representacin interna. En el caso de C, todo queda en forma de while. Las condiciones lgicas tambin pueden ser evaluadas en cortocircuito y reducidas. 6.4.6 Arreglos Los arreglos se descomponen en estructuras bsicas de manejo de manera simple, as por ejemplo: char *a=Hola; se reduce a: a[0]=H; a[1]=o; a[2]=l; a[3]=a; a[4]=\0; 6.4.7 Funciones Las funciones pueden reducir a en lnea, lo que se hace es expander el cdigo original de la funcin. Las funciones se descomponen simplificando los parmetros de manera individual al igual que el valor de retorno.

57

Unidad VII Optimizacin 7.1 Tipos de optimizacin Las optimizaciones pueden realizarse de diferentes formas. Las optimizaciones se realizan en base al alcance ofrecido por el compilador. La optimizacin va a depender del lenguaje de programacin y es directamente proporcional al tiempo de compilacin; es decir, entre ms optimizacin mayor tiempo de compilacin. Tipos de optimizacin Como el tiempo de optimizacin es gran consumidor de tiempo (dado que tiene que recorrer todo el rbol de posibles soluciones para el proceso de optimizacin) la optimizacin se deja hasta la fase de prueba final. Algunos editores ofrecen una versin de depuracin y otra de entrega o final. La optimizacin es un proceso que tiene a minimizar o maximizar alguna variable de rendimiento, generalmente tiempo, espacio, procesador, etc. Desafortunamente no existen optimizador que hagan un programa ms rpido y que ocupe menor espacio. La optimizacin se realiza reestructurando el cdigo de tal forma que el nuevo cdigo generado tenga mayores beneficios. La mayora de los compiladores tienen una
58

optimizacin baja, se necesita de compiladores especiales para realmente optimizar el cdigo. 7.1.1 Locales La optimizacin local se realiza sobre mdulos del programa. En la mayora de las ocasiones a travs de funciones, mtodos, procedimientos, clases, etc. La caracterstica de las optimizaciones locales es que slo se ven reflejados en dichas secciones. La optimizacin local sirve cuando un bloque de programa o seccin es crtico por ejemplo: la E/S, la concurrencia, la rapidez y confiabilidad de un conjunto de instrucciones. Como el espacio de soluciones optimizacin local es ms rpida 7.1.2 Bucles Los ciclos son una de las partes ms esenciales en el rendimiento de un programa dado que realizan acciones repetitivas, y si dichas acciones estn mal realizadas, el problema se hace N veces ms grandes. La mayora de las optimizaciones sobre ciclos tratan de encontrar elementos que no deben repetirse en un ciclo. Ciclos while(a == b) { intc=a; c=5;; } es ms pequeo la

59

En este caso es mejor pasar el int c =a; fuera del ciclo de ser posible. El problema de la optimizacin en ciclos y en general radica es que muy difcil saber el uso exacto de algunas instrucciones. As que no todo cdigo de proceso puede ser optimizado. Otros uso de la optimizacin pueden ser el mejoramiento de consultas en SQL o en aplicaciones remotas (sockets, E/S, etc.) 7.1.3 Globales La optimizacin global se da con respecto a todo el cdigo. Este tipo de optimizacin es ms lenta pero mejora el desempeo general de todo programa. Las optimizaciones globales pueden depender de la arquitectura de la mquina. En algunos casos es mejor mantener variables globales para agilizar los procesos (el proceso de declarar variables y eliminarlas toma su tiempo) pero consume ms memoria. Algunas optimizaciones incluyen utilizar como variables registros del CPU, utilizar instrucciones en ensamblador. 7.1.4 De mirilla La optimizacin de mirilla trata de estructurar de manera eficiente el flujo del programa, sobre todo en instrucciones de bifurcacin como son las decisiones, ciclos y saltos de rutinas. La idea es tener los saltos lo ms cerca de las llamadas, siendo el salto lo ms pequeo posible 7.2 Costos Los costos son el factor ms 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. La optimizacin de una pequea mejora tal vez tenga una pequea ganancia en
60

tiempo o en espacio pero sale muy costosa en tiempo en generarla. Pero en cambio si esa optimizacin se hace por ejemplo en un ciclo, la mejora obtenida puede ser N veces mayor por lo cual el costo se minimiza y es benfico la mejora. Por ejemplo: for(int i=0; i < 10000; i++); si la ganancia es de 30 ms 300s 7.2.1 Costo de ejecucin. Los costos de ejecucin son aquellos que vienen implcitos al ejecutar el programa. En algunos programas se tiene un mnimo para ejecutar el programa, por lo que el espacio y la velocidad del microprocesadores son elementos que se deben optimizar para tener un mercado potencial ms amplio. Costos de ejecucin Las aplicaciones multimedias como los videojuegos tienen un costo de ejecucin alto por lo cual la optimizacin de su desempeo es crtico, la gran mayora de las veces requieren de procesadores rpidos (e.g. tarjetas de video) o de mucha memoria. Otro tipo de aplicaciones que deben optimizarse son las aplicaciones para dispositivos mviles. Los dispositivos mviles tiene recursos ms limitados que un dispositivo de cmputo convencional razn por la cual, el mejor uso de memoria y otros recursos de hardware tiene mayor rendimiento. En algunos casos es preferible tener la lgica del negocio ms fuerte en otros dispositivos y hacer uso de arquitecturas descentralizadas como cliente/servidor o P2P. 7.2.2 Criterios para mejorar el cdigo

61

La mejor manera de optimizar el cdigo es hacer ver a los programadores que optimicen su cdigo desde el inicio, el problema radica en que el costo podra ser muy grande ya que tendra que codificar ms y/o hacer su cdigo ms legible. Los criterios de optimizacin siempre estn definidos por el compilador. Criterios de optimizacin Muchos de estos criterios pueden modificarse con directivas del compilador desde el cdigo o de manera externa. Este proceso lo realizan algunas herramientas del sistema como los ofuscadores para cdigo mvil y cdigo para dispositivos mviles.

7.2.3 Herramientas para el anlisis del flujo de datos Existen algunas herramientas que permiten el anlisis de los flujos de datos, entre ellas tenemos los depuradores y desambladores. La optimizacin al igual que la programacin es un arte y no se ha podido sistematizar del todo.

Unidad VIII Generacin de cdigo intermedio 8.1 Lenguaje mquina El lenguaje mquina slo es entendible por las computadoras. Se basa en una lgica binaria de 0 y 1, generalmente implementada por mecanismos elctricos. En general el lenguaje mquina es difcil de entender para los humanos por este motivo hacemos uso de lenguajes ms parecidos a los lenguajes naturales. 8.1.1 Caractersticas
62

El lenguaje mquina realiza un conjunto de operaciones predeterminadas llamadas micro operaciones, slo realizan operaciones del tipo aritmtica (+,-,*, /), lgicas (AND, OR, NOT) y de control (secuencial, decisin, repetitiva) El lenguaje mquina es dependiente del tipo de arquitectura. As un programa mquina para una arquitectura intel x86 no se ejecutar en una arquitectura Power PC de IBM (al menos de manera nativa). Algunos microprocesadores implementan ms funcionalidades llamado CISC, pero son ms lentos que los RISC ya que estos tienen registros ms grandes. 8.1.2 Direccionamiento Es la forma en como se accede a la memoria. Recordar que un programa no puede ejecutarse sino se encuentra en memoria principal. La forma de acceder a la memoria depende del microprocesador, pero en general existen dos tipos de direccionamiento: directo e indirecto. El direccionamiento directo tambin recibe el nombre de direccionamiento absoluto y el acceso a las direcciones se hace de manera directa. El direccionamiento indirecto tambin recibe el nombre de direccionamiento relativo y se basa a partir de una direccin genrica, generalmente el inicio del programa. 8.2 Lenguaje ensamblador El ensamblador (del ingls assembler) es un traductor de un cdigo de bajo nivel a un cdigo, ejecutable directamente por la mquina para la que se ha generado. Fue la primera abstraccin de un lenguaje de programacin, posteriormente aparecieron los compiladores. 8.2.1 Caractersticas
63

El programa lee un archivo escrito en lenguaje ensamblador y sustituye cada uno de los cdigos mnemotcnicos por su equivalente cdigo mquina. Los programas se hacen fcilmente portables de mquina a mquina y el clculo de bifurcaciones se hace de manera fcil. Clasificacin ensambladores Ensambladores bsicos. Son de muy bajo nivel, y su tarea consiste bsicamente en ofrecer nombres simblicos a las distintas instrucciones, parmetros y cosas tales como los modos de direccionamiento. Ensambladores modulares, o macro ensambladores. Descendientes de los ensambladores bsicos, fueron muy populares en las dcadas de los 50 y los 60, antes de la generalizacin de los lenguajes de alto nivel. Un macroinstruccin es el equivalente a una funcin en un lenguaje de alto nivel. 8.2.2 Almacenamiento Una de las principales ventajas del uso del ensamblador, es que se encarga de administrar de manera transparente para el usuario la creacin de memoria, las bifurcaciones y el paso de parmetros. Adems nos permite acceder directamente a los recursos de la mquina para un mejor desempeo. 8.3 Registros Los registros son la memoria principal de la computadora. Existen diversos registros de propsito general y otros de uso exclusivo. Algunos registros de propsito general son utilizados para cierto tipo de funciones.
64

Existen registros acumuladores, puntero de instruccin, de pila, etc. 8.3.1 Distribucin La distribucin es el proceso en el que el programa generado puede ejecutarse en otras mquinas. Con respecto al ensamblador, la mayora del direccionamiento se hace relativo para que el programa sea relocalizable por un programa llamado cargador En el caso de programas compilados se necesitan de las libreras, si son estticas se incluyen en el ejecutable por lo que el programa se hace grfico, si son dinmicas no pero el programa es ms pequeo. 8.3.2 Asignacin La asignacin de valores a variables se hace a travs de un proceso de mover el contenido de memoria a registro, o de registro a memoria, pero nunca de memoria a memoria. Cuando se trata de memoria dinmica se debe seguir el rastro de los datos

65

8.4 Administracin de memoria La administracin de la memoria es un proceso hoy en da muy importante, de tal modo que su mal o buen uso tiene una accin directa sobre el desempeo de memoria. En general un ensamblador tiene un administrador de memoria ms limitado que un compilador. Administracin de memoria En la mayora de los lenguajes de programacin el uso de punteros no estaba vigilado por lo que se tienen muchos problemas con el uso de memoria. Los lenguajes ms 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 desempeo.

66

BIBLIOGRAFIA
www.mitecnologico.com/Main/ProgramacionDeSistemas

www.sistemas.ith.mx/.../Programacion%20de%20sistemas_ISC.pdf antares.itmorelia.edu.mx/~jcolivar/courses/ps207a/ps2_u1.pdf

67

Anda mungkin juga menyukai