Wie wurde der erste Compiler geschrieben?

166

Ich hörte von dem Huhn und dem Ei und dem Bootstrapping. Ich habe ein paar Fragen.

Was hat den ersten Compiler geschrieben, der etwas in binäre Anweisungen konvertiert hat?

Wird die Assembly kompiliert oder in binäre Anweisungen übersetzt?

... Es fällt mir schwer zu glauben, dass sie einen Compiler in Binärform geschrieben haben.

Shawn Mclean
quelle
@nawfal, es ist ein Unterschied zwischen einer neuen Programmiersprache und dem ersten Compiler, also nein - es ist kein Duplikat
@PauliSudarshanTerho was ist der Unterschied? Der Geist der Fragen ist der gleiche. Sie können keine Programmiersprache schreiben, diese Frage spricht wiederum über den ersten Compiler.
Nawfal
In deinen spirituellen Vorstellungen vielleicht? In Wirklichkeit finden Sie in diesem Link nichts Erwähntes über den ersten Compiler. Und Sie sollten niemandem raten, eine neue Sprache zu schreiben, um von vorne zu beginnen. Und wenn ja, warum sollten Sie dann die Antworten darüber verbergen, wie der erste Compiler geschrieben wird, wenn dies für das Schreiben einer neuen Sprache wichtig ist?
Lernen Sie von mir - Dies ist ein Duplikat: stackoverflow.com/questions/4772768/…

Antworten:

133

Montageanweisungen sind (im Allgemeinen) eine direkte Zuordnung zu Opcodes, bei denen es sich um (Mehr-) Bytewerte des Maschinencodes handelt, die vom Prozessor direkt interpretiert werden können. Es ist durchaus möglich, ein Programm direkt in Opcodes zu schreiben, indem Sie sie aus einer Tabelle (wie z. B. dieser für den 6039-Mikroprozessor ) nachschlagen, in der sie mit den entsprechenden Montageanweisungen aufgelistet sind, und die Speicheradressen / Offsets für bestimmte Dinge von Hand bestimmen wie Sprünge.

Die ersten Programme wurden genau auf diese Weise erstellt - handgeschriebene Opcodes.

In den meisten Fällen ist es jedoch einfacher, einen Assembler zum "Kompilieren" von Assembler-Code zu verwenden, der diese Opcode-Suchvorgänge automatisch durchführt und bei der Berechnung von Adressen / Offsets für benannte Sprungbezeichnungen usw. hilfreich ist.

Die ersten Monteure wurden von Hand geschrieben. Diese Assembler könnten dann verwendet werden, um kompliziertere Assembler zusammenzusetzen, die dann verwendet werden könnten, um Compiler zusammenzusetzen, die für übergeordnete Sprachen geschrieben wurden, und so weiter. Dieser Prozess des iterativen Schreibens der Tools zur Vereinfachung der Erstellung der nächsten Tools wird als Bootstrapping bezeichnet (wie von David Rabinowitz in seiner Antwort erwähnt) .

Bernstein
quelle
18
Mein erster Computer war ein Z80-basierter Computer, auf dessen ROM-Monitor ich einen Bootstrap-Loader von Hand zusammenbauen musste, um die Grundlagen eines Betriebssystems (CP / M) aufzurufen, damit ich den Rest des Betriebssystems zu einem funktionierenden System zusammenbauen konnte , komplett mit einem festplattenbasierten Bootstrap-Loader. Lustige Zeiten. Also ja, Sie können ganz gut von Hand zusammenbauen. Es ist langsam und schmerzhaft und fehleranfällig (weshalb wir Dinge automatisiert haben), aber es ist möglich.
Nur meine richtige Meinung
Der erste Link ist defekt.
Luke
Von Hand geschrieben. Wie? Kabel verdrahten oder lochen? Ich denke, sie hatten hexadezimale Tastaturen.
44

Bitte lesen Sie mehr über das Compiler-Bootstrapping und die Geschichte des Compiler-Schreibens

Die Idee ist, einen sehr einfachen Compiler direkt in Maschinencode zu schreiben, damit einen komplexeren Compiler zu schreiben, mit dem zweiten einen dritten zu erstellen und so weiter, bis Sie einen Compiler mit vollem Funktionsumfang haben.

David Rabinowitz
quelle
36

Eier gingen Hühnern lange voraus. Die Antwort auf die meisten Probleme mit "Huhn und Ei" ist dieselbe: Evolution. Einige Menschen haben auch Probleme, an die biologische Evolution zu glauben, aber Unglaube ist kein Argument (google argumentum ad ignorantiam).

Um Ihre Frage direkt zu beantworten: Der erste Compiler wurde (von einem Menschen) in einer Assemblersprache geschrieben - ein Programm namens Assembler würde Assemblersprache in Binär übersetzen. Dies ist ein viel einfacherer Vorgang als das Kompilieren, da die Assemblersprache nur eine symbolische Form der Maschinensprache ist, die Opcode-Namen anstelle von Zahlen verwendet, Adressen mit Symbolen darstellt usw. Viele nachfolgende Compiler wurden ebenfalls in einer Assemblersprache geschrieben. Der erste C-Compiler war jedoch ein modifizierter B-Compiler, der in B geschrieben wurde . Der erste B-Compiler wurde in TMG geschrieben . Der TMG-Compiler, mit dem der B-Compiler kompiliert wurde, wurde in der Assemblersprache PDP-7 geschrieben.

Jim Balter
quelle
24

Woz sagte in einem seiner öffentlichen Vorträge, dass er sich zu Beginn keinen Compiler leisten könne und deshalb von Hand auf Papier zu Binärdateien kompiliert habe. Wenn Sie etwas noch wilderes sehen möchten, lesen Sie die Bedingungen, unter denen Bill Gates und Paul Allen das BASIC für den Altair 8800 geschrieben haben.

In Bezug auf "Schreiben eines Computers in Binärform" - treten Sie einen Schritt zurück vom Programmieren und denken Sie darüber nach, was die frühen Computer waren. High-Level-Sachen gab es noch nicht - du hast über alles auf der Low-Level nachgedacht, weil das alles war. Sie hatten Hardware, die grundlegende Logik und Arithmetik ausführen konnte, die Sie über Maschinencode manipulieren (der nur aus einer kompilierten Baugruppe besteht - Amber erklärt, warum dieser Teil nicht schwer von Hand zu erledigen ist), und Sie wollten, dass diese Hardware bestimmte mathematische Leistungen erbringt. Sie haben sich keine Sorgen um das nicht vorhandene Betriebssystem gemacht, sondern nur der Hardware (in der Baugruppe) mitgeteilt, wie die von Ihnen eingegebenen Zahlen zu manipulieren sind. Es war nur ein großer Taschenrechner. Der Computer von heute wurde eine Abstraktion nach der anderen gebaut.

Wenn Sie die Barriere überwinden möchten, durch die sich Computer wie Magie anfühlen, empfehle ich dringend, CODE von Charles Petzold und / oder The Elements of Computing Systems zu lesen . Mit diesen Grundkenntnissen, die nur über grundlegende Programmierkenntnisse verfügen, können Sie Computer von oben bis unten verstehen. Offensichtlich kann man keine Komposition bekommen. sci. oder EE-Abschluss nach nur 2 Büchern, aber ich kann als autodidaktischer Programmierer sagen, der die formale Ausbildung verpasst hat: Diese Bücher haben meine Welt erschüttert!

Dinah
quelle
2
Schreiben Sie den Altair BASIC-Interpreter nach dem Verkaufsgespräch? Codierung des Bootstrappers im Flugzeug nach Albuquerque? Das klingt irgendwie lächerlich. Und Spaß.
Ehtesh Choudhury
2
@ Shurane: ha! Diese Punkte sind ebenfalls relevant, aber für mich ist es sehr schön und erstaunlich, wie sie den BASIC-Interpreter hergestellt haben und wie die Gruppe ihn in den winzigen Raum gedrängt hat.
Dinah
10

Was hat den ersten Compiler geschrieben, der etwas in binäre Anweisungen konvertiert hat?

Ein Mensch tat es. Lesen Sie mehr über das A-0-System :

1952 vollendete Grace Hopper ihren ersten Compiler für Sperry, bekannt als A-0. Das A-0-System bestand aus einer Reihe von Anweisungen, mit denen symbolischer mathematischer Code in Maschinensprache übersetzt werden konnte. Bei der Produktion von A-0 nahm sie alle Unterprogramme, die sie im Laufe der Jahre gesammelt hatte, und klebte sie auf Band. Jede Routine erhielt eine Rufnummer, damit die Maschine sie auf dem Band finden konnte. "Alles, was ich tun musste, war, eine Reihe von Rufnummern aufzuschreiben, sie vom Computer auf dem Band finden zu lassen, sie herüberzubringen und die Ergänzungen vorzunehmen. Dies war der erste Compiler", wie von Grace beschrieben.

Sinan Ünür
quelle
1
Der Link scheint momentan 404 zu sein, auf jeden Fall ist "Grace" oben Grace Hopper.
Volker Stolz
2
Ich habe gehört, dass Hopper den ersten Compiler geschrieben hat, aber die obige Beschreibung lässt ihn eher wie einen Linker als wie einen Compiler klingen. Trotzdem gute Geschichte. Es ist erstaunlich zu glauben, dass es eine Zeit gab, in der Informatiker der Idee von Compilern skeptisch gegenüberstanden ...
Mark E. Haase
1
@mehaase deshalb heißt es "compiler". Es wird eine Zusammenstellung von Routinen erstellt, von denen jede (möglicherweise) direkt in Maschinensprache geschrieben ist.
Elazar
@ MarkE.Haase Die Personen, auf die sich Hopper hier bezog, waren Anwendungsingenieure und Wissenschaftler, die Computer für bestimmte Berechnungsaufgaben verwendeten. Sie waren keine "Informatiker". 1952 gab es eine Handvoll Kybernetiker, aber ich bezweifle, dass sie mit einem von ihnen gesprochen hat.
Jim Balter
9

Die ersten Programme wurden in Maschinencode (nicht Assemblersprache) geschrieben - tatsächliche Zahlen, die mit Schaltern in den Computerspeicher eingesteckt wurden. Wir haben einen langen Weg zurückgelegt ...

Manchmal geschieht dies immer noch in geringem Umfang - um kleine Codebits zu patchen oder Thunks zu erstellen. Ich erinnere mich, wie ich Zahlen in Basic-Strings eingegeben habe, die dann als kleine, schnelle Unterprogramme auf frühen Mikros ausgeführt wurden. Ich erinnere mich auch daran, wie ich die Schalter auf der Vorderseite eines PDP-11 umgeschaltet habe, um ein Bootloader-Programm für einen Universitätskurs in seinen Speicher einzugeben.

Diese Programme wurden manchmal verwendet, um Textdateien zu verarbeiten, um andere Programme zu erstellen, und voila-Programmiersprachen wurden erstellt.

Michael Burr
quelle
Die Frage betrifft den ersten Compiler, nicht die ersten Programme im Allgemeinen, obwohl Programme manchmal Compiler sind. Die Geschichte der beiden ist nicht dieselbe. (Eine Analogie: Die Antwort auf die Frage, wann die ersten Tiere auf der Erde erschienen, ist nicht die Antwort auf die Frage, wann die ersten Katzen auf der Erde erschienen, obwohl Katzen Tiere waren.)
Jim Balter