descripci´on de algoritmos - instituto wienerwiener.edu.pe/manuales/1er-ciclo/algoritmos/de... ·...

26
Elementos de Programaci´ on. ETSIT. 1 o C, Apuntes del profesor Juan Falgueras a 2001/02 19 de enero de 2003 a Estos apuntes no constituyen ning´ un compromiso so- bre el contenido de la asignatura 3 Descripci´ on de algoritmos Contenido 3. Descripci´ on de algoritmos 1 3.1. Gram´ aticas de los lenguajes de programaci´ on ..................... 2 3.1.1. Componentes de un lenguaje formal ...................... 2 3.1.2. Gram´ aticas. Jerarqu´ ıa de Chomsky ....................... 3 3.1.3. La jerarqu´ ıa de Chomsky de los Lenguajes Formales ............. 5 3.1.4. Propiedades de las gram´ aticas .......................... 6 3.1.5. Formas normales ................................. 6 3.1.6. Diagramas sint´ acticos .............................. 7 3.2. Tipos de lenguajes de programaci´ on: lenguajes imperativos ............. 7 3.2.1. Paradigmas de los lenguajes ........................... 8 3.2.2. El paradigma imperativo ............................ 8 3.2.3. El paradigma declarativo ............................ 9 3.2.4. Historia de los lenguajes de programaci´ on ................... 10 3.2.5. El papel de los lenguajes de programaci´ on ................... 12 3.2.6. Cualidades de los lenguajes ........................... 13 3.2.7. Dominios de las aplicaciones .......................... 14 3.3. El teorema de las estructuras .............................. 14 3.4. Las estructuras fundamentales de control de flujo ................... 15 3.4.1. Secuencia ..................................... 15 3.4.2. Selecci´ on ..................................... 16 3.4.3. Iteraci´ on ...................................... 17 3.5. Pseudolenguaje (v. C1.0.1) ............................... 18 3.5.1. ALGORITMO .................................. 18 3.5.2. DECLARACIONES ............................... 18 3.5.3. TIPOS ....................................... 19 3.5.4. SUBALGORITMOS ............................... 20 3.5.5. ACCIONES .................................... 20 3.5.6. Prioridad de operadores ............................. 21 3.5.7. Acciones ...................................... 21 3.5.8. Ejemplos de modificaci´ on de variables ..................... 21 3.6. Diagramas de Control de Flujo ............................. 21 3.7. Nociones sobre reconocimiento de lenguajes ...................... 22 3.8. Ejercicios ......................................... 25 3.8.1. Referencias de consulta ............................. 26 3. Descripci´ on de algoritmos En los primeros temas se ha hecho una presentaci´ on hist´ orica/social, por un lado, cient´ ıfica, por el otro de la inform´ atica. Socialmente los ordenadores han tenido una influencia, han evolucionado m´ as o menos r´ apidamente y han influido en otros terrenos, cient´ ıficos o no.

Upload: others

Post on 14-Aug-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

Elementos de Programacion. ETSIT. 1o C,Apuntes del profesor Juan Falguerasa 2001/02

19 de enero de 2003aEstos apuntes no constituyen ningun compromiso so-

bre el contenido de la asignatura

3Descripcion de algoritmos

Contenido

3. Descripcion de algoritmos 13.1. Gramaticas de los lenguajes de programacion . . . . . . . . . . . . . . . . . . . . . 2

3.1.1. Componentes de un lenguaje formal . . . . . . . . . . . . . . . . . . . . . . 23.1.2. Gramaticas. Jerarquıa de Chomsky . . . . . . . . . . . . . . . . . . . . . . . 33.1.3. La jerarquıa de Chomsky de los Lenguajes Formales . . . . . . . . . . . . . 53.1.4. Propiedades de las gramaticas . . . . . . . . . . . . . . . . . . . . . . . . . . 63.1.5. Formas normales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63.1.6. Diagramas sintacticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

3.2. Tipos de lenguajes de programacion: lenguajes imperativos . . . . . . . . . . . . . 73.2.1. Paradigmas de los lenguajes . . . . . . . . . . . . . . . . . . . . . . . . . . . 83.2.2. El paradigma imperativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83.2.3. El paradigma declarativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93.2.4. Historia de los lenguajes de programacion . . . . . . . . . . . . . . . . . . . 103.2.5. El papel de los lenguajes de programacion . . . . . . . . . . . . . . . . . . . 123.2.6. Cualidades de los lenguajes . . . . . . . . . . . . . . . . . . . . . . . . . . . 133.2.7. Dominios de las aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . 14

3.3. El teorema de las estructuras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143.4. Las estructuras fundamentales de control de flujo . . . . . . . . . . . . . . . . . . . 15

3.4.1. Secuencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153.4.2. Seleccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163.4.3. Iteracion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3.5. Pseudolenguaje (v. C1.0.1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183.5.1. ALGORITMO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183.5.2. DECLARACIONES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183.5.3. TIPOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193.5.4. SUBALGORITMOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203.5.5. ACCIONES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203.5.6. Prioridad de operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213.5.7. Acciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213.5.8. Ejemplos de modificacion de variables . . . . . . . . . . . . . . . . . . . . . 21

3.6. Diagramas de Control de Flujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213.7. Nociones sobre reconocimiento de lenguajes . . . . . . . . . . . . . . . . . . . . . . 223.8. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

3.8.1. Referencias de consulta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

3. Descripcion de algoritmos

En los primeros temas se ha hecho una presentacion historica/social, por un lado, cientıfica,por el otro de la informatica. Socialmente los ordenadores han tenido una influencia, hanevolucionado mas o menos rapidamente y han influido en otros terrenos, cientıficos o no.

Page 2: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.1 Gramaticas de los lenguajes de programacion 2

En el capıtulo anterior, se abordo el apasionante tema de ¿que es capaz de resolver, cualesson los “lımites intelectivos” de la computacion resolviendo problemas?

Ası, vez hecha una introduccion externa, social, historica y fısica de los computadores, hemosvisto en el segundo tema hasta que problemas podemos llegar a abordar con los computadores;con que eficiencia y un modelo muy simple de maquina de computar, la maquina de Turing.

En este tema, conocidos ya los lımites de la computabilidad, el ordenador en sus principalescaracterısticas, nos introduciremos en la teorıa de los lenguajes, medios para comunicarnoscon las maquinas; y los tipos de lenguajes. Veremos inicialmente las grandes lıneas en loslenguajes de programacion, lenguajes imperativos y declarativos, para tomar inmediatamenteel camino de los primeros y dejar los ultimos. Presentaremos un sencillo teorema que nos per-mitira plantear definitivamente las necesidades de cualquier lenguaje que describa cualquieralgoritmo. Veremos descritos algoritmos elementales mediante un lenguaje directo conveni-do, el pseudolenguaje, que nos mantendra independientes de cualquier lenguaje o dialectoconcretos de programacion.

3.1. Gramaticas de los lenguajes de programacion

Los lenguajes se rigen por sus gramaticas. Dentro de este contexto, la Gramatica Formal esuna herramienta que permite analizar y manipular la estructura de “conversacion”. Una GramaticaFormal especifica la estructura de un Lenguaje mediante la construccion de una coleccion de reglasque pueden usarse sistematicamente para generar todas y cada una de las posibles comunicacioneslegales entre los participantes.

3.1.1. Componentes de un lenguaje formal

Definicion 3.1 Un alfabeto es un conjunto finito no vacıo de sımbolos indivisibles.

Por ejemplo, el alfabeto anglosajon consiste en 26 letras mayusculas y 26 minusculas. Elcastellano, de 28 de cada. Usualmente se denota un alfabeto mediante T .

Definicion 3.2 Una cadena ( string) sobre un alfabeto T es una secuencia finita de sımbolos deT .

El numero de sımbolos de una cadena x es llamado su longitud, y se denota mediante |x|.Es conveniente la introduccion de la cadena vacıa, denotada ε, que no contendra absolutamenteningun sımbolo. La longitud de ε es 0.

Definicion 3.3 Sean x = a1a2 . . . an e y = b1b2 . . . bm dos cadenas. La concatenacion de x e y,denotada por xy, es la cadena x = a1a2 . . . anb1b2 . . . bn.

Ası, para una cadena x cualquiera, εx = xε = x. Para cualquier cadena x y n entero n ≥ 0,diremos que xn es la cadena formada por la concatenacion de x n veces.

Definicion 3.4 El conjunto de todas las cadenas sobre un alfabeto T se denota T ∗ y el conjuntode todas las subcadenas no vacıas sobre T se denota T+. El conjunto vacıo de cadenas se denota∅.

Definicion 3.5 Para cualquier alfabeto T , un lenguaje sobre T es un conjunto de cadenas sobreT . Los miembros de un lenguaje se llaman tambien palabras del lenguaje.

Los conjuntos L1 = {01, 11, 0110} y L2 = {0n1n |n ≥ 0} son dos lenguajes sobre el alfabetobinario {0, 1}. La cadena 01 esta en ambos lenguajes, mientras que la 11 esta en L1 pero no en L2.

Dado que los lenguajes son sencillamente conjuntos, las operaciones estandard sobre conjuntostales como union ∪, interseccion ∩ y complemento A tambien se aplican a los lenguajes. Para loslenguajes es util tambien el introducir dos operaciones mas: concatenacion y cierre de Kleene.

Definicion 3.6 Sean L1 y L2 dos lenguajes sobre T . La concatenacion de L1 y L2, denotada comoL1L2 es el lenguaje {xy |x ∈ L1, y ∈ L2}.

Page 3: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.1 Gramaticas de los lenguajes de programacion 3

Definicion 3.7 Sea L un lenguaje sobre T . Definimos L0 = {ε} y Li = LLi−1 para i ≥ 1. Elcierre de Kleene de L, denotado como L∗, es el lenguaje:

L∗ =⋃i≥0

Li

y el cierre positivo de Kleene, denotado como L+, como el lenguaje:

L+ =⋃i≥1

Li

En otras palabras, el cierre de Kleene de un lenguaje L consite en todas las cadenas quepueden ser formadas mediante la concatenacion de palabras de L. Por ejemplo, si L = {0, 01}.entonces LL = {00, 001, 010, 0101} y L∗ incluye todas las cadenas de dıgitos binarios en las cualescada 1 esta precedido de un 0. L∗ es la misma que L+ excepto que L+ excluye ε. Notese que,para cualquier lenguaje L, L∗ siempre contiene ε y L+ contiene ε si y solo si L lo contiene. Noteseademas que T ∗ es en efecto el cierre de Kleene del alfabeto T cuando es visto como lenguage depalabras de longitud 1, y T+ no es otro que el cierre positivo de T .

3.1.2. Gramaticas. Jerarquıa de Chomsky

Los componentes de una Gramatica Formal son sımbolos y reglas. Las gramaticas contienendos tipos basicos de sımbolos:

terminales , que habra uno asignado a cada Palabra del Lenguaje;

no terminales , que podrıan entenderse como las plantillas para las Frases del lenguaje. Cadaplantilla admite usualmente numero muy alto de frases concretas. Cada sımbolo terminalexpresa la forma que habran de tener las frases.

Hay ademas un sımbolo especial reservado, el sımbolo inicial I.En resumen, aunque todo lenguaje esta basado en un vocabulario, en el terreno de la Gramati-

ca Formal, sus elementos no se llamaran normalmente palabras sino sımbolos (basicos). Por otrolado a las secuencias de sımbolos del lenguaje se le llamaran frases y seran correctas o incorrectassegun esten bien o mal formadas dentro de la gramatica, sintaxis o estructura del lenguaje.

La Gramatica Formal no solo permite decidir si una cierta secuencia de palabras es una frasede ese lenguaje, sino que, tambien, algo que es mas importante, dotan a la frase de una estructuraque ayuda a encontrar su significado, ya que cada frase imprime un contexto a sus palabras. Alsignificado de las frases se le denomina semantica y esta, naturalmente, ligado a la sintaxis.

Definicion 3.8 Una gramatica es una cuadrupla (T,N, P, I), donde:

1. T es un conjunto finito no vacıo de terminales, llamado alfabeto.

2. N es un conjunto finito no vacıo (disjunto de T ) de variables o frases no terminales.

3. P es un conjunto finito de producciones o reglas de la forma

α ::= β

donde α ∈ (T ∪ N)∗ N (T ∪ N)∗ y β ∈ (T ∪ N)∗. Dicho de otro modo, α es una cadenade terminales y noterminales conteniendo al menos un no terminal y β es una cadena determinales y no terminales.

4. I ∈ N es un no terminal especial llamado sımbolo inicial.

Page 4: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.1 Gramaticas de los lenguajes de programacion 4

Ejemplo 3.8.1 Sea G1 = ({0, 1}, {A,B,C, U}, P, A) donde P contiene las siguientes produccio-nes:

A ::= CBA ::= CUB ::= AUC ::= 0U ::= 1

describe el conjunto {0n1n |n ≥ 1}.

Ejemplo 3.8.2 Sea G2 = ({0, 1, 2}, {A,B}, P, I) donde P contiene las siguientes producciones:

A ::= 0AB2A ::= ε

2B ::= B20B ::= 011B ::= 11

describe el conjunto {0n1n2n |n ≥ 0}.

Ejemplo 3.8.3 Construir una gramatica G3 que contenga las sentencias en espanol. El alfabetoT contiene todas las palabras en espanol. N contendrıa los no terminales, que coreesponderıan alos componenetes estructurales de las sentencias en espanol, por ejemplo, <sentencia>, <sujeto>,<predicado>, <nombre>, <verbo>, <artıculo>, etc. El sımbolo inicial podrıa ser <sentencia>.Algunas producciones tıpicas serıan:

<sentencia> ::= <sujeto><predicado><sujeto> ::= <nombre>

<predicado> ::= <verbo><artıculo><nombre><nombre> ::= dionisio<nombre> ::= algoritmo

<verbo> ::= escribe<artıculo> ::= un

Para poder explicar como una gramatica puede generar un lenguaje necesitaremos de lossiguientes conceptos:

Definicion 3.9 Sea G = (T,N, P, I) una gramatica. Una forma sentencia de G es cualquiercadena de ternimnales y no terminales que es una cadena sobre T ∪N .

Definicion 3.10 Sea G = (T,N, P, I) una gramatica y γ1 y γ2 dos formas sentencia de G. Deci-mos que γ1 deriva directamente a γ2, y se denota γ1 7→ γ2, si γ1 = σατ y γ2 = σβτ y α ::= β esuna produccion de P .

Por ejemplo, la forma sentencia 00A11 deriva directamente la sentencia 00CB11 en la gramati-ca G1 y B2B2 deriva directamente BB22 en la gramatica G2 de los ejemplos 3.8.1 y 3.8.2, respec-tivamente.

Definicion 3.11 Sean γ1 y γ2 dos formas sentencia de la gramatica G. Decimos que γ1 derivaγ2 y se denota γ1 7→∗ γ2 si existe una secuencia de (cero o mas) formas sentencia σ1, . . . , σn talesque

γ1 7→ σ1 7→ . . . 7→ σn 7→ γ2

Por ejemplo, en la gramatica G1, A 7→∗ 0011 ya que

A 7→ OB 7→ 0B 7→ 0AU 7→ 0A1 7→ 0OU1 7→ 00U1 7→ 0011

y en la gramatica G2, A 7→∗ 001122 ya que

A 7→ 0AB2 7→ 0AB2B2 7→ 00B2B2 7→ 0012B2 7→ 0011B22 7→ 001122

Page 5: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.1 Gramaticas de los lenguajes de programacion 5

Definicion 3.12 Sea G = (T,N, P, I) una gramatica. El lenguaje generado por G, denotado porL(G), se define como:

L(G) = {x |x ∈ T ∗, I 7→∗ x}

Las palabras en L(G) tambien son denominadas sentencias de L(G).

En los ejemplos, se ve claramente que L(G1) contiene todas las cadenas de la forma 0n1n, n ≥ 1y L(G2) contiene todas las cadenas de la forma 0n1n2n, n ≥ 0. Y aunque solo hemos dado unadefinicion parcial de G3, sabemos que G3 contiene sentencias tales como “dionisio escribe unalgoritmo” y “algoritmo escribe un algoritmo”, pero no sentencias tales como “un escribe unalgoritmo”.

3.1.3. La jerarquıa de Chomsky de los Lenguajes Formales

La introduccion de las gramaticas formales data de los 40 [Pos43]. Aunque el estudio rigurosode los lenguajes mediante la gramatica no comenzo hasta los 50 [Cho56]. Veremos ahora comovarias restricciones en la forma de las producciones en las gramaticas pueden afectar la potenciade la gramatica en sı y en la propia representacion de los lenguajes. En particular, veremos comolos lenguajes regulares y los lenguajes de patrones se pueden generar todos mendiente gramaticascon diferentes restricciones.

Las gramaticas pueden dividirse en cuatro clases mediante un gradual incremento en lasrestricciones en la forma de las producciones. Esta clasificacion se debe a Chomsky [Cho56, Cho63]y es por esto que se la llama jerarquıa de Chomsky.

Definicion 3.13 Sea G = (T,N, P, I) una gramatica.

1. G es tambien llamada una gramatica de tipo 0 o gramatica irrestringida. Sus produccionesson del tipo (T ∪N)+ ::= (T ∪N)+

2. G es de tipo 1 o sensible al contexto si cada produccion α ::= β en P es o bien una formaI ::= ε o satisface |α| ≤ |β|.

3. G es de tipo 2 o libre de contexto si cada produccion α ::= β en P satisface |α| = 1, estoes, α es un solo no terminal.

4. G es de tipo 3 o lineal o regular si cada produccion tiene una de las tres posibles formas:

A ::= aB A ::= a A ::= ε

donde A y B son no terminales y a es un terminal.

A los lenguajes correspondientes a estas gramaticas se les llama de la forma correspondiente.Particularmente a un lenguaje de tipo 1 se le llama tambien lenguaje sensible al contexto, mientrasque a los de tipo 2 se les llama lenguajes libres de contexto. Los lenguajes de tipo 3 son lenguajesregulares, es decir, pueden ser generados por expresiones regulares, y viceversa.

En los lenguajes libres de contexto, α sera sustituible por β sin importar el lugar en el quese encuentre. Las gramaticas utilizadas por los analizadores sintacticos en los compiladores son detipo 2. La notacion BNF, que veremos mas adelante es una notacion particular para gramaticas detipo 2. Todos los lenguajes derivados de gramaticas de tipo 2 pueden ser parseados (analizados ycompilados), habiendo ademas algunos subconjuntos de los mismos, usualmente utilizados en lasdefiniciones de los lenguajes de programacion que pueden ser parseados en forma especialmenteeficiente.

Las gramaticas regulares, aunque no son lo suficientemente generales para describir la sintaxisde un lenguaje de programacion, sin embargo, estas gramaticas son ampliamente utilizadas paralos analizadores lexicos de los compiladores ya que describen las entidades basicas que conformanun lenguaje de programacion. Los lenguajes descritos por una gramatica de tipo 3 son facil yeficientemente analizables y, en particular siempre se pueden describir mediante una maquina deestados finitos.

Page 6: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.1 Gramaticas de los lenguajes de programacion 6

Teorema 1 Para cada i = 0, 1, 2, la clase de tipo i de lenguaje contiene propiamente la clase delenguajes de tipo i + 1.

Como ejemplo, podemos demostrar que el conjunto {0n1n |n ≥ 1} es libre de contexto pero noregular y que los conjuntos {0n1n2n |n ≥ 0} y {xx |x ∈ {0, 1}∗} son sensibles al contexto perono libres del contexto. Es, sin embargo un poco mas complicado construir un lenguaje que sea detipo 0 pero no sensible al contexto.

Las cuatro clases de lenguajes de la jerarquıa de Chomsky estan tambien completamentecaracterizadas en terminos de maquinas de Turing y sus formas restringidas. Se sabe que unlenguajes de tipo 0 es exactamente aquel que es reconocido por maquinas de Turing, los sensibles alcontexto por maquinas de Turing funcionando en espacios lineales, los lenguajes libres de contexto,por maquinas de Turing cuya cinta opere como una pila (llamadas automatas push-down) y loslenguajes regulares son los que son reconocidos por maquinas de Turing sin cinta ninguna (llamadasmaquinas de estados finitos o automatas de estados finitos).

3.1.4. Propiedades de las gramaticas

Dos gramaticas G y G′ se dicen equivalentes si los lenguajes que generan, L(G) y L(G′) soniguales.

Esta equivalencia no significa que la derivacion sea la misma (tampoco, por lo tanto el arbolde parsing). Por ejemplo:

G G′

A ::= Ax|y A ::= yBB ::= xB|ε

Una gramatica se dice ambigua si permite mas de una posible derivacion para una mismaexpresion. Por ejemplo: I ::= AA con A ::= x|xx da dos posibles formas de derivacion para lacadena xxx.

3.1.5. Formas normales

Las formas normales son metodos de describir los lenguajes a traves de ciertas reglas. Uno delos usos mas importantes que tienen es el de demostrar las propiedades de los lenguajes. Pueden,a veces, no ser faciles de leer o comprender pero facilitan mucho mas el analisis que presentacionesmas particulares.

Cualquier lenguaje libre de contexto puede describirse mediante la Forma Normal de Chomsky(CNF) o la Forma Normal de Backus (BNF).

La forma normal de Backus es algo mas legible que la de Chomsky. Tambien es llamadaForma Normal de Backus-Naur (ver el § 3.2.4).

BNF es un metalenguaje utilizado para describir sistemas de produccion que generen lenguajeslibres de contexto. Los lenguajes generados utilizando BNF incluiran, naturalmente, un conjuntode terminales, de no terminales y una lista de producciones, y un sımbolo inicial1. Los terminalesen BNF se indican de diversa forma segun la bibliografıa. Nosotros utilizaremos letras minusculasmientras que para los no terminales (variables) se utilizaran mayusculas. Ademas BNF utiliza unaserie de metasımbolos que se han extendido mas alla de la teorıa de gramaticas, como por ejemplo,a manuales de todo tipo de lenguajes:

Sımbolo Significado::= se define como| alternativamenteALGO no-terminalalgo terminal

1A veces en las notaciones BNF no se especifica claramente cual es el sımbolo inicial, entendiendose este por elgrado de generalidad: el mas general es el sımbolo inicial.

Page 7: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.2 Tipos de lenguajes de programacion: lenguajes imperativos 7

Con el paso del tiempo el BNF se ha ampliado dando lugar a un lenguaje mas legible mediantela inclusion de indicadores de iteracion y grupos:

Sımbolo Significado[algo] cero o una aparicion de ese algo{ algo } cero o mas apariciones de ese algo(tal | cual) grupo; o bien tal o bien cual

Por ejemplo, una definicion de un identificador en el lenguaje de programacion C, descrita enBNF serıa:

IDENT::=LETRA | IDENT LETRA | IDENT DIGITO

conLETRA::= | [a..z] | [A..Z]

yDIGITO::=[0..9]

y usando EBNF:IDENT::=LETRA {LETRA | DIGITO}

Algunas variantes de EBNF incluyen en forma de superındices y subındices el mınimo y el maximo,respectivamente, de las posibles repeticiones. Por ejemplo {a}5

3 indica la posible repeticion de laletra terminal a entre 3 y 5 incluıdas veces.

La notacion EBNF evita la recursion de BNF sustituyendola por iteracion.

3.1.6. Diagramas sintacticos

Otra forma de describir las reglas sintaciticas de un lenguaje son los diagramas de Conway.Los sımbolos mas importantes se representan en la Figura 1.

Símbolo terminal

Símbolo NO terminal

concatenación

Figura 1: Significado de algunos sımbolos de los diagramas de Conway

3.2. Tipos de lenguajes de programacion: lenguajes imperativos

Cualquier notacion que se de para la descripcion de un algoritmo o una estructura de datospuede ser llamada lenguaje de programacion. Naturalmente, sin embargo, no todos los lenguajesde programacion se plantean para ser implementados en los ordenadores.

Se han desarrollado e implementado cientos de lenguajes de programacion diferentes. Ya en1969 J. Sammet [Sam69] hace una lista de 120 lenguajes de programacion ampliamente utilizados; ydesde entonces se han desarrollado un buen punado de ellos mas. La mayorıa de los programadores,sin embargo, no se aventuran a utilizar mas que unos pocos de ellos (mientras menos mejor), quizasuno o dos. En la practica, en cada lugar de trabajo se acuerda el utilizar un lenguaje u otro (C,Ada, FORTRAN, Matlab), como sistema de desarrollo, simplificando despues el intercambio deideas y material entre los programadores. Sin embargo es interesante conocer las caracterısticas delos lenguajes de programacion mas importantes por distintas razones:

Page 8: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.2 Tipos de lenguajes de programacion: lenguajes imperativos 8

1. Mejorar habilidad en el desarrollo de algoritmos efectivos, ya que conociendo como se imple-mentan las tecnicas de programacion que usamos, las utilizaremos mejor.

2. Aumentar el vocabulario de construcciones en programacion.

3. Disponer de mas y mejor conocidas alternativas a la hora de elegir un lenguaje de progra-macion.

4. Facilitar el aprendizaje de nuevos lenguajes.

5. Hacernos una idea de distintos estilos de presentar y estructurar los algoritmos, para mejorarnuestro estilo.

3.2.1. Paradigmas de los lenguajes

Podemos clasificar los lenguajes de programacion segun el modelo o paradigma, coleccion deposibilidades abstractas, que lo caractericen. Ver la Figura 2.

Paradigmasde los

lenguajes deprogramación

Imperativo

Declarativo

Procedural

Basado en objetos

Proceso paralelo

Lógico

Funcional

Base de datos

Estructurado en bloques

Orientado a objetos

Figura 2: Jerarquıa de paradigmas de los lenguajes de programacion

3.2.2. El paradigma imperativo

Se caracteriza por facilitar la computacion mediante cambios de estados en la maquina. En-tendiendo por estado la configuracion o valores tanto de la RAM, como de los diversos dispositivosvariables que componen un ordenador. Bajo este paradigma es util el ver la ejecucion como unasecuencia de fotogramas cada cual evidenciando todos los valores interesantes bajo el control delprograma imperativo.

Al comenzar el programa se dan una serie de datos en determinadas localizaciones de lamemoria y es tarea del programa especificar la secuencia de cambios que han de hacerse sobre estainformacion para conseguir el estado final de la memoria deseado. Para conseguir esto el programaimperativo se sirve de estructuras de datos cuya implementacion es bien conocida y condicionala forma de los programas. Los programas imperativos dependen en mayor o menor grado de lasoperaciones realizables por el sistema operativo.

El lenguaje FORTRAN fue el primer lenguaje imperativo con bloques de programa, querecogıan subrutinas, datos comunes, etc. Sin embargo de una manera plana, lo que lo excluyo dela calificacion de estructurado en bloques.

El termino estruturado en bloques se refiere hoy dıa a la posibilidad de anidamiento deambitos, esto es, el que un bloque pueda ser encajado dentro de otro y contener su propio ambitode variables sin interferencia alguna con el exterior. En los lenguajes estructurados por bloques,el procedimiento es el principal elemento de construccion. Ejemplos de lenguajes estructurados enbloques son el Ada, ALGOL60, Pascal.

Un objeto en programacion es un conjunto de elementos de informacion y de procedimientospara manejarla que forman un todo sobre el cual se puede trabajar ‘activando’ los procesos que

Page 9: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.2 Tipos de lenguajes de programacion: lenguajes imperativos 9

ası cambian de estado el objeto. Estos objetos capturan, pues, propiedades inherentes a entescomplejos de la realidad y sirven para modelarla y facilitar su uso abstrayendo sus propiedadesdentro del objeto.

Para distinguir aquellos lenguajes que solamente estan basados en objetos de los que ademasposeen posibiliades de clases y herencia entre objetos, se utiliza el termino, para estos ultimos, deorientados a objetos. Ası mientras que el antiguo Ada 83 estaba solamente basado en objetos, elAda 95 esta orientado a objetos, aunque para algunos no es aun totalmente orientado a objetos,como lo puede ser Smalltalk o Eiffel.

El paradigma de la programacion distribuida La programacion concurrente se ha divididoen dos grandes categorıas: sistemas fuertemente y debilmente acoplados. El termino distribuidase refiere a lenguajes para sistemas debilmente acoplados, como el que podrıa dar soporte a ungrupo de empleados trabajando sobre una base de datos unica simultaneamente y comunicandosemediante el paso de mensajes a traves de canales de comunicacion tales como enlaces punto apunto redes de area local (LAN). En este tipo de lenguajes no es necesaria la comparticion dememoria pero sı hay que resolver otros tipos de problemas.

Lenguajes como el Ada permiten la comparticion de recursos mediante el mecanismo derendevous. Otros lenguajes mas recientes permiten ambos tipos de enfoque, por ejemplo Occam,Linda, Concurent Prolog.

3.2.3. El paradigma declarativo

Un lenguaje declarativo es aquel en el que se especifica una relacion o funcion. Cuando seprograma en forma declarativa no se hacen nunca asignaciones a variables, no existen las variables.El interprete o compilador del lenguaje en particular gestiona la memoria de manera transparenteal programador. Estos lenguajes son me mas “alto nivel” que los lenguajes imperativos ya que elprogramador esta aun mas alejado del modelo de maquina u ordenador.

Los tres paradigmas declarativos han sido tomados de la matematica: la logica, la teorıa defunciones y el calculo relacional.

La programacion logica se basa en un subconjunto del calculo de predicados y presenta lasacciones o sentencias en forma de clausulas de Horn. El calculo de predicados aporta axiomas yreglas de las que se pueden deducir nuevos hechos a partir de otros hechos dados. Una clausulade Horn permite tan solo deducir un hecho de cada sentencia. Un sistema de clausulas de Hornpermite un metodo mecanico particular de prueba llamado resolucion.

Un programa basado en la logica consiste en una serie de axiomas o hechos, reglas de inferenciay un teorema o consulta a comprobar. La salida sera ‘cierto’ si los hechos apoyan la consulta,‘falso’ en otro caso. Prolog es el modelo de este tipo de lenguajes, aunque existen diversas sintaxisy aproximaciones para su evaluacion.

La programacion funcional Los lenguajes funcionales puros operan solo sobre funciones. Unafuncion siempre devuelve, y como maximo un solo valor, despues de recibir una lista de parametros,que pueden ser los resultados de las llamadas a otras funciones. No se permiten asignaciones avariables globales ni, los llamados, efectos laterales.

Las funciones pueden incluso ser valores que pueden ser pasados a otras funciones y devolversevalores funcionales. Esto ultimo permitira a los programas funcionales modificarse a sı mismos,‘aprender’.

En la practica existen varios lenguajes funcionales y en casi todos ellos se permiten algunosefectos laterales, particularmente importantes, como los de la entrada y salida de datos, que im-plican la modificacion de estados externos a las funciones. Como en el caso de la programacionlogica existe un prototipo, el LISP, de lenguaje funcional, pero como en aquel, se incluyen en lasimplementaciones practicas muchas posibilidades no puristas.

Page 10: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.2 Tipos de lenguajes de programacion: lenguajes imperativos 10

El paradigma base de datos Las propiedades que distinguen a los lenguajes disenados parael manejo de las bases de datos son la persistencia y el control del cambio. Las entidades base dedatos no desaparecen al terminar el programa, que una vez organizadas, son permanentes.

Un sistema de gestion de bases de datos incluye un lenguaje de definicion de datos (DDL)para la descripcion de nuevos hechos o datos, y un lenguaje de manipulacion de datos (DML) parala interaccion con las bases de datos existentes.

Los lenguajes de bases de datos pueden estar embebidos en otros lenguajes de programacionpara mayor flexibilidad.

3.2.4. Historia de los lenguajes de programacion

Los lenguajes de programacion han evolucionado contınuamente desde la aparicion de losprimeros en los 50. Las primeras versiones de FORTRAN y Lisp aparecieron durante los anos50; Ada, C, Pascal, Prolog y Smalltalk en los 70; C++ y ML en los 80. Cuando en los 70, eldepartamento de defensa americano (DoD) realizo un estudio del estado de cosas encontro que seutilizaban mas de 500 lenguajes de programacion en sus distintos proyectos; este fue un motivopara el desarrollo por parte del DoD del lenguaje Ada.

Las primeras tecnologıas en computacion datan de los anos 30 a 40, antes de la SegundaGuerra Mundial. Estas primeras maquinas fueron disenadas para resolver problemas numericos yfueron pensadas simplemente como calculadores electronicos. Naturalmente de esto derivo el quela mayorıa de las aplicaciones de entonces sean numericas.

A principios de los 50 comenzo a aparecer la notacion simbolica. Grace Hopper dirigio ungrupo en Univac que desarrollo el lenguaje A-0 y John Backus desarrollo el Speedcoding para elIBM 701. Ambos lenguajes fueron disenados para compilar expresiones aritmeticas sencillas encodigo maquina ejecutable.

El gran salto se dio de 1955 a 1957 cuando Backus dirigio un grupo para desarrollar FORTRAN(FORmula TRANslator). Como en los lenguajes hasta entonces, FORTRAN estaba orientado alos calculos numericos, pero el objetivo se amplio con un lenguaje capaz de incluir estructurasde control, condicionales, ordenes de entrada y salida, etc. Dado que habıa poca confianza enque el lenguaje resultara competitivo frente al codigo desarrollado directamente a mano sobre lasinstrucciones del procesador (Ensamblador), se hizo un gran esfuerzo en conseguir una ejecucioneficiente y se introdujeron varias ordenes disenadas especıficamente para el IBM 704. Ası nosencontramos en el lenguaje FORTRAN conceptos como el salto aritmetico a tres caminos, conceptocurioso exclusivo de a aquel procesador que no se ha seguido posteriormente. No se trataba de unlenguaje ‘elegante’, pero en aquellos dıas, el concepto de ‘elegancia’ en la programacion aun no sehabıa acunado.

FORTRAN fue extremadamente util; tanto que ha cambiado la programacion desde entonces.FORTRAN ha sido revisado en 1958 (FORTRAN II) y pocos anos despues (FORTRAN IV).FORTRAN IV se convirtio en un estandard en 1966 como FORTRAN 66 y se ha actualizado dosveces desde entonces: FORTRAN 77 FORTRAN 90. Sin embargo la candidad de codigo escritopara las antiguas versiones hacen dıficil evolucionar a los nuevos dialectos, que practicamente solose pueden preocupar de ser compatibles con todas las posibilidades anteriores.

Tras el exito del FORTRAN y por miedo en Europa al dominio de IBM se organizo la GAMM(German society of applied mathematics) para el desarrollo de un lenguaje universal. En los Es-tados Unidos, la ACM (Association of Computing Machinery) tambien se propuso tal objetivo.Ambos comites se fundieron en uno bajo las directrices de Peter Naur y desarrollo el IAL (In-ternations Algorithmic Language). El nombre ALGOL (ALGOrtihmic Language) fue inicialmenterechazado, pero su uso obligo a que oficialmente se aceptara: finalmente el lenguaje se llamo Algol58. Se hizo una revision en el 60 que se llamo Algol 60 (con una menor en el 62) convirtiendose enel estandard de los lenguajes de la programacion academica de los 60 y principio de los 70.

Mientras que uno de los objetivos del FORTRAN era la eficiencia, los objetivos del Algolfueron diversos:

1. La notacion debıa ser parecida a la de las matematicas usuales.

Page 11: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.2 Tipos de lenguajes de programacion: lenguajes imperativos 11

2. Deberıa ser util para describir algoritmos.

3. Deberıa ser compilable en codigo maquina.

4. No deberıa estar ligado a ninguna arquitectura particular de computador.

Siendo estos unos objetivos ambiciosos para el ano 1957, la independencia de la maquinahizo que Algol careciera oficialmente de instrucciones para introducir y presentar datos, debiendoestas ser escritas para cada hardware en cada maquina. Esto, naturalmente conllevaba incompa-tibilidades entre los programas hechos en diferentes maquinas. La exigida cercanıa a la sintaxismatematica hizo que las llamadas a subrutinas fuesen meras expansiones de macros. Esto introdujoel concepto de llamada por nombre en el paso de parametros, que es difıcil de implementar en loscompiladores.

Aunque Algol no tuvo exito comercial en los Estados Unidos, solo algo en Europa, tuvo ungran impacto. Uno de sus herederos fue la version de Jules Schwartz de SDZ del lenguaje IAL,JOVIAL (Jules’ Own Version of IAL), que se convirtio en un estandard para las aplicaciones delas fuerzas aereas americanas.

Backus edito la definicion del lenguaje Algol en 1960 mediante una notacion sintactica compa-rable a la gramatica libre de contexto desarrollada por Chomsky un ano antes. Este fue el comienzode la introduccion de la teorıa de las gramaticas formales a los lenguajes de programacion. Debi-do al importante papel que tuvo Naur en el desarrollo del Algol, la notacion empleada recibe elnombre de BNF, o Backus Naur Form.

Otro ejemplo de la gran influencia del Algol fue el de Burroughs, un vendedor de ordenadoresque se fusiona con Sperry Univac para formar Unisys, al descubrir los trabajos de un matematicopolaco llamado Lukasiewicz. Lukasiewicz habıa desarrollado una interesante, aunque no muy revo-lucionaria matematicamente, nueva tecnica que permitıa a las expresiones aritmeticas ser escritassin parentesis mediante un potente proceso de evaluacion basado en una pila. Este descubrimientotuvo un gran efecto en la teorıa de compiladores. Usando el metodo de Lukasiewicz, Burroughsdesarrollo el hardware del ordenador B5500 basado en una arquitectura de pilas e inmediatamen-te un compilador de Algol mucho mas rapido que ninguno de los hasta entonces existentes deFORTRAN.

En este punto, la historia diverge. En el 60 se desarrolla el concepto de tipo definido por elusuario y ni FORTRAN ni Algol tienen tal capacidad. Simula 67, desarrollado por Nygaard y Dahlde Noruega introducen el concepto de clase en Algol. Esto dio a Stroustrup la idea para sus clasesen C++ como una extension del C en los 80. Niklaus Wirth desarrollo el Algol-W a mediados delos 60 como una extension del Algol. Este diseno tuvo un precario exito, pero su Pascal disenadoentre el 68 y el 70, se convirtio en el lenguaje de los computadores cientıficos de los 70. Hubo otrocomite que intento duplicar el exito del Algol 60 con el Algol 68, pero el lenguaje fue radicalmentediferente y mucho mas complejo de comprender e implementar eficientemente.

Con la introduccion de la lınea de los 360 en 1963, IBM desarrollo el NPL (New ProgrammingLanguage) en sus laboratorios de Hursley en Gran Bretana. Despues de algunas quejas del EnglishNational Physical Laboratory, el nombre se cambio a MPPL (Multi-Purpose Programming Lan-guage), que fue abreviado a PL/I. PL/I mezclo las facilidades numericas del FORTRAN con lascapacidades de gestion mercantil del COBOL. PL/I tuvo un exito moderado en los 70 y ha sidohoy dıa totalmente reemplazado por el C y el Ada. BASIC fue un subconjunto del FORTRANfacil de implementarse para ser interpretado en vez de compilado y de facil aprendizaje, satisfa-ciendo las necesidades de calculo del no cientıfico, se ha extendido mucho mas alla de lo proyectadoinicialmente.

Lenguajes para los negocios Inmediatamente despues de los lenguajes para el calculo numeri-co surgieron los lenguajes para los negocios. Grace Hopper dirigio un grupo en Univac para desa-rrollar Flowmatic en 1955, cuyo objetivo era el desarrollo de aplicaciones para negocios utilizandoexpresiones lo mas naturales del lenguaje ingles.

En el 59 el DoD promovio un encuentro para el desarrollo del Common Business Language(CBL), que deberıa de ser un lenguaje orientado a los negocios con expresiones lo mas inglesas

Page 12: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.2 Tipos de lenguajes de programacion: lenguajes imperativos 12

posible. Una subdivision de este grupo publico en el 60 lo que serıa el COBOL (COmmon BusinessOriented Language). COBOL fue revisado en el 74 y en el 84. Hoy dıa se sigue utilizando.

Lenguajes para la inteligencia artificial El interes en el desarrollo de lenguajes para desarro-llo de IA (interes artificial) comenzo en los 50 con el IPL (Information Processing Language) porla Rand Corporation. IPL-V fue ampliamente conocido, pero se extendio poco porque tenıa unasespecificaciones de muy bajo nivel de abstraccion. El gran salto se dio cuando John McCarthy delMIT diseno el LISP (LIst Processing) para el IBM 704. El LISP 1.5 se convirtio en un estandarddurante muchos anos. Recientemente Scheme y Common LISP han seguido esta evolucion.

El lenguaje LISP fue disenado como un procesador de listas de los lenguajes funcionales. Eldominio usual de los problemas para LISP es la busqueda. Particularmente el desarrollo de juegosha sido un terreno propio del LISP dado que un programa de LISP usualmente puede desarrollarmovimientos arboreos (como listas enlazadas) y posteriormente moverse por el arbol buscando laestrategia optima. Un paradigma alternativo fue tambien el del procesado de cadenas donde lasolucion habitualmente involucraba la transformacion de los textos de un formato a otro. Maquinastraductoras automaticas en las que cadenas de sımbolos eran sustituidas por otras, fueron tambiendominio del LISP. El lenguaje COMIT de Yngve del MIT fue un intento inicial para este tipode trabajos. Cada instruccion del programa era muy parecida a una regla de produccion de unlenguaje de contexto libre y representaba un conjunto de posibles reemplazos que podrıan darse sila cadena se encontraba en los datos. Debido a que Yngve mantuvo su propiedad sobre el codigo,un grupo en la en los laboratorios de la AT&T Bell decidio desarrollar su propio lenguaje, queresulto ser el SNOBOL.

Mientras que el LISP fue disenado para aplicaciones de procesado de listas de propositogeneral, el Prolog fue un lenguaje de proposito especial cuyas estructuras basicas de control y laestrategia de implementacion se basaron en conceptos de logica matematica.

Lenguajes para sistemas Debido a la necesidad de eficiencia, durante anos fue el ensambladorel lenguaje utilizado para el desarrollo de sistemas incluso mucho despues de que otras areas deaplicacion utilizaran ya lenguajes de alto nivel. Se disenaron muchos lenguajes para la programa-cion de sistemas, tales como el CPL y el BCPL, pero nunca llegaron a una amplia expansion. Ellenguaje C cambio todo esto con su llegada con un entorno competitivo, el UNIX, totalmente es-crito en C, durante el comienzo de los 70. Los lenguajes de alto nivel han demostrado ser efectivosen estas areas, tanto como otros.

3.2.5. El papel de los lenguajes de programacion

Aunque inicialmente los lenguajes fueron desarrollados con el objetivo acuciante de la eficien-cia, debido sobre todo al alto coste de los ordenadores (cientos de millones de pesetas) frente al delos programadores (dos millones de pesetas por ano), teniendo que competir siempre con la efec-tividad de la programacion directa sobre el hardware en ensamblador, la necesidad de conseguirprogramas correctos de unas 30.000 instrucciones, llevo a mediados de los 60 (con la llegada delFORTRAN, el COBOL, el LISP y el Algol) a un nuevo enfoque del problema. Los ordenadoresse fueron haciendo mas baratos y los costes de la programacion mayores. Esto forzo la necesidadde trasladar los programas escritos de unos ordenadores a otros y el mantenimiento de tales pro-ductos se convirtio tambien en un gran costo anadido. De manera que en vez de compilar grandesprogramas en grandes y caros ordenadores, la tarea de los lenguajes de alto nivel se convertirıaen falicilitar el desarrollo de programas correctos para la resolucion de problemas areas dadas deaplicaciones.

En los 70, madura la tecnologıa de los compiladores, tıpicamente se tenıa al FORTRAN paraaplicaciones cientıficas, al COBOL para los negocios, al JOVIAL para las aplicaciones militares,al LISP para las de inteligencia artificial y para las aplicaciones empotradas en sistemas fijos, elAda.

Sin embargo ha habido una evolucion natural de estos lenguajes debido a:

1. La capacidad de los computadores, que ha aumentado enormemente en poco tiempo.

Page 13: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.2 Tipos de lenguajes de programacion: lenguajes imperativos 13

2. Las aplicaciones a las que se destinan los ordenadores, que se ha ampliado bastante.

3. Los metodos de programacion, que han ido evolucionando para tener en cuenta nuevos con-ceptos relativos al ambiente de trabajo en grandes aplicaciones y al ambiente de uso de lasmismas.

4. Las nuevas tecnicas de implementacion de los lenguajes que han introducido nuevas tecnicasde programacion.

5. Los estudios teoricos, especialmente la formalizacion matematica en la busqueda de la co-rreccion, han introducido nuevas tecnicas de programacion.

6. La estandarizacion que ha promovido un fuerte conservacionismo en la evolucion de loslenguajes.

3.2.6. Cualidades de los lenguajes

¿Que hace que un lenguaje sea bueno? Los metodos de diseno de los lenguajes aun tienenmucho que mejorar. Los motivos para el exito o el fracaso de un lenguaje son muchas vecesexternos a ellos mismos, como por ejemplo, el caso de los lenguajes COBOL y Ada, promovidospor entidades poderosas. En otros casos este exito se lo ha dado el apoyo por parte de diversosfabricantes, como le paso al FORTRAN. A veces es sencillamente el unirlos a excelentes textospara describirlos, como le ocurrio al SNOBOL4 durante los 70. Mientras que el Pascal y el LISPse han visto apoyados por el estudio teorico que de ellos han hecho los estudiantes de diseno delenguajes a la vez que lo usaban.

Independientemente de estos factores externos, lo que deberıa determinar si un lenguaje de-biera sobrevivir serıa:

1. Claridad, simplicidad y unicidad. Que podrıamos resumir en integridad conceptual. La sinta-xis del lenguaje afecta la facilidad de lectura de los programas con el escritos y la legibilidadde los programas es fundamental. Los lenguajes crıpticos (como APL) o el uso de operadoresocultos (como el espacio en SNOBOL4) que alteran, sin uno verlos, el significado, son muyperniciosos en el mantenimiento de los programas.

2. Ortogonalidad, o independencia de cada construccion respecto de las otras de manera quese puedan combinar libremente y ser entendidas sin considerar los contextos de cada una.

3. Naturalidad para la aplicacion a programar. El lenguaje FORTRAN tiene tanto exito enparte debido a que las expresiones matematicas se parecen mucho a las que se utilizan en lasmismas matematicas.

4. Apoyos para la abstraccion, permitiendo construir estructuras nuevas a las que se puedareferir mediante sintaxis sencillas y que incluyan todas las propidades de los objetos realesrepresentados. Del Pascal surgio el Ada y del C el C++ por su mayor soporte a la abstraccion.

5. Facilidades para la verificacion como base para la construccion de grandes programas fiablesmediante el uso de estructuras sintacticas sencillas y de semanticas lo mas simples posibles.

6. Entornos de programacion adecuados y completos que faciliten la labor de los desarrolladores.Pocos lenguajes se definen inicialmente con este problema resuelto. En este sentido uno delos mas completos ha sido Smalltalk; tambien Ada.

7. Portabilidad de los programas a los distintos sistemas mediante la minimizacion y el aisla-miento de las partes mas dependientes del sistema particular para facilitar su localizacion ymodificacion facil en los traslados.

8. Costo de uso, como criterio fundamental que incluye el costo de ejecucion (necesidades dehardware y molestias en la instalacion, etc.), de traslacion a otros sistemas (mientras mas facilsea mayor el mercado que se abarca), costo de creacion, prueba y uso (para la preparaciondel programador, etc.), costo de mantenimiento (muy variable con cada lenguaje).

Page 14: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.3 El teorema de las estructuras 14

3.2.7. Dominios de las aplicaciones

La eleccion del lenguaje depende fundamentalmente del dominio de la aplicacion a realizar.Los lenguajes han ido evolucionando en los ultimos 30 anos tanto por su propia evolucion comopor la aparicion de nuevos dominios y necesidades de los existentes. Tıpicos dominios son los de losnegocios, cientıficos, la construccion de sistemas, Inteligencia Artificial, publicacion electronica (queha hecho imprescindible en los ultimos 20 anos), proceso de tareas automatizado, programacion dela interaccion mediante la World Wide Web, nuevos paradigmas de programacion en desarrollo.Ver la tabla 1

Cuadro 1: Los lenguajes mas adecuados a los diferentes dominios

Anos Aplicacion Mas importantes Otros60s Negocios COBOL Ensamblador

Ciencias FORTRAN Algol, BASIC, APLSistemas Ensamblador JOVIAL, ForthIA LISP SNOBOL

Hoy Negocios COBOL, Hojas de calculo C, PL/I, 4GLsCiencias FORTRAN, C, C++ BASIC, PascalSistemas C, C++ Pascal, Ada, Modula2IA Lisp, PrologPublicacion procesadores de texto TEX, PostScriptProcesos UNIX shell, Tcl, Perl MarvelWeb HTML, Java Perl, TclN. Paradigmas ML, Smalltalk Eiffel

3.3. El teorema de las estructuras

El termino de “Programacion Estructurada” fue introducido por Dijkstra (entre 1965 y 1972)refiriendose a la necesidad de una programacion mas metodica y rigurosa. Para unos significo co-dificar estructuradamente, con determinadas sentencias de control y criterios de estilo y documen-tacion, mientras que para otros fue toda una nueva concepcion general de diseno y desarrollo deprogramas.

Objetivos de la programacion estructurada En cualquier caso, la programacion estructu-rada (PE) intenta mejorar el proceso de la programacion mediante una adecuada organizacion delos programas y una mejora de los lenguajes de programacion, de forma que pudieran realizarsedescripciones claras y precisas de las estructuras de datos y control. Esto lleva a programas mascorrectos, faciles de leer y modificar y mas facilmente verificables.

Historia Los momentos mas importantes de la PE son los siguientes:

1965 Dijkstra introduce el concepto de PE vagamente y sin demasiado exito.

1966 Bohm y Jacopini definen un programa estructurado como un programa cuyo flujo de controlpudiera expresarse usando solo las tres estructuras basicas de control (secuencia, seleccion,iteracion). De ahı probaron el “Teorema de las Estructuras” y suscitaron la polemica delGOTO mas adelante.

Mas adelante mostraremos estas estructuras de control de flujo.

1968 Dijkstra en la ACM publica un artıculo contra el GOTO, con resonancia hasta 1975. En1974, Donald E. Knuth publica un artıculo titulado “Structured Programming with GOTOstatements”.

Page 15: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.4 Las estructuras fundamentales de control de flujo 15

Ultimas opiniones sobre goto En cualquier caso Mills (1972) opina que “los programas es-tructurados deben caracterizarse no simplemente por la ausencia de GOTOs, sino por la presenciade estructura. . . La teorıa de la PE se refiere a la conversion de diagramas de flujo arbitrariamentegrandes y complejos a formas standard que puedan representarse mediante la iteracion y anida-miento de varias estructuras logicas de control standard mas pequenas”. Para hacernos una ideade sus opiniones valgan los siguientes comentarios:

Edsger Dijkstra’s Evaluations of Programming Languages (c. 1982)

FORTRAN, “the infantile disorder”, by now nearly 20 years old, is hopelessly inadequate for whatevercomputer application you have in mind today: it is now too clumsy, too risky, and too expensive touse. PL/I – “the fatal disease” – belongs more to the problem set than the solution set.

It is practically imposible to teach good programming to students that have had a prior exposure toBASIC: as potential programmers they are mentally mutilated beyond hope of regeneration.

The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offense.

APL is a mistake, carried through to perfection. It is the language of the future for the programmingtechniques of the past: it creates a new generation of coding bums.

Programacion descendente. Wirth Por otro lado, el paradigma de la “Programacion Descen-dente” (PD o Stepwise Refinement) es de Wirth en 1971. Este proceso considera la programacioncomo un proceso analıtico que permite transformar especificaciones en programas. Wirth defineesto en 1974: “La PD es la formulacion de programas como jerarquıas, estructuras anidadas desentencias, y objetos de computacion”.

Jerarquizacion de la estructuracion Para llegar a esta formulacion jerarquica es necesarioaplicar una serie de refinamientos sucesivos que van desde la especificacion del problema hasta suresolucion expresada en un lenguaje de programacion detallando ya los pasos relativos al dispositivoen que se desarrolla.

3.4. Las estructuras fundamentales de control de flujo

Las estructuras fundamentales de control de flujo son, como se dijo antes, al hablar del Teo-rema de Bohm y Jacopini, tres: secuencia, seleccion o decision e iteracion (repeticion o bucle).Cualquier otra forma de control de la ejecucion de operaciones se podra, pues, convertir en estas.La ventaja de identificar estas y exigir solo el uso de estas esta fundamentalmente en conocerası rapidamente el comportamiento de los programas y en poderlos analizar mejor.

3.4.1. Secuencia

Cuando un proceso directo, se puede realizar con la informacion que recibe sin necesidad dedesviar los pasos y de una unica vez, el proceso es susceptible de ser ejecutado en una operaciono, como maximo, en una secuencia de operaciones mas sencillas que compongan la accion unicatotal.

Los procesos secuenciales, cuando estan compuestos por varias acciones, tienen la propiedadde que aquellas acciones se ejecutan cada una detras de la anterior, nunca de forma simultanea(sino existirıa ‘paralelismo’, que es otro tema). Ademas, y como corolario de lo anterior, hasta queno se termina de ejecutar la instruccion precedente, no se puede ejecutar la siguiente.

Normalmente, en programacion, las acciones de los procesos secuenciales se suelen escribiruna debajo de la otra acabando, en la mayorıa de los lenguajes de programacion, cada accion conun signo de punto y coma ‘;’.

. . .accion 1;accion que sigue a la 1;debo ser la accion 3;. . .

Page 16: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.4 Las estructuras fundamentales de control de flujo 16

Como regla comun, los procesos secuenciales, compuestos de varias acciones simples que son una,continuacion de otra, se dan cuando se conoce con precision el punto de partida y el de llegada.Por ejemplo, tengo dos numeros y quiero obtener su media:

se tienen dos numeros y se quiere obtener la mediasumar los dos numeros guardando el resultado;tomar el resultado guardado antes y dividirlo por 2 guardando elponer el resultado anterior donde sea conveniente;

La ejecucion de estos pasos o acciones se hace temporalmente en orden, cada accion debeagotarse y los resultados de cada accion se van obteniendo “cuando les toca su turno”. No es lomismo:

guardar en r la suma de a y b;guardar en s la suma de r y a;

que

guardar en s la suma de r y a; guardar en r la suma de a y b;

La mayorıa de las programas de ordenador son secuencias de instrucciones a las que los progra-madores se acostrumbran a leer. La lectura es siempre de arriba a abajo y cada instruccion es unalınea que, una vez ejecutada, puede haber cambiado el valor o el ‘estado’ de todo el programa. Esenuevo estado, tras cada accion es el que se encontrara el programador para la accion que vengadetras2.

Un ejemplo de algoritmo secuencial puede ser:

Algoritmo para abrir un envase TetraBrick c© para diestrosTomar y mantener el envase con la mano izquierda;Aplastar haciendo presion la esquina superior donde viene el dibujito de las tijeras;Doblar el carton hacia un lado por la lınea punteada;Enderezar de nuevo el carton;Rasgar el carton por la lınea punteada

en este ejemplo, el ser humano hace de interprete y computador.

Notese que cada instruccion de una secuencia sera mas o menos simple dependiendodel ‘ejecutor’. Se supone, en los algoritmos secuenciales que el ejecutor no fallara enninguna de las ejecuciones de las acciones.

3.4.2. Seleccion

¿Que ocurre si pasa algo? Parece una pregunta ambigua, de hecho lo es, pues no hay referenciaa nada si no se especifica que es ese ‘algo’. En general, cada accion de una secuencia, como dijimosantes, puede ser ese ‘algo’ al que nos referimos. Esto es, nos preguntamos, ¿que ocurre si algunaaccion puede dar lugar a distintas formas de ejecutarse? Por ejemplo, si sencillamente tratamos dedesarrollar un algoritmo para evaluar las dos raices de una ecuacion de segundo grado, tendrıamos:

dados a, b y c de ax2 + bx + c = 0 encontrar los 2 valores de x que lo satisfacen

es un problema mal planteado, en general. Si yo tratase de resolver el problema con el mecanismoparticular para el caso de dos raices reales, me podrıa encontrar con situaciones erroneas comoque a = 0, b2 − 4ac < 0 o a = b = 0, c 6= 0.

2En los lenguajes declarativos esto no es ası, al menos en teorıa, sino que lo que el programador hace es algo masrelajadamente, escribir, sin una necesidad tan estricta de orden, sus conocimienos, aserciones, sobre el problemay se deja al ordenador sacar las ‘conclusiones’. En programacion, imperativa, es sin embargo esencial ‘ordenar’ alcomputador cada accion, una debajo de la otra diciendole (como a un subnormal de CI 1) exactamente, que es loque debe hacer. Por desgracia, los lenguajes imperativos son los mas eficientes y mas populares.

Page 17: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.4 Las estructuras fundamentales de control de flujo 17

Para que los algoritmos tengan validez dentro de multiples situaciones es necesario quepuedan tomar decisiones por sı mismos.

En el ejemplo anterior tendrıamos

Algoritmo para resolver CUALQUIER ecuacion de segundo gradosi a = b = 0 y c = 0 entonces hacer

explicar que la ecuacion es absurda;acabar este algoritmo ya aquı;

finsi

si a = 0 entonces hacersolucion x es -c/bacabar este algoritmo ya aquı;

finsi

si b*b - 4*a*c < 0 entonces hacersolucion x1 es (-b + i * Raiz(4*a*c-b*b)/(2*a);solucion x2 es (-b - i * Raiz(4*a*c-b*b)/(2*a);

sinosolucion x1 es (-b + Raiz(b*b-4*a*c)/(2*a);solucion x2 es (-b - Raiz(b*b-4*a*c)/(2*a);

finsi

Este ejemplo se parece mucho a lo que es un programa de ordenador, tan solo que hemos empleadoun lenguaje mas relajado que el que se emplea en la mayorıa de los lenguajes de ordenador.

En el ejemplo anterior se toman decisiones. La toma de decisiones permite al algoritmo seralgo mas ‘inteligente’ siendo capaz de adoptar una secuencia de acciones u otra segun la situacion.Muchos problemas no se podrıa algoritmizar sino se hiciese uso de decisiones y esto es debido aque muchos problemas carecen de una solucion unica, como le sucede al de las raıces de la ecuacionde segundo grado, planteado como problema general.

La decision es la instruccion que va a hacer los algoritmos menos mecanicos, alejandolos deltıpico uso que se hace de una calculadora, donde las decisiones no las puede tomar la maquina,sino que debe tomarlas el usuario, el humano. De hecho casi se podrıa medir la ‘inteligencia’ deun algoritmo, que no es otra que una ‘instantanea’ de la inteligencia del programador, como elnumero de decisiones en su programa. Por supuesto esto es solo una aproximacion superficial altema. Evidentemente, la eleccion y el orden adecuado de las instrucciones tambien denotan mayor omenor ‘inteligencia’. Pero la variedad de respuestas de un algoritmo que admite multiples entradasda idea de un algoritmo ‘elastico’, ‘inteligente’.

3.4.3. Iteracion

Sin la iteracion es imposible escribir ciertos algoritmos. Veamos un ejemplo: supongamos quequeremos describir el proceso de sumar N numeros distintos dados. Si sabemos cuantos numerostenemos, esto es, cuanto vale N y los numeros en sı, parece que una secuencia de sumas bastarıa

toma el primero como resultado;suma el segundo al resultado;suma el tercero al resultado;...suma el N-simo al resultado;

Pero, supongamos que no sabemos cuanto vale N . ¿Que hacer? No tendrıamos forma de describireste proceso sin recurrir a la idea de repetir acciones hasta que se de una cierta condicion.

Otro ejemplo, supongamos que tenemos que calcular el numero e mediante un algoritmonumerico que utilice la serie de Taylor:

e = e1 = 1 +11!

+12!

+13!

+ . . .

Page 18: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.5 Pseudolenguaje (v. C1.0.1) 18

Normalmente, como sabemos, el uso de series polinomicas para aproximar una funcion esta condi-cionado a la rapidez de convergencia de la serie, esto a cuantos terminos de tal serie son necesariospara llegar a un valor aceptable de la funcion; y, esto, depende del valor de cada termino, de maneraque: hasta que no se tenga un termino de menor valor que la precision buscada se deben seguirtomando terminos.

Existen muchos procesos en los que se deben ejecutar acciones mientras no se deje dedar una situacion

Ejemplos de tales algoritmos hay muchos: “caminar hasta alcanzar la acera” (o, “mientras nose alcance la acera”, como se prefiera decir); “sacar monedas mientras no se rebase o iguale lacantidad solicitada”; “acumular terminos mientras el valor absoluto del termino sea superior a laprecision buscada”; etc.

Los bucles, repeticiones o iteraciones son combinacion de un grupo de acciones que se pretendeque se ejecuten, llamado el cuerpo del bucle y de una condicion que se debera cumplir (o dejarde cumplir), para que el cuerpo deje de ejecutarse. Gracias a esta combinacion se pueden describirmuchısimos procesos comunes. Los ordenadores son capaces de ejecutar bucles, esto es, repetir unjuego de acciones hasta que se deje o se cumpla una condicion predeterminada.

La comprension del mecanismo de los bucles es fundamental para avanzar ante problemas basi-cos de programacion, que son irresolubles sin ellos. Al principio, sin embargo, son algo ‘extranos’y difıciles de comprender para los principiantes.

3.5. Pseudolenguaje (v. C1.0.1)

Para describir una serie de operaciones es necesario conocer el dispositivo que las ejecutara.Sin embargo, independientemente de las acciones finales, estamos viendo que se pueden tenersentencias seguidas; condicionar la ejecucion de grupos de sentencias y/o repetir la ejecucion degrupos de sentencias. Por otra parte en los dispositivos programables como los ordenadores, vamosa utilizar lugares de memoria sobre los que actuar, leyendolos y escribiendo sobre ellos. Estainformacion, datos variables que estaran en la memoria del ordenador podra estar representandonumeros aritmeticos, o codigos de algun otro tipo de informacion. Las posibilidades son ilimitadas.

Para describir cada variable en un programa utilizaremos nombres inventados segun el pro-grama. Para controlar la forma de ejecucion de las acciones utilizaremos palabras reservadas dealgun lenguaje. Inicialmente es pues conveniente establecer algun tipo de codificacion sencilla, conpalabras facilmente comprensibles del lenguaje natural: este es el pseudolenguaje. Expresionesdel lenguaje natural que indiquen la forma de las acciones y del control de flujo del programa.Para las variables igualmente se establecen normas para comprender si estamos trabajando concontenidos aritmeticos, valores constantes, codigos de letras ASCII, etc.

3.5.1. ALGORITMO

// Comentarios o bien detras de // o bien /* entre */

Algoritmo identificadordeclaraciones

Inicioacciones

Fin.

3.5.2. DECLARACIONES

Pueden ser de constantes, tipos, variables y funciones.

Cada tipo de declaracion ira en su zona, previamente declarada CONST, TIPOS o VAR.

Page 19: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.5 Pseudolenguaje (v. C1.0.1) 19

Todas las variables, tipos, constantes y funciones, deben ser declaradas antes de su uso.Las constantes, tipos y variables se pueden declarar varias a la vez, separando en la listalos identificadores por comas. Se pone antes el nombre del tipo de datos y despues la(s)etiqueta(s) elegida(s) para nombrarla(s) (si son mas de una, separadas por comas).

Las variables pueden ser inicializadas en su declaracion (ya esten definidas por separados ovarias a la vez).

Las constantes, como las “variables”, se declaran en la zona de CONSTantes pero siempre vaninicializadas a su valor fijado.

3.5.3. TIPOS

Simples predefinidos:

Tipo Sımbolo OperadoresNatural N + - * DIV(/)

MOD(%)Entero Z + - * DIV(/)

MOD(%) ABSReal R + - * /Logico B Y(&&) O(||)

NO(!)Letra C CHAR ORD(N)

Para los tipos cuyos valores tienen todos predecesor y sucesor (ordinales), que son N, Z, B y C, tambien

se tiene PRED y SUCC.

Otros tipos:Enumeracion (identificacion) de valores:

Enumerado {CYAN, MAGENTA, AMARILLO, NEGRO} Colores;

Arrays (vectores, matrices, hileras):

<TipoBase> <nombre>[indiInicio..indiFinal];// ej.: int cuenta[1..5] = {10, 4, 5, 5, -4};

Cadenas de letras:

char cadena[] = "Hola mundo";char *cadena = "Hola \"mundo\;char cadena[0..100]; // debe terminarse en \0

Registro

Registro<declaracionVariable>{<declaracionVariable>}

[<Casos> /* sustituyendo acciones por declaraciones */]finRegistro

Puntero

<TipoApuntado> *PTI;// NODO *ENLACE, *LINK;// N *arrPunt[1..10]; // array de 10 punteros (raro)

NOTA: en pseudolenguaje, el contenido de las estructuras se puede copiar, sin embargo no losarrays.

Ejemplos:

Page 20: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.5 Pseudolenguaje (v. C1.0.1) 20

N *puntero_a_natural; //tipo punteroN array_natural[1..20]; //array de 20 naturales enteros

No hacer varias declaraciones en una lınea. Utilizar definiciones de tipos y constantes previas.Esto hace mas legible y controlable el programa.

3.5.4. SUBALGORITMOS

ALGORITMO [<TipoQueDevuelve>] identificador({FormaDePaso <declarVariable>})

<declaraciones>inicio

accionesfin identificador

Si no devuelve nada se pondra como <TipoQueDevuelve> nulo(void).FormaDePaso puede ser:

E, S, o ES

que corresponden a entrada, salida y entrada-salida. (NO OLVIDAR PONERLO).

3.5.5. ACCIONES

Asignacion:

a = <expresion>;

Logica:

==, <, >, !=, <=, >=; &&, ||, !, Y, O, NO

Seleccion:

si <expresionBooleana> entoncesacciones

{sinosi <expresionBooleana> entoncesacciones}

[sinoacciones]

finsi

Iteracion:

mientras <expresionBooleana> haceracciones

finmientras

o bien

repetiracciones

hasta que <expresionBooleana>

Casos especiales con tipos ordinales:Para (for):

para <asignacion> hasta <expresion> [paso <constante>] haceracciones

finpara

Page 21: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.6 Diagramas de Control de Flujo 21

Filtro (Casos):

caso <expresion> sea<rango> : acciones (* <rango> puede ser una lista de constantes *){<rango> : acciones}[sino: acciones]fincaso

3.5.6. Prioridad de operadores

1. Los parentesis ()

2. Operador NO(!) (y los operadores + - unarios -3, !fin)

3. Operadores multiplicativos: * / DIV MOD(%)

4. Operadores aditivos: + -

5. Operadores relacionales: < >= > >=

6. Operadores de igualdad: == !=

7. Operador AND&& o Y

8. Operador OR(||) u O

3.5.7. Acciones

Entre las acciones la mas importante es la de asignacion:

<identVariable> = <expresion>;

La asignacion es la operacion mas importante de los lenguajes imperativos. En ella la parte derechadel operador =, podra ser cualquier expresion (constante o variable) y sera evaluada y asignada ala variable que haya a la izquierda del operador =. Naturalmente a la izquierda solo puede haberel identificador de una variable adecuada. Como por ejemplo. Asignar, para 3.14 a la variable r:

r= 3.14;,

3.5.8. Ejemplos de modificacion de variables

r= 3.14;

y= r;

i= i + 1; /* incrementa en 1 el valor de la variable i */

s= s + n; /* aumenta en n el valor de s */

y= sin(3.14)*sqrt(4.0*z) + 1.0; /* y = sin(3,14)×√

4z + 1 */

Ejercicio: ¿Como intercabiarıa el contenido de dos variables? O sea, si la variable a y b tienenvalores (100 y 200, respectivamente, por ejemplo), queremos realizar acciones para que al final atenga el anterior contenido de b (200) y b el de a (100).

3.6. Diagramas de Control de Flujo

Especialmente cuando los algoritmos tienen un flujo de control complicado o para evidenciarciertas partes delicadas son muy utilizadas formas graficas de representacion en las que cadaestructura de control viene reflejada por un sımbolo. Hace dos decadas se empleaban con masfrecuencia que hoy y se utilizaban mas sımbolos, pero nosotros simplificaremos a los reflejados enla Figura 3.

Page 22: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.7 Nociones sobre reconocimiento de lenguajes 22

Decisión

acción de I/O

Acción

Comienzo

Figura 3: Elementos mas comunes en los diagramas de flujo de datos. En muchos casosincluso se reducen al de Accion y al de decision.

En el se ven, el sımbolo de Comienzo (Fig. 4), que indicara el comienzo o fin (es un terminador)de un proceso algorıtmico. Logicamente el de comienzo tendra una flecha de salida y el de Fin unade entrada.

Figura 4: Sımbolo de comienzo o fin de un proceso.

El sımbolo de Accion (Fig. 5), que junto con el de decision son los mas usados para todo.Cuando la accion se quiere detallar con mas subacciones que la compongan, se indica mediantealgun sımbolo convenido, y se desglosa en otra parte.

Figura 5: Sımbolo de accion de algun tipo. En principio una accion no descomponible,excepto que se indique lo contrario.

El de operaciones de entrada y salida (Fig. 5) puede ser mas especıfico indicando si es haciauna impresora, desde un teclado, hacia un disco, etc., pero esto es una convencion amplia que sesuele establecer en cada grupo de programadores por anticipado.

Finalmente la bifurcacion (Fig. 7), que es la mas flexible, pudiendo bifurcarse hacia atraso hacia adelante hacia otros puntos del algoritmo. Pero en programacion estructurada solo serıaadmisible una sencilla bifurcacion hacia atras para indicar un bucle o una decision hacia adelanteindicando alternativas, siempre sin cruzar otras lıneas de bifurcacion. Ver la Figura 8.

3.7. Nociones sobre reconocimiento de lenguajes

Supongamos que tenemos un lenguaje generado por la siguiente gramatica:

G = N,T,A, R

N = sımbolos con <>

T = sımbolos sin <>

A =< sentencia >

y R

Page 23: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.7 Nociones sobre reconocimiento de lenguajes 23

Figura 6: Sımbolo para cualquier operacion de entrada y salida. Se indica como unaaccion especial dado que involucra un cambio en el control del programa.

Figura 7: Sımbolo de bifurcacion. En el caso de Fortran tenıa tres salidas pues laspreguntas eran del tipo x < 0, x = 0 o x > 0. A veces se amplıa paramultiples salidas cada una indicando una posible respuesta a la preguntaindicada.

(1) <sentencia> ::= <identificador> <asignacion><expresion>(2) <asignacion> ::= =(3) <expresion> ::= <expresion> <mas> <expresion>(4) <expresion> ::= <expresion> <por> <expresion>(5) <expresion> ::= <numero>(6) <expresion> ::= <identificador>(7) <mas> ::= +(8) <por> ::= *(9) <numero> ::= <dıgito> {<dıgito>}(10) <dıgito> ::= 0 | 1 | 2 | ...| 9(11) <letra> ::= a | b | c | ...| z(12) <identificador> ::= <letra> {<letra> | <dıgito>}

Las reglas de esta gramatica se pueden dividir en dos partes, obteniendo dos gramaticas‘complementarias’: los sımbolos terminales de la primera son los sımbolos no terminales de lasegunda. Siendo la primera

(1) <sentencia> ::= identificador asignacion <expresion>(2) <expresion> ::= <expresion> mas <expresion>(3) <expresion> ::= <expresion> por <expresion>(4) <expresion> ::= numero(5) <expresion> ::= identificador

y la segunda

(1) <asignacion> ::==(2) <mas> ::= +(3) <por> ::= *(4) <numero> ::= <dıgito> {<dıgito>}(5) <dıgito> ::= 0 | 1 | 2 | ...| 9(6) <letra> ::= a | b | c | ...| z(7) <identificador> ::= <letra> {<letra> | <dıgito>}

?SI NO x?> 0 < 0

= 0

Situación?

A B C D E F

x?

Figura 8: Algunas variantes que indican bifurcaciones.

Page 24: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.7 Nociones sobre reconocimiento de lenguajes 24

Supongamos ahora que en nuestro fichero fuente (programa escrito en nuestro lenguaje ejem-plo) esta escrita la siguiente frase:

nuevo= viejo + razon * 23

Nuestro compilador debera analizar esa frase (leerla y “entenderla”) y generar el codigo maqui-na u objeto correspondiente (sıntesis).

En esquema, un compilador realiza una serie de fases como las representadas en la Figura en

Programa fuente

Análisislexicográfico

Análisissintáctico

Análisissemántico

generaciónde códigointermedio

Optimizaciónde código

Generaciónde código

Programa objeto Enlazadoo linkado Ejecutable

ANÁLISIS

SINTESIS

rutinasde errores

gestión detablas

Tablas desímbolos

otras tablas

12

n

Figura 9: Fases de un compilador

las que:

Analisis lexicografico Utilizando la parte de la gramatica que describe los sımbolos no termina-les directamente en funcion de los terminales, genera una serie interconectada de sımbolos,denominados ‘tokens’, para la fase siguiente. Ademas elimina comentarios, espacios en blan-co, separadores, tabuladores, localiza sımbolos no en el alfabeto y demas errores lexicograficosque se detecten.

Analisis sintactico A partir de los tokens anteriores analiza la estructura de las frases y com-prueba la gramatica del lenguaje.

Analisis semantico Comprueba que una frase, correcta sintacticamente, tiene sentido semantico.Por ejemplo, no se puede sumar un objeto de tipo ASCII a uno de tipo entero, aunque laexpresion de la suma, la frase, estuviese bien planteada.

Generacion de codigo intermedio Se genera un codigo independiente de la maquina de des-tino. Este codigo es aun de relativo alto nivel y facil de generar para el lenguaje de trabajo.Depende de la arquitectura del compilador.

En nuestro ejemplo:

Page 25: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

3.8 Ejercicios 25

temp1= 23temp2= id3 * temp1temp3= id2 + temp2id1= temp3

Optimizacion de codigo Se eliminan redundancias de operaciones y, quizas de datos, segun seprograme el compilador. Se hacen optimizaciones en los calculos, bucles, etc.

En nuestro caso:

temp1= id3 * 23id1= id2 + temp1

Generacion de codigo Se genera, a partir del codigo intermedio, probablemente optimizado, elcodigo final para la maquina.

En nuestro caso (pasandolo a ensamblador, cercano al lenguaje maquina):

MOVE id3, R1MUL 23, R1MOVE id2, R2ADD R1, R2MOVE R1, id1

Enlazado o linkado Aunque ya no es una fase propiamente de la compilacion, es la fase final demuchos compiladores para dejar el codigo ejecutable. En ella se unen todos los ficheros objetogenerados en diferentes etapas de compilacion. En este enlazado se calculan las direccionesde cada rutina que quedara en cada diferente modulo.

3.8. Ejercicios

. 1 ¿Que lenguaje genera la gramatica siguiente?

G = {T,N, P, I}T = a, b

N = S

I = S

P = S ::= ab|aPb|ε

. 2 Dado el lenguaje L = {0m1|m ≥ 0}, encontrar la gramatica, en notacion BNF, que lo genera.

. 3 Dado el lenguaje L = {an|n÷ 3}, encontrar la gramatica, en notacion BNF, que lo genera.3

. 4 Dado el lenguaje L = {anbm|m > n}, encontrar la gramatica, en notacion BNF, que logenera.

. 5 Proponer una gramatica en notacion BNF que genere el siguiente lenguaje: L = {an−1bn+1}.

. 6 Construye la gramatica que generarıa el lenguaje L = {ancb3n|n ≥ 0}.

. 7 Disena una gramatica que genere un lenguaje formado por palabras que contengan unica-mente las letras a y b en cualquir orden, pero de forma que en cada palabra haya el mismonumero de as que de bs. Por ejemplo, las palabras abab, aabb, babaab pertenecen al lenguaje,pero ababa no ya que en ella hay 3 apariciones de a y 2 de b.

3El sımbolo a÷ b indica que b divide a a.

Page 26: Descripci´on de algoritmos - Instituto Wienerwiener.edu.pe/manuales/1er-ciclo/ALGORITMOS/De... · Elementos de Programacion. ETSIT. 1o C, Apuntes del profesor Juan Falguerasa 2001/02

REFERENCIAS 26

. 8 Definir en BNF o mediante diagramas sintacticos la gramatica que genere las sentencias delsiguiente lenguaje L = {anb2nc3n|n ≥ 0}. Las sentencias de este lenguaje son aquellas queestan compuestas por una serie de letras a seguidas por el doble de letras b y terminadas porel triple de letras c; como por ejemplo abbccc, aabbbbcccccc, etc.

. 9 Construir una gramatica capaz de generar un lenguaje en el que no existiesen las cadenas‘abc’, pero sı cualesquiera otras de cualquier longitud. Por ejemplo, correcto: ‘xxaaacbbb’,incorrecto: ‘mnoabcquenoqueno’.

3.8.1. Referencias de consulta

Para el tema de los tipos de lenguaje se ha seguido el capıtulo primero de la excelente obra[PZ96] y tambien el primero de [AV97].

El capıtulo 6 de [AV97] es una buena referencia para la teorıa de gramaticas.El capıtulo 2 de [Pit92] es totalmente aprovechable.Asımismo el capıtulo 3 de [Ben90].

Referencias

[AV97] Doris Appleby and Julius J. VandeKopple. Programming Languages. Paradigm and Prac-tice. McGraw-Hill, 2nd edition edition, 1997.

[Ben90] J.P. Bennett. Introduction to Compiling Techniques. McGraw-Hill, 1990.

[Cho56] N. Chomsky. Three models for the description of language. IRE Trans. Inf. Theory,2(2):113–124, 1956.

[Cho63] N. Chomsky. Handbook of Mathematical Psichology, chapter 2. Formal properties ofgrammars, pages 323–418. John Wiley, and Sons, New York, 1963.

[Pit92] Thomas Pittman. The Art of Compiler Design. Prentice-Hall International, Inc., 1992.

[Pos43] E. Post. Formal reductions of the general combinatorial decision problems. Am. J. Math.,65:197–215, 1943.

[PZ96] Terrence W. Pratt and Marvin V. Zelkowitz. Programming Languages. Design and Im-plementation. Prentice-Hall, 2nd. edition edition, 1996.

[Sam69] J. Sammet. Programming Languages: History and fundamentals. Prentice-Hall, 1969.

Juan FalguerasDpto. Lenguajes y Ciencias de la Computacion

Universidad de MalagaDespacho 3.2.32