You are on page 1of 5

1.1.2. Caractersticas de los lenguajes convencionales Los lenguajes convencionales (o imperativos) estn inspirados en la arquitectura de von Neumann.

De hecho, los distintos recursos expresivos proporcionados por tales lenguajes pueden verse como abstracciones de los componentes de la mquina de von Neumann o como abstracciones de las operaciones elementales que toda mquina de von Neumann incorpora. Estos lenguajes utilizan las variables imitando las celdas de la MC, las instrucciones de control que generalizan las instrucciones de salto condicional o incondicional del lenguaje mquina y la instruccin de asignacin que engloba las instrucciones de carga (LOAD) y almacenamiento (STORE) del lenguaje mquina y tambin las de movimiento (MOVE). A s pues, los lenguajes de programacin convencionales, independientemente del nmero de niveles software existentes entre ellos y el lenguaje mquina, son en esencia una extensin del lenguaje mquina. La instruccin de asignacin resulta ser representativa del cuello de botella de von Neumann y nos obliga a pensar en trminos de trasiego de informacin entre celdas de memoria. Ms todava, Backus [8] ha hecho notar que la instruccin de asignacin separa la programacin en dos mundos. El primero comprende la parte derecha de las instrucciones de asignacin. Este es u n mundo de expresiones, con propiedades algebraicas muy tiles en el que se realiza la mayor parte del cmputo. El segundo es el mundo de las instrucciones, en el que la propia instruccin de asignacin puede considerarse una construccin primitiva en la que se basan las dems. Este es un mundo desordenado, con pocas propiedades matemticas tiles. Como ya puso de manifiesto Kowalski [81, 83] y despus de l otros autores (e.g. [6] y [124]), podemos distinguir dos aspectos fundamentales en las tareas de programacin: Aspectos lgicos: Esto es, Qu debe computarse?. Esta es la cuestin esencial y, de hecho, es la que motiva el uso de un ordenador como medio para resolver un determinado problema. Aspectos de control, entre los que podemos distinguir: Organizacin de la secuencia de cmputos en pequeos pasos. Gestin de la memoria durante la computacin. Dado que dichos aspectos lgicos y de control se refieren a componentes claramente distintos e independientes de las tareas de programacin (especificacin del problema e implementacin del programa que lo resuelve, respectivamente), parece deseable que los lenguajes de programacin nos permitan mantener las distancias entre ambos, sin necesidad de que las cuestiones implicadas en las tareas de especificacin e implementacin interfieran entre s [124]. A tendiendo a este criterio de independencia de los aspectos lgicos y de control, podemos elevar algunas crticas sobre el uso de los lenguajes imperativos. 1. L a presencia de instrucciones de control de flujo (sentencias i f, while, secuenciacin, etc) y las operaciones de gestin de memoria (distincin entre declaracin y definicin de una estructura o variable del programa; necesidad de reserva y liberacin explcita de la memoria; uso de punteros), oscurecen el contenido lgico (puramente descriptivo) del programa. 2. E n el mbito matemtico, un smbolo de variable siempre denota el mismo objeto, cualquiera que sea la ocurrencia de ese smbolo que consideremos. Sin embargo, la operacin de asignacin utiliza las variables de modo matemticamente impuro.

Por ejemplo, consideremos la siguiente instruccin de asignacin: x : =x+i. L a ocurrencia de la variable x en la parte derecha de la asignacin no denota lo mismo que la ocurrencia de la parte izquierda. La anterior instruccin debe entenderse en trminos de la siguiente orden: almacena, en la palabra a cuya direccin de memoria asociamos el identificador x , el resultado de sumar 1 al contenido de la palabra referenciada p o r dicho identificador x. E n general, la parte izquierda de una instruccin de asignacin debe entenderse como una direccin de palabra mientras que la parte derecha como una expresin que se evaluara para almacenar el resultado en la palabra cuya direccin es x . Este uso no matemtico de las variables, unido al hecho de que la instruccin de asignacin es sensible a la historia de la computacin, dificulta el razonamiento sobre las propiedades de los programas. E n general, no es suficiente con conocer el significado de los constituyentes del programa para establecer su significado sino que, en realidad, ese significado depende del contexto donde aparecen dichos constituyentes y de la historia previa de la computacin, que permite la introduccin de efectos laterales (es decir, el significado del programa no podr entenderse en trminos de composicionalidad). 3. Dejar las cuestiones de control al programador no parece lo ms indicado. Por ejemplo, un programa escrito en Pascal para una mquina de un nico procesador desaprovechara los recursos ofrecidos por una mquina con muchos procesadores. A menudo ser difcil para el compilador generar un cdigo que aproveche al mximo las caractersticas de la mquina objeto, puesto que parte del control (secuencial) estar ya especificado por el programador en el texto del programa [42, 120]. Concretamos algunos de los defectos de un lenguaje de programacin imperativa mediante el estudio del siguiente ejemplo: Ejemplo 1.1 Consideremos el conocido problema de la concatenacin de dos listas. Si decidimos resolverlo mediante el uso de un lenguaje convencional como el lenguaje C es necesario dotarse de una representacin explcita de las listas en la memoria del computador, adems de un conjunto de operaciones que las manipulen. Una posible solucin al problema viene dada por el siguiente programa: # include < stdio .h > # include < stdlib .h > typedef struct nodo { char dato ; struct nodo *enlace; } LISTA; void mostrar(LISTA *ptr) ; void insertar(LISTA ** ptr, char elemento); //hacer matriz dinmica o modificar un puntero en funcin LISTA *crear_lista() ; LISTA *concatenar(LISTA *ptrl, LISTA *ptr 2) ; void main () { LISTA *l1, *l2, *lis = NULL; l1 = crear_lista() ; l2 = crear_lista() ;

lis = concatenar(l1, l2); printf("\nLa nueva lista enlazada es:") ; mostrar(lis) ; } void mostrar(LISTA *ptr) { while (ptr != NULL) { printf("%c" ,ptr - > dato) ; ptr = ptr - > enlace; } printf (\n) ; } void insertar(LISTA **ptr, char elemento) { LISTA * p1, *p2; p1= *ptr ; if (p1 == NULL) { p1 = malloc (sizeof (L IS T A )) ; if ( p1 ! = NULL) { p1-> dato = elemento ; p1-> enlace = NULL; * ptr = p1; }
}
else

{ while (p1-> enlace != NULL) p1 = p1 - > enlace; p2 = malloc (sizeof (LISTA)) ; if ( p2 != NULL) {
p2 - > dato = elemento; p2 - > enlace = NULL; p1 - > enlace = p2 ; } } } LISTA * crear _lista()

{
LISTA *lis = NULL; char elemento; printf (\n Introduzca elementos:") ; do

{
elemento = getchar ( ) ; if (elemento != \n ) insertar (&lis, elemento) ; } while(elemento != ' \ n ' ) ;

return lis; } LIST * concatenar(LISTA * ptr1 , LISTA * ptr2 ) { LISTA * p1; p1 = ptr 1; while(p1 - > enlace != NULL) p1 = p1 - > enlace; p1 - > enlace = ptr2; return ptr1;

} Este programa ilustra y concreta algunas de las propiedades de los lenguajes convencionales ya mencionadas junto a otras nuevas: 1. La secuencia de instrucciones que constituyen el programa son rdenes a la mquina que operan sobre un estado declarado no explcitamente. Esta es la razn por la que esta clase de lenguajes se denominan lenguajes imperativos.

2. Para entender el programa debemos ejecutarlo mentalmente siguiendo el modelo de computacin


de von Neumann, estudiando cmo cambian los contenidos de las variables y otras estructuras en la MC. 3. Es necesario gestionar explcitamente la MC, lo que conduce al uso de la llamada al sistema
malloc()

para la reserva de MC, y al empleo de variables de tipo puntero, de semntica y sintaxis

confusa y, por lo tanto, de difcil uso. La manipulacin de punteros es una de las fuentes de errores ms comunes en la programacin con este tipo de lenguajes. 4. El programa acusa una falta de generalidad debido a la rigidez del lenguaje a la hora de definir nuevos tipos de datos. Por ejemplo, este programa solo puede usarse para concatenar listas de caracteres. Si quisisemos concatenar otros tipos de listas deberamos rehacer el programa. 5. La lgica y el control estn mezclados, lo que dificulta la verificacin formal del programa. En este apartado hemos puesto de manifiesto los puntos dbiles de los lenguajes convencionales, que justifican el estudio de otros paradigmas de programacin. Sin embargo, el lector debe ser consciente de que renen otras muchas ventajas que han hecho de ellos los lenguajes preferidos de los programadores en amplias reas de aplicacin (e.g., computacin numrica, gestin y tratamiento de la informacin, programacin de sistemas). Entre estas ventajas podramos citan eficiencia en la ejecucin; modularidad; herramientas para la compilacin separada; herramientas para la depuracin de errores. En el Apartado 1.3 ampliaremos la informacin sobre las ventajas y el rea de aplicacin de estos lenguajes.

#include <stdio.h> #include <stdlib.h> /* requerida para malloc y free funciones */

#include <iostream> using namespace std; int main() { int number; int *ptr; int i; printf("Cuantos nmeros enteros desea ingresar? "); scanf("%d", &number); //En algunos compiladores podras usarlo as //ptr = malloc(number*sizeof(int)); /* Creamos el espacio de memoria en forma dinmica */ //Nosotros tenemos DEV C++ y tenemos que hacerlo as para que funcione. ptr = (int *)malloc(number*sizeof(int)); /* Creamos el espacio de memoria en forma dinmica */ if(ptr!=NULL) { for(i=0 ; i<number ; i++) { *(ptr+i) = i; } for(i=number ; i>0 ; i--) { printf("%d\n", *(ptr+(i-1))); /* Imprimimos en orden inverso */ } free(ptr); /* Liberamos la memoria reservada */ system("PAUSE"); return 0; } else { printf("\nLa reserva de memoria no suficiente memoria.\n"); return 1; } } //Cuando trata de un lenguaje no explicito, por ejemplo, se declara sum += convert(line); por la simple forma, se sabe que convert es una funcin.
Programacin imperativa: La programacin imperativa como su nombre indica implementa los programas como una serie de rdenes que la mquina tiene que cumplir. Es el tipo de programacin ms extendida y los lenguajes de programacin imperativa suelen ser de mbito general. Ejemplos de estos lenguajes son el: Fortran, Cobol, Algo160, Pascal o C.

You might also like