Gibt eigentlich was, das man mit C++ nicht kann?



  • Wenn es mit boost geht, müsste es auch ohne boost gehen. 😉



  • Doktor Prokt schrieb:

    Nur ein Beispiel:
    Nehmen wir an, du willst eine Funktion schreiben, die eine andere Funktion zurückgibt, die ein Argument erhält und dieses Argument mit einer der ersten Funktion übergebenen multipliziert.

    http://www.paulgraham.com/icad.html
    http://www.paulgraham.com/accgen.html



  • @raspo:
    Funktionszeiger in C lassen sich aber viel komplizierter behandeln als normale Daten. Aber was man in C++ garantiert nicht kann, ist zB eine Funktion zu erstellen, die andere Funktionen schreibt. Lisp kann das (dank Macros). Nützlich ist sowas zB bei der Generierung von HTML. Wir brauchen ein Makro, das uns Funktionen schreibt, die HTML-Tags mit eingeschlossenem Text zurückgeben, sodass wir HTML Tags auch schachteln können.

    (defmacro def-region (tag)
      `(defun ,tag (text)
         (let ((str (make-array '(0) :element-type 'base-char :fill-pointer 0 :adjustable t)))
           (with-output-to-string (p str)
    	 (format p "<~a>~a</~a>~%" ',tag text ',tag))
           str)))
    

    Wie das Makro genau funktioniert, wäre an dieser Stelle zu kompliziert zu erklären, aber hier ein Beispiel für die Leistungsfähigkeit (direkt aus dem Lisp-Prompt):

    [48]> (def-region html)
    HTML
    [49]> (def-region body)
    BODY
    [50]> (def-region h1)
    H1
    [51]> (html (body (h1 "hello, world!")))
    "<HTML>
    <BODY>
    <H1>hello, world!</H1>
    </BODY>
    </HTML>
    "
    [52]>
    

    Wir haben also ein Makro def-region, das, wenn man es aufruft, Funktionen erzeugt, deren "Namen" wir als Parameter übergeben.



  • Womit wir wieder bei der Farge wären.
    Was war zuerst da: Henne oder Ei?



  • Es geht alles was auch mit anderen Sprachen geht. Notfalls schreibt man sich nen Lisp-Interpreter in C++ 🤡 .



  • 😃



  • in c++ mach ich das mit

    out << NHTML::Head() << NHTML::Body() << NHTML::H1() << "Hello, world!";
    

    und die einzelnen funktionen kann man natürlich als makros machen, aber ich bevorzuge templates.

    wenn man das zur laufzeit machen möchte, würde ich mal erwarten, dass der code in die laufzeitumgebung irgendwann eingebunden wird. das kann man mit c++ natürlich auch, für den anfang kann man sich ne dynamische lib erstellen die man einbinden kann. wenn man das ein wenig spassiger möchte, dann kann man sich natürlich source direct ins ram generieren lassen und es anspringen... der wäre dann vielleicht hilfreich.

    rapso->greets();



  • Im Grunde kann man schon alles machen, aber es stellt sich die Frage, ob man da nicht lieber ne Sprache die dafür geeigneter ist nehmen sollte.



  • SirLant schrieb:

    Im Grunde kann man schon alles machen

    Auch einen Bootloader?



  • klar, auch nen bootloader.
    ein bootloader ist auch nicht mehr als ein stückchen code das erstmal auf 512byte passen muss.
    aber es nichts dagegen zu sagen, dass man sich das leben einfach macht und die 100befehle mal eben in assembler runterleiert.

    ob man da nicht lieber ne Sprache die dafür geeigneter ist nehmen sollte

    ich erweiter c++ dann lieber statt zu einer anderen sprache zu wechseln.
    wechseln hat immer so mit verlust zu tun, wenn du aber z.b. c++ und lua kombinierst, kannst du schönes ultrahighlevel scripten haben (und mit scripten scripte erzeugen), du kannst aber auch auf c++ mit allen fähigkeiten weiterhin zurückgreifen.

    rapso->greets();



  • rapso schrieb:

    in c++ mach ich das mit

    out << NHTML::Head() << NHTML::Body() << NHTML::H1() << "Hello, world!";
    

    Woher weiß aber NHTML::Body() zB, dass es das, was nach H1 kommt, noch umschließen soll? Weiß es in diesem Beispiel doch gar nciht, da ist doch nix geschachtelt.

    raspo schrieb:

    und die einzelnen funktionen kann man natürlich als makros machen, aber ich bevorzuge templates.

    Du darfst Lisp-Makros nciht mit denen von C/C++ vergleichen. Eine Funktion/Template-funktion, die andere erstellt, hab ich in C++ immer noch nciht gesehen 🙂



  • schau mal boost::lambda und boost::spirit:: phönix



  • Ein gutes Stichwort was schon in Hinsicht auf unser eigentliches Thema gefallen ist, ist "Assembler". Denn C++ ist nur so mächtig wie seine Klassenbibliotheken. Und wie funktioniert eine Klassebibliothek wie beispielsweise iostream (=Eine Klassenbibliothek, die Daten ein- und ausgibt)? Solche Klassenbibliotheken werden mit Assembler geschrieben. Des weiteren kann man wenn man ein Programm das man mit Assembler schreibt viel weitgehender optimieren als ein C++-Compiler das je könnte, was zu mehr Performance und weniger Speicherbedarf führen würde.

    Fazit: C++ ist schon sehr mächtig, aber sobald du auf jedes Bisschen Performance und jedes Bit an Speicher was du rausholen kannst angewiesen bist oder du die Register des Prozessors direkt ansprechen willst, da dir die vorhandenen Klassenbibliotheken nicht ausreichen oder es keine Klassenbiliothek für deine Zwecke gibt, kommst du nicht um Assembler rum.



  • naja, mit assembler kann man zwar noch das letzte bisschen performance
    rauskratzen, aber erstens ist das bei der heutigen hardware (pcs) nicht
    mehr sooo wichtig, n paar k zu sparen,
    und zweitens sind komplexere aufgaben in assembler schnell nicht mehr
    zu durchschauen.

    ABER: wenn man keine pcs programmiert, sondern zum beispiel
    für andere hardware ( gugg dir mal nen auto an, da is mehr software
    drin als man für die ersten flüge zum mond gebraucht hat) schreibt,
    nimmt man ja sowieso maschienen nahes zeugs, da wäres dann mit c++ viel zu umständlich



  • Bist du sicher das bei der heutigen Hardware genug Performance vorhanden ist? Dann frage ich mich warum auf meinem PC einige Spiele ordentlich ruckeln. Klar könnte man das jetzt auf die Hardware schieben, aber ich würde als Spieleentwickler alles daran setzen meine Games für ein größtmögliches Publikum zugänglich zu machen. Nicht nur für die, die die neueste Hardware haben und wenn ich mich doch entscheiden sollte auf die User mit den älteren PCs keine Rücksicht zu nehmen, würde ich trotzdem jedes bisschen an Speicher rauskratzen was noch geht um die Grafik des Games noch mehr zu verbessern.



  • man man man!!! ich bin echt begeistert von den vielen antworten. VIELEN DANK! ihr ward echt ne große hilfe!! 😉



  • Ich glaub ich lese nicht Recht

    schrankwand schrieb:

    Ein gutes Stichwort was schon in Hinsicht auf unser eigentliches Thema gefallen ist, ist "Assembler". Denn C++ ist nur so mächtig wie seine Klassenbibliotheken. Und wie funktioniert eine Klassebibliothek wie beispielsweise iostream (=Eine Klassenbibliothek, die Daten ein- und ausgibt)? Solche Klassenbibliotheken werden mit Assembler geschrieben. Des weiteren kann man wenn man ein Programm das man mit Assembler schreibt viel weitgehender optimieren als ein C++-Compiler das je könnte, was zu mehr Performance und weniger Speicherbedarf führen würde.

    Fazit: C++ ist schon sehr mächtig, aber sobald du auf jedes Bisschen Performance und jedes Bit an Speicher was du rausholen kannst angewiesen bist oder du die Register des Prozessors direkt ansprechen willst, da dir die vorhandenen Klassenbibliotheken nicht ausreichen oder es keine Klassenbiliothek für deine Zwecke gibt, kommst du nicht um Assembler rum.

    Ok für ein paar Bibliotheken lass ich mir das angehen, aber ich will sehen, wie jemand besser optimiert wie der Compiler. Falls das überhaupt funktioniert, braucht man dafür Jahre, falls man mal ein anständiges Programm das noch ein paar Quelltextzeilen hat, schreiben will.

    LUZA schrieb:

    ABER: wenn man keine pcs programmiert, sondern zum beispiel
    für andere hardware ( gugg dir mal nen auto an, da is mehr software
    drin als man für die ersten flüge zum mond gebraucht hat) schreibt,
    nimmt man ja sowieso maschienen nahes zeugs, da wäres dann mit c++ viel zu umständlich

    Schonmal was von C-Compilern für Mikroprozessoren gehört? Macht garantiert jede Firma die irgentwelche Mikroprozessoren verwendet: Stecken 1000 Mannstunden in die Entwicklung der Firmware um dann festzustellen dass der Mikrocontroller weggestorben ist(passiert immer mal) sodass die Arbeit für den Eimer war. Wenn man C genommen hätte, hätte das sicher nicht passieren können. Dann nimmt man den nächst besten Mikroprozessor und kompilliert halt die Firmaware neu. Vielleicht muss man noch ein paar Veränderungen vornehmen, aber nix tragisches...
    Und nebenbei: Wenn der Compiler etwas optimieren kann(muss er ja nicht mal so gut) dann, spart man auch viel Zeit denn es dauert ewig Software besser||gleich gut(mag bei Mikroprozessoren gehen) zu optimieren wie es der Compiler kann.



  • nd wie funktioniert eine Klassebibliothek wie beispielsweise iostream (=Eine Klassenbibliothek, die Daten ein- und ausgibt)? Solche Klassenbibliotheken werden mit Assembler geschrieben.

    falsch, iostream und die meisten bibliotheken die du in die Hand bekommst sind in hochsprachen geschrieben. öffne ma die iostream.h und such dich dann mal durch, du wirst auf eine riesige Klassenkonstruktion stoßen.

    Und ja, Assembler ist schnell, aber man braucht a) ein unglaubliches wissen über die materie(früher wurde der assembler code mittels takttabellen optimiert, um ja keinen takt zu verschenken) und b) auch unglaublich viel zeit, denn assembler ist sehr sehr viel code :). Mit assembler ist es wesentlich einfach speed zu verlieren als zu gewinnen, und man kommt in den meisten Fällen nicht gegen den Compiler an, weil er einfach viel schneller alle möglichkeiten durchgehen kann, und danach die schnellste auswählen. Natürlich kann man an einigen stellen 1-2 takte sparen, aber das bringts auf den heutigen Pcs nicht mehr.



  • otze, du hast Punkt c) vergessen:
    c) man braucht auch unglaublich viel Geduld!



  • Wenn Assembler nichts mehr bringt, dann frage ich mich, warum PureBasic-Programme, wo der Code in Assembler generiert wird

    a) Kleiner sind
    b) schneller (als C/C++ sind)
    c) weniger Speicher brauchen

    Ist das was ihr da sagt wenigstens getestet worden?

    Liebe Grüße
    Real


Anmelden zum Antworten