Wie funktioniert eigentlich eine Programmiersprache?

Otzelot

Mitglied
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?
 
Zuletzt bearbeitet:
S

SlaterB

Gast
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:
Code:
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
 
Zuletzt bearbeitet von einem Moderator:

Otzelot

Mitglied
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 :D.

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

Gesperrter Benutzer
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:

Code:
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 :D
 

ice-breaker

Top Contributor
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

Top Contributor
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

Mitglied
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. ;-).
 
S

SlaterB

Gast
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
 
Zuletzt bearbeitet von einem Moderator:

Marco13

Top Contributor
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 :eek:
 

ice-breaker

Top Contributor
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 :eek:

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 :D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Wie funktioniert eigentlich Texture Mapping? Softwareentwicklung 11
A Wie funktioniert eigentlich künstliche Inteligenz? Softwareentwicklung 14
J IntelliJ - Debugging funktioniert nur in manchen Klassen Softwareentwicklung 1
M wie funktioniert eine KI mathematisch Softwareentwicklung 6
Landei Codequalität: "Funktioniert" ist nicht genug Softwareentwicklung 22
C Kontaktformular funktioniert nicht Softwareentwicklung 6
A Wie funktioniert der Vergleich von Flügen? Softwareentwicklung 6
D wie funktioniert "Rekursion" ? Softwareentwicklung 3
temi Wie geht eigentlich: Indexierung und Volltextsuche über mehrere Dokumente? Softwareentwicklung 3
D Was genau ist jetzt eigentlich der Sinn von OOA? Softwareentwicklung 2
A Wie machen das eigentlich die C++ Programmierer mit den includes? Softwareentwicklung 17
P Was ist eigentlich die Unit im Unit-Test? Softwareentwicklung 10
W Datenhaltung und Darstellung - Hat jemand eine Idee? Softwareentwicklung 41
S Welche Programmiersprache für eine 3D-Software? Softwareentwicklung 6
N Technologie Grundlagen für eine "App" Softwareentwicklung 12
T Gibt es eine Software die Texte für Skype automartisch (automassage) sendet ? Softwareentwicklung 4
J Suche noch eine Loesung fuer Kommunikation zwischen Webserver und ein Programm Softwareentwicklung 0
J Gibt es eine Algorithmus dafür??? Softwareentwicklung 5
U Individualsoftware - eine Gefahr für Kunden oder die günstigere Alternative? Softwareentwicklung 7
T Schützt die GPL auch eine implementierte Idee? Softwareentwicklung 5
A Gibt es eine Alternative zu SQL Strings im Prorammcode? Softwareentwicklung 41
I Grundlegende Anforderungen an eine Software Softwareentwicklung 14
D Ist das bereits eine Softwareentwicklung? Softwareentwicklung 3
M Wie tief darf eine Vererbungshierarchie sein? Softwareentwicklung 10
M Eine Tabelle aus mehreren anderen Tabellen erzeugen! Softwareentwicklung 3
N gibt es eine RFC die speziell "bug tracking" besch Softwareentwicklung 5
Redfrettchen Lieber eine neue oder eine allgemeine Klasse? Softwareentwicklung 2
R Ein Thread für eine Methode Softwareentwicklung 2
1 Wie erstellt man so eine Website? Softwareentwicklung 14
M Eine Instanz übergeben ohne sie neu zu bilden Softwareentwicklung 21
T Klassendiagramm: Kann Attribut eine Liste enthalten? Softwareentwicklung 1
F Ist der Name eines Ojekts eine Eigenschaft Softwareentwicklung 7

Ähnliche Java Themen

Neue Themen


Oben