miércoles, 1 de junio de 2016

Unidad 05 Lenguajes Intermedios y Generación de Código



Para comenzar un lenguaje ensamblador se deben conocer conceptos básicos como los siguientes:

TASM
El Turbo Assembler (TASM), un paquete ensamblador principalmente destinado a la plataforma del IBM PC y sus compatibles. Fue la oferta de Borland en el mercado de herramientas de programación en lenguaje ensamblador para la familia de los microprocesadoresx86.
Turbo Assembler también se refiere a un ensamblador común, basado en el microprocesador 6502 para el Commodore 64, creado por la compañía alemana Omikron en 1985.

TLINK
El enlazador o linkador permite combinar varios módulos objeto, realizando las conexiones entre ellos y, finalmente, los convierte en módulo ejecutable de tipo EXE (empleando el ML de MASM 6.X se obtiene directamente el fichero EXE ya que invoca automáticamente al linkador). El linkador permite el uso de librerías de funciones y rutinas. TLINK, a diferencia de LINK, permite generar un fichero de tipo COM directamente de un OBJ si se indica el parámetro /t, lo que agiliza aún más el proceso. Puede obtenerse ayuda ejecutándolo sin parámetros. Los parámetros de TLINK son sensibles a mayúsculas y minúsculas, por lo que /T no es lo mismo que /t.

EDITOR DE TEXTO PARA EL CODIGO FUENTE
Un editor de texto es un programa que permite crear y modificar archivos digitales compuestos únicamente por texto sin formato, conocidos comúnmente como archivos de texto ó texto plano. Se utiliza para escribir el código fuente de los programas considerando que al guardarse no conserve la extencion txt, ya que debe cambiarse por la extensión asm. En el caso de Windows se usa el Block de Notas de Microsoft, en linus podemos usar gedit o nano.

CODIGOS DE EJEMPLO, COMPILADO Y LINKADO


Creamos el primer ejemplo llamado saludo.asm

Entramos al símbolo del sistema (MS-DOS) nos direccionamos en donde se encuentra nuestra carpeta
Una vez situados en la dirección correcta, nos dirigimos a compilar nuestro programa.
Para la compilación se debe ejecutar la siguiente instrucción:
tasm /zi saludo.asm

Una vez compilado nos aparecerá un reporte, el cual nos muestra si hay errores en nuestras líneas de código.


Con esto se ah realizado la compilación de nuestro programa y está listo para ser ligado. Para linkar el programa. Esto lo haremos con la siguiente instrucción.



El último paso es la ejecución del programa. Solo escribimos el nombre del programa, sin extensiones.





lunes, 30 de mayo de 2016

Unidad 04 Análisis Semántico


Análisis semántico
Se trata de determinar el tipo de los resultados
intermedios, comprobar que los argumentos
que tiene un operador pertenecen al conjunto
de los operadores posibles, y si son compatibles
entre sí, etc. En definitiva, comprobará que el
significado de lo que se va leyendo es válido.

Es una estructura jerárquica en la cual se registran las operaciones que implica u operan dentro del programa fuente.

En cada una de las ramas del
arbol semanticose registra el
valor o significado que este
debe tener, y el analisis semantico
se encarga de terminar cual de
los valores registrados en las
ramas es aplicable.

Un compilador necesita guardar y usar la información de los objetos que se va encontrando en el texto fuente, como variables,etiquetas,declaraciones de tipos, etc.
Esta información se almacena en una estructura de datos interna conocida como tabla de símbolos.


COMPROBACIONES SEMÁNTICAS TIPOS

Comprobaciones ESTÁTICAS.
Las comprobaciones sintácticas y semánticas.

Comprobaciones DINÁMICAS.
Realizadas en tiempo de ejecución.

De TIPO.
Verificación del tipo de los operando en las expresiones.

De FLUJO de CONTROL.
Verifica los puntos del programa de salida y entrada del control.

De UNICIDAD.
Verifica la presencia de símbolos de forma única.
(ejemplo: declarar un símbolo una sólo vez).

Relación de NOMBRES.
Un mismo nombre puede aparecer más de una vez.
GUÍA PRACTICA

Unidad 03: Análisis Sintáctico

¿QUÉ ES EL ANALIZADOR SINTÁCTICO?
Es la fase del analizador que se encarga de chequear el texto de entrada en base a una gramática dada. Y en caso de que el programa de entrada sea válido, suministra el árbol sintáctico que lo reconoce.
El análisis sintáctico es un análisis a nivel de sentencias, y es mucho más complejo que el análisis léxico. Su función es tomar el programa fuente en forma de tokens, que recibe del analizador léxico, y determinar la estructura de las sentencias del programa. Este proceso es similar a determinar la estructura de una frase en castellano, determinando quien es el sujeto, predicado, el verbo y los complementos. El análisis sintáctico agrupa a los tokens en clases sintácticas (denominadas no terminales en la definición de la gramática), tales como expresiones, procedimientos, etc.

EL ANALIZADOR SINTÁCTICO (ASN) comprueba que el orden en que el analizador léxico le va entregando los tokens es válido. Si esto es así significará que la sucesión de símbolos que representan dichos tokens puede ser generada por la gramática correspondiente al lenguaje del código fuente.
LAS PRINCIPALES FUNCIONES SON:
Identificar cada tipo de instrucción y sus componentes. 
– Completar la Tabla de Símbolo s. 
– Realizar comprobaciones estáticas: 
• Se realizan durante la compilación del programa. 
• Ejemplos: comp. de tipos, unicidad de etiquetas e identificadores, etc. 
– Realizar comprobaciones dinámicas: 
• Aquellas que el compilador incorpora al programa traducido. 
• Hacen referencia a aspectos que sólo pueden ser conocidos en tiempo de ejecución 
• Dependientes del estado de la máquina en la ejecución o del propio programa.
 – Validar las declaraciones de identificadores: en muchos lenguajes no se puede usar una variable si no ha sido declarada con anterioridad.

TIPOS DE ANÁLISIS SINTÁCTICOS
Desde el punto de vista de la teoría de Análisis Sintáctico, hay dos estrategias para construir el árbol sintáctico:

Análisis descendente: partimos de la raíz del árbol (donde estará situado el axioma o símbolo inicial de la gramática) y se van aplicando reglas por la izquierda de forma que se obtiene una derivación por la izquierda de la cadena de entrada. Para decidir qué regla  aplicar, se lee un token de la entrada. Recorriendo el árbol de análisis sintáctico resultante, en profundidad de izquierda a derecha, encontraremos en las hojas del árbol los tokens que nos devuelve el Analizador Léxico (A.L.) en ese mismo orden.

Análisis ascendente: partiendo de la cadena de entrada, se construye el árbol de análisis sintáctico empezando por las hojas (donde están los tokens) y se van creando nodos intermedios hasta llegar a la raíz (hasta el símbolo inicial), construyendo así el árbol de abajo a arriba. El recorrido del árbol se hará desde las hojas hasta la raíz. El orden en el que se van encontrando las producciones corresponde a la inversa de una derivación por la derecha.
Las dos estrategias recorren la cadena de entrada de izquierda a derecha una sola vez, y necesitan (para que el análisis sea eficiente) que la gramática no sea ambigua.
Para ello, el analizador sintáctico (A.S.) comprueba que el orden en que el analizador léxico le va entregando los tokens es válido. Si esto es así significará que la sucesión de símbolos que representan dichos tokens puede ser generada por la gramática correspondiente al lenguaje del código fuente.

MANEJO DE ERRORES SINTÁCTICOS
Si un compilador tuviera que procesar sólo programas correctos, su diseño e implantación se simplificarían mucho. Pero los programadores a menudo escriben programas incorrectos, y un buen compilador debería ayudar al programador a identificar y localizar errores. Es más, considerar desde el principio el manejo de errores puede simplificar la estructura de un compilador y mejorar su respuesta a los errores.

Los errores en la programación pueden ser de los siguientes tipos:
• Léxicos, producidos al escribir mal un identificador, una palabra clave o un operador.
• Sintácticos, por una expresión aritmética o paréntesis no equilibrados.
• Semánticos, como un operador aplicado a un operando incompatible.
• Lógicos, puede ser una llamada infinitamente recursiva.

GRAMÁTICAS DE ATRIBUTOS. Una gramática de atributos es una gramática libre de contexto cuyos símbolos pueden tener asociados atributos y las producciones pueden tener asociadas reglas de evaluación de los atributos. En la creación de compiladores se utilizan ecuaciones de atributos o reglas semánticas como método para expresar la relación entre el cálculo de los atributos y las reglas del lenguaje. Cada producción (regla sintáctica) tiene asociada una acción semántica que se aplica cuando se realiza una reducción en el análisis sintáctico ascendente.
Atributo: propiedad de una construcción de un lenguaje. Pueden variar mucho en cuanto a información que contienen o tiempo que tardan en determinarse durante la traducción/ejecución. Cada símbolo (terminal o no terminal) puede tener asociado un número finito de atributos. Ejemplos de atributos: 
– Tipo de una variable 
– Valor de una expresión 
– Ubicación en memoria de una variable 
–  Código objeto de un procedimiento 
– Número de dígitos significativos en un número


domingo, 29 de mayo de 2016

El ANALIZADOR LÉXICO

Un programa fuente es una serie de símbolos (letras, símbolos, caracteres especiales: +, *, !). Con estos símbolos se representan las construcciones del lenguaje tales como variables, etiquetas, palabras reservadas, constantes, etc. Es necesario que el compilador o traductor identifique los distintos significados de estas construcciones, que los creadores de lenguajes dan en la definición del lenguaje.

El programa fuente se trata inicialmente con el analizador léxico (en inglés scanner), con el propósito de agrupar el texto en grupos de caracteres con significado propio llamados tokens o componentes léxicos, tales como variables, identificadores, palabras reservadas y operadores. Por razones de eficiencia a cada token se le asocia un atributo (o más de uno) que se representa internamente por un código numérico o por un tipo enumerado.

CONCEPTOS ANALIZADOR LÉXICO

Token
Es el nombre que se le da a cada patrón definido, éste nombre debe usarse en todos los procesos del análisis en todos los lexemas encontrados.

Patrón
Es una representación lógica de una serie de agrupaciones de caracteres con características comunes.

Lexema
Es cada una de las combinaciones de caracteres que encajan en la definición de un patrón o token. Ej. Variable1, x, a, edad, y2, etc.

Atributo
Características propias de cada token, por tanto se les denomina atributos del token.

Gramática
Se define como un ente formal para especificar de una manera finita el conjunto de cadenas de símbolos que constituyen un lenguaje.

Alfabeto
Conjunto finito de símbolos no vacío que conforman una gramática, se representan por Σ (sigma).

Símbolo
Entidad abstracta que no se va a definir pues se deja como axioma. Normalmente son letras de alfabetos, números o caracteres especiales como +, -, *, /, etc. No necesariamente serán uno solo, ya que un símbolo puede ser una combinación como palabras reservadas de un lenguaje de programación then, end, beging, else, while, etc.

Expresión Regular
Representan patrones de cadenas de caracteres. Se conocen más como metalenguajes que sirven para describir los lenguajes regulares.

Diagrama de Transición
Es el conjunto de secuencias de entrada que representan gráficamente los símbolos validos por la gramática, es una representación de los universales autómatas que aparecen en la matemática y otras ciencias.

Tabla de Transiciones
Es la manera más cercana de representar los autómatas, consta de filas que representan los estados y las columnas que representan los símbolos de entrada. Adicionalmente se agregan dos columnas para representar los tokens y para indicar retrocesos.

Cadena
Se define como una secuencia de símbolos de un lenguaje determinado. Por ejemplo 0001, abcd, a+4*b, 11000, etc. Una cadena siempre tiene una longitud que esta denotada por la cantidad de símbolos independientes que la conforman.
|abcde| →5
|000111| →6
Cuando la cadena es vacía se representa como |λ|→0.

Lenguaje
Un lenguaje es un conjunto de palabras que se puede representar con un determinado alfabeto.

Autómata
Es una construcción lógica que recibe como entrada una cadena de símbolos y produce una salida indicando si la salida es una cadena que pertenece a un determinado lenguaje.
Tabla de Símbolos

DEFINICIÓN DE TABLA DE SÍMBOLOS

Una tabla de símbolos es una estructura de datos usada en el proceso de traducción
de un lenguaje de programación (por un compilador o un intérprete), dónde cada
símbolo en el código fuente de un programa está asociado con información tal como
la ubicación, el tipo de datos y el ámbito de cada variable, constante o
procedimiento. Esta estructura de datos contiene una entrada o registro para cada

identificador. Cada registro incluye los campos para los atributos del identificador.

ESTRUCTURA
  • LEXEMA: distintas políticas de almacenamiento.
  • ATRIBUTOS: cuanta información contiene dicho campo depende del objeto que denota el lexema.
FUNCIONAMIENTO
Conforme van apareciendo nuevas declaraciones de identificadores, el analizador
léxico, o el analizador sintáctico según la estrategia que sigamos, insertará nuevas
entradas en la tabla de símbolos, evitando siempre la existencia de entradas
repetidas. El analizador semántico efectúa las comprobaciones sensibles al contexto
gracias a la tabla de símbolos, y el generador de código intermedio usa las
direcciones de memoria asociadas a cada identificador en la tabla de símbolos, al
igual que el generador de código.

Unidad 02: Análisis Léxico


Clasificación de los Lenguajes de Programación

Los lenguajes de programación según su grado de independencia de la máquina:

a) Lenguaje máquina (representación binaria o hexadecimal.).
b) Lenguaje ensamblador o de bajo nivel (versión simbólica de un lenguaje máquina).
c) Lenguaje de medio nivel (lenguaje C).
d) Lenguaje de alto nivel (FORTRAN, COBOL, Pascal).

Lenguaje de máquina.
El lenguaje de máquina de una computadora consta de cadenas de números binarios (ceros y unos) y es el único que "entienden" directamente los procesadores.

Lenguaje ensamblador.
La comunicación en lenguaje de máquina es particular de cada procesador que se usa, y programar en este lenguaje es muy difícil y tedioso, por lo que se empezó a buscar mejores medios de comunicación con ésta.

Lenguajes de alto nivel.
Los primeros programas ensambladores producían sólo una instrucción en lenguaje de máquina por cada instrucción del programa fuente.

Los lenguajes de programación según su forma de procesar el código fuente

FASES DE LOS COMPILADORES

  •  Traductores (translators).
  •  Compiladores (compilers).
  •  Ensambladores (assemblers).
  •  Interpretes (interpreters).
  • Editores (editors).