Wie verstehen Computer Programmiersprache?

8 Antworten

Auf (fast) unterster Ebene arbeitet die CPU Maschinenbefehle ab. Diese Befehle liegen hintereinander im Speicher. Die Speicherzellen haben Adressen (Nummern). Sowohl Datenspeicherzellen, als auch Programmspeicherzellen.

Jeder Befehl liegt also an einem definierten Ort.
Die Befehle sehen (vereinfacht)in etwa wie folgend aus:

 LADE von Speicherzelle mit Adresse X in ein Register
 SPEICHERE Register in Speicher mit Adresse X
 ADDIERE inhalt von Speicherzelle X zu Register
 VERGLEICHE Inhalt von...
 SPRINGE zu Adresse
 WENN-GLEICH,SPRINGE zu Adresse
usw.

Die Befehle sind Binär kodiert. Z.B. könnte der Befehl "LADE" als 0001, SPEICHER als 0010 usw. kodiert sein. Befehle - insbesondere wenn sie noch Adressen enthalten (wie der LADE oder SPEICHERE Befehl) können auch mehrere Zellen belegen. Dann steht in der ersten der eigentliche Befehl, und in den nachfolgenden die Adressen (in der Realität ist es noch ein bisschen komplizierter, da üblicherweise auch kompliziertere Adressregeln vorhanden sind, z.B. kann man Adressen aus der Summe eines Registers plus einem Index bilden usw.).

Wenn die CPU ein Programm ausführt, dient ein besonderes Register (sog. Programmzähler oder PC) dazu, die Adresse des gerade auszuführenden Befehls zu halten.
Zur Ausführung macht sie also folgendes:
1) Speicher an der Adresse PC holen (Instruktionsfetch)
2) PC um eine erhöhen

3a) wenn Befehl = LADE (Bitmuster 0001), dann Adresse an PC holen
4a) wenn Befehl = LADE, dann Speicher an dieser Adresse holen und in Register ablegen
5a) weiter bei 1)

3b) wenn befehl = SPEICHERE (Bitmuster 0010), dann Adresse an PC holen
4b) wenn Befehl =SPEICHERE, dann REGISTER an diese Adresse schreiben
5b) weiter bei 1)

3c) wenn befehl = SPRUNG, dann Adresse an PC holen
4d) geholte Adresse in PC schreiben
5d) weiter bei 1)

Die oben numerierten 1,2,3 sind die Ausführungszyklen der Befehle. Was in welchem Zyklus zu machen ist, hängt vom aktuellen Befehl ab. Dieser steuert ein kompliziertes Netz aus UND-ODER Gattern, und damit die Steuersignale, um Speicher zu Laden, zu Schreiben, Register zu Laden oder zu Überschreiben.

Wichtig als Zusammenfassung: sowohl Programm als auch Daten stehen im selben Speicher und das Programm kann auch Befehlsspeicher überschreiben. In der Praxis wird dies durch geeignete Schutzmaßnahmen eingeschränkt, aber prinzipiell ist es dadurch möglich, z.B. ein Programm zu schreiben, welches Daten von der Platte liest und damit ein Programm lädt. Nach dem Laden muss es nur seinen PC auf die Startadresse setzen, und los gehts.
Auch selbsmodifizierende Programme sind so theoretisch (und praktisch) möglich.

Dies ist die Maschinenebene. Natürlich will kein Mensch komplexe Programme auf dieser Ebene programmieren. Dazu ist sie viel zu "low level".

Dazu gibt es Programme, die Texte, geschrieben in einer höheren Programmiersprache lesen, und daraus ein solches Maschinensprachprogramm machen. Diese heißen Übersetzer, oder engl. Compiler.
Es gibt verschiedene Programmiersprachen, mit unterschiedlicher Komplexität und unterschiedlichem Komfort. Auch für unterschiedliche Anwendungen. Für Maschinensteuerungen nimmt man andere, als für GUI oder Webprogrammierung. Diese Compiler sind selbst Programme und damit in einer Programmiersprache geschrieben. Vor 70 Jahren fing alles damit an, daß einer sich die Mühe machte, und den ersten Compiler von Hand in Maschinensprache übersetzte! Danach wurde es immer komfortabler, und heute sind die Compiler selbst in Hochsprachen geschrieben.

Eine verbreitete Sprache ist C. Hier kann man z.B. schreiben:
   int a;
   int b;
   int c;
   c = a+b;
   if (c == 0) {
       c = c + 1;
   }

und der C-Compiler erzeugt daraus ein Maschinenprogramm, was in etwa so aussieht (und ab Adresse X steht):
X:
   LADE 1000  (Speicheradresse von a)
X+2:
   ADDIERE 1001 (Speicheradresse von b)
X+4
   SPEICHERE 1002 (Speicheradresse von c)
X+6:
   LADE 1002
X+8:
   VERGLEICHE mit 0
X+10:
   WENN UNGLEICH, SPRINGE zu X+18
X+12:
   LADE 1002
X+14
   ADDIERE 1
X+16
   SPEICHERE 1002
X+18:
   usw.

Jeder einzelne Befehl ist natürlich als Zahl (Binär) kodiert.
Obiger Code könnte im Speicher stehen als:
   0000 0000 0000 0001 LADE
   0000 0011 1110 1000  1000
   0000 0000 0000 0011 ADDIERE
   0000 0011 1110 1001  1001
usw.


So das war mal ganz kurz eine sehr sehr vereinfachte Darstellung wie Computer, Maschinensprache, Register, Speicher und Hochsprachen zusammenhängen. In der Praxis sind die CPUs viel komplexer, und moderne Hochsprachen viel komfortabler als C. Aber das Prinzip ist genau so.

PS: schau Dir mal den Instruktionssatz vom Pentium an.

Also..

Auf der untersten Ebene Arbeitet ein Computer mit den Werten 0 und 1. Diese stehen für Strom aus und Strom an. Dieses System ist ein Zahlensystem, genau wie das, in dem du Rechnen gelernt hast. es funktioniert prinzipell genau so, nur mit den zahlen 0 und 1. Wir zählen also nicht 1,2,3,4 denn 2, 3 und 4 kennt der PC ja nicht sondern wir zählen 1,10,11,100. Soviel zum Binärsystem.

Diese Signale werden zwischen den Komponenten eines PC auf sogenannten Bussystemen ausgetauscht. Das sind Stromleiter auf den Platinen im PC.

Nun kommen wir zum Teil des Programmierens. Genau wie mit den Sprachen, die wir Sprechen gibt es auch viele Programmiersprachen, die alle etwas anders Funktionieren und für andere Dinge ausgelegt sind. Bekannte Beispiele sind C++, Java oder PHP. Stell es dir vor wie Deutsch, Englich und Französisch. Du musst es lernen um zu verstehen und schreiben zu können.

Aber in Programmiercodes gibt es doch auch Buchstaben! Sicher mal geshen ;) Hier gibt es die sogenannten ASCII-Zeichen. Das ist eine Tabelle, die den kompinationen aus 0 und 1 alle Buchstaben und Sonderzeichen zuweisen. Für den Computer ist also z.B das A eine feste kompination aus 0 und 1 die in dieser ASCII-Tabelle festgelegt wird.

Der Programmierer schreibt seinen Quellcode (so wird ein Programmcode genannt). Meist geschieht dies in speziellen Editoren. Diese Editoren kennen die Sprache die man schreibt und können dir z.B eine Art Wortvervollstöndigung bieten. So wie auf deinem Handy.

Ich mach gleich fertig...

Fishmeaker  28.01.2016, 13:53

Aber nun kann ja nicht jeder Computer die Sprache lesen. Hier kommt es darauf an, welche Sprache es ist. Entweder ist es eine Compieler- oder eine Interpretersprache. Bei der Compilersprache wird der Quellcode nach der Fertigstellung vom dazugehörigen Editor in einen Maschinencode umgewandelt, den die jeweilige Maschine lesen kann. (Unterschiedliche Systeme benötigen unterschiedlichen Maschinencode. Beispiel läuft ein Windows Maschinencode in der Regel nicht auf einem Mac OS). C++ ist z.B. eine Compilersprache.

Bei den Interpretersprachen liest der Computer zeile für Zeile den Quellcode und übersetzt ihn sich in Echtzeit selbst. Dazu muss der Rechner die Sprache logischerweise kennen. ;)

Wie ein Programm aufgebaut ist wäre jetzt zuviel des guten. Stell es dir nur nicht zu leicht vor, denn der Programmierer muss jeden Schritt, den das Programm machen soll genau schreiben. Ohne Code kann der Rechner absolut garnichts. Auch jeden Fehler, den ein Benutzer machen könnte sollten in einem guten Programm vom Programmierer abgefangen werden. Schafft es der Nutzer etwas zu tun, dass das Programm nicht kennt stürzt es schlichtweg ab.

Jede Eventuallität muss also berücksichtigt werden. Deshalb arbeiten an so Dingen wie Computerspielen auch so viele hundert Menschen teilweise über Jahre. Denn jeder kleine Schritt muss entwickelt werden.

Noch Fragen?

0

Der Prozessor ist so aufgebaut, dass er bestimmte Bitfolgen (Zahlen) als bestimmte Befehle interpretiert. Das wurde schon bei der Herstellung so eingebaut, wie bei Lichtschaltern und Drähten in der Wand.

Z. B. "geh 15 Befehle zurück und mach ab da weiter"

oder "erhöhe dein 3. Register um 1" (Register = extrem schnelle kleine Zwischenspeicher für eine (ganze) Zahl im Prozessor)

oder "schreib den Inhalt deines 4. Registers in die und die Speicherzelle"

oder "addiere den Inhalt deines 3. Registers zum Inhalt deines 2. Registers (und steck das Ergebnis in dein 2. Register)"

Diese Befehle sind sehr einfach und beziehen sich auf kleine Zahlen ohne Nachkommastellen, können aber sehr schnell ausgeführt werden. (Nachtrag: früher waren die Zahlen mal klein - z. B. 0 bis 255 -, inzwischen können sie auch sehr groß sein.)

(Anmerkung: Die "Bitbreite" eines Prozessors bestimmt, wie groß diese Zahlen maximal werden können, ein 64-Bit-Prozessor kann wesentlich größere Zahlen direkt verarbeiten als ein 32-Bit-Prozessor und ist deshalb für manche Aufgaben schneller.)

Das ist die sogenannte Maschinensprache bzw. der sogenannte Maschinencode. Dies sind die einzigen Befehle, die der Prozessor direkt ("nativ" - "angeborenerweise") versteht.

Man kann im Prinzip einen Prozessor direkt in dieser Maschinensprache programmieren, das ist aber ziemlich unübersichtlich, zeitaufwendig und fehleranfällig.

Deshalb hat man schon früh Gedächtnisstützen ("Mnemonics") für die einzelnen Befehle genommen, z. B.

ADD R2, R3

für "Addiere das 3. Register zum 2. Register, steck das Ergebnis ins 2. Register"

und hat den Computer dann eine Folge solcher Befehle selber in Maschinensprache übersetzen lassen, um sie danach auszuführen.

Das nennt sich "Assembler(sprache)". (Zusammensetzer)

Aber damit war man natürlich nicht zufrieden, deshalb hat man immer ausgefeiltere Programmiersprachen zusammengebastelt, die der Computer dann in seine Maschinenbefehle übersetzen durfte. Dies Übersetzer nennt man "Compiler" ("Zusammenhäufer")

Da der Computer zwar stumpfsinnig genau das tut, was man ihm beigebracht hat, das aber sehr schnell und ohne die Konzentration zu verlieren, funktioniert das insgesamt deutlich besser und schneller, als wenn der Mensch sich noch selbst mit Maschinensprache oder Assembler rumschlagen müsste.

Inzwischen haben wir sehr viele "objektorientierte" Programmiersprachen, die uns Menschen manche Arbeit noch mal sehr stark vereinfachen und besonders viele Sachen sehr viel übersichtlicher machen, entsprechend mehr hat dann der Compiler zu tun.

(Anmerkung: Bei Programmen, die auf mehreren "Plattformen" laufen können sollen, kompiliert man den "Quelltext" - was der Mensch geschrieben hat - in eine einfachere Programmiersprache, die z. B. keine Objekte kennt, sich dafür aber sehr schnell in die Maschinensprache mehrerer Prozessoren übersetzen lässt. Das nennt man Zwischencode, z. B. die "MSIL" - Microsoft Intermediary Language - für .NET oder die Sprache der Java VM (Virtuelle Maschine). Dieser Zwischencode lässt sich heute schnell genug in Maschinencode umsetzen, dass man praktisch keinen Unterschied mehr zwischen Programmen in Zwischencode und Programmen in nativem Maschinencode merkt.)

(Noch ne Anmerkung: Da sich ein "normaler" Prozessor mit Zahlen mit Nachkommastellen schwertut, hat man den Prozessoren schon bald "Coprozessoren" zur Seite gestellt, die nichts weiter konnten, als mit Zahlen mit Nachkommastellen u. ä. umzugehen, das dafür aber sehr viel schneller als der Prozessor. Inzwischen sind diese Coprozessoren "nur" noch Untereinheiten vom Prozessor, am Prinzip hat sich aber nichts geändert.)

Woher ich das weiß:Berufserfahrung – Software-Entwickler

grundsätzlich versteht kein Computer die (höheren) Programmiersprachen !!!
das geht runter bis zum Kernel, der nur Maschinensprache und im Endeffekt nur 0 und 1 (Binärsystem) versteht !!!

damit er die Programme versteht, muss ihm das übersetzt werden, dazu existieren Compiler und Interpreter !!!

das ist in etwa so, wie wenn jemand der nur Deutsch kann einem Japaner sagen will, was er machen soll... er braucht einen Übersetzer !!! :D

und da verschiedene Betriebssysteme jeweils einen anderen Dialekt "sprechen", braucht man auch jeweils den entsprechenden Übersetzer (Linux, Windows, DOS, Mac, usw.)... ;)

manche Sprachen, wie z.B. Java, machen das sogar so, dass sie erst in einen "Zwischencode" kompilieren, der dann auf dem jeweiligen System nochmal (für das Betriebssystem verständlich) übersetzt wird !!!
könnte man so vergleichen, als wenn ein Deutscher einem Multilinguisten etwas auf Englisch sagt, und der das dann in verschiedene Sprachen weiter übersetzt, so wie es jeweils benötigt wird...


Fishmeaker  28.01.2016, 13:54

Was sollen denn die vielen Ausrufezeichen? ^^

0