Siempre me pregunto esto, y tal vez necesito una buena lección de historia sobre lenguajes de programación. Pero dado que la mayoría de los compiladores de hoy en día están hechos en C, ¿cómo se hicieron los primeros compiladores (AKA antes de C) o se interpretaron todos los lenguajes?
Dicho esto, todavía no entiendo cómo se hizo incluso el primer lenguaje ensamblador, entiendo qué es el lenguaje ensamblador, pero no veo cómo funcionaron el MUY primer lenguaje ensamblador (por ejemplo, ¿cómo hicieron el primer lenguaje ensamblador? comandos (como mov R21
) o w / e establecido en el equivalente binario?
programming-languages
history
assembly
mosquito
fuente
fuente
Respuestas:
Ja, he hecho esto. Muchas CPU tienen instrucciones simples de tamaño fijo que solo tienen un par de bytes. Por ejemplo, para una CPU simple como un Motorola 6800, puede ajustar todas sus instrucciones en una sola hoja de papel . Cada instrucción tendría un código de operación de dos bytes asociado y argumentos. Puede ensamblar un programa manualmente buscando el código de operación de cada instrucción. Luego escribiría su programa en papel , anotando cada instrucción con su correspondiente código de operación. Una vez que haya escrito su programa, puede grabar cada código de operación en secuencia en una EPROMque luego almacenaría su programa. Conecte la EPROM a la CPU con las instrucciones correctas en las direcciones correctas, y tendrá un programa de trabajo simple. Y para responder a su próxima pregunta, sí. Fue doloroso (hicimos esto en la escuela secundaria). Pero tengo que decir que conectar cada chip en una computadora de 8 bits y escribir un programa manualmente me dio una comprensión profunda de la arquitectura de la computadora que probablemente no podría haber logrado de otra manera.
Los chips más avanzados (como x86) son mucho más difíciles de codificar a mano, porque a menudo tienen instrucciones de longitud variable. Los procesadores VLIW / EPIC como Itanium son casi imposibles de codificar a mano de manera eficiente porque manejan paquetes de instrucciones optimizados y ensamblados por compiladores avanzados. Para nuevas arquitecturas, los programas casi siempre se escriben y ensamblan primero en otra computadora, luego se cargan en la nueva arquitectura. De hecho, para empresas como Intel que realmente construyen CPU, pueden ejecutar programas reales en arquitecturas que aún no existen ejecutándolas en simuladores. Pero yo divago...
En cuanto a los compiladores, en su forma más simple, pueden ser poco más que programas de "cortar y pegar". Podría escribir un "lenguaje de alto nivel" muy simple y no optimizador que simplemente agrupe instrucciones simples de lenguaje ensamblador sin mucho esfuerzo.
Si desea un historial de compiladores y lenguajes de programación, le sugiero que CONSIGA un historial de FORTRAN .
fuente
De eso se trata el arranque del compilador (ya que nadie mencionó cómo se llama =).
fuente
En última instancia, todas las computadoras funcionan con códigos binarios, que se introducen en la CPU. Estos códigos binarios son perfectamente naturales para una CPU, pero también perfectamente inútiles para los seres humanos. Una de las primeras formas de escribir un programa fue haciendo agujeros en las tarjetas. La posición de los agujeros representaba una posición de bit particular dentro de una palabra, y la presencia o ausencia del agujero se interpretaba como cero o uno. Estas tarjetas se colocaron en la secuencia correcta en una caja, y luego se introdujeron en un lector de tarjetas, que efectivamente las convirtió en código binario para la CPU (y su vida se perdería si dejara caer la caja).
Obviamente, los primeros programadores resolvieron los códigos binarios uno por uno y tenían una máquina para perforar las tarjetas. Esto es esencialmente programación en lenguaje ensamblador en sus manos y rodillas. Una vez que tenga eso, puede crear todas las demás cosas a partir de él: un editor de texto simple, un compilador de lenguaje ensamblador (para convertir las declaraciones de ensamblaje de texto en códigos binarios), un vinculador y un cargador. Y el resto, como dicen, es historia.
fuente
Un poco de google muestra las Órdenes iniciales de EDSAC de finales de los años 40. Como era el primer ensamblador, probablemente estaba codificado en lenguaje máquina.
Más tarde llegaron ensambladores para otras máquinas, como SOAP I y II para IBM 650. SOAP Probablemente también estaba codificado en lenguaje de máquina, aunque no he encontrado la declaración definitiva.
Un poco más tarde llegó Fortran (traductor de fórmulas), para el IBM 704. Presumiblemente fue escrito en ensamblador para el 704. Un ensamblador temprano para el 701 se acredita a Nathan Rochester .
Si quieres tener una idea de cómo programar una computadora en lenguaje máquina, visita uno de mis sitios favoritos, la computadora de retransmisión de Harry Porter .
fuente
Es posible (si es tedioso) escribir código de máquina directo. Tal vez escriba el programa en el ensamblador en una hoja de papel, y luego lo traduzca a mano en las instrucciones numéricas del código de máquina que ingresa en la memoria de la máquina. Incluso puede omitir el paso del ensamblador en papel si ha memorizado los valores numéricos de todas las instrucciones del código de máquina, ¡no es raro en esos días, créalo o no!
Las primeras computadoras se programaron directamente en binario mediante interruptores físicos. ¡Fue una gran mejora de productividad cuando el hardware evolucionó para permitir que el programador (o el asistente de entrada de datos) ingrese el código en números hexadecimales a través de un teclado!
Un ensamblador de software solo se volvió relevante cuando hubo más memoria disponible (ya que el código del ensamblador ocupa más espacio que el código de máquina sin procesar) y el hardware evolucionó para permitir la entrada alfanumérica. Entonces, los primeros ensambladores fueron escritos directamente por personas que dominaban el código de la máquina.
Cuando tiene un ensamblador, puede escribir un compilador para un lenguaje de nivel superior en ensamblador.
La historia de C tiene múltiples pasos. El primer compilador de C se escribió en B (un predecesor de C) que a su vez se escribió en BCPL. BCPL es un lenguaje bastante simple (por ejemplo, no tiene tipos en absoluto), pero aún está un paso por delante del ensamblador en bruto. Entonces verá cómo los lenguajes gradualmente más complejos se construyen en lenguajes más simples desde el ensamblador. Y en sí mismo, C es un lenguaje bastante pequeño y simple para los estándares actuales.
Hoy, el primer compilador para un nuevo lenguaje a menudo se escribe en C, pero cuando el lenguaje alcanza una cierta madurez, a menudo se reescribe "en sí mismo". El primer compilador de Java fue escrito en C, pero luego reescrito en Java. El primer compilador de C # se escribió en C ++, pero recientemente se ha reescrito en C #. El compilador / intérprete de Python está escrito en C, pero el proyecto PyPy es un intento de reescribirlo en Python.
Sin embargo, no siempre es factible escribir un compilador / intérprete para un idioma en el idioma mismo. Existe un intérprete de JavaScript escrito en JavaScript, pero los compiladores / intérpretes en los navegadores actuales todavía están escritos en C o C ++ por razones de rendimiento. JavaScript escrito en JavaScript es simplemente demasiado lento.
Pero no tiene que usar C como el "lenguaje inicial" para un compilador. El primer compilador de F # se escribió en OCaml, que es el otro lenguaje que está más estrechamente relacionado con F #. Cuando se completó el compilador, se reescribió en F #. El primer compilador para Perl 6 fue escrito en Haskell (un lenguaje funcional puro muy diferente de Perl) pero ahora tiene un compilador escrito en C.
Un caso interesante es Rust, donde el primer compilador fue escrito en OCaml (ahora está reescrito en Rust). Esto es notable porque OCaml generalmente se considera un nivel más alto que Rust, que es un lenguaje de sistemas más cercano al metal. Por lo tanto, no siempre se implementan idiomas de nivel superior en idiomas de nivel inferior, sino que también puede ser al revés.
fuente
Suponiendo que está comenzando con un conjunto de instrucciones simple y nada más, comenzaría creando un ensamblador o compilador mínimo , apenas funcional que pueda cargar un archivo, analizar un subconjunto mínimo del idioma de destino y generar un ejecutable archivo como salida, escribiendo el código de máquina sin procesar utilizando un editor hexadecimal o similar.
Luego usaría ese compilador o ensamblador apenas funcional para implementar un compilador o ensamblador ligeramente más capaz que pueda reconocer un subconjunto más grande del idioma de destino. Espuma, enjuague, repita, hasta que tenga el producto final.
fuente
No es tan difícil, como parece. En la infancia;) hice un desmontaje x86 en mente.
Incluso no necesitas aprenderlo especialmente. Simplemente sucede, cuando puede programar en ASM y luego tratar de arreglar un binario de terceros utilizando desensambladores interactivos. O al escribir su propia protección con cifrado de código.
Es decir, a veces estás migrando incluso del lenguaje a los códigos sin ninguna sorpresa.
fuente
Los primeros compiladores se implementaron usando lenguaje ensamblador. Y los primeros ensambladores se implementaron mediante programas de codificación en binario ...
No hace tanto tiempo que la programación en binario todavía era una habilidad que la gente usaba.
Cuando era estudiante universitario, recuerdo haber hecho un ejercicio de programación que implicaba escribir un pequeño programa en el código de máquina PDP-8 (creo), ingresarlo a través de los interruptores del panel frontal y ejecutarlo. Un par de años después, me compré un kit de desarrollo del sistema 6502 que tenía un teclado hexadecimal para ingresar programas ... y 4k bytes de RAM.
fuente
UNA RESPUESTA MUY SIMPLE Supongamos que escribimos un programa cableado y lo almacenamos en la ROM. Se puede considerar como compilador. Entonces, simplemente quiero decir que el primer compilador fue cableado. A medida que la tecnología mejoró, estos compiladores simples se utilizaron para escribir compiladores de alto nivel.
fuente