Índice
Introducción ................................................................................................................................. 1 1.1 Alfabeto ............................................................................................................................. 2 1.2 Cadenas ............................................................................................................................. 3 1.3 Lenguajes ........................................................................................................................... 4 1.4 Tipos de lenguajes ............................................................................................................. 4 1.5 Herramientas computacionales ligadas con lenguajes ..................................................... 8 1.6 Estructura de un traductor ................................................................................................ 9 1.7 Fases de un compilador ..................................................................................................... 10 Conclusión .................................................................................................................................... 13 Referencias bibliográficas ............................................................................................................ 14
Introducción En este trabajo de investigación se darán a conocer los conceptos básicos de lenguajes y autómatas. Así como también se hablará de la relevancia de conocer cada uno de ellos y la función de gran importancia que desempeñan en la comunicación hombre-máquina. La teoría de los lenguajes formales estudia unas entidades matemáticas abstractas denominadas lenguajes que en ningún momento debemos confundir o equiparar con las lenguas naturales. Sin embargo, como veremos, los lenguajes formales pueden, en determinadas circunstancias, servirnos como modelos abstractos de determinadas propiedades de las lenguas naturales, de ahí la importancia de conocer los fundamentos de la teoría. Un lenguaje formal (en adelante, simplemente «lenguaje») es un conjunto, finito o infinito, de cadenas definidas sobre un alfabeto finito.
1
1.1 Alfabeto Un Alfabeto es un conjunto finito no vacío de símbolos. Así, el alfabeto del idioma español: E = {a, b, c, . . . , z}, es sólo uno de tantos alfabetos posibles. En general se utiliza la notación
para representar un alfabeto. Con los símbolos de un alfabeto es
posible formar secuencias o cadenas de caracteres. Las cadenas de caracteres son llamadas también palabras. Un caso particular de cadena es la palabra vacía, ε, la cual no tiene ninguna letra.
La longitud de una palabra es la cantidad de letras que contiene, contando las repeticiones. Se denota por |w| para una palabra w. Por ejemplo la palabra “perro” su longitud es 5. Cuando escribimos varias palabras o caracteres uno a continuación de otro, se supone que forman una sola palabra (se concatenan). La notación usada para denotar la concatenac ión de dos cadenas α y β es αβ. La concatenación de palabras es asociativa esto es, (xy)z = x(yz), pero no conmutativa en el caso general. La longitud de una concatenación cumple la propiedad: |uv| = |u| + |v|. Una palabra v es subcadena de otra w cuando existen cadenas x, y - posiblemente vacías tales que xvy = w. El conjunto de todas las palabras que se pueden formar con un alfabeto Σ es denotado convencionalmente por Σ ∗.
Por ejemplo, si Σ = {a, b} Σ∗ = {ε, a, aa, aaa, aaaa, . . . , b, bb, . . . , ab, aba, abb, . . .} El conjunto Σ ∗ es infinito, pero numerable.
2
1.2 Cadena Una cadena o palabra es una serie arbitrariamente larga de símbolos unidos por concatenación que representamos disponiendo los diferentes símbolos que la componen en el orden deseado; por ejemplo: aaabbbccc, es una cadena. Como la definición de cadena es recursiva, podemos referirnos, si es necesario, a una cadena completa o a una subcadena que forme parte de una cadena mayor con las letras finales del alfabeto u, v, w, x, y y z. Por tanto, aaaw o, simplemente, w también son cadenas. Denotamos la cadena vacía con el símbolo ε.
Cadena vacía
La cadena vacía es el elemento de identidad de la operación de concatenación, d e tal modo que ε ⊕ aaabbb = aaabbb. La operación de concatenación de cadenas no es conmutativa (pero sí
asociativa); por tanto aaabbb ⊕ ab 6= ab ⊕ aaabbb. La cadena vacía es aquella cadena que presenta cero apariciones de símbolos. E sta cadena, designada por ε, es una cadena que puede construirse en cualquier alfabeto.
Longitud de una cadena
Suele ser útil clasificar las cadenas por su longitud, es decir, el número de posiciones ocupadas por símbolos dentro de la cadena. Por ejemplo, 01101 tiene una longitud de 5. Es habitual decir que la longitud de una cadena es igual al “número de símbolos” que contiene; esta proposición está aceptada coloquialmente, sin embargo, no es estrictamente correcta. Así, en la cadena 01101 sólo hay dos símbolos, 0 y 1, aunque tiene cinco posiciones para los mismos y su longitus es igual a 5. Sin embargo, generalmente podremos utilizar la expresión “número de símbolos” cuando realmente a
lo que se está haciendo referencia es al “número de posiciones”. La notación estándar para indicar la longitud de una cadena w es |w|. Por ejemplo, |011| = 3 y |ε | = 0.
3
Concatenación de cadenas
Sean x e y dos cadenas. Entonces, xy denota la concatenación de x e y, es decir, la cadena formada por una copia de x seguida de una copia de y. Dicho de manera más precisa, si x es la cadena compuesta por i símbolos x = a1a2 · · ·ai e y es la cadena compuesta por j símbolos y = b1b2 · · ·bj, entonces xy es la cadena de longitud i+ j: xy = a1a2 · · ·aib1b2 · · ·bj.
1.3 Lenguajes Un conjunto de cadenas, todas ellas seleccionadas de un Σ ∗, donde Σ es un determinado alfabeto se
denomina lenguaje. Si Σ es un alfabeto y L ⊆Σ∗, entonces L es un lenguaje de Σ. Observe que un lenguaje de Σ no necesita incluir cadenas con todos los símbolos de Σ, ya que una vez que hemos establecido que L es un lenguaje de Σ, también sabemos que es un lenguaje de cualquier alfabeto que sea un superconjunto de Σ. La elección del término “lenguaje” puede parecer extraña. S in embargo, los lenguajes habituales
pueden interpretarse como conjuntos de cadenas. Un ejemplo sería el inglés, donde la colección de las palabras correctas inglesas es un conjunto de cadenas del alf abeto que consta de todas las letras. Otro 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. Este alfabeto es un subconjunto de los caracteres ASCII. El alfabeto en concreto puede diferir ligeramente entre diferentes lenguajes de programación, aunque generalmente incluye las letras mayúsculas y minúsculas, los dígitos, los caracteres de puntuación y los símbolos matemáticos. Sin embargo, existen también otros muchos lenguajes que veremos a lo largo del estudio de los autómatas.
1.4 Tipos de lenguajes Se crearon los lenguajes de bajo, medio y alto nivel, los cuales permitían al usuario escribir instrucciones utilizando palabras claves o reservados. Y la diferencia entre ellos tanto del alto y el bajo nivel es que el lenguaje se puede utilizar en una determinado computadora para el caso de bajo nivel y la otra es capaz de ejecutarse en cualquier computadora para el caso de alto nivel.
4
Lenguaje máquina
Fue el primer lenguaje utilizado en la programación para las primeras computadoras, pero dejó de utilizarse por su dificultad y complicación, siendo sustituido por otros lenguajes más fáciles de aprender y utilizar, y que además reducen la posibilidad de cometer errores. La
información
que
hace
que
el
hardware de la computadora realice una determinada instrucción,
actividad por
de
llama
consiguiente
una
instrucción es un conjunto de unos y ceros, las instrucciones así formadas equivalen a acciones elementales de la máquina, por lo que al conjunto de dichas
instrucciones
interpretadas
que
directamente
son por
la
máquina se denomina lenguaje máquina. El lenguaje máquina es el único lenguaje que puede ejecutar una computadora, es específico en cada arquitectura, es un código que es interpretado directamente por el microprocesador, está compuesto por un conjunto de instrucciones ejecutadas en secuencia que representan acciones que la máquina podrá tomar. El lenguaje máquina es el único que entiende directamente la computadora, utiliza el alfabeto binario que consta de los dos únicos símbolos 0 y 1, denominados bits; físicamente, se materializan con tensiones comprendidas entre 0 y 4.0 voltios y entre 4 y 5 voltios, respectivamente. Para representar datos que contengan una información se utilizan una serie de unos y ceros cuyo conjunto indica dicha información.
5
Lenguaje de bajo nivel
Los lenguajes de bajo nivel son más fáciles de utilizar que los lenguajes máquina, pero, al igual que ellos, dependen de la máquina en particular. El lenguaje de bajo nivel por excelencia
es
el
ensamblador.
Las
instrucciones en lenguaje ensamblador son instrucciones
conocidas
como
nemotécnicos. Por ejemplo, nemotécnicos típicos de operaciones aritméticas son: en inglés, ADD, SUB, DIV, etc.; en español, SUM,RES,DIV,etc. Un programa escrito en lenguaje ensamblador no puede ser ejecutado directamente por la computadora en esto se diferencia esencialmente del lenguaje máquina, sino que requiere una fase de traducción al lenguaje máquina. El programa original escrito en lenguaje ensamblador se denomina programa fuente y el programa traducido en lenguaje máquina se conoce como programa objeto, ya directamente entendible por la computadora. El traductor de programas fuente a objeto es un programa llamado ensamblador, existente en casi todos los computadores.
Lenguaje de mediano nivel
Lenguaje de medio nivel es un lenguaje de programación informática como el lenguaje C, que se encuentran entre los lenguajes de alto nivel y los lenguajes de bajo nivel. Suelen ser clasificados muchas veces de alto nivel, pero permiten ciertos manejos de bajo nivel. Son precisos para ciertas aplicaciones como la creación de sistemas operativos, ya que permiten un manejo abstracto (independiente de la máquina, a diferencia del ensamblador), pero sin perder mucho del poder y eficiencia que tienen los lenguajes de bajo nivel.
6
Una característica distintiva, por ejemplo, que convierte a C en un lenguaje de medio nivel y al Pascal en un lenguaje de alto nivel es que en el primero es posible manejar las letras como si fueran números (en Pascal no), y por el contrario en Pascal es posible concatenar las cadenas de caracteres con el operador suma y copiarlas con la asignación (en C es el usuario el responsable de llamar a las funciones correspondientes). Una de las características más peculiares del lenguaje de programación C; es el uso de “apuntadores”, los cuales son
muy útiles en la implementación de algoritmos como Listas ligadas,
Tablas
Hash
y
algoritmos
de
búsqueda
y
ordenamiento que para otros lenguajes de programación (como Java por ejemplo) les suele ser un poco más complicado implementar.
Lenguaje de alto nivel
El lenguaje de alto nivel (high-level language) es aquel que se aproxima más al lenguaje natural humano que al lenguaje binario de las computadoras, el que se conoce como lenguaje de bajo nivel. Su función principal radica en que a partir de su desarrollo, existe la posibilidad de que se pueda utilizar el mismo programa en distintas máquinas, es decir que es independiente de un hardware determinado. La única condición es que la PC tenga un programa conocido como traductor o compilador, que lo traduce al lenguaje específico de cada máquina. Y además, al utilizar palabras del lenguaje humano (por lo general el inglés) es más práctico y fácil de manipular para el programador de manera que no corre tantos riesgos de equivocarse como si es más factible de caer en el error con el binario. De esta manera, el programador puede concentrarse más en el programa en sí que en el lenguaje y, por otra parte, se reducen los tiempos de creación del programa, incluso en caso de que tenga que hacer modificaciones, son mucho más fáciles de hacer. Un punto en contra que tiene este tipo de lenguaje de tercera generación es que en la actualidad existe gran diversidad de ellos (PASCAL, BASIC, FORTRAN, C++, COBOL, ALGOL, entre muchos otros).
7
1.5 Herramientas computadoras ligadas con lenguajes. 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. Compilador.
El compilador es un programa informático que traduce un programa escrito en lenguaje de programación y lo pasa a lenguaje de programación, podemos decir que este programa nos permite traducir un código fuente de un programa en lenguaje de nivel alto, y lo pasmos a otro nivel inferior (lenguaje maquina).
Ensambladores.
El ensamblador es el programa en que se realiza la tracción de un programa escrito en ensamblador y lo pasa a lenguaje máquina. Directa o no directa la traducción en que las instrucciones no son más que instrucciones que ejecuta la computadora. Interpretes.
Los intérpretes son los que realizan normalmente dos operaciones:
Traducen el código fuente a un formato interno. Ejecuta o interpretan el programa traducido al formato interno.
Donde la primera pertenece al interprete el cual llama a veces al compilador, así se genera el código interno, pero no es el lenguaje de máquina, ni lenguaje de símbolos, ni mucho menos un lenguaje de nivel alto.
8
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
9
1.7 Fases de un compilador Un compilador es un programa que traduce un programa escrito en lenguaje fuente y produce otro equivalente escrito en un lenguaje objetivo. Estructura general de un compilador
Lenguaje fuente
Lenguaje de alto nivel. Por ejemplo: C, Pascal, C++.
Lenguaje especializado para alguna disciplina específica dentro de las Ciencias de la Computación.
Salida
Código de Máquina. Escrito en las instrucciones de máquina de la computadora en la que se ejecutará.
Código Binario. Deberá ser vinculado con las librerías correspondientes para obtener el código ejecutable.
Código Assembler. Deberá ser ensamblado y vinculado.
Otro lenguaje de alto nivel.
10
Fases de un compilador
Análisis 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 inglés). 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.
11
Análisis sintáctico: determina si la secuencia de componentes léxicos sigue la sintaxis del l enguaje 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 realiz ar 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. 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 operándoos 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.). 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.
12
Conclusión Es muy importante conocer los conceptos básicos sobre lenguajes y autómatas. Además de explicar detalladamente los tipos de lenguajes y mencionar algunos ejemplos para que pudiera comprenderse mucho mejor cada uno. También se aclararon algunos puntos importantes sobre las herramientas computacionales que intervienen en la comunicación hombre-máquina, como lo son; compilador, intérprete, traductor y ensamblador. Pudimos comprender la estructura de un traductor así como también, las fases de un compilador y las funciones que desarrollan durante la transmisión de mensajes entre la máquina y el hombre.
13
Referencias bibliográficas
Hopcroft John E., Introducción a la Teoría de Autómatas, Lenguajes y Computación, 2da ed, Ed. Addison Wesley, 2004. Balari, S. (2014). Cap. 1: Nociones básicas. En Teoría de lenguajes formales (pp.9-13). Barcelona, España: Centro de Lingüística Teórica. Villalta, P. (2012). Introducción a Compiladores e Intérpretes. 2016, de Blogspot Sitio web: http://compiladores-interpretes.blogspot.mx/2012/01/introduccion-compiladores-einterpretes.html José, A. (diciembre 17, 2013). Lenguaje Compilado e interpretado. 2016, de Ciencia&Educación Sitio web: http://cienciaeducacion502.blogspot.mx/2013/12/lenguaje-compilado-e-interpretado.html
14