Womit schreibt man eine Maschinensprache?
Hallo. Wenn ich es richtig verstanden habe, wurde das erste Computerprogramm mit einer Maschinensprache geschrieben, weil es davor keine Programme gab, auf denen man ein Programm hätte schreiben können. Aber wie genau soll man sich das vorstellen?
Ist sie Maschinensprache ein Code? Und wäre es heute möglich einen Proto-Computer zu kaufen und ihn mit einer Maschinensprache zu programmieren? Wie gibt man diese Sprache ein? Hätte dieser Computer mehrere Millionen Schalter, die jeden Transistor im Prozessor an und ausschalten kann? Werden solche Proto-Computer noch gebaut? Ich nehme an, dass man einen modernen Laptop keine Maschinen Sprache eigenen kann.
Kann man die Entwicklung der Computer mit der Metallverarbeitung vergleichen? Wenn man eine Schraube herstellen will braucht man zwangsläufig Metallwerkzeuge. Diese kann man aber nur mit anderen Metallwerkzeugen herstellen. Das geht immer weiter zurück in die Vergangenheit bis zum ersten Metall Werkzeug, welches mit Steinwerkzeugen gebaut wurde.
Wenn ich heute eine Schraube bauen möchte aber nur Steinzeit Werkzeug habe, bräuchte ich ca 10.000 Jahre, bis ich eine Drehmaschine und Gewindeschneider entwickelt habe.
Würde man heute von Grund auf ab Proto-Computer mit Maschinensprache bis Windows 10 circa 80 Jahre brauchen, bis man es programmiert hat. Also ohne Hilfe von anderen Software?
7 Antworten
Als Verständnisübung könntest du dir eine eigene kleine virtuelle Maschine in einer Programmiersprache deiner Wahl schreiben. Das ist wesentlich einfacher, als es erst mal klingt, also verwechsel den Begriff "virtuelle Maschine" jetzt nicht mit riesigen Softwarepaketen wie VirtualBox oder VmWare oder so.
Eine einfache VM in C geschrieben passt auf eine einzige Bildschirmseite. Eine recht leistungsfähige VM in C++ mit Stacks, Registern, uvm. passt auf drei bis vier Bildschirm- oder A4-Seiten. Mit letzterem kann man dann schon richtig komplexe Dinge tun, wie eine Skriptsprache für Spiele entwickeln, einen vergleichsweise schwer zu knackenden Kopierschutz implementieren, usw.
Falls du keine Kenntnisse in Low-Level-Sprachen wie C, C++, Pascal oder offensichtlich gar Assembler hast, kannst du eine VM sogar in Skriptsprachen wie Python, Ruby, Perl oder PHP schreiben, aber auch mit Sprachen in gemanageten Umgebungen lässt sich so etwas realisieren: Java, Kotlin, C#, VB.net, etc.
Wenn du also mal grundlegend verstanden hast, was Assembler bedeutet, und eine kleine VM gebaut hast, dürften keine Fragen mehr offen sein. Mach dich aber nicht verrückt, wenn das alles beim ersten Versuch nicht so klappt, wie du dir das vorstellst! Jeder fängt mal klein an, und selbst eine einfache VM erfordern einiges an programmiertechn. Verständnis.
Viel Erfolg! :)
Natürlich kannst du auch auf einem modernen Laptop Maschinensprache verwenden. Ein Windows Programm besteht in der Regel aus Maschinencode. Dieser Code wurde von einem Compiler erzeugt. https://de.wikipedia.org/wiki/Compiler
Du kannst Maschinencode auch per Hand eintippen. Das wäre aber sehr mühsam und würde viel zu lange dauern.
Bei ganz alten Computern hat man den Code auf Lochkarten gestanzt und die dann eingelesen.
Nein, die wurden per Lochkartenlesegerät in den RAM geladen. Man hat dort nicht einzelne Transistoren per Hand an und ausgeschaltet.
In diesem Video sieht man einen Altair 8800 Computer, bei dem per Lochstreifen Maschinencode in den RAM geladen und dann gestartet wird. Darauf hin druckt der Computer dann eine Meldung auf dem Drucker aus. So in der Art funktionierte das auch bei Computern aus den 40ern und 50ern. https://www.youtube.com/watch?v=qv5b1Xowxdk
In dem Video sieht man übrigens auch, dass die ersten paar Bytes des Maschinencodes per Hand eingegeben werden mussten, indem man mehrere Schalter umgelegt hat. Der Rest wurde dann vom Lochstreifen gelesen.
Das mit der Maschinensprache ist eigentlich nicht allzu kompliziert. Die „einfachen“ Komponenten sind fest verdrahtete Schaltungen, die Maschinensprache besteht aus Instruktionen die dann von diesen fest verdrahteten Schaltungen ausgeführt werden
Beispiele für ganz einfache Schaltungen wären sowas wie
- AND
- OR
- NOT
- NAND
- NOR
- XOR
- Multiplexer, Demultiplexer, Addierer
Also Beispiele für Maschinensprachen-Code wären:
- Lade den Wert aus Speicheradresse XYZ
- Lade den Wert aus Adresse ABC
- Addiere die beiden zuletzt geladenen Werte
- Schreibe das Ergebnis der Addition an Speicheradresse ZZZ
Basierend darauf kann man dann Compiler für „höhere“ Sprachen entwickeln
Wenn man Windows 10 neu entwickeln müsste bräuchte man bei entsprechender Entwicklerkapazität sicher mal fünf Jahre, wenn es hier in D umgesetzt würde wahrscheinlich 25 Jahre und ein paar Billionen Euro 🙈
Also gibt es heute solche "Schaltungen" für Maschinenschreiben, sprich Systeme zu kaufen?
Was genau meinst du? Eine CPU kannst du fertig kaufen, ansonsten kannst du natürlich die einzelnen Komponenten bspw. AND, OR, Addierer, etc. auch einzeln kaufen und verdrahten... Die musst du dann mit einem Takt versehen, an einen Speicher anbinden, Ultra simple Eingabe-/Ausgabe-Komponenten für die Interaktion/Programmierung, etc. -
oder willst du nur in Maschinensprache programmieren?
Ich selber will keine Maschinensprache programmieren. Mich interessiert nur, wie so ein System aussehen würde. Also ein Interface mit dem man manuell einen Prozessor schalten kann. Und ob solche einfachen Systeme heute noch gebaut werden. Denn eigt braucht man diese Systeme heute nicht mehr.
Die wurden noch nie Instruktion per Instruktion von Hand geschaltet, die schalten mehrere Milliarden mal pro Sekunde durch. Die laufen immer mit einem vorgegebenen Programm
Das grundlegendste System wäre da wirklich eine Lochkarte, das Ausführen der Befehle auf der Lochkarte ist wiederum physisch verdrahtet. Mit einer Lochkarte kannst du allerdings wirklich einzelne Instruktionen ausführen
Werden heute noch Lochkarten Stanzen mit entsprechender Anbindung an einem Prozessor und einfache Eingabe/ Ausgabe-Geräte industriell hergestellt?
Und gibt es heute Menschen, die damit einen Compiler schreiben können?
Das ist ein sehr umfassendes Thema... Von mir nur eine kurze Antwort:
Maschinensprache ist ein binärer Code. Dieser ist für jede Prozessorarchitektur (z.B. Intel/AMD wie im PC oder ARM wie in Smartphones) anders. Aber da gibt es Tabellen.
Ein Befehl wie: "Addiere R1 und R2, Schreibe Ergebnis in R3" wird dann zum Beispiel zu dem Binärcode: (ausgedachte Codierung)
0011000100100011
0011 => Befehl Addieren
0001 => 1. Operand
0010 => 2.Operand
0011 => 3. Operand
Man denkt sich also ein Programm aus, z.B. R3=R1+R2 und übersetzt das dann Stückweise in so einen Binärcode.
Das Problem ist, den Code in den Computer hereinzubekommen. Ich würde vermuten, dass das bei modernen Computern tatsächlich nicht mehr geht. Allerdings habe ich mal ein Projekt im Internet gesehen, wo das jemand für einen einfachen Mikrocontroller (quasi Mini-Mini-Computer) gemacht hat... Dort wird das Programm geladen, in dem es eine Taktleitung und eine Datenleitung gibt. Immer wenn die Taktleitung von 0V auf 5V wechselt, wird geschaut, ob auf der Datenleitung 5V anliegen (1) oder 0V (0). Derjenige hat also 2 Schalter gebraucht, die er abwechselnd bedient hat.
Deine Frage erwähnt aber noch ein anderes Problem. Computer können nur Maschinenbefehle ausführen, zur Vereinfachung hat man Programmiersprachen entwickelt... Diese setzen die Programmierbefehle in Maschinenbefehle um. (Das Programm nennt man Compiler) Natürlich programmiert man den Compiler auch in einer Programmiersprache - und nicht mit Maschinencode. Das heißt aber - seit wirklich mal der erste Compiler in Maschinencode geschrieben wurde gibt es eine Abhängigkeitskette... Ich habe nur mal gehört, dass sich ein Professor genau mit dieser Abhängigkeitskette beschäftigt hat. - Was genau, weiß ich aber nicht.
Ja auf diese Abhängigkeitskette, die du erwähnst wollte ich hinaus. Deswegen auch der Vergleich mit der Metallverarbeitung. Wären alle Metallwerkzeuge von heute auf Morgen weg, dann hätten wir ein grosses Problem und müssten alles von neu beginnen.
Daher auch die Überlegung, ob man heute Maschinencodes für Compiler noch schreibt und aufbewahrt.
Man muss den Maschinencode ja nicht selbst schreiben, sondern er wird ja automatisch hergestellt. Verglichen mit dem Werkzeug: Die Gießform wird gefräßt, also keine Notwendigkeit sie per Hand zu bauen.
Man müsste ihn für dein Szenario auf Papier aufheben, bzw. Möglichkeiten schaffen, um das Programm in den Computer zu laden... Professionell wird sich damit keiner beschäftigen, aber im Hobby-Bereich gibt es alles - selbstgebaute CPUs bzw. ganze Rechner, eigene Programmiersprachen, eigene Eingabe-Möglichkeiten. Vieles an Wissen ist auch noch in Papierform da. Ich fand es auch spannend mal in Büchern aus den 50er Jahren zu lesen, wie Computer funktionieren, oder ganz einfache Computer mit 4 Relais und Mechanik aufgebaut werden können.
Abgesehen davon bin ich der Meinung, dass eine moderne komplexe CPU wie von Intel/AMD kein einzelner Mensch im Detail mehr versteht. Zum Teil werden die Befehle nicht in der richtigen Reihenfolge ausgeführt, sondern irgendwie - und das Ergebnis am Schluss korrigiert, etc...
Aber auf einem mordernen Laptop könnte man eine Maschinensprache nur mit Hilfte einer Software schreiben können.
Meine Frage ist eher, ob es ein System gibt mit dem man manuell ohne Software einzelne Transistoren im Prozessor an und auschalten kann.
Das erste Computerprogramm wurde schliesslich ohne Software geschrieben.