Aufbau der Programmiersprache C++



  • Hi ihr,

    Wie C++ im Prinzip aufgebaut ist, verstehe ich inzwischen jetzt.
    Ich habe allerdings noch eine allgemeine Frage dazu.
    Und zwar ist es ja beispielsweise so, dass wenn ich "cout << "HALLO WELT" << endl" tippe "HALLO WELT" in cout geladen wird und cout irgendwie dafür sorgt, dass sein Inhalt auch am Bildschirm angezeigt wird.

    Es gibt jedoch außer über Streams in C++ keine andere Möglichkeit Text auszugeben.
    Es muss also in cout irgendwie ein Zeiger an die Konsole sein, welcher systemunabhängig ist und auch unter Linux oder so funktioniert.

    Steht irgendwo hinter cout oder Klassen, welche cout verwendet - in den vorkompilierten Headerdateien Assemblercode?
    Irgendwann muss doch mal Schluss mit C++ Libraries sein.
    Irgendwann muss doch die Verschachtelung in Maschienensprache enden.

    Wenn das so ist: Wer schreibt solche Bibliotheken?
    Assemblerprogrammierer oder woher genau kommen sie.
    Was genau steht in <iostream.h> C++ Quelltext?

    Es wäre nett, wenn mir dazu jemand antworten könnte.

    cya
    David



  • Na, das hast du doch schon recht gut erkannt, wie das ganze funktioniert.

    Der C++-Standard schreibt im Prinzip nur das Interface vor, also eine Spezifikation. Wie etwas implementiert wird, bleibt jedem selbst überlassen.

    Nehmen wir mal cout. Da wird im Standard sowas drin stehen wie "cout ist ein ostream-Objekt und dieses muß alle Zeichen auf einer Konsole ausgeben.". So, natürlich kann der Standard nicht sagen, wie das passieren soll. Weil dann müssten sie ja jede Plattform beachten, die es auf diesem Planeten gibt ➡ unmöglich!

    Wer das implementiert, kann man nicht sagen. Z.B. ist es so, wenn du den Microsoft-Compiler kaufst, bekommst du von denen einen fertige Standard-Library, die von der Firma Dinkumware implementiert wurde. Du kannst aber auch diese Library nachträglich durch die Standard-Library ersetzen, die von Apache.org implementiert wurde. Wichtig ist nur, das apache und Dinkumware sich an den Standard gehalten haben. Am Ende werden natürlich beide Implementierungen die Win32-API aufrufen, um ein Zeichen auf der Konsole aufzurufen. Und somit haben sie den Standard einfach gesagt erfüllt.

    Wenn du unter Linux was kompilieren willst, brauchst du natürlich eine Linux-Implementierung. D.h. für jede Plattform eine spezielle Implementierung, die aber nach "draussen" (Interface) sich an den C++-Standard hält.



  • 777 schrieb:

    Und zwar ist es ja beispielsweise so, dass wenn ich "cout << "HALLO WELT" << endl" tippe "HALLO WELT" in cout geladen wird und cout irgendwie dafür sorgt, dass sein Inhalt auch am Bildschirm angezeigt wird.

    Nicht cout tut das, sondern der operator<<. Der ist für jeden (eingebauten) Typ überladen und formatiert den auszugebenden Wert erstmal in eine Folge von Zeichen (bei char-Pointern wird einfach umkopiert, aber bei double sieht das schon komplizierter aus). Diese Zeichen landen im Streambuffer. Der Streambuffer ist eine Instanz von std::streambuf und Member jedes Streams. Wenn er voll ist übergibt er seinen Inhalt an das Betriebssystem. Wie das passiert, ist bei jedem BS verschieden. Unter Linux ist das die Funktion write(). Ab da hat es nichts mehr mit C++ zu tun.

    Noch was wichtiges: cout gibt nicht auf die Konsole aus, sondern auf die Standardausgabe. Was das jeweils darstellt, kann variieren. Man könnte beispielsweise die Standardausgabe in eine Datei umleiten oder sich das ganze in einem Emacs-Buffer angucken.

    Es muss also in cout irgendwie ein Zeiger an die Konsole sein, welcher systemunabhängig ist und auch unter Linux oder so funktioniert.

    Nein, streambuf selbst ist nicht betriebssystemunabhängig implementiert.

    (Alles ein bisschen vereinfacht. streambuf ist eigentlich eine Instanz von basic_streambuf usw. aber darauf kommts hier IMHO nicht an.)



  • Welche Datei bei beispielsweise dem Dev-C++ Compiler ist denn diese "Bibliothek, welche sich an den Standard hält"?
    Und was steht dadrin? Ist das einfach eine Datei, welche Assemblercode enthält, welcher mit Nachrichten von C++ zurechtkommt?
    Danke schonmal für deine Antwort.



  • 777 schrieb:

    Hi ihr,

    Wie C++ im Prinzip aufgebaut ist, verstehe ich inzwischen jetzt.
    Ich habe allerdings noch eine allgemeine Frage dazu.
    Und zwar ist es ja beispielsweise so, dass wenn ich "cout << "HALLO WELT" << endl" tippe "HALLO WELT" in cout geladen wird und cout irgendwie dafür sorgt, dass sein Inhalt auch am Bildschirm angezeigt wird.

    Genau

    Es gibt jedoch außer über Streams in C++ keine andere Möglichkeit Text auszugeben.

    Na ja... mit mit den Standardbibliotheken. Aber evtl. stellt dein Betriebssystem dir noch andere Methoden zur Verfuegung (in Windows z. B. ueber die WinAPI).

    Es muss also in cout irgendwie ein Zeiger an die Konsole sein, welcher systemunabhängig ist und auch unter Linux oder so funktioniert.

    Na ja, nicht ganz. "cout" ist ja Teil der Standardbibliothek. Aber da ist in der Regel nur festgelegt "cout" hat diese und jene Methode, die das und das machen soll. Wie diese Methode "intern" aussieht, schreibt der Standard nicht vor, das kann derjenige, der die Standardbibliothek implementiert (in der Regel die gleichen Leute, die auch deinen Compiler geschrieben haben) selbst entscheiden.
    Sprich: die "Schnittstelle" von cout (das, was du als Benutzer von cout siehst, also die Methoden von cout) sind systemabhaengig, aber die Implementierung nicht. Unter Linux koennte cout ganz anders funktionieren als unter Windows.

    Steht irgendwo hinter cout oder Klassen, welche cout verwendet - in den vorkompilierten Headerdateien Assemblercode?
    Irgendwann muss doch mal Schluss mit C++ Libraries sein.
    Irgendwann muss doch die Verschachtelung in Maschienensprache enden.
    Wenn das so ist: Wer schreibt solche Bibliotheken?
    Assemblerprogrammierer oder woher genau kommen sie.

    In der Regel verwendet cout, fstream etc. die Funktionen des darunter liegenden Betriebssystems (WinAPI unter Windows, sys-calls unter Linux, ...). Und dort im Betriebssystem gibts dann irgendwo ganz tief unten tatsaechlich Assemblercode, der dafuer sorgt, dass das, was du mit einem fstream ausgibst, tatsaechlich auf die Festplatte kommt.
    Zusammenfassend: die Betriebssystemsentwickler schreiben eine Funktion, wie man mit ihrem Betriebssystem etwas in eine Datei (oder in ein Fenster, in eine Console, ...) schreiben kann. Das kann jedes OS machen wie's im beliebt. Diejenigen, die die Standardbibliothek entwickeln, nutzen diese Funktionen, und basteln darauf aufbauend dann das, was in iostream drinnen steht 🙂

    Was genau steht in <iostream.h> C++ Quelltext?

    Detail am Rande: es muss <iostream> heissen, ohne ".h" hinten dran, sonst hast du einen sehr alten Compiler. Mach dir uebrigens nicht die Muehe, da mal rein zu schauen, iostream ist sehr kompliziert aufgebaut, aber es gibt nichts, was man als Anfaenger da lernen koennte 😉



  • 777 schrieb:

    Welche Datei bei beispielsweise dem Dev-C++ Compiler ist denn diese "Bibliothek, welche sich an den Standard hält"?
    Und was steht dadrin? Ist das einfach eine Datei, welche Assemblercode enthält, welcher mit Nachrichten von C++ zurechtkommt?
    Danke schonmal für deine Antwort.

    die <iostream>, wie bei jedem C++ Compiler. Dort wird wie von bashar schon erklaert ueber einen Streambuffer das auszugebende Zeugs an das Betriebssystem weitergereicht. Das ganze was in <iostream> steht ganz normaler C++ Code drinnen, der jedes mal, wenn du ein Programm kompilierst, wo "#include <iostream>" drinn steht, mitkompiliert wird. Der Linker ( = ein Teil deines Compilers) sorgt dann dafuer, dass der "schicke die Daten, die grad im Streambuffer stehen ans Betriebssystem"-Aufruf dann mit Assemblercode verlinkt wird (also einen Maschinencode aufruft), der bereits Teil des Betriebssystems ist (im Fall von Windows: der in irgend einer DLL drinnen steckt).



  • Hey,

    Ich denke ähnlich hatte ich mir das auch alles vorgestellt.
    Ich wollte nur nochmal sicher gehen.
    Vielen Dank für euer ausführlichen Antworten 😉
    Jetzt kann ich ja beruhigt weiter C++ lernen ohne, dass mir diese Frage weiterhin im Kopf rumschwirrt^^

    cya
    David


Anmelden zum Antworten