¿Cómo se escribió el primer compilador?

166

Escuché sobre el pollo y el huevo y el bootstrapping. Tengo algunas preguntas.

¿Qué escribió el primer compilador que convirtió algo en instrucciones binarias?

¿Se compila o traduce el ensamblaje en instrucciones binarias?

... Me resultaría difícil creer que escribieron un compilador en binario.

Shawn Mclean
fuente
@nawfal, es una diferencia entre un nuevo lenguaje de programación y el primer compilador, así que no, no es un duplicado
@PauliSudarshanTerho ¿cuál es la diferencia? El espíritu de las preguntas es el mismo. No puedes escribir un lenguaje de programación, esa pregunta es a su vez hablar del primer compilador.
nawfal
¿En tu imaginación espiritual quizás? En realidad no encuentras nada mencionado sobre el primer compilador en ese enlace. Y no debe aconsejar a nadie que escriba un nuevo idioma para comenzar desde cero. Y si es así, ¿por qué querrías ocultar las respuestas sobre cómo se escribe el primer compilador si es importante para escribir un nuevo idioma?
Aprende de mí: este es un duplicado: stackoverflow.com/questions/4772768/…

Respuestas:

133

Las instrucciones de ensamblaje son (generalmente) una asignación directa a los códigos de operación, que son valores (múltiples) bytes del código de máquina que el procesador puede interpretar directamente. Es bastante posible escribir un programa en códigos de operación directamente buscándolos desde una tabla (como esta para el microprocesador 6039 , por ejemplo) que los enumera con las instrucciones de ensamblaje correspondientes y las direcciones de memoria / compensaciones para determinar las cosas a mano. como saltos

Los primeros programas se realizaron exactamente de esta manera: códigos de operación escritos a mano.

Sin embargo, la mayoría de las veces es más sencillo usar un ensamblador para "compilar" el código de ensamblaje, que realiza automáticamente estas búsquedas de código de operación, además de ser útil para calcular direcciones / compensaciones para etiquetas de salto con nombre, etc.

Los primeros ensambladores fueron escritos a mano. Esos ensambladores podrían usarse para ensamblar ensambladores más complicados, que luego podrían usarse para ensamblar compiladores escritos para lenguajes de nivel superior, y así sucesivamente. Este proceso de escribir iterativamente las herramientas para simplificar la creación del siguiente conjunto de herramientas se denomina arranque (como lo menciona David Rabinowitz en su respuesta) .

Ámbar
fuente
18
Mi primera computadora fue una máquina basada en Z80 en cuyo monitor ROM tuve que ensamblar a mano un cargador de arranque para mostrar los conceptos básicos de un sistema operativo (CP / M) para poder ensamblar el resto de dicho sistema operativo en un sistema operativo , completo con un cargador de arranque basado en disco. Tiempos divertidos. Así que sí, puedes ensamblar a mano bien. Es lento, doloroso y propenso a errores (es por eso que automatizamos las cosas) pero es posible.
SOLO MI OPINIÓN correcta
El primer enlace está roto.
Luke
Escrito a mano. ¿Cómo? Cableado o tarjetas perforadas? Supongo que tenían teclados hexadecimales.
44

Lea sobre el arranque del compilador y la historia de la escritura del compilador

La idea es escribir un compilador muy simple directamente en el código de la máquina, usarlo para escribir un compilador más sofisticado, usar el segundo para construir un tercero y así sucesivamente hasta que pueda tener un compilador con todas las funciones.

David Rabinowitz
fuente
36

Los huevos precedieron a las gallinas. La respuesta a la mayoría de los problemas de "la gallina y el huevo" es la misma: evolución. Algunas personas también tienen problemas para creer en la evolución biológica, pero la incredulidad no es un argumento (google argumentoum ad ignorantiam).

Para responder directamente a su pregunta: el primer compilador fue escrito (por un humano) en un lenguaje ensamblador ; un programa llamado ensamblador traduciría el lenguaje ensamblador a binario; Este es un proceso mucho más simple que la compilación porque el lenguaje ensamblador es solo una forma simbólica del lenguaje máquina que utiliza nombres de código de operación en lugar de números, representa direcciones con símbolos, etc. Muchos compiladores posteriores también se escribieron en lenguaje ensamblador. Pero el primer compilador de C era un compilador B modificado, que fue escrito en B . El primer compilador B fue escrito en TMG . El compilador TMG solía compilar que el compilador B fue escrito en lenguaje ensamblador PDP-7.

Jim Balter
fuente
24

Woz dijo en una de sus charlas públicas que cuando comenzó, no podía permitirse un compilador, así que compiló en binario a mano en papel. Si desea ver algo aún más salvaje, lea sobre las condiciones en que Bill Gates y Paul Allen escribieron el BASIC para el Altair 8800.

Con respecto a "escribir una computadora en binario", dé un paso atrás de ser un programador y piense en cuáles fueron las primeras computadoras. Las cosas de alto nivel aún no existían: pensaste en todo en el nivel bajo porque eso era todo. Tenía un hardware que podía hacer lógica y aritmética básicas que manipulaba a través del código de máquina (que es solo ensamblado compilado; Amber explica por qué esta parte no es difícil de hacer a mano) y quería que este hardware realizara ciertas hazañas matemáticas. No te preocupaste por el sistema operativo inexistente, solo le dijiste al hardware (en conjunto) cómo manipular los números que lo alimentas. Era una calculadora simplemente grande. La computadora de hoy se construyó una abstracción a la vez.

Si desea romper la barrera que hace que las computadoras se sientan mágicas, le recomiendo leer el CÓDIGO de Charles Petzold y / o The Elements of Computing Systems . Con solo un conocimiento básico de programación, estos libros maravillosamente accesibles lo harán comprender las computadoras de arriba a abajo. Obviamente, uno no puede obtener una compensación. sci. o título de EE después de solo 2 libros, pero puedo decir que como programador autodidacta que se perdió la capacitación formal: ¡estos libros sacudieron mi mundo!

Dinah
fuente
2
¿Escribir el intérprete BÁSICO de Altair después de hacer el argumento de venta? ¿Codificando al bootstrapper en el viaje en avión a Albuquerque? Eso suena un poco ridículo. Y diversión.
Ehtesh Choudhury
2
@ Shurane: ¡ja! Esos puntos también son relevantes, pero para mí lo esencial de cómo hicieron el intérprete BASIC y cómo el grupo lo metió en el pequeño espacio es una belleza y una habilidad / piratería de programación asombrosa.
Dinah
10

¿Qué escribió el primer compilador que convirtió algo en instrucciones binarias?

Un humano lo hizo. Lea sobre el sistema A-0 :

En 1952, Grace Hopper completó su primer compilador para Sperry, conocido como A-0. El Sistema A-0 era un conjunto de instrucciones que podían traducir código matemático simbólico al lenguaje de máquina. Al producir A-0, tomó todas las subrutinas que había estado recopilando a lo largo de los años y las grabó. Cada rutina recibió un número de llamada, de modo que la máquina pudiera encontrarlo en la cinta. "Todo lo que tenía que hacer era escribir un conjunto de números de llamada, dejar que la computadora los encontrara en la cinta, traerlos y hacer las adiciones. Este fue el primer compilador", según lo descrito por Grace.

Sinan Ünür
fuente
1
El enlace parece ser 404 en este momento, en cualquier caso, "Grace" arriba es Grace Hopper.
Volker Stolz
2
He oído que Hopper escribió el primer compilador, pero la descripción anterior hace que parezca más un enlazador que un compilador. Aún así, buena historia. Es sorprendente pensar que hubo un momento en que los informáticos eran escépticos sobre la idea de los compiladores ...
Mark E. Haase
1
@mehaase es por eso que se llama "compilador". realiza una compilación de rutinas, cada una de las cuales está (potencialmente) escrita en lenguaje máquina directamente.
Elazar
@ MarkE.Haase Las personas a las que Hopper se refería aquí eran ingenieros de aplicaciones y científicos que usaban computadoras para tareas de cálculo específicas; no eran "informáticos". Hubo un puñado de cibernéticos en 1952, pero dudo que haya hablado con ninguno de ellos.
Jim Balter
9

Los primeros programas se escribieron en código de máquina (no en lenguaje ensamblador): números reales conectados a la memoria de la computadora mediante interruptores. Hemos recorrido un largo camino ...

A veces esto todavía sucede en pequeña medida: parchear pequeños fragmentos de código o crear troncos. Recuerdo marcar números en cadenas básicas que luego se ejecutaron como subrutinas pequeñas y rápidas en los primeros micros. También recuerdo cambiar los interruptores en el panel frontal de un PDP-11 para ingresar un programa de cargador de arranque en su memoria para un curso universitario.

Estos programas a veces se utilizarían para procesar archivos de texto para crear otros programas, y se crearon lenguajes de programación voila.

Michael Burr
fuente
La pregunta es sobre el primer compilador, no los primeros programas en general, a pesar de que los programas a veces son compiladores; La historia de los dos no es la misma. (Una analogía: la respuesta a la pregunta de cuándo aparecieron los primeros animales en la Tierra no es la respuesta a la pregunta de cuándo aparecieron los primeros gatos en la Tierra, a pesar de que los gatos eran animales.)
Jim Balter,