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

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.









El problema de la optimización en ciclos y en general radica es que muy difícil saber el uso exacto de algunas instrucciones. Así que no todo código de proceso puede ser optimizado. 



Carlos Daniel Martinez Diaz
Referencia: Compiladores: Principios, técnicas y herramientas. Segunda edición Aho, Lam,Sethi, Ullman , Addison- Wesley, Pearson Eduación, México 2008.

3.1.1 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.
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.
Como el espacio de soluciones es más pequeño la optimización local es más rápida.

ejemplos: 
Folding
- Propagación de constantes
- Reducción de potencia.
- Reducción de subexpresiones comunes.
Lenguajes y Autómatas ll: Tipos de Optimización


Investigado por Jonathan Arturo Ramos Hernández
Referencia: LOCAL, A. D. O. PROGRAMACIÓN DE OPERACIONES CON TIEMPOS DE PREPARACIÓN MEDIANTE ALGORITMOS DE OPTIMIZACIÓN LOCAL.


Unidad IIOptimización    
La optimización es un proceso que tiene a minimizar o maximizar alguna variable de rendimiento, generalmente tiempo, espacio, procesador, etc.
Desafortunamente no existe un optimizador que haga un programa más rápido y que ocupe menor espacio.La optimización se realiza reestructurando el código de tal forma que el nuevo código generado tenga mayores beneficios.


lunes, 2 de marzo de 2020

2.3.6 Estructuras




Las estructuras de datos se emplean con el objetivo principal de organizar los datos contenidos dentro de la memoria del ordenador. Así, nuestra primera experiencia con estructuras comienza desde el momento mismo en que usamos en nuestros programas variables de tipos primitivos (char, short, int, float, etc). A la memoria del ordenador se le puede considerar como un gran bloque compuesto por una serie de BYTES dispuestos secuencialmente uno detrás de otro. por ejemplo, si un ordenador posee una memoria de 128MB (128 megas) entonces se le puede leer o escribir desde el BYTE 0 hasta el BYTE 128MB - 1 ( 0000000H .. 7FFFFFFH )

La idea de ver la memoria como un serie de bytes es buena, sin embargo no es suficiente ya que en la misma podemos guardar números, cadenas de caracteres, funciones, objetos, etc. de tal manera que surge la necesidad de establecer los mecanismos adecuados para dar cuenta de la forma, tamaño y objetivo de los datos almacenados. Según el tipo de microprocesador, estos tienen la capacidad para manipular o direccionar estructuras compuestas por uno, dos, cuatro, etc, bytes; de donde se derivan los tipos que comunmente se conocen como: BYTE, WORD, DWORD, QWORD y TWORD.

La estructura mínima de información manipulable en un sistema de computación es el BIT el cual se agrupa normalmente en bloques de 8 para formar un BYTE. Cabe mencionar que los BITS no son direccionables directamente, sino a través de compuertas AND, OR, NOT, XOR, las cuales en C y C++ se escriben como &, |, ~ y ^, conocidos como "Bitwise operators" u "Operadores de manipulación de bits".

En C,C++ existe una serie de estructuras básicas o tipos primitivos, los cuales pueden ser usados por el programador para declarar variables, y también son el fundamento sobre el cual se crean estructuras complejas. El tamaño de los tipos primitivos no es estándar ya que los mismos dependen de factores tales como:
  • Tipo del microprocesador
  • El compilador
Sin embargo, en la actualidad, la mayoria de compiladores de C y C++ soportan los siguientes tipos con la longitud indicada


Investigado por Saul Santiago Hernández.
Referencia
Aho, A. V., Hopcroft, J. E., & Ullman, J. D. (1988). Estructuras de datos y algoritmos (Vol. 1). Addison-Wesley Iberoamericana.

2.3.5 Funciones


Las funciones pueden reducir a en línea, lo que se hace que expandir el código original de la función.

Las funciones se descomponen simplificando los parámetros de manera individual al igual que el valor de retorno.

Entendemos que es el uso de la lengua que hace un hablante. En simples palabras, las funciones del lenguaje son los diferentes objetivos, propósitos y servicio que se le da al lenguaje al comunicarse, dándose una función del lenguaje por cada factor que tiene éste, en donde la función que prevalece es el factor en donde más se pone énfasis al comunicarse. Diversos lingüistas (Karl Bühler, Roman Jakobson, Michael Halliday ) han propuesto distintas clasificaciones de las funciones del lenguaje: Bühler propuso que existían únicamente tres funciones: La Representativa (por la cual se trasmiten informaciones objetivamente) La Expresiva o emotiva (que expresa sentimientos del emisor) La Conativa, mediante la que se influye en el receptor del mensaje a través de órdenes, mandatos o sugerencias ESTRUCTURAS El código intermedio no es el lenguaje de programación de ninguna máquina real, sino que corresponde a una máquina abstracta, que se debe de definir lo más general posible, de forma que sea posible traducir este código intermedio a cualquier máquina real. El objetivo del código intermedio es reducir el número de programas necesarios para construir traductores, y permitir más fácilmente la transportabilidad de unas máquinas a otras. Supóngase que se tienen n lenguajes, y se desea construir traductores entre ellos. Sería necesario construir n*(n-) traductores. Sin embargo si se construye un lenguaje intermedio, tan sólo son necesarios 2*n traductores.

Por ejemplo un fabricante de compiladores puede construir un compilador para diferentes máquinas objeto con tan sólo cambiar las dos últimas fases de la tarea de síntesis.

Investigado por: Jonathan Arturo Ramos Hernández
Referencia
Martin, J. C., & Blanco y Correa Magallanes, J. L. (2004). Introduction to languages and the theory of computation. Lenguajes formales y teoría de la computación.

2.3.4 Instrucciones de control


Esta forma de programación sólo permite resolver problemas sencillos. Para resolver problemas más complejos, nos puede interesar que dependiendo de los valores de los datos, se ejecuten unas instrucciones u otras.
Las instrucciones condicionales nos van a permitir representar éste tipo de comportamiento. Sentencias IF y SWITCH. En otros casos, nos encontraremos con la necesidad de repetir una instrucción o instrucciones un número determinado de veces. En éstos casos utilizaremos instrucciones de control iterativas o repetitivas (ciclos). Sentencias WHILE, DO-WHILE y FOR.
Resultado de imagen para switch estructuraResultado de imagen para if

Investigado por: José Armando Pérez Cruz
Referencia
 Rocha, J. (2005). Autómatas de pila y máquinas de turing estructurados.

2.3.3 Instrucciones de asignación


La sintaxis general de la instrucción de asignación es:

nombre_de_la_variable = valor

El valor a la derecha del signo igual puede ser una constante, otra variable o una expresión que combine constantes y variables, pero siempre la variable y su valor deben ser del mismo tipo de dato.
Ejemplos:
edad% = 5
area! = 12.3
nombre$ = “Pedro”

Instrucciones de asignación compuesta

Las instrucciones de asignación compuesta realizan primero una operación en una expresión antes de asignarla a un elemento de programación. En el siguiente ejemplo se muestra uno de estos operadores, +=, que incrementa el valor de la variable del lado izquierdo del operador con el valor de la expresión de la derecha.
Una instrucción de asignación asigna el valor de una expresión a una variable. En general, si la variable que se va a asignar es una propiedad, la propiedad debe ser de lectura y escritura o de sólo escritura; en caso contrario, se produce un error de compilación. Si la variable es una variable de sólo lectura, la asignación debe producirse en un constructor Shared o un constructor de instancia apropiado para el tipo de la variable; en caso contrario, se producirá un error de compilación.

Investigador por Carlos Daniel Martinez Diaz
Referencia:
Alfred V. Aho, Ravi Sethi : At&T Bell Laboratories. Murray Hill, New Jersey, Jeffrey D. Ullman : Stanford University,Compiladores, principios, técnicas y herramientas, Ed. Addison Wesle Longman, Esquemas de traducción 38,39,40. 1990, 803 Páginas, Colaborador: Aoshi Shinomori

2.3.2 Expresiones


En esta función recibe una cadena que representa una línea de código intermedio y toma las medidas oportunas para que ese código se utilice. Estas medidas pueden ser escribir la línea en un fichero adecuado, almacenar la instrucción en una lista que después se pasará a otros módulos, o cualquier otra que necesitemos en nuestro compilador.

Expresiones aritméticas

Son aquella donde los operadores que intervienen en ella son numéricos, el resultado es un número y los operadores son aritméticos. Los operadores aritméticos más comúnmente utilizados son: +, - , * , / y %.
Comenzamos el estudio por las expresiones aritméticas. Lo que tendremos que hacer es crear por cada tipo de nodo un método que genere el código para calcular la expresión y lo emita. Ese código dejará el resultado en un registro, cuyo nombre devolverá el método como resultado.
Para reservar estos registros temporales, utilizaremos una función, reserva. En principio bastar ‘a con que esta función devuelva un registro distinto cada vez que se la llame.
Cada nodo generará el código de la siguiente manera:

  • Por cada uno de sus operandos, llamara al método correspondiente para que se evalúe la sub expresión. Si es necesario, reservara un registro para guardar su resultado.
  • Emitirá las instrucciones necesarias para realizar el cálculo a partir de los operandos.
Resultado de imagen para 2.3.2 Expresiones

Investigado por Dayanara Lizeth Cruz Mendez
Referencias:
Martin, J. C., & Blanco y Correa Magallanes, J. L. (2004). Introduction to languages and the theory of computation. Lenguajes formales y teoría de la computación.