Professional Documents
Culture Documents
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.
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.
- 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.
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
sin tener que recompilar, una característica que se ha vuelto muy importante, ya que la difusión de
la World Wide Web .
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 aV.
Los alfabetos se definen por enumeración de los símbolos que contienen, podemos ver los siguientes
ejemplos:
· 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: “/”m”
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:
|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.
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:
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.
V1= {a, b}
*) Se puede concluir que a partir de un vocabulario se pueden obtener o generar varios lenguajes
teniendo en cuenta la propiedad o propiedades que cumplen y además estos pueden ser finitos,
infinitos e incluso vacío.
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
LAS GRAMATICAS
Definición general
Es un ente formal o método que nos permite especificar de manera finita las cadenas de símbolos(a
partir de un vocabulario), que constituyen o forman un lenguaje, definen la estructura de esas
cadenas o frases. Para hacerlo utilizan las derivaciones basándose en un conjunto de reglas o
producciones.
Definición formal
Es una cuádrupla G=(VT, VN, S, P) que está formada por los siguientes elementos:
Vocabulario terminal (VT)
Es un conjunto finito de símbolos que por lo general se define por la enumeración de sus
símbolos, se utilizan para formar las cadenas del lenguaje; es decir las cadenas, palabras o frases del
lenguaje están formadas por los símbolos de este vocabulario.
Entre los símbolos que pueden formar parte de este vocabulario tenemos los siguientes:
Letras minúsculas del abecedario sobre todo las primeras: (a,b,c,d,e,…).
Operadores como (+,-,*,/,…).
Caracteres especiales (&,#,@,%,…..).
Los dígitos (0,1,2,3,…,8,9).
Palabras reservadas de un lenguaje de programación (if, else, while, then, etc.).
Derivación
P1 P1 P2 P6 P5 P6 P5 P5
aABC aaABCBC aaabCBCBC AaabBCBC aaabbCB aaabbBC aaabbbC aaabbb
C
Resultado Aaabbb
TIPOS DE GRAMÁTICAS
Las gramáticas según Noam Chomsky se dividen en 4 tipos
Tipo 0 (Generales no restringidas), Tipo 1 (Sensibles al contexto, contextuales), Tipo 2
(independientes del contexto) y Tipo 3 (Regulares). Para lograr esa clasificación Chomsky aplico
restricciones sobre las reglas de derivación o producciones de la gramatica y el resultado fue una
jerarquía respecto a los tipos de gramatica; es decir que la gramatica más general o menos
restringida va incluyendo a la más restringida. Notaciones de la cadena vacía (l, λ, є).
Gramáticas de tipo 0 o no restringidas
En este tipo de gramatica las reglas de producción tienen la forma: αβ
Siendo, α є (VN U VT)+ Y β є (VN U VT)* , La única restricción es que ninguna de sus
producciones debe tener la forma: λ β
Por lo tanto en realidad todas las gramáticas son del tipo 0.
Por ejemplo la gramatica cuyas producciones son las siguientes:
P={AaABC, AabC, Aє, CBBC, bBbb, bCb}
Gramáticas de tipo 1 o no sensibles al contexto
En este tipo de gramáticas las producciones o reglas de derivación tienen la siguiente forma:
αAβ αᵞβ
Aa ; A=A α=λ ; β= λ ᵞ=a ; todas sus producciones cumplen con las restricciones, por lo
Analizando
Producción αAβ αᵞβ Situación
SaaaaSbbbb S; aaaaSbbbb;
α=λ; A=S ; α=λ; ᵞ= Cumple
β= λ aaaaSbbbb ; β= λ
aSbab aSb ; ab;
α=a; A=S ; α=a; ᵞ= b ;
β= b β= λ No cumple.
o
α= λ; ᵞ= a;
β= b
Resultado La segunda producción no cumple con las reglas, por lo
tanto esta gramatica no es del tipo 1.
SabAS S; abAS;
α=λ; A=S ; α=λ; ᵞ= abAS ; Cumple
β= λ β= λ
abAbaab abA ; baab;
α=ab; A=A ; α=b; ᵞ= aa ;
β= λ β= b No cumple.
o
α= λ; ᵞ= baab;
β= λ
Sa S; a; Cumple
α=λ; A=S ; α= λ; ᵞ= a;
β= λ β= λ
Ab A; b; Cumple
α=λ; A=A ; α= λ; ᵞ= b;
β= λ β= λ
Resultado La segunda producción no cumple con las restricciones,
por lo tanto esta gramatica no es del tipo 1.
Derivación
P1 P2 P3 P4
aS aaA aabA aabb
Derivación
P2 P3 P3 P4
aA abA abbA abbb
Resultado Computo: P2, P3, P3, P4 Cadena= abbb
n=1 ˄ m=1 ab
Derivación
P2 P4
aA ab
Resultado Computo: P2, P4 Cadena= ab