Un compilador traduce un programa completo a lenguaje de máquina de una sola vez, mientras que un intérprete traduce línea a línea durante la ejecución. Un intérprete permite depurar más fácilmente durante el desarrollo, mientras que un programa compilado es más rápido y seguro una vez terminado. C# se compila a código intermedio que es luego compilado a código nativo y ejecutado por el Common Language Runtime de .NET, el cual proporciona servicios como recolección de basura y ejecuc
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Ensambladores y Compiladores
1. Ejercicio 1 .1 .1: ¿Cuál es la diferencia entre un compilador y un intérprete?
• Un intérprete traduce instrucciones de alto nivel en una forma intermedia para ser ejecutado.
En contraste, un compilador, traduce instrucciones de alto nivel directamente en lenguaje de
máquina.
• El intérprete traduce un programa línea a línea mientras que el compilador traduce el
programa entero y luego lo ejecuta.
• El intérprete detecta si el programa tiene errores y permite su depuración durante el proceso
de ejecución, mientras que el compilador espera hasta terminar la compilación de todo el
programa para generar un informe de errores.
• Un programa compilado es más seguro que uno interpretado, porque no contiene el código
fuente, que puede ser modificado incorrectamente por el usuario.
• Ambos, intérpretes y compiladores están disponibles en la mayoría de los lenguajes de alto
nivel.
Ejercicio 1 .1 .2: ¿Cuáles son las ventajas de (a) un compilador sobre un intérprete, y (b) las de un
intérprete sobre un compilador?
(a)Ventajas de un compilador sobre un intérprete:
Se compila una vez, se ejecuta n veces.
En bucles, la compilación genera código equivalente al bucle, pero interpretándolo se
traduce tantas veces una línea como veces se repite el bucle.
El compilador tiene una visión global del programa, por lo que la información de mensajes
de error es más detallada. Ventajas del intérprete frente al compilador:
Un intérprete necesita menos memoria que un compilador. En principio eran más
abundantes dado que los ordenadores tenían poca memoria.
Permiten una mayor interactividad con el código en tiempo de desarrollo.
(b) Ventajas del intérprete frente al compilador:
• El programa se puede ejecutar de inmediato, sin esperar a ser compilado.
• Puede ser interrumpido con facilidad.
• Puede ser rápidamente modificado y ejecutado nuevamente.
• Resultan muy apropiados durante la fase de desarrollo de un programa, ya que la
compilación no permite la ejecución paso a paso del programa y con ello impide la edición
seguimiento y depuración del programa.
Ejercicio 1 .1 .3: ¿Qué ventajas hay para un sistema de procesamiento de lenguajes en el cual el
compilador produce lenguaje ensamblador en vez de lenguaje máquina?
• Velocidad
El proceso de traducción que realizan los intérpretes, implica un proceso de cómputo adicional al
que el programador quiere realizar. Por ello, nos encontraremos con que un intérprete es siempre
más lento que realizar la misma acción en Lenguaje Ensamblador, simplemente porque tiene el costo
adicional de estar traduciendo el programa, cada vez que lo ejecutamos.
2. • Tamaño
Los compiladores e intérpretes generan más código máquina del necesario; por ello, el programa
ejecutable crece. Así, cuando es importante reducir el tamaño del ejecutable, mejorando el uso de la
memoria y teniendo también beneficios en velocidad, puede convenir usar el lenguaje Ensamblador.
Entre los programas que es crítico el uso mínimo de memoria, tenemos a los virus y manejadores de
dispositivos (drivers). Muchos de ellos, por supuesto, están escritos en lenguaje Ensamblador.
• Flexibilidad
Las razones anteriores son cuestión de grado: podemos hacer las cosas en otro lenguaje, pero
queremos hacerlas más eficientemente. Pero todos los lenguajes de alto nivel tienen limitantes en el
control; al hacer abstracciones, limitan su propia capacidad. Es decir, existen tareas que la máquina
puede hacer, pero que un lenguaje de alto nivel no permite. Por ejemplo, en Visual Basic no es
posible cambiar la resolución del monitor a medio programa; es una limitante, impuesta por la
abstracción del GUI Windows. En cambio, en ensamblador es sumamente sencillo, pues tenemos el
acceso directo al hardware del monitor.
Ejercicio 1 .1 .4: A un compilador que traduce un lenguaje de alto nivel a otro lenguaje de alto nivel
se le llama traductor de source-to-source. ¿Qué ventajas hay en cuanto al uso de C como lenguaje
destino para un compilador?
Las ventajas de que C sea su lenguaje destino son las siguientes:
• Es un lenguaje muy eficiente puesto que es posible utilizar sus características de bajo nivel
para realizar implementaciones óptimas.
• A pesar de su bajo nivel es el lenguaje más portado en existencia, habiendo compiladores
para casi todos los sistemas conocidos.
• Proporciona facilidades para realizar programas modulares y/o utilizar código o bibliotecas
existentes.
Ejercicio 1 .1 .5: Describa algunas de las tareas que necesita realizar un ensamblador.
• Convertir los códigos (“opcode” o mnemónicos: ej. LDA, STX) a su código equivalente en
lenguaje de máquina
• Convertir los operandos simbólicos (las etiquetas o variables) en las direcciones
correspondientes de los operandos
• Construir las instrucciones en lenguaje de máquina en el formato apropiado
• Convertir las constantes definidas en el programa en su verdadera representación
• Escribir el “listing” en lenguaje de ensamblador con el código en lenguaje de máquina
correspondiente
• Procesar las directrices al ensamblador (las directrices son instrucciones o comandos
dirigidos al ensamblador, que éste procesa y ejecuta al hallarlos en el programa en lenguaje
de ensamblador; estas directrices no se traducen a lenguaje de máquina, si no que el
ensamblador ejecuta alguna acción, como reservar memoria para variables, entre otras)
3. JavaScript
JavaScript es un lenguaje de programación que se utiliza principalmente para crear páginas web
dinámicas.
Una página web dinámica es aquella que incorpora efectos como texto que aparece y desaparece,
animaciones, acciones que se activan al pulsar botones y ventanas con mensajes de aviso al usuario.
Técnicamente, JavaScript es un lenguaje de programación interpretado, por lo que no es necesario
compilar los programas para ejecutarlos. En otras palabras, los programas escritos con JavaScript se
pueden probar directamente en cualquier navegador sin necesidad de procesos intermedios.
A pesar de su nombre, JavaScript no guarda ninguna relación directa con el lenguaje de programación
Java. Legalmente, JavaScript es una marca registrada de la empresa Sun Microsystems.
Las acciones controladas por JavaScript pueden ser el despliegue de un menú, hacer aparecer,
desaparecer o cambiar texto e imágenes, realizar cálculos y mostrar resultados, mostrar mensajes de
aviso (por ejemplo, si faltan datos en un formulario) y “efectos animados” en general.
4. Arquitectura de la plataforma .NET Framework
Los programas de C# se ejecutan en .NET Framework, un componente integral de Windows que
incluye un sistema de ejecución virtual llamado Common Language Runtime (CLR) y un conjunto
unificado de bibliotecas de clases. El CLR es la implementación comercial de Microsoft de Common
Language Infrastructure (CLI), un estándar internacional que es la base para la creación de entornos
de ejecución y desarrollo en los que los lenguajes y las bibliotecas trabajan juntos sin problemas.
El código fuente escrito en C# se compila en un lenguaje intermedio (IL) que guarda conformidad con
la especificación de CLI. El código y los recursos IL, como mapas de bits y cadenas, se almacenan en
disco en un archivo ejecutable denominado ensamblado, normalmente con la extensión .exe o .dll. Un
ensamblado contiene un manifiesto que proporciona información sobre los tipos, la versión, la
referencia cultural y los requisitos de seguridad del ensamblado.
Cuando se ejecuta el programa de C#, el ensamblado se carga en el CLR, el cual podría realizar diversas
acciones en función de la información en el manifiesto. Luego, si se cumplen los requisitos de
seguridad, el CLR realiza la compilación Just in time (JIT) para convertir el código IL en instrucciones
máquina nativas. El CLR también proporciona otros servicios relacionados con la recolección de
elementos no utilizados, el control de excepciones y la administración de recursos. El código que se
ejecuta en el CLR se conoce a veces como "código administrado", a diferencia del "código no
administrado" que se compila en lenguaje de máquina nativo destinado a un sistema específico. En el
siguiente diagrama se ilustran las relaciones de tiempo de compilación y tiempo de ejecución de
archivos de código fuente de C#, las bibliotecas de clases de .NET Framework, los ensamblados y el
CLR.
5. ¿Qué es el procesamiento de lenguaje natural?
El Procesamiento del Lenguaje Natural es el campo de conocimiento de la Inteligencia Artificial que
se ocupa de la investigar la manera de comunicar las máquinas con las personas mediante el uso de
lenguas naturales, como el español, el inglés o el chino.
Virtualmente, cualquier lengua humana puede ser tratada por los ordenadores. Lógicamente,
limitaciones de interés económico o práctico hace que solo las lenguas más habladas o utilizadas en
el mundo digital tengan aplicaciones en uso.
Las lenguas naturales pueden expresarse de forma oral (mediante la voz), escrita (un texto) o por
signos. Obviamente, la expresión escrita está mucho más documentada y es más fácil de conseguir y
tratar que la oral o el lenguaje de signos. Por lo tanto, el Procesamiento del Lenguaje Natural está
mucho más avanzado en el tratamiento de textos escritos.
En teoría, cualquier lengua humana puede ser interpretada y tratada por un ordenador, aunque esto
en la práctica no se hace, dadas las limitaciones económicas o las escasas aplicaciones que tendría
interpretar las más de 3.000 lenguas catalogadas existentes en el mundo.
Modelos para procesamiento del lenguaje natural
Tratar computacionalmente una lengua implica un proceso de modelización matemática. Los
ordenadores solo entienden de bytes y dígitos y los informáticos codifican los programas
empleando lenguajes de programación como C, Python o Java.
Los lingüistas computacionales se encargan de la tarea de “preparar” el modelo lingüístico para que
los ingenieros informáticos lo implementen en un código eficiente y funcional. Básicamente, existen
dos aproximaciones generales al problema de la modelización lingüística:
Modelos Lógicos: gramáticas
Los lingüistas escriben reglas de reconocimiento de patrones estructurales, empleando un
formalismo gramatical concreto. Estas reglas, en combinación con la información almacenada en
diccionarios computacionales, definen los patrones que hay que reconocer para resolver la tarea
(buscar información, traducir, etc.).
Estos modelos lógicos pretenden reflejar la estructura lógica del lenguaje y surgen a partir de las
teorías de N. Chomsky en los años 50.
Modelos probabilísticos del lenguaje natural: basados en datos
La aproximación es a la inversa: los lingüistas recogen colecciones de ejemplos y datos (corpus) y a
partir de ellos se calculan las frecuencias de diferentes unidades lingüísticas (letras, palabras,
oraciones) y su probabilidad de aparecer en un contexto determinado. Calculando esta
probabilidad, se puede predecir cuál será la siguiente unidad en un contexto dado, sin necesidad de
recurrir a reglas gramaticales explícitas.
6. Es el paradigma de “aprendizaje automático” que se ha impuesto en las últimas décadas en
Inteligencia Artificial: los algoritmos infieren las posibles respuestas a partir de los datos observados
anteriormente en el corpus.
Componentes del procesamiento del lenguaje natural
A continuación, vemos algunos de los componentes del procesamiento del lenguaje natural. No
todos los análisis que se describen se aplican en cualquier tarea de PLN, sino que depende del
objetivo de la aplicación.
1. Análisis morfológico o léxico. Consiste en el análisis interno de las palabras que forman
oraciones para extraer lemas, rasgos flexivos, unidades léxicas compuestas. Es esencial para
la información básica: categoría sintáctica y significado léxico.
2. Análisis sintáctico. Consiste en el análisis de la estructura de las oraciones de acuerdo con el
modelo gramatical empleado (lógico o estadístico).
3. Análisis semántico. Proporciona la interpretación de las oraciones, una vez eliminadas las
ambigüedades morfosintácticas.
4. Análisis pragmático. Incorpora el análisis del contexto de uso a la interpretación final. Aquí
se incluye el tratamiento del lenguaje figurado (metáfora e ironía) como el conocimiento del
mundo específico necesario para entender un texto especializado.
Un análisis morfológico, sintáctico, semántico o pragmático se aplicará dependiendo del objetivo de
la aplicación. Por ejemplo, un conversor de texto a voz no necesita el análisis semántico o
pragmático. Pero un sistema conversacional requiere información muy detallada del contexto y del
dominio temático.