# Wie funktioniert eigentlich eine Programmiersprache?



## Otzelot (9. Mrz 2010)

Hallo,
ich hab mal eine wohl "doofe" Frage. Ich frage mich gerade, wenn ich in Java z.B. die einfache Zeile:
if ( 5 < 7) schreibe was mein PC dann eigentlich macht.
Als erstes wird die Syntax mit einem Parser überprüft oder? Aber wie sagt der Parser denn jetzt dem "PC", dass er zu vergleichen hat, ob die Zahl an erster Stelle steht die Bedingung an der zweiten Stelle zu der Zahl an der dritten Stelle erfüllt? Und wie hat man denn überhaupt den Parser programmiert, dass er die Syntax mithilfe der EBNF analysieren kann?

Mein Problem ist, ich weiß selber gar nicht in wie weit ich die Fragen beantworten haben will. Weil hier könnte man wieder weitermachen mit der Fragerei: Wie hat man dem PC überhaupt beigebracht, das Binärzahl XY = 5 ist? Das ganze muss ja irgendwie ähnlich der OSI-Schicht bei Kommunikationsnetzen aufgebaut sein, aber wie hat man da angefangen, damit man im Prinzip überhaupt erstmal eine Schicht darüber aufbauen konnte, so dass man dann letztendlich einen Parser herstellen konnte, worauf sich dann wieder die Programmiersprache stüzen konnte.

Kann mir das vielleicht jemand erklären oder hat einen Link, in dem das im Prinzip erstmal recht einfach gehalten erkärt wird?


----------



## SlaterB (9. Mrz 2010)

ein Computer kann eine gewisse Menge von Dingen allein durch Hardware,
da gibt es Speicher für Daten (Befehle + Werte), Laden, Speichern, Addieren, Vergleichen mit 0, 
einfache Bedingungen (if) -> Sprung zu einen beliebigen anderen Befehl oder den direkten Nachfolger,
das ganze mit 2 GHz, also ziemlich viel pro Sekunde, dafür nur einfachste Dinge, alles komplexere muss entsprechend aufgespalten werden

bei 5 < 7 wird erst 7-5 gerechnet und dann nachgeschaut, ob das > 0 ist 
(schauen ob irgendein Bit != 0 ist, ein bestimmtes Bit entscheidet über das Vorzeichen, +-, das macht verdrahtete Hardware)

-----

Parsen ist eine andere Sache, das macht man auf komplexer Ebene erst, wenn man eine entsprechende Hochsprache zur Verfügung hat,
ist ein gewisses Henne-Ei-Problem, wie einen Parser für Programme schreiben wenn vorher kein Parser für das Parser-Programm da war?

da muss man sich nach und nach hochhangeln,
ganz am Anfang musste man mit manuell erstellten Lochkarten oder eben einfachen Maschinenbefehlen/ Assembercode mühsam ohne Parser
selber programmieren, aber nicht gleich einen Java-Parser sondern einen einfachen Parser, der dann vielleicht vereinfachten Code
verstand und umsetzen konnte,

gut, "if (5 < 7)" kann man kaum einfacher halten, aber sowas wie Klassen, Objekte, Methoden müssen erste Parser nicht kennen,
und auch nicht drei verschiedene Schleifen (for, while, do while)


"if (5 < 7)" landet als String oder letztlich Bits und Bytes irgendwo im Speicher (von einem Texteditor),
der Parser holt sich die Daten und arbeitet sie nach irgendeinem Schemadurch,
trennt z.B. nach Blöcken, also nach Leerzeichen, Klammern, Sonderzeichen wie <,
Teilabschnitte wie "if", "5" werden geprüft, ist vom Typ Zahl, wenn nur Ziffern + vielleicht Punkt/ Komma drin sind,
oder Texte, dann nach erlaubten Schlüsselwörtern prüfen, "if" ist das bekannte if, "iff" ist ein unbekannter Fehler

und dann die Regeln für erlaubte zusammenhängende Block-Folgen,
in moderner Sprache geschrieben könnte ein Parser das so elegant machen wie etwa hier
http://www.java-forum.org/allgemeines/12306-parser-fuer-mathematische-formeln.html

aber du fragst ja eher in einfachen Strukturen, da denke ich wieder, dass die ersten programmieren Parser nur sehr wenige Konstrukte
erlaubten und diese komplex direkt aufführten:

```
if (erster Block ist das if und danach Klammer und danach (zahl oder variable) und ...) {
 dann füge folgende Befehle für das zu erstellende Programm:
  if-Befehl, lade Konstante x/ Variable z, ...
}
```


Compilerbau ist glaube ich ein gutes Stichwort für google-Suche,

hier ist manches bebeispielt
Compilerbau


----------



## Otzelot (9. Mrz 2010)

Bei meinem Überlegungen bin ich auch auf das Henne-Ei Problem gestoßen, habe mir dann aber letztendlich gedacht, irgendwie muss es gelöst worden sein sonst würde ich hier heute nicht schreiben können.

Ich find das Thema sehr interessant aber irgendwo weiß ich nicht wo ich anfangen soll .

Also am Anfang muss man wohl demnach erstmal einen Rechner gebaut haben, der irgendwie durch seine Hardware Zahlen zusammenrechnen kann, bzw. 2 Zahlen zwischenspeichern kann als Binärcode und diese dann z.B. addieren und subtrahieren. Binärcode stellt man durch hohe bzw. niedrige Spannung dar, aber dann fang ich schon wieder mit dem grübeln an . Wie hat man dem Rechner überhaupt beibringen können, diese Zahlen zu addieren bzw. überhaupt beibringen können wann eine neue Zahl anfängt und wann sie weitergeht, dass mus ja irgendwie auf physikalischer Ebene geregelt sein, aber selbst da denke ich mir da ist schon Logik enthalten: "Wenn Binärfolge XY, dann neue Zahl fängt an". Auf dieser Grundlage muss man dann irgendwie geschafft haben einen einfachen Parser zu bauen und auf dessen Grundlage baut man noch einen komplexeren so dass wir irgendwann bei Java sind.


----------



## faetzminator (9. Mrz 2010)

Soviel ich weiss, kennt eine CPU eigentlich nur XOR als Befehl, alle anderen Befehle (OR, AND, ...) können davon abgeleitet werden.
Sagen wir, 5+7, in Binär:


```
0101   5
0111   7
----
1100  12
```
[c]--> r_ = a XOR b[/c], dabei muss nur noch das "behalte eins" gespeichert werden und je nach dem ebenfalls mit [c]a[/c] und [c]b[/c] geXORt werden. Auf alle Fälle würde es irgendwie so funktionieren _


----------



## ice-breaker (9. Mrz 2010)

am besten schaust du dir mal Assembler an, da bekommt man dann eine gute Ahnung wie es auf Maschinenebene funktioniert und was simple Java-Statements (Addition, Id, Methodenaufrufe) in der Maschinensprache bedeuten.
Vor allem auch das "wann neue Zahlen einfallen", 1 Register => 1 Zahl

Und Zahlen eines Rechners sind das Zweierkomplement (2K-System), da stehen auch die mathem. Grundoperationen, jede komplexere Operation baut wiederum auf die Grundoperationen auf


----------



## Landei (9. Mrz 2010)

Eine Programmiersprache funktioniert selber wie ein Programm, nämlich eines, das Quellcode in ein anderes Programm übersetzt (auf einen Rutsch -> Compiler, in "Echtzeit" -> Interpreter). Und ein Programm funktioniert im Prinzip wie eine Turingmaschine. Die _konzeptionell_ einfachste Programmiersprache ist zweifellos Brainfuck (es ist aber dort verdammt schwer, auch nur Division mit Rest zu implementieren), und es gibt auch einen in Brainfuck geschriebenen Compiler dafür (awib). Brainfuck ist sozusagen der Urschleim der imperativen Programmierung.


----------



## Otzelot (9. Mrz 2010)

faetzminator hat gesagt.:


> Soviel ich weiss, kennt eine CPU eigentlich nur XOR als Befehl, alle anderen Befehle (OR, AND, ...) können davon abgeleitet werden.



Stimmt, meine mich zu erinnern dass man durch XOR alles darstellen kann. 
Das geht auch eher in die Richtung auf die ich hinaus wollte. Aber ich frag mich dann immer noch wie man der CPU bzw. den ersten PCs überhaupt das XOR beigebracht hat und wie man dem PC halt klar gemacht hat wann die erste und wann die zweite Zahl kommt und wie man dann darauf zugreifen konnte um eventuell ein einfaches erstes Programm schreibt, dass das Programmieren an sich vereinfacht.
Assembler Code muss ja auch irgendwer mal geschrieben haben usw. ;-).


----------



## SlaterB (9. Mrz 2010)

die ersten Computer arbeiteten mit Lochkarten, sie hatten einen Takt vorgegeben, pro Sekunde oder Zehntelsekunde rückte die Karte einen Schritt weiter und in den Zeilen der Karten stand genau drin, was zu tun war,
paar Bits/ Löcher kodierten einen von z.B. 32 möglichen Befehlen, dahinter passende Daten, ob Zahlen oder Adressen oder was es sonst so schon gab

Lochkarte ? Wikipedia

irgendwann läßt man die Information dann auf eine Festplatte übertragen und kann sie ab dann von dort laden oder per Kabel an andere Computer übertragen, die Karten kommen in die Kiste


das XOR bzw. allgemein die Bearbeitung von Grundbefehlen ist fest eingebaut, Transistoren, Rechenwerk usw.
Rechenwerk ? Wikipedia
Arithmetisch-logische Einheit ? Wikipedia


----------



## Marco13 (9. Mrz 2010)

Man kann davon ausgehen, dass in einer CPU nicht alles durch XORs abgebildet ist. AFAIK ist praktisch alles durch NAND-Gatter abgebildet, weil die irgendwie einfach (und auch "universell") sind, aber das ist eher gesundes Halbwissen  

Wie man schon sieht gibt es jede Menge Links zu diesen Themen, und es hat seinen Grund, warum man mit sowas 6 Jahre lang 12 Stunden am Tag verbringen kann, und dann gerade erst ein lächerliches Diplom hat 

Es ist aber schon interessant, dass alles auf so elementare Dinge runtergebrochen werden kann. In erster Nächerung auf die Frage "Strom oder nicht Strom?", aber eine Turing-Maschine kann nicht viel mehr als "Lesen, Schreiben, Zustandswechsel" und ist schon eine universelle Rechenmaschine.

Wenn du das nächste mal deinen 3GHz-PC einschaltest, und gleichzeitig eine Taschenlampe, dann kannst du ja mal versuchen, dir das (ganz theoretisch) vorzustellen: In der Zeit, die der Computer braucht, um nach dem Einschalten zwei 10stellige Zahlen zu addieren, ist das Licht von der Taschenlampe gerade mal 10cm weit gekommen


----------



## ice-breaker (9. Mrz 2010)

Marco13 hat gesagt.:


> Wenn du das nächste mal deinen 3GHz-PC einschaltest, und gleichzeitig eine Taschenlampe, dann kannst du ja mal versuchen, dir das (ganz theoretisch) vorzustellen: In der Zeit, die der Computer braucht, um nach dem Einschalten zwei 10stellige Zahlen zu addieren, ist das Licht von der Taschenlampe gerade mal 10cm weit gekommen



Tatsache, wenn man annimmt, dass eine Add-Instruktion auf einem 64Bit-Rechner wirklich nur einen Taktzyklus benötigt dann stimmt die Aussage sogar :autsch:

Freak


----------



## Otzelot (9. Mrz 2010)

Ist schon interessant eigentlich wollte ich nur grob wissen, wie man eine Programmiersprache genau arbeitet letztendlich waren mir die Antworten aber zu ungenau auf Maschinenebene und jetzt bin ich am Anfang der PC-Geschichte .

Ich hab hier noch einenn ganz interessanten Beitrag gefunden, falls es euch genauso sehr interessiert wie mich: Powerforen.de - Einzelnen Beitrag anzeigen - Die erste Programmiersprache..


----------

