¿Cómo compilaríamos nuestro código si todos nuestros binarios desaparecieran?

¿Cómo compilaríamos nuestro código si desaparecieran todos los binarios del mundo y solo tuviéramos el código fuente? Al principio podrías pensar “Todo está bien: aquí tengo mi código de Roslyn”, ¡pero espera! ¡Está en C#! Por lo tanto, observa un compilador de C# más antiguo que, a su vez, está escrito en, por ejemplo, C++, pero espere... y así sucesivamente. ¿Terminarías soldándote un compilador ASM?

¿Cómo reconstruiríamos el software actual, si tuviéramos todo el hardware actual y todo el código fuente del software, pero no el software real? ¿Seguiríamos el mismo camino que antes, o tomaríamos algunos atajos y terminaríamos teniendo, por ejemplo, código administrado antes? ¿Omitiríamos el código no administrado por completo y terminaríamos teniendo un sistema operativo similar a Singularity ? ¿Construiríamos nuestros nuevos bootstrappers y compiladores para que puedan usar nuestro código existente (y probablemente, para cuando tengamos las cosas funcionando, antiguo) o escribiríamos todo desde cero?

Puede escribir un compilador en el lenguaje que compila; ver, por ejemplo , en.wikipedia.org/wiki/Bootstrapping_%28compilers%29
@ScottWhitlock no se trata de cómo se escribió el primer compilador, sino de cómo escribiríamos el primer compilador ahora con el conocimiento actual y sin software
@RytisI: no veo cómo sería diferente. Escribes un ensamblador en código máquina y luego escribes un compilador en código ensamblador. No es magia.
@ScottWhitlock seguro que es diferente. Una cosa es crear un nuevo lenguaje en una infraestructura existente y otra empezar de cero. ¿Cómo alimentaría el código de máquina de su ensamblador a su i7?
"¿Cómo alimentaría el código de máquina de su ensamblador a su i7?" Como se ha señalado, la respuesta es simple: no lo harías.
anécdota relevante puede servir de inspiración: ee.ryerson.ca/~elf/hack/recovery.html
¿Los FPGA cuentan como binarios? En algunos, graba los bits en el hardware. ¿Cuán dependientes de los binarios son tales FPGA? Me pregunto si algunos de los pequeños y locos proyectos de pasatiempos que he visto con sistemas complejos grabados en hardware se convertirían repentinamente en computadoras muy útiles que aún funcionan.
Estoy con @ScottWhitlock, no veo la diferencia. En el peor de los casos, toma el manual i7 y comienza a crear alias para grupos secuenciales de instrucciones de máquina que forman operaciones comunes, como imprimir un carácter en la pantalla. Y de ahí subimos. De hecho, hacemos esto en el primer año de TI en Granada usando el Código 2 (lo siento, el enlace solo está en español), porque es más simple que una CPU 8086 o i7.
Parece muy hipotético, ya que hay archivos binarios almacenados en todas partes (flash, rom, disco). Puede pensar en la lógica dentro de un PAL y el microcódigo en la mayoría de las CPU también. Perder todos los binarios significa que prácticamente cualquier hardware reciente también está dañado. ¿Y qué pasa con las representaciones intermedias (por ejemplo, el bytecode de Java)? ¿Son binarios o no?
Escribir compiladores y ensambladores desde cero no es raro para mejorar su comprensión de la programación. Hay mucha gente que escribe ensambladores o compiladores básicos puramente en ensamblador, y hay mucha gente que conoce el código de máquina lo suficientemente bien como para ensamblar código manualmente.

Respuestas (10)

El proceso ocurrirá en etapas. No veremos a un grupo de geeks amontonados en una habitación durante 4 años seguidos de un i7 en funcionamiento que arranca Linux. Esas CPU y arquitecturas grandes y complicadas son solo una pequeña parte del mundo informático moderno. También hay miles y miles de fichas más pequeñas que son mucho más fáciles de levantar.

Empezaríamos con un pequeño chip, como un ATtiny. Se puede programar a través de un bus serie SPI , que está cronometrado al 100 % por el maestro. Esto significa que puede tener un conjunto de 4 interruptores controlados por manos humanas, y si los gira en el orden correcto, puede enviar instrucciones a la memoria del ATtiny.

Ahora el primer programa no necesita ser mucho. Esto es algo bueno, porque mover interruptores así es difícil. La primera aplicación probablemente sería una aplicación similar a un editor de texto que le permite escribir una aplicación con interruptores fáciles de usar (es decir, configure 8 interruptores para un byte, luego presione la tecla "confirmar" para almacenarlo en el programa), y algunos capacidades básicas de lectura/escritura (busque el byte 200, reemplácelo con un e8). Antes de apagarlo, esto se extendería para escribir en la memoria flash del ATtiny. Ahora tenemos una computadora que funciona (aunque sea pequeña). Cuando lo apaga y lo vuelve a encender, puede volver a cargar la aplicación de edición de texto.

Ahora, la siguiente pieza del rompecabezas es usar esto para programar otros chips. Esto es fácil: la misma interfaz SPI que usó para desarrollar la primera aplicación es la que usaría para crear aplicaciones en otras. Podría escribir un segundo programa en la memoria flash que, a pedido, se graba en este segundo chip. Ahora podemos duplicar fácilmente nuestro programa de edición de texto, lo que permite que varios desarrolladores trabajen en los desafíos en paralelo.

Ahora podemos usar esto para programar un chip más grande, como un ATmega. En realidad, podríamos haber comenzado con ATmega, porque tiene una capacidad de programación similar, pero sentí que la historia tenía una sensación más clara si comenzáramos programando algo que es demasiado pequeño para contener cualquier herramienta moderna como un compilador de C++. De todos modos, una vez que tengamos un chip lo suficientemente grande, podemos desarrollar un ensamblador real. Tal vez desempolve una de esas viejas impresoras de matriz de puntos e imprima texto en el puerto paralelo. Quite el polvo de un viejo teclado PS/2 y conéctelo directamente al ATmega. Ahora tenemos un ensamblador completo, con un mínimo de decencia humana.

Ahora comienza la fase de arranque. Podemos usar este ATmega para arrancar algunos de los chips más grandes, como el i7, porque podemos usarlo para programar chips FLASH, como aquellos a los que está conectado el BIOS. No es fácil, pero tenemos muchos ingenieros que todavía tienen que trabajar en esas capas, por lo que alguien recordará lo suficiente para que la BIOS funcione. Con esto, no es descabellado esperar que el teclado y las pantallas funcionen (no más código de impresión en las impresoras para leerlo). También deberíamos poder acceder a los discos duros nuevamente, para que podamos escribir código de manera más permanente. Esperaría, en este punto, que alguien escribiera una versión básica de vi(sí, puede ser más básica quevi), y un ensamblador, los cuales funcionan en un sistema de archivos rudimentario. Todo esto está dentro de las capacidades de los desarrolladores de hoy. De hecho, algunos de ellos pensarían que en realidad es un poco divertido (hasta que se agote el Mtn. Dew).

Ahora para la fase real de arranque. Alguien escribirá un controlador de ensamblaje para acceder a un sistema de archivos moderno, como EXT3. No será bonito, pero es suficiente para encontrar una copia de alguna versión antigua de C de los primeros días de arranque. C se inició escribiendo un compilador de C muy simple que manejaba algunos (pero no todos) de los comandos en el lenguaje C. Este compilador simple se usó luego para desarrollar una versión más avanzada de C, y así sucesivamente, agregando características cada vez que se vuelven más y más fáciles de escribir.

Eventualmente, escribiríamos suficiente compilador de C para compilar GCC. Una vez que compilamos un compilador GCC, los frenos se liberan. En cuestión de semanas, tendríamos todas las aplicaciones de Linux operativas, incluido el propio Linux. A partir de ahí, los otros sistemas operativos podrían impulsarse a sí mismos.

Creo que "cuestión de semanas" está siendo más bien optimista. Pruebe Linux From Scratch alguna vez. Fácilmente puede llevar días llegar a un sistema apenas utilizable. Incluso con algo un poco más automatizado, como Gentoo , una reconstrucción completa del sistema, incluso en un sistema de alta potencia, puede llevar mucho tiempo, y mucho menos si está buscando reconstruir todo el software enviado por una distribución moderna de Linux. Dicho esto, estoy de acuerdo con los principios generales establecidos en esta respuesta, si no con el cronograma exacto.
@MichaelKjörling Cierto, puedo estar confiando en los esfuerzos paralelos de muchas personas simultáneamente, y confiando en la gente loca que podría hablar Kernel Driver con fluidez si alguien más entendiera lo que están diciendo =) Lo admito, han pasado años desde que he ¡Me tiré de los pelos haciendo una instalación de etapa 0 de Gentoo!
@Michael Kjörling Sin embargo, si esto fuera un desastre mundial, esperaría que hubiera bastantes personas trabajando para solucionarlo y una gran cantidad de dispositivos que están sentados inútilmente; una vez que se atienden los aspectos básicos, docenas (cientos, incluso miles) de computadoras pueden sentarse allí y compilar todo.
Aunque, tenemos que proteger a estos nerds de las bandas merodeadoras de saqueadores que surgirían.
@ArmanX ¿Eso no supone cierta capacidad para coordinar el esfuerzo? Con sistemas de telecomunicaciones e Internet presumiblemente no funcionales, eso será bastante difícil. Incluso la radio, con equipos modernos, sería dudosa en el mejor de los casos, dado que incluso los equipos de radio antiguos moderados a menudo están controlados por software hasta cierto punto. El Kenwood TS-680S , por ejemplo, lanzado en 1989, está controlado por software y probablemente no se pueda usar en un mundo donde todo el código binario ha desaparecido. Los componentes compatibles de reemplazo directo pueden ser difíciles de conseguir.
@MichaelKjörling Requiere cierta capacidad de coordinación, pero no demasiada. Por ejemplo, Silicon Valley probablemente comenzaría este proceso rápidamente, utilizando Sneakernet como su medio de comunicación subyacente.
Esta respuesta es la mejor técnicamente, pero carece por completo de los aspectos del apocalipsis. Supongo que la pregunta tal vez se hizo así. Pero no puedes empezar a programar sin energía...
@Nadie Pensé en eso. Hay muchas soluciones que comienzan con generadores. Muchos generadores no tienen ningún software que cargar en ellos, por lo que estarían funcionando perfectamente. (Las celdas solares en los techos, por otro lado, a menudo tienen un software de carga complicado para equilibrar la carga y otras cosas. No funcionarían hasta que se pusieran de nuevo en línea).
@Nadie sobre el poder. Es sorprendente cuántos nerds en estos días son lo suficientemente felices como para ponerse algo de lycra y generar unos cientos de vatios de energía de transporte personal en estos días. ¡No debería tomar mucho construir un banco de estos en una fuente de energía renovable autosuficiente a prueba de apocalipsis en el futuro!
@Aron El generador de mi bicicleta es de 6 W, por lo que mi potencia máxima de 400 W es completamente inútil para generar energía. :-) Claro, no es tan difícil en principio. Pero hacerlo y difundir los binarios en el caos podría llevar fácilmente un año o más. Solo quería enfatizar que es fácil técnicamente, pero que existen dificultades prácticas para reiniciar el mundo después de este apocalipsis. Tardará un rato.
@Nadie Soy ingeniero de software. Tengo una lavadora en casa. En él hay un motor eléctrico. También tengo una computadora de escritorio que contiene un SMPS. Entre estas dos cosas y mi bicicleta podría construir un generador que funcione en una semana, menos si me pudieras prescindir de alguien que pueda soldar.
Claro, podrías. Por eso puse el emoticón después de mi primera declaración. Pero la mayoría de la gente no podía. Y la mayoría de la gente ni siquiera pudo reinstalar su sistema operativo, ni siquiera hablar de volver a instalar los chips en sus hornos, refrigeradores, automóviles, teléfonos inteligentes de código cerrado no diseñados para ser abiertos. Esas personas simplemente entrarían en pánico. Reconstruir la sociedad no es principalmente una cuestión de viabilidad técnica, es una cuestión de organización y tedioso trabajo manual repetitivo y tal vez de lucha contra los delincuentes, etc. Eso es lo que estaba tratando de decir.
@MichaelKjörling y CortAmmon, no necesita compilar Linux desde cero , como se indica: How would we rebuild current software, if we had all the current hardware and all software source code, but no actual software?. Ya tienes TODO el código fuente de TODO el software que existió. Solo necesitas compilarlo. Una vez que tiene un compilador gcc ejecutándose , que es el punto final de la respuesta, es solo cuestión de una reacción en cadena de compilación , por lo que creo que unas pocas semanas deberían ser suficientes: P
@xDaizu Sospecho que se está refiriendo a mi comentario principal a esta respuesta, y si lo hace, no entiende el punto. Linux From Scratch es una distribución de Linux que tú mismo creas desde cero, usando un sistema boostrapping antes de que se convierta en alojamiento propio. (Gentoo es similar, pero tiene herramientas para automatizar mucho y viene con el entorno de arranque ya construido). No se trata de escribir el software , se trata de compilar el software . Y para llegar al punto en el que pueda construir el software, comenzando sin archivos binarios, requiere una cantidad de trabajo no insignificante.
@MichaelKjörling sí, seguí tu enlace después de comentar, mi error. Aún así, pensaré que tomará "semanas" (en lugar de "años"), teniendo en cuenta que habría incentivos económicos masivos y aproximadamente el 80% de los programadores e ingenieros de software estarían trabajando en ello (¿qué harían? hacer lo contrario?). Sin embargo, la comunicación sería muy ineficiente (¡no hay internet!), Pero eso es un tema para otra pregunta. ¿Probablemente los gobiernos nos llevarían a miles de nosotros a una instalación conjunta?
@xDaizu No veo en ninguna parte que se haya afirmado que algo como esto llevará años. De hecho, Cort Ammon parece hacer una afirmación opuesta muy específica : "No veremos a un grupo de geeks amontonados en una habitación durante 4 años seguidos de un i7 que funcione y arranque Linux".
@MichaelKjörling dijiste I think "a matter of weeks" is being rather on the optimistic side.. Entendí que el siguiente orden de magnitud serían los años , ya que las semanas y los meses están lo suficientemente cerca como para ser considerados equivalentes. ^^U
@xDaizu Eso es poner palabras en mi boca (o en mi teclado) que nunca usé. Por favor, no hagas eso. Si no está seguro de lo que alguien quiere decir, pregúntele antes de asumir cosas que pueden o no tener alguna base en la intención real o la realidad.
@MichaelKjörling Ahora solo estás hablando de semántica (pone los ojos en blanco). Pero... está bien, seguiré el juego. ¿Cuál es el rango de tiempo exacto, que no se expresaría apropiadamente por "cuestión de semanas" y tampoco por "cuestión de años" que pretendía expresar en su comentario principal? (Y cuando responda eso, probablemente tomaré ese rango de tiempo para english.stackexchange, solo por curiosidad: P)
Visite CollapseOS.org, adelante es un lenguaje excelente para construir rápidamente una computadora que funcione usando muy poco ensamblaje. Me gusta tu respuesta de programar un ATTiny con manos humanas :D

Hablamos por teléfono con algunas de las personas que lo hicieron la primera vez.

No en serio. Tenemos muchos expertos en este campo que todavía están vivos, y es posible que tengan suficiente conocimiento entre ellos para construir un BIOS que funcione. A partir de ahí, podemos llevar a cabo el proceso mucho más rápido que la primera vez: simplemente consultamos al siguiente grupo de expertos para obtener el siguiente conocimiento, que usamos para construir el siguiente nivel de software.

Eventualmente, este proceso llega hasta los expertos de Microsoft y todas las grandes compañías informáticas que fabrican y mantienen los lenguajes que usamos hoy en día, y simplemente presionan F5, compilan el código fuente del lenguaje y nos brindan un nuevo conjunto de binarios.

El mayor problema aquí es la redistribución. Si los binarios de todos han desaparecido, debe reconstruir todas las computadoras o hacer que todos compren una nueva. Y luego, para algunos de los nuevos idiomas que no están preinstalados, debe reforzar sus servidores de distribución para que no se bloqueen cuando todos intenten obtener una copia a la vez.

Como si los teléfonos siguieran funcionando. Los interruptores digitales ejecutan código, con algunos problemas de actualización famosos.
@JDługosz Cierto, pero algunos teléfonos aún funcionan con líneas analógicas con conexiones de enchufe simples. Alternativamente, sabemos dónde es probable que estén estas personas, simplemente vaya y encuéntrelas.
Encuéntrelos en un automóvil clásico, con carreteras obstruidas con automóviles medianos muertos, señales muertas y bombas de gasolina muertas. La historia destacaría cuán omnipresentes son los microcontroladores.
@JDługosz: recuerde que no todos los microcontroladores se basan en binarios: un microcontrolador con un código de máquina simple no necesita binarios para ejecutar ese código.
-1: según el comentario de @JDługosz. Las centralitas son casi sin excepción digitales.
@Ayelis Guauuu. Que bondadoso. Como referencia, todos, rechacé una respuesta de Ayelis hace unos minutos con un comentario casi idéntico.
@Ayelis Más concretamente, todavía hay una buena cantidad de tableros de conexiones, que se usan en pueblos y ciudades más pequeñas para conexiones locales a nacionales.
@ArtOfCode Solo estoy tratando de encajar. Me rechazó después de juzgar negativamente una parte de mi respuesta de varias partes, en función de su comprensión limitada de la operación del código de bajo nivel (como lo demuestran sus referencias a un solo lenguaje de alto nivel), incluso antes de permitirme explicar. Consideré que esto significa que es un lugar común rechazar las respuestas en su conjunto, en función de la comprensión limitada de una sola parte de dicha respuesta. Cuando en Roma.
@ArtOfCode un "código de máquina simple" es un ejecutable binario. Si se produjo mediante la traducción de un idioma de nivel superior no cambia eso. El código de máquina es exactamente lo que se propone borrar.
@JDługosz Cierto. Tengo que admitir que no pensé en eso por completo...
@Ayelis Entonces déjame aclarar eso. Rechacé su respuesta no porque una parte fuera incorrecta, sino porque una parte en la que el resto de la respuesta tenía al menos alguna base era incorrecta. Es muy inusual aquí votar en contra basado en una comprensión limitada; por el contrario, si tuviera menos comprensión estaría más inclinado a simplemente creer tu respuesta.
Dudo que las personas que saben cómo recompilar compiladores de ASM vivan en "ciudades y pueblos más pequeños". Independientemente, HAS mencionado que podemos "simplemente ir y encontrarlos", lo que mejora el alcance de tu respuesta, por lo que seré el hombre más grande y eliminaré mi voto negativo. (Aunque realmente debería editar su respuesta para aclarar ...)
@Ayelis Stack Exchange tiene múltiples sistemas que detectarán la votación en serie o los anillos de votación y revertirán automáticamente los votos o los llamarán la atención de un moderador. Sin embargo, tenga en cuenta que la variación en la frecuencia de los votos (ya sea hacia arriba o hacia abajo) es común y normalmente no es sospechosa.

Hoy en día, no podremos usar ninguna computadora -si desaparecieran todos los programas binarios-, ya que todas tienen algún firmware (por ejemplo, la BIOS) para arrancar, y ese firmware está dentro de alguna ROM (a menudo, alguna Flash ROM).

El tiempo en el que se podía ingresar fácilmente al programa de arranque primordial (sin la ayuda de alguna otra computadora) quedó atrás. ¡En la década de 1960, podía arrancar IBM7094 con conmutadores!

Si cambia su hipótesis a "todos los discos que tengo están borrados" y si su firmware le da algún acceso de escritura (¡y si tuviera toda la documentación necesaria en papel!), podría arrancar su computadora.

Por cierto, supongo que si perdiéramos todos los binarios de software libre en la Tierra tendríamos muchos más problemas que si perdiéramos todos los binarios de software propietario (supongo que en ambos casos el código fuente permanece disponible).

Lea mucho más sobre el arranque , en particular acerca de los compiladores de arranque , por ejemplo, cómo se escribió el primer compilador . Lea también el blog de J.Pitrat sobre el arranque de la inteligencia artificial , está dedicado a los problemas de arranque desde un punto de vista sólido de la IA.

Ver también esta respuesta y aquella a una pregunta muy relacionada. También te puede interesar Linux From Scratch , o Isaac Operating System (escrito en su propio lenguaje, ejecutándose en el bare metal) o incluso MirageOS .

Un problema concreto con el arranque de una computadora completa hoy en día es que es bastante complejo (en particular, pero no solo, debido a las complejidades tecnológicas: los manuales de referencia de Intel x86-64 tienen muchos miles de páginas, y x86 y PC son muy complejos en particular porque por razones históricas y de compatibilidad con versiones anteriores), por lo que llevará mucho tiempo (muchos años de trabajo) y es (lamentablemente) difícil que te paguen por eso. Entonces hay un problema social. Podría ser un poco más simple con otro hardware (por ejemplo, RISC-V , que en realidad no existe o es mucho menos eficiente).

Una pregunta relacionada es cómo reiniciar Internet si o cuando se bloquee.

Seguro que nada correría. Pero, ¿por dónde sería empezar a tener toda esta tecnología y no tener nada que funcione con ella? ¿Cómo sería reconstruir nuestro estado actual?
Probablemente no puedas reconstruir nada hoy.
Ja, seguro que no hoy, pero ¿cómo y por dónde empezaríamos?
@RytisI: probablemente sacando su bicicleta, ya que su automóvil no arranca, y nadie sabe por qué, ya que ninguna de las computadoras o la televisión funcionan.
Gracias por gran respuesta! Publico la recompensa en 2 días y la configuro como aceptada si no surgen mejores respuestas hasta ese momento.
Su enlace a esta respuesta parece una buena respuesta, sería un proceso iterativo. Aunque no estoy seguro acerca de la primera iteración :)
No empezaría arrancando su actual procesador Intel multinúcleo, sino con un pequeño microprocesador.
Creo que las CPU que usan microcódigo también dejarían de funcionar. Lo que creo que significa la mayoría de las CPU modernas (aunque no algunos diseños RISC). Probablemente tendríamos que ensamblar a mano algo para una CPU antigua (como la 6502) y desarmar máquinas antiguas en las que activa una serie de interruptores para configurar la dirección, luego cambia para configurar el byte en esa dirección. Úselo para cargar un ensamblador, luego use un ensamblador para crear un compilador y ejecutar EPROM para unidades de disco, etc. Probablemente podamos omitir algunos lenguajes más antiguos como Dartmouth BASIC y varias versiones de COBOL esta vez.

Apocalipsis ahora

Una mañana temprano, todos los binarios del mundo se desvanecen. Cada pieza de código compilado se ha ido; los datos aún están allí, los archivos de código aún están intactos, pero cada pieza de código compilado se ha ido. Maricón.

Lo primero en la mente de todos no será cómo recuperarlo, sino cómo sobrevivir; los aviones fly-by-wire caerán del cielo, los teléfonos no funcionarán, Internet desaparecerá, los automóviles no arrancarán, las centrales eléctricas se apagarán. Todos esos dispositivos y sistemas, grandes o pequeños, tienen pequeños chips que alguna vez estuvieron llenos de firmware. Por supuesto, cualquier cosa construida en la década de 1980 o antes probablemente estará bien; los automóviles no comenzaron a tener computadoras a bordo hasta la década de 1990, en su mayor parte.

Aún así, esto no es solo un desastre de ingeniería o programación. Es un evento a escala de apocalipsis. Una buena parte del mundo se quedará sin comida, agua o electricidad fiables; la comunicación se cortará por completo.

¿Donde empezar?

El mejor lugar sería un colegio o universidad, ya que lo más probable es que tengan un lector de tarjetas perforadas que funcione (y un generador). Usando tarjetas perforadas como interfaz inicial, nuestros intrépidos programadores podrían comenzar a escribir código inmediatamente.

Por supuesto, esas viejas máquinas son terriblemente lentas y consumen mucha energía. Por lo tanto, nuestros programadores utilizan los sistemas controlados por tarjetas perforadas para programar microcontroladores , o sus primos más rápidos, las microcomputadoras .

Estas pequeñas computadoras necesitarán algún tipo de interfaz; con suerte, hay un viejo teclado controlado por transistores y algunos CRT viejos por ahí. Los teclados modernos y las pantallas LCD dependen del firmware. Con un poco de discusión sobre el código, nuestros programadores tienen una computadora, un teclado, una pantalla y una forma de guardar su código.

Además, se volverá a actualizar cualquier dispositivo con firmware que pueda reescribirse rápidamente; algún hardware antiguo, como las unidades de CD antiguas, tenía muy poco firmware, pero aún podría leer discos modernos.

Fusibles de seguridad

Recuperar lo perdido será mucho, mucho más difícil. Casi todo el hardware moderno no será más que basura; casi todos los chips con un fusible de seguridad quemado serán inútiles, convirtiendo los teléfonos celulares y las computadoras portátiles en ladrillos. Los discos duros, aunque los datos aún existen, no tendrán firmware para extraer esos datos.

La mejor apuesta son las computadoras de código abierto. Alguien, en algún lugar, tendrá un chip flash sin bloqueo de seguridad con algún código almacenado. A partir de ahí, la computadora de código abierto se puede reconstruir y los programadores pueden comenzar lentamente a restaurar el software. De lo contrario, alguien tiene una copia de seguridad de todo su código en una unidad flash barata; con un poco de piratería de hardware, es posible extraer esos datos, aunque será un proceso difícil.

Regreso al futuro

Una vez que las computadoras (por diminutas que sean) estén operativas, la vida será un poco más fácil, pero la mayoría del hardware moderno será inútil. Incluso si se pudiera reconstruir el BIOS en una placa base moderna, las tarjetas de video, ethernet e incluso sonido no tendrían su firmware. El software se restablecería a donde estaba a fines de la década de 1980. Regresaría gradualmente, pero espero que tome más tiempo que la primera vez. Lo del apocalipsis, y todo.

Uno de los problemas más grandes no es la compilación del código fuente porque lo perdería todo, todas las unidades se almacenan en binario, por lo que todo lo que conocemos como tecnología actual sería borrado. Y reprogramarlo todo sería una gran tarea considerando que todos los prototipos o versiones desaparecerían. Esperaría incluso una escasez de alimentos u otros eventos similares considerando cuántas computadoras pequeñas hay en las cosas que usamos con tanta frecuencia en nuestras vidas, como automóviles, administración de la red eléctrica y electrodomésticos.

De alguna manera tiene razón en su respuesta, pero creo que la pregunta se basó en cómo se haría un nuevo comienzo en las computadoras si comenzáramos en nuestro nivel actual. Y no como respondiste, el producto de todos los binarios que desaparecen.
"Binarios" en este contexto se refiere a ejecutables binarios, no binario el formato de datos de base dos.
Supuestamente, no perderíamos el código fuente, ya que el código fuente está en Ascii, no en binario. Y mientras tengamos el código fuente, podemos recompilar todo lo que hemos perdido. Sin embargo, si perdemos el código fuente, estaríamos bastante perdidos. Los ensambladores tendrían que teclearse a mano, y todos los lenguajes de nivel superior tendrían que teclearse desde cero. ¡Aunque es posible que todavía tengamos una gran cantidad de código fuente en forma de copias impresas o libros!

Técnicamente, el firmware es "hardware", por lo que esperaría que se mantuviera. Supongo que la "desaparición de archivos binarios" tiene más que ver con la eliminación de la información que con una calamidad física que afectó a todos los dispositivos de almacenamiento de información, pero perdió por poco cualquier cosa que no se pareciera a un código de máquina en ejecución. Si efectivamente se mantuviera el firmware, entonces creo que tendríamos una buena ventaja. Deberíamos poder iniciar cualquier sistema que pueda funcionar con firmware y al menos tener un sistema operativo primitivo y capacidad de edición de texto. El problema interesante es que si tenemos el código fuente, pero la mayor parte es electrónico, entonces es prácticamente inútil para nosotros hasta que podamos restaurar los sistemas que pueden leerlo.

Dado que hay tanto software potencialmente utilizable por ahí, tendría más sentido reproducir los compiladores que podrían reconstruir el software. Esto significa que lo más probable es que la sociedad no intente reinventar los lenguajes de programación desde cero hasta que hayamos recuperado los que acabamos de perder. Dado que hemos perdido el uso de Internet y el almacenamiento de información digital, nuestra mejor apuesta es apuntar a los idiomas mejor documentados para los que tenemos libros. Sin duda, un compilador de C será la primera y más importante herramienta de alto nivel en la reconstrucción. Una vez que tenga eso, el progreso se puede hacer muy rápidamente. Luego puede reconstruir sistemas operativos completos, muchas herramientas de software y compiladores para muchos idiomas. Hay una razón por la que este lenguaje de 40 años todavía encabeza la lista de TIOBE. Es el "inglés" del mundo de la programación: torpe, molesto,

Dado que hay tantos expertos en C/C++ en el mundo, una vez que tenga un sistema que pueda ingresar texto y almacenar bytes en el disco, construir un compilador en realidad no debería ser tan difícil. Lo más probable es que un grupo de personas mejore el "IDE" a través del código ensamblador/máquina sin procesar, y probablemente lo reinvente desde cero solo para mejorar la productividad. Muchas partes de un sistema operativo mínimo serían forzadas solo para poner en funcionamiento este primer compilador de C. Pero estoy bastante seguro de que obtener la primera compilación autohospedada del compilador sería el equivalente moral del motor de arranque en un motor gigante que finalmente enciende el volante para que pueda ser autosuficiente.

De hecho, lo más probable es que este proceso ocurra en muchos lugares del mundo. Es muy posible que Rusia o Europa del Este produzcan el primer compilador de C en funcionamiento "poscatástrofe" debido a la cantidad de piratas informáticos/escritores de virus que tienen que comprender el código de bajo nivel. Aunque China tiene muchos piratas informáticos, tienden a tomar caminos de nivel superior hacia los sistemas. Me sorprendería que crearan uno de los primeros compiladores de C desde cero (aunque un gran grupo de estudiantes universitarios emprendedores pueden lograrlo por pura fuerza de voluntad). Los piratas informáticos de EE. UU. y Europa occidental tendrían la ventaja de contar con la mayor cantidad de libros C y manuales de referencia disponibles, y en un idioma que comprendan fácilmente.

Ahora, si el firmware también se elimina, las cosas se vuelven mucho, mucho más difíciles, en la línea de alternar el interruptor como lo describen otros. Eso es tan deprimente que ni siquiera puedo contemplarlo. Pero asumo que los subprocesos se fusionan una vez que llegas a una consola básica (teclado, monitor, almacenamiento persistente... ya sea disco, cinta, flash, etc.).

Aunque muchos lenguajes tienen compiladores autohospedados, la mayoría de los compiladores podrían reconstruirse desde cero en C, y la mayoría de los diseñadores del lenguaje original podrían ayudar en este esfuerzo. Creo que, en general, la reconstrucción procedería mucho más rápido de lo que la gente podría imaginar (desde la consola básica hasta el compilador de C con alojamiento propio en 6 meses o menos). En casi todos los casos, la gente probablemente decidirá que es mejor simplemente reemplazar lo que se perdió y recuperar la funcionalidad que salirse de los rieles y rediseñar las cosas.

Se produciría un rediseño si también perdiera el código fuente . Tal vez la información se retenga en los libros, pero si se perdieran todos los ejecutables electrónicos y la fuente, entonces creo que veríamos un rediseño significativo y un atajo a técnicas más avanzadas. Creo que C todavía se reconstruiría desde cero, debido a su estatus como una especie de lingua franca. Y posiblemente Java y algunos otros lenguajes principales serían revividos (aunque obviamente de implementaciones de sala limpia). Por otro lado, sería mucho más difícil restaurar Linux, Windows o OS X sin ningún código fuente, solo a partir de libros.

Curiosamente, podríamos aprovechar esta oportunidad para eliminar muchas fallas persistentes de los lenguajes, herramientas y sistemas operativos. Tal vez no obtendríamos C exactamente, sino una especie de C99 mejorado con una gran cantidad de elementos heredados eliminados. Por un lado, sería beneficioso para todos simplemente implementar un compilador C99 exacto, para que personas de todo el mundo pudieran intercambiar fuentes C a medida que se reconstruía el mundo digital. Esto desalentaría la innovación. Y por esta razón, lo más probable es que Linux se convierta en el sistema operativo de facto de la nueva era, simplemente porque muchas partes de él podrían restaurarse a partir de libros y conocimientos guardados en ciertos asistentes de alto nivel.

Probablemente, el software propietario simplemente dejaría de competir hasta que se reemplazara la mayor parte de la funcionalidad. Por lo tanto, lo más probable es que la reconstrucción ocurra bajo un modelo muy abierto, a menos que algunos países noten que están progresando mucho más rápido que otros y puedan obtener una ventaja competitiva al cerrar su progreso del resto del mundo. Al final del día, el comercio global obligaría a los países a restablecer los estándares internacionales, por lo que es difícil decir cuánto tiempo podrían sobrevivir esos muros.

Aunque muchos lenguajes fallidos simplemente no se reproducirían (a menos que lo hicieran sus amados creadores), los lenguajes más populares seguramente se revivirían debido al valor acumulado de los programadores con dominio de esos lenguajes. Lo mismo ocurre con las herramientas. Sin embargo, llevaría mucho tiempo reconstruir algo como Microsoft Office o Adobe Photoshop, y mucho menos Windows Server 2012. Es posible que estas herramientas nunca vuelvan a existir, y quizás haya una nueva carrera armamentista para reinventar cada categoría de software desde cero.

Cada tecnología con un estándar publicado superaría a las alternativas propietarias sin un estándar público, simplemente porque los estándares representarían un esfuerzo intelectual preservado en el texto que no necesita ser rehecho. Pero las tecnologías estándar más débiles pueden ser reemplazadas por mejores alternativas simplemente porque el peso del legado se ha quitado y ya no es una gran ventaja para las malas soluciones antiguas.

Cuando hablamos de lenguajes de programación y programación informática en general, hablamos de lenguajes y su nivel de abstracción. Una vez tuvimos paneles de conexión que se usaban para programar computadoras. La mayoría de las computadoras no eran realmente programables, sino que estaban cableadas para realizar cierto tipo de operación. Más tarde llegamos a las computadoras programables.

Al principio, usamos códigos de operación binarios para producir código. Necesitaría conocer cada código de operación que usó el procesador e ingresar su programa byte por byte en la memoria de la computadora. Más tarde se inventó una forma abreviada, que usaba palabras para describir operaciones. Se llamaba forma mnemotécnica. Esto es casi como un montaje moderno. Un segundo paso vino con los ensambladores de macros, que permitieron el uso de macros. Esos son los lenguajes de bajo nivel.

Un lenguaje de nivel medio es algo así como C y PL/I, no son lenguajes muy abstractos. La gente suele considerar que este es el lenguaje de los hackers más extremo: "Oye, estoy usando un lenguaje de abstracción media, esto debería significar que soy un súper hacker". Pero, por lo general, los lenguajes de baja abstracción son más propensos a los defectos. C proporciona llamadas de función básicas basadas en argumentos de función y otras abstracciones menos primitivas como matrices y estructuras. Esto es mucho más fácil de programar que el ensamblaje puro y, si se hace con cuidado, puede incluso dar como resultado un código portátil. Pero C carece de abstracciones como objetos, cadenas (cadenas formales, no cadenas basadas en punteros).

Un lenguaje con un mayor nivel de abstracción es Java o C#. Lamentablemente, ambos idiomas se interpretan en una máquina virtual. Esto significa que la ejecución del código debe traducirse sobre la marcha desde una máquina virtual abstracta a algo que el procesador de nivel inferior entienda. Que es lento. Otro lenguaje que ofrece un nivel muy alto de abstracción es Python, Ruby, etc. Entonces, la gente piensa que los lenguajes de alto nivel deben interpretarse. Object Pascal (el hijo feo rechazado) es tan abstracto como Java pero produce un código verdaderamente compilado (hasta el formato binario).

El código administrado no es el último invento. Implica un precio enorme en velocidad. Es una especie de abstracción, pero no exenta de defectos.

El proceso de creación del ecosistema de un nuevo sistema informático se denomina arranque. Si crea una nueva computadora, deberá realizar dos pasos: crear un compilador que pueda generar código en la forma esperada de esta máquina y un nuevo sistema operativo (que generalmente estará escrito en ese idioma).

Por lo general, comenzará con un compilador cruzado que usará un determinado sistema ya existente para generar código para este nuevo sistema. Luego, este compilador cruzado se usará para crear un sistema operativo básico y compilar el compilador en un binario que se ejecute en esa nueva computadora.

Dado que las máquinas del mundo real se basan en componentes reales, esas máquinas funcionan con un nivel de abstracción bajo. No se pueden tener máquinas virtuales sin máquinas reales, porque una máquina virtual es en realidad un programa de computadora como cualquier otro. Esto significa que entre el código de su programa y el hardware existe un hueco que necesita ser llenado.

tl; dr

Primero necesitará crear un programa ensamblador mnemotécnico desde cero (utilizando su conocimiento sobre las máquinas), luego un ensamblador de macros y luego un compilador verdadero (generalmente para lenguaje C). A partir de entonces podrás compilar todo lo demás.

C# no se interpreta. No sé mucho sobre Java, pero sospecho que tampoco lo es: Java se compila en un código de bytes que ejecuta una máquina virtual. C# se compila directamente en código de máquina, generalmente JIT, pero aun así se compila.
Desde el punto de vista de los niveles de abstracción, se interpreta C#.
Para ser más claro, una vez escribí un intérprete de lenguaje que usaba una máquina virtual. Los verdaderos compiladores pueden traducir de código abstracto a código concreto que se ejecuta en el metal desnudo, cualquier cosa diferente a eso es un intérprete. Desafortunadamente, el mercado cambia las definiciones científicas para que coincidan con los intereses económicos...
No, C# es un lenguaje compilado. Mira esto . Utiliza una máquina virtual, pero eso no significa que se interprete. El compilador traduce de C# a código de máquina, por lo tanto, es un compilador.
Desde el punto de vista de los niveles de abstracción, una VM no es código compilado. Pero, las demandas de marketing de empresas como Microsoft y Sun necesitaban deformar la definición para que se ajustara a sus demandas. La mayoría de la gente piensa que Java es el primer lenguaje que utilizó una máquina virtual. Pascal P-Code (en los años 70) usaba una máquina virtual y no se consideraba compilado por la definición clásica de lenguajes.
Lee el enlace. El uso de una VM no tiene nada que ver con ser compilado o no, compilado o interpretado se define únicamente por el tiempo de traducción: los lenguajes interpretados son traducidos por otro programa a código de máquina en tiempo de ejecución , los lenguajes compilados se traducen a código de máquina por adelantado. C#, según esa definición, está compilado.
Amigo, escribo compiladores si quiero. Una máquina virtual no cuenta como verdaderamente compilada. Tenemos un nombre para este "pseudocompilador". El lenguaje de Clipper fue pseudo-compilado, al igual que el código p de pascal. Necesita un marco de tiempo mucho mayor para ver la verdad además de las definiciones de comercialización.
Para compilarlo, debe traducir el código a código de máquina, verdadero código de máquina, que es mucho menos abstracto que el IL habitual. Las máquinas virtuales de ese tipo hacen muchas adiciones al conjunto de códigos de operación para permitir que los lenguajes de alto nivel se traduzcan fácilmente a su código de bytes (como la creación de instancias de objetos), algo que es mucho más difícil en el hardware real.
Antes de Java, las cosas eran mucho más simples: Compiladores: traducen el código de un nivel de abstracción más alto a un nivel de abstracción más bajo. Intérpretes: Ejecutar código sin cambiar el nivel de abstracción. Traductores: Traduce código entre dos idiomas sin cambiar los niveles de abstracción. Pseudocompiladores: traducen un idioma a un formato de código de bytes que es menos abstracto que el idioma pero que aún no tiene un nivel bajo. Tan pronto como Sun lanzó Java, cambiaron la definición a través del departamento de marketing, no del departamento de investigación.
Si Java iba a tener éxito, la etiqueta pseudocompilada tendría que desaparecer. ¿Por qué dejar de usar C/C++ o Delphi (que realmente están compilados) para usar Java pseudocompilado? ¡Ajá! Llamémoslo compilado y apostamos a que todos comerán esto... Goebbles estaría de acuerdo.

¿Cómo compilaríamos nuestro código si todos los binarios del mundo desaparecieran [...]

Haga que alguien de la Estación Espacial Internacional use un Soyuz-TMA para bajar con una computadora portátil que aún funciona con todos los compiladores que tienen disponibles. (Oye, técnicamente no están en el mundo ...)

La recuperación sería mucho más rápida de lo que piensas

Encuentra un coche anterior a 1986, conduce hasta el museo de la informática. Inicie el cuadro de Altair, Imsai o Digital Group, e inícielo normalmente: alternar en un cargador de arranque .

Alternar significa configurar una dirección de memoria en los 16 interruptores de dirección, luego configurar un valor de datos en los 8 interruptores de datos y presionar "ESCRIBIR", luego pasar automáticamente a la siguiente ubicación de memoria, repetir el lavado con enjuague.

Un cargador de arranque es un programa extremadamente corto, de ~100 bytes, que puede ingresar datos desde algún otro dispositivo de E/S, como un lector de cinta de papel.

ingrese la descripción de la imagen aquí

Use el lector de cinta de papel para ingresar su programa, o hey, aquí tiene una idea, ¿qué tal un sistema operativo ? Ya sabes, como Apple Monitor (2048 bytes) que incluía mucho código para emular un TTY en la pantalla y el teclado internos de Apple, no es necesario, solo usa un TTY físico o VT100.

Y ahora hacemos una pausa para almorzar .

Unos pocos cientos de bytes en el sistema operativo le enseñan a leer/escribir una cinta de casete. Otro par de miles le enseñan a leer/escribir unidades de disco. No estoy especulando, así es como funcionaron.

Mientras tanto, se están realizando esfuerzos paralelos

  • almacenar el cargador de arranque en la ROM de alguna manera, para reducir los callos en los dedos

  • un sistema de archivos de disco primordial

  • un editor de texto simple (hmm, ¿los VT100 todavía funcionan?)

  • un ensamblador (compilador de lenguaje ensamblador, por lo que podemos decir LDA #INPUT_MODEen lugar de A9 03.).

Y será mejor que cenemos antes de que cierren todos los restaurantes.

En este punto, estamos haciendo la línea de comandos tal como lo hacemos ahora, excepto que usamos un VT100 real en lugar de una ventana Terminal/PuTTY. No tendremos un ls -Rporque aún no tenemos un sistema de archivos recursivo, pero pequeños pasos Ellie.

Hablando de pequeños pasos, comenzamos a escribir lenguajes de alto nivel y desarrollo cruzado; es decir, use el Imsai para realizar una compilación cruzada de 80386 para arrancar el Compaq 386 (tenga en cuenta que su primer código x86 sería nativo de 32 bits y no tendría el concepto de las antiguas barreras de RAM de 64k/1 MB), luego utilícelo para compilación cruzada para PowerMac G3, etc.

La parte difícil es la coordinación.

El problema es que este esfuerzo se lleva a cabo de manera independiente en cada lugar donde existe una máquina Altair/Imsai/Digital Group en funcionamiento. Ahora el desafío es coordinar los esfuerzos cuando los teléfonos no funcionan. Si los teléfonos funcionaran, cualquier módem de 300 baudios de pieza de museo haría que los equipos hablaran y compartieran el código.

Y la compañía telefónica no está ociosa; están tratando de descubrir cómo conseguir algo.

Aproximadamente un día después de que las telecomunicaciones estén listas, alguien habrá (re)escrito el software BBS, suponiendo que no haya encontrado una copia antigua del código fuente de BBS en la revista BYTE. Ahora estamos haciendo lo mismo que hacemos aquí. Esto aumenta balísticamente la velocidad de la reconstrucción, especialmente porque todas las naciones del mundo lo han identificado como una prioridad estratégica nacional.

El firmware es una molestia

Desafortunadamente, muchos componentes hoy en día, como los llaveros USB, tienen un "firmware" ejecutándose en un nivel inferior del sistema, y ​​realmente no tienen una puerta trasera "dura" como el panel frontal de Imsai para forzar la carga de un cargador de arranque. Si ese firmware desaparece, cada máquina tendría que ser pirateada o desechada. Sin embargo, eso no será un problema hasta que entremos en el hardware de 2000, por lo que Pentium y Mac Quadra 800 probablemente seguirán funcionando bien. Y con esos podemos rediseñar/reemplazar al otro.

Es cierto que una Quadra 800 no tiene un panel frontal de interruptores. Sin embargo, tiene rastros en su PCB, y tendría que hacer algo de piratería de hardware para obtener un cargador de arranque, o simplemente aprender a grabar EPROM.

Conocemos el destino

Dado que los problemas de diseño están extremadamente bien definidos y bien entendidos, todo lo que queda es el intercambio de códigos. No necesitamos reinventar la rueda, todos sabemos cómo son las ruedas, solo necesitamos tallar una.

Recuerde, casi todo el código existente lo entiende alguien que está vivo y que, si se le presiona, podría reescribirlo. Mejor.

Sería lo mejor del mundo.

Nos permitiría (je) "reiniciar" el diseño de nuestros sistemas informáticos desde cero, en lugar de arrastrar constantemente la antigua infraestructura heredada que complica todo. El código se simplificaría y unificaría en parte porque tenemos que hacer que el mundo vuelva a funcionar, y no hay tiempo para admitir un montón de formas heredadas de hacer lo mismo. DOSbox desaparecido . Las ventanas se han ido . Flash desaparecido . HTML/CSS/AJAX pantano simplificado . Etc. etc. El gobierno pisotearía todos los temas de patentes debido a la emergencia nacional.

¿Nunca ha deseado poder tomarse un mes y reescribir todo su código de espagueti heredado y estándares obsoletos? Ahora usted puede.

El único problema es que nuestra civilización se habría estrellado fatalmente. Sin vehículos que funcionen, sin telecomunicaciones, sin dinero, sin comida, sin agua, sin electricidad, sin tiempo... Anarquía en cuestión de horas, megamuertes en semanas, en la edad de hierro temprana para los supervivientes en un año.

Una vez que tenemos un compilador C89 en funcionamiento , el problema está lejos de terminar: muchos programas no pueden compilar sin el simplismo que requiere gcc, que también es un compilador C++ que requiere bibliotecas C++.

Entonces, para compilar la mayoría del software, necesita un compilador de C ++, y para hacerlo, necesita un compilador de C ++.

Tomará mucho tiempo lograrlo. Y este puede ser tiempo suficiente para hacer que el software C89 sea popular, para tener nuevo software que se escriba desde cero, o se convierta, en C89.

Los lenguajes de programación livianos como luaese son C89, solo se harían cargo de los demás.

Puede descargar y utilizar un GCC antiguo (por ejemplo, GCC 4.3) escrito en C (no C++). Use eso g++-4.3para construir y compilar g++-4.6; úselo g++-4.6para compilar , y luego g++-4.9úselo para compilar . AFAIK, la transición en las partes internas de GCC de C a C ++ se pensó con un proceso tan iterativo en mente. g++-5g++-6
De hecho, la estrategia de escribir un compilador más simple es compilar un compilador más avanzado. Todavía es un camino complejo para compilar un software solo en C.