<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[C++VM: Inkubator für Features in C++1y]]></title><description><![CDATA[<p>Moin miteinander,</p>
<p>Es gibt da ein sehr interessantes Projekt, das bislang zu wenig Aufmerksamkeit bekommen hat. Es handelt sich um einen Compiler, in dem neue Featurevorschläge für C++1y ausprobiert werden, bevor die working group mit unausgegorenen Proposals zugespammt wird.</p>
<p>Das Projekt basiert auf der Parrot VM und ist größtenteils in Perl 6 geschrieben -- performancemäßig kann das Ding also nicht mit gcc oder clang mithalten, aber es geht hier ja auch nicht um den Produktiveinsatz, sondern darum, schnell neue Sprachfeatures zusammenhacken und ausprobieren zu können.</p>
<p>Einiges dessen, was da inkubiert wird, sieht recht spannend aus (obwohl auch einiges an Unfug dabei ist). Beispielsweise ist Posing aus Objective-C übernommen worden:</p>
<pre><code class="language-cpp">struct foo {
  void do_stuff() const { std::cout &lt;&lt; &quot;foo\n&quot;; }
};

class bar : public foo {
  void do_stuff() const { std::cout &lt;&lt; &quot;bar\n&quot;; }
};

pose foo = bar; // Posing: bar ersetzt foo

...

foo f;
f.do_stuff(); // gibt &quot;bar&quot; aus.
</code></pre>
<p>Es ist dabei noch unklar, wie das später in nativem Code umgesetzt werden soll; Linkermagie bietet sich an, aber damit verlöre man die Möglichkeit, foo nur in bestimmten Programmteilen durch bar zu ersetzen, etwa</p>
<pre><code class="language-cpp">namespace something {
  pose foo = bar;

  void function(foo const &amp;f) { f.do_stuff(); }
}

...

foo f;

f.do_stuff();           // &quot;foo&quot;
something::function(f); // &quot;bar&quot;
</code></pre>
<p>Besonders spannend für Template-Metaprogrammierer ist Compilezeit-Reflection (bzw. introspection), welche Dinge wie boost.fusion endlich überflüssig machen könnte. So wäre</p>
<pre><code class="language-cpp">struct foo {
  int bar;
  char baz;
  std::string qux;
};

static_assert(std::member_count&lt;foo&gt;::value == 3);

static_assert(std::is_same&lt;std::member&lt;foo, 0&gt;::type, int        &gt;::value);
static_assert(std::is_same&lt;std::member&lt;foo, 1&gt;::type, char       &gt;::value);
static_assert(std::is_same&lt;std::member&lt;foo, 2&gt;::type, std::string&gt;::value);

std::cout &lt;&lt; std::member&lt;foo, 0&gt;::name &lt;&lt; '\n'; // &quot;bar&quot;

foo f;

f.bar = 10;
std::member&lt;foo, 0&gt;::type n = f.*(std::member&lt;foo, 0&gt;::memptr); // n = 10
</code></pre>
<p>möglich. Analog funktioniert das dann natürlich auch mit Methoden.</p>
<p>Für jene unter euch, die von anderen, dynamischeren Sprachen kommen, ist die Einführung dynamischer Typen vielleicht am interessantesten. Toll dabei ist, dass das Proposal nicht einmal neue Typen einführen muss, da die gesamte dynamische Objektinformation in Diffs außerhalb des Kernobjekts gehalten wird; als Key genügt die Speicheradresse (allerdings würde ein GC damit zur Pflicht). Das sieht dann beispielsweise so aus:</p>
<pre><code class="language-cpp">struct foo { int bar; };

foo f;

std::add_member&lt;foo, 0, char&gt;(f, &quot;baz&quot;);

f.baz = 'A'; // neu hinzugefügter Member in f
f.qux = 1.2; // std::runtime_exception!
</code></pre>
<p>Aus der Einführung dynamischer Typen fällt Laufzeit-Reflection quasi nebenbei ab, braucht aber zurzeit noch eigene Zugriffsfunktionen. Man hofft, das auf Dauer mit der Compilezeit-Introspektion vereinheitlichen zu können, aber für den Moment könnte man das Objekt f von oben etwa so ausgeben:</p>
<pre><code class="language-cpp">for(int i = 0; i &lt; std::dynamic_member_count(f); ++i) {
  std::cout &lt;&lt; std::dynamic_member(f, i) &lt;&lt; '\n';
}
</code></pre>
<p>Dabei wird die korrekte Überladung von operator&lt;&lt; automatisch bestimmt. Es ist natürlich möglich, das von Hand zu überstimmen, am einfachsten als</p>
<pre><code class="language-cpp">for(int i = 0; i &lt; std::dynamic_member_count(f); ++i) {
  if(std::dynamic_type_compatible&lt;std::dynamic_member(f, i)::type, int&gt;::value) {
    int n = std::dynamic_member(f, i);
    std::cout &lt;&lt; n &lt;&lt; '\n';
  } else {
    std::cout &lt;&lt; std::dynamic_member(f, i) &lt;&lt; '\n';
  }
}
</code></pre>
<p>aber auch beispielsweise als</p>
<pre><code class="language-cpp">std::cout &lt;&lt; std::dynamic_force&lt;int&gt;(std::dynamic_member(f, i)) &lt;&lt; '\n';
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">std::cout &lt;&lt; std::dynamic_prefer&lt;int&gt;(std::dynamic_member(f, i)) &lt;&lt; '\n';
</code></pre>
<p>Dieses Proposal wächst noch, es ist also davon auszugehen, dass Laufzeittypintrospektion letztendlich mächtiger und angenehmer zu benutzen sein wird.</p>
<p>Es steht auch im Raum, eine Einbindung anderer Sprachen vergleichbar zu inline asm herzustellen. Beispielsweise könnte python als</p>
<pre><code class="language-cpp">struct foo {
  int bar;
};

...

foo f;

foreign&lt;&quot;python&quot;&gt;(&quot;f = %0&quot; : : &quot;r&quot;(f));
foreign&lt;&quot;python&quot;&gt;(&quot;f.bar = 10&quot;);

std::cout &lt;&lt; f.bar &lt;&lt; '\n'; // 10
</code></pre>
<p>eingebunden werden. Wie praktisch das wäre, um auch zwischen verschiedenen Skriptsprachen kommunizieren zu können, ist offensichtlich -- wie trivial wäre es auf einmal, seine Ruby-Webapplikation mit einem Perl-Parser zu verbinden und die geschwindigkeitsrelevanten Teile in C++ auszulagern!</p>
<p>Wer mehr über dieses aufregende Projekt erfahren will: Alles Wissenswerte darüber erfährt man <a href="https://de.wikipedia.org/wiki/Aprilscherz" rel="nofollow">hier</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/315396/c-vm-inkubator-für-features-in-c-1y</link><generator>RSS for Node</generator><lastBuildDate>Thu, 30 Jul 2026 18:04:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/315396.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 01 Apr 2013 13:33:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C++VM: Inkubator für Features in C++1y on Mon, 01 Apr 2013 13:33:51 GMT]]></title><description><![CDATA[<p>Moin miteinander,</p>
<p>Es gibt da ein sehr interessantes Projekt, das bislang zu wenig Aufmerksamkeit bekommen hat. Es handelt sich um einen Compiler, in dem neue Featurevorschläge für C++1y ausprobiert werden, bevor die working group mit unausgegorenen Proposals zugespammt wird.</p>
<p>Das Projekt basiert auf der Parrot VM und ist größtenteils in Perl 6 geschrieben -- performancemäßig kann das Ding also nicht mit gcc oder clang mithalten, aber es geht hier ja auch nicht um den Produktiveinsatz, sondern darum, schnell neue Sprachfeatures zusammenhacken und ausprobieren zu können.</p>
<p>Einiges dessen, was da inkubiert wird, sieht recht spannend aus (obwohl auch einiges an Unfug dabei ist). Beispielsweise ist Posing aus Objective-C übernommen worden:</p>
<pre><code class="language-cpp">struct foo {
  void do_stuff() const { std::cout &lt;&lt; &quot;foo\n&quot;; }
};

class bar : public foo {
  void do_stuff() const { std::cout &lt;&lt; &quot;bar\n&quot;; }
};

pose foo = bar; // Posing: bar ersetzt foo

...

foo f;
f.do_stuff(); // gibt &quot;bar&quot; aus.
</code></pre>
<p>Es ist dabei noch unklar, wie das später in nativem Code umgesetzt werden soll; Linkermagie bietet sich an, aber damit verlöre man die Möglichkeit, foo nur in bestimmten Programmteilen durch bar zu ersetzen, etwa</p>
<pre><code class="language-cpp">namespace something {
  pose foo = bar;

  void function(foo const &amp;f) { f.do_stuff(); }
}

...

foo f;

f.do_stuff();           // &quot;foo&quot;
something::function(f); // &quot;bar&quot;
</code></pre>
<p>Besonders spannend für Template-Metaprogrammierer ist Compilezeit-Reflection (bzw. introspection), welche Dinge wie boost.fusion endlich überflüssig machen könnte. So wäre</p>
<pre><code class="language-cpp">struct foo {
  int bar;
  char baz;
  std::string qux;
};

static_assert(std::member_count&lt;foo&gt;::value == 3);

static_assert(std::is_same&lt;std::member&lt;foo, 0&gt;::type, int        &gt;::value);
static_assert(std::is_same&lt;std::member&lt;foo, 1&gt;::type, char       &gt;::value);
static_assert(std::is_same&lt;std::member&lt;foo, 2&gt;::type, std::string&gt;::value);

std::cout &lt;&lt; std::member&lt;foo, 0&gt;::name &lt;&lt; '\n'; // &quot;bar&quot;

foo f;

f.bar = 10;
std::member&lt;foo, 0&gt;::type n = f.*(std::member&lt;foo, 0&gt;::memptr); // n = 10
</code></pre>
<p>möglich. Analog funktioniert das dann natürlich auch mit Methoden.</p>
<p>Für jene unter euch, die von anderen, dynamischeren Sprachen kommen, ist die Einführung dynamischer Typen vielleicht am interessantesten. Toll dabei ist, dass das Proposal nicht einmal neue Typen einführen muss, da die gesamte dynamische Objektinformation in Diffs außerhalb des Kernobjekts gehalten wird; als Key genügt die Speicheradresse (allerdings würde ein GC damit zur Pflicht). Das sieht dann beispielsweise so aus:</p>
<pre><code class="language-cpp">struct foo { int bar; };

foo f;

std::add_member&lt;foo, 0, char&gt;(f, &quot;baz&quot;);

f.baz = 'A'; // neu hinzugefügter Member in f
f.qux = 1.2; // std::runtime_exception!
</code></pre>
<p>Aus der Einführung dynamischer Typen fällt Laufzeit-Reflection quasi nebenbei ab, braucht aber zurzeit noch eigene Zugriffsfunktionen. Man hofft, das auf Dauer mit der Compilezeit-Introspektion vereinheitlichen zu können, aber für den Moment könnte man das Objekt f von oben etwa so ausgeben:</p>
<pre><code class="language-cpp">for(int i = 0; i &lt; std::dynamic_member_count(f); ++i) {
  std::cout &lt;&lt; std::dynamic_member(f, i) &lt;&lt; '\n';
}
</code></pre>
<p>Dabei wird die korrekte Überladung von operator&lt;&lt; automatisch bestimmt. Es ist natürlich möglich, das von Hand zu überstimmen, am einfachsten als</p>
<pre><code class="language-cpp">for(int i = 0; i &lt; std::dynamic_member_count(f); ++i) {
  if(std::dynamic_type_compatible&lt;std::dynamic_member(f, i)::type, int&gt;::value) {
    int n = std::dynamic_member(f, i);
    std::cout &lt;&lt; n &lt;&lt; '\n';
  } else {
    std::cout &lt;&lt; std::dynamic_member(f, i) &lt;&lt; '\n';
  }
}
</code></pre>
<p>aber auch beispielsweise als</p>
<pre><code class="language-cpp">std::cout &lt;&lt; std::dynamic_force&lt;int&gt;(std::dynamic_member(f, i)) &lt;&lt; '\n';
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">std::cout &lt;&lt; std::dynamic_prefer&lt;int&gt;(std::dynamic_member(f, i)) &lt;&lt; '\n';
</code></pre>
<p>Dieses Proposal wächst noch, es ist also davon auszugehen, dass Laufzeittypintrospektion letztendlich mächtiger und angenehmer zu benutzen sein wird.</p>
<p>Es steht auch im Raum, eine Einbindung anderer Sprachen vergleichbar zu inline asm herzustellen. Beispielsweise könnte python als</p>
<pre><code class="language-cpp">struct foo {
  int bar;
};

...

foo f;

foreign&lt;&quot;python&quot;&gt;(&quot;f = %0&quot; : : &quot;r&quot;(f));
foreign&lt;&quot;python&quot;&gt;(&quot;f.bar = 10&quot;);

std::cout &lt;&lt; f.bar &lt;&lt; '\n'; // 10
</code></pre>
<p>eingebunden werden. Wie praktisch das wäre, um auch zwischen verschiedenen Skriptsprachen kommunizieren zu können, ist offensichtlich -- wie trivial wäre es auf einmal, seine Ruby-Webapplikation mit einem Perl-Parser zu verbinden und die geschwindigkeitsrelevanten Teile in C++ auszulagern!</p>
<p>Wer mehr über dieses aufregende Projekt erfahren will: Alles Wissenswerte darüber erfährt man <a href="https://de.wikipedia.org/wiki/Aprilscherz" rel="nofollow">hier</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2311424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2311424</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 01 Apr 2013 13:33:51 GMT</pubDate></item><item><title><![CDATA[Reply to C++VM: Inkubator für Features in C++1y on Mon, 01 Apr 2013 13:46:48 GMT]]></title><description><![CDATA[<p>Und ich dachte schon es würde nichts Gutes mehr kommen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2311429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2311429</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 01 Apr 2013 13:46:48 GMT</pubDate></item><item><title><![CDATA[Reply to C++VM: Inkubator für Features in C++1y on Mon, 01 Apr 2013 13:54:34 GMT]]></title><description><![CDATA[<p>Gut geschrieben! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Bei einigen Features wie Compilezeit-Reflection könnte ich mir sogar vorstellen, dass sie in einigen Jahrzehnten in Betracht gezogen werden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2311435</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2311435</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 01 Apr 2013 13:54:34 GMT</pubDate></item><item><title><![CDATA[Reply to C++VM: Inkubator für Features in C++1y on Mon, 01 Apr 2013 13:55:59 GMT]]></title><description><![CDATA[<p>Damit kann man auch <a href="http://www.meetingcpp.com/index.php/br/items/c1y-move-copy-destructors.html" rel="nofollow">Move- und Copydestruktoren</a> anwenden!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2311436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2311436</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Mon, 01 Apr 2013 13:55:59 GMT</pubDate></item><item><title><![CDATA[Reply to C++VM: Inkubator für Features in C++1y on Mon, 01 Apr 2013 16:27:02 GMT]]></title><description><![CDATA[<p>Ein Aprilscherz ist nicht gut, wenn man ihn schon an der Überschrift erkennt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2311502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2311502</guid><dc:creator><![CDATA[kritiker__]]></dc:creator><pubDate>Mon, 01 Apr 2013 16:27:02 GMT</pubDate></item><item><title><![CDATA[Reply to C++VM: Inkubator für Features in C++1y on Mon, 01 Apr 2013 21:21:58 GMT]]></title><description><![CDATA[<p>kritiker__ schrieb:</p>
<blockquote>
<p>Ein Aprilscherz ist nicht gut, wenn man ihn schon an der Überschrift erkennt.</p>
</blockquote>
<p>Ist es denn einer?<br />
Mir geht der ganze &quot;Spaß&quot; mit Aprilscherz oder nicht auf die Eier...</p>
<p>Was soll ich jetzt glauben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2311572</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2311572</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 01 Apr 2013 21:21:58 GMT</pubDate></item><item><title><![CDATA[Reply to C++VM: Inkubator für Features in C++1y on Mon, 01 Apr 2013 21:26:04 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Was soll ich jetzt glauben?</p>
</blockquote>
<p>Klick mal auf den Link von <code>seldon</code> . <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2311573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2311573</guid><dc:creator><![CDATA[Zagatho_zero87]]></dc:creator><pubDate>Mon, 01 Apr 2013 21:26:04 GMT</pubDate></item><item><title><![CDATA[Reply to C++VM: Inkubator für Features in C++1y on Wed, 03 Apr 2013 00:02:15 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Deswegen mag ich diese Scherze nicht... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2311963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2311963</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Wed, 03 Apr 2013 00:02:15 GMT</pubDate></item></channel></rss>