1. 80 Historia del software en computación aplicado a la informática educativa.
realiza cualquier acción con el software que no esté permitida se produciría una
piratería de software. Estas licencias llegan hasta el punto de regular el número de
copias que pueden ser instaladas e incluso los fines concretos para los cuales puede
ser utilizado. La mayoría de estas licencias limitan fuertemente la responsabilidad
derivada de fallos en el programa. Normalmente, los fabricantes de programas
sometidos a este tipo de licencias ofrecen servicios de soporte técnico y
actualizaciones durante el tiempo de vida del producto.
Algunos ejemplos de este tipo de licencias son las llamadas CLUFs (Contrato de
Licencia para Usuario Final) o EULAs (End User License Agreement) por sus siglas en
Inglés.
El software de dominio público, es decir, que no dispone de licencia, puede ser
utilizado, copiado, modificado y redistribuido con o sin fines de lucro.
3.6. Eras del software.
Hasta ahora hemos visto que hay diferentes tipos de software. En este punto
veremos cómo ha ido cambiando su importancia y utilidad desde el inicio de la
computación. Podemos decir que el software ha evolucionado a través de eras o
generaciones que coinciden aproximadamente con las décadas. Por ahora hay cinco
eras o generaciones que explicaremos a continuación.
3.6.1. Primera Era (1945-55).[7][37][32][19][11][9]
Como ya se ha dicho en la introducción de la evolución del software durante los
primeros años de la aparición de las computadoras, el software se contemplaba como
un añadido. Desde entonces hasta ahora, el software se ha desarrollado
tremendamente.
El software se desarrollaba sin ninguna planificación anterior y con un alto coste
monetario, ya que el coste de los programadores asociados a un centro de
computación superaba el coste del ordenador, en una escala creciente, pues la
tecnología iba bajando de precio, y con ello descendían los precios de los ordenadores.
El software se realizaba virtualmente y a menudo los planes no salían como ellos
querían. Los programadores intentaban hacer bien todas las operaciones pero esto
requería mucho esfuerzo, aunque a menudo les salían con éxito. Los problemas que
debían resolver eran técnicos y se centraban principalmente en expresar algoritmos
conocidos en algún lenguaje de programación. El software era realizado por una sola
persona, lo escribía, lo ejecutaba y lo depuraba.
Daniel Merchán López. 2013
2. Historia del software en computación aplicado a la informática educativa. 81
Debido a este entorno, el diseño era un proceso implícito, realizado en la mente de
alguien, y la documentación normalmente no existía. Los vendedores exageraban
tanto sus prestaciones, en la peor tradición comercial engañosa, que resultaron
contraproducentes y generaron un amplio escepticismo hacia estos sistemas.
Podemos decir que en esta generación el hardware era de propósito general mientras
que el software se diseñaba a medida para cada aplicación y tenía una distribución
relativamente pequeña.
Los computadores de la primera generación no disponían de sistema operativo, el
programador interactuaba directamente con el hardware del computador. La
introducción y control de la ejecución de programas se hacía manualmente y uno a
uno. Para interactuar con estas máquinas se disponía de una consola compuesta por
conmutadores, indicadores luminosos, un dispositivo de entrada (por ejemplo un
lector de tarjetas) y una impresora. Los programas, que estaban hechos en código
máquina, se cargaban desde el dispositivo de entrada. Cuando se producía algún error,
éste se indicaba a través de los indicadores luminosos. Así el programador podía
determinar la causa del error examinando los registros y la memoria principal. Cuando
el programa se ejecutaba correctamente proporcionaba los resultados a través de la
impresora.
Como hemos dicho anteriormente el programa era ejecutado uno a uno y
manualmente. Esto lo hacía un solo programador que era el que en ese momento
accedía a la máquina. Uno de los principales problemas era que en ésta generación el
computador estaba la mayor parte del tiempo desocupado pues tardaba mucho
tiempo en realizar las transferencias de datos con los periféricos de entrada/salida. El
tiempo de cada programador era anotado en una hoja de reservas; cada operador
reservaba el tiempo que él creía que tardaría en terminar la tarea. Para empezar a
operar el programador debía insertar su tablero de conmutación en la computadora y
cuando terminaba antes de la hora prevista dejaba el computador desocupado. La
mayoría de las operaciones consistían en cálculos numéricos directos, como la
producción de tablas de senos y cosenos.
Otro gran problema era el tiempo de preparación de los programas también, llamado
trabajo. Para cada uno se cargaba un compilador y se guardaba en la memoria, salvaba
el programa compilado y por último cargaba y montaba el programa objeto junto con
las funciones comunes. Aparte de toda esta tarea, que se realizaba a mano y por
cualquier error debía volver al inicio del proceso, el programador debía tener cuidado
con los tubos de vacío, era fácil que alguno fallara y tuvieran que realizar todas las
operaciones más de una vez. Esto implicaba una pérdida considerable de tiempo. Este
modo de operación lo podemos denominar proceso en serie puesto que refleja el
hecho de que los usuarios accedían al computador en serie.
Daniel Merchán López. 2013
3. 82 Historia del software en computación aplicado a la informática educativa.
En esta generación, los computadores se programaban en lenguaje máquina, estando
por tanto, cada instrucción constituida por una secuencia de números, con los
consiguientes inconvenientes en cuanto a legibilidad, falta de versatilidad,
dependencia del computador, etc. Es de destacar el concepto de subrutina. La
subrutina ya estaba presente en esta primera etapa, y con ellas los programadores no
tenían que reprogramar módulos comunes a un mismo programa, o lo que es lo mismo
disponían de subrutinas abiertas.
El programa "Hola mundo" escrito en código binario (Utilizo el código ASCII extendido
de 8 bits) sería:
0100 1000 = H
0110 1111 = o
0110 1100 = l
0110 0001 = a
0010 0000 = espacio()
0110 1101 = m
0111 0101 = u
0110 1110 = n
0110 0100 = d
0110 1111 = o
Hola = 0100 1000 - 0110 1111 - 0110 1100 - 0110 0001 Espacio () = 0010 0000
mundo = 0110 1101 - 0111 0101 - 0110 1110 - 0110 0100 - 0110 1111
A comienzos de 1950 se idean los primeros lenguajes simbólicos, con los que las
operaciones se pueden representar por nemónicos. Un nemónico es un dato simbólico
que identifica a un comando generalmente numérico (binario, octal, hexadecimal) de
una forma más sencilla que su numeración original, lo cual facilita radicalmente la
memorización de este comando para el programador. La rutina había mejorado un
poco con la introducción de las tarjetas perforadas. Ahora era posible escribir
programas en tarjetas e introducirlas para ser leídas, en lugar de usar tableros de
conmutación; por lo demás, el procedimiento era el mismo.
Daniel Merchán López. 2013
4. Historia del software en computación aplicado a la informática educativa. 83
En 1952, Grace Hopper (Fig.
48), desarrolló un sistema de
programación automática con
un primer compilador: A-0, del
que más adelante salieron
nuevas versiones como, A-1 y
A-2, siendo ésta última la que
en 1953 se puso a disposición
de los clientes del UNIVAC I.
Para Hopper este compilador
era solamente una rutina que
produce un programa
específico para un problema
particular, o lo que es lo
mismo, este compilador servía
para copiar unas determinadas
subrutinas en el lugar
apropiado del nuevo programa
realizado.
Fig. 48. Grace Hopper con el UNIVAC 1.
En 1953 Nathan Rochester diseñó el primer lenguaje ensamblador e implementó el
programa correspondiente que traducía instrucciones simbólicas en instrucciones
máquina. Con los lenguajes ensambladores se cometían menos errores y el consumo
de tiempo de la programación era menor que en los lenguajes de primera generación
utilizados por los primeros computadores, liberando a los programadores de trabajos
como recordar códigos numéricos o cálculo de direcciones. Un lenguaje ensamblador
conocido de la época fue el SOAP utilizado para el computador IBM 650.
Este sería el programa "Hola Mundo" escrito en lenguaje ensamblado x86 para
GNU/Linux:
section .data
msg db "¡Hola Mundo!", 0Ah
len equ $ - msg
section .text
global _start
_start:
mov eax, 04h
mov ebx, 01h
mov ecx, msg
mov edx, len
int 80h
mov eax, 01h
mov ebx, 00h
int 80h
Daniel Merchán López. 2013
5. 84 Historia del software en computación aplicado a la informática educativa.
Se desarrollaron otras ayudas en la programación como generadores de programas
(Short Code, Speedcoding, Sort-Merge Generator, Autocode) y los primeros esbozos de
compiladores (serie A de Remington Rank). El Short Code era de John Mauchly, éste
operaba originariamente en un BINAC como lenguaje interpretado. Las rutinas
correspondientes a los símbolos se encontraban en memoria y eran invocadas por el
sistema. El UNIVAC heredó este sistema. Los programas escritos en este lenguaje
interpretado eran unas 50 veces más lentos que el mismo programa en el lenguaje
máquina. Por su parte, el Sort-Merge Generator era una aplicación desarrollada para el
UNIVAC, que producía el programa en código máquina para ordenar y mezclar ficheros
que contenían las operaciones de entrada y salida, aunque antes había que especificar
los ficheros con los que iba a operar.
Laning y Zieler desarrollaron un programa para traducir ecuaciones matemáticas para
el Whirlwind I de Jay Forrester en el MIT (una máquina que se terminó de construir en
el año 1951), y construyeron el primer compilador que no tuvo un nombre específico.
En enero de 1954, el MIT distribuyó copias de este compilador a unos pocos usuarios
del Whirlwind.
Fig. 49. Computador Whirlwind para el que desarrollaron el programa de traducir ecuaciones.
Estos primeros sistemas también llamados sistemas de programación automática
(automatic programming systems), se limitaban a proporcionar códigos de operación
mnemotécnicos y direcciones simbólicas, o a obtener subrutinas de una biblioteca de
rutinas e insertar el código previa sustitución de las direcciones de los operandos.
Algunos sistemas permitían la interpretación de operaciones de coma flotante y de
indexación (indexing). De todas maneras, con excepción del compilador A-2 y el
sistema algebraico de Laning y Zierler, hasta el año 1954 ni siquiera los sistemas más
potentes proporcionaban más que una maquina sintética con un código diferente al de
la máquina real.
Daniel Merchán López. 2013