Wie verstehen Computer Programmiersprache?

... komplette Frage anzeigen

9 Antworten

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.)

Antwort bewerten Vielen Dank für Deine Bewertung

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.

Antwort bewerten Vielen Dank für Deine Bewertung

Einem Computer muss man auf der untersten Ebene Schritt für Schritt befehlen, was er tun soll. Dazu bekommt er laufend aus dem Speicher eine Abfolge von Befehlen und Daten "gefüttert", welche dort in Form "Binärer Wörter" in Form von Mustern aus Nullen und Einsen gespeichert sind. Die Nullen und Einsen im Computer werden durch positive und negative bzw. neutrale elektrische Ladungen dargestellt.

Antwort bewerten Vielen Dank für Deine Bewertung

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...

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von 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

Es gibt ein Pogramm das die Texte in 0 & 1 umwandelt, dabei hat jede Anordnung von 01 ein bestimmtes System. Daraus erkennt der Computer was gemeint ist und kann arbeiten. (Daher kommen auch z.B. bei Matrix die 0101010101001000111010100101 Zahlen die man sieht)

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Hosekopf999
28.01.2016, 13:26

das mit den nullen und einsen nennt man binärsystem. nur Ne kleine Anmerkung

0
Kommentar von Zzzzzzzzllbq
28.01.2016, 13:27

Und wie wird dieses Programm programmiert? DAS ist meine Frage

0
Kommentar von Fishmeaker
28.01.2016, 13:27

Das einzige, was an dieser Antwort stimmt, ist dass der Rechner auf tiefster Ebene mit den Werten 0 und 1 arbeitet bei denen es sich um definierte Spannungsstärken handelt. Der Rest ist gefährliches Halbwissen, an dem mehr falsch als richtig ist.

0

Hier wird der Computer erklärt.

Antwort bewerten Vielen Dank für Deine Bewertung

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...


Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Fishmeaker
28.01.2016, 13:54

Was sollen denn die vielen Ausrufezeichen? ^^

0

Das ist so groß, das kann man hier schwer erklären. Es fängt beim Binärsystem an, geht über das Thema Bussysteme weiter, hin zu ASCII, dann geht es um Hochsprachen - sind es Compiler oder Interpretersprachen...

Ich schau mal eben, ob ich eine Seite finde, die das Einsteigerfreundlich zusammenfassen kann.

Antwort bewerten Vielen Dank für Deine Bewertung

Noch eine Gegenfrage. Ich möchte wissen, was du genau wissen willst.

Willst du wissen wie ein Computer funktioniert oder wie man ein Programm schreibt und der Computer erkennt was geschrieben wurde?

Antwort bewerten Vielen Dank für Deine Bewertung