sábado, 2 de mayo de 2020

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


Elaborado por
Jonathan Arturo Ramos Hernández 

Aho, A. V., Hopcroft, J. E., & Ullman, J. D. (1988). Estructuras de datos y algoritmos (Vol. 1). Addison-Wesley Iberoamericana.
4.3 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.
Arquitectura de Computadoras - ppt descargar
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.

Elaborado por
Dayanara Lizeth Cruz Mendez

Rumbaugh, J., Booch, G., & Jacobson, I. (2000). El lenguaje unificado de modelado: manual de referencia. Addison Wesley,.
4.2 Lenguaje ensamblador

El ensamblador (del inglés assembler) es un traductor de un código de bajo nivel a un código, ejecutable directamente por la máquina para la que se ha generado.
Fue la primera abstracción de un lenguaje de programación, posteriormente aparecieron los compiladores.

Características

El programa lee un archivo escrito en lenguaje ensamblador y sustituye cada uno de los códigos mnemotécnicos por su equivalente código máquina.
Los programas se hacen fácilmente portables de máquina a máquina y el cálculo de bifurcaciones se hace de manera fácil.
Ensambladores

Ensambladores básicos: Son de muy bajo nivel, y su tarea consiste básicamente en ofrecer nombres simbólicos a las distintas instrucciones, parámetros y cosas tales como los modos de direccionamiento.

Ensambladores modulares, o macro ensambladores: Descendientes de los ensambladores básicos, fueron muy populares en las décadas de los 50 y los 60, antes de la generalización de los lenguajes de alto nivel. Un macroinstrucción es el equivalente a una función en un lenguaje de alto nivel.

Almacenamiento

Una de las principales ventajas del uso del ensamblador, es que se encarga de administrar de manera transparente para el usuario la creación de memoria, las bifurcaciones y el paso de parámetros. Además nos permite acceder directamente a los recursos de la máquina para un mejor desempeño.

Elaborado por
Jose Armando Perez Cruz

Zamora, F. R., & Varela, J. C. Generación de Código Intermedio.
4.1 Registro

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


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.

Elaborado por
Carlos Daniel Martínez Díaz
Saul Santiago Hernández

Rincón Nigro, M., Aguilar Castro, J., & Hidrobo Torres, F. (2011). Generación automática de código a partir de máquinas de estado finito. Computación y Sistemas14(4), 405-421.

Unidad IV: Generación de código objeto.


El generador de código objeto transforma el código Intermedio optimizado en código objeto de bajo nivel. Toma código intermedio y genera Código objeto para la máquina considerada Es la parte más próxima a la arquitectura de la Máquina. Habitualmente, se escriben "a mano" desarrollo a medida´ para cada máquina Específica.


miércoles, 25 de marzo de 2020

3.2.3 Herramientas para Análisis del Flujo de Datos

Existen algunas herramientas que permiten el análisis de los flujos de datos, entre ellas tenemos los depuradores y desambladores, diagramas de flujo y diccionario de datos.
La optimización al igual que la programación es un arte y no se ha podido sistematizar del todo.



Depurador.

Es una aplicación que permite correr otros programas, permitiendo al usuario ejercer cierto control sobre los mismos a medida que los estos se ejecutan, y examinar el estado del sistema (variables, registros, banderas, etc.) en el momento en que se presente algún problema.
El depurador permite detener el programa en:
  • Un punto determinado mediante un punto de ruptura.
  • Un punto determinado bajo ciertas condiciones mediante un punto de ruptura condicional.
  • Un momento determinado cuando se cumplan ciertas condiciones.
  • Un momento determinado a petición del usuario.
Durante esa interrupción, el usuario puede:
·         Examinar y modificar la memoria y las variables del programa.
·         Examinar el contenido de los registros del procesador.
·         Cambiar el punto de ejecución, de manera que el programa continúe su ejecución en un punto diferente al punto en el que fue detenido.
·         Ejecutar instrucción a instrucción.
·         Ejecutar partes determinadas del código, como el interior de una función, o el resto de código antes de salir de una función.
Desamblador o desensamblador.

Es un programa de computadora que traduce el lenguaje de máquina a lenguaje ensamblador, la operación inversa de la que hace el ensamblador.

Un desensamblador se diferencia de un decompilador, en que está dirigido a un lenguaje de alto nivel en vez de al lenguaje ensamblador.

Usos
Son ampliamente utilizados para crackear programas y para realizar ingeniería inversa. También son utilizados por desarrolladores de software, investigadores o estudiantes.

Ejemplos
♫ Interactive Disassembler es el más comúnmente utilizado.
♫ ILDASM es una herramienta contenida en el SDK del .NET Framework.
♫ OllyDbg es un desensamblador integrado para Lenguaje Ensamblador y COBOL.
♫ Texe es un desensamblador que corre a 32 bits y además un analizador de archivos PE (Portable Executable )de Windows libre.

Diagrama de flujo de datos.

Es una herramienta de modelización que permite describir, de un sistema, la transformación de entradas en salidas. El DFD también es conocido con el nombre de Modelo de Procesos de Negocios.

Ejemplo

Diccionario de datos.
El diccionario de datos es un listado organizado de todos los elementos de datos que son pertinentes para el sistema, con definiciones precisas y rigurosas que le permite al usuario y al proyectista del sistema tener una misma comprensión de las entradas, de las salidas, y también de cálculos intermedios.
Ejemplo

Saul Santiago Hernandez

Cortés, E. L. (2005). Utilidadesparaeldesarrolloy pruebadeprogramas. Compiladores. Intérpretes. Depuradores. Informática: Volumen II: Temario de oposiciones al cuerpo de profesores de enseñanza secundaria2, 245.
Lovello, J. M. C. (1998). Conceptos básicos de procesadores de lenguaje. Servitec.

3.2.2 Criterios para mejorar el código

Resultado de imagen para mejorar 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ía que 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ódigo móvil y código para dispositivos móviles.

Existen 3 criterios para mejorar el código
  • Asignación de registros
un registro es una memoria de alta velocidad y poca capacidad, integrada en el microprocesador, que permite guardar transitoriamente y acceder valores muy usados, generalmente en operaciones matemáticas 
Cuáles son las ventajas de la digitalización documental? - Artero

  • Operaciones innecesarias
Las operaciones innecesarias surgen a menudo por un desempeño inadecuado de la operación anterior. Debe utilizarse una segunda operación para "corregir" o dejar aceptable el trabajo de la primera
Análisis de operaciones.Fase 1.enfoque de la finalidad de la operación
  • Operaciones costosas 
En algunos casos la realización de algunas operaciones suelen tener un costo de ejecución elevado, y en ocasiones estas operaciones pueden cambiarse por otros métodos de producción que podrían ser mas complejos si es la primera vez que se realiza pero a lo largo estos métodos terminan por ser beneficiosos trayendo consigo ganancias al a hora de ejecutar las operaciones



Jose Armando Perez Cruz

López, C., Crespo, Y., Manso, E., & Marticorena, R. (2009). Evaluación de código mediante múltiples intervalos de métricas. Revista de Procesos y MEtricas6(1), 19-30.
e
3.2.1 Costo de Ejecución Optimización

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 microprocesador son elementos que se deben optimizar para tener un mercado potencial más amplio.
Algunos lenguajes de programación utilizar la pila para almacenar datos que son locales a espacio para los datos locales se asigna a los temas de la pila cuando el procedimiento se introduce, y son borradas cuando el procedimiento termina.
Organización de la memoria en tiempo de ejecución
Las técnicas de gestión de la memoria durante la ejecución del programa difieren de unos lenguajes de programación a otros, e incluso de unos compiladores a otros.


Memoria
Resultado de imagen para espacio de memoria
Otro tipo de aplicaciones que deben optimizarse son las aplicaciones para dispositivos móviles.
Los dispositivos móviles tienen recursos más limitados que un dispositivo de cómputo convencional razón por la cual, el mejor uso de memoria y otros recursos de hardware tiene mayor rendimiento.

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.

La memoria es uno de los recursos más importantes de la computadora y, en consecuencia, la parte del sistema operativo responsable de tratar con este recurso, el gestor de memoria, es un componente básico del mismo. El gestor de memoria del sistema operativo debe hacer de puente entre los requisitos de las aplicaciones y los mecanismos que proporciona el hardware de gestión de memoria.

Para que una variable pueda ser almacenada en memoria estática, es necesario conocer su tamaño (número de bytes necesarios para su almacenamiento) en tiempo de compilación. Como consecuencia, aunque una variable (u objeto) sea de ámbito global, no podrán ocupar almacenamiento estático: " Los objetos que correspondan a procedimientos o funciones recursivas, ya que en tiempo de compilación no se conoce el número de variables que serán necesarias. "

Registros
Resultado de imagen para registros
Tipos De Registros

Los registros del procesador se emplean para controlar instrucciones en ejecución, manejar direccionamiento de memoria y proporcionar capacidad aritmética. Los registros son espacios físicos dentro del microprocesador con capacidad de 4 bits hasta 64 bits dependiendo del microprocesador que se emplee. Los registros son direccionables por medio de una viñeta, que es una dirección de memoria. Los bits, por conveniencia, se numeran de derecha a izquierda (15,14,13…. 3,2,1,0), los registros están divididos en seis grupos los cuales tienen un fin especifico.

Algunos ejemplos de registros son:

•Registros de Segmento
•Registros de Apuntador de Instrucciones
•Registros Apuntadores
•Registros de Propósito General
•Registros Índices
•Registros de Banderas


La pila
Resultado de imagen para almacenar datos en pilas

La forma más sencilla de almacenar el contenido de una variable en memoria, en tiempo de ejecución, es hacerlo en la memoria estática. Así, el almacenamiento de dichas variables será permanente (durante la ejecución del programa). Por ello, resulta obvio que los datos etiquetados como constantes y las variables globales de un programa tengan asignada la memoria necesaria durante toda la ejecución del programa. Sin embargo, no todas las variables pueden almacenarse estéticamente.

La aparición de lenguajes con estructura de bloque trajo consigo la necesidad de técnicas de alojamiento en memoria más flexibles, que pudieran adaptarse a las demandas de memoria durante la ejecución del programa.

En, en general los compiladores, la asignación de memoria de variables locales se hace de una forma flexible, atendiendo al hecho de que solamente necesitan memoria asignada desde el momento que comienza la ejecución de la función hasta el momento en que ésta finaliza.

Jose Armando Perez Cruz

Linares, P., Ramos, A., Sánchez, P., Sarabia, A., & Vitoriano, B. (2001). Modelos matemáticos de optimización. Madrid: Universidad Pontificia de Comillas.
 3.2 Costos Optimización
2 ejemplos increíbles de reducción de costes en las empresas

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

Dayanara Lizeth Cruz Mendez

Domínguez, J. D. (2006). Optimización simultánea para la mejora continua y reducción de costos en procesos. Ingeniería y Ciencia, 2(4), 145-162.
3.1.4 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, 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. 

Instrucciones de bifurcación 
Interrumpen el flujo normal de un programa, es decir que evitan que se ejecute alguna instrucción del programa y salta a otra parte del programa. 
Por ejemplo: el “break”

         Switch (expresión que estamos evaluando)
         { 
                Case 1: 
                    cout << “Hola” ; 
                Break; 
               Case 2: 
                    cout << “amigos”; 
               Break;
        }


Investigado por Jonathan Arturo Ramos Hernández
Fuente: Brena, R. F. (2003). Autómatas y lenguajes. Tecnológico de Monterrey.
3.1.3 Globales

La optimización global se da con respecto a todo el código.Este tipo de optimización es más lenta pero mejora el desempeño general de todo programa. 
Las optimizaciones globales pueden depender de la arquitectura de la máquina.

Funcionamiento

Revisa el código generado a varios niveles de abstracción y realiza las optimizaciones aplicables al nivel de abstracción
Representaciones de código para extraer información de grafos.

Condiciones que se deben de cumplir

El código optimizado se ha de comportar igual que el código de partida excepto por ser más rápido o ocupar menos espacio.

Hay que buscar transformaciones que no modifiquen el comportamiento del código según el comportamiento definido para el lenguaje de programación.

EJEMPLO

Si no se ha definido el orden de evaluación de los operandos la siguiente optimización es válida.
B=2*A+(A=c*d);

Pasar a

A=c*d;

B=A*3;



Objetivo


Obtener código que se ejecuta más eficientemente según los criterios
• Tiempo de ejecución (optimización temporal)
• Espacio de memoria utilizado(optimización espacial)

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.


Saúl Santiago Hernandez

Referencia: Aho(2006),et. al. Compiladores:Principios y Técnicas. Segunda Edición.