viernes, 25 de enero de 2019

Participaciones.

Documentación y creación del blog:

-Medina Toledo Cesar Emmanuel
-De la Rosa Nava Luis Alberto


Diseño y organización del Blog:

-Diaz Lucio Marco Leopoldo
-Juarez Zarate Rey Donaldo

jueves, 24 de enero de 2019

1.7.- Fases de un compilador


Fases de un compilador.

• Los compiladores son programas de computadora que traducen de un lenguaje a otro. Un compilador toma como su entrada un programa escrito en lenguaje fuente y produce un programa equivalente escrito en lenguaje objeto.
• Un compilador se compone internamente de varias etapas, o fases, que realizan operaciones lógicas. Es útil pensar en estas fases como piezas separadas dentro del compilador, y pueden en realidad escribirse como operaciones codificadas separadamente aunque en la práctica a menudo se integran.

--Análisis Léxico
– Análisis Sintáctico
– Análisis Semántico
 – Generación y Optimización de código intermedio
– Generación de código objeto

• Analizador léxico: lee la secuencia de caracteres de izquierda a derecha del programa fuente y agrupa las secuencias de caracteres en unidades con significado propio (componentes léxicos o “tokens” en ingles).

• Las palabras clave, identificadores, operadores, constantes numéricas, signos de puntuación como separadores de sentencias, llaves, paréntesis, etc. , son diversas clasificaciones de componentes léxicos.

• Análisis sintáctico: determina si la secuencia de componentes léxicos sigue la sintaxis del lenguaje y obtiene la estructura jerárquica del programa en forma de árbol, donde los nodos son las construcciones de alto nivel del lenguaje.

• Se determinan las relaciones estructurales entre los componentes léxicos, esto es semejante a realizar el análisis gramatical sobre una frase en lenguaje natural. La estructura sintáctica la definiremos mediante las gramáticas independientes del contexto.

Análisis semántico: realiza las comprobaciones necesarias sobre el árbol sintáctico para determinar el correcto significado del programa.

• Las tareas básicas a realizar son: La verificación e inferencia de tipos en asignaciones y expresiones, la declaración del tipo de variables y funciones antes de su uso, el correcto uso de operadores, el ámbito de las variables y la correcta llamada a funciones.

• Nos limitaremos al análisis semántico estático (en tiempo de compilación), donde es necesario hacer uso de la Tabla de símbolos, como estructura de datos para almacenar información sobre los identificadores que van surgiendo a lo largo del programa. El análisis semántico suele agregar atributos (como tipos de datos) a la estructura del árbol semántico.

• Generación y optimización de código intermedio: la optimización consiste en la calibración del árbol sintáctico donde ya no aparecen construcciones de alto nivel. Generando un código mejorado, ya no estructurado, más fácil de traducir directamente a código ensamblador o máquina, compuesto de un código de tres direcciones (cada instrucción tiene un operador, y la dirección de dos operandonos y un lugar donde guardar el resultado), también conocida como código intermedio.

• Generación de código objeto: toma como entrada la representación intermedia y genera el código objeto. La optimización depende de la máquina, es necesario conocer el conjunto de instrucciones, la representación de los datos (número de bytes), modos de direccionamiento, número y propósito de registros, jerarquía de memoria, encauzamientos, etc.

• Suelen implementarse a mano, y son complejos porque la generación de un buen código objeto requiere la consideración de muchos casos particulares.

• Tabla de Símbolos: es una estructura tipo diccionario con operaciones de inserción, borrado y búsqueda, que almacena información sobre los símbolos que van apareciendo a lo largo del programa como son: – los identificadores (variables y funciones) – Etiquetas – tipos definidos por el usuario (arreglos, registros, etc.)

  Además almacena el tipo de dato, método de paso de parámetros, tipo de retorno y de argumentos de una función, el ámbito de referencia de identificadores y la dirección de memoria. Interacciona tanto con el analizador léxico, sintáctico y semántico que introducen información conforme se procesa la entrada. La fase de generación de código y optimización también la usan.

• Gestor de errores: detecta e informa de errores que se produzcan durante la fase de análisis. Debe generar mensajes significativos y reanudar la traducción.

Encuentra errores: – En tiempo de compilación: errores léxicos (ortográficos), sintácticos (construcciones incorrectas) y semánticos (p.ej. errores de tipo) – En tiempo de ejecución: direccionamiento de vectores fuera de rango, divisiones por cero, etc. – De especificación/diseño: compilan correctamente pero no realizan lo que el programador desea.
 Se trataran sólo errores estáticos (en tiempo de compilación). Respecto a los errores en tiempo de ejecución, es necesario que el traductor genere código para la comprobación de errores específicos, su adecuado tratamiento y los mecanismos de tratamiento de excepciones para que el programa se continúe ejecutando.

La mayoría de los compiladores son dirigidos por la sintaxis, es decir, el proceso de traducción es dirigido por el analizador sintáctico. El análisis sintáctico genera la estructura del programa fuente a través de tokens. El análisis semántico proporciona el significado del programa basándose de la estructura del árbol de análisis sintáctico.

• Las fases de análisis léxico y análisis sintáctico se pueden automatizar de manera relativamente fácil, las verdaderas dificultades en la construcción de compiladores son el análisis semántico, la generación y la optimización de código.

 • El número de pasadas, es decir, el número de veces que hay que analizar el código fuente, está en función del grado de optimización. Típicamente se realiza una pasada para realizar el análisis léxico y sintáctico, otra pasada para el análisis semántico y optimización del lenguaje intermedio y una tercera pasada para generación de código y optimizaciones dependientes de la máquina. Estructuras de datos Empla.

Bibliografia:
Billhardt, H. (2015). Teoria de automatas y lenguajes formales .
Mata, S. G. (s.f.). Compiladores.
Serna,E.(s.f.).Fases de un compilador.Obtenido de: http://www.paginasprodigy.com/edserna/cursos/compilador/notas/Notas1.pdf

.


1.6.- Estructura de un traductor


Un traductor es un programa que tiene como entrada un texto escrito en un lenguaje (lenguaje fuente) y como salida produce un texto escrito en un lenguaje (lenguaje objeto) que preserva el significado de origen.

Ejemplos de traductores son los ensambladores y los compiladores.
En el proceso de traducción se identifican dos fases principales:
* Fase de análisis
* Fase de Síntesis


Ensambladores
El programa ensamblador es el programa que realiza la traducción de un programa escrito en ensamblador a lenguaje máquina.
Tipos de ensambladores:
*Ensambladores básicos.
*Ensambladores modulares, o macro ensambladores
*Ensambladores modulares 32-bits o de alto nivel


Compiladores
Un compilador es un programa informático que traduce un programa escrito en un lenguaje de programación a otro lenguaje de programación, es decir programa que permite traducir el código fuente de un programa en lenguaje de alto nivel, a otro lenguaje de nivel inferior (lenguaje máquina).



1.Ejemplos de traductores son los ensambladores y los compiladores.

 


2.En el proceso de traducción se identifican dos fases principales:

 




http://itpn.mx/recursosisc/6semestre/lenguajesyautomatas1/Unidad%20I.pdf

.

martes, 22 de enero de 2019

1.5.- Herramientas computacionales ligadas con lenguajes.

Editores de estructuras: “Un editor de estructuras toma como entrada una secuencia de órdenes para construir un programa fuente. El editor de estructuras no sólo realiza las funciones de creación y modificación de textos de un editor de textos ordinario, sino que también analiza el texto del programa, imponiendo al programa fuente una estructura jerárquica apropiada. De esa manera, el editor de estructuras puede realizar tareas adicionales útiles para la preparación de programas” Concepto encontrado en el libro de Compiladores de Addison Wesley, a mi punto de vista estos editores de estructura son los que se encarga de llevar el orden de las palabras, valla el acomodo y comprobar si la entrada está formada correctamente.

-GeneXus

Impresoras estéticas: “Una impresora estética analiza un programa y lo imprime de forma que la estructura del programa resulte claramente visible” Concepto encontrado en el libro de Compiladores de Addison Wesley.


-TotalSoft


Verificadores estáticos: Este verificador lee un programa, lo analiza e intenta descubrir errores potenciales sin correr el programa, algo muy parecido a la corrección de los editores de texto como Word. “Un verificador estático puede detectar si hay partes de un programa que nunca se podrán ejecutar o si cierta variable se usa antes de ser definida” nos dice Addison Wesley.


Intérpretes: “En lugar de producir un programa objeto como resultado de una traducción, un intérprete realiza las operaciones que implica el programa fuente. Muchas veces los interpretes se usan para ejecutar lenguajes de órdenes, pues cada operador que se ejecuta en un lenguaje de ordenes suele ser una invocación de una rutina compleja, como un editor o un compilador”.


-Test.f95


http://itpn.mx/recursosisc/6semestre/lenguajesyautomatas1/Unidad%20I.pdf

.

1.4.- Tipos de lenguajes.

Podemos encontrar varios tipos de lenguajes:


  • Lenguajes declarativos 
  • Lenguajes de alto nivel 
  • Lenguajes ensambladores
  • Lenguajes máquina 
Ø LENGUAJES DECLARATIVOS: Es fundamentalmente lenguajes de órdenes, dominados por Sentencias que expresan “lo que hay que hacer” en vez de “cómo hacerlo”.

Ø LENGUAJES DE ALTO NIVEL: Son los más utilizados como lenguajes de programación permiten que los algoritmos se expresen en un nivel y estilo de escritura fácilmente legible y comprensible por otros programadores.

Ø LENGUAJE ENSAMBLADOR: Es el programa en que se realiza la tracción de un programa escrito en un programa escrito en ensamblador y lo pasa a lenguaje máquina. Directa o no directa de la traducción en que las instrucciones no son más que instrucciones que ejecuta la computadora.

Ø LENGUAJE MAQUINA: Es como la maquina interpreta lo que nosotros queremos hacer es una lectura de 0 y 1 es decir binario.

Los lenguajes declarativos son los más parecidos al castellano o inglés en su potencia expresiva y funcionalidad y están en el nivel más alto respecto a los otros. Son fundamentalmente lenguajes de órdenes, dominados por sentencias que expresan “lo que hay que hacer” en vez de “cómo hacerlo”.

Los lenguajes de alto nivel son los más utilizados como lenguajes de programación Aunque no son fundamentalmente declarativos, estos lenguajes permiten que los algoritmos se expresen en un nivel y estilo de escritura fácilmente legible y comprensible por otros programadores. Además, los lenguajes de alto nivel suelen tener la característica de “transportabilidad”.


http://itpn.mx/recursosisc/6semestre/lenguajesyautomatas1/Unidad%20I.pdf

1.3.- Lenguajes.

En matemáticas, lógica, y las ciencias computacionales, un lenguaje formal es un conjunto de palabras (cadenas de caracteres) de longitud finita formadas a partir de un alfabeto (conjunto de caracteres) finito. Informalmente, el término lenguaje formal se utiliza en muchos contextos (en las ciencias, en el derecho, etc.) para referirse a un modo de expresión más cuidadoso y preciso que el habla cotidiana. Hasta los finales de la Década de 1990, el consensus general, era Que Un lenguaje formal, época en Cierto Modo La versión «Límite» of this USO los antes mencionado: un lenguaje de color canela formalizado Que Podia Ser USADO En Forma Escrita para describir Métodos computacionales. Sin embargo, hoy en día, el punto de vista de La naturaleza esencial de los lenguajes naturales (sin importar su grado de formalidad en el sentido informal antes de describirlo) Difiere de manera importante de la verdad de los verdaderos lenguajes formales, gana cada vez más adeptos.


EJEMPLO: Seria el inglés, donde la colección de las palabras correctas inglesas es un conjunto de cadenas del alfabeto que consta de todas las letras.

EJEMPLO: Es el lenguaje C, o cualquier otro lenguaje de programación, donde los programas correctos son un subconjunto de las posibles cadenas que pueden formarse a partir del alfabeto del lenguaje.


http://www.academia.edu/15275019/Lenguajes_y_Aut%C3%B3matas_1

1.2.- Cadenas.

Una cadena o palabra sobre un alfabeto Σ. admitimos la existencia de una única cadena que no tiene símbolos, la cual se denomina cadena vacía y se denota con λ. la cadena vacía desempeña, en la teoría de lenguajes formales, un papel similar al que desempeña el conjunto vacío Ø en la teoría de conjuntos.

Longitud de cadena.

La longitud de cadena es el numero de símbolos que contiene. La notación empleada es la que es la que se indica en el ejemplo:

Utilizamos las cadenas de los ejemplos:

I abcb I = 4,

I a + 2*b I = 5

I 000111 I = 6

I if a > b then a = b; I = 9


Concatenación de cadenas.

La concatenación de dos cadenas u y v, escrita uv, es "pegar" las dos cadenas para formar una nueva.

Ejemplo:

Sea u = ab

v = ca

w = bb. Entonces

uv = abca

uw = cabb

(uv) w = abcabb

u(vw) = abcabb



El resultado de la concatenación de u, v y w es independiente del orden en que las operaciones son ejecutadas. Matemáticamente esta propiedad es conocida como asociatividad.



Ø EJEMPLO: si ∑= {0,1}, entonces ∑1= {0,1}, ∑2= {00, 01, 10, 11}, ∑3= {000, 001, 010, 011, 100, 101, 110, 111}, etc.

Cadena Vacía.
La cadena vacía es aquella cadena que presenta cero apariciones de símbolos. Esta cadena, designada por £, es una cadena que puede construirse en cualquier alfabeto.

Ø EJEMPLO: observe que ∑0= {£}, independientemente de cuál sea el alfabeto ∑. Es decir, £ es la única cadena cuya longitud es 0.

http://www.academia.edu/15275019/Lenguajes_y_Aut%C3%B3matas_1