Está en la página 1de 6

Introducción

Lenguaje
Un Lenguaje es un sistema de comunicación basado en reglas y que es utilizado en determinado
contexto. Un Idioma es un lenguaje oral humano.

Un Lenguaje formal es un lenguaje creado a partir de un conjunto de especificaciones formales. A


diferencia de otros lenguajes, que evolucionan y cambian con el tiempo, los lenguajes formales
permanecen invariantes. Ejemplo de lenguajes formales son los lenguajes de programación.

Existen diversidad de lenguajes, cada uno de ellos utilizado por una comunidad específica. Cuando
un usuario X1, que solo conoce el lenguaje L1, desea comunicarse con un usuario Y1, que solo
conoce el lenguaje L2, entonces uno de los 2 deberá aprender el lenguaje del otro. Esto es
impráctico si crece el número de usuarios que deseen comunicarse o si crece el número de
Lenguajes.

Una solución práctica a este problema es la presencia de un traductor, es decir, alguien que
conozca ambos lenguajes y que sirva de intermediario entre ambas comunidades, traduciendo de
un lenguaje al otro.

Lenguaje de Programación
Un Lenguaje de Programación (LP) es un lenguaje formal diseñado para especificar un conjunto de
instrucciones, conocido como programa, a un computador. Existen 2 paradigmas fundamentales
de Programación:

Lenguajes y Compiladores – Jaime Pariona Quispe


1. Programación Declarativa: Se describe el problema a través de reglas, propiedades y
objetivos que deben cumplirse, pero sin especificar los detalles de la implementación. Por
ejem en SQL se puede dar: SELECT * FROM ALUMNOS WHERE Edad < 19
Ahí especificamos lo que queremos, y bajo que condiciones, pero no decimos como
obtenerlo.
Existen especializaciones como por ejemplo:
• Programación Funcional, basado en funciones matemáticas
• Programación Lógica, basado en lógica de predicados.
• Programación con Restricciones, basado en ecuaciones sobre las restricciones.

2. Programación Imperativa: Se describe la solución al problema a través de un conjunto de


instrucciones o pasos de solución. Se tienen básicamente 2 variantes:
• Standard, ejem Lenguaje C
• Orientado a Objetos, ejem Lenguaje C++

Traductor
Un traductor es un modulo de software que a partir de un programa fuente (PF), perteneciente a
un lenguaje fuente, obtiene un programa objeto (PO), perteneciente a un lenguaje objeto, el cual
es equivalente al programa fuente en contenido de acción, es decir, tanto el PF como el PO
especifican las mismas acciones, solo que en lenguajes diferentes .

Cuando el lenguaje objeto es el lenguaje maquina, el traductor se conoce como compilador. La


mayoría de traductores implementados son compiladores por lo que frecuentemente se usa solo
el termino compilador.

Cuando un traductor no genera programa objeto, sino que ejecuta directamente las instrucciones
del programa fuente, entonces lo conocemos como un intérprete.

También se puede tener una forma mixta, en la cual se traduce a un código intermedio y mediante
una maquina virtual se interpreta dicho código intermedio. Por ejm bytecode en Java.

Lenguajes y Compiladores – Jaime Pariona Quispe


En el ámbito de la computación cuando se hace referencia al traductor, generalmente se está
refiriendo a un compilador, por lo que el uso del término Traductor es frecuentemente
reemplazado por el de Compilador.

Proceso de Traducción:
La traducción se hace en base al análisis del contenido de acción presente en el PF, esta
información se analiza y almacena, para luego generar la información equivalente pero
especificada en el lenguaje objeto.

Adicionalmente podemos considerar que el traductor tiene dos bloques básicos que se pueden
describir también como Front-End y Back-End
• En el Front-End se analiza el PF, se le valida y se genera un código intermedio el cual es
independiente de las características hardware de la maquina destino.
• En el Back-End se efectúa la optimización y conversión a código máquina.

Esta separación permite desarrollar un Front-End único que permite luego implementar diferentes
Back-End para diferentes arquitecturas de computador.

Módulos de un traductor

Los procesos fundamentales de un traductor se pueden realizar a través de módulos que ya han
sido estandarizados funcionalmente dentro del traductor.

Esto comprende:

Tiempo de traducción, es el tiempo transcurrido desde que se inicia el proceso de traducción


hasta que se genera el programa objeto. Este tiempo es la suma de todos los tiempos que el
traductor realiza cuando ejecuta sus diversos módulos.

Tiempo de Edición --- > Tiempo de Traducción --- > Tiempo de Ejecución

Ejemplo de Traduccion:

a) x = a + b; // Codigo fuente

Lenguajes y Compiladores – Jaime Pariona Quispe


b) ID, OPR, ID, OPR, ID // Analisis Lexicografico, obtención de simbolos
c) ID -- > ID + ID // Analisis Sintactico, verificación de la estructura formal
d) (1) +, a, b
(2) =, x, (1) // Codigo intermedio, tercetos
e) mov ax, [a]
add ax, [b]
mov [x], ax // Codigo maquina, assembler

Precompilador, es un modulo que recibe el PF y lo prepara para la compilación propiamente


dicha, esta precompilacion produce un PF con una serie de referencias ya resueltas, archivos ya
incluidos, comentarios eliminados, etc. Por ejem.

#define PI 3.1415 ……… Contenido …………..


#include <datos.h> ……… de datos.h …………..
// datos incluidos ---- > precompilador ---- > main() {
main() { float x = 3.1415;
float x = PI; cout << x + 3.1415;
cout << x + PI; }
}
Compilador incremental, es aquel que solo compila la parte que ha sido modificada, utilizando
para el resto del PF la compilación anterior.

Traductor embebido, en el contexto actual se tienen programas que están conformados por
bloques que pertenecen a lenguajes diferentes. Cada bloque es entonces compilado o
interpretado por el compilador del lenguaje correspondiente.

Por ejm, en una pagina web HTML, podemos tener bloques que son de PHP, Jscript y otros. Cada
bloque será manejado por su traductor correspondiente.

Compilador JIT (Just In Time), aquel que es requerido en tiempo de ejecucion para compilar
modulos de PF específicos.

Lenguajes Formales
Es todo lenguaje cuyos símbolos básicos (alfabeto), así como las reglas para construir sentencias
(cadenas de texto usando símbolos del alfabeto) están definidos por reglas formales. Se les
encuentra en las matemáticas y la ciencia de la computación.

Ejm. { numero binario par}


Alfabeto = {0, 1}
Reglas formales: - combinación en cualquier orden y grado de 0 y 1
- debe terminar en 0

Lenguajes y Compiladores – Jaime Pariona Quispe


Formalización de un Lenguaje, Las reglas que definen a un lenguaje formal, deben ser claramente
especificadas y bajo una notación formal. Existen diversos mecanismos para formalizar un
lenguaje, como por ejemplo:

1. Expresiones Regulares
2. Autómatas
3. Gramáticas

Ejm. L = {numero entero} // definición literal


L = { 1, 2, 3, 4, 5, … } // definición por extensión
L = { digito m / m>=1, digito={0,1,2,…,9} } // definición formal por comprensión

Componentes de un Lenguaje
El componente fundamental en todo lenguaje es el Alfabeto, el cual definimos como un conjunto
finito de símbolos. Por ejemplo para el lenguaje binario el alfabeto es { 0, 1}

La noción de símbolo es de mayor nivel que la de carácter o digito. El símbolo es indivisible, por
ejemplo el símbolo if corresponde a una palabra reservada, si lo descomponemos en los
caracteres i y f, deja de ser un símbolo de palabra reservada.

Concatenación, es la operación básica entre símbolos. Consiste en una secuenciación de


símbolos, es decir que a través de la concatenación se obtiene una cadena de símbolos. Se
representa por un punto, el cual puede obviarse cuando sea sobreentendido.

Ejm a . b = ab // Cadena de simbolos “ab”


ab . xy = abxy // La concatenación de dos cadenas es otra cadena.
{a, b} . { 1, 2} = { a1, a2, b1, b2} // La concatenación de 2 conjuntos es un conjunto

La longitud de una cadena es el numero de simbolos que la conforman. Ejm │ ab │ = 2

Símbolo Nulo, es aquel símbolo cuya longitud es 0. Se representa como λ , no afecta a la


concatenación.
X.λ = λ.X = X

Observación: Un lenguaje puede ser visto como un conjunto. El lenguaje es el conjunto de todas
las cadenas formadas con símbolos del alfabeto y que cumplen el mismo patrón de formación.

Ejm. L1 = { números binarios} = { 1101, 0011, 0101, 1010, ….. }


L2 = { números binarios pares} = { 1100, 010, 1110, 10, …. }
L3 = { nombres de variables} = { a1, j, suma, índice, r21, …. }

Lenguajes y Compiladores – Jaime Pariona Quispe


El problema de la pertenencia, consiste en que dada una cadena candidata debemos determinar
si pertenece o no al lenguaje. Esto se resuelve aplicando la definición formal del lenguaje a la
cadena candidata, si la cumple decimos que es una sentencia del lenguaje, si no la cumple
entonces será una cadena cualesquiera, no perteneciente al lenguaje.

Ejm. Dado el lenguaje L = { a (bn a)m , m>=1, n>=0 } indicar cual(es) de las siguientes cadenas
candidatas pertenece al lenguaje:
aabba, abaa, ababa, abbaaa, babbaa

Operaciones sobre Lenguajes Formales

1. Concatenación L1 L2 produce un lenguaje con elementos xy tal que x Є L1 e y Є L2


2. Intersección L1 & L2 produce un lenguaje cuyos elementos están contenidos tanto en L1
como en L2
3. Union L1 │ L2 produce un lenguaje cuyos elementos están ya sea en L1 o en L2
4. Complemento ~L1 produce un lenguaje con el mismo alfabeto de L1 pero cuyos
elementos no están en L1
5. Division L1 / L2 produce un lenguaje cuyos elementos son x y además el elemento y está
en L2 y el elemento xy está en L1
6. El cierre positivo L1+ produce un lenguaje con elementos de la forma x1x2..xn, n>=1 tal
que xi se encuentra en L1
7. El cierre simple L1* es similar a L1+, pero añadiéndole λ

Ejemplos:

Dados A = { a, b}, B = {1, 2, 3}, C = { enteros múltiplos de 3} y D = { enteros pares} tenemos:

1. Concatenación X = L1 . L2 = { a1, a2, a3, b1, b2, b3}


2. Intersección C & D = { 6, 12, 18, 24, ….. }
3. Unión A │ B = { a, b, 1, 2, 3}
4. Complemento ~D = { enteros impares}
5. División, dado X = A . B entonces X / D = { a, b }

Ejercicios

1. De algunos ejemplos de lenguajes Naturales.


2. Existen Lenguajes Naturales no creados o utilizados por el ser humano? De un ejemplo.
3. Si decimos “Lenguajes de Programación”, por qué no podemos decir “Idiomas de
Programación”
4. Que es un “dialecto”

Lenguajes y Compiladores – Jaime Pariona Quispe

También podría gustarte