¿Cómo se desarrolló el primer programa si no había lenguajes de programación como ahora?

El primer programa no fue escrito en un lenguaje de programación. Era una secuencia de operaciones matemáticas necesarias para calcular los números de Bernoulli, una serie matemática oscura pero importante. Fue escrito para ser implementado en una computadora digital mecánica planificada llamada Motor Analítico, que fue diseñada por el matemático Charles Babbage. Su amiga Ada Augusta King, condesa de Lovelace, escribió el software. Habría consistido en una secuencia de tarjetas con agujeros en ellas que el motor analítico podría detectar con puntas de metal.

Aquí está el programa:

Incluso incluye comentarios. Las operaciones 13 a 23 son un bucle, aunque no aparece ninguna instrucción de bucle. La máquina habría permitido bucles y ramificaciones, y también lo era una verdadera computadora.

Esta es una foto de Lady Lovelace:

Aquí está Charles Babbage:


Y aquí hay una reproducción moderna de parte del motor analítico:

Las primeras computadoras (como ENIAC) se programaron conectando la lógica al sistema con interruptores y cables de conexión. Literalmente tomaría semanas configurarlo para ejecutar un nuevo programa, y ​​eso es todo lo que podría hacer hasta que se volviera a cablear.

Las CPU modernas tienen un conjunto de códigos de operación integrados; Este es el conjunto de instrucciones, también llamado lenguaje de máquina. Los programas de lenguaje de máquina son una serie de códigos de operación almacenados en la memoria; esto se llama arquitectura von Neumann, que es la base de prácticamente todas las computadoras modernas.

Cada familia diferente de CPU tiene su propio lenguaje de máquina único. Puede escribir programas de lenguaje de máquina a mano, pero es muy difícil, repetitivo y propenso a errores.

Los lenguajes de nivel superior se inventaron para simplificar el lenguaje de la máquina de escribir. El lenguaje ensamblador está muy cerca del lenguaje máquina, con algunas comodidades adicionales para que sea legible por humanos y automatice algunos de los bits más repetitivos. C ofrece un mayor grado de abstracción que el ensamblaje, pero sigue estando muy cerca del hardware. Los lenguajes dinámicos como Python y Ruby se abstraen casi por completo del hardware. Una de las principales ventajas de esta abstracción es la portabilidad: un programa escrito en un lenguaje de alto nivel se puede traducir (compilar) a múltiples lenguajes de máquina diferentes.

Los idiomas varían en el nivel de abstracción que proporcionan. Los lenguajes de nivel inferior le brindan una mejor velocidad de ejecución y control sobre el hardware, a expensas de la complejidad y la facilidad de uso. Los lenguajes de nivel superior son más fáciles y rápidos de programar, pero le dan menos control y una velocidad de ejecución más lenta.

Los idiomas de nivel superior generalmente se escriben en idiomas de nivel inferior. El primer ensamblador fue escrito en lenguaje máquina. El primer compilador de C fue escrito en ensamblador. Las generaciones posteriores de compiladores de C se escribieron en C y se compilaron con el compilador de la generación anterior. Se dice que un lenguaje que puede compilar su propio compilador es autohospedado. Muchos lenguajes de nivel superior, como Java y Python, no son autohospedables; sus compiladores están escritos en C o C ++.

Pero no importa qué idioma esté utilizando, el resultado final es que traduce el código que escribe al lenguaje de máquina que la CPU puede entender.

Hace unos 15 años, para aumentar mis habilidades de programación en C, decidí escribir un emulador.

Como era principalmente un codificador de ensamblaje de 68k en ese momento, pensé que sería divertido diseñar un ISA “moderno” de 68k, lo que terminé fue algo que se parecía mucho a MIPS … Pero estoy divagando.

Mi ISA era único y no existían compiladores o ensambladores, por lo que para probar que funcionaba tuve que escribir programas en binario. Diseñé el ISA yo mismo para tener todo el modelo de programación en mi cabeza (y todo el código de operación, registros, etc. enumerados en una hoja de cálculo), por lo que no fue difícil.

Así es como se programaron las primeras computadoras antes de que los idiomas de nivel superior estuvieran disponibles. Por diversión, también implementé un ensamblador cruzado (en C en una PC porque era más fácil hacer el IO), que podría haber sido escrito en binario en mi CPU, entonces ya estamos un nivel más arriba … Desde allí uno podría haber escrito un Compilador de C que compiló a Assmebler … Y así sucesivamente.

Si lees sobre la historia de la CPU ARM, ¡Sophie Wilson hizo exactamente lo que describí en 1985 cuando la estaba diseñando!

En el nivel más bajo, las instrucciones de la computadora son solo números. Cada computadora digital desde el principio tiene un “conjunto de instrucciones”: las operaciones básicas que comprende. Como mínimo, estos deben incluir la suma y la resta, la comparación de dos números y la capacidad de ramificarse (es decir, ir de la ubicación de la instrucción que se está ejecutando actualmente a la ubicación de otra instrucción). Se puede decir que cualquier procesador que tenga este conjunto mínimo de instrucciones es Turing Complete, y cualquier procesador Turing Complete puede ejecutar cualquier programa de computadora (sujeto a limitaciones del mundo real, como el tamaño de la memoria y la velocidad de ejecución de las instrucciones).

Entonces, las primeras computadoras se programaron literalmente estableciendo 0s y 1s directamente en la memoria de la computadora para especificar las instrucciones necesarias para ejecutar un programa de computadora. Para empezar, esto se hizo con interruptores o paneles de conexión. Luego, más tarde, ingresando los números en formas más fáciles de administrar que binarias (como octal o hexadecimal – FF en hexadecimal = 255 en decimal, y es el número más grande que cabe en 8 bits de memoria).

A medida que las computadoras se vuelven más poderosas, los programas que queremos ejecutar en ellas se hacen más grandes. En lugar de que una persona se dé cuenta de que la secuencia
LDA 1
AGREGAR 3

es equivalente a
1F 01
4A 03

(Por cierto, estoy inventando todo este código de máquina, no está basado en un procesador real), alguien escribe un programa, en código de máquina, que lo hace por usted. Y así nace el primer ensamblador … Desde el lenguaje ensamblador, se hace más fácil arrancar hasta los primeros lenguajes de nivel superior como FORTRAN y COBOL … y así sucesivamente.

Muchos compiladores de idiomas ahora son independientes, es decir, están escritos en el mismo idioma que interpretan. Entonces, los compiladores de C están escritos en C, el compilador Micro Focus COBOL está escrito en COBOL, y así sucesivamente. Pero nada de esto es posible hasta que haya arrancado su primer compilador del ensamblador al lenguaje de alto nivel.

Los lenguajes de programación no son realmente necesarios para el desarrollo del programa. De hecho, hay al menos una introducción a la programación que explica cómo desarrollar programas usando el inglés. Por lo tanto, es perfectamente posible desarrollar programas sin aprender un lenguaje de programación.

Sin embargo, los programas desarrollados en inglés no pueden ejecutarse directamente en las computadoras. Para implementar dicho programa, sería necesario entregarlo a un programador para que lo traduzca a una versión en un lenguaje de programación que pueda ser utilizado por una computadora.

Por lo tanto, no es sorprendente saber que antes de crear lenguajes y herramientas de programación como ensambladores, intérpretes y compiladores, los primeros programas de computadora se desarrollaron en inglés, alemán o ruso y luego se tradujeron manualmente en códigos de operación que las computadoras de la época podían ejecutar.

¡Codigo de maquina! El código de máquina es un lenguaje increíblemente básico, integrado en placas base. Puedes usarlo para decirle a la CPU que haga cosas y calcule problemas, básicamente. Espero que esto haya ayudado!

Las respuestas anteriores han descrito bien sobre el uso de un código de máquina. Sin embargo, la inspiración del código de máquina proviene de un telar jacquard que se remonta a alrededor de 1801 AD.

El telar estaba controlado por una “cadena de tarjetas”, una cantidad de tarjetas perforadas, unidas en una secuencia continua. Se perforaron varias filas de agujeros en cada tarjeta, con una tarjeta completa correspondiente a una fila del diseño. Varias de estas tarjetas de papel, generalmente de color blanco, se pueden ver en las imágenes a continuación. Las cadenas, como la cinta de papel mucho más tarde, permitieron construir secuencias de cualquier longitud, sin limitar el tamaño de una tarjeta.

Importancia en la informática

La cabeza Jacquard utilizaba tarjetas perforadas reemplazables para controlar una secuencia de operaciones. Se considera un paso importante en la historia del hardware informático. [8] La capacidad de cambiar el patrón del tejido del telar simplemente cambiando las tarjetas fue un precursor conceptual importante para el desarrollo de la programación de la computadora y la entrada de datos. Charles Babbage sabía de los telares de Jacquard y planeaba usar tarjetas para almacenar programas en su motor analítico. A fines del siglo XIX, Herman Hollerith tomó la idea de usar tarjetas perforadas para almacenar información un paso más allá cuando creó una máquina de tabulación de tarjetas perforadas que utilizó para ingresar datos para el Censo de Estados Unidos de 1890.
La unidad de procesamiento de datos de estado sólido IBM 1401, la primera computadora completamente transistorizada, lanzada en octubre de 1959, recibió sus instrucciones del programa de entrada de un lector de tarjetas perforadas IBM 1402, capaz de leer 800 tarjetas perforadas de IBM por minuto. Las tarjetas perforadas permanecieron en uso en informática hasta mediados de la década de 1980.

Artículo copiado de Wikipedia.

http://en.m.wikipedia.org/wiki/J

Antes de los idiomas de bajo o alto nivel, existía (incluso hasta el día de hoy) algo llamado “Código de máquina”.

Consiste en funciones básicas como cálculos aritméticos, saltar de una línea a otra, hacer un bucle de ida y vuelta, un poco de manipulación de cadenas.

Este fue el núcleo de la construcción de cualquier software.

Gracias.

Recuerde que las computadoras como ENIAC se usaron para construir mesas de artillería para los militares (aparte, fue un equipo de mujeres que tomó las matemáticas y las transformó en patrones lógicos para ENIAC). No había lenguaje per se.

En mi opinión, el primer lenguaje de programación (es decir, de uso general y legible por humanos) fue FORTRAN. Fue diseñado en los años 50 por IBM.

Los primeros programas tenían interruptores en un panel frontal para ingresar comandos binarios y datos. Por lo tanto, no es necesario un lenguaje de programación de nivel superior si básicamente está utilizando el lenguaje de máquina directamente en el chip. El primer programa nunca se implementó, fue por Ada Lovelace (ver: Ada Lovelace). ¡Los mejores deseos!

Los primeros programas fueron instrucciones y valores literales. Por ejemplo, “agregue 4 al total acumulado” o “retroceda una instrucción”. Lo que más usamos ahora son lenguajes de programación de “alto nivel”. Estos están diseñados para igualar la forma en que le daríamos instrucciones a un niño. Incorporan todos los pasos requeridos literales, pero lo hacen de una manera que es fácil de implementar. “Tráeme agua con hielo” es una dirección razonable para un niño. El niño sabe que debe ir a la cocina, tomar un vaso, abrir el congelador, obtener trozos de hielo, ponerlos en el vaso, etc. Estas son instrucciones de nivel medio, que son similares a los lenguajes de programación temprana más básicos. Cada instrucción de nivel medio comprende muchas instrucciones de nivel base. Cada instrucción de alto nivel comprende muchas instrucciones de nivel medio. Realmente, solo estamos construyendo bibliotecas más complejas de pirámides de instrucción. Podría continuar para siempre. Para extender la analogía del niño, la última instrucción sería algo similar a “vivir” o “ser feliz”.

Incluso antes del código de la máquina, usaban tarjetas con agujeros que, cuando se insertaban en la máquina, activaban y desactivaban los interruptores y, por lo tanto, transferían información binaria (software) a la computadora.

El primero que realmente programé fue un IBM 1401 que programó con 80 tarjetas de columna y la primera instrucción tenía que ser leer el resto de la tarjeta en la memoria. Esa fue una instrucción a nivel de código de máquina, al igual que los demás.
En el ICL 1909, que era una máquina mucho más grande y más rápida con 96K de almacenamiento principal, utilizaba tarjetas perforadas con una instrucción por tarjeta u cinta de 8 pistas. Estas instrucciones (ya que yo era un programador de sistemas) estaban en el código de la máquina que se llevaron a la máquina y se ejecutaron. Un poco más tarde llegó un lenguaje llamado PLAN que era simplemente un medio de atribuir mnemónicos significativos a las instrucciones, pero aún uno por uno. Su ventaja real era que podía dar etiquetas a las ubicaciones de las tiendas y el compilador de PLAN las sustituía por ubicaciones reales por encima del extremo superior de su programa.
Entonces:
001 04 001345 se convirtió en:
LDX 4 DROPDEAD
lo que significaba cargar el contenido de DROPDEAD (001345) en el índice 4.
Perdóname si las longitudes no son correctas, fue hace mucho tiempo. Eran palabras de 24 bits que contenían caracteres de 4X6 bits o una instrucción directa, como LDX, por ejemplo.
Podrías escribir programas para hacer cualquier cosa que elijas, y como la sobrecarga era limitada, fue muy rápido.
Curiosamente, la primera máquina tenía instalaciones de las que no hablamos y ahora voy a tener que dispararle, lo que incluía interruptores que le daban acceso directo a la CPU y el uso del cual podía cambiar la función de una instrucción de código de máquina.
Por lo tanto, podría escribir un programa que pudiera ver y ver que usaba instrucciones estándar pero que no se ejecutaría hasta que hubiera configurado los interruptores correctamente. Normalmente, por supuesto, los programadores no llegaron a un millón de millas de esos interruptores.
Lo mejor fue que esta máquina costó una bomba, se usó en todo tipo de proyectos extraños y solo a los programadores de sistemas se les permitió ingresar a la sala de máquinas a través de las puertas seguras y tomar la máquina sin los operadores (que se inclinarían cuando aparecimos) y mira el trabajo que estaba haciendo.
Poder, puro poder.

Algunas de las primeras computadoras fueron programadas a través de paneles de conexión. En realidad, soy lo suficientemente mayor como para haber estado en un centro de computadoras donde todavía se usaban enchufes, pero no lo suficientemente mayor como para haber usado uno yo mismo.

Simple, está directamente integrado en el circuito.

Las primeras computadoras tenían interruptores que cambiarían un poco para cambiar

Las computadoras posteriores tendrían tarjetas perforadas que la computadora leería y ejecutaría.