Lenguajes de programaci¶on - Universidad América...

32
Cap´ ıtulo 5 Lenguajes de programaci´ on 5.1 Lenguajes de bajo y alto nivel ................... 120 5.2 Descripci´on de los lenguajes de programaci´ on .......... 131 5.3 Procesadores de lenguajes ..................... 141 5.4 Ejercicios .............................. 148 5.5 Comentarios bibliogr´ aficos ..................... 149 Un lenguaje de programaci´ on es un lenguaje artificial, dise˜ nado para representar expresiones e instrucciones de forma inteligible para las com- putadoras. Los lenguajes de programaci´ on son, en gran medida, comparables a los lenguajes naturales: sus s´ ımbolos b´ asicos constituyen su alfabeto , y con ellos se construye el vocabulario del lenguaje, cuyos elementos se llaman tokens . Estos tokens se combinan de acuerdo con las reglas sint´ acticas del lenguaje, formando expresiones y sentencias cuyo signifi- cado viene dado por la sem´ antica del lenguaje. Los lenguajes de programaci´ on son sin embargo considerablemente m´as simples que los naturales en su sintaxis y, especialmente, en su sem´antica. En este cap´ ıtulo se introducen distintos aspectos relacionados con los lenguajes de programaci´ on. En primer lugar, hacemos una presen- taci´on evolutiva, mostrando las aportaciones hechas por los lenguajes

Transcript of Lenguajes de programaci¶on - Universidad América...

Page 1: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

Capıtulo 5

Lenguajes de programacion

5.1 Lenguajes de bajo y alto nivel . . . . . . . . . . . . . . . . . . . 1205.2 Descripcion de los lenguajes de programacion . . . . . . . . . . 1315.3 Procesadores de lenguajes . . . . . . . . . . . . . . . . . . . . . 1415.4 Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1485.5 Comentarios bibliograficos . . . . . . . . . . . . . . . . . . . . . 149

Un lenguaje de programacion es un lenguaje artificial, disenado pararepresentar expresiones e instrucciones de forma inteligible para las com-putadoras.

Los lenguajes de programacion son, en gran medida, comparablesa los lenguajes naturales: sus sımbolos basicos constituyen su alfabeto,y con ellos se construye el vocabulario del lenguaje, cuyos elementosse llaman tokens. Estos tokens se combinan de acuerdo con las reglassintacticas del lenguaje, formando expresiones y sentencias cuyo signifi-cado viene dado por la semantica del lenguaje.

Los lenguajes de programacion son sin embargo considerablementemas simples que los naturales en su sintaxis y, especialmente, en susemantica.

En este capıtulo se introducen distintos aspectos relacionados conlos lenguajes de programacion. En primer lugar, hacemos una presen-tacion evolutiva, mostrando las aportaciones hechas por los lenguajes

Page 2: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

120 Capıtulo 5. Lenguajes de programacion

direccion contenido. . . . . .

0000 0000 0010 0010 0000 0000 11010000 0000 0011 0000 0000 0000 11000000 0000 0100 0101 0000 0000 11010000 0000 0101 1100 0000 0000 10100000 0000 0110 0000 0000 0000 11010000 0000 0111 0101 0000 0000 11000000 0000 1000 0001 0000 0000 11010000 0000 1001 1101 0000 0000 00110000 0000 1010 0011 0000 0000 11010000 0000 1011 1110 0000 0000 ????0000 0000 1100 0000 0000 0000 1010???? ???? 1101 ???? ???? ???? ????

. . . . . .

Figura 5.1. Expresion de un programa en codigo maquina.

ensambladores y los de alto nivel y muy alto nivel, fuertemente orien-tados al problema. La descripcion de los lenguajes de programacion seefectua, cada vez en mayor medida, a traves de procedimientos formales,evitandose toda ambiguedad y facilitando el estudio de las propiedadesde los programas, por lo que estudiamos algunos de esos procedimien-tos. Finalmente, presentamos los programas procesadores de lenguajes,su funcion, sus tipos y los entornos de programacion, muy evolucionados,que facilitan hoy dıa las distintas fases de desarrollo de programas.

5.1 Lenguajes de bajo y alto nivel

5.1.1 Lenguajes orientados a la maquina

Hablando estrictamente, los unicos sımbolos que comprenden loscomputadores son dos: el cero y el uno. Combinandolos apropiada-mente, se forman las instrucciones, como se ha descrito en el capıtulo 3.

La interpretacion de estas instrucciones esta dirigida a componentesfısicos de la maquina subyacente, tales como el registro acumulador o

Page 3: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

5.1. Lenguajes de bajo y alto nivel 121

dir. contenido. . .

IN nCAR d

m1 RES nCOND m2

CAR nRES dALM n

GOTO m1m2 OUT n

ENDd 10n ?

. . .

Figura 5.2. Un programa en lenguaje ensamblador

las direcciones de los operandos. Por estas razones tan obvias, estosrudimentarios lenguajes se llaman lenguajes orientados a la maquina o,mas brevemente, lenguajes de maquina.

El programa de la figura 5.1 esta escrito en el lenguaje maquinadefinido en el capıtulo 3.

Resulta evidente que, aun siendo los lenguajes maquina el medio deexpresion natural para las computadoras, son ciertamente aparatosospara el programador humano que deba redactarlos, leer o modificar losprogramas escritos en ellos. Presentan ademas el inconveniente de noser transportables, esto es, no ser comprendidos por maquinas diferentes.Los lenguajes evolucionados han surgido para superar estas deficiencias.

El primer paso para hacer mas humana la programacion consistioen introducir el uso de identificadores nemotecnicos para referir instruc-ciones y nombrar las direcciones de los operandos mediante sımbolos enlugar de hacerlo mediante sus codigos binarios. Nacen ası los primeroslenguajes simbolicos. El programa de la figura 5.1 podrıa traducirse a

Page 4: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

122 Capıtulo 5. Lenguajes de programacion

un lenguaje simbolico como se indica en la figura 5.2.

Aunque el paso dado es importante, los lenguajes simbolicos con-sisten solo en una representacion mas inteligible de las instruccionesde maquina. El siguiente paso consistio en incorporar en los lengua-jes simbolicos macroinstrucciones, para representar secuencias de ins-trucciones de utilizacion frecuente. Estos lenguajes se conocen comoensambladores.

Enseguida se comprendio la necesidad de escribir programas que tra-dujeran textos escritos en ensamblador a textos escritos en lenguajemaquina. Estos programas traductores se llaman tambien ensambla-dores.

5.1.2 Lenguajes de alto nivel

A diferencia de los lenguajes orientados a la maquina, los lenguajesde alto nivel se componen de “terminos” y “frases” relacionados con elproblema en resolucion. Ası por ejemplo, una ecuacion de segundo gradoax2 + bx+ c = 0 se podrıa resolver en un lenguaje de alto nivel como seindica en la figura 5.3.

Por razones obvias, se dice que los lenguajes de alto nivel estan orien-tados al problema. Esta ventaja es doble: por un lado, permiten alprogramador concentrar su atencion sobre el problema, ignorando losdetalles propios de la maquina concreta que lo ha de resolver; por otraparte, como el discurso de los programas de alto nivel es independiente dela maquina, son altamente compatibles (transportables) entre maquinasdiferentes.

En la figura 5.4 se clasifican los lenguajes de programacion, de masevolucionados a mas cercanos a la maquina.

En los ultimos anos se ha desarrollado una generacion de lenguajesde muy alto nivel, que incorporan diversos mecanismos para aumen-tar su capacidad expresiva en algun aspecto. En el apartado siguienteintroducimos algunos de esos modelos.

Page 5: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

5.1. Lenguajes de bajo y alto nivel 123

. . .readln (a, b, c);discrim := sqr(b) - 4 * a * c;if discrim >= 0

then beginwriteln ((-b+sqrt(discrim))/(2*a));writeln ((-b-sqrt(discrim))/(2*a))

endelse begin

real := -b/(2*a);imag := sqrt(-discr)/(2*a);writeln(real, ’+’, imag, ’i’);writeln(real, ’-’, imag, ’i’);

end. . .

Figura 5.3. Fragmento de un programa en un lenguaje de alto nivel

lenguajes simbolicos

declarativos

de alto nivel

alto y muy alto nivel

ensambladores

lenguajes binarios

de maquina

bajo nivel

Figura 5.4. Distintos tipos de lenguajes de programacion.

Page 6: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

124 Capıtulo 5. Lenguajes de programacion

5.1.3 Paradigmas de programacion

Programacion imperativa—programacion declarativa

La forma tradicional de programar recibe el nombre de programacionimperativa, ya que un programa no es mas que una secuencia de ordeneso instrucciones que debıan ser ejecutados por el computador. Este mo-delo de computacion ha influido fuertemente en la naturaleza de loslenguajes de programacion; aunque la evolucion de estos ha permitidoesconder muchas caracterısticas de bajo nivel, los lenguajes convencio-nales todavıa presentan un estilo de programacion basado en dotar alcomputador de procedimientos para resolver problemas, diciendole comose resuelven. Este paradigma de programacion obliga al programador atener siempre presentes los detalles particulares del computador que eje-cutara sus programas.

Algunos de los lenguajes imperativos mas difundidos en la actualidadson el COBOL, BASIC, FORTRAN, Pascal, Modula 2 y C.

Una de las opciones para hacer mas simple el trabajo de programarconsiste en separar al programador del modelo computacional subya-cente. De este modo se podra concentrar en el desarrollo del programacomo una especificacion clara y concisa de la respuesta a un problema.Al elegir esta solucion se esta optando por un estilo declarativo de pro-gramacion, llamado ası porque lo que se hace es “declarar” (especificar)el problema que se quiere resolver en lugar de proporcionar la secuenciade acciones que el computador debe ejecutar para hallar la respuesta.

En lugar de indicar como operar, en programacion declarativa seindica que resolver. Por lo tanto, los lenguajes declarativos estan mascerca del enunciado que de la resolucion propiamente dicha. Por eso seles considera lenguajes de muy alto nivel.

Dentro del paradigma de programacion declarativa se han desarro-llado dos enfoques: la programacion funcional y la programacion logica.

Page 7: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

5.1. Lenguajes de bajo y alto nivel 125

raıces(a,b,c) =let discr ≡ sqr(b) - 4 * a * cin if discr ≥ 0

then ((-b+sqrt(discr))/(2*a),(-b-sqrt(discr))/(2*a))else let (real, imag) ≡ (-b/(2*a), sqrt(-discr)/(2*a))

in ((real,‘+’,imag,‘i’),(real,‘-’,imag,‘i’))

Figura 5.5.

Programacion funcional

La programacion en un lenguaje funcional consiste en construir fun-ciones que el computador debe evaluar. La tarea primordial del pro-gramador es la construccion de una funcion que resuelva un problemadado; esta funcion puede depender de otras funciones subsidiarias y estadependencia se expresa en una notacion que obedece los principios ma-tematicos elementales. El papel del computador no es otro que el deevaluar las funciones e imprimir los resultados. Esta caracterıstica hapermitido que los lenguajes funcionales no dependan de ningun modeloparticular de arquitectura, en contraste con la mayorıa de los lenguajesimperativos.

La programacion funcional tiene sus raıces en la logica y en las ma-tematicas. En los programas funcionales se hace uso de conceptos ynotaciones familiares a toda persona que tenga conocimientos elementa-les de matematicas; de hecho, la derivacion de programas funcionales apartir de su especificacion se suele realizar mediante razonamiento ecua-cional (aplicando las ecuaciones que definen las funciones implicadas enel programa).

Un programa funcional puede interpretarse, bien como un conjuntode definiciones (declaraciones) de propiedades o bien como un conjuntode reglas de computacion. La primera interpretacion la realiza el pro-gramador que esta especificando (declarando) el problema, diciendo quese busca en lugar de como se encuentra; por el contrario, el computador

Page 8: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

126 Capıtulo 5. Lenguajes de programacion

entiende el programa como un conjunto de reglas de reescritura que lepermitiran, finalmente, proporcionar la solucion del problema.

Los lenguajes funcionales tienen muchas caracterısticas atractivas,entre las que se encuentran:

• Los programas funcionales son bastante mas cortos y legibles quelos imperativos.

• Su fuerte base matematica hace mas facil razonar sobre la co-rreccion de los programas.

• El significado de una expresion es su valor, que no cambia durantela ejecucion del programa.

Uno de los primeros lenguajes funcionales que se desarrollaron fueel LISP, aunque no se considera completamente funcional por tenertambien caracterısticas no funcionales. Otros ejemplos de lenguajes fun-cionales desarrollados en la actualidad son el Hope, ML y Miranda. Elejemplo de la figura 5.5 muestra, en el estilo de estos lenguajes, la so-lucion de la ecuacion de segundo grado.

Programacion logica

En programacion imperativa, un programa no es otra cosa que elguion de las acciones que el computador debe seguir, y su ejecucionconsiste en obedecer esas ordenes. En programacion logica, un programaconsiste en una serie de sentencias de la logica matematica que describenun mundo, y su ejecucion consiste en deducir algun objetivo propuesto.

Las sentencias mencionadas pueden ser de dos clases: hechos, si-milares a los axiomas de la logica, o reglas de deduccion, que definenrelaciones entre objetos.

Las siguientes sentencias por ejemplo establecen una parte del pedi-gree de un perro:

Page 9: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

5.1. Lenguajes de bajo y alto nivel 127

hij(tobi, laika)macho(tobi)hembra(laika)hij(tobi, pipo)macho(pipo). . .

y podrıan leerse como sigue: “Tobi es hijo/a de Laika”, “Tobi es macho”,etc. Establecen hechos ciertos sobre objetos concretos. Las reglas esta-blecen tambien verdades, aunque se refieren a objetos genericos,1 por loque tienen un caracter mas general:

padre(P, H) <= hij(H, P) ∧ macho(P)madre(M, H) <= hij(H, P) ∧ hembra(M)

Ahora, podrıa plantearse resolver el objetivo

hij(tobi, X)

que se pregunta por los X tales que “Tobi es hijo de X” (esto es, suspadres), y que se verifica para

X = laikaX = pipo

ofreciendo las dos soluciones. Esta es una caracterıstica propia de loslenguajes logicos: la posibilidad de dar muchas respuestas a un objetivoplanteado.

Tambien se puede plantear el objetivo

hij(X, pipo)

y se obtendrıa la relacion de todos los hijos de este perro:

X = tobi...

1Representamos los objetos concretos con palabras que empiezan en minuscula y losgenericos con palabras empezadas en mayuscula.

Page 10: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

128 Capıtulo 5. Lenguajes de programacion

con lo que se observa otra peculiaridad de los lenguajes logicos: losargumentos de una relacion pueden representar datos o resultados de lamisma, indistintamente. O ambas cosas: el objetivo

hij(H, PM)

ofrecerıa como respuestas los pares siguientes:

H = tobi ; PM = laikaH = tobi ; PM = pipo... ; ...

Otras reglas posibles son las siguientes:

abuelo(A, N) <= padre(A, X) ∧ hij(N,X)

que significa que “A es abuelo de N si A es padre de algun X y N eshijo de ese X”. El par de reglas

antepasado(A, N) <= hij(N,A)antepasado(A, N) <= hij(N,X) ∧ antepasado(A,X)

representa la disyuncion siguiente: “A es un antepasado de N si N essu hijo (de A) o bien si N es hijo de algun X y A es un antepasado deese X.

Este modelo de programacion esta fuertemente basado en la logicade primer orden. El lenguaje de programacion logica por antonomasiaes Prolog, del que se han desarrollado distintas versiones.

Programacion orientada a los objetos

En la programacion imperativa, un programa parte de unos cuantosdatos iniciales, y evoluciona efectuando acciones que alteran los valoresde esos datos. Como se ve, datos e instrucciones estan separados deforma que, en principio, cualquier instruccion tiene acceso a cualquierobjeto.

En cambio, en el enfoque de la programacion orientada a los objetos(POO),2 un programa es una descripcion de los objetos que intervienen

2En ingles, OOP, Object Oriented Programming.

Page 11: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

5.1. Lenguajes de bajo y alto nivel 129

en el, como agentes interactuantes. Una descripcion de objetos tiene dosaspectos: los valores de sus propiedades fısicas, y las acciones (metodos)que describen su comportamiento, constituyendo una clase de objetos.Cada objeto es un miembro o instancia de su clase, y su actividad con-siste en seguir los metodos definidos en la clase a la que pertenece. Enel transcurso de su actividad, los objetos interactuan entre sı, pero elunico modo de hacerlo es intercambiando mensajes.

Dado que cada objeto puede desenvolverse por separado, puedenevolucionar en paralelo, por lo que este enfoque es un modelo idoneopara la programacion concurrente.

En el paradigma de la POO un programa se puede entender comoun modelo fısico que simula el comportamiento de una parte (real oimaginaria) del mundo. Esta perspectiva difiere de la imperativa, enla que se hace mayor hincapie en las manipulaciones de estructuras dedatos o de modelos matematicos.

La programacion orientada a los objetos esta mas proxima a la Fısicaque a las Matematicas en el sentido de que, en lugar de describir unaparte del mundo mediante ecuaciones matematicas, lo que se hace esconstruir literalmente un modelo fısico. Uno de los primeros lengua-jes orientados a los objetos se llamo ACTOR, porque este paradigmanos presenta los objetos como actores sobre un escenario, dispuestos ainterpretar su papel (sus metodos).

Algunas de las principales caracterısticas de la programacion orien-tada a objetos pueden resumirse ası:

• Encapsulacion

Ya se ha dicho que las clases presentan dos aspectos: los valoresque definen su estado, y las acciones, cuyo efecto puede recaersobre el propio estado o emitir un mensaje a otros objetos.

Estos dos aspectos se consideran locales, inaccesibles e inalterablespor otros objetos y solo se modifican por un efecto del comporta-miento del propio objeto, o debido a la interaccion con otro comoconsecuencia de algun mensaje recibido del mismo. Al unir datos

Page 12: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

130 Capıtulo 5. Lenguajes de programacion

y acciones, la POO alcanza un nivel de abstraccion superior al dela programacion imperativa.

En un programa de simulacion de una guerra naval, podrıa ser ne-cesario definir la clase de las naves, caracterizadas en un momentodado por su posicion (latitud y longitud), rumbo y velocidad quellevan, estado (desde intacto hasta destruido), etc. Son ademascapaces de navegar, metodo que altera su posicion.

• Herencia

A partir de un determinado objeto, se pueden crear otros que he-reden sus datos y sus metodos, o incluso mas especializados, con-tando con nuevos datos y metodos propios. Aparecen ası verdade-ras jerarquıas de objetos, similares a las clasificaciones taxonomicasque se dan en las Ciencias Naturales.

En el ejemplo anterior, los submarinos constituyen una especiali-zacion de las naves, incorporando como datos el numero de torpe-dos que poseen y su estado (sumergidos o a flote), y como metodossumergirse o salir a flote y disparar. Otra especializacion posible esla clase de los buques, que son casos particulares de naves caracteri-zadas ademas por el numero de misiles y de cargas de profundidadque llevan y capaces de disparar, aunque no pueden sumergirse.

• Polimorfismo

Con frecuencia, objetos de clases distintas hacen uso de los mismosmetodos. En la programacion orientada a objetos es posible definirmetodos llamados polimorficos, que pueden aplicarse sobre obje-tos de varias clases distintas. Las acciones concretas por ejecutardependeran de la clase del objeto al que se apliquen.

Con las clases naves definidas en los apartados anteriores, es posibledefinir metodos generales para dispararles, quiza deteriorando suestado hasta, incluso, la destruccion.

La metodologıa de resolucion de problemas en programacion orien-tada a objetos puede resumirse en los siguientes pasos:

Page 13: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

5.2. Descripcion de los lenguajes de programacion 131

1. Identificar los objetos que intervienen en el problema.

2. Caracterizar los dos aspectos de cada objeto: sus propiedades ymensajes asociados.

3. Establecer el estado inicial del escenario, ası como la secuencia demensajes que abre el telon y hace evolucionar la funcion teatral.

Algunos ejemplos de lenguajes de programacion que soportan la pro-gramacion orientada a los objetos son Smalltalk y C++. Otros lengua-jes, estan incorporando algunas de las caracterısticas de la programacionorientada a los objetos: por ejemplo, las ultimas versiones de Turbo Pas-cal, de Borland ([Tur92]).

5.2 Descripcion de los lenguajes deprogramacion

Como dijimos en la introduccion de este tema, los sımbolos delvocabulario de un lenguaje se agrupan entre sı, formando estructurassintacticas, que posteriormente son interpretadas por un traductor. Eneste apartado estudiamos como se describen los dos aspectos, sintaxis ysemantica, de un lenguaje de programacion.

Por ejemplo, dirıamos que en castellano son validas sintacticamentelas “frases” compuestas por “sujeto” y “predicado”; en cuanto al signi-ficado, se entiende que el sujeto es quien realiza la accion, mientras queel predicado precisa la accion que se lleva a cabo.

En este caso especialısimo, la descripcion de cierta estructura delcastellano se ha llevado a cabo en el propio idioma castellano. Por elcontrario, los lenguajes de programacion no suelen describirse mediantelenguajes de programacion, sino mediante los metalenguajes, llamadosası porque son lenguajes cuyo cometido es describir otros lenguajes.

5.2.1 Sintaxis

La sintaxis estudia la forma de combinar los tokens de un lenguajepara formar frases correctas. Se concreta en una serie de reglas que

Page 14: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

132 Capıtulo 5. Lenguajes de programacion

expresan las estructuras sintacticas validas en el lenguaje. El recono-cimiento de esas estructuras es necesario para dotarlas de significado yejecutar las acciones que representan.

Ejemplos de esas reglas, dados en nuestro idioma y para el, son lossiguientes:

• Un “sujeto” puede consistir en un “nombre propio” o un “artıculo”seguido de un “nombre comun”.

• Los nombres propios son “Ana”, “Ronda”, ..., “Andalucıa”.

Para describir la sintaxis de un lenguaje se utiliza una secuencia desımbolos terminales, que son los elementos validos de dicho lenguaje.Las aplicacion de las reglas (tambien llamadas producciones), permitensustituir un sımbolo no terminal por una secuencia de sımbolos, termi-nales o no. Un programa se deriva ası partiendo de un unico sımboloinicial , no terminal, que es el embrion del que surgen las frases por laaplicacion sucesiva de las reglas sintacticas.

Siguiendo el ejemplo anterior, serıan sımbolos terminales las palabras“el”, “la”, ..., “Ana”, etc. Algunos sımbolos no terminales son “frase”,“artıculo” y “nombre propio”. Entre ellos, “frase” es el sımbolo inicial.

Esta sucinta explicacion se comprendera mejor examinando la no-tacion BNF y los diagramas sintacticos, que introducimos seguidamente.

Notacion BNF

Una de las formas mas extendidas para describir la sintaxis de loslenguajes de programacion es la notacion BNF (Backus-Naur Form),utilizada por sus autores para el desarrollo del lenguaje Algol 60. Dadoque la notacion BNF es un lenguaje que nos permite describir la sintaxisde otro lenguaje, pertenece al grupo de los metalenguajes.

Para describir una produccion en BNF hay que expresar la equiva-lencia de unos sımbolos a otros. A tal fin se situa a la izquierda unsımbolo no terminal y a la derecha la combinacion de sımbolos (termi-nales o no) equivalente, enlazados mediante otros sımbolos (llamados a

Page 15: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

5.2. Descripcion de los lenguajes de programacion 133

veces metasımbolos), que no pertenecen al lenguaje sino a BNF. Dichosmetasımbolos tienen el siguiente cometido:

• “<” y “>” delimitan los sımbolos no terminales, y de esta formapoderlos distinguir de los terminales.

• El metasımbolo “|” se utiliza para separar varias combinacionesposibles, entre las que debe elegirse.

• El metasımbolo “::=” expresa la equivalencia dentro de las pro-ducciones, por lo tanto, separa el sımbolo situado a su izquierdade una o mas combinaciones de sımbolos y metasımbolos situadosa su derecha (separadas mediante “|”), y expresa que el primeropuede sustituirse por la combinacion de los segundos.

Por ejemplo, dadas las producciones:

<trapito> ::= <prenda> <color><prenda> ::= pantalon | camisa | sombrero<color> ::= gris | marron

<trapito> representa el sımbolo inicial, <prenda> y <color> son losotros sımbolos no terminales, y pantalon, camisa, sombrero, gris y ne-gro son los sımbolos terminales. Las frases validas generadas por esagramatica son:

pantalon grispantalon marroncamisa griscamisa marronsombrero grissombrero marron

Observaciones

• A veces resulta mas comodo distinguir los sımbolos terminales ylos no terminales escribiendo su inicial con minuscula y mayuscula,respectivamente, evitando el uso de “<” y “>”. Por ejemplo, conla gramatica

Page 16: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

134 Capıtulo 5. Lenguajes de programacion

Sılaba ::= Cons VocCons ::= b | c | d | ... | zVoc ::= a | e | i | o | u

resultan las siguientes sılabas validas: “ba”, “be”, “bi”, ..., “zi”,“zo” y “zu”.

• Como un sımbolo no terminal cualquiera (digamos el L por ejem-plo) puede aparecer en ambos lados de las producciones,

I ::= aLL ::= bL|c

sus sustituciones podrıan generar estructuras que lo contengan:

L → . . .L . . .

De este modo, una gramatica puede resultar recursiva, generandoun numero infinito de frases:

“ac”, “abc”, “abbc”, “abbbc”, . . .

Hoy dıa, todos los lenguajes de programacion de alto nivel tienengramaticas recursivas.

• Por otra parte, la notacion BNF se puede ampliar (EBNF), usandolos metasımbolos “[” y “]” para expresar una parte opcional y losmetasımbolos “{” y “}” para abreviar la repeticion de estructuras.Ası por ejemplo, A[B]C expresa las frases “ABC” y “AC”, y {A}representa bien la frase vacıa o una de las siguientes: “A”, “AA”,“AAA”, . . .

Diagramas sintacticos

Otra forma, tambien muy extendida, para expresar las reglas sintac-ticas de un lenguaje es mediante diagramas o grafos sintacticos. La

Page 17: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

5.2. Descripcion de los lenguajes de programacion 135

sintaxis del lenguaje Pascal, por ejemplo, fue inicialmente expresada deesta forma.

De acuerdo con esta representacion, los sımbolos terminales se repre-sentan dentro de cırculos o rectangulos con las esquinas redondeadas, yel sımbolo inicial y los sımbolos no terminales dentro de cuadrados orectangulos. Los sucesivos sımbolos se unen entre sı mediante flechas,que indican el orden y sentido de produccion.

Veamos las principales representaciones:

- Sımbolo inicial L ����L -

- Sımbolo terminal Z ����Z-&%

'$Z- o bien

- P1 | P2 | ... | Pn

-

-

-

-

-

-

-

����P1�

���P2

����Pn

...

�-

- P1 P2 ... Pn

-����P1 -����P2 - . . . -

����Pn -

Page 18: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

136 Capıtulo 5. Lenguajes de programacion

- {P}

-

� �P

-

...................................

..........................................

..................................

.

�...................................

.....................................................

........................

La utilizacion de los diagramas sintacticos facilita la construccion defrases correctas, pues es suficiente con seguir el sentido de las flechas e irinsertando los correspondientes sımbolos segun aparecen en el diagrama.

Recıprocamente, si al ir leyendo los sımbolos de una frase se sigueuno de los caminos contemplados en el diagrama sintactico, esa frase escorrecta desde el punto de vista sintactico.

Tanto la notacion BNF como los diagramas sintacticos son equiva-lentes, si bien, en general estos ultimos son de mas facil comprensiony se aconsejan como punto de partida en la definicion de lenguajes deprogramacion.

Ejemplo Un identificador en Pascal se expresa mediante una letraaislada o seguida por una secuencia de letras o numeros o el caracter desubrayado, “ ”. Serıan identificadores validos los siguientes: “x”, “y”,“z”, “altura”, “longitud”, “x1”, “y1”, “x max”, “y max”

Su diagrama sintactico serıa el siguiente:

� �letra- -

� �letra

� �dıgito

................................................................................................................

�................................................................................................................-

...................................

..........................................

..................................

.

�...................................

.....................................................

........................

En BNF puede expresarse ası:

Page 19: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

5.2. Descripcion de los lenguajes de programacion 137

Identificador ::= Letra | Letra Letras o dıgitosLetras o dıgitos ::= Let o dıg | Let o dıg Letras o dıgitosLet o dıg ::= Letra | Dıgito | SubrLetra ::= a | b | c | ... | zDıgito ::= 0 | 1 | ... | 9Subr ::=

5.2.2 Semantica

En el apartado anterior se han estudiado metodos para describir lasintaxis correcta de los lenguajes. La semantica de un lenguaje tratadel significado asociado con los programas correctos en el, esto es, de sufuncionamiento.

Es claro que lo mas natural y rapido para explicar un lenguaje esproceder informalmente, a traves de ejemplos o, mas aun, matizandoel exacto funcionamiento de cada construccion sintactica (declaracion,sentencia, etc.) No obstante, en los ultimos anos, ha surgido la nece-sidad de precisar la interpretacion asociada con cada estructura valida(sintacticamente) en un lenguaje.

Se evitan ası las ambiguedades inherentes a las descripciones infor-males de los lenguajes naturales y se consigue un entorno formal quefacilita el estudio de propiedades de los programas, tales como la co-rreccion o la eficiencia algorıtmica.

Semantica operacional

En este enfoque, el significado de una estructura sintactica vienedado por el modo con que la maquina lleva a cabo su evaluacion o suejecucion. Ası, la interpretacion de un programa consiste en reproducirla historia de los cambios de estado que producen sus construcciones alinterpretarse.

La semantica operacional de un lenguaje se define dando la funcion detransicion (⇒) que asocia a una construccion sintactica, en cada estado,el nuevo estado. Abreviadamente, escribimos

K:E ⇒ E′

Page 20: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

138 Capıtulo 5. Lenguajes de programacion

para indicar que, al interpretar la construccion sintactica K en el estadoE, se origina el estado E′.

Por ejemplo, si representamos el estado inicial de una maquina me-diante {. . . , A = 2, B = 5, . . .}, la ejecucion de

beginA := A+B;B := A−B;A := A−B

end

produce la siguiente computacion:

beginA := A+B;B := A−B;A := A−B

end

:

. . .A = 2B = 5. . .

beginB := A−B;A := A−B

end

:

. . .A = 7B = 5. . .

{A := A−B

}:

. . .A = 7B = 2. . .

⇒ :

. . .A = 5B = 2. . .

La semantica operacional puede centrarse en los detalles mas finos de

la ejecucion (semantica operacional estructural) o ignorarlos (semantica

Page 21: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

5.2. Descripcion de los lenguajes de programacion 139

natural):

beginA := A+B;B := A−B;A := A−B

end

:

. . .A = 2B = 5. . .

⇒. . .A = 5B = 2. . .

Semantica denotacional

El significado de una construccion sintactica viene dado por el efectoque produce. En lugar de explicar como se efectua cada construccionsintactica, solo interesa ahora que significa. En terminos linguısticos,puede considerarse la funcion semantica como una funcion que asociaun significado a cada significante.

Los significantes son las posibles construcciones validas del lenguaje,y estan definidos por las reglas sintacticas, agrupados en distintas cate-gorıas: declaraciones, expresiones, instrucciones, etc. Los significantesson objetos matematicos, agrupados en distintas categorıas, correspon-dientes a las categorıas sintacticas.

Por ejemplo, las cantidades numericas seran el significado asociadoa literales, variables, expresiones y funciones numericas; puesto que elefecto de una instruccion de asignacion consiste en alterar el estado de lamemoria, su semantica es una funcion entre estados de la memoria, etc.

Mas en general, una instruccion puede alterar la memoria, la entraday la salida, que podrıan consistir matematicamente en un vector y sendaslistas. Si representamos esas tres entidades mediante M , I y O, el estadode la maquina sera la terna E = M × I ×O.

Entonces, podemos precisar el significado de una instruccion ası:

S[[Instr ]] : E → E.

Concretamente, tenemos:

• S[[x← x0]](M, I,O) = (M ′, I, O)

Page 22: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

140 Capıtulo 5. Lenguajes de programacion

donde M ′ es el estado de la memoria M , sustituyendo el valorasociado con el identificador x por x0.

• S[[write(x0)]](M, I,O) = (M, I,O′)

donde O′ es el estado de la salida O, anadiendo el valor x0.

• S[[read(x)]](M, I,O) = (M ′, I ′, O)

donde M ′ se obtiene al sustituir x por x0 en M (siendo x0 el primerdato de la entrada), y ademas I = (x0, x1, . . .) y I ′ = (x1, . . .).

Como se ve, el efecto asociado a cada construccion K se precisa medianteuna funcion, S[[K]], llamada su funcion semantica.

Siguiendo con el ejemplo anterior, podemos interpretar la instruccioncompuesta mediante la composicion de funciones, ası:

S[[begin A := A+B;B := A−B;A := A−B end]]= S[[A := A+B]] ◦ S[[B := A−B]] ◦ S[[A := A−B]].

En el caso de las instrucciones, el dominio y codominio de esas fun-ciones semanticas se representan mediante el estado de la maquina; parainterpretar las demas construcciones sintacticas (tales como las decla-raciones, los identificadores, los literales o las expresiones) se necesitaigualmente formalizar sus conjuntos dominio y codominio asociados. Losmodelos matematicos correspondientes a estas entidades se llaman de-notaciones, de donde procede el nombre de este enfoque de la semantica.

Semantica axiomatica

Este enfoque atiende a las “propiedades” que tiene la interpretacionde cada sentencia I. Estas propiedades se expresan a traves de asercionessobre el estado de la maquina abstraıda, antes y despues de esa sentencia.Se escribe

{C0} I {C1}para expresar que, si se verifica C0 al comienzo de la instruccion I,cuando esta termine3 se verificara C1. La condicion (C0) que describe el

3Observese que no se asegura que en las condiciones C0 la instruccion I termine, sinosolo que llegaremos a C1 “si esta termina”

Page 23: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

5.3. Procesadores de lenguajes 141

estado previo a I se llama precondicion, y la postcondicion (C1) se refiereal estado tras I.

En el ejemplo anterior, podemos escribir lo siguiente:

{A = A0 ∧B = B0}beginA := A+B;B := A−B;A := A−B

end{A = B0 ∧B = A0}

Por lo tanto, la semantica axiomatica nos permite estudiar las pro-piedades que verifica un programa, gracias al empleo de la logica depredicados.

5.3 Procesadores de lenguajes

Aunque, hablando estrictamente, el unico lenguaje que los computa-dores comprenden es el codigo maquina, pueden ejecutar tambien pro-gramas escritos en lenguajes de alto nivel, gracias a los traductores, pro-gramas que convierten programas escritos en lenguajes evolucionados enprogramas en codigo maquina:

traductores :programa

en un lenguajeevolucionado

→programa

en lenguajede maquina

En general, un traductor es un programa que convierte un programa,escrito en un lenguaje, en un programa equivalente, escrito en otro len-guaje. Llamamos programa fuente y programa objeto respectivamenteal programa inicial y al final. Estos terminos se aplican tambien a loslenguajes respectivos.

El proceso de traduccion se lleva a cabo en varias fases; en cadauna de ellas, pueden aflorar algunos de los errores, de diversa ındole,cometidos por el programador. Por otra parte, una componente esencial

Page 24: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

142 Capıtulo 5. Lenguajes de programacion

que manejan estas etapas es la tabla de sımbolos, estructura de datos quecontiene los identificadores que intervienen en el programa, junto con sudescripcion. Las etapas mencionadas son basicamente las siguientes:

• Analisis lexico.- En esta fase, el texto del programa se traduce enuna lista de sımbolos, llamados tokens, tales como: el sımbolo deabrir parentesis, el sımbolo de asignacion, el identificador ‘pi’, elnumero entero −71, etc.

La escritura incorrecta de identificadores (por ejemplo, empezandopor un dıgito en lugar de un caracter) es uno de los errores lexicosmas frecuentes.

• Analisis sintactico.- Su mision consiste en recorrer la lista de to-kens, que le va proporcionando el analizador lexico, y tratar deagruparlos para reconocer “frases” o estructuras sintacticas, talescomo declaraciones, sentencias o expresiones, siguiendo las reglasdel lenguaje (vease 5.2.1). Por ejemplo en la figura 5.6:

El uso no equilibrado de parentesis o de otros delimitadores sonerrores sintacticos frecuentes.

• Acciones semanticas.- Un programa no es solo un reconocedor deestructuras gramaticales: debe llevar a cabo las acciones indicadaspor el programa fuente. Estas acciones representan el significadodel programa, y son tales como las siguientes:

– Dar de alta un identificador en la tabla de sımbolos y reservarespacio de memoria para su descripcion.

– Consultar la tabla de sımbolos y extraer la descripcion aso-ciada a un objeto.

– Comprobar la compatibilidad de tipo entre los objetos queaparecen en el programa.

Ejemplos de errores asociados con las acciones mencionadas sonlos siguientes:

– Intentar definir un identificador ya definido.

Page 25: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

5.3. Procesadores de lenguajes 143

while n >= 10 do n := n − 10

ident. literal ident. literal

expr. op. expr. expr. op. expr.

ident. “:=” expr.

inst. de asignacion

“while” expr. “do” instruccion

inst. while

instruccion

................

................

................

................

................

...........

...........................................................................................

............................................

........ ........ ........ ........ ........ ....

..................................................................................

............................................

........ ........ ........ ........ ........ ....

........................................................................................................................................................................................

........................................................................................................

................

........

........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........

Figura 5.6. Reconocimiento sintactico de una sentencia

– Tratar de usar un identificador desconocido.

– Escribir una operacion imposible entre sus operandos, debidoa su tipo.

Entre las acciones mencionadas, el aspecto de la verificacion detipos esta muy desarrollado en los lenguajes evolucionados, ya queası se evita un gran numero de errores durante el desarrollo de losprogramas. Los lenguajes que llevan a cabo este tipo de compro-baciones se dicen fuertemente tipados; se dice que la verificacionde tipos es estatica cuando se lleva a cabo antes de la evaluacion.

• Generacion de codigo.- Esta fase consiste en producir una repre-sentacion del programa coherente con la sintaxis y semantica dadasen las etapas anteriores. Esta representacion puede consistir direc-tamente en el codigo maquina, aunque por lo general se obtendrapreviamente una version en lenguaje ensamblador e incluso a ve-ces, antes aun, una representacion del programa (llamada codigo

Page 26: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

144 Capıtulo 5. Lenguajes de programacion

intermedio) apropiada para facilitar la traduccion final.

• Optimizacion.- En esta etapa se efectuan manipulaciones sobre elcodigo intermedio o sobre el codigo objeto final, con el objeto demejorar la calidad del codigo generado. Por lo general, estas me-joras consisten en disminuir el tamano del codigo generado y enhacerlo mas eficiente, sin alterar a cambio el efecto que deba pro-ducir el programa.

5.3.1 Compiladores e interpretes

Existen dos modos de traduccion, comparables en todo a las dos mo-dalidades de traduccion siguientes, entre las diferentes lenguas humanas:

• En el proceso de compilacion, una editorial parte del volumen ori-ginal, escrito en el idioma fuente, y produce el volumen corres-pondiente, escrito en el lenguaje objeto. Los lectores en el idiomaobjeto interpretan el texto solo despues de estar completamentetraducido.

• La interpretacion es la traduccion simultanea, por ejemplo en unaconvencion internacional: un interprete traduce fragmentos pe-quenos de frases en el idioma fuente al idioma objeto, a medida quelas escucha. Los congresistas reciben e interpretan la traduccion amedida que esta se produce.

Entre ambas modalidades, existen traductores mixtos, que en una pri-mera fase desarrollan una semicompilacion, que incluye diversas com-probaciones lexicas y sintacticas, y produce una representacion del pro-grama fuente en un codigo intermedio; y en una fase posterior ejecutanla interpretacion de ese codigo intermedio.

5.3.2 Entornos de programacion

Para crear un programa ejecutable en el computador hay que reali-zar una serie de etapas que, tradicionalmente, se venıan efectuando conprogramas independientes. Entre ellos se pueden citar los siguientes:

Page 27: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

5.3. Procesadores de lenguajes 145

• Editores

Son programas que permiten el trabajo con textos, que sirven paracrear los programas fuente. Debido a que, por lo general, trabajanen codificacion ASCII pura, carecen de algunas de las facilidadesde los procesadores de textos, tales como el uso de diferentes tiposde letra, o la gestion de tıtulos, subtıtulos y parrafos.

• Compiladores

Los compiladores, como se ha explicado en este mismo tema, sonlos programas que realizan la traduccion del programa fuente ge-nerando el programa objeto. Tradicionalmente, era frecuente queel proceso de compilacion se realizase en varias fases, y que el com-pilador estuviera constituido por varios modulos, de forma que, sino se presentan errores, las distintas fases de la compilacion se su-cedan secuencialmente, al ser ejecutados los distintos modulos delcompilador mediante un fichero de proceso por lotes.

• Enlazadores

Los programas fuente suelen contener llamadas a funciones pre-definidas del lenguaje. En general, estas funciones se encuentranprecompiladas en unas bibliotecas que se suministran junto con eltraductor del lenguaje, que se pueden adquirir o desarrollar porseparado. A veces el propio programa fuente se va compilandopor partes, modulos, o unidades. El programa enlazador (linker)se encarga de incorporar al programa objeto el codigo correspon-diente a las llamadas a funciones y de unir los distintos modulosprecompilados.

• Depuradores

Algunos de los errores que pueden aparecer en programacion sonmuy difıciles de detectar. La ejecucion del programa puede noproporcionarnos la informacion suficiente para saber con seguridaddonde esta el error. Los programas de depuracion (debuggers) per-miten hacer un seguimiento preciso de la ejecucion de las instruc-ciones, y de esta forma aislar y detectar los errores. Para ello, los

Page 28: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

146 Capıtulo 5. Lenguajes de programacion

programas de depuracion toman el control de la ejecucion del pro-grama y, entre otras posibilidades, permiten: ejecutar el programapaso a paso; establecer puntos de detencion del programa; generaruna relacion de las instrucciones ejecutadas en un computo deter-minado (traza del programa); conocer en cada momento los valoresde las variables que nos interesen (tablas de seguimiento), etc.

En la actualidad, es frecuente que algunos o todos estos programasque solıan ser independientes se agrupen en un unico programa que pasaa constituir un verdadero entorno de programacion.

Si la integracion entre los distintos componentes del entorno es alta,se acelera notablemente el proceso de creacion de programas, y se puededisponer de recursos y ayudas a la programacion que serıan impensablesen programas separados. Entre ellos podemos destacar:

• Ayudas a la edicion

Los entornos integrados presentan interesantes ayudas a la edicionpermitiendo, por ejemplo, abrir varios programas a la vez y copiarbloques de uno a otro, buscar y sustituir grupos de caracteres, etc.

• Sensibilidad al contexto

Esta es una caracterıstica de muchos editores de los entornos inte-grados, por la que, durante la escritura del programa el editor de-tecta los distintos tipos de tokens del lenguaje (tales como sımbolosy palabras reservadas, constantes, etc.), resaltandolas mediante elcolor, el tipo de letra o la intensidad, tanto en pantalla como en lascopias impresas. Este es el caso del compilador de Turbo Pascal,a partir de la version 7.0.

En algunos entornos integrados sencillos se realiza el analisis sintac-tico al terminar cada construccion sintactica, rechazandose las in-correctas. Un ejemplo de la ayuda proporcionada consiste en elequilibrado de ciertos delimitadores, tales como los parentesis, em-parejandose apropiadamente o detectandose el error.

• Ayuda contextual

Page 29: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

5.3. Procesadores de lenguajes 147

Los entornos integrados disponen de un sistema de ayuda interac-tiva, con deteccion del contexto, tanto para los mandatos del en-torno como para las instrucciones del lenguaje. Al realizar una pe-ticion de ayuda aparece en pantalla una explicacion precisamentedel mandato que estamos utilizando.

• Compilacion en la memoria principal

Para conseguir una mayor velocidad durante el proceso de depu-racion y puesta a punto de un programa, los entornos integradostienen la posibilidad de compilar los programas en la memoriaprincipal. Una vez que el programa esta terminado, puede compi-larse en disco, con el simple cambio de una opcion. Las distintasfases de compilacion, enlazado y ejecucion se suceden sin que elusuario lo advierta, obteniendose un alto nivel de interaccion y deproductividad, al reducirse los tiempos de espera.

• Depuracion integrada

Los entornos de programacion incluyen, por lo general, carac-terısticas propias de los programas de depuracion avanzados comolas que hemos mencionado anteriormente. La gran ventaja es quedichas opciones estan disponibles dentro del propio entorno, porlo que no es necesario cambiar de programa.

• Gestion de proyectos

Los entornos de programacion permiten la gestion de grandes pro-gramas, mediante la compilacion separada por modulos o unidades.Al compilar el programa principal, el gestor de programas, ordenala recompilacion solamente de los modulos que han sido modi-ficados desde la ultima compilacion. Esta compilacion separadafacilita la utilizacion de bibliotecas especializadas (para graficos,calculo numerico, etc.) y tambien el desarrollo de programas pordistintos grupos de trabajo.

Page 30: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

148 Capıtulo 5. Lenguajes de programacion

5.4 Ejercicios

1. Siguiendo el ejemplo de las figuras 5.3 y 5.5, describa en ambos estilosel calculo del area de un triangulo, conociendo las medidas de los lados,aplicando la formula de Heron:

A =√p(p− a)(p− b)(p− c)

siendo p el semiperımetro del triangulo:

p =a+ b+ c

2.

2. Siguiendo el ejemplo de la genealogıa perruna, defina la relacion “herma-nos”, que se da entre dos perros distintos con los mismos padres.

3. Para escribir una lista de nombres en castellano, los sucesivos elementosde la lista se separan entre sı con comas y el ultimo con la conjuncion “y”.Tambien son validas las listas con un unico nombre, que naturalmentese escribe sin separador alguno.Por ejemplo, si consideramos los nombres Ana, Juan y Elisa, resultanvalidas las siguientes listas:

AnaJuan y ElisaElisa, Juan y AnaAna, Ana, Ana, Ana y Ana

Exprese esa sintaxis mediante BNF y diagramas sintacticos.

4. Para escribir un numero en cierta calculadora, se aplican las siguientesreglas:

(a) Un numero se expresa mediante una cantidad, que puede ser enterao decimal, y que puede estar precedida o no por un signo “+” o“-”.

(b) Una cantidad entera se expresa mediante uno o mas dıgitos

(c) Una cantidad decimal se puede expresar con uno o mas dıgitos(parte entera), a continuacion una coma y despues uno o mas dıgitos(parte decimal). Tambien es posible expresar cantidades decimalessin parte entera o sin parte decimal, aunque debe aparecer al menosuna de ellas, ademas de la coma.

Page 31: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

5.5. Comentarios bibliograficos 149

Por ejemplo, son validos los siguientes numeros:

-1 ,7+6, ,368+,8852 -123,456

(a) Expresela mediante diagramas de flujo

(b) Expresela mediante EBNF

(c) Genere unas cuantas sentencias validas

5. En el ejemplo de semantica axiomatica sobre el intercambio de valoresentre variables numericas, precise las aserciones intermedias C1 y C2:

begin{A = A0 ∧B = B0}

A := A+B;{...C1...}

B := A−B;{...C2...}

A := A−B{A = B0 ∧B = A0}

end

6. Estudie las facilidades que ofrece la ultima version del entorno de pro-gramacion de Turbo Pascal ([Tur92]). Concretamente, relacione las queposee para la depuracion de programas.

5.5 Comentarios bibliograficos

El area de los lenguajes de computador es realmente amplia y profunda. Esinutil pues pretender resenar siquiera una pequena parte de las referencias massignificativas sobre aspectos tan diversos como el estudio de las gramaticas yla teorıa de automatas, la semantica, el desarrollo de traductores y entornos deprogramacion y los diferentes paradigmas. Ademas de inutil, serıa vano pre-tenderlo en un texto introductorio y general como es este, incluso limitandonosal terreno de las aplicaciones por profesionales no informaticos.

Encontramos que el estudio de los distintos mecanismos expresivos comunesa muchos lenguajes es preferible desde la practica de algun lenguaje concreto(como Pascal, por ejemplo) o desde el desarrollo de algoritmos con un lenguaje

Page 32: Lenguajes de programaci¶on - Universidad América Latinaual.dyndns.org/Biblioteca/Introduccion_a_la_informatica/Pdf/Unidad... · Resulta evidente que, aun siendo los lenguajes m¶aquina

150 Capıtulo 5. Lenguajes de programacion

de especificaciones. En el segundo tomo de este texto adoptamos el primerpunto de vista; en [GGSV93] se adopta el segundo.

Para ampliar conocimientos sobre los entornos de programacion, tampocoparece haber nada tan recomendable como empezar por uno concreto. Lasultimas versiones de Turbo Pascal, de Borland ([Tur92]) son ejemplares enambos aspectos, lo que explica su gran difusion, tanto en el ambiente educativocomo en el de las aplicaciones.

Naturalmente, la formacion lograda ası dotara al estudiante de un puntode vista imperativo. No es este un grave inconveniente (ya que este ha sido ysigue siendo todavıa el paradigma de mayor difusion) siempre que su educacionhaya transcurrido por la senda de la disciplina y los buenos habitos y metodos.

Sin embargo, no son pocas las aplicaciones actuales que adoptan otro en-foque distinto del imperativo. Aunque cada modelo introducido es de por sıun mundo, damos algunas referencias de ellos. En [Tes84] se ofrece una vistapanoramica sobre los lenguajes de programacion de la pasada decada. Un libroclasico sobre programacion en lenguaje Pascal es [Gro86]. Sobre programacionfuncional, [BW88] y [Bai90] son buenas introducciones, respectivamente en loslenguajes Miranda y Hope. En [GGSV93] se consideran ambos enfoques, elimperativo y el funcional. Una buena introduccion al Prolog puede hallarseen [CM87]. Para adentrarse en este bello lenguaje, debe leerse [SS86]. La fi-losofıa orientada a los objetos se extiende con rapidez, por lo que tambien lasreferencias sobre el tema proliferan. [Pas86], [Tho89] y [Weg89] son artıculosintroductorios a este modelo de programacion.

Finalmente, en [Wir86a] puede verse una explicacion ampliada de la no-tacion BNF y diagramas de flujo, ası como una introduccion a los problemasque plantea el analisis sintactico y la compilacion de programas en lenguajesde alto nivel.