brainfuck-Compiler TMP style
-
Hacker schrieb:
Ethon schrieb:
Also nur 'pseudo'.
Trotzdem interessant, mach mal.Was gibts eig. noch interessantes in der Richtung? Hab da grad voll Bock drauf
Hab grad einen Vortrag zu genau dem gleichen Thema gehört. Dort wurde ein Haskell Interpreter zur compile-Zeit gebaut: http://cppnow.org/files/2012/04/Sinkovics.Porkoláb.pdf
-
..
-
Hey camper, sag doch mal was!
@Ethon: Ich finde deine Projektidee zwar interessant, aber ich kann damit immer noch nicht wirklich viel anfangen. Wie und wozu verwendet man sowas?
-
314159265358979 schrieb:
Hacker schrieb:
Ethon schrieb:
Also nur 'pseudo'.
Trotzdem interessant, mach mal.Was gibts eig. noch interessantes in der Richtung? Hab da grad voll Bock drauf
Unendlich viel. Schreib nen Mathe-Parser. Schreib einen Mergesort für Wert-Parameter. etc.
So, mit dem Mathe-Parser bin ich praktisch fertig. Mergesort für Wertparameter - was ist daran so "aufregend" (ich habe glaub' ich nicht ganz verstanden was gefragt ist)?
-
Zeig doch mal her den Matheparser.
-
314159265358979 schrieb:
Zeig doch mal her den Matheparser.
Wenn du sicher bist, dass dein Magen das aushält... ich mach grad nen neuen Post.
-
Den Dingensda am Anfang hab ich gebastelt, da mir die Reihenfolge der Speicherfreigabe (und der Destruktor-aufrufe) herzlich egal ist und ich keine lust hab es selbst zu machen... (
boost::ptr_set
o. ä. hab ich ja nicht ^^)
-
Mal abgesehen, dass man da jetzt noch viel verbessern kann: Was hat das mit TMP zu tun?
-
314159265358979 schrieb:
Mal abgesehen, dass man da jetzt noch viel verbessern kann: Was hat das mit TMP zu tun?
Nein, es ist ein normaler Parser. Aber TMP werd ich jetzt auch mal versuchen
Ich wusste nicht, dass du einen TMP wolltest ^^
-
Aber wie soll ich output zur Compile-Zeit machen? Ein
static_assert(0, "...");
oder wie...?
-
Ah nee, ich werd mich wohl mit
boost::mpl
auseinandersetzen müssen...
-
Was willst du denn da ausgeben? Du brauchst doch nur eine Zahl als Ergebnis.
std::cout << eval<'2', '+', '2'>::value;
Oder so ähnlich.
-
314159265358979 schrieb:
Was willst du denn da ausgeben? Du brauchst doch nur eine Zahl als Ergebnis.
std::cout << eval<'2', '+', '2'>::value;
Oder so ähnlich.
Hmm, gut
neues Ziel für die nächsten eineinhalb Stunden.
Tja, schon ein wenig weitergekommen. Aber eigentlich sehe ich so etwas wie temp-programmierung als unnötig - ich mein', wozu brauchst du es in Applikationen? :p Oder es ist einfach lustig, sich in sowas auszukennen
-
Hacker schrieb:
Tja, schon ein wenig weitergekommen. Aber eigentlich sehe ich so etwas wie temp-programmierung als unnötig - ich mein', wozu brauchst du es in Applikationen? :p Oder es ist einfach lustig, sich in sowas auszukennen
Vielleicht sollte man sich vorher klar sein, warum man etwas tut, bevor man es tut. TMP in dieser Form hat vielleicht eine Handvoll Anwendungen. Hauptsächlich geht es darum, das es geht und das man damit unglaublich schlimme Bugs in einem Code verstecken kann. Dass das hier relativ sinnlos ist, wurde aber schon an anderer Stelle angemerkt.
Die Frage ist: warum machst du es? Von dem was ich bislang so von dir gelesen habe, hab ich nicht den Eindruck, dass das etwas ist was a) in deinem Kerninteressenbereich liegt (im Gegensatz zu Pi) und b) dich in deiner Entwicklung als Programmierer weiter bringt.
Was TMP angeht tüftel ich gerade etwas an einem intelligenteren Ansatz für expression templates rum. Es geht darum, Regeln zu definieren, um ein expression template in eine Normalform zu bringen. Das heißt, anstatt den Ausdruck 1:1 in sein (dummes) expression template umzuformen suche ich eine möglichst einfache Darstellung, die es zum einen dem Compiler einfach macht zu optimieren und zum anderen mir es einfacher macht, die richtigen Algorithmen zu wählen. Anwendung ist lineare Algebra, insbesondere elementweise Transformationen von Vektoren/Matrizen. Long Term überlege ich, ob es nicht sogar möglich ist, aus so einer Normalform einen Kern für GPU-Programmierung zu generieren. Aber wie gesagt: das ist hauptsächlich im Planungsstadium. Ich habe leider kaum Zeit, um das zu Programmieren.
-
Hacker schrieb:
Tja, schon ein wenig weitergekommen. Aber eigentlich sehe ich so etwas wie temp-programmierung als unnötig - ich mein', wozu brauchst du es in Applikationen? :p Oder es ist einfach lustig, sich in sowas auszukennen
TMP an sich würde ich nicht als unnötig sehen. Der größte Vorteil ist wohl, dass man mit etwas Getrickse und Operatorüberladungen Dinge bauen kann, die man in der Sprache sonst nur schwer ausdrücken konnte. (Lambdas, Expression Templates, ...)
Aber die Reinform die hier präsentiert wird ist natürlich völlig sinnlos, abgesehen vom Lerneffekt vielleicht, aber erstmal ist es nur Spaß an den vielen <<<<...>...>...>...>
-
-
camper, Aufgabe 3 hab ich irgendwie gelöst
**3:
**template<int...a> int F() { typedef decltype(std::make_tuple(a...)) tuple_type; static tuple_type const tuple(std::make_tuple(a...)); static constexpr size_t s = std::tuple_size<tuple_type>::value; static int rval = std::get<s - 1>(std::make_tuple(a...)); return rval; }
Ich hab mal die Aufgabe zu optimieren in meine Hand genommen.
Edit: PI würde mich für diese Lösung ohrfeigen.
-
so ist das nicht richtig. TMP-Funktionen sind Klassen:
template<int ...a> struct F{ static const int value=...; };
-
otze schrieb:
so ist das nicht richtig. TMP-Funktionen sind Klassen:
template<int ...a> struct F{ static const int value=...; };
Same story:
template<int...a> struct F { typedef decltype(std::make_tuple(a...)) tuple_type; static tuple_type const tuple; static constexpr size_t s = std::tuple_size<tuple_type>::value; static int const value; }; template<int...a> typename F<a...>::tuple_type const F<a...>::tuple(a...); template<int...a> int const F<a...>::value = std::get<s - 1>(tuple);
-
Kannst du mir erklären wie das gehen soll?
F<<5, 5, 5>, 8>
Wie soll man das deklarieren, damit das so verschachtelt werden kann?