Entradas

Mostrando entradas de marzo, 2022

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

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.  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,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. El código intermedio no es el lenguaje de programación de ninguna máquina real, sino que cor...

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. En los lenguajes de programación hay estructuras y operadores que permiten controlar el flujo de la ejecución, estos pueden ser ciclos, saltos, condiciones entre otros.  Expresiones booleanas en los lenguajes de programación, las expresiones booleanas tienen dos propósitos principales.   Se utilizan para calcular valores lógicos y como expresiones condicionales en proposiciones que alteran el flujo del control...

2.3.3 Instrucción 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.  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 c...

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

2.3.1 Variables y constantes

Variables Una variable es un nombre asociado a un elemento de datos que está situado en posiciones contiguas de la memoria principal, y su valor puede cambiar durante la ejecución de un programa. Toda variable pertenece a un tipo de dato concreto. En la declaración de una variable se debe indicar el tipo al que pertenece. Así tendremos variables enteras, reales, booleanas, etc. Por otro lado, distinguimos tres partes fundamentales en la vida de una variable: Declaración Iniciación Utilización Clasificación de las variables. Se clasifican según su contenido y su uso. Por su contenido. Variables numéricas : Son aquellas en las cuales se almacenan valores numéricos, positivos o negativos, esto quiere decir que almacenan datos de 0 a 9 con valores s + y – y el punto decimal.  Variables lógicas: Son aquellas que solo pueden tener dos valores, falso o verdadero, estos representan el resultado de una comparación entre otros datos. Variables alfanuméricas: Esta formada por caracteres alf...

2.3 Esquema de Generación

Los esquemas de generación son las estrategias o acciones que se deberán realizarse y tomarse en cuenta en el momento de generar código intermedio.Los esquemas de generación dependen de cada lenguaje. Para generar expresiones estas deben representarse de manera más simple y más literal para que su conversión sea más rápida.Por ejemplo la traducción de operaciones aritméticas debe especificarse una por una, de tal forma que una expresión sea lo más mínimo posible

2.2.4 Cuadruplos

 Es una estructura tipo registro con cuatros campos que se llaman: op, arg1, arg2 y resultado. OP tiene un código 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 símbolos. Constituida por 4 elementos: un código de operación, dos operando de entrada y otro de salida para almacenar el resultado. <operador>,<operando1>,<operando2>,<resultado> Ejemplo: (A+B)*(C+D)-E +, A, B, T1 +, C, D, T2 *, T1, T2, T3 -, T3, E, T4 Las cuádruplas facilitan la aplicación de muchas optimizaciones, pero hay que tener un algoritmo para la reutilización de las variables temporales (reutilización de registros del procesador)

2.2.3 Triplos

Imagen
En la historia de los compiladores han sido utilizadas una amplia variedad de representaciones intermedias como lo es la siguiente clase de representación de código intermedio de un árbol de 3 direcciones,2 para los operandos y una para la ubicación del resultado. esta clase incluye un amplio numero de representaciones diferentes entre las cuales encontramos cuadruplos y triples. la principal diferencia entre estas notaciones y la notación postfija es que ellos incluyen referencias explicitas para los resultados de los cálculos intermedios, mientras que la notación posfija los resultados son implícitos al representarlos en una pila. La diferencia entre triples y cuadruplos es que con los triples es referenciado el valor intermedio hacia el numero del triple que lo creo, pero en los cuádruplos requiere que ellos tengan nombre implícitos. Los triples tienen una ventaja obvia de ser mas consistente, pero ellos dependen de su posición, y hacen que la optimización presente cambios de código...

2.2.2 CODIGO P

Imagen
El código P hace referencia a máquinas que utilizan o se auxilian de pilas para generar código objeto. En muchos caso la P se asociado a código portable el cual garantiza que el código compilado en una máquina se pueda ejecutar en otras. Para garantizar la portabilidad del código se necesita que el lenguaje este estandarizado por algún instituto y que dicho código no tenga extensiones particulares. También se recomienda la no utilización de características especiales exclusivas de alguna arquitectura de computadoras en particular.

2.2.1 Notación Polaca

La notación polaca es la originada por un Autómata con pila, en la que los operador es siempre preceden a los operandos sobre los que actúan, y que tiene la ventaja de no necesitar paréntesis:  Estándar  Ejemplo  1: 2 * (3 + 5)  Ejemplo 2: 2 * 3 + 5  Polaca  Ejemplo 1: * 2 + 3 5  Ejemplo 2: + * 2 3 5

2.2 Representación de Código Intermedio

Estas notaciones simplifican la traducción de nuestro código fuente a nuestro código objeto ya que ahorran y acotan símbolos de la tabla de símbolo. Existen diversos tipos de códigos intermedios que varían en cuanto a su sencillez, lo próximos que están alas maquinas reales y lo fácil que es trabajar con ellos, otros tipos de código intermedio que representan los programas como árboles o grafos y representaciones mixtas que combinan grafos o árboles y representaciones lineales. Generación de Código Intermedio  Proceso de Síntesis. Lenguaje Intermedio Generación de Código Ventajas del código intermedio. Facilitar la fase de optimización. Aumentar la portabilidad del compilador de una máquina a otra. Se puede utilizar el mismo analizador para diferentes generadores. Aumentar la portabilidad del compilador de una máquina a otra Se puede utilizar el mismo analizador para diferentes generadores Se pueden utilizar optimizadores independientes de la máquina Tipos de representaciones inter...

2.1.3 PostFija

Imagen
La notación postfija pone el operador al final de los dos operandos, por lo que la expresión queda: ab+5- La notación posftfija utiliza una estructura del tipo LIFO (Last In First Out) pila, la cual es la más utilizada para la implementación. 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+C* Notación postfija: El orden es primer operando, segundo operando, operador.

2.1.2 Infija

Imagen
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: Es la más utilizada por los humanos porque es la más comprensible ya que ponen el operador entre los dos operando. Por ejemplo a+b, 5+6. • No existe una estructura simple para representar este tipo de notación en la computadora por esta razón se utilizan otras notaciones.

2.1.1 Prefija

Imagen
Es una forma de notación para la lógica, la aritmética y el algebra. Su característica distintiva es que coloca los operadores ala izquierda de sus operandos. La notación prefija pone el operador primero que los dos operandos, por lo que la expresión 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 aritmético. La notación prefija pone al operador primero que los dos operandos ejemplo: +34

2.1 Notaciones

  Las notaciones sirven de base para expresar sentencias bien definidas. • El uso más extendido de las notaciones sirve para expresar operaciones aritméticas. • Las expresiones aritméticas se pueden expresar de tres formas distintas: infija, prefija y postfija . • La diversidad de notaciones corresponde en que para algunos casos es más sencillo un tipo de notación. • Las notaciones también dependen de cómo se recorrerá el árbol sintáctico, el cual puede ser en inorden, preorden o postorden; teniendo una relación de uno a uno con la notación de los operadores.