Está en la página 1de 73

Procesadores de Lenguajes

Semana 02

Rogerio Orlando Beltrán Castro


Procesadores de Lenguajes
COMPARTIMOS NUESTROS
RETOS Y LOGROS ANTE LA
SOCIEDAD Y LA
COMUNIDAD ACADÉMICA
Resultados de Aprendizaje
• RA1:Desarrolla estrategias, procesos, sistemas,
componentes, proyectos o servicios informáticos,
fundamentados en las ciencias de la
computación y la aplicación de buenas prácticas
que permitan la solución innovadora y sostenible
de problemas complejos.
Procesadores de Lenguajes
• RA2: Desempeñar de forma ética, efectiva,
colaborativa y asertiva actividades que conlleven
la planificación de tareas, la toma de decisiones,
la comunicación y el cumplimiento de objetivos
en los proyectos en los cuales participa.
Agenda
TEMA02
1.

• TEMA03
2.

EJERCICIOS CON R
3.
TEMA 02
Procesamiento del lenguaje
natural

Rogerio Orlando Beltrán Castro


Procesadores de Lenguajes
TEMA 02. Procesamiento del lenguaje natural
Procesamiento del Lenguaje Natural
¿Qué es el procesamiento del lenguaje natural?

✓ Término genérico que abarca todo aquello que permite a las máquinas
procesar el lenguaje humano tanto en forma escrita, verbal, o visual.

¿Porqué es importante el procesamiento del lenguaje natural?


✓ Componente/Capacidad fundamental de los sistemas de IA.
Capacidades de un sistema de IA
- Percepción
- Aprendizaje
- Representación del conocimiento
- Razonamiento
Introducción a la Inteligencia Artificial: Procesamiento del Lenguaje Natural
Procesamiento del Lenguaje Natural
Procesado masivo de datos

Cantidades masivas de datos


no estructurados (raw data) :
texto, audio e imágenes

Datos estructurados
Representación numérica adecuada

enguaje Natural
Procesamiento del Lenguaje Natural
Comprensión de la información

El objetivo final es comprender el mensaje codificado en el lenguaje.


Comprender
Percibir y tener una idea clara de lo que se dice, se hace o sucede o descubrir
el sentido profundo de algo.
Implica entender conceptos y procesos para poder explicarlos y describirlos
de forma adecuada.

Nos proporciona herramientas para representar


el conocimiento

Introducción a la Inteligencia Artificial: Procesamiento del Lenguaje Natural


Procesamiento del Lenguaje Natural Imagen-to-text

¿Qué tareas podemos hacer?

Introducción a la Inteligencia Artificial: Procesamiento del Lenguaje Natural


Procesamiento del Lenguaje Natural

Pico de expectativas
lanzamiento sobredimensionadas Abismo de desilusión Rampa de consolidación Meseta de productividad

Introducción a la Inteligencia Artificial: Procesamiento del Lenguaje Natural


Procesamiento del Lenguaje Natural
¿Cómo funciona el procesado de lenguaje natural?

Pre-procesado texto:
• Segmentación en frases
• Segmentación en tokens Sistemas/Algoritmos basados en:
OCR • Eliminar palabras comunes • reglas
(stopwords) • datos (aprendizaje automático)
• Lematización/Stemming ✓ Espacios semánticos
• Análisis morfológico ✓ Modelos de lenguaje
voz a texto • Etiquetado gramatical(Part-
Of-Speech tagging)

Descripción
de imagen

Introducción a la Inteligencia Artificial: Procesamiento del Lenguaje Natural


Procesamiento del Lenguaje Natural
Netflix ha encontrado en el juego del calamar su nuevo fenómeno mundial ni
voz a texto Raw data siquiera en la propia plataforma contaban con ello como seguro que tampoco
esperaban recibir multitud de quejas por una escena del cuarto episodio sin
embargo han estado rápidos para responder a la indignación del público y ha
introducido un cambio en el equipo

Netflix ha encontrado en el juego del calamar su nuevo fenómeno mundial.


Segmentación en frases Ni siquiera en la propia plataforma contaban con ello como seguro que tampoco
esperaban recibir multitud de quejas por una escena del cuarto episodio.
Sin embargo han estado rápidos para responder a la indignación del público y ha
introducido un cambio en el equipo.

| netflix | ha | encontrado | en | el | juego | del |calamar | su |nuevo | fenómeno


| mundial | . |
Tokenización
|ni |siquiera | en | la | propia | plataforma | contaban | con | ello |….

| netflix | haber | encontrar| en | el | juego | del |calamar | su |nuevo | fenómeno


Lematización | mundial | . |
|ni |siquiera | en | el | propio | plataforma | contar | con | ello |….

Introducción a la Inteligencia Artificial: Procesamiento del Lenguaje Natural


Procesamiento del Lenguaje Natural
| Netflix [NP00SP0] | haber [VAIP3S0] | encontrar [VMP00SM]| en [SP] | el
POS tagging [DA0MS0] | juego [NCMS000] | del [SP] |calamar [NCMS000] | su [DP3CSN] |nuevo
[AQ0MS00] | fenómeno [NCMS000] | mundial [AQ0CS00] | . [Fp] |
|ni [CC] |siquiera [RG] | en [SP] | el [DA0FS0] | propio [AQ0FS00] | plataforma
[NCFS000] | contar [VMII3P0] | con [SP] | ello [PD00S00] |….

| Netflix [NP00SP0] encontrar [VMP00SM]| juego [NCMS000] | calamar [NCMS000]


| nuevo [AQ0MS00] | fenómeno [NCMS000] | mundial [AQ0CS00] | . [Fp] |
Quitar stopwords |ni [CC] |siquiera [RG] | propio [AQ0FS00] | plataforma [NCFS000] | contar
[VMII3P0] |….
Recursos:
Freeling (https://nlp.lsi.upc.edu/freeling/index.php/) permite: análisis morfológico, detección de entidades, POS-
tagging, desambiguación del significado de palabras, análisis sintáctico, etiquetado de la función semántica…
Demo on-line:
https://nlp.lsi.upc.edu/freeling/demo/demo.php

SPACY (https://spacy.io/) toolkit en Python con el estado del arte en técnicas de procesamiento del lenguaje natural
Demos:
https://spacy.io/universe
Introducción a la Inteligencia Artificial: Procesamiento del Lenguaje Natural
Procesamiento del Lenguaje Natural
Pero, ¿cómo representamos los tokens/palabras en una máquina?
La máquina trabaja con números, …..
…. luego debemos trasformar las palabras a números
Opción 1.
Utilizamos un código numérico, p.e. las numeramos de forma correlativa

netflix 1
encontrar 2
juego 3 ¿tiene algún significado el valor numérico?
calamar 4
nuevo 5
fenómeno 6
mundial 7
ni 8 ¿Podemos calcular la proximidad semántica?, ¿tiene sentido?
siquiera 9
propio 10
plataforma 11
contar 12

Introducción a la Inteligencia Artificial: Procesamiento del Lenguaje Natural


Procesamiento del Lenguaje Natural
Procesamiento del Lenguaje Natural
Opción 3.
Reflexionemos,
¿qué buscamos? (carta a los reyes magos)

✓ Queremos representar el significado de unidades lingüísticas (tokens/palabras)


✓ Queremos definir una medida de similitud semántica entre unidades
✓ Queremos que sea una representación numérica densa: “embeddings”
En definitiva:

Un espacio matemático de representación compacto donde la posición de los vectores


que me identifican a las unidades contenga información semántica y que llamaremos
espacio semántico

¿cómo lo construimos?
Semántica distribucional

Introducción a la Inteligencia Artificial: Procesamiento del Lenguaje Natural


Procesamiento del Lenguaje Natural
Semántica distribucional
¿Cómo conocemos el significado de una palabra?
John Rupert Firth, “You shall know a word by the Company it keeps”
“Similar words occur in similar contexts”
Ludwig Wittgenstein, “The meaning of a word is its use in language”

Hay una botella de Belikin sobre la mesa A


todo el mundo le gusta la Belikin
No bebas Belikin si tienes que conducir
La Belikin se fabrica con granos de cebada germinada
¿qué podemos deducir sobre la palabra Belikin?
Miramos las palabras que acompañan
Buscamos la similitud semántica con otras palabras ya conocidas
… y deducimos que la Belikin debe ser una bebida similar a…

Introducción a la Inteligencia Artificial: Procesamiento del Lenguaje Natural


Procesamiento del Lenguaje Natural
Aproximaciones para representar palabras

Distribuciones: cuentas Predicción: modelos de lenguaje


• Usado desde los 90 • Inspirado en deep learning
• Representaciones dispersas de palabras- • word2vec (Mikolov et al., 2013)
contexto (matrices TF-IDF) • GloVe (Pennington et al., 2014)
• Compactación • BERT (Google, 2018)

D1 D2 D3 … DN
P1 30 0 40 80 ….. dotar un presupuesto de la eurozona para invertir en los países….
P2 23 12 0 0
… palabras contexto izquierdo palabra central palabras contexto derecho
PM 0 67 80 4

Introducción a la Inteligencia Artificial: Procesamiento del Lenguaje Natural


Procesamiento del Lenguaje Natural

No modela la polisemia Modela la polisemia

Introducción a la Inteligencia Artificial:


Procesamiento del Lenguaje Natural
Procesamiento del Lenguaje Natural
Espacio semántico: embeddings

Sótano
Pasillo
Patio Ejemplo interactivo
Ático
Salón
Balcón

Fútbol
Béisbol
Rugby
Baloncesto
La proximidad semántica entre Tenis
unidades lingüísticas se representa Balonmano
por la proximidad en el espacio Esquí
….

Introducción a la Inteligencia Artificial: Procesamiento del Lenguaje Natural


Procesamiento del Lenguaje Natural
Relaciones semánticas
vector[Reina] = vector[Rey] - vector[Hombre] + vector[Mujer]
Imágenes próximas

Rey - día + noche

Reina
Mujer -volar+navegar =

Hombre
- taza + caja =

- caja + taza =

Introducción a la Inteligencia Artificial: Procesamiento del Lenguaje Natural


Procesamiento del Lenguaje Natural
Generalización de los espacios semánticos:
Embeddings de Palabras, Frases, Documentos, Audio, Imagen, Vídeos, …

Ejemplo: Búsqueda semántica en periódicos


Buscador de noticias similares http://signal4.cps.unizar.es:5000/
✓ Cada noticia es un embedding
✓ Calcular embedding del texto a buscar
✓ Buscar los embeddings de noticias más próximos al del texto
Pero además permite
✓ Clasificar las noticias por categorías/temas
✓ Reconocer entidades
✓ Descubrir estereotipos y sesgos
✓ Evolución temporal/espacial de la semántica de palabras
✓ Componente principal de los modelos de lenguaje con redes neuronales
✓ ….
Introducción a la Inteligencia Artificial: Procesamiento del Lenguaje Natural
Procesamiento del Lenguaje Natural
Procesamiento del Lenguaje Natural
¿Dónde estamos?

https://huggingface.co/

https://openai.com/

https://beta.openai.com/examples

Introducción a la Inteligencia Artificial: Procesamiento del Lenguaje Natural


Procesamiento del Lenguaje Natural
[{
GPT-3: engine="text-davinci-001" "person": "Bryan Adams",
"oficio": "cantante, guitarrista, compositor, fotógrafo y filántropo",
"nacionalidad": "canadiense",
Hazme una lista en formato json con la persona, oficio, "año de nacimiento": "1958"
nacionalidad y año de nacimiento. },
{
"person": "Anne Erin Annie Clark",
Bryan Adams, el fotógrafo encargado de realizar el calendario, "oficio": "cantautora y multiinstrumentista",
"nacionalidad": "estadounidense",
es un cantante, guitarrista, compositor, fotógrafo y filántropo "año de nacimiento": "1982"
canadiense. },
{
Anne Erin Annie Clark, conocida artísticamente como St. "person": "Kali Uchis",
Vincent, es una cantautora y multiinstrumentista "oficio": "cantante, compositora, actriz, directora y diseñadora",
"nacionalidad": "colomboestadounidense",
estadounidense. Es ganadora de tres Premios Grammy por "año de nacimiento": "1994"
Mejor Canción de Rock. },
{
Kali Uchis, es una cantante, compositora, actriz, directora y "person": "Diamonte Quiava Valentin Harper",
diseñadora colomboestadounidense, saltó a la fama "oficio": "rapera",
"nacionalidad": "estadounidense",
internacional en dos mil veintiuno con el gran éxito de su "año de nacimiento": "1996"
canción Telepatía. },
{
Diamonte Quiava Valentin Harper, es una cocnocida rapera "person": "Cher",
estadounidense. "oficio": "cantante",
"nacionalidad": "estadounidense",
Cher es una de las figuras más destacas del este calendario. "año de nacimiento": "1946"
}]
Introducción a la Inteligencia Artificial:
Procesamiento del Lenguaje Natural
Procesamiento del Lenguaje Natural

Introducción a la Inteligencia Artificial:


Procesamiento del Lenguaje Natural
¿Para qué sirve el procesamiento de lenguaje natural? (aplicaciones generales)

1.Reconocimiento de patrones de lenguaje


2.Recuperación de información
3.Traducciones automáticas de idiomas
4.Clasificación de información
5.Resumen de textos
6.Generación de lenguaje natural
7.Detección de sentimientos y emociones
Ejemplos de aplicaciones del procesamiento del lenguaje
natural
1.Asistentes virtuales y chatbots
2.Función de autocorrección de texto
3.Google Translator
4.Detección de spam en el correo electrónico
5.Síntesis de voz
6.Resultados de búsquedas
7.Clasificación de documentaciones y datos
2.2. Palabras características de un documento
Las palabras características de un documento son las palabras que mejor resumen
el contenido del documento. La identificación de estas palabras es especialmente
útil para implementar un buscador de documentos.
En este tema vamos a ver cómo se calcula el índice TF-IDF. Este índice permite
ordenar por relevancia las palabras del documento. Una vez identificadas las
palabras más relevantes, el buscador recomendará nuestro documento cuando se
pregunte por estos términos.
Para comprender con detalle el proceso de cálculo, vamos a usar la herramienta R
para detallar cómo se calcula este índice.
2.3. Obtener un corpus
Para hacer análisis de documentos lo primero que necesitamos es un corpus, es decir, un conjunto de documentos a analizar. El proyecto
Gutenberg es un esfuerzo de voluntarios para proporcionar un archivo digitalizado de libros de dominio público.
Accede a la página web a través del aula virtual o desde la siguiente dirección: https://www.gutenberg.org/

Cada libro tiene un identificador único y se proporciona en varios formatos. Nosotros vamos a crear un corpus de ejemplo con cuatro libros en
formato texto: Five of Maxwell's Papers by James Clerk Maxwell (4908), Relativity: the Special and General Theory by Albert Einstein (5001),
Insectivorous Plants by Charles Darwin (5765), Opticks by Isaac Newton (33504).
Para ello el paquete gutenbergr de R incorpora la función gutenberg_download(), que podemos ejecutar así:
library(gutenbergr)
books <- gutenberg_download(c(4908 ,5001, 5765, 33504),
meta_fields = "author")
Al igual que ocurría anteriormente, si algún paquete no está instalado puedes instalarlo con el siguiente comando:
install.packages("gutenbergr")
2.3. Obtener un corpus
• Este comando nos devuelve un data frame con las líneas de texto de cada libro, tal como muestra la figura 2.

• El paquete tidytext incorpora la función unnest_token() que nos permite descomponer en tokens (en este caso, palabras) las líneas de texto. El
paquete dplyr incorpora la función count() que nos permite contar cuántas palabras hay de cada tipo agrupadas por autor. Podemos ejecutar este
conteo con los siguientes comandos:
library(tidytext)

library(dplyr)

words <- books %>%

unnest_tokens(word,text) %>%

count(author,word,sort=TRUE)
2.3. Obtener un corpus
• La figura 3 muestra el resultado de hacer esta descomposición en palabras y la

cuenta de ocurrencias de las palabras más frecuentes. Observa que se trata de

palabras vacías. Más adelante veremos cómo despreciar estas palabras.


2.4. El índice TF-IDF
• El índice TF-IDF calcula la importancia de cada término t multiplicando 2 índices de acuerdo a la siguiente fórmula:

TF−IDF (𝑡,𝑑,𝐷)=𝑇𝐹(𝑡,𝑑)∗𝐼𝐷𝐹(𝑡,𝐷)

• Donde d es el documento que estamos analizando y D es el corpus de documentos.

• El índice TF (Term Frequency) mide la ocurrencia de un término en un documento. En la figura 3 vemos el número de veces que ocurre un término en cada documento n(t, d).
Dado que cada documento tiene una longitud distinta, el índice TF calcula el ratio entre el número de veces que aparece el término en el documento n(t, d) y el número de
palabras totales que tiene el documento n(d), es decir:

• El índice IDF (Inverse Document Frequency) mide lo importante que es un término t. Los términos que más veces aparecen en el corpus reciben una puntuación más baja. La
fórmula exacta de cálculo de este índice es:

• Donde n(D) es el número de documentos del corpus, y n(t,D) el número de documentos del corpus donde aparece el término t.

• Cabe observar que en ningún momento hemos eliminado las palabras vacías. Una de las ventajas de usar el índice TF-IDF es que el índice IDF reduce especialmente la puntuación
de las palabras vacías.
2.5. Cálculo del índice TF-IDF con R
• En esta sección vamos a calcular el índice TF-IDF de las palabras contadas en la figura 3. La
función bind_tf_idf() del paquete tidytext nos permite calcular este índice. La función recibe un
data frame de términos y genera los nuevos campos tf, idf, y tf_idf con estos valores calculados
para cada término.
rated_words <- words %>%
bind_tf_idf(word,author,n) %>%

arrange(desc(tf_idf))

• Después podemos usar la función top_n() combinada con group_by() para elegir los quince
términos de cada autor con mayor puntuación en el campo tf_idf:
top_words <- rated_words %>%
group_by(author) %>%

top_n(15,tf_idf) %>%

ungroup() %>%

arrange(author,desc(tf_idf))
2.6. Visualización de las palabras características
• Podemos usar la función ggplot() del paquete ggplot2
para generar la visualización de las palabras
características de cada documento:

library(ggplot2)

top_words %>%

mutate(word=reorder(word,tf_idf)) %>%

ggplot(aes(word,tf_idf,fill="author")) +

geom_col(show.legend = FALSE) +

facet_wrap(~author, ncol=2, scales="free") +

coord_flip()

• La figura 4 muestra las palabras características de


cada documento, es decir, las que tienen un índice
TF-IDF mayor; esta gráfica es generada con el
comando anterior.
TEMA 03
Introducción al proceso de
compilación

Rogerio Orlando Beltrán Castro


Procesadores de Lenguajes
TEMA 03. Introducción al proceso de compilación
3.2. Compilación e interpretación
• Al hablar del proceso de compilación es necesario definir determinados conceptos previamente.
Una de las tareas que realiza un compilador consiste en un proceso de traducción de un lenguaje
determinado a otra representación. Por lo tanto, se puede definir un traductor como un programa
que, a partir de un código fuente escrito en un lenguaje fuente, es capaz de generar otro
programa con la misma semántica escrito en un lenguaje diferente (normalmente conocido como
lenguaje objeto).

• En un traductor hay que diferenciar entre:


• Tiempo de construcción del compilador. El que se invierte en el desarrollo del propio compilador. Se pueden generar
compiladores desarrollados en el mismo lenguaje que van a compilar. Esto requiere una autocompilación.
• Tiempo de compilación. Tiempo invertido en analizar la cadena de entrada y generar la representación final para
poder ser ejecutado en la arquitectura correspondiente.
• Tiempo de ejecución. El necesario para obtener unos resultados a partir de una entrada determinada. Se centra en la
ejecución del código de usuario que ha sido compilado previamente.
3.2. Compilación e interpretación
• Como se ha podido observar, la compilación realiza un proceso de traducción que posteriormente
permite la ejecución del código generado. Se distinguen dos etapas claramente: traducción y
ejecución.

• Cuando hablamos de intérprete, nos centramos en un tipo diferente de procesamiento y


ejecución. En este caso no hay una diferenciación tan clara entre las dos etapas pues, aunque
ambas existen, se realizan a la vez. Esto implica que, cuando se va a ejecutar un código
interpretado, previamente debe ser analizado y luego ejecutado. Aunque con la interpretación
nos ahorramos una de las fases, normalmente los lenguajes interpretados son menos eficientes
que los compilados. Algunos ejemplos de lenguajes compilados son: C, C++, Ada, etc. Algunos
lenguajes interpretados son: LISP, CLIPS, etc. Existen otros lenguajes que combinan técnicas de
compilación e interpretación como Java.
3.3. Entorno de ejecución de un compilador
• Cuando se ejecuta un compilador es necesario determinar el conjunto de herramientas
necesarias para su correcto funcionamiento y procesamiento de la cadena de entrada (código
fuente de usuario).

• Preprocesador:
• Proceso de macros.
• Inclusión de archivos.
• Preprocesadores racionales y extensiones a los lenguajes.

• Ensambladores. Dependiendo del compilador, mientras que algunos generan código ensamblador
que será necesario traducir a código máquina, otros directamente generan código máquina.

• Cargadores y ligadores. Cuando utilizamos posiciones de memoria reubicables es necesario un


cargador para calcular dichas posiciones finales.
3.4. Proceso de análisis
• El proceso de análisis de un compilador se encarga de comprobar que la cadena de entrada (código
fuente de usuario) cumpla unas ciertas características acordes con el lenguaje que se está utilizando.
Nótese que las características de dicho lenguaje las determina el diseñador del compilador. El proceso
de análisis se divide en tres etapas bien diferenciadas:
• Análisis léxico. Se encarga de comprobar que los elementos de la cadena de entrada pertenecen a un lenguaje
determinado.

• Análisis sintáctico. Su función es determinar que la sintaxis del código fuente es la especificada en el propio
compilador.

• Análisis semántico. Es el encargado de asegurar que lo escrito en el código fuente tiene sentido semántico. Por
ejemplo, que los tipos de los elementos son los adecuados para las operaciones indicadas.

• Si una cadena de entrada supera las fases de análisis ya no se realizan más comprobaciones, pues se
comienza la etapa de traducción. Esto quiere decir que todos los errores lógicos de la cadena de entrada
se deben detectar en estas tres fases de análisis.
3.5. Proceso de síntesis
• Una vez comprobado que el código de usuario es correcto, se
comienza el proceso de síntesis cuyo objetivo es generar un cambio
de representación de la cadena de entrada proporcionada. Al igual
que el proceso de análisis, la etapa de síntesis se divide en diferentes
fases:
• Generación de código intermedio. Se centra en crear una representación
intermedia previa al código objeto final. Al introducir esta fase se logra un
nivel de independencia adicional entre el compilador y la arquitectura
subyacente.
• Optimización de código intermedio. Trata de mejorar el código intermedio, de
manera que se produzca un mejor código destino. Por lo general, la mejora
significa más rapidez, pero pueden lograrse otros objetivos, como un código
más corto o un código de destino que consuma menos recursos.
• Generador de código. Consiste en generar el código objeto, que puede ser
código ensamblador (requiere un ensamblado) o código máquina final.
Introducción
¿Qué es un compilador (traductor)?
• Programa que lee un programa (fuente) en un lenguaje ascii y lo traduce a un programa EQUIVALENTE en otro
lenguaje (objeto)
• Además:
• da mensajes de error
• lleva a cabo determinadas “correcciones” (recuperación de errores)
• puede optimizar el código generado

Permite programar “independientemente” de la máquina


• Importante, ya que el número de máquinas diferente crece deprisa
¿De dónde el nombre “compilador”?

• Grace Murray Hopper (50’s)

• La traducción se veía como la “compilación” de una secuencia de


subprogramas tomados de una librería (biblioteca) de programas

• Compilación (actual) se llamaba “programación automática”

• se veía como algo futurista

• Primeros compiladores modernos: FORTRAN (finales 50)

• “independencia” de la máquina
• No siempre el lenguaje objeto tiene que ser de “bajo nivel” (traductor)

• Técnicas aplicables para:

• editores/formateadores de texto
• nroff, troff, eqn, tbl, pic de UNIX,TeX

• lenguajes de consulta
• SQL, shells

• transformación de formatos de ficheros


Clasificación de los lenguajes
Lenguajes máquina
– Son los lenguajes de más bajo nivel: secuencias binarias de ceros y unos.
– Históricamente, los primeros
• Lenguajes ensambladores
– Segunda generación de lenguajes
– Versión simbólica de los lenguajes máquina (MOV, ADD).
• Lenguajes de alto nivel
– Lenguajes de tercera generación (3GL)
• Estructuras de control, Variables de tipo, Recursividad, etc.
• Ej.: C, Pascal, C++, Java, etc
• Lenguajes orientados a problemas.
– Lenguajes de cuarta generación (4GL)
• Ej. SQL
INTERPRETE
• El intérprete ejecuta el código según lo va interpretando.

– Cada vez que se escribe una línea el programa comprueba si


es correcta, si lo es, la ejecuta.

– La ejecución es interactiva.

– Los intérpretes más puros no guardan copia del programa que


se está escribiendo.

– Ejemplos: Procesos por lotes, CAML, etc.

– El intérprete siempre debe estar presente.


COMPILADOR

• El compilador es el traductor más extendido

• Realiza un análisis y genera un programa ejecutable

• El programa ejecutable, una vez creado, no necesita el compilador para


funcionar
COMPILADOR VS INTERPRETE
• Compilador • Intérprete

– Se compila una vez, se ejecuta n veces – Se traduce cada vez que se ejecuta.
– Permite interaccionar más con el
– El proceso de compilación tiene una
código en tiempo de ejecución.
visión global de todo el programa, por
– Necesita menos memoria
lo cual la gestión de errores es más
eficiente.

– La ejecución es más rápida.


Las FASES de un compilador

• Primera fase (precompilador)


• no siempre se realiza

• sustituciones de macros

• eliminación de comentarios

• inclusión de ficheros

• extensiones al lenguaje (C+SQL)

• Segunda fase
• es la parte fundamental (y siempre presente)

• consta de:

• analizador léxico

• analizador sintáctico

• generador de código

• traduce el código fuente a otro objeto

• puede ser el definitivo

• puede ser un código intermedio


Las FASES de un compilador

• Tercera fase
• no siempre presente
• realiza optimizaciones (algunas) sobre el código (intermedio) generado

• Cuarta fase:
• traduce el código intermedio (optimizado) a
• ensamblador

• binario

• Muchas variaciones posibles:


• sin preprocesador
• sin usar código intermedio
• optimizando directamente sobre el ensamblador de la máquina
• generar directamente binario, sin pasar por el ensamblador
• .........
Tipos de Compiladores

• Ensamblador: el lenguaje fuente es lenguaje ensamblador y posee una estructura


sencilla.

• Compilador cruzado: se genera código en lenguaje objeto para una máquina


diferente de la que se está utilizando para compilar.

• Compilador con montador: compilador que compila distintos módulos de forma


independiente y después es capaz de enlazarlos.

• Autocompilador: compilador que está escrito en el mismo lenguaje que va a


compilar.
Tipos de Compiladores

• Metacompilador: es sinónimo de compilador de compiladores y se


refiere a un programa que recibe como entrada las especificaciones
del lenguaje para el que se desea obtener un compilador y genera
como salida el compilador para ese lenguaje.

• Descompilador: es un programa que acepta como entrada código


máquina y lo traduce a un lenguaje de alto nivel, realizando el
proceso inverso a la compilación.
ESTRUCTURA DE UN COMPILADOR

Etapas que constituyen el proceso de compilación

Programa Fuente

Análisis Léxico

Análisis Sintáctico
Manejo de la Manejo de
Análisis Semántico Errores
Tabla de Símbolos
Generación de Código Intermedio

Optimización de Código

Generación de Código

Programa Objeto
Las partes principales
• La primera fase (front end) es la encargada de analizar el programa fuente
– Fase de Análisis.

• (back end) es la encargada de generar código para la máquina objeto.-


Fase de síntesis.

• El puente de unión entre las dos fases era un lenguaje intermedio que se
designó con el nombre de UNCOL (UNiversal Computer Oriented
Language).
El analizador léxico

• Lo realiza un “scanner”

• también “tokenizer”

• El scanner recorre los caracteres de entrada (el fuente) hasta reconocer un “token”

• token: unidad léxica indivisible

• ejemplos: while,if,==,>=,ancho,...

• La secuencia de caracteres correspondiente se llama

“lexema” (componente léxico)

• 1 token <> 1 lexema

• Existen Generadores automáticos de analizadores lexicos como LEX


El analizador léxico

• Además, suele realizar otras tareas:


• procesar directivas al compilador (opciones)

• introducir información preliminar en la tabla de símbolos

• eliminar separadores innecesarios

• sustituir macros

• listar el fuente

• Normalmente, los tokens se describen mediante expresiones regulares


El analizador léxico
• Ejemplo:
• El scanner deberá reconocer sucesivamente,
El analizador sintáctico

• O “parser”

• Objetivo: agrupar los tokens suministrados por el scanner para reconocer “frases”

• ¿Cómo lo hace?

• La sintaxis se suele especificar formalmente mediante una GLC

• también de otros tipos

• El parser recibe tokens y los agrupa de acuerdo a especificadas por la GLC

• El parser detecta errores sintácticos

• Y si es bueno, puede además realizar algunas correcciones

• producciones
El analizador sintáctico

• Ejemplo:
• supongamos sintaxis asignación como:

• y debemos analizar
El analizador sintáctico

• El árbol sintáctico correspondiente es


El analizador semántico

• Realiza dos funciones:

• Análisis de la semántica estática

• ¿Es cada construcción legal y “con sentido”?


• variables en una expresión definidas

• del tipo adecuado

• alcance de los objetos

• Generación del código intermedio

• Generalmente se lleva a cabo mediante gramáticas de atributos


• la GLC se completa con atributos necesarios

• tipo

• valor

• acciones a ejecutar cuando se detecta una construcción legal

• ....
Generación de Código Intermedio

Cuando el número de lenguajes fuente crece hasta un número grande M,


y/o cuando el número de lenguajes objeto también crece hasta un numero
grande N, es necesario encontrar una técnica para evitar tener que diseñar
MxN compiladores.La solución consiste en utilizar un lenguaje intermedio o
una representación intermedia; de esta forma solo hay que construir M
programas que traduzcan de cada lenguaje fuente al lenguaje intermedio y
N programas que traduzcan del lenguaje intermedio a cada lenguaje objeto.
Generación de Código Intermedio

La generación de código intermedio While (A>B) AND (A<=2*B-5)


Do A := A + B
transforma un árbol de análisis sintáctico
L1: IF A>B GOTO L2
(semántico) en una representación en un GOTO L3
L2: T1:= 2*B
lenguaje intermedio, que suele ser código T2:= T1-5
IF A<=T2 GOTO L4
suficientemente sencillo para poder luego GOTO L3
generar código máquina. L4: A:= A+B
GOTO L1
L3: ....
OPTIMIZACION DE CODIGO

• El código intermedio generado es analizado y transformado en uno equivalente optimizado

• Es una tarea muy costosa

• De hecho, generalmente se puede invocar al compilador activando/desactivando esta opción

• Otras veces, optimiza el código objeto

• usual la optimización “peephole”:

• tomar una porción pequeña de código y hacer una optimización local

• “desenrrollado” de bucles

• eliminación de recursividad final

• ....
GENERACION DE CODIGO

• Toma código intermedio y genera código objeto para la máquina considerada

• Es la parte más próxima a la arquitectura de la máquina

• Habitualmente, se escriben “a mano”


• desarrollo “a medida” para cada máquina específica

• Dada la complejidad, si no se va a realizar optimización, se asocia la


generación de código a las rutinas semánticas
• compiladores de “una pasada”
La tabla de símbolos
• Mecanismo para almacenar/acceder la información de los identificadores

• Las informaciones asociadas a un identificador se denominan “atributos”

• Cada vez que se usa un identificador, la tabla de símbolos proporciona la


información necesaria

• Se usa tanto en la parte de análisis como en la de síntesis


Manejo de errores
Es una de las misiones mas importantes de un compilador, aunque al mismo tiempo, es
lo que mas dificulta su realización debido principalmente a dos motivos:

1) A veces unos errores ocultan otros

2) A veces un error provoca una avalancha de muchos errores que se solucionan con
el primero

Criterios en el manejo de errores

a) Pararse al detectar el primer error

b) Detectar todos los errores de un pasada


Recuerda

RA 1
Actividad 1

RA 2
Test

Actividad 2
RA 3
muchas gracias
Esta nueva plantilla se ajusta al nuevo logo de la fundación

También podría gustarte