Vous êtes sur la page 1sur 10

Teoría de Lenguajes UNASAM

I. CLASE N°01
1.1. DEFINICION
Es una rama de la informática que se encarga del diseño, implementación, análisis,
caracterización y clasificación de lenguajes de programación y sus características. Es un
campo multi-disciplinar, dependiendo tanto de (y en algunos casos afectando) a las
matemáticas, ingeniería del software, lingüística, e incluso ciencias cognitivas. Es una rama
bien reconocida de la informática, y un área activa de investigación, con resultados publicados
en un gran número de revistas dedicadas a la PLT, así como en general en publicaciones de
informática e ingeniería.

Estudia entidades matemáticas abstractas denominadas lenguajes que en ningún momento


debemos confundir o equiparar con las lenguas naturales. Sin embargo, en determinadas
circunstancias sirven como modelos abstractos de determinadas propiedades de las lenguas
naturales, de ahí la importancia de conocer los fundamentos de la teoría.

Uno de sus objetivos es presentar las nociones de lenguaje formal y de sintaxis y semántica de
lenguajes, imprescindibles para la construcción de compiladores.

Su símbolo aunque no oficial es la letra griega lambda λ en minúsculas. Este uso deriva del
cálculo lambda, un modelo computacional ampliamente usado por investigadores de lenguajes
de programación. Muchos textos y artículos sobre programación y lenguajes de programación
utilizan lambda de una u otra manera.

1.2. HISTORIA DE LA TEORÍA DE LENGUAJES


La historia de la teoría de lenguajes de programación precede incluso al desarrollo de los
propios lenguajes de programación, entre los eventos históricos que de esta disciplina podemos
mencionar los siguientes:
- En 1930 se desarrolló el cálculo lambda, por Alonzo Church, Max HL. Solis Villareal y
Stephen Cole Kleene, es considerado como uno de los primeros lenguajes de programación
del mundo, incluso pese a que tenía intención de modelar la computación más que ser un
medio para que los programadores describan algoritmos de un sistema informático. Muchos
lenguajes de programación funcional se han caracterizado por proveer una "fina apariencia" al
cálculo lambda, y muchos se describen en sus términos.

Ing. Miguel Angel Silva Zapata Ingeniería de Sistemas e Informática


Teoría de Lenguajes UNASAM

- El primer lenguaje de programación (como tal) fue Plankalkül, diseñado por Konrad Zuse en
los años 40, pero fue conocido públicamente en 1972 (y no implementado hasta 2000, cinco
años después de la muerte de Zuse).
- En la década de 1950, Noam Chomsky desarrolló la Jerarquía de Chomsky en el campo de la
lingüística; un descubrimiento que impactó directamente a la teoría de lenguajes de
programación y otras ramas de la informática.
- El primer lenguaje de programación ampliamente conocido y exitoso fue Fortran,
desarrollado entre 1954 y 1957 por un equipo de investigadores en IBM liderados por John
Backus. El éxito de FORTRAN condujo a la creación de un comité de científicos para
desarrollar un lenguaje de programación "universal"; el resultado de su esfuerzo fue ALGOL
58. Por otro lado, John McCarthy del MIT desarrolló el lenguaje de programación Lisp
(basado en el cálculo Lambda), el primer lenguaje con orígenes académicos en conseguir el
éxito. Con el triunfo de estos esfuerzos iníciales, los lenguajes de programación se
convirtieron en un tema candente en la investigación en la década de 1960 y en adelante.
- En la década de 1960, el lenguaje Simula fue desarrollado por Ole-Johan Dahl y Kristen
Nygaard; muchos consideran que es el primero lenguaje orientado a objetos; Simula
también introdujo el concepto de corrutinas.
o Corrutina.- Método que tienen la capacidad de pausarse y reiniciarse exactamente
donde se quedó en el frame anterior. Para entenderlo mejor, consideremos el siguiente
ejemplo:

Similar a un hilo, es una ejecución con su propia pila, variables locales y puntero de
instrucción, pero comparte variables globales y todo lo demás con otras corrutinas.
- En la década de los 70 :
 Un pequeño equipo de científico en Xerox PARC encabezado por Alan Kay elaboran
Smalltalk, un lenguaje orientado a objetos muy conocido por su novedoso (hasta ese
momento desconocido) entorno de desarrollo.
 Sussman y Steele desarrollan el lenguaje de programación Scheme, un dialecto de Lisp
que incorpora Ámbitos léxicos, un espacio de nombres unificado.

Ing. Miguel Angel Silva Zapata Ingeniería de Sistemas e Informática


Teoría de Lenguajes UNASAM

 Backus, en la conferencia del Premio Turing de 1977, asedió el estado actual de los
lenguajes industriales y propuso una nueva clase de lenguajes de programación ahora
conocidos como lenguajes de programación funcional.
 La aparición del process calculi, como el cálculo de sistemas comunicantes de Robín
Milner, y el modelo de Comunicación secuencial de procesos de C. A. R. Hoare.
 La aplicación de la teoría de tipos como una disciplina a los lenguajes de programación,
liderada por Milner; esta aplicación ha conducido a un tremendo avance en la teoría de
tipos en cuestión de años.
- Posteriormente en la década de los 90, Philip Wadler introdujo el uso de Monads (una
estructura que representa cálculos definidos como una secuencia de pasos) para estructurar
programas en lenguajes de programación funcional.
1.3. SUB DISCIPLINAS DE LA TEORÍA DE LENGUAJES.
Existen varios campos de estudio que o bien caen dentro de la teoría de lenguajes de
programación o bien tienen una profunda influencia en ella. Entre estos tenemos:
1.3.1. La Teoría de los compiladores.-
Es la base formal sobre la escritura de compiladores (o más generalmente traductores);
programas que traducen un programa escrito en un lenguaje a otra forma. Las acciones de un
compilador se dividen tradicionalmente en análisis sintáctico (escanear y parsear), análisis
semántico (determinando que es lo que debería de hacer un programa), optimización
(mejorando el rendimiento indicado por cierta medida, típicamente la velocidad de
ejecución) y generación de código (generando la salida de un programa equivalente en el
lenguaje deseado; a menudo el set de instrucciones de una CPU).
Es un mundo apasionante dentro de la teoría de la informática, desarrollar un compilador
medianamente potente es una tarea dura y costosa, tanto en tiempo como en recursos, pero
gratificante al ampliar campos básicos de la informática como son la teoría de autómatas, de
lenguajes, estructura y arquitectura de computadoras, lenguajes de programación y algunos
otros más.
1.3.2. La Teoría de tipos
Es el estudio de sistemas de tipos, que son "métodos sintácticos tratables para proveer la
ausencia de ciertos comportamientos de programa mediante la clasificación de frases según
los tipos de valores que computan." (Types and Programming Languages, MIT Press, 2002).
Muchos lenguajes de programación se distinguen por las características de sus sistemas de
tipos. Puede referirse al diseño, análisis y estudio de los sistemas de tipos, aunque algunos

Ing. Miguel Angel Silva Zapata Ingeniería de Sistemas e Informática


Teoría de Lenguajes UNASAM

científicos de la computación limitan el significado del término al estudio de formalismos


abstractos como el cálculo lambda tipado.
En la teoría de lenguajes de programación, una rama de las ciencias de la computación, la
teoría de tipos puede referirse al diseño, análisis y estudio de los sistemas de tipos, aunque
algunos teóricos de la computación limitan el significado del término al estudio de
formalismos abstractos como el cálculo lambda tipado.
Es una familia de formalismos ideados para servir de fundamento a la Matemática que ha
demostrado tener aplicaciones muy significativas en Ciencia de la Computación. Entre ellas
se cuentan: los sistemas de tipos de los lenguajes de programación, las lógicas de
programación --especialmente las relativas a lenguajes funcionales-- y los modelos o
estructuras de sistemas lógicos. Asimismo, asociados a estos formalismos se desarrollan e
investigan asistentes de desarrollo o demostración implementados en máquina que permiten
su utilización práctica. Este curso aspira a desarrollar teoría y práctica de las teorías de tipos,
estudiando su formulación, principales propiedades matemáticas, herramientas relacionadas
y aplicaciones.
Bertrand Russell inventó la primera teoría de tipos en respuesta a su descubrimiento donde
la versión de Gottlob Frege de la teoría de conjuntos nativa es afectada por la paradoja de
Russell. Este tipo de la teoría de tipos aparece primariamente en el Principia Mathematica de
Whitehead y Russell. Esta teoría evita la paradoja de Russell creando una jerarquía de tipos,
luego asignando cada entidad matemática a un tipo. Objetos de un tipo dado son creados
exclusivamente por objetos de un tipo anterior (aquellos más abajo en la jerarquía), por lo
tanto evitando ciclos.
1.3.3. La Semántica formal.-
Es la especificación formal del comportamiento de programas de ordenador y lenguajes de
programación.
Es el estudio de las interpretaciones de los lenguajes formales. Los lenguajes formales
pueden definirse sin necesidad de dar ningún significado a sus expresiones. Una
interpretación de un lenguaje formal es básicamente una asignación de significados a sus
símbolos, y de condiciones de verdad a sus fórmulas bien formadas. Un objetivo importante
de la construcción de una semántica formal para un lenguaje formal es la caracterización de
la relación de consecuencia lógica en términos semánticos, y la demostración de meta
teoremas a partir de esa caracterización.
1.3.4. La Transformación de programas.- Es el proceso de transformar un programa de una
forma (lenguaje) a otra forma; el análisis de programas es problema general de examinar

Ing. Miguel Angel Silva Zapata Ingeniería de Sistemas e Informática


Teoría de Lenguajes UNASAM

un programa mediante la determinación de sus características clave (como la ausencia de


clases de errores de programa). Un componente importante para implementar estas
técnicas viene dada por la información "flujo de datos" que puede obtenerse por técnicas
de análisis estático. Las técnicas de plegado-desplegado ("folding-unfolding") son las
mejor estudiadas en el contexto de la transformación de programas.
Estas técnicas fueron formuladas originalmente en el caso de programas funcionales por Burtall y
Darlington y posteriormente introducidas en la programación lógica por Komorowski.
Posteriormente, se han realizado numerosos esfuerzos para la construcción de sistemas automáticos
basados en esta metodología, que ha sido también adaptada a los sistemas de deducción parcial que
producen, a partir de un programa y una entrada incompleta (un objetivo G parcialmente
instanciado), un programa residual más eficiente que es equivalente al original respecto a G y
cualquiera de sus instancias.
1.3.5. Sistemas en tiempo de ejecución.- Se refiere al desarrollo de entornos runtime para
lenguajes de programación y sus componentes, incluyendo máquinas virtuales,
recolección de basura, e interfaces para funciones externas. Es un software que provee
servicios para un programa en ejecución pero no es considerado en sí mismo como parte
del sistema operativo. Está diseñado para apoyar la ejecución de los programas de
ordenador escrito en algún lenguaje de programación . El tiempo de ejecución del sistema
contiene las implementaciones de bajo nivel comandos básicos y puede también aplicar a
nivel de comandos de alto y puede apoyar la comprobación de tipos , depuración , e
incluso la generación de código y optimización. Algunos de los servicios del sistema en
tiempo de ejecución son accesibles para el programador a través de una interfaz de
programación de aplicaciones , pero otros servicios (tales como la programación de tareas
y gestión de los recursos ) pueden ser inaccesibles.
Alivia los programadores de la carga de la escritura de código para tareas mundanas como el dibujo
de texto en la pantalla o hacer una conexión a Internet; También proporciona una capa de
abstracción que oculta la complejidad o las variaciones en los servicios que ofrece el sistema
operativo. En el límite, el sistema en tiempo de ejecución puede ser un código de máquina-P o
máquina virtual , que se esconde incluso el procesador de sistema de instrucción . Este es el enfoque
adoptado por muchos lenguajes interpretados como AWK , y algunos lenguajes como Java que
están destinados a ser compilado en algunos pseudo-independiente de la máquina ( código de bytes
). Este sistema simplifica enormemente la tarea de implementación del lenguaje y su adaptación a
diferentes máquinas, y permite el lenguaje sofisticadas características tales como la reflexión .
World Wide Web También permite que el mismo programa a ser ejecutado en cualquier máquina

Ing. Miguel Angel Silva Zapata Ingeniería de Sistemas e Informática


Teoría de Lenguajes UNASAM

sin tener que recompilar, una característica que se ha vuelto muy importante, ya que la difusión de
la World Wide Web .

1.3.6. Análisis comparativo de lenguajes de programación.- Busca clasificar los lenguajes


de programación en diferentes tipos basados en sus características; amplias categorías de
diferentes lenguajes de programación se conocen frecuentemente como paradigmas de
computación.
1.3.7. La Meta programación.- Es la generación de programas de mayor orden, que cuando
se ejecutan, producen programas (posiblemente en un lenguaje diferente, o en un
subconjunto del lenguaje original) como resultado. Se puede definir cómo: “programar un
programa que genere o modifique otros programas o a si mismos” el ejemplo más común
de la meta programación es un compilador que te permite convertir un programa escrito
en un lenguaje de alto nivel en uno con lenguaje de bajo nivel, lenguaje máquina o
ensamblador. Pero la meta programación tiene otras aplicaciones más potentes, aunque
algunos creen que sólo es útil para los programadores flojos que no quieren escribir
programas, es cierto te puede ahorrar mucho tiempo, un ejemplo sencillo de meta
programación es:
#!/bin/bash
# metaprogram
echo '#!/bin/bash' >program
for ((I=1; I<=992; I++)); do
echo "echo $I" >>program
done
chmod +x program
Este script genera un nuevo programa que imprime por pantalla los números 1 a 992. Esto es sólo una
muestra de cómo usar código para escribir más código, no la forma más eficiente de imprimir una
lista de números. En cualquier caso, un buen programador puede escribir y ejecutar este
metaprogama en apenas un par de minutos, y habrá generado exactamente 1000 líneas de código en
esa cantidad de tiempo.
1.3.8. Lenguajes dedicados.- Son lenguajes construidos para resolver problemas en un
dominio de problemas en particular de manera eficiente.
Que son los Símbolos
Es la representación perceptible de una idea, con rasgos asociados por una convención socialmente
aceptada. Es un signo sin semejanza ni contigüidad, que solamente posee un vínculo convencional

Ing. Miguel Angel Silva Zapata Ingeniería de Sistemas e Informática


Teoría de Lenguajes UNASAM

entre su significante y su denotado, además de una clase intencional para su designado. Los
símbolos son pictografías con significado propio. Muchos grupos tienen símbolos que los
representan; existen símbolos referentes a diversas asociaciones culturales: artísticas, religiosas,
políticas, comerciales, deportivas, etc.
Es una entidad abstracta, que no se va a definir. Normalmente los símbolos son letras (a,b,c,…z),
dígitos (0,1,2…9) y otros caracteres (+,*,/,-,?...).
Un símbolo también puede estar formado por varias letras o caracteres, como las palabras reservadas
de un lenguaje de programación son símbolos de dicho lenguaje. Ejemplo: a,b,c,#,+,-,*, then,
begin, end, else,
EVOLUCIÓN DE LOS SÍMBOLOS
En las muchas etapas que componen la evolución, en la forma de comunicación humana, del desarrollo
del lenguaje hablado a la escritura, los signos visuales representan la transición de la perspectiva
visual, a través de las figuras y los pictogramas, a las señales abstractas. Sistemas de notación
capaces de transmitir el significado de conceptos, palabras o sonidos simples.
Los signos y símbolos transmiten ideas en las culturas prealfabetizadas y prácticamente analfabetas.
Pero su utilidad no es menor entre las verbalmente alfabetizadas: al contrario, es mayor. En la
sociedad tecnológicamente desarrollada, con su exigencia de comprensión inmediata, los signos y
símbolos son muy eficaces para producir una respuesta rápida. Su estricta atención a los elementos
visuales principales y su simplicidad estructural, proporcionan facilidad de percepción y memoria.
Estudio de los símbolos
El interés por los signos ha dado lugar a un importante campo de estudio: la semiótica. Ésta trata tanto
la función de los signos en el proceso de comunicación, como el lugar de los síntomas en el
diagnóstico médico. Los símbolos pueden componerse de información realista, extraídas del
entorno, fácil de reconocer, o también por formas, tonos, colores, texturas..., elementos visuales
básicos que no guardan ninguna similitud con los objetos del entorno natural. No poseen ningún
significado, excepto el que se les asigna. Existen muchas formas de clasificar a los símbolos;
pueden ser simples o complicados, obvios u oscuros, eficaces o inútiles. Su valor se puede
determinar según hasta donde penetran la mente pública en términos de reconocimiento y memoria.

VOCABULARIO O ALFABETO
Un vocabulario o alfabeto es un conjunto finito de símbolos, no vacío. Para definir que un símbolo a
pertenece a un alfabeto V, se utiliza la siguiente notación aV.
Los alfabetos se definen por enumeración de los símbolos que contienen, podemos ver los siguientes
ejemplos:

Ing. Miguel Angel Silva Zapata Ingeniería de Sistemas e Informática


Teoría de Lenguajes UNASAM

· V1={A,B,C,D,E,F,…..,X,Y,Z}
· V2={a,b,c,d,0,1,2,3,4,*,#,+}
· V3={0,1}
· V4= {if, then, begin, end, else, a,b,;,=,>}
· También se pueden definir las tablas ASCII y EBCDIC como los alfabetos de distintos
ordenadores.
Cadena
Una cadena es una secuencia finita de símbolos de un determinado alfabeto. Si no se ponen
restricciones al alfabeto, una cadena podrá estar formada por cualquier combinación finita de
los caracteres disponibles. Esta secuencia es ordenada y su longitud es arbitraria.
Ejm. Tomando en cuenta los alfabetos o vocabularios definidos anteriormente, podemos decir que:
abcb es una cadena del alfabeto V2
a+2*b es una cadena del alfabeto V2
000111 es una cadena del alfabeto V3
if a>b then b=a; es una cadena del alfabeto V4
Una cadena consiste en una secuencia de caracteres que se encuentran comprendidos entre unos
delimitadores que pueden ser:
-Comillas simples ' '
-Comillas dobles ""
-Documento incrustado <<< >>>
En caso de que se desee por ejemplo unas " " dentro de las comillas de la cadena de carácter es
necesario realizar la acción que se denomina escapar un carácter que consiste en precederlo de una
es decir". Los caracteres especiales que pueden aparecer dentro de un documento con delimitación
son:
Longitud de cadena
La longitud de una cadena consiste en el número de símbolos pertenecientes a la cadena. Ejm.
Tomando en cuenta los ejemplos de cadena podemos decir que:
· |abcb| es de longitud 4
· |a + 2*b| es de longitud 5

· |000111| es de longitud 6
· |if a>b then a=b;| es de longitud 9
Cadena vacía
Se denomina cadena vacía, que no tiene símbolos y se denota con l, por lo que su longitud es:

Ing. Miguel Angel Silva Zapata Ingeniería de Sistemas e Informática


Teoría de Lenguajes UNASAM

|l|=0
Concatenación de cadenas
Sean A y B dos cadenas cualesquiera, se denomina concatenación de A y B a una nueva cadena AB
constituida por los símbolos de la cadena A seguidos por los de la cadena B.
El elemento neutro de la concatenación es 1:
A 1 = 1A = A
Algunas operaciones con cadenas de caracteres
Las siguientes son algunas cadenas:
 Asignación, consiste en asignar una cadena a otra.
 Concatenación, consiste en unir dos cadenas o más (o una cadena con un carácter) para formar una
cadena de mayor tamaño.
 Búsqueda, consiste en localizar dentro de una cadena una sub cadena más pequeña o un carácter.
 Extracción, se trata de sacar fuera de una cadena una porción de la misma según su posición dentro
de ella.
 Comparación, se utiliza para comparar dos cadenas.
Universo del discurso.
El conjunto de todas las cadenas que se pueden formar con los símbolos de un alfabeto, se denomina
universo del discurso del V y se representa por W(V). Evidentemente W(V) es un conjunto infinito.
La cadena vacía pertenece a W(V).
Ejm: Sea un alfabeto con una sola letra V={a}, entonces el universo del discurso es:
W(V) = {l, a, aa, aaa, aaaa, ….}, que contiene infinitas cadenas.
LENGUAJE
Se denomina lenguaje sobre un alfabeto V a un subconjunto del universo del discurso, o al conjunto
de cadenas de un determinado alfabeto, las cadenas del lenguaje están formadas gracias a un
alfabeto y una gramatica que están formalmente especificadas. Los lenguajes se definen por las
propiedades que cumplen sus cadenas.
Para representar las cadenas de un lenguaje se puede pensar hacerlo mediante la enumeración de sus
elementos, pero este método además de ser ineficiente en algunos casos es imposible, debido a que
la cantidad de cadenas del lenguaje puede ser infinitas.
A cada cadena de un lenguaje que ha sido formada a partir de una gramatica, también se le conoce
como fórmula bien formada.
Por ejemplo:

Ing. Miguel Angel Silva Zapata Ingeniería de Sistemas e Informática


Teoría de Lenguajes UNASAM

 El conjunto de palíndromos (cadenas que se leen igual hacia adelante, que hacia atrás) sobre el
alfabeto {0,1}; algunas cadenas son:
L1= {λ, 0, 1, 00, 11, 010, 0110, 000000, 101101, 111111, ….}
 Dado el vocabulario V= {a, b}; un posible lenguaje seria por ejemplo, las cadenas cuya longitud es
igual a dos L2= {aa, ab, ba, bb}.

Dada el siguiente vocabulario V={1,2}, encuentre y especifique lenguajes que sean finito e infinitos
como mínimo dos de cada uno.
Asi también un lenguaje está compuesto por Sintaxis: (gramática), que define las secuencias de
símbolos que forman cadenas válidas de un lenguaje. Y por Semántica, que es el significado de las
cadenas que componen un lenguaje.
Ejemplo 1:
Sintaxis: A
Semántica: es un número natural.
Diferente sintaxis en diferentes lenguajes:
A: natural
A: es un número que pertenece al conjunto de |N={1,2,3..N}
Ejemplo 2:
Sintaxis:
if a=b then write(a, " es igual a ", b )
else write(a, " es distinto a ", b )
Semántica:
Si se cumple la condición entonces se muestra un mensaje que ambos números son iguales.
Caso contrario, se escribe los número son distintos.
LENGUAJE VACIO
Es un conjunto vacío que se denota por {Φ}; este no debe confundirse con un lenguaje que contiene
una sola cadena y que esta sea la cadena vacía, es decir {λ}, donde el número de elementos
(cardinalidad) de estos dos conjuntos es diferente.
Cardinal ({Φ})= 0; Cardinal ({λ})= 1

Ing. Miguel Angel Silva Zapata Ingeniería de Sistemas e Informática

Vous aimerez peut-être aussi