Unidad I · Tema 1.1 Disponible

Historia y antecedentes

De las máquinas que se programaban con cables a los lenguajes actuales: cada avance responde a un problema.

Objetivo de aprendizaje

Al concluir este tema, el estudiante será capaz de:

  1. Explicar cómo se programaban las primeras computadoras y por qué ese método limitaba el trabajo.
  2. Describir el concepto de programa almacenado.
  3. Distinguir lenguaje máquina, ensamblador y lenguaje de alto nivel, y traducir entre los dos primeros con una máquina de juguete.
  4. Relacionar los lenguajes con el problema que buscaban resolver y ubicar en el tiempo los paradigmas del curso.
  5. Argumentar que la historia de los lenguajes es una secuencia de respuestas a problemas, con un nivel de abstracción creciente.

Ruta de trabajo del tema

Etapa Contenido Producto del estudiante
1 Planteamiento inicial Hipótesis escrita: cadena problema → solución
2 Primera etapa: máquinas y programa almacenado Traducción binaria ↔ ensamblador
3 Segunda etapa: el ensamblador Idea de traducción automática
4 Tercera etapa: lenguajes de alto nivel Relación lenguaje → problema
5 Los paradigmas en el tiempo Clasificación de lenguajes
6 La abstracción creciente Síntesis y reformulación

1. Planteamiento inicial

Hoy se programa en lenguajes como Python o Java, con instrucciones casi legibles. Las primeras computadoras electrónicas, construidas en la década de 1940, no disponían de nada parecido. Lo que sabemos sobre cómo funciona una computadora (que ejecuta instrucciones elementales de manera literal) sugiere que programarlas debió ser muy distinto.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Esta hipótesis se retomará al final del tema.


2. Primera etapa: máquinas que se programaban con cables y con números

2.1 De las notas de Lovelace a ENIAC

El antecedente conceptual más antiguo suele situarse en 1843, cuando Ada Lovelace publicó notas sobre la Máquina Analítica de Babbage que incluían un algoritmo para calcular números de Bernoulli. Muchos autores lo consideran el primer programa concebido para una máquina, aunque la máquina nunca llegó a construirse.

Las primeras computadoras electrónicas aparecieron en la década de 1940. ENIAC, terminada en 1945, era una máquina de propósito general, pero se programaba reconfigurando cables e interruptores: para cambiar de problema había que modificar físicamente la máquina, lo que podía requerir mucho trabajo.

2.2 El programa almacenado

En 1945, John von Neumann describió en un informe sobre la EDVAC una idea decisiva: guardar las instrucciones en la misma memoria que los datos.

Definición — Programa almacenado: arquitectura en la que las instrucciones de un programa se guardan en la memoria de la computadora, igual que los datos. Cambiar de programa consiste en cargar otros contenidos en la memoria, sin modificar el hardware.

El 21 de junio de 1948, el «Baby» de la Universidad de Manchester ejecutó el primer programa almacenado en una memoria electrónica, por lo que se le considera la primera computadora electrónica de programa almacenado. Desde entonces, programar consiste en escribir secuencias de números que la máquina interpreta como instrucciones.

Definición — Lenguaje máquina (primera generación): conjunto de instrucciones binarias que el procesador ejecuta directamente. Es específico de cada tipo de máquina.

Caso de estudio: una máquina de juguete. La práctica siguiente usa una máquina ilustrativa de 8 bits (no corresponde a un procesador real): cada instrucción ocupa un byte, con cuatro bits para la operación y cuatro para una dirección de memoria. Observe que el programa y los datos conviven en la misma memoria: ambos son patrones de bits, y lo que los distingue es el uso que la máquina les da.

Aplicación práctica. Primero traduzca a mano el programa de cuatro instrucciones; después escriba una instrucción en binario y, por último, ejecute el programa ciclo por ciclo. Observe qué ocurre con el contador de programa, el acumulador y la memoria.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Problema que dejó esta etapa: programar en binario es lento y propenso a errores, y el programa solo sirve para un tipo de máquina. Basta confundir un 0 con un 1 para cambiar por completo el significado de una instrucción. ¿Cómo podría ayudarse a quien programa?


3. Segunda etapa: el ensamblador

La respuesta natural fue sustituir los códigos numéricos por nombres simbólicos.

Definición — Lenguaje ensamblador (segunda generación): lenguaje que representa cada instrucción de máquina con un mnemónico (como LOAD, ADD o STORE) y las direcciones con números o nombres. Un programa llamado ensamblador lo traduce automáticamente a lenguaje máquina.

En 1949, las «Initial Orders» de David Wheeler para la computadora EDSAC, de la Universidad de Cambridge, constituyeron un ensamblador rudimentario: permitían escribir las instrucciones con símbolos en lugar de números binarios. Poco después, hacia 1952, Grace Hopper desarrolló el sistema A-0, que a partir de una especificación con códigos de subrutinas de una biblioteca generaba el programa en lenguaje máquina. Se le considera un antecedente de los compiladores, aunque funcionaba más como enlazador y cargador que como un compilador moderno.

Caso de estudio. Con la máquina de juguete de la sección anterior, la instrucción 00111101 se escribe STORE 13. Ambas formas significan exactamente lo mismo; la segunda es mucho más fácil de leer y de escribir. Traducir de una a otra es una tarea mecánica, y por eso se encarga a un programa.

Nota: este es un patrón que se repetirá varias veces: cuando una capa resulta incómoda, se crea otra más cómoda y un programa traduce de la nueva a la anterior. En el tema 1.2.4 se estudia con detalle cómo funcionan esos traductores.


4. Tercera etapa: lenguajes de alto nivel

El ensamblador seguía exigiendo pensar en términos de la máquina: registros, direcciones y operaciones elementales. En los años cincuenta aparecieron lenguajes cuya notación se acerca al problema y no a la máquina.

Definición — Lenguaje de alto nivel (tercera generación): lenguaje cuyas construcciones (fórmulas, estructuras de control, nombres de variables) están pensadas para expresar problemas de manera cercana a la forma de razonar de las personas, y no a la estructura de una máquina concreta. Un compilador o un intérprete los traduce o ejecuta.

Lenguaje Año Dominio para el que se creó
FORTRAN 1957 Cálculo científico, con notación cercana a las fórmulas
LISP 1958 Procesamiento de símbolos e inteligencia artificial
COBOL 1959 Aplicaciones administrativas y de negocios
ALGOL 60 1960 Notación común para describir algoritmos, con estructura de bloques

ALGOL 60 es especialmente influyente: introdujo la estructura de bloques y la recursión, y su sintaxis se describió con la notación BNF que se estudia en el tema 1.2.1. Casi todos los lenguajes posteriores le deben algo.

Importante: en la literatura se habla también de una cuarta generación (lenguajes específicos de un dominio, a los que suele asociarse SQL) y de una quinta (lenguajes lógicos y de restricciones, vinculados al proyecto japonés de computadoras de quinta generación de los años ochenta). La clasificación por generaciones es informal y no todos los autores la aplican igual.

Aplicación práctica. Explore la línea de tiempo completa: abra cada hito, lea quién lo creó y, en el caso de los lenguajes, qué problema pretendía resolver. Después relacione ocho lenguajes con su problema.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Para comprobar que ha comprendido la secuencia, ordene seis hitos cronológicamente:

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.


5. Los paradigmas en el tiempo

Definición — Paradigma de programación: estilo fundamental de organizar un programa y de concebir su ejecución, que determina cómo se expresan los problemas y las soluciones.

El curso estudia tres paradigmas, además del imperativo que subyace a la mayoría de los primeros lenguajes:

  • El imperativo expresa el cálculo como una secuencia de instrucciones que modifican el estado (FORTRAN, COBOL, ALGOL, C).
  • El funcional expresa el cálculo mediante funciones. Su antecedente histórico es LISP (1958); Haskell (1990) es su representante puro más conocido. Se estudia en la Unidad IV.
  • El orientado a objetos organiza el programa en objetos que se comunican. Simula 67 introdujo las clases y se considera el primer lenguaje orientado a objetos; Smalltalk, hacia 1972, desarrolló la idea. Se estudia en la Unidad III.
  • El lógico expresa el programa mediante hechos y reglas. Prolog nació hacia 1972 de un proyecto sobre procesamiento del lenguaje natural. Se estudia en la Unidad V.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Nota: muchos lenguajes actuales, como Python o C++, se describen como multiparadigma, porque admiten varios estilos.


6. La abstracción creciente

La historia que se acaba de recorrer tiene un hilo conductor: cada etapa oculta los detalles de la anterior para que quien programa se concentre en el problema, y cada una tiene un costo: un programa que traduce, y menos control sobre lo que ocurre en la máquina.

Etapa Cómo se escribe Qué oculta Costo
Lenguaje máquina Números binarios Nada Lento, propenso a errores, específico de una máquina
Ensamblador Mnemónicos Los códigos numéricos Se necesita un ensamblador; sigue ligado a la máquina
Alto nivel Fórmulas, estructuras y nombres Registros y direcciones Se necesita un compilador o intérprete; menos control directo

Esta idea es la misma que se encontró en el módulo 1.0: expresar más con menos mediante la abstracción. En los temas siguientes se estudia cómo una computadora reconoce, comprende y ejecuta un programa escrito en un lenguaje de alto nivel.

Contraste con el planteamiento inicial

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.


7. Errores conceptuales frecuentes

Error común: hablar de «la primera computadora» sin precisar. La respuesta depende de la definición: no es lo mismo la primera computadora electrónica, la primera de propósito general o la primera de programa almacenado. Por eso se habla de ENIAC como computadora electrónica de propósito general y del «Baby» de Manchester como la primera electrónica de programa almacenado.

Error común: atribuir a una persona o a una máquina el «primer compilador» sin matices. El sistema A-0 de Hopper es un antecedente importante, pero funcionaba más como enlazador y cargador que como un compilador actual; las fuentes discrepan al clasificarlo.

Error común: creer que cada lenguaje nuevo reemplaza a los anteriores. Muchos lenguajes antiguos, como COBOL, FORTRAN o C, continúan en uso en sistemas heredados, cálculo científico y programación de sistemas.

Error común: suponer que un lenguaje de alto nivel es siempre «mejor» que uno de bajo nivel. Cada nivel favorece criterios distintos: comodidad frente a control. Este tema se retoma en la pragmática (tema 1.2.3).

Error común: situar los paradigmas en una línea en la que cada uno sustituye al anterior. El funcional (LISP, 1958), el orientado a objetos (Simula, 1967) y el lógico (Prolog, hacia 1972) coexisten porque resuelven problemas distintos.


8. Verificación del tema

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.


9. Libreta de trabajo

Reúna sus respuestas, revíselas y expórtelas como evidencia para el portafolio.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.


10. Preguntas de reflexión

  1. ¿Qué problema resuelve cada capa (ensamblador y lenguaje de alto nivel) y qué costo introduce?
  2. ¿Por qué cree que COBOL y FORTRAN siguen en uso? ¿Qué implicaciones tiene para quien programa?
  3. Elija un lenguaje actual y reconstruya la cadena «problema → solución» que condujo a él.
  4. Si hoy se diseñara un lenguaje para un problema nuevo (por ejemplo, programar sistemas de inteligencia artificial), ¿qué dificultades de los lenguajes existentes intentaría resolver?
  5. ¿Por qué los paradigmas funcional, orientado a objetos y lógico coexisten en lugar de sustituirse?
  6. ¿Qué papel desempeña la traducción automática en toda esta historia?

11. Lecturas recomendadas