¿Cómo se inventaron los lenguajes de programación y por qué?

Tomando algunas libertades bastante grandes en aras de la brevedad:

En esencia, todas las computadoras automáticas programables (máquinas informáticas, no personas cuyo trabajo consistía en calcular la aritmética, que es lo que significaba la palabra anteriormente) tienen un “vocabulario” de un lenguaje de máquina, un conjunto nativo de instrucciones que pueden enviar. Por ejemplo, la familia MOS-65 xx entiende que el valor binario # b10101001 significa “tomar el byte que sigue a este y cargar su valor en el registro del acumulador para que pueda usarlo para algunos cálculos aritméticos más adelante”.

Escribir programas en binario es arduamente doloroso; así que los humanos crearon los mnemónicos del lenguaje ensamblador que representan directamente el código de máquina binario. Por ejemplo, el código binario # b10101001 se representa como LDA, para “cargar el acumulador”.

Entonces, a lo largo vino Amazing Grace. La Dra. Grace Hopper, también conocida como la Contralmirante Grace Hopper de la Marina de los EE. UU., “Propuso” la idea de escribir un programa que pudiera leer una serie de instrucciones “amigables con los humanos” y traducirlas a un formato “amigable con las máquinas”. El programador podría entonces editar este “código fuente”, introducirlo en el compilador de programas automático que inventó, y eliminar el “código objeto” para ejecutarlo en la computadora.

Para citar Wikipedia:

En 1949, Hopper se convirtió en empleado de Eckert-Mauchly Computer Corporation como matemático principal y se unió al equipo que desarrollaba UNIVAC I. [18]

Este idioma fue diseñado para traducir el inglés a los códigos de computadora. Cuando recomendó que se desarrollara un nuevo lenguaje de programación utilizando palabras en inglés, “se le dijo muy rápidamente que [ella] no podía hacerlo porque las computadoras no entendían el inglés”. Esta idea no fue aceptada durante 3 años, y publicó su primer artículo sobre el tema, compiladores, en 1952. A principios de la década de 1950, la compañía Remington Rand se hizo cargo de la compañía, y fue mientras ella estaba trabajando para ellos que Su trabajo original de compilación fue hecho. El compilador era conocido como el compilador A y su primera versión era A-0. [22]

En 1952 tenía un compilador operacional. “Nadie creía eso”, dijo ella. “Tenía un compilador en ejecución y nadie lo tocaría. Me dijeron que las computadoras solo podían hacer aritmética”. [23]

En 1954, Hopper fue nombrada la primera directora de programación automática de la compañía, y su departamento lanzó algunos de los primeros lenguajes de programación basados ​​en compiladores, incluidos MATH-MATIC y FLOW-MATIC. [18]

A finales de la década de 1950, su visión había despegado. Es mucho más fácil para un programador escribir, leer y entender algo como esto:

(defun +2 (x)
“Suma 2 al valor dado”
(+ x 2))

… que su equivalente en lenguaje ensamblador …

; Origen: # x101EEF505C
MOV RCX, [R12 + 96]
MOV [RBP-8], RCX
CMP QWORD PTR [R12 + 104], 0
JEQ L0
BREAK 15
MOV EDI, 4
MOV RDX, RBX
MOV R11D, 536871360
Llamar r11
MOV RBX, [RBP-16]
MOV RSP, RBP
CVX
POP RBP
JUBILADO
DESCANSO 16

… y mucho menos su forma binaria …

1001001 10001011 1001100 100100
1100000 1001000 10001001 1001101
11111000 1001001 10000011 1111100
100100 1101000 0 1110100
10 11001100 1111 10111111
100 0 0 0
1001000 10001011 11010011 1001010
10111011 11000000 1 0
100000 1000001 10111011 11000000
1 0 100000 1000001
11111111 11010011 1001000 10001011
1011101 11110000 1001000 10001011
11100101 11111000 1011101 11000011
11001100 10000

No hace falta decir (?), Sin un lenguaje de programación encima del código de la máquina, escribir software complejo sería casi imposible.

El hardware de una computadora solo comprende 0 y 1: electricidad o no electricidad.

Primer problema: hardware diferente necesita 0 diferentes y 1. Cue “arquitectura de computadora”, una estructura que permite al procesador convertir un conjunto de instrucciones simple (ensamblaje o ensamblador) a los 0 y 1 que se ajustan a su hardware. Para la mayoría de las computadoras esto es x86, 32 o 64 bit.

Segundo problema: es bastante incómodo escribir programas completos en lenguaje ensamblador, ya que solo admite los comandos más básicos (sumar, multiplicar, bucle). Así que los programadores escriben en “lenguajes de programación superiores”, que ofrecen estructuras y comandos más complejos (clases, interfaces, …). Luego, el compilador convierte todo esto en un ensamblaje que coincida con el hardware. ¡El programa de alto nivel sigue siendo el mismo para todo el hardware!

Por último, hay una gran variación en los lenguajes de programación de alto nivel. Las diferencias aquí son porque alguien quiere características específicas para un determinado nicho. Java, por ejemplo, tiene su propia mini-arquitectura “máquina virtual java”, lo que hace que sea aún más fácil de usar en hardware diferente. PHP tiene interacciones fluidas con la base de datos web, C ++ está hecho para OOP, … Surgen nuevos idiomas cuando alguien dice “hmm, me gustaría que hubiera un lenguaje que combinara las características x e y”

Para simplificar el trabajo del programador. Tampoco tiene sentido reinventar la rueda una y otra vez. El lenguaje de programación es como una colección de piezas pre-preparadas (más simples o complejas, dependiendo del lenguaje) que se utilizarán para construir productos más grandes: los programas.

Se inventaron después de que la gente se cansara de programar en código binario (en lugar de código octal y hexadecimal, que son versiones disfrazadas de binario). El primer lenguaje de alto nivel que conozco es ALGOL 60 (fue lanzado en 1960). Puede haber habido idiomas anteriores. Eso fue un gran alivio para los programadores.