miércoles, 30 de noviembre de 2016

LENGUAJE ENSAMBLADOR

LENGUAJE MÁQUINA

REGISTROS

UNIDAD IV: GENERACIÓN DE CÓDIGO

La fase final de un compilador es la generación de código objeto, que por lo general consiste en código de máquina relocalizable o código ensamblador. Las posiciones de memoria se seleccionan para cada una de las variables usadas por el programa. Después, cada una de las instrucciones intermedias se traduce a una secuencia de instrucciones de máquina que ejecuta la misma tarea. Un aspecto decisivo es la asignación de variables a registros. 

 El generador de código objeto puede considerarse como la penúltima fase de un compilador, la cual se encarga de tomar como entrada el código intermedio generado por el front-end, y producir código objeto de la arquitectura target para luego entrar en la fase de optimización de código. Toma como entrada de representación intermedia el programa fuente y produce como salida un programa objeto equivalente.

Aspectos generales

Administración de memoria:

La correspondencia entre los nombres del programa fuente con direcciones de objetos de datos en la memoria durante la ejecución la realiza la etapa inicial en cooperación con el generador de código. Las entradas en la Tabla de Símbolos se van creando conforme se examina las declaraciones de un procedimiento. 
El tipo en una declaración determina la cantidad de memoria necesaria para el nombre declarado.
Según la información de la Tabla de Símbolos se pueden determinar una dirección relativa para el nombre de un área de datos para el procedimiento.



Selección de instrucciones: 

Es importante que el conjunto de instrucciones sea uniforme y completo. Las velocidades de las instrucciones es un factor importante. Si no se tiene en cuenta la eficiencia del programa objeto, la selección de instrucciones es sencilla. Para cada tipo de proposición de tres direcciones, se puede diseñar un esqueleto de código.

Ejemplo: 

código de tres direcciones de:
x := y + z

MOV y, R0 /* cargar y en el registro R0 */
ADD z, R0 /* suma z a R0 */
MOV R0, x /* almacenar R0 en x */

Asignación de registros:

Las instrucciones que implican operandos en registros son generalmente más rápidas que las de los operandos en memoria. Por lo tanto, utilizar eficientemente los registros es fundamental para generar un buen código. El uso de registros se divide en dos subproblemas:
  • Durante la asignación de los registros: se selecciona el conjunto de variables que residirá en los registros en un momento del programa.
  • Durante la fase posterior de asignación a los registros, se escoge el registro específico en el que residirá una variable.
Elección del orden de evaluación:

El orden en que se realizan los cálculos puede variar la eficiencia del código objeto. Algunos ordenamientos de los cálculos necesitan menos registros que otros para guardar resultados intermedios.
Elegir un orden mejor es un problema difícil, NP-completo.




Imagen 1.- Generación de Código




REGISTROS

Los registros son la memoria principal de la computadora. Existen diversos registros de propósito general y otros de uso exclusivo.
 Algunos registros de propósito general son utilizados para cierto tipo de funciones. Existen registros acumuladores, puntero de instrucción, de pila, etc. 


Resultado de imagen para registros
Imagen 2.- Registros 

Distribución 

La distribución es el proceso en el que el programa generado puede ejecutarse en otras máquinas. 
Con respecto al ensamblador, la mayoría 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 librerías, si son estáticas se incluyen en el ejecutable por lo que el programa se hace gráfico, si son dinámicas no pero el programa es más pequeño.
 Debido a la complejidad del software actual se necesitan de asistentes para poder instalar y ejecutar un programa. 
Operar sobre registros es más rápido y eficiente que operar sobre memoria. Por ello, la adjudicación eficiente de registros tiene un gran impacto en la performance. El uso de registros puede dividirse en dos subproblemas: 

  • Durante la reserva de registros (allocation), se seleccionan el conjunto de variables que vivirá en registros en un punto del programa.
  •  Durante la (posterior) asignación de registros (assignation), se elige el registro específico para cada variable.


LENGUAJE MÁQUINA



El lenguaje máquina sólo es entendible por las computadoras. Se basa en una lógica binaria de 0 y 1, generalmente implementada por mecanismos eléctricos.
 En general el lenguaje máquina es difícil de entender para los humanos por este motivo hacemos uso de lenguajes más parecidos a los lenguajes naturales.
 Características

 • El lenguaje máquina realiza un conjunto de operaciones predeterminadas llamadas microoperaciones. 
• Las microoperaciones sólo realizan operaciones del tipo aritmética (+,-,*, /), lógicas (AND, OR, NOT) y de control (secuencial, decisión, repetitiva).
• El lenguaje máquina es dependiente del tipo de arquitectura. Así un programa máquina para una arquitectura Intel x86 no se ejecutará en una arquitectura Power PC de IBM (al menos de manera nativa). 
• Algunos microprocesadores implementan más funcionalidades llamado CISC, pero son más lentos que los RISC ya que estos tienen registros más grandes.

 Direccionamiento Es la forma en cómo 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 también recibe el nombre de direccionamiento absoluto y el acceso a las direcciones se hace de manera directa. 



  • El direccionamiento indirecto también recibe el nombre de direccionamiento relativo y se basa a partir de una dirección genérica, generalmente el inicio del programa. 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. Si la dirección base es el inicio de la memoria fija el direccionamiento pasa a ser un variante de direccionamiento absoluto.

ADMINISTRACIÓN DE MEMORIA



Consiste en determinar la posición de memoria en la que los diferentes símbolos del programa almacenan la información.
Depende de la estrategia utilizada para la gestión de memoria, el mecanismo puede variar.

 La administración de la memoria es un proceso hoy en día muy importante, de tal modo que su mal o buen uso tiene una acción directa sobre el desempeño de memoria. 

En general un ensamblador tiene un administrador de memoria más limitado que un compilador. 

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. 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.




miércoles, 9 de noviembre de 2016

PROBLEMAS A RESOLVER CON AUTÓMATAS

CONCEPTOS BÁSICOS


Autómata

Máquina automática programable capaz de realizar determinadas operaciones de manera autónoma y sustituir a los seres humanos en algunas tareas, en especial las pesadas, repetitivas o peligrosas; puede estar dotada de sensores, que le permiten adaptarse a nuevas situaciones.



Imagen 1. Autómatas en la comunicación

Compilador 

Es un programa informático que traduce un programa escrito en un lenguaje de programación a otro lenguaje diferente. Usualmente el segundo lenguaje es lenguaje de máquina, pero también puede ser un código intermedio (bytecode), o simplemente texto. Este proceso de traducción se conoce como compilación.

Código intermedio

Es un código abstracto independiente de la máquina para la que se generará el código objeto. El código intermedio ha de cumplir dos requisitos importantes: ser fácil de producir a partir del análisis sintáctico, y ser fácil de traducir al lenguaje objeto

Autómatas de pila
Son autómatas finitos que cuentan con un dispositivo de memoria muy elemental, del tipo pila, el cual es un almacenamiento lineal que funciona bajo el principio LIFO: Primero en Entrar, Ultimo en Salir. 


Fases de un compilador:

Imagen 2. Fases de un compilador


1.-¿Que tipos de problemas se pueden resolver con la teoría de autómatas?


Debido a que un autómata es una máquina automática programable capaz de realizar determinadas operaciones de manera autónoma, estas pueden ayudar al ser humano en tareas, en especial las pesadas, repetitivas o peligrosas, por ejemplo dentro del sector industrial donde se encuentran maquinarias pesadas, como los robots industriales que se encargan del sistema de movimiento y almacenamiento automáticos, y si revisamos a fondo encontraremos en ascensores, escaleras mecánicas, hornos, dosificadoras, sistemas de bombeo, hasta en lavadoras y microondas.


Ejemplo:

Semáforos inteligentes

Estos semáforos llevan un sistema de foto-rojo con cámaras instaladas y tienen la función de comprobar el cumplimiento de la normativa de detención de los vehículos en las intersecciones que dispongan de semáforo.
De forma que las cámaras se instalan a una distancia de 25 metros del punto de detención, para visualizar correctamente el paso de peatones y el semáforo.
Los semáforos van acompañados de una señal informativa vertical y están colocados en los puntos en los que se han registrado más accidentes. 
Estos semáforos se encargan de gestionar el tráfico dentro del casco urbano, tomando como referencia los manos libres de los usuarios en los coches que transitan determinada calle. 
Estos semáforos cuentan con la capacidad de medir las colas que se generan en ciertos cruces y detectar así los atascos de forma inmediata cabe mencionar que  todos los datos que recolectan los sensores instalados en la cinta asfáltica, son capaces de contar el número de vehículos que transitan de un punto a otro, este es un medio perfecto para poder advertir a los conductores sobre las calles y plazas más saturadas en tiempo real.


Resultado de imagen para imagenes de semáforos inteligentes

Imagen 3. Semáforo inteligente

2.-¿Como influye que un compilador deba tener sus dos faces (análisis, síntesis) para poder responder problemas ?


Para que un autómata pueda responder problemas debe de estar programado correctamente, las instrucciones deben ser exactas  y precisas ademas de poder ejecutarlas en un tiempo considerablemente rápido, para que esto pueda ser así el compilador del autómata debe pasar por una etapa de análisis que es la que se encarga de verificar que la escritura del código fuente este correctamente escrita  para que así, al pasar a la etapa de síntesis se genere los grupos de los componentes que conformaran el programa, dando como resultado el código de salida que la maquina va a interpretar.




martes, 8 de noviembre de 2016

CONCEPTO DE OPTIMIZACIÓN


La optimizacion de código se encarga de  producir un código objeto lo mas eficiente posible mejorando el rendimiento de una actividad o proceso , para ello se reduce el tiempo de ejecución de un programa y reduce el espacio de memoria.


La optimización de código puede realizarse durante la propia generación o como paso adicional, ya sea intercalado entre el análisis semántico y la generación de código (se optimizan las cuádruplas) o situado después de ésta.




imagen 1. optimización de código


Características 

  • Es un proceso continuo.
  • La optimización de algún sistema se suele realizar por los programadores.
  • Mejora de los sistemas  como objetivo principal.
  • Presencia de influencias opuestas como uno de los problemas principales que se presentan.
  • Restricciones presentes en lagunas variables de las que dependa la función de objeto.
  • Adopta programas informáticos.
  • Realiza tareas eficazmente.
  • Permite mejorar la calidad.
  • Mejora los tiempos de respuesta.