Gibt eigentlich was, das man mit C++ nicht kann?
-
Würd gern mal wissen, in wie fern man in C++ beim Programmieren eingeschränkt ist. Was geht nicht mit C++ und was geht am besten mit C++?
-
Dieser Thread wurde von Moderator/in Unix-Tom aus dem Forum MFC mit dem Visual C++ in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
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. In Lisp sähe das zB so aus:(defun multiplyn (n) (lambda (x) (* x n))) (setq mul4 (multiplyn 4)) ;; weist mul4 eine Funktion zu, die >>4<< mit ihrem Argument mulitpliziert (funcall mul4 5) => 20 ;; hier rufen wir die eben erstellte Funktion mul4 auf
Cool, was?
Vielleicht (oder wahrscheinlich) ist das mit doch mit C++ über Functors möglich, damit kenne ich mich aber nicht aus. Jedenfalls behandeln imperative Sprachen Funktionen nciht wie in diesem Beispiels als ganz normale Objekte wie alles andere auch.edit: Achja, wie wäre ncoh die ML-Variante ?
fun multiplyn n = fn x => x * n; (* mit fn x => ... erstellt man anonyme Funktionen *) val mul4 = multiplyn 4; mul4 5; => 20
-
Doktor Prokt schrieb:
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. In Lisp sähe das zB so aus:
du meinst also
float bla(float v) { return (GetMulFunc())(v); }
?
oder überseh ich ein entscheidenes detail?
rapso->greets();
-
mit boost::lambda geht auch sowas
-
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.