viernes, 17 de julio de 2009

INTRODUCCION ALA PROGRAMACION DE SISTEMAS

unidad I Programacion de sistemas

variable: Es aquella q cambia su valor mediante la ejecucion de un programa
Acomulador: almacena valores de tipo variable
Contador: almacena valores de tipo fijo
Pseudocodigo:
Representacion de un programa en lenguaje natural
sentencia de crtl.
si = if si condicion accion de lo contrario accion

1.1 que es y que estudia la programacion en sistemas?
que es un sistema?

El trabajo del programador en sistemas es seleccionar modificar y mantener el sofware de un sistema, se apoyan en aplicaciones de hadware y sofware.
Estudia la teoria de las maquinas y su aplicacion en el diseño de sistemas digitales, de arquitectura de computadora.

prog. de sist. hadware = codigo fuente = 0,1
lenguaje maquina
lenguaje bajo nive
sofware: codigo objeto = aplicaciones

La programacion de sistemas.
Es la accion de resolver eficientemente una necesidad mediante codigo hecho programa que se comunicara para satisfacer dicha necesidad en un ambiente amigable y facil de manejar para el usuario final.

1.2 Herramientas desarrolladas con la teoria de la programacion en sistemas.
Las herramientas de programacion seon aquellas que nos permiten realizar aplicaciones, programas, rutinas, utilitarios y sistemas para la parte fisica de la computadora y asu vez producir resultados .

Hoy en dia existen en le mercado multiples herramientas de programacion y programas de depuracion o de buger que nos permiten detectar posibles errores

OPTIMIZACION

UNIDAD 7
TIPOS DE OPTIMIZACION
•La optimización va a depender del lenguaje de programación y es directamente proporcional al tiempo de compilación; es decir, entre más optimización mayor tiempo de compilación.
•Las optimizaciones pueden realizarse de diferentes formas. Las optimizaciones se realizan en base al alcance ofrecido por el compilador de programación y es directamente proporcional al tiempo de compilación; es decir, entre más optimización mayor tiempo de compilación.
•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.
LOCALES
La optimización local se realiza sobre módulos del programa. En la mayoría de las ocasiones a través de funciones, métodos, procedimientos, clases, etc.
La característica de las optimizaciones locales es que sólo se ven reflejados en dichas secciones.
La optimización local sirve cuando un bloque de programa o sección es crítico por ejemplo: la E/S, la concurrencia, la rapidez y confiabilidad de un conjunto de instrucciones.
BUCLES
•Los ciclos son una de las partes más esenciales en el rendimiento de un programa dado que realizan acciones repetitivas, y si dichas acciones están mal realizadas, el problema se hace N veces más grandes.
•La mayoría de las optimizaciones sobre ciclos tratan de encontrar elementos que no deben repetirse en un ciclo.
Ciclos
while(a == b)
{ int c = a; c = 5; …; }
En este caso es mejor pasar el int c =a; fuera del ciclo de ser posible.
Ciclos
•El problema de la optimización en ciclos y en generalradica es que muy difícil saber el uso exacto de algunas instrucciones. Asíque no todo código de proceso puede ser optimizado. •Otros uso de la optimización pueden ser el mejoramiento de consultas en SQL o en aplicaciones remotas (sockets, E/S, etc.)
DE MIRILLA
•La optimización de mirilla trata deestructurar de manera eficiente el flujo del programa, sobre todo en instrucciones de bifurcación como son las decisiones, ciclos y saltos de rutinas.
•La idea es tener los saltos lo más cerca de las llamadas, siendo el salto lo más pequeño posible.
COSTOS OPTIMIZACION
•Los costos son el factor más importante a tomar en cuentaa la hora de optimizar ya que en ocasiones la mejora obtenida puede verse no reflejada en el programa finalpero si ser perjudicial para el equipo de desarrollo.
•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.
•Pero en cambio si esa optimización se hace por ejemplo en un ciclo, la mejora obtenida puede ser N veces mayor por lo cual el costo se minimiza y es benéfico la mejora.
•Por ejemplo: for(int i=0; i<>
COSTOS DE EJECUCION
•Los costos de ejecución son aquellos que vienen implícitos al ejecutar el programa.
•En algunos programas se tiene un mínimo 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 más amplio.
•Las aplicaciones multimedias como los videojuegos tienen un costo de ejecución alto por lo cual la optimización de su desempeño es crítico, la gran mayoría de las veces requieren de procesadores rápidos (e.g. tarjetas de video) o de mucha memoria.
•Otro tipo de aplicaciones que deben optimizarse son las aplicaciones para dispositivos móviles.
•Los dispositivos móviles tiene recursos más limitados que un dispositivo de cómputo convencional razón por la cual, el mejor uso de memoriay otros recursos de hardware tiene mayor rendimiento.
•En algunos casos es preferible tener la lógica del negocio más fuerte enotros dispositivos y hacer uso de arquitecturas descentralizadas como cliente/servidor o P2P.
CRITERIOS PARA MEJORAR EL CODIGO
•La mejor manera de optimizar el código es hacer ver a los programadores que optimicen su código desde el inicio, el problema radica en que el costo podría ser muy grande ya que tendríaque codificar más y/o hacer su código mas legible.
•Los criterios de optimización siempre están definidos por el compilador.
•Muchos de estos criterios pueden modificarse con directivas del compilador desde el código o de manera externa.
•Este proceso lo realizan algunas herramientas del sistema como los ofuscadores para códigomóvil y código para dispositivos móviles
HERRAMIENTAS PARA EL ANALISIS DEL FLUJO DE DATOS
•Existen algunas herramientas que permiten el análisis de los flujos de datos, entre ellas tenemos los depuradores y desambladores.
•La optimización al igual que la programación es un arte y no se ha podido sistematizar del todo.

GENERADORES DE CODIGO INTERMEDIO

UNIDAD 6
LENGUAJES INTERMEDIOS
Es una representación más abstracta y uniforme que un lenguaje máquina concreto. Su misión es descomponer las expresiones complejas en binarias y las sentencias complejas en sentencias simples. Ventajas: • Permite una fase de análisis (análisis semántico) independiente de la máquina. • Se pueden realizar optimizaciones sobre el código intermedio (Las complejas rutinas de optimización son independientes de la máquina). Desventajas: • Pérdida de eficiencia (no permite una compilación de una sola pasada). • Introduce en el compilador una nueva fase de traducción.
Tipos de lenguajes intermedios: • Árbol sintáctico. • Árbol sintáctico abstracto. 􀂾 Todos los nodos del árbol representan símbolos terminales. 􀂾 Los nodos hijos son operandos y los nodos internos son operadores. • Grafo dirigido acíclico (GDA). • Notación posfija. • Definición de una máquina abstracta. • N-tupla: 􀂾 Cada sentencia del lenguaje intermedio consta de N elementos: (Operador, Operando1, Operando2, … , Operando N?−1) 􀂾 Los más usuales son los tercetos (tripletas) y los cuartetos (cuádruplas), llamados también código de tres direcciones.
NOTACIONES
LaS NOTACIONES SON UNA FORMA ESPECIAL EN LA QUE se pueden expresar una expresion matematica y puedan ser de 3 formas: infija,prefija y posfija.
NOTACION PREFIJA
La Expresión o Notación PreFija nos indica que el operador va antes de los operandos sus características principales son:
-Los operandos conservan el mismo orden que la notación infija equivalente.
-No requiere de paréntesis para indicar el orden de precedencia de operadores ya que el es una operación.
-Se evalúa de izquierda a derecha hasta que encontrémosle primer operador seguido inmediatamente de un par de operandos.
-Se evalúa la expresión binaria y el resultado se cambia como un nuevo operando. Se repite este hasta que nos quede un solo resultado.
NOTACION POSFIJA

Como su nombre lo indica se refiere a que el operador ocupa la posición después de los operandos sus características principales son:
-El orden de los operandos se conserva igual que la expresión infija equivalente no utiliza paréntesis ya que no es una operación ambigua.
-La operación posfija no es exactamente lo inverso a la operación prefija equivalente:
(A+B)*C AB+
NOTACION INFIJA
La Expresión o Notación InFija es la forma mas común que utilizamos para escribir expresiones matemáticas, estas notaciones se refiere a que el operador esta entre los operandos. La notación infija puede estar completamente parentizada o puede basarse en un esquema de precedencia de operadores así como el uso de paréntesis para invalidar los arreglos al expresar el orden de evaluación de una expresión: 3*4=12 3*4+2=12
ESQUEMAS DE GENERACION
Cuando una empresa desarrolla un compilador para un lenguaje fuente y un lenguaje objeto determinados, normalmente no es el único compilador que la empresa piensa desarrollar; es más muchos fabricantes de microprocesadores tienen una división de dedicada a desarrollar compiladores para los nuevos chips que construya.
Cuando el número de lenguaje fuente crece hasta un número grande M, y/o cuando el número de lenguajes objeto también crece hasta un número grande N, es necesario encontrar una técnica para evitar tener que diseñar M x N compiladores. La solución consiste en utilizar un lenguaje intermedio o una representación intermedia; de esta forma sólo hay que construir M programas que traduzcan de cada lenguaje fuente al lenguaje intermedio (los front ende), y N programas que traduzcan del lenguaje intermedio a cada lenguaje objeto (los back end).
No existe un único lenguaje intermedio en todos los compiladores, sino que cada empresa que diseña compiladores suele tener su propio lenguaje intermedio. La utilización de un lenguaje intermedio permite construir en, mucho menos tiempo un compilador para otra máquina y también permite construir compiladores para otros lenguajes fuente generando códigos para la misma máquina. La matemática es un arte, pero también una ciencia de estudio. Informalmente, se puede decir que es el estudio de los “números y símbolos”. Es decir, es la investigación de estructuras abstractas definidas a partir de axiomas, utilizando la lógica y la notación matemática. Es también la ciencia de las relaciones espaciales y cuantitativas. Se trata de relaciones exactas que existen entre cantidades y magnitudes, y de los métodos por los cuales, de acuerdo con estas relaciones, las cantidades buscadas son deducibles a partir de otras cantidades conocidas o presupuestas.
Por ejemplo, el compilador de C de GNU que se distribuye con Linux es una versión de una familia de compiladores de C para diferentes máquinas o sistemas operativos: Alpha, AIX, Sun, HP, MS-DOS, etc.. Además, GNU ha desarrollado un compilador de FORTRAN y otro de Pascal que, al utilizar el mismo lenguaje intermedio, pueden ser portados a todos los sistemas y máquinas en las que y a existe un compilador de C de GNU con relativamente poco esfuerzo.
Unidad 5
ANALIZADOR SEMANTICO
Se compone de un conjunto de rutinas independientes, llamadas por los analizadores morfológico y sintáctico.
El análisis semántico utiliza como entrada el árbol sintáctico detectado por el análisis sintáctico para comprobar restricciones de tipo y otras limitaciones semánticas y preparar la generación de código.
En compiladores de un solo paso, las llamadas a las rutinas semánticas se realizan directamente desde el analizador sintáctico y son dichas rutinas las que llaman al generador de código. El instrumento más utilizado para conseguirlo es la gramática de atributos.
En compiladores de dos o más pasos, el análisis semántico se realiza independientemente de la generación de código, pasándose información a través de un archivo intermedio, que normalmente contiene información sobre el árbol sintáctico en forma linealizada (para facilitar su manejo y hacer posible su almacenamiento en memoria auxiliar).
En cualquier caso, las rutinas semánticas suelen hacer uso de una pila (la pila semántica) que contiene la información semántica asociada a los operandos (y a veces a los operadores) en forma de registros semánticos.
CONVERSION DE TIPOS

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 conversión de tipos; lo que se denomina conversión automática. Esto sólo es posible en Java si el compilador reconoce que la variable destino tiene la suficiente precisión para contener el valor origen, como almacenar un valor byte en una variable int. A esto se le llama ensanchamiento o promoción, dado que el tipo más pequeño se ensancha o promociona al tipo compatible más grande. Si por el contrario, se desea asignar un valor de variable int a una variable byte se necesita realizar una conversión de tipos explícita. A esto se le llama estrechamiento, dado que se estrecha explícitamente el valor para que quepa en el destino. La conversión de un tipo se realiza poniendo delante un nombre de tipo entre paréntesis, por ejemplo, (tipo) valor. El código siguiente demuestra la conversión de tipos de int a byte. Si el valor del entero fuese mayor que el rango de un byte, se reduciría al módulo (resto de la división) del rango de byte.
ADMINISTRADOR DE LA TABLA DE SIMBOLOS
“La tabla de símbolos registra información acerca de cada nombre de símbolo en un programa. Históricamente, los nombres se llamaron símbolos, más que de una tabla de nombres. En este capítulo, la palabra símbolo significa nombre. La fase de análisis semántico crea la tabla de símbolos, puesto que no es sino hasta este análisis que se tiene la suficiente información sobre un nombre para describirlo. La generación de código usa la tabla de símbolos para extraer las directivas del ensamblador, para el tipo y para el tamaño apropiados.”
Una tabla de símbolos es una estructura de datos que contiene un registro por cada identificador. El registro incluye los campos para los atributos del identificador.
El administrador de la tabla de símbolos se encarga de manejar los accesos a la tabla de símbolos, en cada una de las etapas de compilación de un programa.
MANEJO DE ERRORES SEMANTICOS

jueves, 16 de julio de 2009

ANALISIS SINTACTICO

UNIDAD 4
INTRODUCCION A LAS GRAMATICAS LIBRES DE CONTEXTO
Gramaticas de contexto libre de flexibilidad proporcionada por las gramaticas de contexto libre es tal que es la mas usada para definir la sintaxis de los lenguajes de programacion.
Es un cuadrupulo g=(v,s,p,s) donde v es un conjunto finito de variables, s es un conjunto finito de simbolos terminales, p es un conjunto finito de reglas y s es el simbolo inicial. Cada produccion tiene la forma donde v es una variable del conjunto esto quiere decir en la parte izquierda de la produccion viene siempre una variable (simbolo no terminal) y en la parte derecha pueden venir cualquier numero de simbolos terminales y no terminales incluyendo la cadena nula.
DIAGRAMAS DE SINTAXIS
Un segundo metodo alternativo para desplegar las producciones de ciertas gramaticas de tipo 2 es el diagrama de sintaxis.Esta es una imagen de las producciones que permiten al usuario ver las sustituciones en forma dinamica es decir verlas como un movimiento atravez del diagrama.
PRECEDENCIA DE OPERADORES
Una expresion esta compuesta por operadores variables y constantes para simplificar podemos pensar que la forma en la que se evalua esta expresion es dividiendo el todo en subexpresiones.
La interpretacion de cualquier expresion en c++ esta determinada por la procedencia y asociativa de los operadores en dicha expresion cada operador tiene una precedencia la evaluacion de operadores con la misma precedencia viene determinada por su sociatividad.
ANALIZADOR SINTACTICO
Un analizador sintactico 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 sintacticos son los lenguajes libres de contexto.Cabe notar que existe una justificacion formal que establece que los lenguajes libres de contexto son aquellos reconocibles por un automata de pila.
ADMINISTRADOR DE TABLAS DE SIMBOLOS
La tabla de simbolos registra informacion acerca de cada nombre de simbolo en un programa historicamente los nombres se llamaron simbolos mas que de una tabla de nombres.La fase de analisis semantico cerca de la tabla de simbolos puesto que no es sino hasta este analisis que se tiene la suficiente informacion sobre un nombre para describirlo.
Una tabla de simbolos es una estructura de datos que contiene un registro por cada identificador el registro incluye los campos para los atributos del identificador.

domingo, 7 de junio de 2009

ANALISIS LEXICO

UNIDAD 3

INTRODUCCION A LOS AUTOMATAS FINITOS Y EXPRESIONES REGULARES

Automata finito: un automata finito o maquina de resultado es un modelo matematico de un sistema que recibe una cadena constituida por simbolos de un alfabeto y determina si esa cadena pertenece al lenguaje que el automata reconoce.
Formalmente un automata finito (AF) puede ser descrito con un dupla de 8 a 5 elementos donde:
"s" es unconjunto de estados "E" es el alfabeto, "T" es la funcion de transicion.

ANALIZADOR LEXICO
El analizador lexico es la primera fase de un compilador lee carecteres de entrada para formar componentes e identificarlos o clasificarlos y pasar informacion de los componentes al analizador sintactico.
Realiza ademas funciones como eliminar espacios en blanco saltos de linea tabuladores ignorar comentarios deteccion y recuperacion de errores. Los errores que el analizador lexico reconoce son simbolos no validos o no reconocidos por el lexico del lenguaje o que no forma ningun componente lexico.
Existen diversos metodos para construir un analizador lexico un metodo es usar un (AFD) para describir el patron de cada componente para este metodo se parte de una tabla descriptiva de los componentes lexicos que reconoce el analizador en donde se clasifican diversos componentes.

MANEJO DE LOCALIDADES TEMPORALES DE MEMORIA (BUFFER)
La forma mas facil de leer un programa es caracter para caracter pero es ineficiente la forma mas eficiente es realizar una copia de la memoria de todo el codigo fuente pero esto en la mayoria de las ocasiones es impractico por las dimensiones de los programas para solucionar este problema se sugiere utilizar los buffers.
MANEJO DE BUFFERS: Existen muchas formas de dividir el trabajo pero siempre se debera llevar 2 punteros uno al caracter actual y el otro al inicial del lexema, el manejo de buffer es esencial para realizar el analisis de grandes programas de la mejor manera.
UNIDAD 2

DISEÑO DETALLADO DE LOS LENGUAJES DE PROGRAMACION

El diseño detallado tiene que leer la especificacion de detalles algoritmicos representacion concreta de datos, representacion algoritmica de datos interconexiones estructuras de datos y el empaque del producto de programacion el diseño detallado esta fuertemente influenciado por el lenguaje de instrumentacion.

El diseño detallado tiene que ver mas con aspectos semanticos y la instrumentacion tiene que ver mas con aspecytos sintacticos y la instrumentacion comunica los aspectos de la sintaxis del llenguaje de programacion el estudio de codificacion interna, la insercion de pruebas y depuracion de codigo.

compilador: se define como un programa que traduce un programa fuente como pascal al lenguaje c en ensamblador o maquina.
interprete: es un traductor que toma un programa fuente lo traduce y acontinuacion lo ejecuta por ejemplo basic es un lenguaje interpretado.
portabilidad: es la capacidad del lenguaje para trabajar en cualquier plataforma.
verificabilidad: capacidad del lenguaje para soportar procedimientos texto prueba.
integridad: es el nivel de proteccion tanto de datos como componentes de un lenguaje a posibles alteraciones.
la instrumentacion tiene que ver mas con aspectos sintacticos, la instrumentacion comunica los aspectos de la sintaxis del lenguaje de programacion el estilo de la codificacion de la documentacion interna.