Wie würden wir unseren Code kompilieren, wenn alle unsere Binärdateien verschwunden wären?

Wie würden wir unseren Code kompilieren, wenn alle Binärdateien der Welt verschwinden würden und wir nur noch den Quellcode hätten? Zuerst denkst du vielleicht „Alles okay: Ich habe meinen Roslyn-Code hier“, aber warte! Es ist in C#! Sie sehen sich also einen älteren C#-Compiler an, der wiederum beispielsweise in C++ geschrieben ist, aber warten Sie ... und so weiter. Würden Sie sich am Ende einen ASM-Compiler löten?

Wie würden wir aktuelle Software neu erstellen, wenn wir die gesamte aktuelle Hardware und den gesamten Software-Quellcode, aber keine tatsächliche Software hätten? Würden wir den gleichen Weg wie zuvor gehen oder würden wir einige Abkürzungen nehmen und am Ende beispielsweise früher verwalteten Code haben? Würden wir nicht verwalteten Code vollständig überspringen und am Ende ein Singularity -ähnliches Betriebssystem haben? Würden wir unsere neuen Bootstrapper und Compiler so bauen, dass sie unseren vorhandenen (und wahrscheinlich, wenn wir die Dinge zum Laufen bringen, uralten Code) verwenden können, oder würden wir alles von Grund auf neu schreiben?

Sie können einen Compiler in der Sprache schreiben, die er kompiliert; siehe zB en.wikipedia.org/wiki/Bootstrapping_%28compilers%29
@ScottWhitlock es ist nicht die Frage, wie der erste Compiler geschrieben wurde, sondern wie wir den ersten Compiler jetzt mit aktuellem Wissen und ohne Software schreiben würden
@RytisI - Ich verstehe nicht, wie es anders wäre. Sie schreiben einen Assembler in Maschinencode und dann einen Compiler in Assemblercode. Es ist keine Magie.
@ScottWhitlock sicher ist es anders. Es ist eine Sache, eine neue Sprache in einer bestehenden Infrastruktur zu erstellen, und eine andere, bei Null anzufangen. Wie würden Sie Ihren i7 mit Maschinencode Ihres Assemblers füttern?
"Wie würden Sie Ihren i7 mit Maschinencode Ihres Assemblers füttern?" Wie bereits erwähnt, lautet die Antwort einfach: Sie würden es nicht tun.
Eine relevante Anekdote kann Inspiration liefern: ee.ryerson.ca/~elf/hack/recovery.html
Zählen FPGAs als Binärdateien? In einigen brennen Sie die Bits in die Hardware. Wie abhängig von Binärdateien sind solche FPGAs? Ich frage mich, ob einige der verrückten kleinen Hobbyprojekte, die ich gesehen habe, mit komplexen Systemen, die in Hardware eingebrannt sind, plötzlich zu äußerst nützlichen, noch funktionierenden Computern werden würden.
Ich bin bei @ScottWhitlock, ich sehe den Unterschied nicht. Im schlimmsten Fall nehmen Sie das i7-Handbuch zur Hand und beginnen, Aliasnamen für aufeinanderfolgende Gruppen von Maschinenbefehlen zu erstellen, die allgemeine Vorgänge bilden, wie z. B. das Drucken eines Zeichens auf dem Bildschirm. Und von dort gehen wir nach oben. Wir machen das eigentlich im ersten Jahr der IT in Granada mit Code 2 (sorry, Link nur auf Spanisch), weil es einfacher ist als eine 8086- oder i7-CPU.
Scheint sehr hypothetisch, da überall Binärdateien gespeichert sind (Flash, Rom, Festplatte). Sie können sich auch die Logik in einem PAL und den Mikrocode in den meisten CPUs vorstellen. Der Verlust aller Binärdateien bedeutet dann, dass praktisch auch jede aktuelle Hardware kaputt ist. Und was ist mit Zwischendarstellungen (z. B. Java-Bytecode)? Sind das Binärdateien oder nicht?
Das Schreiben von Compilern und Assemblern von Grund auf ist nicht ungewöhnlich, um Ihr Verständnis der Programmierung zu verbessern. Es gibt viele Leute, die Assembler oder einfache Compiler rein in Assembler schreiben, und es gibt viele Leute, die Maschinencode gut genug kennen, um Code manuell zu assemblieren.

Antworten (10)

Der Prozess wird in Etappen ablaufen. Wir werden keinen Haufen Geeks sehen, die 4 Jahre lang in einem Raum zusammengepfercht sind, gefolgt von einem funktionierenden i7, der Linux bootet. Diese großen, komplizierten CPUs und Architekturen sind nur ein kleiner Teil der modernen Computerwelt. Es gibt auch Tausende und Abertausende von kleineren Chips, die viel einfacher aufzustehen sind.

Wir würden mit einem kleinen Chip beginnen, wie einem ATtiny. Es kann über einen seriellen SPI-Bus programmiert werden , der zu 100 % vom Master getaktet wird. Das bedeutet, dass Sie einen Satz von 4 Schaltern haben können, die von Menschenhand gesteuert werden, und wenn Sie sie in der richtigen Reihenfolge drehen, können Sie Anweisungen in den Speicher des ATtiny schieben.

Jetzt muss das erste Programm nicht viel sein. Das ist auch gut so, denn solche Schalter zu drehen ist schwierig. Die erste Anwendung wäre wahrscheinlich eine Texteditor-ähnliche Anwendung, mit der Sie eine Anwendung mit einfach zu verwendenden Schaltern schreiben können (dh 8 Schalter für ein Byte setzen, dann die "Bestätigen"-Taste drücken, um es im Programm zu speichern) und einige mehr grundlegende Lese-/Schreibfähigkeiten (suchen Sie nach Byte 200, ersetzen Sie es durch ein e8). Vor dem Ausschalten würde dies erweitert, um in den Flash-Speicher des ATtiny zu schreiben. Jetzt haben wir einen funktionierenden Computer (wenn auch einen kleinen). Wenn Sie es aus- und wieder einschalten, kann es die Texteditoranwendung neu laden.

Nun besteht das nächste Puzzlestück darin, damit andere Chips zu programmieren. Das ist einfach: Dieselbe SPI-Schnittstelle, die Sie zum Entwickeln der ersten App verwendet haben, verwenden Sie zum Erstellen von Apps in anderen. Sie könnten ein zweites Programm in den Flash-Speicher schreiben, das auf Befehl in diesen zweiten Chip gebrannt wird. Jetzt können wir unser Texteditorprogramm einfach duplizieren, sodass mehrere Entwickler parallel an den Herausforderungen arbeiten können.

Jetzt können wir damit einen größeren Chip wie einen ATmega programmieren. Eigentlich hätten wir mit dem ATmega anfangen können, weil es eine ähnliche Programmierbarkeit hat, aber ich hatte das Gefühl, dass die Geschichte ein klareres Gefühl hätte, wenn wir damit angefangen hätten, etwas zu programmieren, das zu klein ist, um sich in einem modernen Tool wie einem C++-Compiler zu halten. Unabhängig davon, sobald wir einen ausreichend großen Chip haben, können wir einen echten Assembler entwickeln. Vielleicht entstauben Sie einen dieser alten Nadeldrucker und geben Text an den parallelen Anschluss aus. Entstauben Sie eine alte PS/2-Tastatur und schließen Sie sie direkt an den ATmega an. Jetzt haben wir einen ausgewachsenen Assembler mit einem gewissen Maß an menschlichem Anstand.

Nun beginnt die Bootstrapping-Phase. Wir können diesen ATmega verwenden, um einige der größeren Chips wie den i7 zu booten, weil wir ihn verwenden können, um FLASH-Chips zu programmieren, wie diejenigen, mit denen das BIOS verbunden ist. Es ist nicht einfach, aber wir haben viele Ingenieure, die immer noch in diesen Schichten arbeiten müssen, also wird sich jemand genug merken, um das BIOS zum Laufen zu bringen. Damit ist es nicht unangemessen zu erwarten, dass funktionierende Tastaturen und Bildschirme funktionieren (kein Drucken von Code mehr auf Druckern, um ihn zu lesen). Auch auf Festplatten sollen wir wieder zugreifen können, damit wir dauerhafter Code schreiben können. Ich würde an dieser Stelle erwarten, dass jemand eine Bare-Bones-Version davon schreibt vi(ja, es kann mehr Bare-Bones alsvi) und einen Assembler, die beide auf einem rudimentären Dateisystem arbeiten. All dies liegt innerhalb der Möglichkeiten heutiger Entwickler. Tatsächlich würden einige von ihnen denken, dass es eigentlich ein bisschen Spaß macht (bis der Mtn. Dew aufgebraucht ist).

Nun zur eigentlichen Bootstrapping-Phase. Jemand wird einen Assembly-Treiber schreiben, um auf ein modernes Dateisystem wie EXT3 zuzugreifen. Es wird nicht schön sein, aber das reicht aus, um eine Kopie einer alten Version von C aus den frühen Bootstrapping-Tagen zu finden. C wurde gebootstrapped, indem ein sehr einfacher C-Compiler geschrieben wurde, der einige (aber bei weitem nicht alle) Befehle in der C-Sprache handhabte. Dieser einfache Compiler wurde dann verwendet, um eine fortgeschrittenere Version von C usw. zu entwickeln, wobei jedes Mal Funktionen hinzugefügt wurden, wenn sie immer einfacher zu schreiben waren.

Irgendwann würden wir genug C-Compiler schreiben, um GCC selbst zu kompilieren. Sobald wir einen GCC-Compiler kompiliert haben, werden die Bremsen gelöst. Innerhalb weniger Wochen hätten wir jede einzelne Linux-Anwendung einsatzbereit, einschließlich Linux selbst. Von dort aus könnten sich die anderen Betriebssysteme selbst verstärken.

Ich denke, "eine Frage von Wochen" ist eher optimistisch. Probieren Sie Linux From Scratch einige Zeit aus. Es kann leicht Tage dauern, nur um zu einem kaum nutzbaren System zu gelangen. Selbst mit etwas automatisierterem wie Gentoo kann ein vollständiger Systemneuaufbau selbst auf einem leistungsstarken System sehr lange dauern, geschweige denn, wenn Sie die gesamte von einer modernen Linux-Distribution gelieferte Software neu erstellen möchten. Allerdings stimme ich den in dieser Antwort dargelegten allgemeinen Grundsätzen zu, wenn auch nicht dem genauen Zeitplan.
@MichaelKjörling Stimmt, ich verlasse mich möglicherweise auf die parallelen Bemühungen vieler Menschen gleichzeitig und auf die verrückten Leute, die Kernel Driver fließend sprechen könnten, wenn jemand anderes verstehen würde, was sie sagen =) Ich gebe zu, es ist Jahre her, seit ich es getan habe habe mir bei einer Gentoo Stage 0 Installation die Haare ausgerissen!
@Michael Kjörling Wenn dies jedoch eine weltweite Katastrophe wäre, würde ich erwarten, dass einige Leute daran arbeiten, es zu beheben, und eine sehr große Anzahl von Geräten, die nutzlos herumstehen. Sobald die Grundlagen erledigt sind, können Dutzende (Hunderte, sogar Tausende) von Computern dort sitzen und alles kompilieren.
Allerdings müssen wir diese Nerds vor den plündernden Plündererbanden schützen, die auftauchen würden.
@ArmanX Setzt das nicht eine gewisse Fähigkeit voraus, die Bemühungen zu koordinieren? Bei vermutlich nicht funktionierenden Internet- und Telekommunikationssystemen wird das ziemlich schwierig. Selbst Radio mit moderner Ausrüstung wäre bestenfalls zweifelhaft, da selbst moderate Vintage-Radiogeräte oft bis zu einem gewissen Grad softwaregesteuert sind. Das 1989 erschienene Kenwood TS-680S zum Beispiel ist softwaregesteuert und wird in einer Welt, in der jeglicher Binärcode verschwunden ist, wahrscheinlich nicht mehr brauchbar sein. Kompatible Drop-in-Ersatzkomponenten sind möglicherweise schwer zu bekommen.
@MichaelKjörling Es erfordert eine gewisse Koordinationsfähigkeit, aber nicht zu viel. Das Silicon Valley beispielsweise würde diesen Prozess wahrscheinlich schnell beginnen und das Sneakernet als zugrunde liegendes Kommunikationsmedium verwenden.
Diese Antwort ist technisch die beste, aber es fehlen die Apokalypse-Aspekte vollständig. Ich denke, die Frage wurde vielleicht so gestellt. Aber Sie können nicht ohne Strom mit dem Codieren beginnen ...
@Nobody Daran habe ich gedacht. Es gibt viele Lösungen, die mit Generatoren beginnen. Auf viele Generatoren muss keine Software geladen werden, sodass sie perfekt funktionieren würden. (Solarzellen auf dem Dach hingegen haben oft eine komplizierte Ladesoftware für den Lastausgleich und so weiter. Sie würden nicht funktionieren, bis sie wieder online gebracht werden).
@Niemand über Macht. Es ist überraschend, wie viele Nerds heutzutage glücklich genug sind, sich etwas Lycra umzuschnallen und heutzutage ein paar hundert Watt Energie für den persönlichen Transport zu erzeugen. Es sollte nicht viel brauchen, um eine Bank davon zu einer autarken, erneuerbaren, zukunftssicheren Energiequelle zu machen!
@Aron Der Generator an meinem Fahrrad hat 6 W, daher sind meine 400 W Spitzenleistung für die Energieerzeugung völlig nutzlos. :-) Klar, das ist im Prinzip gar nicht so schwer. Aber es tatsächlich zu tun und die Binärdateien im Chaos zu verbreiten, könnte leicht ein Jahr oder länger dauern. Ich wollte nur betonen, dass es technisch einfach ist, aber dass es praktische Schwierigkeiten gibt, die Welt nach dieser Apokalypse neu zu starten. Es wird eine Weile dauern.
@Niemand Ich bin Softwareentwickler. Ich besitze eine Waschmaschine zu Hause. Darin befindet sich ein Elektromotor. Ich besitze auch einen Desktop-Computer, der ein SMPS enthält. Mit diesen beiden Dingen und meinem Fahrrad könnte ich in einer Woche einen funktionierenden Generator bauen, weniger, wenn Sie mir jemanden entbehren könnten, der schweißen kann.
Sicher, das könntest du. Deshalb habe ich den Smiley nach meiner ersten Aussage gesetzt. Aber die meisten Leute konnten es nicht. Und die meisten Leute konnten nicht einmal ihr Betriebssystem neu installieren, geschweige denn davon sprechen, die Chips in ihren Öfen, Kühlschränken, Autos, nicht dafür konzipierten Open-Closed-Source-Smartphones neu zu flashen. Diese Leute würden einfach in Panik geraten. Der Wiederaufbau der Gesellschaft ist nicht in erster Linie eine Frage der technischen Machbarkeit, sondern eine Frage der Organisation und mühsamer manueller Wiederholungsarbeit und vielleicht der Bekämpfung von Kriminellen usw. Das wollte ich damit sagen.
@MichaelKjörling und CortAmmon Sie müssen Linux nicht von Grund auf neu erstellen , wie angegeben: How would we rebuild current software, if we had all the current hardware and all software source code, but no actual software?. Sie haben bereits den GESAMTEN Quellcode für ALLE existierende Software. Sie müssen es nur kompilieren. Sobald Sie einen gcc-Compiler ausgeführt haben , was der letzte Punkt der Antwort ist, handelt es sich nur noch um eine Kettenreaktion beim Kompilieren . Ich denke, ein paar Wochen sollten ausreichen: P
@xDaizu Ich vermute, Sie beziehen sich auf meinen obersten Kommentar zu dieser Antwort, und wenn Sie dies tun, verpassen Sie den Punkt. Linux From Scratch ist eine Linux-Distribution, die Sie von Grund auf selbst erstellen, indem Sie ein Boostrapping-System verwenden, bevor sie selbst gehostet wird. (Gentoo ist ähnlich, hat aber Werkzeuge, um vieles davon zu automatisieren, und kommt mit der bereits gebauten Bootstrapping-Umgebung.) Es geht nicht darum, die Software zu schreiben , es geht darum, die Software zu kompilieren . Und um an den Punkt zu gelangen, an dem Sie die Software erstellen können , ohne überhaupt Binärdateien zu haben, ist ein nicht unerheblicher Arbeitsaufwand erforderlich.
@MichaelKjörling ja, ich bin deinem Link gefolgt, nachdem ich kommentiert habe, mein Fehler. Trotzdem denke ich, dass es "Wochen" (im Gegensatz zu "Jahren") dauern wird, wenn man bedenkt, dass es massive wirtschaftliche Anreize geben würde und etwa 80% der Programmierer und Softwareentwickler daran arbeiten würden (was würden sie anders machen?). Die Kommunikation wäre allerdings sehr ineffizient (kein Internet!), aber das ist eine andere Frage. Wahrscheinlich würden die Regierungen Tausende von uns in eine gemeinsame Einrichtung bringen?
@xDaizu Ich sehe nirgendwo, dass behauptet wurde, dass so etwas Jahre dauern wird. Tatsächlich scheint Cort Ammon ganz konkret eine gegenteilige Behauptung aufzustellen: „Wir werden keinen Haufen Geeks sehen, die 4 Jahre lang in einem Raum zusammengepfercht sind, gefolgt von einem funktionierenden i7, der Linux bootet.“
@MichaelKjörling hast du gesagt I think "a matter of weeks" is being rather on the optimistic side.. Ich verstand, dass die nächste Größenordnung Jahre sein würden , da Wochen und Monate nahe genug sind, um als Äquivalente betrachtet zu werden. ^^U
@xDaizu Das bringt mir Wörter in den Mund (oder auf meine Tastatur), die ich nie benutzt habe. Bitte tun Sie das nicht. Wenn Sie sich nicht sicher sind, was jemand meint, dann fragen Sie danach, bevor Sie Dinge annehmen, die möglicherweise eine Grundlage in der tatsächlichen Absicht oder Realität haben oder nicht.
@MichaelKjörling Jetzt diskutieren Sie nur über Semantik (verdreht die Augen). Aber... ok, ich spiele mit. Was ist der genaue Zeitraum, den Sie in Ihrem Top-Kommentar nicht passend mit „einige Wochen“ und auch nicht mit „einige Jahre“ ausdrücken wollten? (Und wenn du darauf antwortest, werde ich wahrscheinlich diese Zeitspanne für english.stackexchange nutzen, nur aus Neugier: P)
Schauen Sie sich CollapseOS.org an, for ist eine hervorragende Sprache, um schnell einen funktionierenden Computer mit sehr wenig Assemblierung zu bauen. Ich mag Ihre Antwort, einen ATTiny mit menschlichen Händen zu programmieren: D

Wir würden mit einigen der Leute telefonieren, die es beim ersten Mal gemacht haben.

Nein im Ernst. Wir haben noch viele Experten auf diesem Gebiet, die noch am Leben sind, und sie haben möglicherweise genug Wissen, um ein funktionierendes BIOS zu erstellen. Von dort aus können wir den Prozess viel schneller fortsetzen als beim ersten Mal: ​​Wir konsultieren einfach die nächste Gruppe von Experten für das nächste bisschen Wissen, das wir verwenden, um die nächste Softwarestufe zu konstruieren.

Schließlich erreicht dieser Prozess die Experten von Microsoft und all der großen Computerfirmen, die die heute verwendeten Sprachen erstellen und pflegen, und sie drücken einfach F5, kompilieren den Quellcode der Sprache und liefern uns einen frischen neuen Satz von Binärdateien.

Das größere Problem ist hier die Umverteilung. Wenn alle Binärdateien verschwunden sind, müssen Sie entweder jeden Computer rekonstruieren oder alle einen neuen kaufen lassen. Und dann müssen Sie für einige der neuen Sprachen, die nicht vorinstalliert sind, Ihre Verteilungsserver aufrüsten, damit sie nicht abstürzen, wenn alle versuchen, gleichzeitig eine Kopie zu bekommen.

Als würden die Telefone noch funktionieren. Digitale Switches führen Code aus, mit einigen bekanntermaßen schlechten Upgrade-Problemen.
@JDługosz Stimmt, aber einige Telefone laufen immer noch über analoge Leitungen mit einfachen Steckverbindungen. Alternativ wissen wir, wo sich diese Personen wahrscheinlich aufhalten – gehen Sie einfach und finden Sie sie.
Finden Sie sie in einem Oldtimer, dessen Straßen mit toten modernen Autos, toten Signalen und toten Zapfsäulen verstopft sind. Die Geschichte würde zeigen, wie allgegenwärtig Mikrocontroller sind.
@JDługosz - denken Sie daran, dass nicht alle Mikrocontroller auf Binärdateien angewiesen sind - ein Mikrocontroller mit einfachem Maschinencode benötigt keine Binärdatei, um diesen Code auszuführen.
-1: gemäß dem Kommentar von @JDługosz. Telefonzentralen sind fast ausnahmslos digital.
@Ayelis Woooww. Wie nett von dir. Als Referenz, alle, ich habe vor ein paar Minuten eine Antwort von Ayelis mit einem fast identischen Kommentar abgelehnt.
@Ayelis Um es auf den Punkt zu bringen, es gibt tatsächlich noch eine gute Anzahl von Stecktafeln, die in kleineren Städten und Dörfern für lokale und nationale Verbindungen verwendet werden.
@ArtOfCode Ich versuche nur, mich anzupassen. Sie haben mich abgelehnt, nachdem Sie einen Teil meiner mehrteiligen Antwort negativ beurteilt haben, basierend auf Ihrem begrenzten Verständnis der Funktionsweise von Low-Level-Code (wie durch Ihre Verweise auf einen Single offensichtlich wird). Hochsprache), bevor ich es überhaupt erklären darf. Ich habe dies so verstanden, dass es üblich ist, Antworten als Ganzes abzulehnen, basierend auf dem eigenen begrenzten Verständnis eines einzelnen Teils dieser Antwort. Wenn du in Rom bist.
@ArtOfCode ein "einfacher Maschinencode" ist eine binäre ausführbare Datei. Ob es durch die Übersetzung einer höheren Sprache entstanden ist, ändert daran nichts. Der Maschinencode ist genau das, was als gelöscht vorgeschlagen wird.
@JDługosz Stimmt. Muss zugeben, dass ich das nicht ganz durchdacht habe...
@Ayelis Dann lass mich das klarstellen. Ich habe Ihre Antwort nicht abgelehnt, weil ein Teil davon falsch war, sondern weil ein Teil davon, auf dem der Rest der Antwort zumindest eine gewisse Grundlage hatte, falsch war. Es ist hier höchst ungewöhnlich, aufgrund begrenzten Verständnisses abzustimmen; im Gegenteil, wenn ich weniger Verständnis hätte, wäre ich eher geneigt, Ihrer Antwort einfach zu glauben.
Ich bezweifle, dass die Leute, die wissen, wie man Compiler von ASM neu kompiliert, in "kleineren Städten und Dörfern" leben. Ungeachtet dessen HABEN Sie erwähnt, dass wir "einfach gehen und sie finden" können, was den Umfang Ihrer Antwort verbessert, sodass ich der größere Mann sein und meine Ablehnung entfernen werde. (Obwohl Sie Ihre Antwort zur Verdeutlichung wirklich bearbeiten sollten ...)
@Ayelis Stack Exchange verfügt über mehrere Systeme, die serielle Abstimmungen oder Abstimmungsringe erkennen und die Abstimmungen entweder automatisch rückgängig machen oder einen Moderator darauf aufmerksam machen. Denken Sie jedoch daran, dass Schwankungen in der Häufigkeit der Stimmen (entweder nach oben oder unten) häufig vorkommen und normalerweise nicht verdächtig sind.

Heute werden wir keinen Computer mehr benutzen können - wenn alle Binärprogramme verschwunden sind -, da alle eine Firmware (zB das BIOS) zum Booten haben und diese Firmware in einem ROM (oft einem Flash-ROM) ist.

Die Zeit, in der das ursprüngliche Bootstrapping-Programm einfach (ohne die Hilfe eines anderen Computers) eingegeben werden konnte, ist lange vorbei. In den 1960er Jahren konnte man IBM7094 mit Schaltern booten!

Wenn Sie Ihre Hypothese auf "Alle Festplatten, die ich habe, sind gelöscht" ändern und Ihre Firmware Ihnen Schreibzugriff gibt (und wenn Sie alle erforderlichen Dokumentationen auf Papier haben!), könnten Sie Ihren Computer booten.

Übrigens, ich schätze, wenn wir alle freien Software-Binärdateien auf der Erde verlieren würden, hätten wir viel mehr Probleme, als wenn wir alle proprietären Software-Binärdateien verlieren würden (ich gehe davon aus, dass der Quellcode in beiden Fällen verfügbar bleibt).

Lesen Sie viel mehr über Bootstrapping , insbesondere über Bootstrapping - Compiler , zB wie wurde der erste Compiler geschrieben . Lesen Sie auch den Blog von J.Pitrat zum Bootstrapping künstlicher Intelligenz , der sich mit Bootstrapping-Problemen aus der Sicht einer starken KI befasst.

Siehe auch diese und jene Antwort auf eine sehr verwandte Frage. Sie könnten auch an Linux From Scratch oder Isaac Operating System (in seiner eigenen Sprache geschrieben, das auf dem Bare Metal läuft) oder sogar an MirageOS interessiert sein .

Ein konkretes Problem beim heutigen Bootstrapping eines ganzen Computers ist, dass es ziemlich komplex ist (insbesondere, aber nicht nur, wegen der technologischen Komplexität: Die Intel x86-64-Referenzhandbücher umfassen viele tausend Seiten, und x86 & PC sind sehr komplex, insbesondere weil aus historischen und Abwärtskompatibilitätsgründen), also wird es lange dauern (viele Jahre Arbeit) und es ist (leider) schwer, dafür bezahlt zu werden. Es gibt also ein soziales Problem. Mit anderer Hardware könnte es etwas einfacher sein (zB RISC-V , das nicht wirklich existiert oder viel weniger effizient ist).

Eine verwandte Frage ist, wie das Internet neu gestartet werden kann, wenn oder wann es abstürzen würde.

Sicher würde nichts laufen. Aber wo würde man anfangen, all diese Technologie zu haben und nichts, was darauf läuft? Wie würde unser jetziger Zustand wieder aufgebaut werden?
Wahrscheinlich werden Sie heute nichts mehr nachbauen können.
Ha, sicher nicht heute, aber wie und wo würden wir anfangen?
@RytisI - wahrscheinlich, indem Sie Ihr Fahrrad herausholen, da Ihr Auto nicht anspringt und niemand weiß warum, da keiner der Computer oder Fernseher funktioniert.
Danke für tolle Antwort! Ich poste Prämie in 2 Tagen und setze dies auf akzeptiert, wenn sich bis dahin keine besseren Antworten ergeben
Ihr Link zu dieser Antwort scheint eine gute Antwort zu sein, es wäre ein iterativer Prozess. Bei der ersten Iteration bin ich mir aber nicht sicher :)
Sie würden nicht mit dem Bootstrapping Ihres aktuellen Intel-Mehrkernprozessors beginnen, sondern mit einem kleinen Mikroprozessor.
Ich denke, dass CPUs, die Mikrocode verwenden, auch nicht mehr funktionieren würden. Was meiner Meinung nach die Mehrheit der modernen CPUs bedeutet (allerdings nicht einige RISC-Designs). Wir müssten wahrscheinlich etwas für eine alte CPU (wie den 6502) von Hand zusammenbauen und alte Maschinen ausbrechen, bei denen Sie eine Reihe von Schaltern umlegen, um die Adresse einzustellen, und dann Schalter, um das Byte an dieser Adresse einzustellen. Verwenden Sie das, um einen Assembler zu laden, und verwenden Sie dann einen Assembler, um einen Compiler zu erstellen und EPROMs für Festplatten usw. auszuführen. Wir können dieses Mal wahrscheinlich einige ältere Sprachen wie Dartmouth BASIC und mehrere Versionen von COBOL überspringen.

Apokalypse jetzt

Eines frühen Morgens verschwinden alle Binärdateien der Welt. Jedes Stück kompilierten Codes ist weg; Die Daten sind noch da, die Codedateien sind noch intakt, aber jedes Stück kompilierten Codes ist verschwunden. Puh.

Das erste, woran jeder denkt, wird nicht sein, wie man es zurückbekommt, sondern wie man überlebt; Fly-by-Wire-Flugzeuge werden vom Himmel fallen, Telefone werden nicht funktionieren, das Internet wird weg sein, Autos werden nicht starten, Kraftwerke werden abgeschaltet. All diese Geräte und Systeme, ob groß oder klein, haben kleine Chips, die einst voller Firmware waren. Zugegeben, alles, was in den 1980er Jahren oder früher gebaut wurde, wird wahrscheinlich in Ordnung sein; Autos wurden größtenteils erst in den 1990er Jahren mit Bordcomputern ausgestattet.

Dennoch ist dies nicht nur eine technische oder Programmierkatastrophe. Es ist ein Ereignis im Ausmaß einer Apokalypse. Ein großer Teil der Welt wird ohne verlässliche Nahrung, Wasser oder Elektrizität sein; Die Kommunikation bricht komplett zusammen.

Wo soll man anfangen?

Der beste Ort wäre ein College oder eine Universität, da sie höchstwahrscheinlich über einen funktionierenden Lochkartenleser (und einen Generator) verfügen würden. Mit Lochkarten als anfängliche Schnittstelle konnten unsere unerschrockenen Programmierer sofort mit dem Schreiben von Code beginnen.

Natürlich sind diese alten Maschinen furchtbar langsam und riesige Stromfresser. Unsere Programmierer verwenden also die lochkartengesteuerten Systeme, um Mikrocontroller oder ihre schnelleren Cousins, Mikrocomputer , zu programmieren .

Diese winzigen Computer benötigen eine Art Schnittstelle; hoffentlich liegen da noch eine alte transistorgesteuerte Tastatur und ein paar alte CRTs herum. Moderne Tastaturen und LCD-Bildschirme sind auf Firmware angewiesen. Mit ein wenig Codegerangel haben unsere Programmierer einen Computer, eine Tastatur, einen Bildschirm und eine Möglichkeit, ihren Code zu speichern.

Darüber hinaus werden alle Geräte mit Firmware, die schnell neu geschrieben werden kann, erneut geflasht. Einige alte Hardware, wie alte CD-Laufwerke, hatten sehr wenig Firmware, konnten aber immer noch moderne Discs lesen.

Sicherheitssicherungen

Zurück zu bekommen, was verloren gegangen ist, wird viel, viel schwieriger sein. Fast alle moderne Hardware wird nichts als Müll sein; Fast alle Chips mit einer durchgebrannten Sicherung sind unbrauchbar und verwandeln Handys und Laptops gleichermaßen in Ziegel. Festplatten, obwohl die Daten noch vorhanden sind, haben keine Firmware, um diese Daten zu extrahieren.

Die beste Wahl sind Open-Source-Computer. Irgendjemand wird irgendwo einen nicht sicherheitsgesperrten Flash-Chip mit einem gespeicherten Code haben. Von dort aus kann der Open-Source-Rechner wieder aufgebaut werden, und die Programmierer können langsam damit beginnen, Software wiederherzustellen. Andernfalls hat jemand eine Sicherungskopie seines gesamten Codes auf einem billigen Flash-Laufwerk; Mit ein wenig Hardware-Hacking ist es möglich, diese Daten zu extrahieren, obwohl dies ein schwieriger Prozess sein wird.

Zurück in die Zukunft

Sobald Computer (wie klein sie auch sein mögen) betriebsbereit sind, wird das Leben ein wenig einfacher, aber die meisten modernen Geräte werden nutzlos sein. Selbst wenn das BIOS auf einem modernen Motherboard neu erstellt werden könnte, würde den Video-, Ethernet- und sogar Soundkarten ihre Firmware fehlen. Die Software würde auf den Stand der späten 1980er Jahre zurückgesetzt. Es würde allmählich zurückkehren, aber ich gehe davon aus, dass es länger dauern würde als beim ersten Mal. Was mit der Apokalypse und allem.

Eines der größeren Probleme ist nicht das Kompilieren des Quellcodes, weil Sie alles davon verlieren würden, alle Laufwerke sind binär gespeichert, so dass alles, was wir als aktuelle Technologie kennen, gelöscht würde. Und alles neu zu programmieren wäre eine große Aufgabe, wenn man bedenkt, dass jeder Prototyp oder jede Version weg wäre. Ich würde sogar eine Lebensmittelknappheit oder ähnliche Ereignisse erwarten, wenn man bedenkt, wie viele kleine Computer in den Dingen stecken, die wir so oft in unserem Leben verwenden, wie Autos, Stromnetzmanagement und Haushaltsgeräte.

Sie haben irgendwie Recht mit Ihrer Antwort, aber ich denke, die Frage basierte darauf, wie man einen völlig neuen Anfang bei Computern machen würde, wenn wir auf unserem derzeitigen Niveau beginnen würden. Und nicht, wie Sie geantwortet haben, das Produkt aller verschwindenden Binärdateien.
"Binärdateien" bezieht sich in diesem Zusammenhang auf ausführbare Binärdateien, nicht auf das binäre Basis-Zwei-Datenformat.
Angeblich würden wir den Quellcode nicht verlieren, da der Quellcode in Ascii und nicht in Binär vorliegt. Und solange wir den Quellcode haben, können wir alles, was wir verloren haben, neu kompilieren. Wenn wir jedoch den Quellcode verlieren, wären wir ziemlich fertig. Assembler müssten von Hand eingegeben werden, und alle höheren Sprachen müssten von Grund auf neu eingegeben werden. Obwohl wir vielleicht immer noch eine Menge Quellcode in Form von Ausdrucken oder Büchern herumliegen haben!

Technisch gesehen ist Firmware "Hardware", also würde ich erwarten, dass es so bleibt. Ich nehme an, dass es bei „verschwindenden Binärdateien“ mehr um die zu entfernenden Informationen geht als um eine physische Katastrophe, die alle Informationsspeichergeräte getroffen hat, aber alles knapp verpasst hat, was nicht wie ein laufender Maschinencode aussah. Wenn tatsächlich Firmware übrig bliebe, dann hätten wir meiner Meinung nach einen guten Vorsprung. Wir sollten in der Lage sein, jedes System zu booten, das Firmware ausführen kann, und zumindest über ein primitives Betriebssystem und Textbearbeitungsfunktionen verfügen. Das interessante Problem ist, dass, wenn wir Quellcode haben, aber der größte Teil davon elektronisch ist, er für uns größtenteils nutzlos ist, bis wir die Systeme wiederherstellen können, die ihn lesen können.

Da so viel potenziell brauchbare Software herumliegt, wäre es am sinnvollsten, die Compiler zu reproduzieren, die die Software nachbauen könnten. Das bedeutet, dass die Gesellschaft höchstwahrscheinlich nicht versuchen würde, Programmiersprachen von Grund auf neu zu erfinden, bis wir die gerade verlorenen zurückerlangt hätten. Da wir die Nutzung des Internets und der digitalen Informationsspeicherung verloren haben, ist es unsere beste Wahl, auf die am besten dokumentierten Sprachen abzuzielen, für die wir Bücher haben. Ohne Zweifel wird ein C-Compiler das erste und wichtigste High-Level-Tool beim Neuaufbau sein. Sobald Sie das haben, können Sie sehr schnell Fortschritte machen. Sie können dann ganze Betriebssysteme, viele Softwaretools und Compiler für viele Sprachen neu erstellen. Es gibt einen Grund, warum diese 40 Jahre alte Sprache immer noch ganz oben auf der TIOBE-Liste steht. Es ist das „Englisch“ der Programmierwelt: umständlich, nervig,

Da es so viele C/C++-Experten auf der Welt gibt, sollte das Erstellen eines Compilers eigentlich nicht so schwer sein, sobald Sie ein System haben, das Text eingeben und Bytes auf der Festplatte speichern kann. Höchstwahrscheinlich würden ein paar Leute die "IDE" durch rohen Assembler-/Maschinencode verbessern und sie wahrscheinlich von Grund auf neu erfinden, nur um die Produktivität zu verbessern. Viele Teile eines minimalen Betriebssystems würden brutal erzwungen werden, nur um diesen ersten C-Compiler zum Laufen zu bringen. Aber ich bin mir ziemlich sicher, dass der erste Self-Hosting-Build des Compilers das moralische Äquivalent zum Starter eines riesigen Motors wäre, der endlich das Schwungrad anwirft, damit er sich selbst erhalten kann.

Tatsächlich würde dieser Prozess höchstwahrscheinlich an vielen Orten auf der ganzen Welt stattfinden. Es ist durchaus möglich, dass Russland oder Osteuropa den ersten funktionierenden C-Compiler "nach der Katastrophe" produziert, aufgrund der Anzahl von Hackern/Virenschreibern, die Low-Level-Code verstehen müssen. Obwohl es in China viele Hacker gibt, neigen sie dazu, auf höheren Ebenen in Systeme einzudringen. Ich wäre überrascht, wenn sie einen frühen C-Compiler von Grund auf neu erstellen würden (obwohl eine große Gruppe unternehmungslustiger Universitätsstudenten dies durch reine Willenskraft erreichen könnte). Die US-amerikanischen und westeuropäischen Hacker hätten den Vorteil, dass ihnen die meisten C-Bücher und Referenzhandbücher zur Verfügung stehen, und zwar in einer Sprache, die sie leicht verstehen.

Wenn jetzt auch die Firmware gezapped wird, wird es viel, viel schwieriger, ähnlich wie beim Umschalten von Schaltern, wie von anderen beschrieben. Das ist so deprimierend, dass ich es mir gar nicht vorstellen kann. Aber ich gehe davon aus, dass die Threads zusammengeführt werden, sobald Sie zu einer Basiskonsole (Tastatur, Monitor, persistenter Speicher ... ob Festplatte, Band, Flash usw.) gelangen.

Obwohl viele Sprachen selbsthostende Compiler haben, könnten die meisten Compiler in C von Grund auf neu erstellt werden, und die meisten Designer der ursprünglichen Sprache könnten bei diesen Bemühungen helfen. Ich denke, insgesamt würde der Neuaufbau viel schneller voranschreiten, als die Leute sich vorstellen könnten (von der einfachen Konsole zum selbsthostenden C-Compiler in 6 Monaten oder weniger). In fast allen Fällen würden die Leute wahrscheinlich entscheiden, dass es besser ist, das Verlorene einfach zu ersetzen und die Funktionalität wiederzuerlangen, als aus der Bahn zu laufen und Dinge neu zu gestalten.

Ein Redesign würde erfolgen, wenn Sie auch den Quellcode verlieren würden . Vielleicht werden Informationen in Büchern aufbewahrt, aber wenn alle elektronischen ausführbaren Dateien und Quellen verloren gingen, dann würden wir meiner Meinung nach eine bedeutende Neugestaltung und Abkürzung zu fortgeschritteneren Techniken sehen. Ich denke, C würde aufgrund seines Status als eine Art Lingua Franca immer noch von Grund auf neu aufgebaut werden. Und möglicherweise würden Java und ein paar andere wichtige Sprachen wiederbelebt (wenn auch offensichtlich von Reinraumimplementierungen). Andererseits wäre es viel schwieriger, Linux oder Windows oder OS X ohne Quellcode nur aus Büchern wiederherzustellen.

Interessanterweise konnten wir diese Gelegenheit nutzen, um viele nagende Fehler in den Sprachen, Tools und Betriebssystemen zu beseitigen. Vielleicht würden wir nicht genau C bekommen, sondern eine Art verbesserten C99, bei dem viel veralteter Cruft entfernt wurde. Einerseits wäre es für alle von Vorteil, einfach einen exakten C99-Compiler zu implementieren, damit Menschen aus aller Welt C-Quelltexte austauschen könnten, während die digitale Welt neu aufgebaut wird. Dies würde Innovationen entmutigen. Und aus diesem Grund würde Linux höchstwahrscheinlich das De-facto-Betriebssystem der neuen Ära werden, einfach weil viele Teile davon aus Büchern und Wissen wiederhergestellt werden könnten, die in bestimmten hochrangigen Zauberern eingeschlossen sind.

Wahrscheinlich würde proprietäre Software einfach nicht konkurrieren, bis der Großteil der Funktionalität ersetzt wäre. Der Wiederaufbau würde also höchstwahrscheinlich nach einem sehr offenen Modell erfolgen, es sei denn, einige Länder bemerken, dass sie viel schneller vorankommen als andere, und könnten einen Wettbewerbsvorteil erzielen, indem sie ihren Fortschritt vom Rest der Welt abschotten. Letztendlich würde der globale Handel die Länder dazu zwingen, internationale Standards neu zu etablieren, daher ist es schwer zu sagen, wie lange solche Mauern überleben könnten.

Obwohl viele gescheiterte Sprachen einfach nicht reproduziert werden würden (es sei denn von ihren liebevollen Schöpfern), würden die beliebtesten Sprachen sicherlich aufgrund des gespeicherten Wertes von Programmierern mit Kenntnissen in diesen Sprachen wiederbelebt werden. Das Gleiche gilt für Werkzeuge. Es würde jedoch lange dauern, etwas wie Microsoft Office oder Adobe Photoshop neu zu erstellen, ganz zu schweigen von Windows Server 2012. Diese Tools werden möglicherweise nie wieder existieren, und vielleicht würde es ein neues Wettrüsten geben, um jede Softwarekategorie von Grund auf neu zu erfinden.

Jede Technologie mit einem veröffentlichten Standard würde proprietäre Alternativen ohne öffentlichen Standard übertreffen, einfach weil die Standards intellektuelle Anstrengungen darstellen, die in Texten aufbewahrt werden, die nicht erneut erstellt werden müssen. Aber die schwächsten Standardtechnologien können durch bessere Alternativen verdrängt werden, einfach weil das Gewicht der Altlasten aufgehoben wurde und nicht mehr so ​​einen großen Vorteil gegenüber schlechten alten Lösungen darstellt.

Wenn wir über Computersprachen und Computerprogrammierung im Allgemeinen sprechen, sprechen wir über Sprachen und ihre Abstraktionsebene. Früher hatten wir Patchpanels, mit denen Computer programmiert wurden. Die meisten Computer waren nicht wirklich programmierbar, sondern fest verdrahtet, um eine bestimmte Art von Operation auszuführen. Später bekamen wir programmierbare Computer.

Zuerst haben wir binäre Opcodes verwendet, um Code zu erzeugen. Sie müssten jeden Opcode des verwendeten Prozessors kennen und Ihr Programm Byte für Byte in den Computerspeicher eingeben. Später wurde eine Kurzform erfunden, die Wörter verwendet, um Operationen zu beschreiben. Es wurde mneomonische Form genannt. Das ist fast wie moderne Montage. Ein zweiter Schritt kam mit Makro-Assemblern, die es erlaubten, Makros zu verwenden. Das sind die Low-Level-Sprachen.

Eine Sprache auf mittlerem Niveau ist so etwas wie C und PL/I, sie sind keine sehr abstrakten Sprachen. Die Leute betrachten dies normalerweise als die äußerste Hackersprache - "Hey, ich verwende eine Sprache mit mittlerer Abstraktion, das sollte bedeuten, dass ich ein Über-Hacker bin" - Aber normalerweise sind Sprachen mit niedrigerer Abstraktion anfälliger für Fehler. C bietet grundlegende Funktionsaufrufe basierend auf Funktionsargumenten und anderen weniger primitiven Abstraktionen wie Arrays und Strukturen. Dies ist viel einfacher zu programmieren als reines Assemblieren und kann bei sorgfältiger Ausführung sogar zu portablem Code führen. Aber C fehlen Abstraktionen wie Objekte, Strings (formale Strings, keine hackishen zeigerbasierten Strings).

Eine Sprache mit einer höheren Abstraktionsebene ist Java oder C#. Leider werden beide Sprachen in eine virtuelle Maschine interpretiert. Dies bedeutet, dass die Codeausführung von einer abstrakten virtuellen Maschine im laufenden Betrieb in etwas übersetzt werden muss, das der Prozessor auf niedrigerer Ebene versteht. Wich ist langsam. Eine andere Sprache, die ein sehr hohes Abstraktionsniveau bietet, ist Python, Ruby usw. Daher denken die Leute, dass Hochsprachen interpretiert werden müssen. Object Pascal (der zurückgewiesene hässliche Sohn) ist so abstrakt wie Java, produziert aber wirklich kompilierten Code (bis hinab ins Binärformat).

Managed Code ist nicht die allerneueste Erfindung. Es impliziert einen enormen Preis in der Geschwindigkeit. Es ist eine Art Abstraktion, aber keine, die fehlerfrei ist.

Der Prozess der Erstellung des Ökosystems eines neuen Computersystems wird als Bootstraping bezeichnet. Wenn Sie einen neuen Computer erstellen, müssen Sie zwei Schritte ausführen: Erstellen Sie einen Compiler, der Code in dieser von der Maschine erwarteten Form ausgeben kann, und ein neues Betriebssystem (das normalerweise in dieser Sprache geschrieben wird).

Normalerweise beginnen Sie mit einem Cross-Compiler, der ein bestimmtes bereits vorhandenes System verwendet, um Code für dieses neue System zu generieren. Dann wird dieser Cross-Compiler verwendet, um ein grundlegendes Betriebssystem zu erstellen und den Compiler in eine Binärdatei zu kompilieren, die auf diesem neuen Computer ausgeführt wird.

Da reale Maschinen auf realen Komponenten basieren, arbeiten diese Maschinen auf einer niedrigen Abstraktionsebene. Sie können keine virtuellen Maschinen ohne reale Maschinen haben, denn eine virtuelle Maschine ist eigentlich ein Computerprogramm wie jedes andere auch. Das bedeutet, dass zwischen Ihrem Programmcode und der Hardware eine Lücke besteht, die gefüllt werden muss.

tl;dr

Zuerst müssen Sie ein Mneomonic-Assembler-Programm von Grund auf neu erstellen (unter Verwendung Ihres Wissens über die Maschinen), dann einen Makro-Assembler und dann einen echten Compiler (normalerweise für die Sprache C). Von da an können Sie alles andere kompilieren.

C# wird nicht interpretiert. Ich weiß nicht so viel über Java, aber ich vermute, dass es das auch nicht ist: Java wird in Bytecode kompiliert, der von einer VM ausgeführt wird. C# wird direkt in Maschinencode kompiliert, normalerweise JIT, aber dennoch kompiliert.
Aus Sicht der Abstraktionsebenen wird C# interpretiert.
Um es klarer zu sagen, ich habe einmal einen Sprachinterpreter geschrieben, der eine virtuelle Maschine verwendet. Echte Compiler sind in der Lage, abstrakten Code in konkreten Code zu übersetzen, der auf dem Bare Metal läuft, alles andere als das ist ein Interpreter. Leider ändert der Markt die wissenschaftlichen Definitionen, um den wirtschaftlichen Interessen zu entsprechen ...
Nein, C# ist eine kompilierte Sprache. Siehe das . Es verwendet eine VM, aber das bedeutet nicht, dass es interpretiert wird. Der Compiler übersetzt von C# in Maschinencode, ist also ein Compiler.
Aus Sicht der Abstraktionsebenen ist eine VM kein kompilierter Code. Aber die Marketinganforderungen von Unternehmen wie Microsoft und Sun mussten die Definition verzerren, um ihren Anforderungen gerecht zu werden. Die meisten Leute denken, dass Java die erste Sprache ist, die eine VM verwendet hat. Pascal P-Code (in den 70er Jahren) verwendete eine virtuelle Maschine und wurde von der klassischen Definition von Sprachen nicht als kompiliert angesehen.
Lesen Sie den Link. Die Nutzung einer VM hat nichts damit zu tun, kompiliert zu werden oder nicht, kompiliert oder interpretiert wird ausschließlich durch die Übersetzungszeit definiert: Interpretierte Sprachen werden zur Laufzeit von einem anderen Programm in Maschinencode übersetzt, kompilierte Sprachen werden im Voraus in Maschinencode übersetzt. C# wird nach dieser Definition kompiliert.
Alter, ich schreibe Compiler, wenn ich will. Eine virtuelle Maschine gilt nicht als vollständig kompiliert. Wir haben einen Namen für diesen "Pseudo-Compiler". Die Clipper-Sprache wurde pseudokompiliert, genau wie Pascal-P-Code. Sie brauchen einen viel größeren Zeitrahmen, um die Wahrheit neben Merchandising-Definitionen zu sehen.
Um kompiliert zu werden, müssen Sie den Code in Maschinencode übersetzen, echten Maschinencode, der viel weniger abstrakt ist als die übliche IL. Virtuelle Maschinen dieser Art nehmen viele Ergänzungen zum Opcode-Set vor, damit Hochsprachen leicht in ihren Bytecode übersetzt werden können (wie die Objektinstanziierung), was auf echter Hardware viel schwieriger ist.
Vor Java waren die Dinge sehr einfach: Compiler: Code von einer höheren Abstraktionsebene auf eine niedrigere Abstraktionsebene übersetzen. Interpreter: Führen Code aus, ohne die Abstraktionsebene zu ändern. Übersetzer: Übersetzt Code zwischen zwei Sprachen, ohne die Abstraktionsebene zu ändern. Pseudo-Compiler: Übersetzen einer Sprache in ein Bytecode-Format, das weniger abstrakt ist als die Sprache, aber noch kein Low-Level. Sobald Sun Java veröffentlichte, änderten sie die Definition über die Marketingabteilung, nicht über die Forschungsabteilung.
Wenn Java erfolgreich sein sollte, müsste das pseudokompilierte Label verschwinden. Warum aufhören, C/C++ oder Delphi (die wirklich kompiliert sind) zu verwenden, um Pseudo-kompiliertes Java zu verwenden? Aha! Nennen wir es zusammengestellt und wetten, dass jeder das essen wird ... Goebbles würde zustimmen.

Wie würden wir unseren Code kompilieren, wenn alle Binärdateien der Welt verschwinden [...]

Lassen Sie jemanden von der Internationalen Raumstation eine Sojus-TMA verwenden, um mit einem noch funktionierenden Laptop mit allen verfügbaren Compilern herunterzukommen. (Hey, sie sind technisch nicht in der Welt ...)

Die Erholung wäre viel schneller als Sie denken

Finden Sie ein Auto von vor 1986 und fahren Sie zum Computermuseum. Starten Sie die Altair-, Imsai- oder Digital Group-Box und starten Sie sie normal: Schalten Sie einen Bootstrap-Loader ein .

Umschalten bedeutet, eine Speicheradresse auf den 16 Adressschaltern einzustellen, dann einen Datenwert auf den 8 Datenschaltern einzustellen und "WRITE" zu drücken, dann automatisch zum nächsten Speicherplatz zu wechseln, Spülen und Waschen zu wiederholen.

Ein Bootstrap-Loader ist ein extrem kurzes ~100-Byte-Programm, das Daten von einem anderen E/A-Gerät wie einem Lochstreifenleser eingeben kann.

Geben Sie hier die Bildbeschreibung ein

Verwenden Sie den Lochstreifenleser, um Ihr Programm einzugeben, oder hey - hier ist eine Idee, wie wäre es mit einem Betriebssystem . Sie wissen, wie Apple Monitor (2048 Bytes), der eine Menge Code enthielt, um ein TTY auf Apples internem Display und Tastatur zu emulieren, nicht erforderlich, verwenden Sie einfach ein physisches TTY oder VT100.

Und jetzt machen wir Mittagspause .

Ein paar hundert Bytes im Betriebssystem lehren es, eine Kassette zu lesen/beschreiben. Ein paar tausend weitere bringen ihm bei, Festplatten zu lesen/schreiben. Ich spekuliere nicht, so funktionierten sie.

Unterdessen laufen parallele Bemühungen weiter

  • Speichern des Bootstrap-Loaders irgendwie im ROM, um Fingerschwielen zu reduzieren

  • ein ursprüngliches Plattendateisystem

  • ein einfacher Texteditor (hmm, funktionieren VT100s noch?)

  • ein Assembler (Compiler für Assemblersprache, also können wir LDA #INPUT_MODEstatt A9 03. sagen).

Und wir essen besser zu Abend, bevor alle Restaurants schließen.

An diesem Punkt verwenden wir die Befehlszeile genauso wie jetzt, außer dass wir anstelle eines Terminal/PuTTY-Fensters ein tatsächliches VT100 verwenden. Wir werden kein haben ls -R, weil wir noch kein rekursives Dateisystem haben, aber kleine Schritte Ellie.

Apropos kleine Schritte, wir fangen an, Hochsprachen zu schreiben und übergreifend zu entwickeln; dh verwenden Sie das Imsai, um 80386 zu kompilieren, um den Compaq 386 hochzufahren (wohlgemerkt, Ihr allererster x86-Code wäre ein nativer 32-Bit-Code und hätte kein Konzept der alten 64k/1MB-RAM-Barrieren), und verwenden Sie das dann dazu Cross-Compile für den PowerMac G3 usw.

Der schwierige Teil ist die Koordination

Das Problem ist, dass diese Bemühungen unabhängig voneinander an jedem einzelnen Standort durchgeführt werden, an dem eine funktionierende Altair/Imsai/Digital Group-Maschine existiert. Jetzt besteht die Herausforderung darin, die Bemühungen zu koordinieren, wenn die Telefone ausgefallen sind. Wenn die Telefone funktionierten, würde jedes museale 300-Baud-Modem die Crews zum Reden bringen und Code teilen.

Und die Telefongesellschaft ist nicht untätig; sie versuchen herauszufinden, wie sie etwas auf die Beine stellen können.

Ungefähr einen Tag, nachdem die Telekommunikation eingestellt wurde, wird jemand BBS-Software (neu) geschrieben haben, vorausgesetzt, er hat keine alte Kopie des BBS-Quellcodes im BYTE-Magazin gefunden. Jetzt machen wir dasselbe wie hier. Das erhöht die Geschwindigkeit des Wiederaufbaus ballistisch – zumal jede Nation der Welt ihn als nationale strategische Priorität identifiziert hat.

Firmware ist ein Ärgernis

Leider haben viele Komponenten heutzutage, wie USB-Fobs, "Firmware", die auf einer niedrigeren Ebene des Systems läuft, und haben nicht wirklich eine "harte" Hintertür wie die Imsai-Frontplatte, um einen Bootstrap-Loader zwangsweise zu laden. Wenn diese Firmware weg ist, müsste jede Maschine gehackt oder verschrottet werden. Das wird jedoch kein Problem sein, bis wir in die 2000er-Hardware einsteigen, so dass Pentium und Mac Quadra 800 wahrscheinlich immer noch gut laufen werden. Und mit denen können wir die anderen umgestalten/ersetzen.

Es stimmt, dass ein Quadra 800 keine Frontplatte mit Schaltern hat. Es hat jedoch Spuren auf seiner Platine, und Sie müssten etwas Hardware-Hacking durchführen, um einen Bootstrap-Loader hineinzubekommen, oder einfach lernen, EPROMs zu brennen.

Wir kennen das Ziel

Da die Designprobleme sehr gut definiert und gut verstanden sind, bleibt nur Code-Slinging. Wir müssen das Rad nicht neu erfinden, wir alle wissen, wie Räder aussehen, wir müssen nur eines schnitzen.

Denken Sie daran, dass fast jeder existierende Code von jemandem verstanden wird, der lebt, und der ihn, wenn nötig, umschreiben könnte. Besser.

Es wäre das Beste überhaupt.

Es würde uns (heh) das Design unserer Computersysteme von Grund auf neu starten lassen, anstatt ständig alte Legacy-Infrastrukturen mitzuschleppen, die alles kompliziert machen. Der Code würde teilweise gestrafft und vereinheitlicht, weil wir die Welt wieder zum Laufen bringen müssen und es keine Zeit gibt, eine Reihe von Legacy-Möglichkeiten zu unterstützen, um dasselbe zu tun. DOSbox weg . Fenster weg . Blitz weg . HTML/CSS/AJAX Morast gestrafft . Etc. etc. Die Regierung würde aufgrund des nationalen Notstands alle Patentfragen zertrampeln.

Haben Sie sich jemals gewünscht, Sie könnten sich einfach einen Monat Zeit nehmen und all Ihren alten Spaghetti-Code und Ihre veralteten Standards von Grund auf neu schreiben? Jetzt kannst du.

Das einzige Problem ist, dass unsere Zivilisation tödlich abgestürzt wäre. Keine funktionierenden Fahrzeuge, keine Telekommunikation, kein Geld, kein Essen, kein Wasser, kein Strom, keine Zeit ... Anarchie innerhalb von Stunden, Megatote innerhalb von Wochen, zurück in die frühe Eisenzeit für alle Überlebenden innerhalb eines Jahres.

Sobald wir einen funktionierenden C89- Compiler haben, ist das Problem noch lange nicht vorbei: Viele Software kann nicht ohne die Glib kompiliert werden, die gcc erfordert, was auch ein C++-Compiler ist, der C++-Bibliotheken benötigt.

Um die meiste Software zu kompilieren, benötigen Sie also einen C++-Compiler, und dazu benötigen Sie einen C++-Compiler.

Es wird viel Zeit brauchen, um es zu erreichen. Und das könnte genug Zeit sein, um C89-Software populär zu machen, um neue Software zu haben, die von Grund auf neu geschrieben – oder konvertiert – in C89 wird.

Leichte Programmiersprachen wie luadiese, die nur C89 sind, würden die anderen übernehmen.

Sie können einen alten GCC (z. B. GCC 4.3) herunterladen und verwenden, der in C (nicht C++) geschrieben ist. Verwenden Sie das g++-4.3zum Erstellen und Kompilieren von g++-4.6; Verwenden Sie das g++-4.6zum Kompilieren g++-4.9, und verwenden Sie es g++-5dann zum Kompilieren g++-6. AFAIK, der Übergang in GCC-Interna von C zu C++ wurde mit einem solchen iterativen Prozess im Hinterkopf gedacht.
Es ist in der Tat die Strategie, einen einfacheren Compiler zu schreiben, um einen fortgeschritteneren Compiler zu kompilieren. Es ist immer noch ein komplexer Weg, eine reine C-Software kompiliert zu bekommen.