{"id":3172,"date":"2017-09-01T10:11:51","date_gmt":"2017-09-01T09:11:51","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=3172"},"modified":"2017-09-01T16:22:14","modified_gmt":"2017-09-01T15:22:14","slug":"c-guns-semantik-und-concepts-part-1","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=3172","title":{"rendered":"C++ Guns - Semantik und concepts - Part 1"},"content":{"rendered":"<p>Ich lese gerade das Paper<br \/>\nConcepts: The Future of Generic Programming<br \/>\nor<br \/>\nHow to design good concepts and use them well<br \/>\nvon Bjarne Stroustrup<\/p>\n<p><a href=\"http:\/\/www.stroustrup.com\/good_concepts.pdf\">http:\/\/www.stroustrup.com\/good_concepts.pdf<\/a><\/p>\n<p>und muss sagen, ich bin restlos begeistert! Die Idee dahinter wird sehr toll beschrieben. Das ist mir am wichtigsten, so dass es m\u00f6glich ist, die Idee auch bei anderen Programmiersprachen anzuwenden. Nat\u00fcrlich mehr oder weniger schlecht, da die Sprachmittel fehlen. Ich arbeite gerade an einem Beispiel aus meiner Domain welche mit concepts realisiert ist, aber das dauert noch etwas.<\/p>\n<p>Deswegen gibt es heute nur ein einfaches Beispiel aus der angewandten Mathematik, welche den Begriff der Semantik verdeutlichen soll.<\/p>\n<p>Ein Dreieck hat bekanntlich drei Ecken. Also drei Punkte. Auch wenn es nervt, dieser Witz ist sehr treffend. Viele Computerformate bilden ein Dreick als Polygonlinie mit vier Punkten ab! Deren Computer w\u00fcrde explodieren, w\u00fcrde sie C++ mit concepts nutzen ;)<\/p>\n<p>Also, ein Dreieck im 3D Raum hat drei Punkte und jeder Punkt hat drei Skalare: x, y, und z. Es soll der Normalenvector zu einem Dreieck berechnet werden. Dieser steht senkrecht zur Fl\u00e4che, welche die drei Punkte aufspannen.<\/p>\n<p>Punkte und Dreieck kann man sich leicht vorstellen und anfassen. Wir k\u00f6nnen sie also schnell als Typen in C++ implementieren:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#ifndef __cpp_aggregate_bases\r\n    #error &quot;You need an actual C++17 compiler with feature P0017R0 'Extension to aggregate initialization' for this example&quot;\r\n#endif\r\n#include &lt;iostream&gt;\r\n#include &lt;array&gt;\r\n\r\nusing namespace std;\r\n\r\nstruct Point3D : public array&lt;double, 3&gt; {\r\n};\r\n\r\nstruct Triangle {\r\n    array&lt;Point3D, 3&gt; points;\r\n};\r\n\r\nauto operator-(const Point3D&amp; p1, const Point3D&amp; p2) {\r\n    return Point3D{ p1&#x5B;0]-p2&#x5B;0], p1&#x5B;1]-p2&#x5B;1], p1&#x5B;2]-p2&#x5B;2] };\r\n}\r\n<\/pre>\n<p>Laut Internet berechnet sich der Normalvekor so:<\/p>\n<blockquote><p>Das Kreuz-Produkt zweier Vektoren steht senkrecht auf der Fl\u00e4che, das die beiden Vektoren aufspannen.<\/p><\/blockquote>\n<p>Das Kreuzprodukt sch\u00fctteln wir nat\u00fcrlich im Schlaf aus dem \u00c4rmel. Das haben wir in der Schule rauf und runter ge\u00fcbt. Also los:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nauto normalenVector(const Triangle&amp; tri) {\r\n    const auto vec1 = tri.points&#x5B;1]-tri.points&#x5B;0];\r\n    const auto vec2 = tri.points&#x5B;2]-tri.points&#x5B;0];\r\n\r\n    return Point3D{ vec1&#x5B;1]*vec2&#x5B;2]-vec1&#x5B;2]*vec2&#x5B;1],\r\n                vec1&#x5B;2]*vec2&#x5B;0]-vec1&#x5B;0]*vec2&#x5B;2],\r\n                vec1&#x5B;0]*vec2&#x5B;1]-vec1&#x5B;1]*vec2&#x5B;0] };\r\n}\r\n<\/pre>\n<p>Das ist immer etwas Tipparbeit aber einmal implementiert, immer anwendbar. Oder?<\/p>\n<p>Jetzt fehlt nur noch das Hauptprogramm mit einem kleinen Test:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nostream&amp; operator&lt;&lt;(ostream&amp; s, const Point3D&amp; p) {\r\n    s &lt;&lt; &quot;(&quot; &lt;&lt; p&#x5B;0] &lt;&lt; &quot; &quot; &lt;&lt; p&#x5B;1] &lt;&lt; &quot; &quot; &lt;&lt; p&#x5B;2] &lt;&lt; &quot;)&quot;;\r\n    return s;\r\n}\r\n\r\nint main() {\r\n    Triangle tri{ Point3D{0, 0, 0}, Point3D{10, 0, 0}, Point3D{10, 10, 0} };\r\n    Point3D normal = normalenVector(tri);\r\n    cout &lt;&lt; normal &lt;&lt; '\\n';\r\n}\r\n<\/pre>\n<p>Compilieren und Ausf\u00fchren...<\/p>\n<blockquote><p>\nStarting part1...<br \/>\n(0 0 100)\n<\/p><\/blockquote>\n<p>Alles klar. Das Ergebnis ist auch richtig. Sind wir fertig? Wo sind die Concepts? Nagut die kommen noch. Aber wo ist der Semantik Fehler? Die Funktion <em>normalenVector()<\/em> soll einen Vektor zur\u00fcck geben. Aber wir haben als R\u00fcckgabetyp ein Punkt implementiert. <strong>Technisch lassen sich sowohl Punkt als auch Vector als drei Skalare implementieren. Aber ihre Bedeutung ist eine ganz andere! Ein Punkt ist eine Position im Raum. Ein Vektor zeigt in eine Richtung.<\/strong><\/p>\n<p>Jetzt kommt der erste Schritt hin zu Concepts. Die eben erkannte Bedeutung formulieren wir nun im Code. Dazu erstellen wir einen neuen Typ der einen Vektor repr\u00e4sentiert und die Funktion <em>normalenVector()<\/em> gibt einen Vektortyp zur\u00fcck:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nstruct Vector3D : public array&lt;double, 3&gt; {\r\n};\r\n...\r\nreturn Vector3D{ ... };\r\n<\/pre>\n<p>Das neue Programm w\u00e4re funktional gleich dem alten. Sogar der Assembler und Bin\u00e4rcode w\u00e4re 100% identisch. Das Rechenergebnis nat\u00fcrlich auch. Der Unterschied besteht darin, dass der Compiler nun pr\u00fcfen kann, ob das, was wir in unserem Programm zum Ausdruck bringen wollen, auch wirklich implementiert haben. Haben wir nicht:<\/p>\n<blockquote><p>\nmain.cpp: In function \u2018int main()\u2019:<br \/>\nmain.cpp: error: conversion from \u2018Vector3D\u2019 to non-scalar type \u2018Point3D\u2019 requested<br \/>\n     Point3D normal = normalenVector(tri);\n<\/p><\/blockquote>\n<p>Na, das schaut f\u00fcr den Anfang gar nicht mal so schlecht aus. Das ist nur ein kleiner Schritt Richtung concepts, der sogar in FORTRAN realisierbar ist.<\/p>\n<p>Im n\u00e4chsten Teil portiere ich diese Idee nach FORTRAN um zu zeigen, wo die Grenze dieser Sprache liegt. Um dann im \u00fcbern\u00e4chsten Teil endlich Richtung concepts zu starten.<\/p>\n<p><a href=\"http:\/\/roboblog.fatal-fury.de\/wp-content\/uploads\/2017\/09\/conceptpart1.gz\"rel=\"\">conceptpart1.gz<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich lese gerade das Paper Concepts: The Future of Generic Programming or How to design good concepts and use them well von Bjarne Stroustrup http:\/\/www.stroustrup.com\/good_concepts.pdf und muss sagen, ich bin restlos begeistert! Die Idee dahinter wird sehr toll beschrieben. Das ist mir am wichtigsten, so dass es m\u00f6glich ist, die Idee auch bei anderen Programmiersprachen [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[17],"class_list":["post-3172","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-cpp"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3172","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3172"}],"version-history":[{"count":9,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3172\/revisions"}],"predecessor-version":[{"id":3184,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3172\/revisions\/3184"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3172"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3172"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3172"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}