Also ich glaube nicht, dass du mit deinem Wunsch nach Formalem bei C++ sehr weit kommst. Ich denke da ist die Anwendung besser um die Sprache zu verstehen.
Nun, Pointer wurden früher sehr oft gebraucht. Heute ist die Blickrichtung mehr auf Referenzen und auto_ptr gerichtet.
Z.B. kann eine Referenz nicht “0” sein und bei auto_ptr muss man sich um “nix” mehr kümmern.
In der StandardLibrary ist auto_ptr enthalten - aber boost hat noch viel lustigere auto-Pointer.
Meinste nicht das das ein Vorurteil ist? Immerhin spricht Stroustrup des öfteren davon das C++ rein formal besser konzipiert sein soll als C und ich habe jetzt schon mehrere Versuche gesehen C und darauf basierend auch C++ denotationell zu beschreiben. Papaspyrou hat da ganz nett was zusammengebraut, allerdings bin ich wahrscheinlich zu schlecht in Kategorientheorie um mir das in angemessener Zeit einzuverleiben. ^^
Einfache formal semantics für normale Pointer hab ich wie gesagt schon gefunden und ich hoffe mal das sich auch jemand über die Parallelen vom λ-Kalkül zu Templates ausgelassen hat. :>
Werd ich versuchen. ^^
Bis jetzt sieht der Plan noch so aus, das ich mir erst die wesentlichen Sachen informell von Stroustrup gebe, dann bei Bedarf noch die härteren Sachen (Wallace, Papaspyrou et al) für bestimmte Themengebiete und letztendlich dann das abgefahrenste Buch über Templates rauskrame (bis dahin hoffentlich schon schön untermauert mit Analogien zu λ oder meinetwegen auch ein durchschaubares Substitutionskalkül) um später ein bisschen Schemeflair reinbringen zu können. Nebenbei bin ich mal gespannt ob es ein paar coole Sprachfeatures gibt die ich mir in Scheme nachbauen will. (Hoffe mal das ist jetzt nicht nur ein fiktives Motivationsargument von mir um den Lernaufwand zu rechtfertigen. ;D)
Mal schauen wie weit man da ohne Nervenzusammenbruch so kommt. :>
Ach mal noch ne Zwischenfrage: hat sich Boost schon so etabliert das wir in SOS usw vorraussichtlich drauf zurückgreifen dürfen?
Zu template metaprogramming u.ae. gibts auch noch
“Generative Programming. Methods, Tools and Applications.”
von Krysztof Czarnecki, Ulrich W. Eisenecker.
Naja also einen Beweis wirst du bei Stroustrup sicher nicht finden. Es werden halt die Konstrukte und Mittel der Sprache sehr genau erläutert. Ich glaube dein Problem ist das du eine schöne in sich geschlossene Theorie als Grundlage der Sprache suchst so wie es das λ-Kalkül bei den funktionalen ist. Ich behaupte jetzt mal das es so etwas zu imperativen Sprachen wie C++ nicht wirklich gibt (und wenn dann sind es versuche die letzendlich kläglich scheitern). Das ist ja genau die Krux an den imperativen Sprachen, die Syntax lässt sich formal recht klar und eindeutig beschreiben aber die Semantik halt nicht zumindest deckt sie nicht alle allgemeinen Fälle ab. Und im übrigen hat das ganze dann nicht mehr viel mit C++ zu tun sondern eher mit der Theorie (falls es eine solche gibt) der imperativen (evtl. auch objektorientierten) Sprachen. C++ ist halt nur eine Sprache mit der man das ganze umsetzen kann nicht mehr und nicht weniger. Im übrigen finde ich das die Sprache nicht die beste ist (vor allem was Typsicherheit anbelangt usw.) obwohl sie in der Praxis wohl am weitverbreitesten ist. Der Vorteil von C++ ist die flexibiltät die man hat, sie erlaubt Abstraktion auf hoher Ebene und trotzdem kann man wiederum sehr systemnah programmieren und zudem gibt es sehr schöne und elegante Sprachkonstrukte.
smart pointer sind nicht im Sprachstandard dabei, evtl. in der einen oder anderen Bibliothek. Aber an sich werden die schon oft in der Praxis gebraucht wenn man die Vorteile der Sprache nutzen will. Ich würde smart pointer jetzt schon fast zu den Entwurfsmustern (Design patterns) zuordnen. Sowas werden wir vermutlich in späteren SoS-Vorlesungen kennenlernen. Das sind im wesentlichen standardisierte Lösungen von Entwurfsproblemen die sehr allgemein gehalten sind und bei richtiger verwendung wirklich enorme Arbeit ersparen, zudem sind sie meist sehr elegant und einfach schön… Das könnte dir auf jedenfall nicht nur eine Schublade sondern eine Tür öffnen falls du die noch nicht kennst. Pflichtliteratur dazu: "Gamma, Helm, Johnson, vlissides: “Design Patterns”
Das halte ich für ein Gerücht, der Zahn der Zeit nagt vielleicht an konkreten Implementierungen an Software die vor Jahren geschrieben wurde (evtl auch mit Hilfe von solchen Patterns) aber sicher nicht an so etwas allgemeinen wie Design Patterns. Das ist ja grad das schöne das die Patterns immer gelten wenn man ein entsprechendes Entwurfsproblem vor sicht hat. Es kann höchstens sein das man selber nicht mehr so oft Patterns einsetzen muss weil sie schon versteckt in Bibliotheken verwendet werden. Grade Singleton ist ja im übrigen ein solches Pattern das oft gar nicht mehr als solches erkannt wird sondern eher als trickreiche Implementierung angesehen wird. Design Patterns sind dagegen zeitlos sowie Mathematik.
Dann schau dir mal die Papers an die ich aufgezählt habe und verlass dich nicht nur auf hear-say. Kategorientheorie gibt da so einige mächtige Konstrukte (Monaden!) vor, Haskell lässt grüssen. Im abstrakteren OOP-Bereich hat sich das π-Kalkül (Milner et al) sogar teilweise in der Industrie etabliert um die Komplexität von OO-Concurrency zu bändigen.
Aber ich muss dir rechtgeben das sich in imperativen Gefilden wohl kaum jemand um die richtige Theorie schert, schon allein weil der inhärente Zustand alles ordentlich kompliziert macht. :>
Ich denke ich werde mir auch nur bei Problemfällen wie Pointers und Templates die formale Kante geben. ^^
In den Papers von Papaspyrou und Wallace geht es wie gesagt grade um die speziellen semantics von C und darauf aufbauend C++…
Kann ich nur aus meiner Ecke heraus kommentieren: mit neuen Sprachfeatures werden viele traditionelle “Patterns” (ihr bezieht euch auf Gamma et al, oder?) trivial und higher-order Konstrukte bzw Metaprogramming als Extrem zieht dir den Rest.
Mathematik ist auch nur dort zeitlos wo sie als “perfekt” angesehen wird, was wohl immer ein sehr subjektives Kriterium sein wird.
Ne das mit zeitlos hab ich anders gemeint. Ich meinte die Aussagen in der Mathematik sind zeitlos. Das sie halt immer gelten, immer gegolten haben und immer gelten werden. Dabei spielt es doch keine Rolle ob die Mathematik perfekt ist (was immer das auch sein soll)…
Ich hab inzwischen mal in Abrahams “C++ Template Metaprogramming - Concepts, Tools and Techniques from Boost and Beyond” reingeschnuppert und muss sagen das ich mich als Schemer fast ein bisschen heimisch fühle (wie kommt es dann eigentlich das viele Sachen als FREAKIG abgetan werden, wo ihr C++ler doch selber ganz amüsante Boostlibs habt?). ^^
Will sagen: unter den (wenigen) Büchern über Template-Hackery die ich bisher gesehen habe ragt es heraus.
BTW: jetzt ist auch klar warum das Buch mal ein bisschen tiefer eintaucht. Es ist von den Boost MPL Autoren selbst. :>