martes, 28 de marzo de 2023

resumen THE ASSIGNMENT OPERATOR IN JAVA

LA OPERADORA DE MISIONES EN JAVA

Aparte de los comandos Java, los operadores Java son una de las herramientas más importantes cuando se utiliza el lenguaje de programación web. Con una visión general bien estructurada, siempre tendrás a mano los operadores Java más importantes cuando los necesites.

puede utilizarse para realizar operaciones sobre un conjunto de valores. Hay una serie de operadores Java diferentes, que se dividen en operadores unarios, binarios y ternarios. Unario significa que el operador Java tiene un dígito, binario describe un operador de dos dígitos, y el operador condicional ternario tiene tres dígitos.

resumen de VARIABLES & CONSTANTS

Una variable

es un objeto nombrado capaz de contener un dato que puede ser modificado durante la ejecución de programa. En C, las variables tienen tipo, que significa que es necesario especificar el tipo de dato que se le asigna a una variable (int, float etc.). Las variables se almacenan en la memoria RAM y el espacio de memoria que ocupan (en bytes) depende de su tipo.

Una constante

tiene las mismas características que una variable excepto el hecho de que su valor asignado no puede ser cambiado durante la ejecución de programa. A diferencia de las variables, las constantes se almacenan en la memoria Flash del microcontrolador para guardar el mayor espacio posible de memoria RAM. El compilador las reconoce por el nombre y el prefijo const. En mikroC, el compilador reconoce automáticamente el tipo de dato de una constante, así que no es necesario especificar el tipo adicionalmente.

2.3.6 Estructuras

Estructuras





Estructura y fases de un compilador (2) Análisis lineal También conocido como: análisis léxico o exploración. Ejemplo, en la proposición de asignación: posicion = inicial + velocidad * 60 Se identifican los siguientes componentes léxicos Identificador (posicion) Símbolo de asignación (=) Identificador (inicial) Signo de suma (+) Identificador (velocidad) Signo de multiplicación (*) Número (60)
12. Estructura y fases de un compilador (3) Análisis jerárquico También llamado análisis sintáctico. Implica agrupar los componentes léxicos en frases gramaticales que el compilador utiliza para sintetizar la salida. Por lo general, las frases gramaticales se representan mediante un árbol de análisis sintáctico. Ejemplo: Proposición de asignación Identificador posición = expresión expresión identificador + expresión inicial expresión identificador * expresión velocidad Número 60
13. Estructura y fases de un compilador (4) La estructura jerárquica de un programa normalmente se expresa utilizando reglas recursivas. Para el ejemplo anterior de la proposición de asignación se tiene: Cualquier identificador es una expresión Cualquier número es una expresión Si expresión1 y expresión2 son expresiones, entonces también lo son: expresión1 + expresión2 expresión1 * expresión2 (expresión1) Proposición de asignación Identificador posicion = expresión expresión identificador + expresión inicial expresión identificador * expresión velocidad Número 60
14. Estructura y fases de un compilador (5) Muchos lenguajes definen recursivamente las proposiciones mediante reglas como: Si identificador1 es un identificador y expresión2 es un identificador, entonces: Identificador1 = expresión2 Si expresión1 es una expresión y proposición2 es una proposición, entonces: while ( expresión1 ) do proposición2 if ( expresión1 ) then proposición2 El análisis lineal (léxico) no es suficientemente poderoso para analizar proposiciones o expresiones recursivas. Cuándo una construcción del lenguaje fuente es recursiva, entonces es factible emplear una gramática libre de contexto para formalizar la recursión.
15. Estructura y fases de un compilador (6) Análisis semántico Revisa el programa e intenta encontrar errores semánticos. Reúne la información sobre los tipos para la fase posterior de generación de código. Un componente importante es la verificación de tipos. Se verifica si cada operador tiene los operandos permitidos. Un real no debe utilizarse como índice de un arreglo. Convertir un número entero a real para algunos operadores. = posicion + inicial * velocidad 60 = posicion + inicial * velocidad ent a real 60 El análisis semántico inserta una conversión de entero a real en el árbol de análisis sintáctico
16. Estructura y fases de un compilador (7) Conceptualmente un compilador opera en fases, cada una de las cuales transforma al programa fuente de una representación a otra. Analizador léxico Programa fuente Analizador sintáctico Analizador semántico Generador de código intermedio Optimizador de código Generador de código Programa objeto Manejador de errores Administrador de la Tabla de símbolos
17. Estructura y fases de un compilador (8) Administración de la tabla de símbolos Registra los identificadores e información referente a ellos. Se tiene un registro por cada identificador. Todas las fases hacen uso de esta tabla. Detección e información de errores En cada fase se pueden encontrar errores. Se debe definir como se deben tratar los errores en cada una de las fases. Las fases de análisis Cambian la representación interna del programa fuente conforme avanza cada una de ellas. Generación de código intermedio Se puede considerar como código para una máquina abstracta. Dicha representación debe ser fácil de producir y fácil de traducir al código objeto. Optimización de código Trata de mejorar el código intermedio de modo que resulte un código máquina más rápido de ejecutar. Generación de código Por lo general se trata de código máquina relocalizable o código ensamblador. Se deben seleccionar posiciones de memoria para cada una de las variables. posicion = inicial + velocidad * 60 Analizador léxico id1 = id2 + id3 * 60 Analizador sintáctico = id1 + id2 * id3 60 Analizador semántico = id1 + id2 * id3 ent a real 60 Generador de código intermedio temp1 = entreal(60) temp2 = id3 * temp1 temp3 = id2 +temp2 Id1 = temp3 Optimizador de código temp1 = id3 * 60.0 temp2 = id2 +temp1 Id1 = temp2 Generador de código MOVF id3, R2 MULF #60.0, R2 MOVF id2, R1 ADDF R2, R1 MOV R1, id1 TABLA DE SIMBOLOS posicion … inicial … velocidad … 1 2 3 4
18. Estructura y fases de un compilador (9) Con frecuencia las fases de un compilador se agrupan en una etapa inicial y una etapa final: Etapa inicial Comprende aquellas fases que dependen principalmente del código fuente. Normalmente incluye el análisis léxico, sintáctico y semántico, la creación de la tabla de símbolos, la generación de código intermedio y cierta optimización de éste. También incluye el manejo de errores correspondientes a cada etapa. Etapa final Comprende aquellas partes del compilador que dependen de la máquina objeto. En general estas partes dependen del lenguaje intermedio, más que del lenguaje fuente. Comprende aspectos de optimización y generación de código, junto con el manejo de errores necesario y las operaciones con la tabla de símbolos. CLR Architecture.PNG

19. Estructura y fases de un compilador (10) Pasadas Consiste en leer un archivo de entrada y escribir uno de salida. Es común que se apliquen varias fases de la compilación en una sola pasada Reducción de pasadas Es deseable tener pocas pasadas dado que la lectura y la escritura de archivos intermedios lleva tiempo. Sin embargo, en ocasiones resulta muy difícil generar código si no se tiene una representación intermedia completa. Por ejemplo: Las instrucciones de tipo goto que saltan hacia delante. En este caso es posible dejar un espacio en blanco y rellenar cuando la información esté disponible.

click para ver el video

https://alexisbladimirlopezfigueroa1998.blogspot.com/2019/09/

2.3.5 Funciones

 

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

2.3.4 Instrucciones de control

 

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, como las proposiciones if-else o do-while. Las expresiones booleanas se componen de los operadores boleanos (and, or y not) aplicados a los elementos que son variables booleanas o expresiones relacionales. Algunos lenguajes permiten expresiones más generales donde se pueden aplicar operadores booleanos, aritméticos y relacionales a expresiones de cualquier tipo, sin diferenciar valores booleanos de aritméticos; si es necesario se realiza una coerción. Saltos En el código de los saltos los operadores lógicos &&, y! son traducidos a saltos aunque estos no aparecen realmente en el código. Por ejemplo la expresión: if (x < 00 x > 200 && x!= y ) x=0; se puede traducir como las siguientes instrucciones: If x < 00 goto L2 If False x > 200 goto L If False x!= y goto L L2: x =0 L: Si la expresión es verdadera se alcanza la etiqueta L2 y se realiza la asignación.

https://youtu.be/F49Eng-x5rE

2.3.3 instruccion de asignacion

 

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

https://alexisbladimirlopezfigueroa1998.blogspot.com/2019/09/

2.3.2 expresiones

 

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.


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.

https://www.youtube.com/watch?v=z7vmzu9078Y

2.3.1 variables y constantes

 

Variables y constantes.


Las variables y constantes deben separarse de tal manera que queden las expresiones una por una de manera simple.

Por ejemplo int a,b,c; se descompone a int a; int b; intc; respectivamente.


Las declaraciones de variables y constantes deben separarse de tal manera que queden las expresiones una por una de manera simple.

• Por ejemplo int a,b,c;
se descompone a int a;
int b; intc; respectivamente.
Las variables utilizadas en los programas se clasifican en dos tipos:
variables locales y variables globales.
Variables locales:
Aquella que está declarada para el programa o algoritmo completo.
 Para definir variables locales, la definición debe hacerse inmediatamente después de una llave de inicio ({), y la variable deja de existir fuera de la llave de fin(}) que corresponde a la llave de inicio después del cuál fue definida la variable.
Ejemplo:
{
int a,b;
a=5;
b=a + 100;
}
Variables globales:
Aquella que está declarada y definida dentro de una función y sólo es válida dentro de la misma función y no podrá utilizarse en otra parte del programa.
 Una variable global se declara fuera de cualquier función y primero que cualquier función que requiera de ella. Una variable se declara de la siguiente forma:
 tipo identificador1, identificador2..ident n;
Ejemplos:
 Algunos ejemplos de cómo definir variables son los siguientes:
 int alumnos, contador;
 float A,B,C;
 char Letra;
Declaracion de Constantes.
Para declarar constantes en el lenguaje C, sólo basta anteponer el calificador const seguido del tipo de dato que manejará esa constante (int,char,etc), y por último el valor que tomará esa variable.

click para ver el video

2.3 Esquema de generacion

 

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. Tomaremos algunos esquemas de generación del lenguaje C.

Expresiones
Instrucciones de control
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
Son aquellas que asignan un valor a una variable o una exprecionejemplo
X=23 ó Y=expresion
Instruccion de asignacion


Las funciones son un grupo de instrucciones con un propocito en general las cuales pueden recibir parametros, mientras que la estructura es un conjunto de datos elementales interelacionados que realizan siertas operaciones entre ellos
variables y constantes
Las declaraciones de variables y constantes deben separarse de tal manera que queden las expresiones una por una de manera simple
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
Son aquellas que permiten modificar o varial el flujo de ejecucion de un programa, existen 3 tipos los cuales son :
Instrucciones condicionales o alternativas
Instrucciones de salto
Instrucciones repetitivas
 

click para ver el video
video de esquema de generacion

miércoles, 22 de marzo de 2023

Examen

                      Examen

CODIGO NOTACION POLACA

 CODIGO

CRUADRUPLOS

 

Cuádruplos

<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)
¿Qué es un Cuádruplo en lenguajes y autómatas?
Un cuádruplo es una estructura tipo registro con cuatro campos que se llaman (op, result, arg1, arg2). El campo op contiene un código interno para el operador. Por ejemplo, la proposición de tres direcciones x = y + z se representa mediante el cuádruplo (ADD, x,y, z).

TRIPLOS

 

Triplos.

Con una estructura de tres campos se pueden omitir los valores temporales, dicha estructura recibe el nombre de triples y tiene los siguientes campos: op, arg1 y arg2. Generalmente el código que generan los triples recibe el nombre de código de dos direcciones, aunque en ocasiones puede variar.
<operador>,<operando1>,<operando2>
 El resultado se asocia al número de tripleta
Ejemplo: W * X + (Y + Z)
1. *, W, X
2. +, Y, Z
3. +, (1), (2)
Control de flujo:
IF X>Y THEN Z=X ELSE Z=Y+1
1. >, X, Y
2. Saltar si falso, (1), 5
3. =, Z, X
4. Saltar,, 7
5. +, Y, 1
6. =, Z, (5)

|Problema La optimización supone mover tripletas y hay que recalcular las referencias.










Código p

 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.

El código P comenzó como un código ensamblador objetivo estándar producido por varios compiladores Pascal en la década de 1970 y principios de la de 1980. Fue diseñado para código real para una máquina de pila hipotética la idea era hacer que los compiladores de Pascal se transportaran fácilmente requiriendo solo que se volviera a escribir el intérprete de la maquina P para una plataforma, el código P también a probado ser útil como código intermedio y sean utilizado varias extensiones y modificaciones del mismo en diversos compiladores de código nativo, la mayor parte para lenguaje tipo Pascal.

Como el código P fue diseñado para ser directamente ejecutable, contiene una descripción implícita de un ambiente de ejecución particular que incluye tamaños de datos, además de mucha información específica para la maquina P, que debe conocer si se desea que un programa de código P se comprensible. La máquina P está compuesta por una memoria de código, una memoria de datos no específica para variables nombre das y una pila para datos temporales, junto como cualquiera registro que sea necesario para mantener la pila y apoyar la ejecución.

link de EL CODIGO P



miércoles, 15 de marzo de 2023

Definicion notacion polaca

¿Qué significa la notación polaca (PN)?

La notación polaca es una forma de notación para expresar ecuaciones aritméticas, lógicas y algebraicas. 

es una forma de notación para la lógica, la aritmética, el álgebra y la computación. Su característica distintiva es que coloca los operadores a la izquierda de sus operandos.

¿Cómo hacer la notación polaca?
Al igual que la de postfijo, la notación polaca permite prescindir de los paréntesis en el caso de operadores de aridad fija conocida. Por ejemplo, la operación 5 * (12 + 4). puede escribirse en prefijo como: * 5 (+ 12 4); o sencillamente: * 5 + 12 4 (y como 5 12 4 + *en postfijo)

codigo intermdio

El código intermedio 

se genera para una máquina virtual. Estas máquinas se definen con dos objetivos: Ser lo suficientemente simples como para poder generar código para ellas de manera sencilla, pero con la suficiente riqueza para poder expresar las construcciones del lenguaje fuente.

El código fuente puede ser traducido en su código de la máquina destino, entonces, ¿por qué hemos de traducir el código fuente en un código intermedio que luego se traduce en su código de destino? Vamos a ver las razones por las que necesitamos un código intermedio.

Código Intermedio

  • Si un compilador traduce el idioma de origen a su ordenador de destino sin tener la opción de generar código intermedio, a continuación, en cada nueva máquina, una nativa del compilador completo es necesario.

  • Código Intermedio elimina la necesidad de un nuevo compilador completo para cada máquina de la sección de análisis mismo de todos los compiladores.

  • La segunda parte del compilador, síntesis, se modifica de acuerdo a la máquina de destino.

  • Es más fácil de aplicar las modificaciones del código fuente para mejorar rendimiento del código mediante la aplicación de técnicas de optimización código el código intermedio.

  • Representación intermedia

    Códigos intermedios puede ser representado en una variedad de formas y tienen sus propios beneficios.

    • Alto nivel IR - Alto nivel de representación de código intermedio está muy cerca de la lengua de origen. Pueden ser fácilmente generados desde el código fuente y podemos aplicar fácilmente modificaciones de código para mejorar el rendimiento. Pero para optimización de la máquina destino, es menos preferido.

    • Bajo Nivel IR - Este es cerca de la máquina de destino, lo que lo hace adecuado para registro y asignación de memoria, un conjunto de instrucciones selección, etc. es bueno para optimizaciones dependientes de la máquina.

    Código intermedio puede ser específica para cada idioma (p. ej., código de bytes de Java) o independiente de la lengua (tres-código de dirección).

  • Ejemplo:

    Tomamos el ejemplo de lenguaje de programación C en una variable de tipo entero se le asigna 2 bytes de memoria y una variable de tipo float se asigna 4 bytes de memoria.

    int a;
    float b;
    Allocation process:
    {offset = 0}
       int a;
       id.type = int
       id.width = 2
    offset = offset + id.width 
    {offset = 2}
       float b;
       id.type = float
       id.width = 4
    offset = offset + id.width 
    {offset = 6}

    Para entrar en este detalle en una tabla de símbolos, un procedimientoentrar puede ser utilizado. Este método puede tener la siguiente estructura:

    enter(name, type, offset)

    Este procedimiento debe crear una entrada en la tabla de símbolos, de nombre de la variable, en su tipo y el tipo de desplazamiento de dirección relativa en su área de datos.

  • link de video CODIGO INTERMEDIO 

  • https://www.youtube.com/watch?v=Yj0cOCcXR6I

viernes, 10 de marzo de 2023

NOTACION POLACA INVERSA

link e notacion polaca inversa

 NOTACION POLACA INVERSA

Notacion Polaca

 ((x+2*y) ^5 /(4*x-3))

NOTACION POLACA ES EL RECORRIDO PREORDEN

(raiz-izq-der)

operador

operando

Operando

+

5

6


                                     (5+6)

                                 Operando



Emulador

 link de enmulador https://app.box.com/s/xo6qhgmzgmcpf24tvaytx88u34bth83i link de Informacion https://app.box.com/s/r0sbpslk0dmydm1tl8dd37y4...