Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
A fines de los 1940, las computadoras tenan memorias muy pequeas (del orden de 1K), y
por tanto se requera cdigo muy compacto.
Las computadoras de esa poca tambin eran muy lentas, por lo que se pona gran nfasis
en la eficiencia en tiempo de ejecucin.
John von Neumann y Herman Goldstine inventaron los diagramas de flujo. Estas ayudas
eran representaciones grficas de los algoritmos que facilitaban en cierta medida la
programacin.
Luego aparecieron los Ensambladores, que usaban letras en lugar de nmeros para denotar
las instrucciones como por ejemplo ADD 01 34. En lenguaje ensamblador los comandos
son mnemnicos y cada instruccin en ensamblador general exactamente una instruccin
en lenguaje de mquina.
Los primeros pseudo-cdigos aparecieron en 1951, inspirados sobre todo por el hecho de
que las rutinas de punto flotante y de indizacin simplificaban considerablemente el
proceso de programacin, se popularizaron pequeas rutinas desarrolladas para realizar
operaciones de estos tipos.
1
Plp 1
La manera de usar estas rutinas era llamarlas como subrutinas, entonces el programa pasa a
ser una lista de stas subrutinas y sus datos. Se insertaba el cdigo de las subrutinas como si
fuese una expansin de macros (compilacin).
2
Plp 1
Una de las mejoras que se fueron introduciendo a los intrpretes de pseudocdigo fueron
las etiquetas simblicas, sus clasificaciones, usos e implementacin son los siguientes:
Etiquetas para las sentencias (instrucciones). Su uso hace mucho ms fcil el poder
sumar posiciones de memoria. Sin embargo, su uso requiere de una operacin
previa de definicin de etiquetas.
Etiquetas para las variables. Se requiere una operacin para declarar variables, as
como sus tipos (arreglos contra punto flotante)
Asociacin (binding) Las declaraciones asocian una cierta etiqueta con una posicin
de memoria (del programa o de datos)
3
Plp 1
Otro punto importante y referido a la sintaxis del pseudo-cdigo era definir el formato que
implica:
Uso de caracteres. Esto es un mero cambio de la sintaxis que, sin embargo, mejora
considerablemente la legibilidad de los programas.
A grandes rasgos el pseudo-cdigo tiene el mismo principio bsico que los compiladores:
usa una tabla de nombres y efecta asignacin de espacios de almacenamiento.
Para disear un pseudo-cdigo se necesita entonces:
Elementos:
Aritmticas.
Identidad (mover)
4
Plp 1
Flujo de control:
o Finalizar (programa)
El uso de ciclos es una abstraccin que evita la repeticin del cuerpo del mismo
muchas veces y pueden implementarse eficientemente.
Debe tenerse en cuenta, sin embargo, que el exceso de ortogonalidad tambin es malo.
Podemos llegar a tener demasiadas operaciones, algunas de las cuales sean intiles o
difciles de implementar. De hecho, algunas de ellas podran incluso ser ilegales (en cuyo
caso debern recordarse como excepciones)
En este punto se pueden definir o establecer ciertos principios que hacen a los
lenguajes
5
Plp 1
Evitar requerir que la misma cosa se tenga que definir ms de una vez;
factorizando el patrn recurrente.
No requerir del usuario que tenga que saber la posicin absoluta de un elemento
en una lista. En vez de eso, asocie etiquetas con cualquier posicin que debe ser
referenciada ms adelante.
Los primeros LP no reconocan el importante rol de la abstraccin. Por ejemplo, en los 50,
el nico mecanismo de abstraccin provisto por los lenguajes assembler sobre los lenguajes
de mquina era el nombrado simblico (mediante el cual el programador poda usar
trminos auto-explicatorios para nombrar cdigos de operacin y poda simblicamente
nombrar posiciones de memoria; as el programador poda abstraerse de cdigos de
operacin no mnemotcnicos y de la ubicacin exacta de las posiciones de memoria).
6
Plp 1
Los subprogramas (y las macros) fueron introducidos por los lenguajes ensambladores
como un medio para nombrar a una actividad descripta por un grupo de acciones y
considerarla como una accin simple. En nuestro ejemplo, la reduccin de escalas,
perspectivas, proyecciones, etc. podran ser dibujadas por los subprogramas apropiados.
Los subprogramas son herramientas tiles para la programacin metdica porque ellos son
mecanismos para implementar abstracciones. Un subprograma es la implementacin de una
abstraccin y la llamada a un subprograma representa el uso de la abstraccin.
A finales de 1950 aparecieron LP con un conjunto muy rico de mecanismos para definir
abstracciones. Estos mecanismos pueden ser usados para definir abstracciones de datos y
abstracciones de control o procedurales.
Los lenguajes de mquina ven a los datos almacenados como cadenas de bits que pueden
ser manejadas por las instrucciones de mquina. el repertorio de instrucciones incluye
desplazamientos, operaciones lgicas, aritmtica de punto fijo, y varias operaciones ms.
Como consecuencia, ningn lenguaje era adecuado para todas las aplicaciones porque el
programador est limitado por el poder expresivo de un conjunto fijo de abstracciones
suministradas por el lenguaje. Por ejemplo, FORTRAN, no es el lenguaje apropiado para
manipulacin de strings, ni COBOL lo es para resolver un sistema de ecuaciones
diferenciales; y ninguno de los dos es particularmente apropiado para la manipulacin de
matrices o aplicaciones que requieren estructuras de datos altamente dinmicas con una
variedad de formas de acceso.
PL/I que trat de ser un lenguaje universal, incorporando gran cantidad de abstracciones
incluidas en el lenguaje, en lugar de un mecanismo que permita definir nuevas
abstracciones se convirti en un lenguaje difcil de dominar e inseguro.
7
Plp 1
Estos lenguajes, con un enfoque menos ambicioso pero ms efectivo, trataron de lograr
generalidad suministrando mecanismos flexibles y fciles de usar (mediante los cuales el
programador puede definir nuevas abstracciones) en lugar de intentar suministrar un
conjunto exhaustivo de abstracciones ya incluidas en el lenguaje. Tal enfoque ajusta muy
naturalmente con una metodologa de diseo basada en el reconocimiento de abstracciones.
Adems, las abstracciones identificadas para el diseo del software llegarn a estar
reflejadas por la estructura resultante del programa. Consecuentemente los programas son
ms fciles de leer y modificar y tienen una probabilidad mayor de ser correctos.
El tipo recientemente definido student es una estructura de datos con tres componentes
usados para almacenar la identificacin del estudiante. El tipo curso est definido como una
tabla de estudiantes (attendants), junto con el nmero de estudiantes (no_of_students: un
entero entre 0 y 20) registrados para el curso.
Una pregunta natural es porqu elegimos representar los estudiantes y cursos como lo
describimos anteriormente? Mas an, porque necesitamos una estructura de datos para los
estudiantes y los cursos? Las respuestas a estas preguntas estn en las motivaciones del
programa y las abstracciones que son identificadas durante la etapa de diseo. Es imposible
contestar simplemente investigando en el programa. Podra ser til tener un lenguaje que
permite la clarificacin de tales cuestiones como parte del programa.
Por ejemplo, podemos imaginar que el programa resuelve una aplicacin para un profesor
de ciencias de la computacin, quien ensea comp_sci_15, comp_sci_140 y comp_sci_240.
Este profesor recibe de la oficina de registraciones una pila de tarjetas que contienen los
8
Plp 1
datos de los estudiantes que se registraron para estos cursos y desea obtener listados
ordenados de los estudiantes, ordenados por curso.
Podemos tambin imaginar que el tipo course ha sido definido porque se necesita para
operar sobre objetos de datos como comp_sci_15, mediante insercin de un nuevo
estudiante (en el orden apropiado) y impresin de los nombres de los estudiantes
registrados. La versin inicial abstracta del programa podra ser:
Los procedimientos insert y print estn muy relacionados con el tipo course. Ellos son
operaciones concretas que manejan datos de tipo course. Sin embargo, tanto en ALGOL 68
como en Pascal, aunque se permita definir nuevos tipos de datos, no se los relacionaba de
una forma explcita con los procedimientos que los manejaban.
Por otro lado, SIMULA 67 provee una construccin (la clase) que permite que la
representacin y las operaciones concretas sean especificadas en una unidad sintctica
simple. Esto mejora considerablemente la legibilidad de los programas, porque las
entidades relacionadas que implementan una cierta abstraccin son agrupadas juntas.
9
Plp 1
Hay similaridades entre los tipos de datos definidos por el usuario de Pascal, ALGOL 68 y
SIMULA 67 y los tipos de datos predefinidos de estos lenguajes (por ejemplo los integers y
el tipo course definido antes.
Ambos tipos son abstracciones construidas sobre una representacin subyacente (una
cadena de bits para los integers y un record para course); ambos tipos tienen un conjunto
asociado de operaciones (operaciones aritmticas y de comparacin para los integers; insert
y print para course)
En un punto importante, sin embargo, estos dos tipos difieren: los tipos predefinidos
ocultan al programador la representacin subyacente: no pueden ser directamente
manipulados. Por ejemplo: el programador no puede acceder a un bit particular de los que
representa un integer. Por otra parte los procedimientos insert y print no son la nica forma
de acceder y manipular un dato del tipo course. El programador puede acceder directamente
a los componentes de objetos del tipo course y no est forzado a utilizar los procedimientos
que el mismo defini para dicho tipo. Por ejemplo:
comp_sci_240.no_of_student:=17;
podra ser una operacin legal (pero muy probablemente no deseable) que modifique el
nmero de estudiantes registrados en comp_sci_240. En otras palabras, no hay una
distincin forzada por el lenguaje entre los dos niveles de abstraccin: el nivel en el cual
uno puede usar courses como objetos nuevos, y el nivel en el cual uno implementa courses
en trminos de abstracciones de bajo nivel. Al mismo tiempo, el programador puede ver
courses como un objeto abstracto manipulable mediante las operaciones print y insert y
como un agregado de datos particular cuyos componentes pueden ser accedidos y
modificados individualmente.
Esta confusin entre niveles de abstraccin puede llevar a la produccin de programas que
sean difciles de leer. Y an ms importante, reduce la modificabilidad de los programas.
Supongamos que decidimos cambiar la representacin de tablas a una estructura de lista
secuencial o a un rbol binario. Los cambios no estn localizados dentro de las declaracin
de los datos y las operaciones concretas. Es adems necesario chequear todos los accesos
directos a la representacin de los datos, los cuales pueden aparecer en todo el programa.
Los tipos de datos definidos por el usuario que satisfacen las propiedades a y b se llaman
tipos de datos abstractos. La propiedad a) hace que la versin final de un programa refleje
10
Plp 1
Los lenguajes tradicionales han fallado en alguno de los dos puntos. La clase de SIMULA
67 satisface el punto a, pero no el b. Lenguajes ms recientes como CLU y ADA proveen
facilidades para definir TDAs (tipos de datos abstractos) que satisfacen ambas propiedades.
Abstraccin de control
Las EC se pueden clasificar en EC a nivel de sentencia (aquellas que son usadas para
ordenar la activacin de sentencias individuales) y EC a nivel de unidad (aquellas que son
usadas para ordenar la activacin de unidades de programa)
El hardware convencional provee dos mecanismos simples para gobernar el flujo de control
sobre instrucciones individuales: secuencia y bifurcacin. La secuencia se implementa
incrementando automticamente el contador del programa luego de cada instruccin. Esto
permite que las instrucciones se almacenen en posiciones de memoria consecutivas para ser
ejecutadas una luego de la otra. El contador del programa puede tambin ser explcitamente
alterado por una instruccin de bifurcacin que transfiere el control a una posicin
especificada distinta que la prxima en la secuencia.
set register to N;
loop : if el valor en el registro es cero jump to after;
<cuerpo del ciclo>;
restaurar el valor del contador en el registro (si es necesario);
11
Plp 1
y decrementarlo en 1;
jump to loop;
after : .....................
Las estructuras de control a nivel de mquina son difciles de usar y tienden a incorporar
errores. Los programas resultantes son difciles de leer y mantener, porque estas estructuras
no son naturales para los humanos. Los humanos organizan sus procesos computacionales
de acuerdo a algunos patrones estndares, tales como la repeticin o seleccin entre
diferentes opciones. Una forma ms natural de describir el programa anterior, sera:
Estructuras de control orientadas a los usuarios han sido incorporadas en lenguaje de alto
nivel para facilitar la programacin y promover un mejor estilo de programacin. Sin
embargo, los lenguajes de alto nivel retienen la bifurcacin, en la forma de sentencias goto,
y por lo tanto, tambin soportan un estilo de programacin de bajo nivel. La sentencia goto
es una fuente de oscuridad en la programacin. La controversia del goto (1970) no di una
solucin definitiva al problema de cules estructuras de control deberan ser incluidas en un
lenguaje de programacin. Pero hay un acuerdo general de que las sentencias goto deberan
ser usadas slo como una tcnica para sintetizar estructuras de control legtimas si el
lenguaje no lo permite.
Subprogramas y bloques
Los LP proveen facilidades para agrupar sentencias implementando una accin abstracta en
una unidad de programa adecuada. El ejemplo ms simple y til es el subprograma. La
definicin de un subprograma le da un nombre a una cierta unidad de programa. Una
llamada al subprograma invoca a la unidad de programa, es decir, transfiere el control a la
unidad llamada. Las convenciones de paso de parmetros permiten que las unidades
explcitamente intercambien informacin.
Los subprogramas, y en menor grado, los bloques; son herramientas tiles para la
estructuracin de un programa. En particular, los subprogramas soportan la distincin entre
la definicin de una accin abstracta (el cuerpo del subprograma) y su uso (la llamada al
subprograma)
12
Plp 1
Manejo de excepciones
Los eventos que una unidad de programa puede encontrar durante su ejecucin pueden ser
ordinarios o excepcionales (por ejemplo: error de divisin por cero, error en el protocolo de
comunicaciones)
Para hacer el programa ms fcil de leer e indicar las suposiciones del programador acerca
de los hechos inesperados, es deseable poder dividir el programa en varias unidades.
Algunas unidades manejan los eventos ordinarios y pueden detectar la ocurrencia de
condiciones anmalas o excepcionales (llamadas excepciones). La ocurrencia de una
excepcin implcitamente transfiere el control a una unidad apropiada, llamada 'manejador
de excepciones', que se encarga de tratar a la excepcin.
PL/I fue el primer lenguaje de alto nivel en suministrar caractersticas para el manejo de
excepciones.
Corrutinas
Cada corrutina que representa un jugador del juego de cartas podra tener la siguiente
estructura general, observe la pgina siguiente.
13
Plp 1
end_of_do
Unidades concurrentes
Las corrutinas se ajustan perfectamente para modelar actividades que son ejecutadas en
forma intercalada. Sin embargo, en muchas aplicaciones, es til modelar un sistema como
un conjunto de unidades, llamadas unidades concurrentes, cuya ejecucin procede en
paralelo (aunque realmente se ejecuten o no en paralelo). Esta facilidad es particularmente
importante en reas tales como los sistemas operativos. En la descripcin de las unidades
concurrentes, es necesario abstraerse de la arquitectura fsica de la mquina subyacente. La
mquina podra ser un multiprocesador con cada procesador dedicado a una unidad simple,
o podra ser un uniprocesador multiprogramado. Permitir esto, significa que la correccin
de un sistema concurrente no puede estar basada en alguna suposicin sobre la velocidad de
ejecucin de las unidades.
Las corrutinas son una construccin de bajo nivel para describir unidades concurrentes.
Ellas pueden ser usadas para estimular el paralelismo sobre un nico procesador
intercalando explcitamente la ejecucin de un conjunto de unidades concurrentes. Por lo
tanto, ellas no describen un conjunto de unidades concurrentes, sino una forma particular de
compartir procesador para estimular la concurrencia. Muchos de los lenguajes de
programacin ms recientes suministran caractersticas especializadas para tratar con la
concurrencia.
Correccin de un programa
Un programa ser correcto si este cumple con sus especificaciones. Por otro lado un
programa es confiable si es altamente probable que cuando demandamos un servicio del
14
Plp 1
2. El error no se manifiesta muy a menudo, o no ocurre en situaciones crticas. Por ej. ser
admisible perder algunos paquetes en un sistema de conmutacin de mensajes en casos
de sobrecarga del sistema. Por el contrario, la prdida de datos puede ser inaceptable si
los datos son usados para monitorear una planta nuclear en tiempo real, y las
situaciones de emergencia deben ser manejadas tan pronto como los datos crticos sean
recibidos por el computador.
Por otro lado, softwares que son estrictamente correctos pueden no ser confiables. De
hecho, la correccin de un programa se define con relacin a sus especificaciones, as
que el programa puede ser correcto an si no logra satisfacer las necesidades de los
usuarios.
15
Plp 1
Obviamente ningn programa se puede desarrollar tan cuidadosamente como para estar
seguro que no tiene errores. La mayora del costo de la produccin de software proviene de
la correccin de errores, pero la adopcin de enfoques sistemticos apropiados en el diseo
del software puede ayudar a prevenir la introduccin de errores.
Los chequeos de consistencia realizados antes de la ejecucin del programa son llamados
chequeos estticos, mientras que los realizados durante la ejecucin son llamados chequeos
en tiempo de corrida (o dinmicos) Los chequeos sintcticos realizados por el intrprete
son un ejemplo de chequeos estticos, al igual que los chequeos de tipo. El siguiente
fragmento de programa Pascal ilustra estos puntos:
var x, y: integer;
z: char;
.
.
.
x:= (((x + y) * 5 + x * y);
if x < 0 then y:=z;
.
.
16
Plp 1
Aunque cualquier error detectable estticamente podra ser tambin detectado en tiempo de
ejecucin, podra ser no conveniente retardar tal chequeo de error hasta el momento de la
ejecucin por dos razones. Primero, fuentes potenciales de error podran slo ser detectadas
en tiempo de ejecucin con datos de entrada que causan que surja el error; por ejemplo, el
fragmento incorrecto antes citado sealara el error de tipo slo si x es negativo. Segundo,
los chequeos dinmicos hacen ms lenta la ejecucin del programa.
No todos los lenguajes permiten que se pueda realizar el chequeo de tipos completamente
sobre un programa antes de su ejecucin. En APL el tipo de una variable est determinado
por el valor actual de la variable, y por lo tanto puede cambiar durante la ejecucin del
programa, como lo muestra el siguiente fragmento de programa.
A <-- STRING
.
.
A <-- 3.77
Como una consecuencia, sumar un valor numrico a A ser correcto slo si el valor actual
de A es un nmero y no un string de caracteres. Pero, generalmente, esto slo se puede
testear en tiempo de ejecucin.
Como conclusin, la correccin de un programa puede ser mejorada por un lenguaje cuya
definicin requiera chequeos intensivos sobre los programas, y mejor an si ellos pueden
ser realizados estticamente. Los primeros lenguajes de programacin no reconocan la
necesidad de caractersticas del lenguaje que soporten la certificacin de programas. La
mayora de los lenguajes recientes, por otra parte, han sido diseados con el objetivos de
soportar chequeos de programas intensivos.
17
Plp 1
su vez, se entiende aqu como una descripcin formal y precisa de lo que el programa tiene
que hacer.
La verificacin de programas puede ser hecha manualmente, pero en ese caso la confianza
de que el programa sea correcto depende de la confianza en que la prueba en s misma sea
correcta. Tambin se implementaron sistemas automticos para la verificacin automtica
de programas, pero todava es limitada la experiencia con su uso en sistemas prcticos y
grandes. Un ejemplo se informa en (Walker et al. 1979). Los autores de este experimento
llegan a la conclusin de que parece haber razones no tcnicas, distintas de la necesidad
por un sistema de verificacin (asistido por computadora) apropiado, por las cuales no se
utilizaran los mtodos de prueba de programas para el desarrollo de software donde la
operacin correcta es crtica... Sin embargo, las tcnicas actuales, todava no son apropiadas
para uso general. La verificacin de programas slo es posible si la semntica del lenguaje
ha sido definida formalmente.
18
Plp 1
Una nocin mas til de modularidad se da en trminos de independencia. Esto significa que
cada mdulo debera ser entendido y posiblemente, implementado independientemente de
los otros mdulos del sistema. Cada mdulo debera realizar una funcin conceptual simple
y singular del sistema. Consecuentemente las restricciones en el tamao de un mdulo se
satisfacen automticamente como una consecuencia del proceso de diseo. El ocultamiento
de la informacin como un principio de diseo favorece la produccin de mdulos
altamente independientes. De hecho, las decisiones de diseo internas a un mdulo, estn
ocultas y no afectan la cooperacin correcta entre los mdulos. Una vez que las interfaces
del mdulo han sido (cuidadosamente) diseadas, los mdulos pueden ser desarrollados
independientemente unos de otros, almacenados en una librera, y ms tarde ensamblados
para construir un nico programa.
El objetivo de disear software modular ejerce una fuerte influencia sobre los LP. Los LP
deberan proveer facilidades para la definicin de los mdulos y para el ocultamiento de
informacin. Adems deberan proveer facilidades para estructurar una coleccin de
mdulos en un nico sistema. Finalmente debera ser posible desarrollar y certificar los
mdulos separadamente. Algunos diseos de lenguajes recientes (por ej. Ada) han sido
fuertemente influenciados por estos conceptos.
19