<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>C++ Renaissance &#38; Functional Revolution</title>
	<atom:link href="http://fabiogaluppo.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://fabiogaluppo.wordpress.com</link>
	<description>It&#039;s all about Programming...</description>
	<lastBuildDate>Sat, 02 Mar 2013 15:02:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='fabiogaluppo.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>C++ Renaissance &#38; Functional Revolution</title>
		<link>http://fabiogaluppo.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://fabiogaluppo.wordpress.com/osd.xml" title="C++ Renaissance &#38; Functional Revolution" />
	<atom:link rel='hub' href='http://fabiogaluppo.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Three Types of Trees (T3)</title>
		<link>http://fabiogaluppo.wordpress.com/2013/02/12/three-types-of-trees-t3/</link>
		<comments>http://fabiogaluppo.wordpress.com/2013/02/12/three-types-of-trees-t3/#comments</comments>
		<pubDate>Tue, 12 Feb 2013 21:03:39 +0000</pubDate>
		<dc:creator>fabiogaluppo</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[F#]]></category>
		<category><![CDATA[Functional Programming]]></category>

		<guid isPermaLink="false">http://fabiogaluppo.wordpress.com/?p=289</guid>
		<description><![CDATA[Não canso de assistir esta ótima aula do Donald Knuth. Além de informativa e complexa, ela é muito divertida. Segundo Knuth, de tempos em tempos, durante a época do Natal, ele ministra uma aula sobre árvores (matemáticas e/ou computacionais), denominadas &#8230; <a href="http://fabiogaluppo.wordpress.com/2013/02/12/three-types-of-trees-t3/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiogaluppo.wordpress.com&#038;blog=16617481&#038;post=289&#038;subd=fabiogaluppo&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Não canso de assistir <a href="http://www.youtube.com/watch?v=axUgEAgrSB8">esta ótima aula</a> do <a href="http://en.wikipedia.org/wiki/Donald_knuth">Donald Knuth</a>. Além de informativa e complexa, ela é muito divertida. Segundo Knuth, de tempos em tempos, durante a época do Natal, ele ministra uma aula sobre árvores (matemáticas e/ou computacionais), denominadas de <i>Christmas Tree Lecture</i>. Inclusive ele referencia o <a href="http://xkcd.com/835/"><i>cartoon</i> do XKCD sobre árvore (de natal)</a> – onde <a href="http://xkcd.com/163/">ele é frequentemente homenageado</a>.</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/1-tree.png"><img class="alignnone  wp-image-291" alt="1 tree" src="http://fabiogaluppo.files.wordpress.com/2013/02/1-tree.png?w=450&#038;h=326" width="450" height="326" /></a></p>
<p>Este <i>cartoon</i> é um dos meus favoritos pela quantidade de coisas ligadas (intencionalmente ou não) com algoritmos e estruturas de dados. A árvore de natal representa uma árvore binária balanceada, abaixo uma estrutura de <i>heap</i> organizada pelo máximo (<i>max priority queue</i>) e a estrela no topo da árvore pode ser interpretada como o algoritmo <i>A-Star</i> (A-Estrela ou A*), cujo objetivo é encontrar o caminho mais curto entre um ponto de origem e um determinado ponto de destino.</p>
<p><b>Árvore Balanceada ou Não Balanceada, eis a questão</b></p>
<p>A estrutura de dados do tipo árvore é aplicada em diversos lugares: na organização do sistema de arquivos, na organização de dados para busca de informações, para determinar um caminho, na representação de uma expressão algébrica, entre outros. Um tipo comum de árvore é a <i>binary search tree</i> (BST), que permite a organização dos dados de modo que a busca seja eficiente. Por exemplo, a figura abaixo, <a href="http://en.wikipedia.org/wiki/File:Sorted_binary_tree.svg">retirada da Wikipedia</a>, apresenta uma BST:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/2-sorted_binary_tree-svg.png"><img class="alignnone size-medium wp-image-292" alt="2 Sorted_binary_tree.svg" src="http://fabiogaluppo.files.wordpress.com/2013/02/2-sorted_binary_tree-svg.png?w=300&#038;h=238" width="300" height="238" /></a></p>
<p>A regra básica de uma BST é: dado um determinado nó (ou vértice), todos os nós (ou vértices) filhos (ou adjacentes) estarão a esquerda, se forem menores do que o pai, ou estarão a direita, se forem maiores que o pai. Quando os valores forem iguais, é convencionado livremente se irá para esquerda ou para a direita quando aceitar entradas repetidas, caso contrário irá ignorá-lo ou subscrevê-lo. Na figura anterior, onde não há nós (ou vértices) com valores repetidos, é notado que: G é pai de I, e I está a direita porque lexicograficamente G é menor do que I. I é pai de H, e H está a esquerda de porque lexicograficamente I é maior do que H. Ou seja, G &lt; I e I &gt; H. Então, montar e buscar numa árvore do tipo BST é relativamente um trabalho trivial. Por exemplo, o código F# abaixo é uma estrutura cujo representa um nó (ou vértice) com bifurcação de forma genérica:</p>
<p>type Node&lt;&#8217;a&gt; = { value : &#8216;a; left : Node&lt;&#8217;a&gt; option; right : Node&lt;&#8217;a&gt; option }</p>
<p>A função newNode, é uma <i>helper</i> para criação nós (ou vertices) também em F#:</p>
<p>let newNode (value, left, right) = Some { value = value; left = left; right = right }</p>
<p>Logo, para reproduzir a árvore da figura anterior, basta a sequência de instruções F# como segue:</p>
<p>let c = newNode(&#8216;C&#8217;, None, None)<br />
let e = newNode(&#8216;E&#8217;, None, None)<br />
let h = newNode(&#8216;H&#8217;, None, None)<br />
let a = newNode(&#8216;A&#8217;, None, None)<br />
let d = newNode(&#8216;D&#8217;, c, e)<br />
let i = newNode(&#8216;I&#8217;, h, None)<br />
let b = newNode(&#8216;B&#8217;, a, d)<br />
let g = newNode(&#8216;G&#8217;, None, i)<br />
let f = newNode(&#8216;F&#8217;, b, g)</p>
<p>Onde é obtido o seguinte resultado:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/3-fsi_node.png"><img class="alignnone size-full wp-image-293" alt="3 fsi_node" src="http://fabiogaluppo.files.wordpress.com/2013/02/3-fsi_node.png?w=640&#038;h=358" width="640" height="358" /></a></p>
<p>O valor em questão é do tipo caractere, o tipo Node é genérico, logo o parametro genérico ’a será substituido por char devido ao mecanismo de inferência de tipos do F#. Por causa do tipo de dado inferido, o exemplo utiliza comparação lexicográfica, mas para outros tipos de dados isto não é necessáriamente verdade e um tipo customizado deverá prover <a href="http://blogs.msdn.com/b/dsyme/archive/2009/11/08/equality-and-comparison-constraints-in-f-1-9-7.aspx">via interfaces de comparação o comportamento desejado</a>.</p>
<p>Uma ação comum com árvores é percorrê-las, onde a frase em inglês correspondente é <a href="http://en.wikipedia.org/wiki/Tree_traversal"><i>tree traversal</i></a>. Existem dois modos de busca comuns para isso: por profundidade, denominada de <i>depth-first search</i> e por extensão, denominada de  <i>breadth-first search</i>.</p>
<p>Em profundidade, significa que a partir de um dado nó (ou vértice), o próximo elemento a ser visitado é um elemento filho mais a esquerda. Se este filho tiver outros filhos, eles  serão os próximos a serem visitados da esquerda para direita. E isto é feito até a exaustão, ou seja, todos forem visitados. Bem, este é o tipico procedimento que é dificil explicar por palavras. Portanto, “plotando” com o Mathematica a árvore equivalente ao código anterior, temos:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/4-btree.png"><img class="alignnone size-full wp-image-294" alt="4 btree" src="http://fabiogaluppo.files.wordpress.com/2013/02/4-btree.png?w=640"   /></a></p>
<p>Uma busca parcial por profundidade, iniciando por F, teria como resultado as visitas subsequentes a B e A. No caso de um <i>depth-first search</i>, é necessário saber que para percorrer todos os nós (ou vértices) e ter um resultado de visitas, existem 3 formas categorizadas como: <i>pre-order</i>, <i>in-order</i> e <i>post-order</i>. Estas formas indicam, como o nó em questão é visitado ou uma função de visita atua, e como os nós (ou vértices) filhos são percorridos. Isto altera totalmente o resultado final – como será visto a seguir. Em linhas gerais, no contexto de uma BST, a ação <i>pre-order </i>é: visitar o nó (ou vértice) atual, percorrer a sub-árvore da esquerda e percorrer a sub-árvore da direita. A ação <i>in-order</i> é: percorrer a sub-árvore da esquerda, visitar o nó (ou vértice) atual e percorrer a sub-árvore da direita. A ação <i>post-order</i> é: percorrer a sub-árvore da esquerda, percorrer a sub-árvore da direita e visitar o nó (ou vértice) atual. Abaixo o código em F#, em destaque, usando recursão para os 3 tipos de <i>depth-first search</i>:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/5-df_traversal_code.png"><img class="alignnone size-full wp-image-295" alt="5 df_traversal_code" src="http://fabiogaluppo.files.wordpress.com/2013/02/5-df_traversal_code.png?w=640&#038;h=459" width="640" height="459" /></a></p>
<p>Se for aplicado na árvore anterior, obtemos o seguinte resultado:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/6-df_traversal.png"><img class="alignnone size-full wp-image-296" alt="6 df_traversal" src="http://fabiogaluppo.files.wordpress.com/2013/02/6-df_traversal.png?w=640"   /></a></p>
<p>Como indicado anteriormente, outro modo para percorrer uma árvore é por extensão, também conhecido como percorrer a árvore por níveis ou horizontalmente. O código em C# a seguir apresenta como implementar a árvore e o <i>breadth-first search</i> em destaque. A versão em C# utiliza <a href="http://msdn.microsoft.com/en-us/library/dscyy5s0(v=vs.110).aspx"><i>iterator</i></a> para implementar o método AsBreadthFirst:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/7-bf_traversal_code.png"><img class="alignnone size-full wp-image-297" alt="7 bf_traversal_code" src="http://fabiogaluppo.files.wordpress.com/2013/02/7-bf_traversal_code.png?w=640"   /></a></p>
<p>Se for aplicado na árvore anterior, obtemos o seguinte resultado:</p>
<p>Level order traversal sequence: F B G A D I C E H</p>
<p>Uma vez conhecida as caracteristicas fundamentais para percorrer um árvore, vale analisar suas caracteristicas com relação ao balanceamento. As implementações das árvores apresentadas aqui até o momento são balanceadas por mera coincidência, pois sua montagem foi manual. No entanto, é possível configurarmos uma árvore não balanceada, onde todos os nós (ou vértices) estejam dispostos a extrema esquerda.</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/8-unbalanced_tree.png"><img class="alignnone size-full wp-image-298" alt="8 unbalanced_tree" src="http://fabiogaluppo.files.wordpress.com/2013/02/8-unbalanced_tree.png?w=640&#038;h=510" width="640" height="510" /></a></p>
<p>A desvantagem de uma árvore não balanceada é com relação a busca, cujo no pior caso, se todos os elementos estiverem à esquerda, como no exemplo anterior, cada um destes elementos deverá ser visitado. Ou seja, o mesmo comportamento de um <i>array</i> não ordenado, com  a desvatagem da localidade – no caso do <i>array</i> todos os elementos estão contiguamente alinhados o que é bom, dado a hierarquia de memória dos computadores aos quais estamos submetidos. O balanceamento numa árvore do tipo binária, é fundamental para diminuir a complexidade de busca com relação ao tempo. Uma das técnicas mais eficientes para balanceamento de árvores que conheço é a <i>left leaning red black tree</i>, criada por <a href="http://www.cs.princeton.edu/~rs/">Robert Sedgewick</a>. Onde os nós (ou vértices) são classificados em vermelhos ou negros. Com as seguintes propriedades para balanceamento:</p>
<p>1)      O nó (ou vértice) raiz é negro. Bem como, todos os nós (ou vértices) nulos são negros;</p>
<p>2)      Todos os nós (ou vértices) vermelhos são dispostos a esquerda;</p>
<p>3)      Na inserção, o nó (ou vértice) é vermelho, exceto no caso da raíz;</p>
<p>4)      Executar em recursividade os itens <i>a</i>, <i>b</i> e <i>c</i> até a exaustão:</p>
<ul>
<li>Quando o filho da direita for vermelho e o filho da esquerda for negro executar rotação a esquerda;</li>
<li>Quando o filho da esquerda for vermelho e o neto da esquerda for vermelho executar rotação a direita;</li>
<li>Quando ambos filhos forem vermelhos executar a troca de cores (<i style="color:#444444;">flip</i>). O <i style="color:#444444;">flip</i> consiste em tornar os dois filhos em negros e o pai em vermelho (exceto o pai raíz, ele permancerá em negro).</li>
</ul>
<p>Apesar de intimidadora, esta técnica é bem simples. A seguir, é apresentado o balancemento de uma árvore que recebará a sequência de 1 a 10, na notação matemática de intervalo isto significa: [1, 10].</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/9-llrb.png"><img class="alignnone size-full wp-image-299" alt="9 llrb" src="http://fabiogaluppo.files.wordpress.com/2013/02/9-llrb.png?w=640&#038;h=872" width="640" height="872" /></a></p>
<p>Imprimindo cada inserção de 1 a 10, é apresentado o conjunto das ações executadas em cada inserção e o resultado da árvore quando percorrida com <i>breadth-first</i>:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/10-llrb_result.png"><img class="alignnone size-full wp-image-300" alt="10 llrb_result" src="http://fabiogaluppo.files.wordpress.com/2013/02/10-llrb_result.png?w=640"   /></a></p>
<p>A seguir o código da left_leaning_red_black_bst, em C++ 11:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/11-llrb_code_1.png"><img class="alignnone size-full wp-image-301" alt="11 llrb_code_1" src="http://fabiogaluppo.files.wordpress.com/2013/02/11-llrb_code_1.png?w=640"   /></a></p>
<p>A essência da inserção de valores fica por conta do método recursive_insert que traduz as ações enumeradas anteriormente:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/12-llrb_code_2.png"><img class="alignnone size-full wp-image-302" alt="12 llrb_code_2" src="http://fabiogaluppo.files.wordpress.com/2013/02/12-llrb_code_2.png?w=640"   /></a></p>
<p>O método recursive_insert é dividido essencialmente em 2 partes: a busca para o ponto de inserção, ou seja, onde posicionar o nó (ou vértice) corretamente de acordo com o padrão de um BST, e ajustar os nós  (ou vértices) para manter as propriedades enumeradas anteriormente.</p>
<p>Abaixo encontram-se os métodos que detalham cada etapa operacional exigida pelo método recursive_insert:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/13-llrb_code_3.png"><img class="alignnone size-full wp-image-303" alt="13 llrb_code_3" src="http://fabiogaluppo.files.wordpress.com/2013/02/13-llrb_code_3.png?w=640"   /></a></p>
<p>E o <i>test case</i> do exemplo left_leaning_red_black_bst:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/14-llrb_code_4.png"><img class="alignnone size-full wp-image-304" alt="14 llrb_code_4" src="http://fabiogaluppo.files.wordpress.com/2013/02/14-llrb_code_4.png?w=640&#038;h=496" width="640" height="496" /></a></p>
<p>A seguir, algumas observações interessantes relacionadas a árvores, principalmente as balanceadas:</p>
<p>1)      Se folhar <a href="http://www.amazon.com/The-Standard-Library-Tutorial-Reference/dp/0321623215">meu livro favorito sobre STL</a>, especificamente na página 332, é indicado que a estrutura de dados interna dos tipos set, multiset, map e multimap são árvores binárias balanceadas, cujo a implementação é compartilhada entre elas. Curiosamente, na página 315 contém a informação que os tipos set e multiset utilizam como estrutura interna uma <i>red black tree</i>. Se esta árvore é uma LLRB vai depender do fornecedor da STL. <a href="http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html">TreeMap</a> e <a href="http://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html">TreeSet</a> do Java também são implementadas em termos de uma <i>red black tree</i>. Para .NET, uma das melhores opcções para coleções não-concorrentes é a <a href="http://www.itu.dk/research/c5/">The C5 Generic Collection Library</a>, onde existem algumas opções de <i><a href="https://github.com/sestoft/C5/tree/master/C5/trees">red black trees</a></i>.</p>
<p>2)      <a href="http://www.boost.org/">Boost</a> tem suporte para grafos (e por tabela árvores) com a <a href="http://www.boost.org/doc/libs/1_53_0/libs/graph/doc/index.html">Boost Graph Library (BGL)</a>.</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/15-boost_graph.png"><img class="alignnone size-full wp-image-305" alt="15 boost_graph" src="http://fabiogaluppo.files.wordpress.com/2013/02/15-boost_graph.png?w=640"   /></a></p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/16-graph.png"><img class="alignnone size-full wp-image-306" alt="16 graph" src="http://fabiogaluppo.files.wordpress.com/2013/02/16-graph.png?w=640"   /></a></p>
<p>3)     Existem estruturas de dados que são persistentes, ou seja, os estados anteriores não são destruídos. Isto é comum em estrutura de dados também denominadas imutáveis <a href="http://channel9.msdn.com/posts/Erik-Meijer-Immo-Landwerth-and-Andrew-Arnott-Immutable-Collections-for-NET">recentementes liberadas para a plataforma .NET</a> e presentes em <a href="http://clojure.org/data_structures">Clojure</a>. A obra seminal, se não for pioneira no campo, <a href="http://www.amazon.com/Purely-Functional-Structures-Chris-Okasaki/dp/0521663504/"><i>Pure Functional Data Structures</i></a> de <a href="http://www.usma.edu/eecs/SitePages/Chris%20Okasaki.aspx">Chris Okasaki</a> explica em detalhes este tipo de estrutura de dados. Então como seria uma BST persistente?</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/17-persistent_bst.png"><img class="alignnone size-full wp-image-307" alt="17 persistent_bst" src="http://fabiogaluppo.files.wordpress.com/2013/02/17-persistent_bst.png?w=640&#038;h=223" width="640" height="223" /></a></p>
<p>A medida que são inseridos os nós (ou vértices) na árvore, a referência anterior é mantida. No desenho anterior, é exibido a evolução da árvore a medida que são inseridos os itens, a aresta contínua indica que o elemento é uma cópia (valor imutável) e a aresta pontilhada uma referência.</p>
<p>A seguir o código em F# de um BST persistente:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/18-persistent_bst_code.png"><img class="alignnone size-full wp-image-308" alt="18 persistent_bst_code" src="http://fabiogaluppo.files.wordpress.com/2013/02/18-persistent_bst_code.png?w=640&#038;h=749" width="640" height="749" /></a></p>
<p>4)      Grafos podem ser representados como árvore. Por exemplo, o grafo conectado em forma de estrela:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/19-graph_star.png"><img class="alignnone size-full wp-image-309" alt="19 graph_star" src="http://fabiogaluppo.files.wordpress.com/2013/02/19-graph_star.png?w=640"   /></a></p>
<p>Pode ser expandido em uma árvore e ser percorrido como no clássico problema do <a href="http://pt.wikipedia.org/wiki/Problema_do_caixeiro_viajante">caixeiro viajante</a> ou do <a href="http://pt.wikipedia.org/wiki/Problema_do_caminho_m%C3%ADnimo">caminho mais curto</a> (desde que visite todos os nós, problema exemplificado na figura abaixo):</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/20-brute_force_tsp.png"><img class="alignnone size-full wp-image-310" alt="20 brute_force_tsp" src="http://fabiogaluppo.files.wordpress.com/2013/02/20-brute_force_tsp.png?w=640"   /></a></p>
<p>E o respectivo código em F#, usando a transformação de grafo para árvore e força bruta para encontrar a menor distância se todos os nós (ou vértices) forem percorridos:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/21-graph_to_tree.png"><img class="alignnone size-full wp-image-311" alt="21 graph_to_tree" src="http://fabiogaluppo.files.wordpress.com/2013/02/21-graph_to_tree.png?w=640&#038;h=703" width="640" height="703" /></a></p>
<p>5)      Sabendo que os sistemas operacionais utilizam estruturas de dados do tipo <i>red black</i>, fui atrás de uma aplicação real. Recentemente, investigando o código fonte do <i>kernel</i> do <a href="http://www.kernel.org/">Linux</a> (não que eu faça isto com frequência) encontrei as seguintes dependências e relações com estrutura de dados rbtree: <a href="http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob;f=include/linux/kernel.h;h=c566927efcbd254efa6c30c0a82fd10ccb11f363;hb=c727b4c63c9bf33c65351bbcc738161edb444b24">kernel.h</a>, <a href="http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob;f=include/linux/rbtree_augmented.h;h=fea49b5da12a99bfa6c87b865a461a2a28e0495b;hb=c727b4c63c9bf33c65351bbcc738161edb444b24">rbtree_augmented.h</a>, <a href="/git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob;f=include/linux/rbtree.h;h=0022c1bb1e26398c9db767a8eebc4fa153bff559;hb=c727b4c63c9bf33c65351bbcc738161edb444b24">rbtree.h</a>, <a href="http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob;f=lib/rbtree.c;h=c0e31fe2fabf5b99c160fb01daf618cb7c0488b3;hb=c727b4c63c9bf33c65351bbcc738161edb444b24">rbtree.c</a> e <a href="http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob;f=lib/rbtree_test.c;h=af38aedbd874f0f2ad4f5411c8bfc2187aa2c738;hb=c727b4c63c9bf33c65351bbcc738161edb444b24">rbtree_test.c</a>. Então, achei que seria divertido portá-la para rodar no Visual C++. Em linhas gerais, o código portado mantém todas as caracteristicas dos códigos escritos em C originalmente, porém eu precisei fazer alguns ajustes para tê-los em C++ no Windows.</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/22-rb_linux_1.png"><img class="alignnone size-full wp-image-312" alt="22 rb_linux_1" src="http://fabiogaluppo.files.wordpress.com/2013/02/22-rb_linux_1.png?w=640&#038;h=788" width="640" height="788" /></a></p>
<p>A parte chata foi adaptar uma macro do kernel.h chamada container_of, no caso fui obrigado a usar um pequeno truque com <i>lambda</i> para manter o código original inalterado. O código é um pouco grande, então não vou reproduzi-lo aqui totalmente, mas ele está disponível no pacote para <i>download</i> deste <i>post</i>.</p>
<p>O que é interessante saber é o caso de teste:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/23-rb_linux_2.png"><img class="alignnone size-full wp-image-313" alt="23 rb_linux_2" src="http://fabiogaluppo.files.wordpress.com/2013/02/23-rb_linux_2.png?w=640&#038;h=666" width="640" height="666" /></a></p>
<p>E o resultado, onde podemos acompanhar a evolução da entrada de 10 nós (ou vértices) de 1 a 10:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/24-rb_linux_3.png"><img class="alignnone size-full wp-image-314" alt="24 rb_linux_3" src="http://fabiogaluppo.files.wordpress.com/2013/02/24-rb_linux_3.png?w=640"   /></a></p>
<p>A implementação encontrada no Linux, não é uma <i>left leaning red black tree</i>, que garante na média uma busca e uma inserção próximos de lg N (logaritmo na base 2 de N elementos). O resultado final é uma árvore não perfeitamente balanceada, mesmo assim obedecendo as caracteristicas de uma BST balanceada:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2013/02/25-linux_rbtree_result.jpg"><img class="alignnone size-medium wp-image-290" alt="25 linux_rbtree_result" src="http://fabiogaluppo.files.wordpress.com/2013/02/25-linux_rbtree_result.jpg?w=247&#038;h=300" width="247" height="300" /></a></p>
<p>Faça o <a href="https://skydrive.live.com/embed?cid=B671A4645AF2F2F4&amp;resid=B671A4645AF2F2F4%21535&amp;authkey=ABPIhm6TbXhlK88"><i>download</i> dos códigos fontes e imagens dos exemplos</a> e boa diversão&#8230;</p>
<p><a href="https://skydrive.live.com/embed?cid=B671A4645AF2F2F4&amp;resid=B671A4645AF2F2F4%21539&amp;authkey=AEGFOyFdNRGr_Js">Versão PDF deste Post</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fabiogaluppo.wordpress.com/289/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fabiogaluppo.wordpress.com/289/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiogaluppo.wordpress.com&#038;blog=16617481&#038;post=289&#038;subd=fabiogaluppo&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fabiogaluppo.wordpress.com/2013/02/12/three-types-of-trees-t3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/ea84e8f3c9eaaa7ece0054ccf8a35b80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fabiogaluppo</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/1-tree.png" medium="image">
			<media:title type="html">1 tree</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/2-sorted_binary_tree-svg.png?w=300" medium="image">
			<media:title type="html">2 Sorted_binary_tree.svg</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/3-fsi_node.png" medium="image">
			<media:title type="html">3 fsi_node</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/4-btree.png" medium="image">
			<media:title type="html">4 btree</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/5-df_traversal_code.png" medium="image">
			<media:title type="html">5 df_traversal_code</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/6-df_traversal.png" medium="image">
			<media:title type="html">6 df_traversal</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/7-bf_traversal_code.png" medium="image">
			<media:title type="html">7 bf_traversal_code</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/8-unbalanced_tree.png" medium="image">
			<media:title type="html">8 unbalanced_tree</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/9-llrb.png" medium="image">
			<media:title type="html">9 llrb</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/10-llrb_result.png" medium="image">
			<media:title type="html">10 llrb_result</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/11-llrb_code_1.png" medium="image">
			<media:title type="html">11 llrb_code_1</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/12-llrb_code_2.png" medium="image">
			<media:title type="html">12 llrb_code_2</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/13-llrb_code_3.png" medium="image">
			<media:title type="html">13 llrb_code_3</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/14-llrb_code_4.png" medium="image">
			<media:title type="html">14 llrb_code_4</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/15-boost_graph.png" medium="image">
			<media:title type="html">15 boost_graph</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/16-graph.png" medium="image">
			<media:title type="html">16 graph</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/17-persistent_bst.png" medium="image">
			<media:title type="html">17 persistent_bst</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/18-persistent_bst_code.png" medium="image">
			<media:title type="html">18 persistent_bst_code</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/19-graph_star.png" medium="image">
			<media:title type="html">19 graph_star</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/20-brute_force_tsp.png" medium="image">
			<media:title type="html">20 brute_force_tsp</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/21-graph_to_tree.png" medium="image">
			<media:title type="html">21 graph_to_tree</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/22-rb_linux_1.png" medium="image">
			<media:title type="html">22 rb_linux_1</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/23-rb_linux_2.png" medium="image">
			<media:title type="html">23 rb_linux_2</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/24-rb_linux_3.png" medium="image">
			<media:title type="html">24 rb_linux_3</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2013/02/25-linux_rbtree_result.jpg?w=247" medium="image">
			<media:title type="html">25 linux_rbtree_result</media:title>
		</media:content>
	</item>
		<item>
		<title>Retrospectiva 2012</title>
		<link>http://fabiogaluppo.wordpress.com/2012/12/31/retrospectiva-2012/</link>
		<comments>http://fabiogaluppo.wordpress.com/2012/12/31/retrospectiva-2012/#comments</comments>
		<pubDate>Tue, 01 Jan 2013 00:05:10 +0000</pubDate>
		<dc:creator>fabiogaluppo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://fabiogaluppo.wordpress.com/?p=266</guid>
		<description><![CDATA[Bem, este ano foi muito “agitado”. Quando no inicio do ano publiquei a mensagem que estaria replanejando meu blog, tinha intenção de escrever com mais frequencia. No entanto, para minha supresa, este ano foi muito “agitado”. (recursividade intencional) Logo em &#8230; <a href="http://fabiogaluppo.wordpress.com/2012/12/31/retrospectiva-2012/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiogaluppo.wordpress.com&#038;blog=16617481&#038;post=266&#038;subd=fabiogaluppo&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Bem, este ano foi muito “agitado”. Quando no inicio do ano publiquei a <a href="http://fabiogaluppo.wordpress.com/2012/01/02/replanejamento-do-blog-2012-comeback-special/">mensagem que estaria replanejando</a> meu blog, tinha intenção de escrever com mais frequencia. No entanto, para minha supresa, este ano foi muito “agitado”. (<a href="http://fabiogaluppo.wordpress.com/2012/01/07/recurso-recursion-ricorsione-%CE%AE/">recursividade</a> intencional)</p>
<p>Logo em Janeiro, nós do grupo C/C++ do Brasil juntamente com a Microsoft Brasil, e em especial, colaboração do Programa MVP, organizamos um evento chamado C++ Renaissance, para marcar a importância e a atenção dada pela indústria global com relação ao código nativo, em especial a C++. O evento <a href="http://blogs.msdn.com/b/mvpbr/archive/2012/01/29/c-renaissance-foi-marcado-com-palestra-internacional.aspx">C++ Renaissance</a> está registrado na página do Programa MVP. Eu fui um dos palestrantes, e falei sobre <a href="http://fabiogaluppo.wordpress.com/2012/06/30/faster-than-a-bullet/">C++ AMP</a>. Além disso, mais ou menos neste período viajei para Redmond com o objetivo de participar do <a href="http://channel9.msdn.com/Events/GoingNative/GoingNative-2012">GoingNative 2012</a> e fui o revisor técnico do artigo <a href="http://msdn.microsoft.com/en-us/magazine/hh852594.aspx">New Standard Concurrency Features in Visual C++ 11</a>, que saiu na <a href="http://msdn.microsoft.com/en-us/magazine/hh852583.aspx">MSDN Magazine de Março de 2012</a> – meu nome é mencionado no final do artigo – maneiro, não é mesmo?</p>
<p><a href="http://fabiogaluppo.wordpress.com/2012/12/31/retrospectiva-2012/fabiog_cppamp/" rel="attachment wp-att-267"><img class="alignnone size-medium wp-image-267" alt="fabiog_cppamp" src="http://fabiogaluppo.files.wordpress.com/2012/12/fabiog_cppamp.jpg?w=300&#038;h=200" width="300" height="200" /></a></p>
<p>Até ai estava tranquilo, conciliar o trabalho, meus estudos, minhas aulas (de Scala, C++, C#, …), e os posts para o <i>blog</i>. Porém, sedento por conhecimento e desejando aprimorar meu lado cientista (da Computação), resolvi ingressar num programa de mestrado Stricto Sensu, focando minhas pesquisas essencialmente em Inteligência Artificial, Programação Paralela e Algoritmos. Consumindo mais tempo do que eu imaginava. Assim sendo, fui obrigado a administrar melhor algumas coisas, mas prioridades são prioridades e tenho um planejamento a seguir.</p>
<p>Após conhecer o conceito dos <a href="http://www.nytimes.com/2012/11/04/education/edlife/massive-open-online-courses-are-multiplying-at-a-rapid-pace.html?pagewanted=all&amp;_r=1&amp;">MOOCs</a>, paralelamente as atividades citadas, resolvi encarar mais um desafio – participar de alguns dos cursos <i>online</i> oferecidos pelas grandes universidades. Na minha primeira iteração, conclui o curso <b>Algorithms Part I</b> de <b>Princeton</b>, ao qual obtive no exame final o <i>score</i> <b>18.25</b> de <b>20.00</b> – para minha felicidade, no artigo indicado do New York Times, existe a seguinte passagem: <i>Most offerings are adapted from existing courses: <b>a Princeton Coursera course is a Princeton course</b></i>.</p>
<p><a href="http://fabiogaluppo.wordpress.com/2012/12/31/retrospectiva-2012/algo-part-1-princeton/" rel="attachment wp-att-268"><img class="alignnone size-medium wp-image-268" alt="algo part 1 - Princeton" src="http://fabiogaluppo.files.wordpress.com/2012/12/algo-part-1-princeton.png?w=300&#038;h=79" width="300" height="79" /></a></p>
<p>Neste tipo de curso, você pode ser apenas um participante sem se preocupar com as atividades e os testes – mas o legal, além do aprendizado, é saber o quanto você está preparado e capacitado para lidar com os desafios propostos – e no final receber a recompensa.</p>
<p>Surpreendentemente, um dos treinamentos anunciados pela <a href="http://www.coursera.org/">Coursera</a> foi o do <a href="http://lampwww.epfl.ch/~odersky/">Martin Odersky</a>, o criador da linguagem <a href="http://www.scala-lang.org/">Scala</a>, ao qual venho ministrando alguns treinamentos aqui no Brasil:</p>
<p><a href="http://fabiogaluppo.wordpress.com/2012/12/31/retrospectiva-2012/fabiog_and_scala/" rel="attachment wp-att-269"><img class="alignnone size-medium wp-image-269" alt="fabiog_and_scala" src="http://fabiogaluppo.files.wordpress.com/2012/12/fabiog_and_scala.png?w=300&#038;h=225" width="300" height="225" /></a></p>
<p>Onde consegui um <i>score</i> de <b>98,9%</b> de aproveitamento completando tarefas de programação como: algoritmo de compactação (Huffman) e inteligência artificial (implementando um solver para o jogo Bloxorz), além das outras, obtendo assim o <strong>certificado de conclusão com distinção</strong>:</p>
<p><a href="http://fabiogaluppo.wordpress.com/2012/12/31/retrospectiva-2012/scala-statement-of-accomplishment/" rel="attachment wp-att-270"><img class="alignnone size-medium wp-image-270" alt="scala statement of accomplishment" src="http://fabiogaluppo.files.wordpress.com/2012/12/scala-statement-of-accomplishment.png?w=300&#038;h=300" width="300" height="300" /></a></p>
<p>Só isso? Parece brincadeira, mas além de todas estas atividades (trabalho, mestrado, cursos no Coursera, etc&#8230;), a poucas semanas atrás conclui o curso de Matemática Aplicada (onde a maioria das aulas de 6 horas ocorriam aos sábados e domingos) – um dos cursos mais bonitos que assisti em minha vida (A Matemática é bela por si só, quando ensinada com maestria fica ainda mais bela):</p>
<p><a href="http://fabiogaluppo.wordpress.com/2012/12/31/retrospectiva-2012/fabiog_matematica_aplicada-2012/" rel="attachment wp-att-271"><img class="alignnone size-medium wp-image-271" alt="fabiog_matematica_aplicada - 2012" src="http://fabiogaluppo.files.wordpress.com/2012/12/fabiog_matematica_aplicada-2012.jpg?w=300&#038;h=292" width="300" height="292" /></a></p>
<p>Foi um ano duro, com um nível de sociabilidade e diversão bem restristo, mas com um resultado final muito gratificante e satisfatório – e tem muito mais pela frente nesta jornada. <span style="text-decoration:underline;">Trabalho duro</span>, <span style="text-decoration:underline;">foco</span>, <span style="text-decoration:underline;">dedicação</span> e <span style="text-decoration:underline;">disciplina</span> foram essenciais para me manter no caminho.</p>
<p>Dos poucos momentos de diversão consegui asssisitr alguns dos principais shows de Rock (Progressivo, Metal e Clássico) que estiveram aqui em São Paulo – Fates Warning, Dream Theater, Marillion, Rick Wakeman, Asia, Steven Wilson Band, Unisonic e a formação clássica do Viper:</p>
<p><a href="http://fabiogaluppo.wordpress.com/2012/12/31/retrospectiva-2012/shows-2012/" rel="attachment wp-att-272"><img class="alignnone size-medium wp-image-272" alt="shows 2012" src="http://fabiogaluppo.files.wordpress.com/2012/12/shows-2012.png?w=300&#038;h=195" width="300" height="195" /></a></p>
<p>Além disso, tive a oportunidade de visitar o The Elvis Experience, e relembrar algumas coisas da juventude:</p>
<p><a href="http://fabiogaluppo.wordpress.com/2012/12/31/retrospectiva-2012/the-elvis-experience/" rel="attachment wp-att-273"><img class="alignnone size-full wp-image-273" alt="The Elvis Experience" src="http://fabiogaluppo.files.wordpress.com/2012/12/the-elvis-experience.png?w=640"   /></a></p>
<p>Alguns livros que iniciei em 2012 e pretendo dar continuidade em 2013:</p>
<p><a href="http://fabiogaluppo.wordpress.com/2012/12/31/retrospectiva-2012/books-2012-2013/" rel="attachment wp-att-274"><img class="alignnone size-full wp-image-274" alt="books 2012-2013" src="http://fabiogaluppo.files.wordpress.com/2012/12/books-2012-2013.png?w=640"   /></a></p>
<p>E  o que está no meu iPad:</p>
<p><a href="http://fabiogaluppo.wordpress.com/2012/12/31/retrospectiva-2012/bookshelf_ipad/" rel="attachment wp-att-275"><img class="alignnone size-full wp-image-275" alt="bookshelf_ipad" src="http://fabiogaluppo.files.wordpress.com/2012/12/bookshelf_ipad.png?w=640"   /></a></p>
<p>O que vem pela frente eu não imagino, mas tenho um planejamento a seguir neste próximo ano!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fabiogaluppo.wordpress.com/266/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fabiogaluppo.wordpress.com/266/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiogaluppo.wordpress.com&#038;blog=16617481&#038;post=266&#038;subd=fabiogaluppo&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fabiogaluppo.wordpress.com/2012/12/31/retrospectiva-2012/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/ea84e8f3c9eaaa7ece0054ccf8a35b80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fabiogaluppo</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/12/fabiog_cppamp.jpg?w=300" medium="image">
			<media:title type="html">fabiog_cppamp</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/12/algo-part-1-princeton.png?w=300" medium="image">
			<media:title type="html">algo part 1 - Princeton</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/12/fabiog_and_scala.png?w=300" medium="image">
			<media:title type="html">fabiog_and_scala</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/12/scala-statement-of-accomplishment.png?w=300" medium="image">
			<media:title type="html">scala statement of accomplishment</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/12/fabiog_matematica_aplicada-2012.jpg?w=300" medium="image">
			<media:title type="html">fabiog_matematica_aplicada - 2012</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/12/shows-2012.png?w=300" medium="image">
			<media:title type="html">shows 2012</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/12/the-elvis-experience.png" medium="image">
			<media:title type="html">The Elvis Experience</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/12/books-2012-2013.png" medium="image">
			<media:title type="html">books 2012-2013</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/12/bookshelf_ipad.png" medium="image">
			<media:title type="html">bookshelf_ipad</media:title>
		</media:content>
	</item>
		<item>
		<title>Faster Than a Bullet</title>
		<link>http://fabiogaluppo.wordpress.com/2012/06/30/faster-than-a-bullet/</link>
		<comments>http://fabiogaluppo.wordpress.com/2012/06/30/faster-than-a-bullet/#comments</comments>
		<pubDate>Sat, 30 Jun 2012 03:06:16 +0000</pubDate>
		<dc:creator>fabiogaluppo</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[GPU]]></category>

		<guid isPermaLink="false">https://fabiogaluppo.wordpress.com/?p=239</guid>
		<description><![CDATA[O que pode ser mais rápido do que a bala? This is the GPU&#8230; No GPU in Science, a NVIDIA apresenta o seguinte titulo &#8211; Speed of Light: The Role of Visual and High Performance Computing in Scientific Innovation. Logo, a &#8230; <a href="http://fabiogaluppo.wordpress.com/2012/06/30/faster-than-a-bullet/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiogaluppo.wordpress.com&#038;blog=16617481&#038;post=239&#038;subd=fabiogaluppo&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>O que pode ser <a href="http://www.youtube.com/watch?v=WS6-vI70oc0">mais rápido do que a bala</a>? <em>This is the GPU&#8230;</em></p>
<p>No <a href="http://www.nvidia.com/object/gpu_science.html">GPU in Science</a>, a <a href="http://www.nvidia.com/">NVIDIA</a> apresenta o seguinte titulo &#8211; <em>Speed of Light: The Role of Visual and High Performance Computing in Scientific Innovation</em>. Logo, a “luz” é mais rápida do que a bala (<a href="http://www.wolframalpha.com/input/?i=Speed+of+Light">Speed of Light</a> versus <a href="http://www.wolframalpha.com/input/?i=Speed+of+Bullet">Speed of Bullet</a>). <img class="wlEmoticon wlEmoticon-sarcasticsmile" src="http://fabiogaluppo.files.wordpress.com/2012/06/wlemoticon-sarcasticsmile.png?w=640" alt="Sarcastic smile" /></p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image002.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image002" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image002_thumb.jpg?w=254&#038;h=220" alt="clip_image002" width="254" height="220" border="0" /></a> <a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image004.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image004" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image004_thumb.jpg?w=309&#038;h=220" alt="clip_image004" width="309" height="220" border="0" /></a></p>
<p>Assim, este cara <em>bonitão</em>, <em>simpático</em> e <em>inteligente </em>da foto abaixo tem “brincado” com GPUs a um certo tempo – inclusive isto rendeu algumas palestras sobre CUDA ou C++ AMP.</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image006.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image006" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image006_thumb.jpg?w=285&#038;h=355" alt="clip_image006" width="285" height="355" border="0" /></a></p>
<p>Empolgado pelo assunto<strong> </strong>decidiu escrever uma gentil introdução ao C++ Accelerated Massive Parallelism (C++ AMP) presente no Visual C++ 11 – VCAMP110.DLL:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image008.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image008" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image008_thumb.jpg?w=300&#038;h=183" alt="clip_image008" width="300" height="183" border="0" /></a></p>
<p><strong>Introdução ao C++ AMP</strong></p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image010.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image010" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image010_thumb.jpg?w=440&#038;h=326" alt="clip_image010" width="440" height="326" border="0" /></a></p>
<p><a href="http://msdn.microsoft.com/en-us/library/hh265137(v=vs.110)">C++ Accelerated Massive Parallelism (C++ AMP)</a> é uma tecnologia para usar e abusar dos <em>hardwares</em> que possuem suporte massivo a paralelismo de dados, ou seja, aceleradoras gráficas (GPU) e processadores com suporte a vetorização (por exemplo: <a href="http://software.intel.com/en-us/avx/">AVX</a> e SSE). O que ela tem de especial ou diferente das outras (<a href="http://www.nvidia.com/object/cuda_home_new.html">CUDA</a>, <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ff476331(v=vs.85).aspx">DirectCompute</a> ou <a href="http://www.khronos.org/opencl/">OpenCL</a>)? Acho que vários pontos, assim como pode ser lido num dos <a href="http://www.danielmoth.com/Blog/C-Accelerated-Massive-Parallelism.aspx">primeiros anúncios</a>, e também no <a href="http://blogs.msdn.com/b/vcblog/archive/2011/06/15/introducing-amp.aspx">VCBlog</a>, editado por Diego Dagum, sobre esta tecnologia:</p>
<p>· É puramente C++. Ela se apresenta como uma biblioteca estilo <a href="http://www.sgi.com/tech/stl/">Standard Template Library (STL)</a>. CUDA, DirectCompute e OpenCL são orientados a C. CUDA oferece a biblioteca <a href="http://thrust.github.com/">Thrust</a> para preencher esta lacuna;</p>
<p>· Não é necessário interagir com uma linguagem de <em>shader</em>. No OpenCL esta computação é feita usando GLSL, já no DirectCompute é através de HLSL;</p>
<p>· Não é necessário ter um arquivo com extensão diferente e um <em>compiler driver</em> (<a href="http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/nvcc.pdf">nvcc</a>) como no caso do CUDA;</p>
<p>· É uma <a href="http://blogs.msdn.com/b/nativeconcurrency/archive/2012/02/03/c-amp-open-spec-published.aspx">especificação aberta</a>, logo aparecerão compiladores em outras plataformas.</p>
<p>As capacidades e o modelo de programação do C++ AMP permitem a exploração e a inclusão no universo da programação heterogênea. E isto faz todo o sentido, se pegarmos o último lançamento em termos de computadores pessoais, nota-se que eles possuem processadores <em>multicore </em>e aceleradoras gráficas discretas ou integradas. Nas palestras que ministrei sobre programação com computação heterogênea, mostro a seguinte figura, a qual caracteriza este poder computacional:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image012.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image012" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image012_thumb.jpg?w=616&#038;h=374" alt="clip_image012" width="616" height="374" border="0" /></a></p>
<p>Para mostrar o C++ AMP em ação e fazer uma comparação com CUDA, eu adaptei o exemplo do fractal Julia set do livro <a href="http://www.amazon.com/CUDA-Example-Introduction-General-Purpose-Programming/dp/0131387685/">CUDA by Example</a>. É utilizado OpenGL para exibir o fractal.</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image014.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image014" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image014_thumb.jpg?w=561&#038;h=259" alt="clip_image014" width="561" height="259" border="0" /></a></p>
<p>Aqui temos o trecho que resolve o exemplo através da CPU e da GPU respectivamente. A versão CPU usa o que nós programadores C++ estamos acostumados. Já a versão GPU, apresenta novas abstrações providas pelo C++ AMP, para realização desta computação na aceleradora gráfica.</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image016.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image016" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image016_thumb.jpg?w=641&#038;h=107" alt="clip_image016" width="641" height="107" border="0" /></a></p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image018.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image018" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image018_thumb.jpg?w=646&#038;h=229" alt="clip_image018" width="646" height="229" border="0" /></a></p>
<p>Estas novas abstrações são a mais pura aplicação dos idiomas que já conhecemos em C++. Por exemplo, array_view, não parece um array ou vector da STL? O parallel_for_each não segue o mesmo estilo da parallel_for_each da <a href="http://msdn.microsoft.com/en-us/library/dd492857">PPL</a> e da <a href="http://threadingbuildingblocks.org/docs/help/reference/algorithms/parallel_for_each_func.htm">TBB</a>? Portanto, é bem tranquilo para programador C++ adotar este modelo de programação.</p>
<p>Provavelmente a novidade fica por conta do modificador restrict. Este modificador determina o contexto, ou as restrições que serão impostas pela função a ser executada. Isto faz sentido, pois o corpo desta função contém um código que será transformado num <em>assembly</em> compatível com o dispositivo <em>target</em>, no caso a GPU. Então o restrict impõe as regras, ou indica as instruções, que serão permitidas no corpo da função com o modificador. Por <em>default</em>, qualquer função (ou membro do tipo função) num compilador que suporta C++ AMP é restrict(cpu), ou seja, roda código compatível com a CPU <em>target</em>. O restrict não está limitado a um valor, como pode ser visto no membro do tipo função Generator:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image020.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image020" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image020_thumb.jpg?w=635&#038;h=283" alt="clip_image020" width="635" height="283" border="0" /></a></p>
<p>Neste caso, a função suporta apenas compilar o que seria a intersecção entre as funcionalidades da CPU e da GPU. Assim, ela poderá ser chamada a partir de qualquer um dos contextos de execução indicados.</p>
<p>A versão do C++ AMP do exemplo apresentado exibe um desempenho na GPU 40,5% superior à versão CPU – este valor varia de acordo com os dispositivos. Ambos estão usando os <em>flags </em>de otimização do compilador (no caso da CPU o código gerado usa SSE).</p>
<p>Quando um programa na CPU interage com a GPU, há um conceito de <strong><em>host</em></strong> (CPU) e <strong><em>device </em></strong>(GPU), bem como existe uma hierarquia de memória na GPU diferente daquele que estamos acostumados com a CPU:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image022.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image022" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image022_thumb.jpg?w=575&#038;h=397" alt="clip_image022" width="575" height="397" border="0" /></a></p>
<p>Basicamente, é necessário transferir a memória do <em>host</em> para o <em>device</em>, disparar o “<em>kernel</em>” (no caso do C++ AMP isto é feito com o parallel_for_each) e após o processamento, o resultado da computação é transferido da memória do <em>device</em> para o <em>host</em>.</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image024.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image024" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image024_thumb.jpg?w=518&#038;h=364" alt="clip_image024" width="518" height="364" border="0" /></a></p>
<p>Este é um papel desempenhado pelo <a href="http://msdn.microsoft.com/en-us/library/hh305260(v=VS.110).aspx">array_view</a>. Quando usado dentro de um contexto de execução da GPU, ele é responsável por fazer a transferência dos dados de forma transparente. Ao final é recomendado usar o método <a href="http://msdn.microsoft.com/en-us/library/hh416782(v=vs.110)">synchronize</a> para atualização dos dados na CPU.</p>
<p>O array_view não está limitado apenas para a transferência dos dados entre os dispositivos, ele é um recurso que possibilita a visão (<em>reshape</em>) de vários modos para dados de um std::array, ou de um std::vector, ou de uma área densa e contínua, como por exemplo um ponteiro de uma sequência de floats alocada dinamicamente . Por exemplo, é possível enxergar um vector&lt;int&gt; com 10 elementos como uma matriz de 2&#215;5. Na terminologia da STL, isto significa <em>container </em><em>adapter</em>.</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image026.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image026" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image026_thumb.jpg?w=453&#038;h=238" alt="clip_image026" width="453" height="238" border="0" /></a></p>
<p>O array_view é muito simples de usar, os argumentos do <em>template </em>indicam o tipo e a dimensão, e o seu construtor aceita a tamanho e objeto a ser adaptado.</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image028.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image028" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image028_thumb.jpg?w=516&#038;h=134" alt="clip_image028" width="516" height="134" border="0" /></a></p>
<p>O array_view trabalha em conjunto com o <a href="http://msdn.microsoft.com/en-us/library/hh305279(v=VS.110).aspx">extent</a>, cujo representa os limites da visão. O membro operator() do array_view permite o acesso de até 3 dimensões. Além disso, há disponível a classe <a href="http://msdn.microsoft.com/en-us/library/hh305273(v=vs.110)">index</a> que representa as posições de cada coordenada no espaço cartesiano. Os exemplos a seguir sintetizam a usabilidade destas classes:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image030.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image030" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image030_thumb.jpg?w=488&#038;h=137" alt="clip_image030" width="488" height="137" border="0" /></a></p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image032.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image032" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image032_thumb.jpg?w=498&#038;h=142" alt="clip_image032" width="498" height="142" border="0" /></a></p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image034.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image034" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image034_thumb.jpg?w=507&#038;h=155" alt="clip_image034" width="507" height="155" border="0" /></a></p>
<p>Note que o extent e o index recebem em seus construtores das dimensões mais significativas a menos significativas. Isto quer dizer, se for apenas uma dimensão, o único parâmetro representa o eixo X. Se forem duas dimensões, o primeiro parâmetro representa o eixo Y e o segundo o eixo X, e assim sucessivamente.</p>
<p>Como visto no método Generator acima, é possível trabalhar com tipos compostos dentro de um domínio restrict. Este é o caso da classe ComplexNumber utilizada no exemplo:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image036.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image036" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image036_thumb.jpg?w=429&#038;h=291" alt="clip_image036" width="429" height="291" border="0" /></a></p>
<p>Como descrito anteriormente, o <a href="http://msdn.microsoft.com/en-us/library/hh305254(v=VS.110).aspx">parallel_for_each</a> tem a responsabilidade de disparar uma computação. Normalmente isto é feito com um <em>lambda</em> ou um <em>functor</em>, onde estes elementos devem ser especificados com restrict. O uso da função parallel_for_each é exibido no clássico exemplo de multiplicação de matrizes. Ela possui diversas sobrecargas, no exemplo o primeiro parâmetro representa as dimensões e o tamanho do <em>container</em>. Para este caso, o C++ AMP possui uma heurística para determinar como será o particionamento deste <em>container</em> entre as <em>threads </em>da GPU.</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image038.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image038" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image038_thumb.jpg?w=512&#038;h=235" alt="clip_image038" width="512" height="235" border="0" /></a></p>
<p>O especificador <a href="http://msdn.microsoft.com/en-us/library/hh388953(v=VS.110).aspx">restrict</a>, parametrizado com amp, indica restrições dentro do contexto da aceleradora, no caso, a GPU. Desta maneira, a função é restrita em termos de capacidade com relação à versão padrão pura – restrict(cpu). Portanto as seguintes ações são desabilitadas quando uma função possuir tal restrição &#8211; amp: recursão, variáveis com volatile, funções virtuais, ponteiros para funções, ponteiros para membros do tipo funções, ponteiros em estruturas, ponteiros para ponteiros, goto, <em>labels</em>, try, catch, throw, variáveis globais, variáveis estáticas, dynamic_cast, typeid, bloco asm e varargs. O restrict do C++ AMP não tem relação com o restrict do C99.</p>
<p>No C++ AMP, através da classe <a href="http://msdn.microsoft.com/en-us/library/hh537970(v=vs.110)">tiled_extent</a>, é permitido controlar o agrupamento e a granularidade das <em>threads</em> da aceleradora, no caso, uma GPU. Isto permite melhor explorar o modelo de memória do dispositivo. No exemplo a seguir, uma multiplicação de matrizes, o tile_extent é utilizado via o método <a href="http://msdn.microsoft.com/en-us/library/hh537955(v=vs.110)">tile</a> do membro extend da instância array_view (c_view).</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image040.jpg"><img style="border:0 currentColor;padding-top:0;padding-right:0;padding-left:0;display:inline;background-image:none;" title="clip_image040" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image040_thumb.jpg?w=578&#038;h=292" alt="clip_image040" width="578" height="292" border="0" /></a></p>
<p>Os índices referentes à técnica de <em>tiling </em>devem ser interpretados conforme a figura abaixo:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/tile_static.png"><img style="border:0 currentColor;padding-top:0;padding-right:0;padding-left:0;display:inline;background-image:none;" title="tile_static" src="http://fabiogaluppo.files.wordpress.com/2012/06/tile_static-_thumb.jpg?w=517&#038;h=570" alt="tile_static" width="517" height="570" border="0" /></a></p>
<p>Imagine que existe uma matriz 8&#215;8, onde se deseja dividi-la em quatro blocos (4&#215;4 threads por bloco), sendo que cada um destes blocos serão tocados por <em>threads</em> distintas e estes blocos possuem uma característica peculiar onde suas threads podem acessar memória compartilhada (<em>recap</em>: GPU Memory Model) . A divisão destes blocos é representada no exemplo por c_view.extend.tile&lt;4,4&gt;(). Dentro do <em>lambda</em>, o acesso à memória é feito através dos valores dos índices do tipo <a href="http://msdn.microsoft.com/en-us/library/hh305244(v=vs.110)">tiled_index</a>, cujos membros global, local, tile e tile_origin representam o índice em relação a matriz total, o índice em relação a submatriz, o índice ao qual o tile o elemento está relacionado e qual a origem deste tile, respectivamente – na figura anterior foram relacionados alguns valores como referencia a cada um destes membros.</p>
<p>No modelo de memória das GPUs existem alguns tipos ou categorias de memória, onde as interessam neste momento são duas: a global e a compartilhada.</p>
<p>A partir da memória global é onde ocorre à transferência de dados do <em>host</em> (CPU) para o <em>device</em> (GPU), esta transferência (ou cópia) acontece de forma transparente quando um array_view é consumido dentro de um lambda com restrict(amp). No entanto, é possível controlar esta cópia manualmente com funções estilo STL (<a href="http://msdn.microsoft.com/en-us/library/hh305274(v=vs.110)">copy</a> ou <a href="http://msdn.microsoft.com/en-us/library/hh305257(v=vs.110)">copy_async</a>). A memória global pode ser acessada de qualquer lugar dentro da GPU &#8211; por isto ela tenha o nome memória global, certo? <img class="wlEmoticon wlEmoticon-smilewithtongueout" src="http://fabiogaluppo.files.wordpress.com/2012/06/wlemoticon-smilewithtongueout.png?w=640" alt="Smile with tongue out" /></p>
<p>A memória compartilhada é limitada as <em>threads </em>dentro de um bloco. Ela oferece desempenho superior à memória global.</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image044.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image044" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image044_thumb.jpg?w=208&#038;h=319" alt="clip_image044" width="208" height="319" border="0" /></a> <a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image046.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image046" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image046_thumb.jpg?w=386&#038;h=319" alt="clip_image046" width="386" height="319" border="0" /></a><br />
<span style="font-size:xx-small;">Fonte: “Shared memory is a key enabler for many high-performance CUDA applications” &#8211; <a href="http://www.nvidia.com/content/PDF/fermi_white_papers/NVIDIAFermiComputeArchitectureWhitepaper.pdf">NVIDIA Fermi Architecture Whitepaper</a></span></p>
<p>Para usar memória compartilhada no C++ AMP, uma nova palavra reservada é introduzida na especificação: <a href="http://msdn.microsoft.com/en-us/library/hh388954(v=VS.110).aspx">tile_static</a> (a outra é restrict). No exemplo, tile_static qualifica as matrizes a_shared e b_shared para residirem na memória compartilhada do bloco (cada bloco terá a sua própria cópia). No exemplo, de multiplicação de matrizes a ideia é que cada bloco tenha seu cache, ao qual o programador gerencia manualmente (diferente dos caches da CPU), onde para cada cache do bloco são transferidos os dados necessários.</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image048.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image048" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image048_thumb.jpg?w=378&#038;h=372" alt="clip_image048" width="378" height="372" border="0" /></a></p>
<p>A figura acima exibe os dados necessários para cada elemento da matriz resultado. No bloco (0,0) de C são necessários os dados dos blocos (0,0) e (0,1) de A e os dados dos blocos (0,0) e (1,0) de B. Logo, a estratégia desta computação é trazer para memória compartilhada os dados que serão usados no bloco resultado, visto que os dados dos blocos de A e B serão acessados mais de uma vez para computar os elementos do bloco C. Note que cada elemento destes blocos representa uma <em>thread</em>, e para calcular um elemento na matriz C é obrigatório todos os dados estejam transferidos para memória compartilhada. Onde há threads pode haver <em>race condition</em>. Neste caso, é necessário a sincronização, no caso do exemplo, isto é feito com o idx.barrier.wait(). O idx representa o tiled_index referente ao bloco corrente, o wait espera todas as threads daquele bloco alcançarem o ponto da barreira antes de liberar para os próximos passos. Em relação ao exemplo, a primeira sincronização aguarda a memória compartilhada ter todos os dados preenchidos – para a multiplicação de matrizes, a_shared precisará de todas as colunas de uma determinada linha e b_shared precisará de todas as linhas de uma determinada coluna.</p>
<p>Se quiser saber mais, <a href="http://www.danielmoth.com/Blog/">Daniel Moth</a> escreveu um ótimo artigo introdutório sobre <a href="http://msdn.microsoft.com/en-us/magazine/hh882447.aspx"><em>tiling</em> com C++ AMP</a>.</p>
<p>Quando temos computação envolvendo paralelismo massivo de dados é inerente que teremos cálculos a fazer, e para isto precisamos de um conjunto de funções matemáticas para nos ajudar. O C++ AMP oferece este conjunto de funções em dois sabores (menor precisão, somente float, maior desempenho – <a href="http://msdn.microsoft.com/en-us/library/hh553048(v=vs.110)">fast_math</a>, e maior precisão, float ou double, menor desempenho – <a href="http://msdn.microsoft.com/en-us/library/hh553049(v=vs.110)">precise_math</a>) – elas são acessadas através do <em>header </em>amp_math.h.</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image050.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image050" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image050_thumb.jpg?w=525&#038;h=106" alt="clip_image050" width="525" height="106" border="0" /></a></p>
<p>As funções que residem nestes <em>namespaces</em> possuem assinaturas compatíveis com as funções encontradas no <em>header </em>cmath. Logo, é possível transferir qualquer tipo de “continha” para a GPU processar – como é o caso das trajetórias de balística exemplificado abaixo:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image052.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image052" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image052_thumb.jpg?w=348&#038;h=629" alt="clip_image052" width="348" height="629" border="0" /></a></p>
<p>Note que neste exemplo, ao invés do array_view foi utilizado o <a href="http://msdn.microsoft.com/en-us/library/hh305267(v=vs.110)">array</a>. O array tem o mesmo “<em>look’n’feel</em>” do <em>container</em> array da STL, porém este reside no domínio do C++ AMP. Ele representa uma área previamente alocada na aceleradora, tendo como características fundamentais: suas transferências são explicitas, usando o copy ou copy_async; no <em>lambda </em>só podem ser capturados por referencia.</p>
<p>No C++ AMP existe a capacidade de enumerar as aceleradoras (<a href="http://msdn.microsoft.com/en-us/library/hh350895(v=vs.110)">accelerator</a>) existentes, bem como executar uma computação numa aceleradora especifica – a execução é feita através de um <a href="http://msdn.microsoft.com/en-us/library/hh350919(v=vs.110)">accelerator_view</a>, cujo representa uma abstração ou visão da aceleradora. O C++ AMP considera a aceleradora um <em>hardware</em> capacitado a executar computação de dados em paralelo, isto pode ser um dispositivo conectado a um <em>bus </em>PCI Express, como uma GPU, ou também uma CPU &#8211; de preferencia com registradores vetoriais.</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image054.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image054" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image054_thumb.jpg?w=473&#038;h=174" alt="clip_image054" width="473" height="174" border="0" /></a></p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image056.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image056" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image056_thumb.jpg?w=474&#038;h=459" alt="clip_image056" width="474" height="459" border="0" /></a></p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image058.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image058" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image058_thumb.jpg?w=416&#038;h=243" alt="clip_image058" width="416" height="243" border="0" /></a></p>
<p>O accelerator_view é obtido através de um accelerator, ele é passado para uma das sobrecargas do parallel_for_each, orientando-o onde deve ser executado o código contido no <em>lambda</em>.</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image060.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image060" src="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image060_thumb.jpg?w=385&#038;h=264" alt="clip_image060" width="385" height="264" border="0" /></a></p>
<p>Se desejar se aprofundar neste assunto o <a href="http://blogs.msdn.com/b/nativeconcurrency/">Native Concurrency MSDN Blog</a> é uma ótima referencia! Assim como os <em><a href="http://channel9.msdn.com/Tags/c++-accelerated-massive-parallelism">screencasts</a></em> do <a href="http://www.danielmoth.com/Blog/">Daniel Moth</a> e o <a href="http://www.gregcons.com/cppamp/">futuro livro</a> da <a href="http://www.gregcons.com/Kateblog/">Kate Gregory</a> e do <a href="http://www.ademiller.com/blogs/tech/">Ade Miller</a>. (Se livros em português vendessem bem, eu até empolgaria em escrever sobre este assunto. Mas no Brasil é a maior decepção escrever um bom livro técnico na língua nativa. <img class="wlEmoticon wlEmoticon-sadsmile" src="http://fabiogaluppo.files.wordpress.com/2012/06/wlemoticon-sadsmile.png?w=640" alt="Sad smile" />).</p>
<p>Faça o <a href="https://skydrive.live.com/embed?cid=B671A4645AF2F2F4&amp;resid=B671A4645AF2F2F4%21518&amp;authkey=AFVAtXI9uaX4DkA">download do código fonte e binário dos exemplos de C++ AMP</a> e <em>rock’n’roll</em>&#8230; <img class="wlEmoticon wlEmoticon-hotsmile" src="http://fabiogaluppo.files.wordpress.com/2012/06/wlemoticon-hotsmile.png?w=640" alt="Hot smile" /></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fabiogaluppo.wordpress.com/239/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fabiogaluppo.wordpress.com/239/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiogaluppo.wordpress.com&#038;blog=16617481&#038;post=239&#038;subd=fabiogaluppo&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fabiogaluppo.wordpress.com/2012/06/30/faster-than-a-bullet/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/ea84e8f3c9eaaa7ece0054ccf8a35b80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fabiogaluppo</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/wlemoticon-sarcasticsmile.png" medium="image">
			<media:title type="html">Sarcastic smile</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image002_thumb.jpg" medium="image">
			<media:title type="html">clip_image002</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image004_thumb.jpg" medium="image">
			<media:title type="html">clip_image004</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image006_thumb.jpg" medium="image">
			<media:title type="html">clip_image006</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image008_thumb.jpg" medium="image">
			<media:title type="html">clip_image008</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image010_thumb.jpg" medium="image">
			<media:title type="html">clip_image010</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image012_thumb.jpg" medium="image">
			<media:title type="html">clip_image012</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image014_thumb.jpg" medium="image">
			<media:title type="html">clip_image014</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image016_thumb.jpg" medium="image">
			<media:title type="html">clip_image016</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image018_thumb.jpg" medium="image">
			<media:title type="html">clip_image018</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image020_thumb.jpg" medium="image">
			<media:title type="html">clip_image020</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image022_thumb.jpg" medium="image">
			<media:title type="html">clip_image022</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image024_thumb.jpg" medium="image">
			<media:title type="html">clip_image024</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image026_thumb.jpg" medium="image">
			<media:title type="html">clip_image026</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image028_thumb.jpg" medium="image">
			<media:title type="html">clip_image028</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image030_thumb.jpg" medium="image">
			<media:title type="html">clip_image030</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image032_thumb.jpg" medium="image">
			<media:title type="html">clip_image032</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image034_thumb.jpg" medium="image">
			<media:title type="html">clip_image034</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image036_thumb.jpg" medium="image">
			<media:title type="html">clip_image036</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image038_thumb.jpg" medium="image">
			<media:title type="html">clip_image038</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image040_thumb.jpg" medium="image">
			<media:title type="html">clip_image040</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/tile_static-_thumb.jpg" medium="image">
			<media:title type="html">tile_static</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/wlemoticon-smilewithtongueout.png" medium="image">
			<media:title type="html">Smile with tongue out</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image044_thumb.jpg" medium="image">
			<media:title type="html">clip_image044</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image046_thumb.jpg" medium="image">
			<media:title type="html">clip_image046</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image048_thumb.jpg" medium="image">
			<media:title type="html">clip_image048</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image050_thumb.jpg" medium="image">
			<media:title type="html">clip_image050</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image052_thumb.jpg" medium="image">
			<media:title type="html">clip_image052</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image054_thumb.jpg" medium="image">
			<media:title type="html">clip_image054</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image056_thumb.jpg" medium="image">
			<media:title type="html">clip_image056</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image058_thumb.jpg" medium="image">
			<media:title type="html">clip_image058</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/clip_image060_thumb.jpg" medium="image">
			<media:title type="html">clip_image060</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/wlemoticon-sadsmile.png" medium="image">
			<media:title type="html">Sad smile</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/06/wlemoticon-hotsmile.png" medium="image">
			<media:title type="html">Hot smile</media:title>
		</media:content>
	</item>
		<item>
		<title>&#955;ό&#947;&#959;&#962; and the Rise of Turtle Graphics</title>
		<link>http://fabiogaluppo.wordpress.com/2012/04/29/%cf%8c-and-the-rise-of-turtle-graphics/</link>
		<comments>http://fabiogaluppo.wordpress.com/2012/04/29/%cf%8c-and-the-rise-of-turtle-graphics/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 19:55:10 +0000</pubDate>
		<dc:creator>fabiogaluppo</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Computer Graphics]]></category>
		<category><![CDATA[Direct2D]]></category>
		<category><![CDATA[F#]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[Windows SDK]]></category>

		<guid isPermaLink="false">https://fabiogaluppo.wordpress.com/?p=165</guid>
		<description><![CDATA[Logos é uma palavra forte de origem grega, ela pode significar razão, palavra ou discurso. Os próprios gregos foram responsáveis pela Trigonometria, cuja etimologia é a composição das palavras trigōnon (triângulo) e metron (medida) – algo como o estudo das &#8230; <a href="http://fabiogaluppo.wordpress.com/2012/04/29/%cf%8c-and-the-rise-of-turtle-graphics/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiogaluppo.wordpress.com&#038;blog=16617481&#038;post=165&#038;subd=fabiogaluppo&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a href="http://pt.wikipedia.org/wiki/Logos">Logos</a> é uma palavra forte de origem grega, ela pode significar razão, palavra ou discurso. Os próprios gregos foram responsáveis pela <a href="http://en.wikipedia.org/wiki/Trigonometry">Trigonometria</a>, cuja etimologia é a composição das palavras <em>trigōnon</em> (triângulo) e <em>metron</em> (medida) – algo como o estudo das medidas do triângulo (3 lados e 3 ângulos). Eles também foram responsáveis pelas inserções da <a href="http://en.wikipedia.org/wiki/Geometry">Geometria</a> (γεωμετρία = terra + medida) Euclidiana. Ambas as disciplinas são ramificações da Matemática, sendo que elas, juntamente com <a href="http://en.wikipedia.org/wiki/Vector_calculus">Análise Vetorial</a> e <a href="http://en.wikipedia.org/wiki/Quaternion">Quaternion</a> são os <span style="text-decoration:underline;">elementos</span> fundamentais da Matemática para Computação Gráfica.</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image002.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image002" src="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image002_thumb.jpg?w=312&#038;h=307" alt="clip_image002" width="312" height="307" border="0" /></a></p>
<p><span style="font-size:xx-small;">Escola de Atenas e os Elementos de Euclides</span></p>
<p>Se juntarmos todos estes ingredientes, misturarmos e adicionarmos algumas palavras mágicas (<em>spells</em>) – dentro de contexto da Computação, obviamente. Podemos extrair um produto fundamental composto por um software gráfico e educacional cujo “logo” (de logotipo) é uma tartaruga.</p>
<p>Sim, é sobre isto mesmo que estou falando, da linguagem de programação <a href="http://en.wikipedia.org/wiki/Logo_(programming_language)">Logo</a>. Que possui uma fundação, que a promove: <a href="http://el.media.mit.edu/logo-foundation/logo/programming.html">Logo Foundation</a>. O mais interessante, é que Logo é influenciada pela linguagem de <a href="http://en.wikipedia.org/wiki/John_McCarthy_(computer_scientist)">John McCarthy</a>, e ele dispensa apresentação. Fora isto, existe outra ferramenta educacional criada pela Microsoft, o Small Basic, que promove a linguagem Basic.</p>
<p>O Basic aquele que deixou <a href="http://en.wikipedia.org/wiki/Bill_Gates">Gates</a> e <a href="http://en.wikipedia.org/wiki/Paul_Allen">Allen</a> famosos. E também foi minha primeira linguagem de programação (que com o passar do tempo houve uma relação entre amor e ódio, hoje existe muito respeito para com ela). O ambiente do <a href="http://smallbasic.com/">Microsoft Small Basic</a> possui um objeto chamado <a href="http://msdn.microsoft.com/en-us/beginner/gg605166.aspx">Turtle</a>, que permite você fazer a mesma coisa que um ambiente Logo, só que em Basic – <a href="http://www.kidwaresoftware.com/sbkids.htm">muito recomendado para a garotada</a>, ou para os profissionais que ainda acham que programar para SharePoint (ou qualquer outro produto) é programar. (Nada pessoal, com SharePoint foi apenas uma escolha aleatória baseado em popularidade e falácia, poderia ser BizTalk, sei lá <img class="wlEmoticon wlEmoticon-smilewithtongueout" style="border-style:none;" src="http://fabiogaluppo.files.wordpress.com/2012/04/wlemoticon-smilewithtongueout.png?w=640" alt="Smile with tongue out" />).</p>
<p><strong>The rise of Turtle Graphics <img class="wlEmoticon wlEmoticon-xbox" style="border-style:none;" src="http://fabiogaluppo.files.wordpress.com/2012/04/wlemoticon-xbox.png?w=640" alt="Xbox" /></strong></p>
<p>Há duas semanas, no mesmo dia que o <a href="http://www.fateswarning.com/">Fates Warning</a> tocou no <a href="http://www.youtube.com/watch?v=qU6n51ZnVIc&amp;list=UUtbk6q2JYzSl0YL_91vaPFg&amp;index=12&amp;feature=plcp">Brasil</a>, tive a oportunidade de ministrar uma palestra sobre Scala. E uma das minhas ideias era criar um exemplo especial fora do contexto do Scala. (O Fates Warning é uma das minhas bandas favoritas desde a adolescência). <img class="wlEmoticon wlEmoticon-flirtmale" style="border-style:none;" src="http://fabiogaluppo.files.wordpress.com/2012/04/wlemoticon-flirtmale.png?w=640" alt="Flirt male" /></p>
<p>O exemplo especial foi construir um ambiente de <a href="http://en.wikipedia.org/wiki/Turtle_graphics">Turtle Graphics</a> para Windows usando C++, Direct2D, Java e Scala. E estendi este exemplo para minha segunda linguagem favorita, o F#. Ou seja, programei o <em>engine</em> e seu modelo de <em>scripting </em>compatíveis com a JVM e com a CLR.</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0024.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image002[4]" src="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0024_thumb.jpg?w=698&#038;h=522" alt="clip_image002[4]" width="698" height="522" border="0" /></a></p>
<p>Na verdade, todo este trabalho surgiu pela oportunidade da palestra (Palestra Fundamentos de Scala). No entanto, criar este ambiente era uma idéia antiga, impulsionada pelo livro que está ai em cima: <a href="http://www.crcpress.com/product/isbn/9781439803349">An Integrated Introduction to Computer Graphics and Geometric Modeling</a> de Ronald Goldman. Neste livro, ele começa dizendo algo do tipo: “vamos começar aprender Computação Gráfica e sua Matemática usando o <em>Turtle Graphics</em>”. Assim, ele sugere o uso do Logo ou que você crie seu ambiente. Bem, eu optei pelo segundo, seguindo meu instinto de programador C++. <img class="wlEmoticon wlEmoticon-devil" style="border-style:none;" src="http://fabiogaluppo.files.wordpress.com/2012/04/wlemoticon-devil.png?w=640" alt="Devil" /></p>
<p>Após fazer um rápido protótipo com Excel para validar as equações trigonométricas, li rapidamente a documentação do Direct2D para extrair o que eu precisava codificar e sai codificando. Com <em>engine</em> finalizado, parti para a parte do <em>scripting</em> e fiz uma coisa inédita – usei <a href="http://en.wikipedia.org/wiki/Java_Native_Interface">Java Native Interfaces</a> (JNI), para expor o código nativo para <a href="http://www.scala-lang.org/">Scala</a> – sinceramente, foi bem tranquilo e divertido – e para aqueles que gostariam de saber: Sim, estou programando em Java, afinal (agora) sou um programador sem fronteiras! A mesma coisa eu fiz para o <a href="http://msdn.microsoft.com/en-us/vstudio/hh388569">F#</a>, que no caso pode usar <a href="http://en.wikipedia.org/wiki/Platform_Invocation_Services">P/Invoke</a> diretamente.</p>
<p>Camada de interoperabilidade do <em>scripting</em> com o Java:</p>
<pre class="csharpcode">import java.nio.ByteBuffer;

final <span class="kwrd">class</span> JNITurtle
{
    <span class="kwrd">private</span> native ByteBuffer create();
    <span class="kwrd">private</span> native <span class="kwrd">void</span> rotate(ByteBuffer hTurtle, <span class="kwrd">float</span> angle);
    <span class="kwrd">private</span> native <span class="kwrd">void</span> resize(ByteBuffer hApp, <span class="kwrd">float</span> size);
    <span class="kwrd">private</span> native <span class="kwrd">void</span> move(ByteBuffer hApp, <span class="kwrd">int</span> distance);
    <span class="kwrd">private</span> native <span class="kwrd">void</span> speed(ByteBuffer hApp, <span class="kwrd">int</span> <span class="kwrd">value</span>);
    <span class="kwrd">private</span> native <span class="kwrd">void</span> destroy(ByteBuffer hApp);

    <span class="kwrd">private</span> boolean disposed;
    <span class="kwrd">private</span> ByteBuffer hTurtle;

    JNITurtle()
    {
        disposed = <span class="kwrd">false</span>;
        hTurtle = create();
    }

    <span class="kwrd">static</span>
    {
        System.loadLibrary(<span class="str">"Turtle"</span>);
    }

    <span class="kwrd">public</span> <span class="kwrd">void</span> rotate(<span class="kwrd">float</span> angle)
    {
        rotate(hTurtle, angle);
    }

    <span class="kwrd">public</span> <span class="kwrd">void</span> resize(<span class="kwrd">float</span> size)
    {
        resize(hTurtle, size);
    }

    <span class="kwrd">public</span> <span class="kwrd">void</span> move(<span class="kwrd">int</span> distance)
    {
        move(hTurtle, distance);
    }

    <span class="kwrd">public</span> <span class="kwrd">void</span> speed(<span class="kwrd">int</span> <span class="kwrd">value</span>)
    {
        speed(hTurtle, <span class="kwrd">value</span>);
    }

    <span class="kwrd">public</span> <span class="kwrd">void</span> dispose()
    {
        <span class="kwrd">if</span>(!disposed)
        {
           disposed = <span class="kwrd">true</span>;
           destroy(hTurtle);
        }
    }

    <span class="kwrd">protected</span> <span class="kwrd">void</span> finalize()
    {
        dispose();
    }
}</pre>
<p>Camada de interoperabilidade do <em>scripting</em> com o F#:</p>
<pre class="csharpcode" style="width:722px;height:949px;"><span class="kwrd">namespace</span> global

open System
open System.Runtime.InteropServices

module <span class="kwrd">private</span> API =
    [&lt;DllImport(<span class="str">@"Turtle.dll"</span>, CallingConvention = CallingConvention.Cdecl)&gt;]
    <span class="kwrd">extern</span> nativeint create()
    [&lt;DllImport(<span class="str">@"Turtle.dll"</span>, CallingConvention = CallingConvention.Cdecl)&gt;]
    <span class="kwrd">extern</span> <span class="kwrd">void</span> rotate(nativeint hApp, float32 angle)
    [&lt;DllImport(<span class="str">@"Turtle.dll"</span>, CallingConvention = CallingConvention.Cdecl)&gt;]
    <span class="kwrd">extern</span> <span class="kwrd">void</span> resize(nativeint hApp, float32 size)
    [&lt;DllImport(<span class="str">@"Turtle.dll"</span>, CallingConvention = CallingConvention.Cdecl)&gt;]
    <span class="kwrd">extern</span> <span class="kwrd">void</span> move(nativeint hApp, <span class="kwrd">int</span> distance)
    [&lt;DllImport(<span class="str">@"Turtle.dll"</span>, CallingConvention = CallingConvention.Cdecl)&gt;]
    <span class="kwrd">extern</span> <span class="kwrd">void</span> speed(nativeint hApp, <span class="kwrd">int</span> distance)
    [&lt;DllImport(<span class="str">@"Turtle.dll"</span>, CallingConvention = CallingConvention.Cdecl)&gt;]
    <span class="kwrd">extern</span> <span class="kwrd">void</span> destroy(nativeint hApp)

[&lt;Sealed&gt;]
type <span class="kwrd">private</span> PInvokeTurtle() =
    let mutable disposed = <span class="kwrd">false</span>
    let mutable hTurtle = API.create()

    <span class="kwrd">override</span> <span class="kwrd">this</span>.Finalize() = <span class="kwrd">this</span>.close()

    member <span class="kwrd">this</span>.rotate(angle: float32) = API.rotate(hTurtle, angle)

    member <span class="kwrd">this</span>.resize(size: float32) = API.resize(hTurtle, size)

    member <span class="kwrd">this</span>.move(distance: <span class="kwrd">int</span>) = API.move(hTurtle, distance)

    member <span class="kwrd">this</span>.speed(<span class="kwrd">value</span>: <span class="kwrd">int</span>) = API.speed(hTurtle, <span class="kwrd">value</span>)

    member <span class="kwrd">private</span> <span class="kwrd">this</span>.close() = 
        <span class="kwrd">if</span> not disposed then 
            disposed &lt;- <span class="kwrd">true</span>
            API.destroy(hTurtle)

    <span class="kwrd">interface</span> IDisposable with
        member <span class="kwrd">this</span>.Dispose() = GC.SuppressFinalize(<span class="kwrd">this</span>); <span class="kwrd">this</span>.close()</pre>
<p>Estes trechos de código interagem com a fachada que exporta o modelo de <em>scripting</em>: <em>jnimain.cpp</em> e <em>dllmain.cpp</em> do código nativo. Tanto o JNITurtle quanto o PInvokeTurtle implementam suas estratégias para liberação de recursos via <em>dispose pattern</em>.</p>
<p>jnimain.cpp:</p>
<pre class="csharpcode" style="width:846px;height:894px;">#include <span class="str">"scriptable.hpp"</span>

#include &lt;jni.h&gt;

<span class="kwrd">extern</span> <span class="str">"C"</span> 
{
    JNIEXPORT jobject JNICALL Java_JNITurtle_create(JNIEnv* env, jobject)
    {
        <span class="kwrd">return</span> env-&gt;NewDirectByteBuffer(scriptable::create(), 0);
    }

    JNIEXPORT <span class="kwrd">void</span> JNICALL Java_JNITurtle_rotate(JNIEnv* env, jobject, jobject hTurtle, jfloat angle)
    {
        auto turtlePtr = reinterpret_cast&lt;scriptable::TurtlePtr&gt;(env-&gt;GetDirectBufferAddress(hTurtle));
        scriptable::rotate(turtlePtr, angle);
    }

    JNIEXPORT <span class="kwrd">void</span> JNICALL Java_JNITurtle_resize(JNIEnv* env, jobject, jobject hTurtle, jfloat size)
    {
        auto turtlePtr = reinterpret_cast&lt;scriptable::TurtlePtr&gt;(env-&gt;GetDirectBufferAddress(hTurtle));
        scriptable::resize(turtlePtr, size);
    }

    JNIEXPORT <span class="kwrd">void</span> JNICALL Java_JNITurtle_move(JNIEnv* env, jobject, jobject hTurtle, jint distance)
    {
        auto turtlePtr = reinterpret_cast&lt;scriptable::TurtlePtr&gt;(env-&gt;GetDirectBufferAddress(hTurtle));
        scriptable::move(turtlePtr, distance);
    }

    JNIEXPORT <span class="kwrd">void</span> JNICALL Java_JNITurtle_speed(JNIEnv* env, jobject, jobject hTurtle, jint speed)
    {
        auto turtlePtr = reinterpret_cast&lt;scriptable::TurtlePtr&gt;(env-&gt;GetDirectBufferAddress(hTurtle));
        scriptable::speed(turtlePtr, speed);
    }

    JNIEXPORT <span class="kwrd">void</span> JNICALL Java_JNITurtle_destroy(JNIEnv* env, jobject, jobject hTurtle)
    {
        auto turtlePtr = reinterpret_cast&lt;scriptable::TurtlePtr&gt;(env-&gt;GetDirectBufferAddress(hTurtle));
        scriptable::destroy(turtlePtr);
    }
}</pre>
<p>dllmain.cpp:</p>
<pre class="csharpcode" style="width:773px;height:722px;">#include <span class="str">"scriptable.hpp"</span>

<span class="kwrd">extern</span> <span class="str">"C"</span>
{
    __declspec(dllexport) scriptable::TurtlePtr create()
    {
        <span class="kwrd">return</span> scriptable::create();
    }

    __declspec(dllexport) <span class="kwrd">void</span> rotate(scriptable::TurtlePtr hTurtle, <span class="kwrd">float</span> angle)
    {
        scriptable::rotate(hTurtle, angle);
    }

    __declspec(dllexport) <span class="kwrd">void</span> resize(scriptable::TurtlePtr hTurtle, <span class="kwrd">float</span> size)
    {
        scriptable::resize(hTurtle, size);
    }

    __declspec(dllexport) <span class="kwrd">void</span> move(scriptable::TurtlePtr hTurtle, <span class="kwrd">int</span> distance)
    {
        scriptable::move(hTurtle, distance);
    }

    __declspec(dllexport) <span class="kwrd">void</span> speed(scriptable::TurtlePtr hTurtle, <span class="kwrd">int</span> <span class="kwrd">value</span>)
    {
        scriptable::speed(hTurtle, <span class="kwrd">value</span>);
    }

    __declspec(dllexport) <span class="kwrd">void</span> destroy(scriptable::TurtlePtr hTurtle)
    {
        scriptable::destroy(hTurtle);
    }
}</pre>
<p>Você poderá carregar o Turtle.dll (o <em>engine</em> do Turtle Graphics) nos respectivos ambientes REPL (F# e Scala) usando uma fachada de código gerenciado, no meu caso <strong>TurtleFSharp.dll</strong> e <strong>turtle.jar</strong>.</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0027.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image002[7]" src="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0027_thumb.jpg?w=552&#038;h=292" alt="clip_image002[7]" width="552" height="292" border="0" /></a></p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image004.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image004" src="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image004_thumb.jpg?w=559&#038;h=610" alt="clip_image004" width="559" height="610" border="0" /></a></p>
<p>E com isto, produzir uma sequência de riscos variados, ou seja, desenhos:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image006.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image006" src="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image006_thumb.jpg?w=470&#038;h=355" alt="clip_image006" width="470" height="355" border="0" /></a></p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image008.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image008" src="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image008_thumb.jpg?w=472&#038;h=357" alt="clip_image008" width="472" height="357" border="0" /></a></p>
<p>Aqui um exemplo de <em>script</em> em Scala:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image010.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image010" src="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image010_thumb.jpg?w=522&#038;h=347" alt="clip_image010" width="522" height="347" border="0" /></a></p>
<p>Se tiver curiosidade. A Turtle.dll, o <em>engine</em> do meu Turtle Graphics, é composto das seguintes dependências:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image012.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image012" src="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image012_thumb.jpg?w=575&#038;h=368" alt="clip_image012" width="575" height="368" border="0" /></a></p>
<p>D2D1.DLL é o Direct2D, MSCRV100.DLL é a C Runtime Library (CRT) do Visual C++ 10 e MSVCP100.DLL é a Standard C++ Library (SCL) do Visual C++ 10. O resto já é conhecido do sistema operacional Windows.</p>
<p>Se quiser digerir a parte que interage com o <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/dd370990.aspx">Direct2D</a>, você encontrará no <em>program.cpp</em> definições como:</p>
<p>Construtor e os recursos a serem utilizados (estes caras que precisarão ser liberados pela ação de <em>dispose</em>):</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0029.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image002[9]" src="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0029_thumb.jpg?w=540&#038;h=547" alt="clip_image002[9]" width="540" height="547" border="0" /></a></p>
<p>Inicializador da Janela:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0046.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image004[6]" src="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0046_thumb.jpg?w=608&#038;h=853" alt="clip_image004[6]" width="608" height="853" border="0" /></a></p>
<p>O <em>message loop</em>:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0065.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image006[5]" src="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0065_thumb.jpg?w=486&#038;h=247" alt="clip_image006[5]" width="486" height="247" border="0" /></a></p>
<p>Método que desenha o caminho da tartaruga:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0085.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image008[5]" src="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0085_thumb.jpg?w=661&#038;h=360" alt="clip_image008[5]" width="661" height="360" border="0" /></a></p>
<p>O “renderizador”:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0106.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image010[6]" src="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0106_thumb.jpg?w=642&#038;h=781" alt="clip_image010[6]" width="642" height="781" border="0" /></a></p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0125.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image012[5]" src="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0125_thumb.jpg?w=731&#038;h=640" alt="clip_image012[5]" width="731" height="640" border="0" /></a></p>
<p>Responsável por carregar o “cursor” da tartaruga:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image014.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image014" src="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image014_thumb.jpg?w=559&#038;h=166" alt="clip_image014" width="559" height="166" border="0" /></a></p>
<p>As funções matemáticas de auxilio:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image016.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image016" src="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image016_thumb.jpg?w=575&#038;h=590" alt="clip_image016" width="575" height="590" border="0" /></a></p>
<p>E o componente de <em>script</em>:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image018.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image018" src="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image018_thumb.jpg?w=625&#038;h=721" alt="clip_image018" width="625" height="721" border="0" /></a></p>
<p>Enfim, vai encontrar algumas pérolas. <img class="wlEmoticon wlEmoticon-hotsmile" style="border-style:none;" src="http://fabiogaluppo.files.wordpress.com/2012/04/wlemoticon-hotsmile.png?w=640" alt="Hot smile" /></p>
<p>Faça o <a href="https://skydrive.live.com/?cid=b671a4645af2f2f4&amp;resid=B671A4645AF2F2F4!515&amp;id=B671A4645AF2F2F4%21515">download do código fonte e binário do Turtle Graphics</a> e assim como eu divirta-se. Na verdade, acho que você vai preferir mesmo o Small Basic ou o Logo, mas isto não é mais problema meu – mas o meu funciona nos REPLs do Scala e do F# (e C#, quando o <a href="http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-92-metablogapi/6355.InteractiveWindow_5F00_5C828D2C.png">Roslyn</a> estiver ok). <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-style:none;" src="http://fabiogaluppo.files.wordpress.com/2012/04/wlemoticon-winkingsmile.png?w=640" alt="Winking smile" /></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fabiogaluppo.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fabiogaluppo.wordpress.com/165/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiogaluppo.wordpress.com&#038;blog=16617481&#038;post=165&#038;subd=fabiogaluppo&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fabiogaluppo.wordpress.com/2012/04/29/%cf%8c-and-the-rise-of-turtle-graphics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/ea84e8f3c9eaaa7ece0054ccf8a35b80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fabiogaluppo</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image002_thumb.jpg" medium="image">
			<media:title type="html">clip_image002</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/04/wlemoticon-smilewithtongueout.png" medium="image">
			<media:title type="html">Smile with tongue out</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/04/wlemoticon-xbox.png" medium="image">
			<media:title type="html">Xbox</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/04/wlemoticon-flirtmale.png" medium="image">
			<media:title type="html">Flirt male</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0024_thumb.jpg" medium="image">
			<media:title type="html">clip_image002[4]</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/04/wlemoticon-devil.png" medium="image">
			<media:title type="html">Devil</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0027_thumb.jpg" medium="image">
			<media:title type="html">clip_image002[7]</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image004_thumb.jpg" medium="image">
			<media:title type="html">clip_image004</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image006_thumb.jpg" medium="image">
			<media:title type="html">clip_image006</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image008_thumb.jpg" medium="image">
			<media:title type="html">clip_image008</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image010_thumb.jpg" medium="image">
			<media:title type="html">clip_image010</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image012_thumb.jpg" medium="image">
			<media:title type="html">clip_image012</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0029_thumb.jpg" medium="image">
			<media:title type="html">clip_image002[9]</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0046_thumb.jpg" medium="image">
			<media:title type="html">clip_image004[6]</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0065_thumb.jpg" medium="image">
			<media:title type="html">clip_image006[5]</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0085_thumb.jpg" medium="image">
			<media:title type="html">clip_image008[5]</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0106_thumb.jpg" medium="image">
			<media:title type="html">clip_image010[6]</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image0125_thumb.jpg" medium="image">
			<media:title type="html">clip_image012[5]</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image014_thumb.jpg" medium="image">
			<media:title type="html">clip_image014</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image016_thumb.jpg" medium="image">
			<media:title type="html">clip_image016</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/04/clip_image018_thumb.jpg" medium="image">
			<media:title type="html">clip_image018</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/04/wlemoticon-hotsmile.png" medium="image">
			<media:title type="html">Hot smile</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/04/wlemoticon-winkingsmile.png" medium="image">
			<media:title type="html">Winking smile</media:title>
		</media:content>
	</item>
		<item>
		<title>Polimorfismo, polymorphism, &#960;&#959;&#955;&#965;&#956;&#959;&#961;&#966;&#953;&#963;&#956;&#959;ύ, &#8230;</title>
		<link>http://fabiogaluppo.wordpress.com/2012/01/16/polimorfismo-polymorphism-%cf%8d/</link>
		<comments>http://fabiogaluppo.wordpress.com/2012/01/16/polimorfismo-polymorphism-%cf%8d/#comments</comments>
		<pubDate>Mon, 16 Jan 2012 03:55:05 +0000</pubDate>
		<dc:creator>fabiogaluppo</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[F#]]></category>

		<guid isPermaLink="false">https://fabiogaluppo.wordpress.com/?p=115</guid>
		<description><![CDATA[Polimorfismo, já refletiu sobre ele? (no sentido de pensar, não é necessário usar Reflector ou algo parecido). Certamente, a linguagem de programação que você usa, possui uma ou mais formas de manifestação deste recurso. A definição da palavra polimorfismo conecta &#8230; <a href="http://fabiogaluppo.wordpress.com/2012/01/16/polimorfismo-polymorphism-%cf%8d/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiogaluppo.wordpress.com&#038;blog=16617481&#038;post=115&#038;subd=fabiogaluppo&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Polimorfismo, já refletiu sobre ele? (no sentido de pensar, não é necessário usar Reflector ou algo parecido). Certamente, a linguagem de programação que você usa, possui uma ou mais formas de manifestação deste recurso.</p>
<p>A definição da palavra <a href="http://www.definitions.net/definition/polymorphism">polimorfismo</a> conecta com a palavra <a href="http://www.definitions.net/definition/Pleomorphism">pleomorfismo</a>, um termo usado na Biologia – isto significa: “a ocorrência de duas ou mais forma no ciclo de vida de um organismo”.</p>
<p>Se assim como eu, você deseja simplificar sua vida, assuma que as palavras <a href="http://dictionary.reference.com/browse/poly"><em>poly</em></a> + <a href="http://dictionary.reference.com/browse/morph"><em>morph</em></a>, ambas de origem grega (<em>polýs</em> + <em>morphos</em>), podem representar <em>muitas</em> + <em>forma</em>. Quando contextualizadas pode significar a capacidade de alguma coisa (função, tipo de dado, instância, &#8230;) assumir muitas formas.</p>
<p>A minha idéia não é definir formalmente o que é polimorfismo (mesmo porque este assunto poderia ser polêmico, e eu não estou muito afim de discussão conceitual). Mas, a idéia é mostrar livremente algumas manifestações do “muitas formas” no contexto aplicado a Programação de Software, mesmo se tal recurso não for formalmente categorizado como <a href="http://en.wikipedia.org/wiki/Polymorphism_(computer_science)">polimorfismo</a>.</p>
<p>Uma das manifestações do polimorfismo é através de <em><a href="http://en.wikipedia.org/wiki/Dynamic_dispatch#Dynamic_dispatch_mechanisms">Dynamic Dispatching</a></em>, onde existe um mecanismo de passagem de mensagem resolvido em tempo de execução. Quando isto ocorre, existe uma espécie de contrato entre o <em>caller</em> e o <em>callee</em>. Neste caso, é esperado um certo número de argumentos e retorno compartilhados por um nome. Alguns exemplos deste tipo de cenário, seria os serviços do Windows Communication Foundation (WCF) ou o modelo de atores do Erlang – em linhas gerais, eles recebem uma requisição (<em>request</em>) através de um nome roteado internamente (<em>endpoint</em> no WCF, <em>identifier</em> num <em>receiver</em> no Erlang) e respondem (<em>response</em> ou <em>reply</em>) ou ignoram tal chamada.</p>
<p>Sobre <em>dynamic dispatching</em>, não posso deixar de citar uma das implementações mais populares atualmente: <a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html">Objective-C</a>. A passagem de mensagem ocorre através da notação <em>[receiver message]</em>, <em>message</em> contempla o método (<em>selector</em>) a ser chamado e seus argumentos (<em>actual parameters</em>). Embora o C exerceu forte influência sobre o Objective-C, foi do Smalltalk que ele baseou suas extensões de Orientação a Objetos e o mecanismo de passagem de mensagem.</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image002.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image002" src="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image002_thumb.png?w=838&#038;h=664" alt="clip_image002" width="838" height="664" border="0" /></a></p>
<p>No exemplo apresentado, isto está materializado na chamada da função callConvert. Note que, ao contrário do C++, C# ou Java, as instâncias chamadas não possuem vinculos de herança, exceto pelo NSObject que é obrigatório para suportar o <em>message passing</em> (objc_msgSend). Então desde que uma instância suporte tal contrato, ela poderá ser chamada e responderá com sucesso, senão responderá com falha e retornará um valor <em>default</em> (note o comportamento das chamadas no painel inferior direito da figura). Isto não combina com <em><a href="http://en.wikipedia.org/wiki/Duck_typing">Duck Typing</a></em>? (por enquanto, vamos deixar o pato de lado&#8230;)</p>
<pre class="csharpcode">#import &lt;Foundation/Foundation.h&gt;
<span class="rem">//Sample provided by Fabio Galuppo</span>
<span class="kwrd">const</span> <span class="kwrd">float</span> PI = 3.14159265f;

@<span class="kwrd">interface</span> Radians2Degree : NSObject
{
}

-(<span class="kwrd">float</span>) Convert:(<span class="kwrd">float</span>)<span class="kwrd">value</span>;
@end

@implementation Radians2Degree
-(<span class="kwrd">float</span>) Convert:(<span class="kwrd">float</span>)<span class="kwrd">value</span>
{
    <span class="kwrd">return</span> 180 * (<span class="kwrd">value</span> / PI);
}
@end

@<span class="kwrd">interface</span> Degree2Radians : NSObject
{
}

-(<span class="kwrd">float</span>) Convert:(<span class="kwrd">float</span>)<span class="kwrd">value</span>;
@end

@implementation Degree2Radians
-(<span class="kwrd">float</span>) Convert:(<span class="kwrd">float</span>)<span class="kwrd">value</span>
{
    <span class="kwrd">return</span> PI * (<span class="kwrd">value</span> / 180);
}
@end

<span class="kwrd">float</span> callConvert(id receiver, <span class="kwrd">float</span> <span class="kwrd">value</span>)
{
    <span class="kwrd">return</span> [receiver Convert:<span class="kwrd">value</span>];
}

<span class="kwrd">int</span> main(<span class="kwrd">int</span> argc, <span class="kwrd">const</span> <span class="kwrd">char</span>* argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];    

    Radians2Degree* r2d = [[Radians2Degree alloc] init];
    Degree2Radians* d2r = [[Degree2Radians alloc] init];

    NSLog(<span class="str">@"2PI in degrees == %f\n"</span>, [r2d Convert:(2 * PI)]);
    NSLog(<span class="str">@"360 in radians == %f\n"</span>, [d2r Convert:(360)]);
    NSLog(<span class="str">@"PI in degrees == %f\n"</span>, [r2d Convert:([d2r Convert:(180)])]);
    NSLog(<span class="str">@"180 in radians == %f\n"</span>, [d2r Convert:([r2d Convert:(PI)])]);

    NSLog(<span class="str">@"(1/2)PI in degrees == %f\n"</span>, callConvert(r2d, PI / 2));
    NSLog(<span class="str">@"90 in radians == %f\n"</span>, callConvert(d2r, 90));

    NSLog(<span class="str">@"270 in radians == %f\n"</span>, callConvert(nil, 270));

    [pool release];

    <span class="kwrd">return</span> 0;
}</pre>
<p>Dado uma classe X e outra Y que não se correspondem diretamente, seria possível encontrar <em>dynamic dispatching</em> em outras linguagens? Certamente! A linguagem C# (na verdade a Common Language Runtime – CLR) suporta Invoke via <em>reflection</em> desde a versão 1.0. Porém, usar <em>reflection</em> para isto é muito chato e irritante. No entanto, para melhor suportar este mecanismo, o C# 3.0 introduziu a palavra chave <em><a href="http://msdn.microsoft.com/en-us/library/dd264741.aspx">dynamic</a></em>. O compilador + CLR fazem “a mágica” acontecer, veja:</p>
<pre class="csharpcode"><span class="kwrd">using</span> System;

<span class="rem">//Sample provided by Fabio Galuppo</span>

<span class="kwrd">class</span> Program
{
    <span class="kwrd">sealed</span> <span class="kwrd">class</span> X
    {
        <span class="kwrd">public</span> String M(String <span class="kwrd">value</span>){ <span class="kwrd">return</span> <span class="kwrd">value</span>.ToUpper(); }
    }

    <span class="kwrd">sealed</span> <span class="kwrd">class</span> Y
    {
        <span class="kwrd">public</span> String M(String <span class="kwrd">value</span>)
        {
            <span class="kwrd">char</span>[] temp = <span class="kwrd">value</span>.ToCharArray();
            Array.Reverse(temp);
            <span class="kwrd">return</span> <span class="kwrd">new</span> String(temp);
        }
    }

    <span class="kwrd">sealed</span> <span class="kwrd">class</span> Z : System.Dynamic.DynamicObject
    {
        Func&lt;String, String&gt; DefaultResult_ = s =&gt; String.Empty;

        <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">bool</span> TryGetMember(System.Dynamic.GetMemberBinder binder, <span class="kwrd">out</span> <span class="kwrd">object</span> result)
        {
            result = DefaultResult_;
            <span class="kwrd">return</span> <span class="kwrd">true</span>;
        }
    }

    <span class="kwrd">static</span> String Selector(dynamic id, String <span class="kwrd">value</span>)
    {
        String result = String.Empty;

        <span class="kwrd">try</span>
        {
            result = id.M(<span class="kwrd">value</span>);
        }
        <span class="kwrd">catch</span>(Microsoft.CSharp.RuntimeBinder.RuntimeBinderException){}

        <span class="kwrd">return</span> result;
    }

    <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)
    {
        Action&lt;dynamic, String&gt; m = (id, <span class="kwrd">value</span>) =&gt; Console.WriteLine(<span class="str">"{0} -&gt; {1}"</span>, <span class="kwrd">value</span>, Selector(id, <span class="kwrd">value</span>));

        m(<span class="kwrd">new</span> X(), <span class="str">"Hello"</span>);
        m(<span class="kwrd">new</span> Y(), <span class="str">"World"</span>);
        m(<span class="kwrd">new</span> <span class="kwrd">object</span>(), <span class="str">"Something"</span>);
        m(<span class="kwrd">new</span> Z(), <span class="str">"Something"</span>);

        Console.ReadLine();
    }
}</pre>
<p>O método estático Selector invoca dinamicamente <strong>um método chamado </strong><strong>M</strong><strong> que r</strong><strong>ecebe uma </strong><strong>String</strong><strong> cujo responde uma </strong><strong>String</strong> (em destaque o contrato da operação). O comportamento é exatamente igual ao mecanismo de passagem de mensagem do Objective-C! Exceto que no Objective-C, o resultado retornado para uma instância cujo não possui um contrato compatível é o valor <em>default</em> da operação. Já no C# ocorre uma exceção pomposa: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException. Se desejar ter o mesmo comportamento do Objective-C (retornar o valor <em>default</em>), é necessário criar um interceptador, como a classe Z do exemplo.</p>
<p>Uma reflexão sobre notação:</p>
<p>Objective-C: [receiver Convert: value To: RADIANS];</p>
<p>C#: receiver.Convert (value, to = RADIANS);</p>
<p>Assim como as derivadas possuem suas diversas notações (da/dx &#8211; Leibniz, å &#8211; Newton) , o mecanismo de passagem de mensagem também possui tal notação baseado no gosto e expressão de seus criadores (Brad Cox, Anders Hejlsberg).</p>
<p>Continuando, tudo isto soou como <em><a href="http://en.wikipedia.org/wiki/Late_binding">Late Binding</a></em>, não é mesmo? E <em>late binding</em> nos remete aos anais do Component Object Model (COM). O que seria do COM sem ele? (talvez a não existência de programadores Visual Basic, pensando bem&#8230;, deixa para lá&#8230; <img class="wlEmoticon wlEmoticon-hotsmile" src="http://fabiogaluppo.files.wordpress.com/2012/01/wlemoticon-hotsmile.png?w=640" alt="Hot smile" /> brincadeira – Visual Basic é uma nobre linguagem de programação que sofre preconceito de programadores elitistas, porém se usada pelas pessoas certas, podem fazer coisas muito legais) .</p>
<p>Com toda esta gloriosa <a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh464942.aspx">volta do COM</a> (WinRT, o novo COM), seria um bom momento para revisitá-lo. Focando no <em>late binding</em> com <a href="http://msdn.microsoft.com/en-us/library/t9adwcde.aspx">Active Template Library</a> (ATL) e C++:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image004.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image004" src="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image004_thumb.png?w=212&#038;h=220" alt="clip_image004" width="212" height="220" border="0" /></a></p>
<p>COM IS LOVE <span style="font-size:xx-small;">by Developmentor in their golden years (Don Box and team)</span></p>
<p>Eu ainda tenho a camiseta que eles distribuiam nos eventos. <img class="wlEmoticon wlEmoticon-surprisedsmile" src="http://fabiogaluppo.files.wordpress.com/2012/01/wlemoticon-surprisedsmile.png?w=640" alt="Surprised smile" /></p>
<p>O COM tem seu mecanismo de <em>dynamic dispatching</em> implementado em termos da interface <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms221608(v=vs.85).aspx">IDispatch</a>. ATL ajuda muito, tanto na construção do componente suportando <em>late binding</em>, bem como no seu consumo. Tudo relacionado aos componentes COM é dependente de interfaces, e estas por sua vez são descritas no código fonte (C++, por exemplo) e na <em>interface definition language</em> (IDL). Abaixo temos os melhores momentos da construção de 2 componentes COM suportando IDispatch (XType e YType):</p>
<pre class="csharpcode"><span class="kwrd">class</span> ATL_NO_VTABLE CXType :
    <span class="kwrd">public</span> CComObjectRootEx&lt;CComMultiThreadModel&gt;,
    <span class="kwrd">public</span> CComCoClass&lt;CXType, &amp;CLSID_XType&gt;,
    <span class="kwrd">public</span> IDispatchImpl&lt;IXType, &amp;IID_IXType, &amp;LIBID_InvokeMeLib, 1, 0&gt;
{
<span class="kwrd">public</span>:
…

BEGIN_COM_MAP(CXType)
    COM_INTERFACE_ENTRY(IXType)
    COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()

…

<span class="kwrd">public</span>:
    STDMETHOD(M)(BSTR <span class="kwrd">value</span>, BSTR* result);
};

#include <span class="str">"XType.h"</span>

STDMETHODIMP CXType::M(BSTR <span class="kwrd">value</span>, BSTR* result)
{
    CComBSTR c(<span class="kwrd">value</span>);

    HRESULT hr = c.ToUpper();
    <span class="kwrd">if</span>(SUCCEEDED(hr))
    {
        *result = c;
        <span class="kwrd">return</span> S_OK;
    }

    <span class="kwrd">return</span> hr;
}

<span class="kwrd">class</span> ATL_NO_VTABLE CYType :
    <span class="kwrd">public</span> CComObjectRootEx&lt;CComMultiThreadModel&gt;,
    <span class="kwrd">public</span> CComCoClass&lt;CYType, &amp;CLSID_YType&gt;,
    <span class="kwrd">public</span> IDispatchImpl&lt;IYType, &amp;IID_IYType, &amp;LIBID_InvokeMeLib, 1, 0&gt;
{
<span class="kwrd">public</span>:
…

BEGIN_COM_MAP(CYType)
    COM_INTERFACE_ENTRY(IYType)
    COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()

…

<span class="kwrd">public</span>:
    STDMETHOD(M)(BSTR <span class="kwrd">value</span>, BSTR* result);
};

#include <span class="str">"YType.h"</span>

STDMETHODIMP CYType::M(BSTR <span class="kwrd">value</span>, BSTR* result)
{
    CComBSTR c(<span class="kwrd">value</span>);

    USES_CONVERSION;

    <span class="kwrd">char</span>* x = OLE2A(c);
    strrev(x);
    *result = CComBSTR(x);

    <span class="kwrd">return</span> S_OK;
}</pre>
<p>As classes CXType e CYType do exemplo ATL/COM/C++ imitam as classes X e Y, respectivamente, implementadas no C#. Então, você leitor conhecedor do C# (se não conhece, recomendo fortemente <a href="http://www.grupoa.com.br/site/exatas-sociais-e-aplicadas/2/71/75/411/412/0/desenvolvendo-com-c.aspx">este livro</a>), poderá mapear tais recursos e tirar suas conclusões.</p>
<p>O consumo do componente e a chamada <em>late binding</em> feita através de Invoke (via Selector) são mostradas na figura abaixo:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image006.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image006" src="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image006_thumb.png?w=649&#038;h=375" alt="clip_image006" width="649" height="375" border="0" /></a></p>
<p>No exemplo, está em destaque o comportamento de uma chamada com contrato não suportado, onde a resposta (HRESULT) é Unknown name. O CComPtr&lt;IDispatch&gt; é uma especialização (usando o vocabulário do C++, isto quer dizer um <em>template specialization</em>) que ajuda MUITO as chamadas via Invoke (e outros).</p>
<pre class="csharpcode">#import <span class="str">"..\\..\\InvokeMe\\Debug\\InvokeMe.dll"</span> raw_interfaces_only named_guids no_namespace

#include &lt;atlbase.h&gt;

#include &lt;iostream&gt;

<span class="rem">//Sample provided by Fabio Galuppo</span>

HRESULT Selector(CComPtr&lt;IDispatch&gt;&amp; id, <span class="kwrd">const</span> CComBSTR&amp; <span class="kwrd">value</span>, CComBSTR&amp; result)
{
    CComVariant vValue(<span class="kwrd">value</span>), vResult;
    HRESULT hr = id.Invoke1(OLESTR(<span class="str">"M"</span>), &amp;vValue, &amp;vResult);
    <span class="kwrd">if</span>(SUCCEEDED(hr)) result = vResult.bstrVal;
    <span class="kwrd">return</span> hr;
}

<span class="kwrd">int</span> main(<span class="kwrd">int</span> argc, <span class="kwrd">char</span>* argv[])
{
    CoInitialize(NULL);
    {
    HRESULT hr = E_FAIL;

    CComPtr&lt;IDispatch&gt; x, y;    

    auto m = [](CComPtr&lt;IDispatch&gt;&amp; id, <span class="kwrd">const</span> CComBSTR&amp; <span class="kwrd">value</span>)
    {
        CComBSTR result;
        USES_CONVERSION;
        HRESULT hr = Selector(id, <span class="kwrd">value</span>, result);
        std::cout &lt;&lt; OLE2CA(<span class="kwrd">value</span>) &lt;&lt; <span class="str">" -&gt; "</span> &lt;&lt; (SUCCEEDED(hr) ? OLE2CA(result) : <span class="str">""</span>) &lt;&lt; std::endl;
    };

    hr = x.CoCreateInstance(CLSID_XType, NULL, CLSCTX_ALL);
    <span class="kwrd">if</span>(SUCCEEDED(hr))
        m(x, CComBSTR(<span class="str">"Hello"</span>));

    hr = y.CoCreateInstance(CLSID_YType, NULL, CLSCTX_ALL);
    <span class="kwrd">if</span>(SUCCEEDED(hr))
        m(y, CComBSTR(<span class="str">"World"</span>));

    CComPtr&lt;IDispatch&gt; z;
    z.CoCreateInstance(OLESTR(<span class="str">"Shell.Explorer"</span>), NULL, CLSCTX_ALL);
    <span class="kwrd">if</span>(SUCCEEDED(hr))
        m(z, CComBSTR(<span class="str">"Something"</span>));
    }
    CoUninitialize();

    std::cin.get();
}</pre>
<p>Compare o método Selector do C# com a função Selector do C++, elas fazem a mesma tarefa: invocam dinamicamente um método (função ou mensagem, dependendo da nomenclatura que deseja usar) chamado “M”.</p>
<p>Interessante isto, não é mesmo? Você notou que para um determinado recurso apareceu diversas notações, nomenclaturas e conceitos? Parece que é para ferrar (para não qualificar com outro adjetivo) com a cabeça do programador.</p>
<p><em>Dynamic dispatching</em> é um recurso que pode ser muito custoso do ponto de vista de desempenho. Então, antes de usar e abusar, se atente aos requisitos não-funcionais do seu <em>software</em>.</p>
<p>Dentro do universo polimorfismo, existiria alguma coisa nesta linha (de comportamento semelhante) cujo a resolução ocorresse em tempo de compilação e tivesse as garantias da tipagem estática? Com absoluta certeza! Posso garantir que isto existe e formalmente é denominado de <a href="http://en.wikipedia.org/wiki/Parametric_polymorphism">Polimorfismo Paramétrico</a>. Isto é refletido diretamente num recurso do C++ chamado <em><a href="http://en.wikipedia.org/wiki/C%2B%2B_Templates">templates</a></em> (e não confunda isto com <em>generics</em>, cujo possuem uma intercecção).</p>
<p>Vamos criar um nome paradoxal para esta brincadeira e chamar tal recurso de <em>static duck typing</em> (olha o pato aparecendo novamente).</p>
<p>Abaixo, uma implementação que remete ao comportamento dos exemplos anteriores com <em>templates</em> e C++:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image008.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image008" src="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image008_thumb.png?w=791&#038;h=555" alt="clip_image008" width="791" height="555" border="0" /></a></p>
<p>Internamente, as funções selector e m, serão recriadas pelo compilador, baseado na quantidade de <em><a href="http://msdn.microsoft.com/en-us/library/7k8twfx7.aspx">template instantiation</a></em>.</p>
<p>Ocultamente, o <a href="http://www.tryfsharp.org/">F#</a> também suporta este tal de “<em>static duck typing”</em>. Isto é feito através de <em><a href="http://msdn.microsoft.com/en-us/library/dd548047.aspx">inline functions</a></em>. Estas funções carregam na sua assinatura um contrato formal, por exemplo, (member M : String -&gt; String):</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image010.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image010" src="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image010_thumb.jpg?w=601&#038;h=133" alt="clip_image010" width="601" height="133" border="0" /></a></p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image012.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image012" src="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image012_thumb.png?w=610&#038;h=224" alt="clip_image012" width="610" height="224" border="0" /></a></p>
<p>Apesar de ter o mesmo comportamento do <em>C++ template</em>, replicando código com o tipo adequado durante a compilação, você notará 2 coisas que as funções <em>inline</em> fazem:</p>
<p>1. O que um <em>inline</em> supostamente deveria fazer. Substituir a chamada pelas respectivas linhas de código no contexto chamador (linhas L_002f – L_0052).</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image014.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image014" src="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image014_thumb.png?w=348&#038;h=312" alt="clip_image014" width="348" height="312" border="0" /></a></p>
<p>2. Conserva a estrutura da função <em>inline</em>, mas se chamada dinamicamente gerará uma exceção.</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image016.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image016" src="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image016_thumb.png?w=418&#038;h=128" alt="clip_image016" width="418" height="128" border="0" /></a></p>
<p>Agora o último ato, o popular, <em>le magnifique</em>, o inconfundível: polimorfismo baseado em hierarquia de classes. Ele mesmo! Aquele que conhecemos através de classes, métodos virtuais e interfaces das linguagens C++, Java, C#, entre outros. Formalmente, este tipo de polimorfismo é denominado de <em><a href="http://en.wikipedia.org/wiki/Subtype_polymorphism">Subtyping Polymorphism</a></em>.</p>
<p>Aqui vamos explorar apenas 1 modelo: o <em>subtyping polymorphism</em> com <em>dynamic dispatch</em>ing. Para isto ser possível, em C++, o recurso usado são membros do tipo função virtual. Imagine a seguinte hierarquia e seu consumo:</p>
<pre class="csharpcode">#include &lt;cstdio&gt;

<span class="kwrd">const</span> <span class="kwrd">float</span> PI = 3.14159265f;

<span class="kwrd">class</span> IConverter
{
<span class="kwrd">public</span>:
    <span class="kwrd">virtual</span> <span class="kwrd">float</span> Convert(<span class="kwrd">float</span> <span class="kwrd">value</span>) = 0;
};

<span class="kwrd">class</span> Radians2Degree : <span class="kwrd">public</span> IConverter
{
<span class="kwrd">public</span>:
    <span class="kwrd">virtual</span> <span class="kwrd">float</span> Convert(<span class="kwrd">float</span> <span class="kwrd">value</span>)
    {
        <span class="kwrd">return</span> 180 * (<span class="kwrd">value</span> / PI);
    }
};

<span class="kwrd">class</span> Degree2Radians : <span class="kwrd">public</span> IConverter
{
<span class="kwrd">public</span>:
    <span class="kwrd">virtual</span> <span class="kwrd">float</span> Convert(<span class="kwrd">float</span> <span class="kwrd">value</span>)
    {
        <span class="kwrd">return</span> PI * (<span class="kwrd">value</span> / 180);
    }
};

<span class="kwrd">int</span> main()
{
    Radians2Degree r2d;
    Degree2Radians d2r;

    IConverter* converter = &amp;r2d;
    std::printf( <span class="str">"2PI in degrees == %f\n"</span>, converter-&gt;Convert(2 * PI) );

    converter = &amp;d2r;
    std::printf( <span class="str">"360 in radians == %f\n"</span>, converter-&gt;Convert(360.f) );

    <span class="kwrd">return</span> 0;
}</pre>
<p>Você notará que existe uma classe virtual pura (IConverter) servindo de interface base para outras classes. Outros exemplos de tal técnica com interfaces são<a href="http://msdn.microsoft.com/en-us/library/ms680509(v=vs.85).aspx"> IUnknown</a> e <a href="http://msdn.microsoft.com/en-us/library/br205821(v=vs.85).aspx">IInspectable</a>, do COM e da WinRT, respectivamente. Quando existir um membro virtual, existirá a famosa <em>vtable</em>.</p>
<p>A <em>vtable</em> é o mecanismo que possibilita o <em>dynamic dispatching</em>. Sendo que, seu funcionamento é bem simples: imagine um vetor de ponteiros de funções, cujo existe um outro ponteiro (<em>vtable pointer</em>) que referencia esta tabela de funções como membro “privado” ou interno da instância chamadora. Veja este relacionamento na figura abaixo. Toda esta indireção ocorre através do <em>vtable pointer</em>, onde um objeto aciona o ponteiro de função que deseja invocar através de um indice:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image018.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image018" src="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image018_thumb.jpg?w=597&#038;h=473" alt="clip_image018" width="597" height="473" border="0" /></a></p>
<p>No detalhe, em <em>assembly</em> x64, os registradores RCX e RAX mantêem os endereços do objeto (seu <em>this pointer</em>) e do endereço do endereço da função a ser chamada (Convert &#8211; 0x000000013F4E68A0). O resultado apresentados estão na forma <a href="http://support.microsoft.com/kb/102025/en-us">Little Endian</a>:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image020.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image020" src="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image020_thumb.jpg?w=766&#038;h=626" alt="clip_image020" width="766" height="626" border="0" /></a></p>
<p>Um resumo das principais operações <em>assembly</em> x64 são:</p>
<p>000000013F4E1079  lea         rax,[r2d]<br />
000000013F4E107E  mov         qword ptr [converter],rax<br />
&#8230;<br />
000000013F4E1093  mov         rax,qword ptr [converter]<br />
000000013F4E1098  mov         rax,qword ptr [rax]<br />
&#8230;<br />
000000013F4E109E  mov         rcx,qword ptr [converter]<br />
000000013F4E10A3  call        qword ptr [rax]  &lt;= breakpoint</p>
<p>RAX    = 0x000000013F4E68A0<br />
RCX    = 0x00000000002CFB38<br />
Memory = 0x000000013F4E68A0  14 10 4e 3f 01 00 00 00 &#8230; = littleEndianOf(0x000000013f4e1014)</p>
<p>XMM0 = 00000000000000000000000043B40000 =  resultado final</p>
<p>Apenas por curiosidade, vamos registrar o <em>disassembly</em> do método Convert de Radians2Degree.</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image022.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image022" src="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image022_thumb.png?w=707&#038;h=295" alt="clip_image022" width="707" height="295" border="0" /></a></p>
<p>A primeira coisa a ser verificada é que para o <em>assembly</em> não existe um método. Há apenas um endereço 64-bit, que poderá ser invocado através do <em>opcode</em> call, cujo a <em>stack</em> indica a presença de 2 paramêtros formais: o this <em>pointer</em> e um float denominado value. Os 2 primeiros passos são movimentos dos registradores onde os parametros foram armazenados antes da chamada para áreas de memória referentes a seus argumentos, o resto das operações são pertinentes aos cálculos. O “S” no final das instruções <em>assembly</em> significa Single, ou seja, operações com float (32-bit ou 4 bytes). Por final, a cópia do resultado vai para o registrador SSE XMM0. Ou seja, simples, muito simples, até “um cavalo entende”. <img class="wlEmoticon wlEmoticon-winkingsmile" src="http://fabiogaluppo.files.wordpress.com/2012/01/wlemoticon-winkingsmile.png?w=640" alt="Winking smile" /></p>
<p>Dentro do universo amplo do polimorfismo, gostaria de destacar mais 2 modelos:</p>
<p>1. <em><a href="http://en.wikipedia.org/wiki/Ad-hoc_polymorphism">Ad-hoc polymorphism</a></em> – um nome bonito para sobrecarga de métodos, funções ou operadores.</p>
<p>2. Co-variância e Contra-variância – Conversão do mais específico para o mais genérico e conversão do mais genérico para o mais especifico, respectivamente.</p>
<p>Mas estes são assuntos para uma outra oportunidade, ou para alguma palestra, ou treinamento que eu venha a ser contratado para ministrar.</p>
<p><a href="https://skydrive.live.com/redir.aspx?cid=b671a4645af2f2f4&amp;resid=B671A4645AF2F2F4!486&amp;parid=B671A4645AF2F2F4!163">Samples Polymorphism Source Code</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fabiogaluppo.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fabiogaluppo.wordpress.com/115/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiogaluppo.wordpress.com&#038;blog=16617481&#038;post=115&#038;subd=fabiogaluppo&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fabiogaluppo.wordpress.com/2012/01/16/polimorfismo-polymorphism-%cf%8d/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/ea84e8f3c9eaaa7ece0054ccf8a35b80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fabiogaluppo</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image002_thumb.png" medium="image">
			<media:title type="html">clip_image002</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/01/wlemoticon-hotsmile.png" medium="image">
			<media:title type="html">Hot smile</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image004_thumb.png" medium="image">
			<media:title type="html">clip_image004</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/01/wlemoticon-surprisedsmile.png" medium="image">
			<media:title type="html">Surprised smile</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image006_thumb.png" medium="image">
			<media:title type="html">clip_image006</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image008_thumb.png" medium="image">
			<media:title type="html">clip_image008</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image010_thumb.jpg" medium="image">
			<media:title type="html">clip_image010</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image012_thumb.png" medium="image">
			<media:title type="html">clip_image012</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image014_thumb.png" medium="image">
			<media:title type="html">clip_image014</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image016_thumb.png" medium="image">
			<media:title type="html">clip_image016</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image018_thumb.jpg" medium="image">
			<media:title type="html">clip_image018</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image020_thumb.jpg" medium="image">
			<media:title type="html">clip_image020</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/01/clip_image022_thumb.png" medium="image">
			<media:title type="html">clip_image022</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/01/wlemoticon-winkingsmile.png" medium="image">
			<media:title type="html">Winking smile</media:title>
		</media:content>
	</item>
		<item>
		<title>Recurs&#227;o, recursion, ricorsione, &#945;&#957;&#945;&#948;&#961;&#959;&#956;ή, &#8230;</title>
		<link>http://fabiogaluppo.wordpress.com/2012/01/07/recurso-recursion-ricorsione-%ce%ae/</link>
		<comments>http://fabiogaluppo.wordpress.com/2012/01/07/recurso-recursion-ricorsione-%ce%ae/#comments</comments>
		<pubDate>Sat, 07 Jan 2012 04:44:44 +0000</pubDate>
		<dc:creator>fabiogaluppo</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Math]]></category>

		<guid isPermaLink="false">https://fabiogaluppo.wordpress.com/?p=82</guid>
		<description><![CDATA[Dentro da Teoria da Computação, um programa pode ser categorizado de acordo com 3 tipos de estruturação: monolítica, iterativa e recursiva. Fazendo uma analogia com alguma linguagem de programação posso associar a estruturação monolítica ao BASIC que programava quando garoto &#8230; <a href="http://fabiogaluppo.wordpress.com/2012/01/07/recurso-recursion-ricorsione-%ce%ae/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiogaluppo.wordpress.com&#038;blog=16617481&#038;post=82&#038;subd=fabiogaluppo&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Dentro da Teoria da Computação, um programa pode ser categorizado de acordo com 3 tipos de estruturação: monolítica, iterativa e recursiva.</p>
<p>Fazendo uma analogia com alguma linguagem de programação posso associar a estruturação monolítica ao <a href="http://en.wikipedia.org/wiki/MSX_BASIC">BASIC que programava quando garoto</a> caracterizado pelo seus desvios incondicionais (vulgo GOTOs e GOSUBs – eu ainda lembro disto, uau!) e estruturação iterativa &#8211; populares em linguagens estruturadas, como por exemplo Pascal, e muito forte por banir os <a href="http://en.wikipedia.org/wiki/Considered_harmful">desvios incondicionais por serem considerados grosseiros, rídiculos, perigosos, vai dar m&#8230;</a> No entanto, isto é teoria, pois na prática <a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">todas as (ou a maioria das) linguagens de programação</a>(bem, pelo menos as que eu escolhi para programar) suportam estruturação recursiva, ou seja, suportam recursividade. Alias, isto é um négocio tão simples que “para você entender de recursividade, basta você entender de recursividade”, sacou? Não? Então novamente: “para você entender de recursividade, basta você entender de recursividade” – agora sim!</p>
<p>Baseado num famoso trecho de Orwell, posso dizer: “&#8230; que algumas linguagens são mais recursivas do que outras”.</p>
<p>A maioria dos programadores que conheço sabem ou já ouviram falar sobre recursividade. Mas se você perguntar o que é, provavelmente a resposta seria: “Ah, é uma função que chama a si própria”. Ok! Este é um tipo: a função recursiva. O outro é a estrutura de dados recursiva: o nó de uma lista ligada (<em>Linked List</em>) ou de uma árvore (<em>Tree</em>), a enumeração de <a href="http://msdn.microsoft.com/en-us/library/dd997370.aspx">dirétorios e arquivos</a> ou de <a href="http://support.microsoft.com/kb/183009/en-us">janelas</a>.</p>
<p>Recursividade é tão importante que é um dos pilares das <a href="http://en.wikipedia.org/wiki/Functional_programming">Linguagens Funcionais</a> e um recurso fundamental para a <a href="http://mathworld.wolfram.com/RecursiveFunction.html">Matemática</a>. Por exemplo, o algoritmo babilônico para a computação do lado do quadrado (<em>square root</em>) é definido recursivamente por:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/01/image.png"><img style="background-image:none;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0;border-width:0;" title="image" src="http://fabiogaluppo.files.wordpress.com/2012/01/image_thumb.png?w=215&#038;h=87" alt="image" width="215" height="87" border="0" /></a></p>
<p>O “sr” na função representa um chute (<em>guess</em>), você calculará inúmeras (“n”) vezes até chegar num resultado coerente dentro de “k” casas decimais para o valor de “x” – você perceberá que esta coerência surgirá quando uma execução sucessiva produzirá resultados semelhantes ou muito, mas muito, próximos. <em>Let’s try</em>:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/01/image1.png"><img style="padding-top:0;padding-right:0;padding-left:0;display:inline;background-image:none;border-width:0;" title="image" src="http://fabiogaluppo.files.wordpress.com/2012/01/image_thumb1.png?w=640&#038;h=665" alt="image" width="640" height="665" border="0" /></a></p>
<p>Note que no Mathematica, o algoritmo está um pouco modificado em relação ao apresentado.</p>
<p>Interessante isto, não é mesmo? Tão interessante quanto, é saber que é possível representar estruturas de controle, tais como for ou while, em termos recursivos.</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/01/image2.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;" title="image" src="http://fabiogaluppo.files.wordpress.com/2012/01/image_thumb2.png?w=523&#038;h=534" alt="image" width="523" height="534" border="0" /></a></p>
<p>No exemplo, escrito em Scala, a função recursiva While é uma função <em>tail recursive</em>. Resumidamente, isto significa que o compilador ou máquina virtual (ou ambos) conseguem otimizar a chamada e não sobrecarregar a <em>call stack</em>.</p>
<p>Imagine por um momento, que surgisse uma vontade incontrolável de implementar um código para gerar <a href="http://en.wikipedia.org/wiki/Harmonic_series_(mathematics)">séries harmonicas</a> em C++. E falaram para você que este tal de C++ suporta Orientação a Objetos. Juntamente com esta vontade te consumindo, você também ouviu falar num cara chamado <a href="http://en.wikipedia.org/wiki/Template_Pattern">Template Method Pattern</a>. Decidido a misturar tudo isto e ver o que pode dar, escreveu o seguinte código, que por sinal usa chamadas recursivas e é compilado com a máaaaaaxima otimização possível:</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/01/image3.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;" title="image" src="http://fabiogaluppo.files.wordpress.com/2012/01/image_thumb3.png?w=664&#038;h=578" alt="image" width="664" height="578" border="0" /></a></p>
<p>Apesar de eu não ter te explicado, você percebeu que o método SummationCore da classe Harmonic é implementado totalmente segundo os principios de comandam uma boa função <em>tail recursive</em>. O problema é que você caiu numa armadilha do C++.</p>
<p>O fato é: o método é virtual, ele necessita ser resolvido em tempo de execução, então o C++ (pelo menos o cl.exe [Microsoft (R) C/C++ Optimizing Compiler Version 16.00.40219.01], digo o compilador do Visual C++ 10) não pode otimizar agressivamente este código. Note a quantidade de chamadas na Call Stack!</p>
<p>Para concertar este problema, sem alterar a estrutura do código ou usar templates, como regra básica assuma: toda vez que um método virtual for resolvido como <em>tail recursive</em>, implemente-o em termos de outro método não virtual. Assim, o compilador poderá produzir um resultado otimizado! (E este resultado é exatamente resolvido através de desvios &#8211; JMPs ou GOTOs, mas esta é uma outra estória)</p>
<p><a href="http://fabiogaluppo.files.wordpress.com/2012/01/image4.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;" title="image" src="http://fabiogaluppo.files.wordpress.com/2012/01/image_thumb4.png?w=728&#038;h=511" alt="image" width="728" height="511" border="0" /></a></p>
<p>A versão <em>tail recursive </em>em C++, na integra:</p>
<pre class="csharpcode">#include &lt;cstdio&gt;

<span class="kwrd">struct</span> Serie
{
    <span class="kwrd">virtual</span> ~Serie(){}

    <span class="kwrd">float</span> Summation(<span class="kwrd">int</span> n)
    {
        <span class="kwrd">return</span> SummationCore(n);
    }

<span class="kwrd">protected</span>:
    <span class="kwrd">virtual</span> <span class="kwrd">float</span> SummationCore(<span class="kwrd">int</span> n) = 0;
};

<span class="kwrd">struct</span> Harmonic : <span class="kwrd">public</span> Serie
{
    Harmonic() : Acc_(0){}

<span class="kwrd">protected</span>:
    <span class="kwrd">virtual</span> <span class="kwrd">float</span> SummationCore(<span class="kwrd">int</span> n)
    {
        <span class="kwrd">return</span> TailRecursiveSummation(n);
    }

    <span class="kwrd">float</span> TailRecursiveSummation(<span class="kwrd">int</span> n)
    {
        <span class="kwrd">if</span>(n == 1)
            <span class="kwrd">return</span> Acc_;

        Acc_ += 1.0 / n;

        <span class="kwrd">return</span> TailRecursiveSummation(n - 1);
    }

<span class="kwrd">private</span>:
    <span class="kwrd">float</span> Acc_;
};

<span class="kwrd">int</span> main()
{
    std::printf( <span class="str">"%f"</span>, Harmonic().Summation(7) );
}</pre>
<p>Não esqueça de olhar a Call Stack (impressionante, não acha?)</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fabiogaluppo.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fabiogaluppo.wordpress.com/82/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiogaluppo.wordpress.com&#038;blog=16617481&#038;post=82&#038;subd=fabiogaluppo&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fabiogaluppo.wordpress.com/2012/01/07/recurso-recursion-ricorsione-%ce%ae/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/ea84e8f3c9eaaa7ece0054ccf8a35b80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fabiogaluppo</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/01/image_thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/01/image_thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/01/image_thumb2.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/01/image_thumb3.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://fabiogaluppo.files.wordpress.com/2012/01/image_thumb4.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Replanejamento do Blog &#8211; 2012 Comeback Special</title>
		<link>http://fabiogaluppo.wordpress.com/2012/01/02/replanejamento-do-blog-2012-comeback-special/</link>
		<comments>http://fabiogaluppo.wordpress.com/2012/01/02/replanejamento-do-blog-2012-comeback-special/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 01:54:23 +0000</pubDate>
		<dc:creator>fabiogaluppo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://fabiogaluppo.wordpress.com/?p=70</guid>
		<description><![CDATA[Estou replanejando o meu blog sobre Programação de Software. Desta vez será escrito na maior parte em português. Em breve, este post dará lugar para outros mais interessantes&#8230;<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiogaluppo.wordpress.com&#038;blog=16617481&#038;post=70&#038;subd=fabiogaluppo&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Estou replanejando o meu blog sobre Programação de Software. Desta vez será escrito na maior parte em português. Em breve, este post dará lugar para outros mais interessantes&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fabiogaluppo.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fabiogaluppo.wordpress.com/70/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiogaluppo.wordpress.com&#038;blog=16617481&#038;post=70&#038;subd=fabiogaluppo&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fabiogaluppo.wordpress.com/2012/01/02/replanejamento-do-blog-2012-comeback-special/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/ea84e8f3c9eaaa7ece0054ccf8a35b80?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fabiogaluppo</media:title>
		</media:content>
	</item>
	</channel>
</rss>
