Sie sind auf Seite 1von 12

Captulo 1

Principios de diseo de lenguajes


Objetivo
El alumno describir los procedimientos y gramticas empleadas en el diseo de los lenguajes
de programacin.
Figura 1.1: Preguntas incmodas
1.1. Los lenguajes en la estructura y operacin de una compu-
tadora
Un programa es una serie de instrucciones que una computadora puede entender y ejecutar.
Un lenguaje de programacin es un lenguaje articial utilizado para escribir dichos programas.
Posteriormente stos se introducirn en la memoria de la computadora y ejecutar todas las
operaciones que se incluyan.
Los lenguajes de programacin constan de:
Vocabulario del lenguaje, un conjunto nito de smbolos.
Sintaxis, un conjunto nito de reglas para la construccin de las sentencias correctas.
Semntica, que asocia un signicado a cada posible instruccin.
1
CAPTULO 1. PRINCIPIOS DE DISEO DE LENGUAJES 2
As, podemos decir que un lenguaje de programacin consta de un conjunto de smbolos y un
conjunto de reglas vlidas para componerlos, de manera que formen un mensaje con signicado
para la computadora.
Al disear un lenguaje de programacin, es necesario considerar tres aspectos bsicos:
La estructura y operacin de la computadora dnde se van a ejecutar los programas escritos
en el lenguaje.
El modelo de ejecucin o computadora virtual con que se implementar el lenguaje en la
mquina real.
El modelo de cmputo (paradigma) que el lenguaje soportar.
Un lenguaje de programacin se implementa construyendo un traductor, el cual lee los programas
expresados en dicho lenguaje y entrega programas en lenguaje de mquina que pueden ser ejecuta-
dos directamente por alguna computadora, la computadora que ejecuta los programas traducidos
puede ser una computadora fsica: hardware o una computadora virtual: software.
Figura 1.2: Arquitectura von Neumann
1.2. Computadoras virtuales
Para facilitar la programacin, lo comn es expresar los programas en un lenguaje de alto
nivel, el cual es muy cercano al lenguaje del programador y muy distante del lenguaje de mquina
(bajo nivel). El lenguaje de mquina es distinto para cada tipo de hardware.
El problema que se enfrenta al implementar un lenguaje es, cmo hacer que se ejecuten progra-
mas en un lenguaje de alto nivel en diferentes computadoras, independientemente de su lenguaje
de mquina. Para resolver este problema existen dos soluciones bsicas: traduccin (compilacin)
y simulacin por software.
CAPTULO 1. PRINCIPIOS DE DISEO DE LENGUAJES 3
Figura 1.3: Teclado virtual
1.2.1. Traduccin (compilacin)
Se puede construir un traductor que toma programas en el lenguaje de alto nivel y produce
programas equivalentes en el lenguaje de mquina de la computadora real.
Un traductor es un procesador de lenguajes que toma programas en un cierto lenguaje fuente
y los transforma en programas funcionalmente equivalentes codicados en otro lenguaje objeto.
Por ejemplo: ensambladores y compiladores.
Figura 1.4: Proceso de compilacin
1.2.2. Simulacin por software
En lugar de traducir los programas de un lenguaje de alto nivel a un lenguaje de mquina,
se puede simular una computadora cuyo lenguaje de mquina sea el lenguaje de alto nivel. Para
hacer esto se construye un conjunto de programas en el lenguaje de mquina de la computadora
antrin que representan los algoritmos (y estructuras de datos) necesarios para la ejecucin de
programas en el lenguaje de alto nivel.
CAPTULO 1. PRINCIPIOS DE DISEO DE LENGUAJES 4
Figura 1.5: Interpretacin directa
A diferencia de un traductor, el simulador ejecuta el programa directamente, no lo traduce.
En la prctica pocas veces se usan la traduccin o la simulacin puras, mas bin se trabaja con
una combinacin de ambas.
Un programa se descompone en varios subprogramas independientes que se compilan por
separado, luego en la fase de carga se combinan con otras rutinas (operaciones simuladas por
software) en tiempos de ejecucin, y se ejecuta por simulacin.
Traductor
(software)
Cdigo
fuente
Enlazador
Traductor
(software)
Cdigo
fuente
Errores de
sintxis
Errores de
sintxis
Cdigo
objeto
Cdigo
objeto
Libreras
auxiliares
en tiempo
de ejecucin
Cdigo
ejecutable
Computadora virtual
(Simulada completa
o parcialmente)
Intrprete
(hardware o
software)
Operaciones
(hardware o
software)
Datos de
ejecucin
Salida de
resultados
Mensajes
de error
TRADUCCIN CARGA EJECUCIN
Figura 1.6: Estructura de implementacin de un lenguaje de programacin
Una cuestin importante en la implementacin de un lenguaje es saber si la representacin
del programa durante su ejecucin ser la del lenguaje de mquina de la computadora real o una
virtual. Esto establece dos tipos de implementaciones de lenguajes:
CAPTULO 1. PRINCIPIOS DE DISEO DE LENGUAJES 5
1. Compilados. Los programas en estos lenguajes se traducen al lenguaje de mquina de
la computadora real antes de ejecutarse, y la simulacin se usa en las rutinas auxiliares en
tiempo de ejecucin que simulan operaciones primitivas que no tienen representacin directa
en el lenguaje de mquina. Por ejemplo: C, C++, Pascal, Ada, FORTRAN, etc.
2. Interpretados. El traductor produce un cdigo intermedio, y un software intrprete lo
ejecuta ya que el hardware no lo puede ejecutar directamente. Por ejemplo: LISP, Prolog,
Smalltalk, ML, Java, Python, BASIC, etc.
1.2.3. Jerarqua de computadoras
La computadora virtual que se utiliza cuando se hace un programa en algn lenguaje de alto
nivel, esta formada por una jerarqua de computadoras virtuales.
La gura siguiente muestra la jerrqua de computadoras para un programa desarrollado en
C.
Computadora de !"#$%"#& reaI
(Implementada por dispositivos fsicos)
Computadora virtuaI de '#(%"#&
(Instrucciones en lenguaje de mquina implementadas
por microcdigo ejecutado por la computadora real)
Computadora virtuaI deI system operativo
(Implementadas por programas en el lenguaje mquina
que se ejecutan en la computadora virtual de !"#$%"&)
Computadora virtuaI de C
(Implementadas por rutinas de libreras auxiliares en tiempo
de ejecucin cargadas en el programa compilado)
Computadora virtuaI desarroIIada por eI programador
(Implementada por el modelo de ejecucin desarrollado en lenguaje
C, para ejecutarse en la computadora virtual de C)
Datos de entrada Datos de salida
Figura 1.7: Jerarqua de computadoras virtuales de un programa en C
Tarea:
Leer el artculo Computational Thinking en http://bit.ly/1fD8eWT y hacer un breve co-
mentario (1 cuartilla por integrante del equipo), no resumen, puedes hacer referencia entre
otros muchos a los siguientes puntos:
Qu relacin tiene con el curso?
Ests de acuerdo con lo que se expone?
Todas las personas piensan que cualquier persona se beneciara al saber algo de sus
distintos campos de conocimiento?
CAPTULO 1. PRINCIPIOS DE DISEO DE LENGUAJES 6
1.3. Sintaxis
La sintaxis de un lenguaje de programacin es el aspecto que ofrece el programa, proporcio-
nar las reglas de sintaxis para un lenguaje de programacin signica decir como se escriben los
enunciados, declaraciones y otras construcciones de lenguaje.
1.4. Semntica bsica
La semntica de un lenguaje de programacin es el signicado que se le da a las diversas
construcciones sintcticas, la semntica de un lenguaje de programacin est muy relacionada con
el paradigma que implementa dicho lenguaje.
Cuando un lenguaje de programacin se implementa en una computadora particular, primero
se determina la computadora virtual que representa una interpretacin de la semntica del lenguaje
y luego se construye esa computadora virtual a partir de los elementos de hardware y software
que suministra la computadora subyacente. Por ejemplo, se puede determinar que una operacin
de suma de enteros se implemente directamente por hardware y que una raz cuadrada se simule
en la computadora virtual.
Tambin se debe determinar qu se va a hacer durante la traduccin del programa y qu
durante su ejecucin. Ya que algunas representaciones de estructuras de datos u operaciones en
la computadora virtual, slo se pueden usar si el traductor las deni dentro de la estructura en
tiempos de ejecucin.
Figura 1.8: Sintaxis y semntica de lenguajes
Programa:
El cifrado Atbash realiza una sustitucin invirtiendo el orden del alfabeto del texto en claro.
Por tanto en espaol, la A ser sustituida por la Z, la B por la Y , etc. Desarrollar un
programa que implemente este mtodo para cifrar y descifrar mensajes.
CAPTULO 1. PRINCIPIOS DE DISEO DE LENGUAJES 7
Figura 1.9: Alice & Bob
1.5. Enlace y tiempo de enlace
Se denomina enlace de un elemento de programa a una caracterstica o propiedad particular a
la eleccin de dicha propiedad de entre un conjunto de propiedades posibles. El momento durante
la formulacin o procesamiento del programa en el que se hace est eleccin se conoce como tiempo
de enlace de esa propiedad para ese elemento.
Los lenguajes de programacin cuentan con distintas variedades de enlaces y tiempos de enlace.
1.5.1. Tiempo de ejecucin
Enlaces que se llevan a cabo durante la ejecucin de programa, como son los enlaces de las
variables a sus valores o localidades particulares de almacenamiento. Hay dos categoras:
1. Al entrar a un subprograma o bloque. En casi todos los lenguajes las clases importan-
tes de enlaces slo pueden ocurrir en el momento de entrar a un subprograma durante la
ejecucin. Por ejemplo, en C y Pascal el enlace de parametros formales a reales slo puede
ocurrir al entrar a un subprograma.
2. En puntos arbitrarios durante la ejecucion. Ciertos enlaces pueden ocurrir en cualquier
punto durante la ejecucin de un programa. Por ejemplo, el enlace de variables a valores a
travs de asignacin, o como en LISP y ML que permiten enlazar nombres a localidades de
almacenamiento en puntos arbitrarios del programa.
1.5.2. Tiempo de traduccin o compilacin
1. Enlaces elegidos por el programador. El programador elige nombres de variables y
tipos de las mismas, estructuras de enunciados, etc., que representan enlaces durante la
traduccin.
CAPTULO 1. PRINCIPIOS DE DISEO DE LENGUAJES 8
2. Enlaces elegidos por el traductor. Ciertos enlaces son elegidos por el traductor del
lenguaje sin que el programador intervenga. Por ejemplo, la asignacin de las localidades
relativas de almacenamiento de un objeto de datos.
3. Enlaces elegidos por el cargador. Un programa se compone generalmente de varios
subprogramas que se deben de fusionar en un programa ejecutable nico. El traductor enlaza
variables a direcciones relativas dentro del espacio de almacenamiento designado para cada
subprograma. Durante el tiempo de carga (o tiempo de vinculacin, link) las direcciones
relativas deben de ser asignadas a las direcciones reales de la mquina real donde se ejecuta
el programa.
1.5.3. Tiempo de implementacin del lenguaje.
Ciertos aspectos de la denicin de un lenguaje pueden ser iguales para todos los programas
que se ejecutan usando una implementacin particular del mismo, pero pueden variar entre las
distintas implementaciones. Por ejemplo, s un programa usa una caracterstica que se ha denido
durante la implementacin, no se puede asegurar que correr en otra implementacin del mismo
lenguaje.
1.5.4. Tiempo de denicin del lenguaje.
Casi toda la estructura de un lenguaje de programacin se ja cuando el lenguaje se dene, en
el sentido de la especicacin de las alternativas disponibles para un programador cuando escribe
un programa. Por ejemplo, todos los tipos de datos, estructuras de programa, etc., suelen jarse
en el tiempo de denicin del lenguaje.
1.5.5. Importancia de los tiempos de enlace
Muchas de las diferencias ms importantes y sutiles entre lenguajes implican diferencias en
cuanto a tiempos de enlace. Se dice que un lenguaje, donde casi todos los enlaces se efectan
durante la traduccin y al principio del procesamiento de un programa, tiene enlace temprano;
un lenguaje con enlace tardo, demora casi todos los enlaces hasta el tiempo de ejecucin.
Las ventajas y desventajas del enlace temprano respecto al enlace tardo giran en torno al
conicto entre eciencia y exibilidad.
En lenguajes donde se persigue la eciencia de ejecucin, como FORTRAN, Pascal y C,
es comn proyectar el lenguaje de manera que se puedan efectuar tantos enlaces como sea
posible durante la traduccin.
En los casos donde la exibilidad es lo se persigue, como en ML y LISP, casi todos los enlaces
se retrasan hasta el tiempo de ejecucin para que puedan adaptarse a los datos introducidos
durante la ejecucin.
En un lenguaje diseado para ofrecer a la vez ejecucin eciente y exibilidad, como Ada,
se suele disponer de mltiples opciones que permiten elegir tiempos de enlace.
Un lenguaje se disea de tal modo que un enlace particular se puede efectuar, por ejemplo, durante
la traduccin, pero el momento efectivo en el cual el enlace se lleva a cabo est denido de hecho
slo por la implementacin del lenguaje.
CAPTULO 1. PRINCIPIOS DE DISEO DE LENGUAJES 9
1.6. Paradigmas de lenguajes
Adems de conocer la mquina virtual que va a proporcionar el almacenamiento de datos en
tiempo de ejecucin y las operaciones para la ejecucin de un programa traducido y el hardware
dnde se va a correr realmente el programa traducido a cdigo ejecutable, se tiene que analizar el
modelo de computacin que maneja el lenguaje de programacin. Es decir, el modelo de compu-
tacin se plantea preguntas como: Cmo se ejecuta el programa? Qu clase de construcciones
suministra el programa?
Existen dos modelos bsicos de computacin que describen a los lenguajes de programacin
actuales: el imperativo y el declarativo.
Lenguajes de
Programacin
Imperativos Declarativos
Estructurados
Orientados a
Objetos
Funcionales Lgicos
C
Pascal
COBOL
php
... C++
Java
C#
php5
...
Haskell
LISP
Dr. Scheme
Dr. Racket
...
Prolog
CLIPS
...
Python
Figura 1.10: Paradigmas de lenguajes de programacin
1.6.1. Lenguajes imperativos
Los lenguajes imperativos o de procedimiento son lenguajes controlados por mandatos u orien-
tados a enunciados (instrucciones).
Un programa se compone de una serie de enunciados, y la ejecucin de cada enunciado hace
que el intrprete cambie el valor de una localidad o ms en su memoria, es decir, que pase a un
nuevo estado.
La memoria consiste en una coleccin de celdas, y la ejecucin del enunciado (por ejemplo,
sumar dos variables para obtener una tercera) se puede representar como acceder a las localidades
de memoria (las celdas), combinar los valores contenidos en las celdas en alguna forma y guardar
el resultado en la nueva localidad. El desarrollo de programas consiste en construir los estados de
mquina sucesivos (valores en las celdas) que se necesitan para llegar a la solucin.
En general, este modelo procede del hardware de la computadora convencional que ejecuta
instrucciones en forma secuencial (arquitectura von Neumann).
CAPTULO 1. PRINCIPIOS DE DISEO DE LENGUAJES 10
1.6.1.1. Lenguajes estructurados en bloques (procedimientos)
Un lenguaje con bloques de programa, divide el estado en bloques que representan subrutinas
y datos comunes. Los bloques se pueden pensar como un archivo plano, donde cada bloque sigue
a sus predecesores.
El trmino estructuras en bloques se reere a los mbitos anidados. Es decir, los bloques
pueden estar anidados dentro de otros bloques, y pueden contener sus propias variables. El estado
representa una pila con una referencia al bloque actualmente activo en la parte superior. En los
lenguajes estructurados en bloques, el procedimiento es el principal bloque de construccin de los
programas.
Figura 1.11: Programa estructurado
1.6.1.2. Lenguajes orientados a objetos
Son aquellos lenguajes basados en objetos que soportaban clases de objetos y la herencia de
atributos de un objeto padre por parte de sus hijos. Un objeto es un grupo de procedimientos que
comparten un estado. Puesto que los datos son tambin parte de un estado, los datos y todos los
procedimientos o funciones que se le aplicarn son encapsulados en un solo objeto.
1.6.1.3. Lenguajes para la programacin concurrente
La programacin concurrente est asociada con ms de un CPU funcionando simultneamente
en paralelo, compartiendo o no datos. Sin embargo, los CPU mltiples no son esenciales para este
paradigma. Lo esencial es que el trabajo sobre un problema en particular pueda ser compartido.
La programacin concurrente se divide en dos categoras, sistemas distribuidos y sistemas con
memoria compartida.
1.6.1.3.1. Sistemas distribuidos El trmino distribuido se reere a lenguajes para sistemas
acoplados dbilmente que soportan que un programa se ejecute de manera simultnea y se comu-
nique a travs de paso de mensajes mediante un canal de comunicacin, tal como un enlace de
punto a punto o una red de rea local.
1.6.1.3.2. Sistemas de memoria compartida o fuertemente acoplados Permite que ms
de un proceso en ejecucin tenga acceso a la misma ubicacin de memoria. Un lenguaje asociado
con el sistema debe sincronizar el uso compartido de memoria, de modo que slo un proceso escriba
CAPTULO 1. PRINCIPIOS DE DISEO DE LENGUAJES 11
a una variable compartida a la vez, y de modo que un proceso pueda esperar hasta que ciertas
condiciones se satisfagan por completo antes de continuar la ejecucin. La memoria compartida
tiene la ventaja de la velocidad, porque no se necesita pasar mensajes.
1.6.2. Lenguajes declarativos
Un lenguaje declarativo es aquel en el que un programa especica una relacin o funcin.
Cuando se programa en el estilo declarativo, no se hacen asignaciones a variables del programa. El
intrprete o compilador para el lenguaje en particular administra la memoria independientemente
del programador.
1.6.2.1. Lenguajes Funcionales
Los lenguajes funcionales en vez de examinar la serie de estados a travs de los cuales debe
pasar la mquina para obtener una respuesta, se preguntan: Cul es la funcin que se debe aplicar
al estado de mquina inicial accediendo al conjunto inicial de variables y combinndolas en formas
especcas para obtener una respuesta?
El desarrollo de programas procede a travs del desarrollo de funciones a partir de funciones
previamente desarrolladas para construir funciones ms complejas que manipulan el conjunto
inicial de datos hasta que la funcin nal se puede usar para calcular una respuesta a partir de
los datos iniciales.
As, la programacin funcional proporciona la capacidad para que un programa (funcin) se
modique a s mismo, es decir, aprenda. LISP , Scheme y ML son lenguajes funcionales manejan
este modelo de programacin.
1.6.2.2. Lenguajes de Programacin Lgica
La programacin lgica est basada en el clculo de predicados, el cual proporciona axiomas
y reglas de modo que se pueden deducir nuevos hechos a partir de otros hechos conocidos.
Un programa basado en la lgica se compone de una serie de axiomas o hechos, reglas de
inferencia y un teorema o cuestin por demostrarse. La salida es verdadera si los hechos soportan
o apoyan la cuestin, y es falsa en el caso contrario. Prolog es el ejemplo tpico de este tipo de
lenguajes.
1.6.3. Lenguajes de base de datos
Las propiedades que distinguen a los lenguajes diseados para tratar con bases de datos son
la persistencia y la administracin de cambios. Las entidades de base de datos no desaparecen
despus de que naliza un programa, sino que permanecen activas durante tiempo indenido
como fueron estructuradas originalmente. Puesto que la base de datos, una vez organizada, es
permanente, estos lenguajes tambin deben soportar los cambios. Los datos pueden cambiar y as
tambin pueden hacerlo las relaciones entre objetos o entidades de datos.
Un sistema de administracin de base de datos incluye un lenguaje de denicin de datos
(DDL) para describir una nueva coleccin de hechos, o datos, y un lenguaje de manipulacin de
datos (DML) para la interaccin con las bases de datos existentes. SQL es un ejemplo de este tipo
de lenguajes.
CAPTULO 1. PRINCIPIOS DE DISEO DE LENGUAJES 12
Tarea:
Realizar una lista de 30 lenguajes de programacin e indicar qu paradigma(s) de programa-
cin implementa, si realiza enlace temprano o tardo, as como si es compilado o interpretado.

Das könnte Ihnen auch gefallen