

<?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/"
	>

<channel>
	<title>Rodrigo Kumpera Weblog &#187; java</title>
	<atom:link href="http://www.kumpera.net/blog/index.php/category/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kumpera.net/blog</link>
	<description>Meus achados sobre tecnologia</description>
	<lastBuildDate>Thu, 10 Jun 2010 04:33:11 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Implementando Haskell em VMs tradicionais (parte 1)</title>
		<link>http://www.kumpera.net/blog/index.php/2009/09/10/implementando-haskell-em-vms-tradicionais-parte-1/</link>
		<comments>http://www.kumpera.net/blog/index.php/2009/09/10/implementando-haskell-em-vms-tradicionais-parte-1/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 00:49:24 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[language design]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[clr]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[jvm]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/?p=138</guid>
		<description><![CDATA[Outro dia uma discussão me levou a pensar se era possível implementar Haskell em cima de uma VM tradicional, tal qual JVM ou CLR, de forma eficiente. Em termos dos mecanismos que a VM precisa suportar de forma eficiente os principais são tail call, thunking, type classes e algebraic types. Nesse artigo vou apenas discutir [...]]]></description>
			<content:encoded><![CDATA[<p>Outro dia uma discussão me levou a pensar se era possível implementar Haskell em cima de uma VM tradicional, tal qual JVM ou CLR, de forma eficiente. Em termos dos mecanismos que a VM precisa suportar de forma eficiente os principais são tail call, thunking, type classes e algebraic types. Nesse artigo vou apenas discutir um deles, type classes.</p>
<p>Uma type class para os acostumados com OO pode ser vista como uma interface cuja implementações são externas aos tipos que estão atrelados. Um exemplo bem simples é Eq, que permite compar objetos do mesmo tipo:</p>

<div class="wp_syntax"><div class="code"><pre class="haskell" style="font-family:monospace;"><span style="color: #06c; font-weight: bold;">class</span> <span style="color: #cccc00; font-weight: bold;">Eq</span> a <span style="color: #06c; font-weight: bold;">where</span>
    <span style="color: green;">&#40;</span><span style="color: #339933; font-weight: bold;">==</span><span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">,</span> <span style="color: green;">&#40;</span><span style="color: #339933; font-weight: bold;">/=</span><span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">::</span> a <span style="color: #339933; font-weight: bold;">-&gt;</span> a <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="color: #cccc00; font-weight: bold;">Bool</span>
    x <span style="color: #339933; font-weight: bold;">/=</span> y <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">not</span> <span style="color: green;">&#40;</span>x <span style="color: #339933; font-weight: bold;">==</span> y<span style="color: green;">&#41;</span>
    x <span style="color: #339933; font-weight: bold;">==</span> y <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">not</span> <span style="color: green;">&#40;</span>x <span style="color: #339933; font-weight: bold;">/=</span> y<span style="color: green;">&#41;</span></pre></div></div>

<p>Para nos não iniciado em Haskell, linha um define a classe Eq e diz que ela possui um parâmetro polimófico; linha 2 diz que Eq tem 2 funções, &#8220;==&#8221; e &#8220;/=&#8221; cuja assinatura são dois valores do tipo &#8216;a&#8217; e retorna um booleano; por fim, linhas 3 e 4 são implementações padrão das funções. Seria o equivalente, em pseudo-C#, ao seguinte:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #FF0000;">interface</span> Eq<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span> <span style="color: #000000;">&#123;</span>
   <span style="color: #FF0000;">bool</span> <span style="color: #0600FF;">operator</span><span style="color: #008000;">==</span> <span style="color: #000000;">&#40;</span>T a, T b<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> <span style="color: #008000;">!</span><span style="color: #000000;">&#40;</span>a <span style="color: #008000;">!=</span> b<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
   <span style="color: #FF0000;">bool</span> <span style="color: #0600FF;">operator</span><span style="color: #008000;">!=</span> <span style="color: #000000;">&#40;</span>T a, T b<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> <span style="color: #008000;">!</span><span style="color: #000000;">&#40;</span>a <span style="color: #008000;">==</span> b<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Uma das vantagens de type classes no Haskell é que elas podem fornecer implementações padrão para alguns de seus métodos. Bom, agora que temos Eq definida, para dizer que Listas a implementa usamos algo como:</p>

<div class="wp_syntax"><div class="code"><pre class="haskell" style="font-family:monospace;"><span style="color: #06c; font-weight: bold;">instance</span> <span style="color: #cccc00; font-weight: bold;">Eq</span> a <span style="color: #339933; font-weight: bold;">=&gt;</span> <span style="color: #cccc00; font-weight: bold;">Eq</span> <span style="color: green;">&#91;</span>a<span style="color: green;">&#93;</span> <span style="color: #06c; font-weight: bold;">where</span>
    <span style="color: green;">&#91;</span><span style="color: green;">&#93;</span> <span style="color: #339933; font-weight: bold;">==</span> <span style="color: green;">&#91;</span><span style="color: green;">&#93;</span> <span style="color: #339933; font-weight: bold;">=</span> True
    <span style="color: green;">&#40;</span>x:xs<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">==</span> <span style="color: green;">&#40;</span>y:ys<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=</span> x<span style="color: #339933; font-weight: bold;">==</span>y <span style="color: #339933; font-weight: bold;">&amp;&amp;</span> xs<span style="color: #339933; font-weight: bold;">==</span>ys
    <span style="color: #339933; font-weight: bold;">_</span> <span style="color: #339933; font-weight: bold;">==</span> <span style="color: #339933; font-weight: bold;">_</span> <span style="color: #339933; font-weight: bold;">=</span> False</pre></div></div>

<p>Aqui vemos uma das melhores características do Haskell é explorada, que é pattern matching &#8211; e isso também é assunto para outro artigo. Como pode se notar, uma implementação de uma dada type class não está embutida na definição do tipo em questão, ou seja, não podemos interfaces como a CLR ou a JVM suportam.</p>
<p>A idéia é representar type classes de forma semelhante a como o ghc faz, usando dictionary passing[1], que é bem simples de entender e implementar. Para cada type class que uma função recebe nos seus parâmetros, passamos junto um objeto que representa as operações em questão. Em C# teríamos:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #FF0000;">interface</span> Eq<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span> <span style="color: #000000;">&#123;</span>
    <span style="color: #FF0000;">bool</span> op_eq <span style="color: #000000;">&#40;</span>T a, T b<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #FF0000;">bool</span> op_neq <span style="color: #000000;">&#40;</span>T a, T b<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #FF0000;">class</span> Eq_Int <span style="color: #008000;">:</span> Eq<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span> <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">bool</span> op_eq <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> a, <span style="color: #FF0000;">int</span> b<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> a <span style="color: #008000;">==</span> b<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">bool</span> op_eq <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> a, <span style="color: #FF0000;">int</span> b<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> a <span style="color: #008000;">!=</span> b<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #FF0000;">int</span> Fun<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span> <span style="color: #000000;">&#40;</span>Eq<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span> dict, T a, T b<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>dict.<span style="color: #0000FF;">op_eq</span> <span style="color: #000000;">&#40;</span>a, b<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #0600FF;">return</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span>
    <span style="color: #0600FF;">return</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Existe alguns problemas aqui, primeiro que estamos passando um parâmetro extra e segundo que não é possível eliminar a verificar por null pointer caso op_eq seja inlined. A solução é razoavelmente simples no caso do C#:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #FF0000;">struct</span> Eq_Int <span style="color: #008000;">:</span> Eq<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span> <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">bool</span> op_eq <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> a, <span style="color: #FF0000;">int</span> b<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> a <span style="color: #008000;">==</span> b<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">bool</span> op_neq <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> a, <span style="color: #FF0000;">int</span> b<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> a <span style="color: #008000;">!=</span> b<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #FF0000;">int</span> Fun<span style="color: #008000;">&lt;</span>T, TD<span style="color: #008000;">&gt;</span> <span style="color: #000000;">&#40;</span>T a, T b<span style="color: #000000;">&#41;</span> where TD<span style="color: #008000;">:</span> Eq<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span> <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">default</span> <span style="color: #000000;">&#40;</span>TD<span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">op_eq</span> <span style="color: #000000;">&#40;</span>a, b<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #0600FF;">return</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span>
    <span style="color: #0600FF;">return</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>A grande mudança aqui é tornar a instância da typeclass um valuetype e construir um valor default para satisfazer o compilador. É uma pena que não podemos simplesmente chamar um método estático e TD, o que é uma limitação boba da CLR. Essa solução não é possível na JVM devido a inexistência de valuetypes e generics.</p>
<p>E quanto a performance dessa solução? Bom, no caso do mono, o JIT&#8217;er reconhece as chamadas como não virtuais e é capaz de fazer inline de forma bem agressiva &#8211; exatamente como desejado. Eu pensei em fazer um comparativo dessa solução com o equivalente em Java, mostrando como a CLR permite codificar tipos muito mais ricos e interessantes que a JVM &#8211; e como isso se traduz em performance. Mas realmente não estou afim de criar motivo para um flamewar por parte dos javeiros de plantão.</p>
<p>[1]Esse é o paper original que descreve type classes e a técnica utilizada: http://homepages.inf.ed.ac.uk/wadler/papers/class/class.ps.gz</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2009/09/10/implementando-haskell-em-vms-tradicionais-parte-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Como fazer uma linguagem dinâmica ser rápida?</title>
		<link>http://www.kumpera.net/blog/index.php/2008/05/22/como-fazer-uma-linguagem-dinamica-ser-rapida/</link>
		<comments>http://www.kumpera.net/blog/index.php/2008/05/22/como-fazer-uma-linguagem-dinamica-ser-rapida/#comments</comments>
		<pubDate>Thu, 22 May 2008 05:09:16 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[language design]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2008/05/22/como-fazer-uma-linguagem-dinamica-ser-rapida/</guid>
		<description><![CDATA[Muito se fala em como as implementações de Ruby estão ficando rápidas, que estão evoluindo rapidamente. Porém não consigo pensar em como todas elas parecem mas preocupadas em repetir o caminho das pedras que outras linguagens dinâmicas passaram em décadas passadas.
Hoje a maioria ainda está no estágio de possuir um interpretador razoável e estar começando [...]]]></description>
			<content:encoded><![CDATA[<p>Muito se fala em como as implementações de Ruby estão ficando rápidas, que estão evoluindo rapidamente. Porém não consigo pensar em como todas elas parecem mas preocupadas em repetir o caminho das pedras que outras linguagens dinâmicas passaram em décadas passadas.</p>
<p>Hoje a maioria ainda está no estágio de possuir um interpretador razoável e estar começando a investir em algum mecanismo primitivo de compilação para código nativo. Talvez a única diferença seja o uso de inline caches para resolução de nomes, que foi uma contribuição significativa do pessoal do Self no começo dos anos 90. Porém os principais resultados obtivos por pesquisas a um bom tempo, como tracing, especialização e especulação não deram as caras ainda.</p>
<p>Inline caching é uma optimização no qual o resultado da resolução de nomes, para dispatch de método por exemplo, é armazenado entre ativações distintas. O truque é introduzir uma clausula de guarda que verifica o tipo do objeto seletor e sua versão. Caches devem ser invalidados sempre que alguém alterar uma classe. Temos dois tipos de cache, os monomórficos que fazem caching de apenas uma invocação e os polimórficos, que armazenam uma série de resultados. Para melhor vamos exemplificar com pseudo código:</p>
<p><code><br />
//ruby<br />
def test (a)<br />
    a.foo<br />
end</p>
<p>//pseudo-código gerado em C# para um cache monomórfico</p>
<p>class CallSite {<br />
    Type type;<br />
    MethodInfo method;<br />
    int version;<br />
}</p>
<p>static CallSite test_site_0;</p>
<p>object test(object a) {<br />
    //guarda do cache monomórfico verifica tipo e versão<br />
    if (test_site_0.type == a.Type &#038;&#038; test_site_0.version == A.Type.version)<br />
        return method (a);<br />
    else<br />
        //ResolveAndInvoke resolve o método "foo", invoca ele e atualiza o cache<br />
        return ResolveAndInvoke (a, "foo", ref test_site_0);<br />
}</p>
<p>//pseudo-código gerado em C# para um cache polimórfico<br />
delegate object InlineCacheNoArg (object this_);</p>
<p>static InlineCacheNoArg test_site_0;</p>
<p>object test(object a) {<br />
    return test_site_0 (a);<br />
}</p>
<p>//pseudo-código inicial do delegate de test_site_0<br />
object test_site_0_v0 (object _this) {<br />
    return ResolveAndInvoke (a, "foo", ref test_site_0);<br />
}</p>
<p>//pseudo-código do delegate depois de chamarmos test (99)<br />
object test_site_0_v1 (object _this) {<br />
    if (_this.Type == typeof (int) &#038;&#038; _this.version == 1)<br />
        //o dispatch aqui pode ser via um delegate dependendo da resolução<br />
        return ((int)_this).foo ();<br />
    return ResolveAndInvoke (a, "foo", ref test_site_0);<br />
}</p>
<p>//pseudo-código do delegate depois de chamarmos test ("str")<br />
object test_site_0_v2 (object _this) {<br />
    if (_this.Type == typeof (int) &#038;&#038; _this.version == 1)<br />
        return ((int)_this).foo ();<br />
    if (_this.Type == typeof (string) &#038;&#038; _this.version == 1)<br />
        return ((string)_this).foo ();<br />
    return ResolveAndInvoke (a, "foo", ref test_site_0);<br />
}<br />
</code></p>
<p>Como fica claro pelo exemplo, um cache polimórfico tem uma performance superior pois usa literais e funciona muito melhor no caso de não existir um tipo dominante entre as ativações. Aqui fica clara a limitação de uma das implementações, o JRuby não pode se dar ao luxo de gerar tantos métodos pois cada um precisa de uma classe e um classloader novos, ou seja, abusa da PermGen do Java.</p>
<p>Apesar de inline caches resultarem em ganho expressivo de performance, estão longe de produzirem algo razoável. O grande problema continua sendo o enorme custo de dispatch para código simples. A chave disso é fazer inferência dos tipos, de forma a conseguir eliminar por completo o overhead dos caches e resolução de nomes. As atuais implementações não implementam se quer inferência estática, ou seja, código como &#8220;123.to_s&#8221; é executado sem qualquer conhecimento prévio de 123.</p>
<p>O grande avanço ocorre se fizemos inferência em tempo de execução. Ou seja, instrumentamos o código para coletar os tipos que aparecem pelo código durante a execução e baseado nisso a máquina virtual gera versões mais eficientes do código. Existem duas técnicas bastante difundidas de como fazer isso, uma é via especialização parcial de métodos e a outra é via trace-based optimization.</p>
<p>Trace-based optimization é a tecnologia adotada pela Tamarin, a próxima VM de Javascript da Mozilla. De maneira sucinta, essa técnica consiste em gravar os trechos, e os tipos encontrados, que executam mais freqüentemente e gerar código eficiente baseado nessa informação. Os trechos gravados costumam incluir vários métodos diferentes e suas ativações juntas. Suas principais vantagens é a conseguir fazer inlining de métodos de maneira muito eficiente e normalmente gastar menos tempo no JIT. Porém existem uma enorme quantidade de problemas complexos de serem resolvidos como limitar expansão descontrolada da quantidade de código gerado.</p>
<p>Especialização parcial de métodos também leva em conta os métodos que executam mais freqüentemente. Os tipos dos parâmetros e valores de retorno<br />
são armazenados e posteriormente utilizados para gerar versões especializadas dos métodos em questão. Sua principal vantagem é a maior simplicidade<br />
e o fato de existir muito mais literatura e ferramentas para gerar código eficiente nestes casos. Para se ter uma idéia do poder dessa técnica um exemplo cai bem:</p>
<p><code><br />
//ruby<br />
def fun (a, b)<br />
    2 * a - b<br />
end</p>
<p>//fun é sempre chamada com números como argumento, "fun (1,2)" por exemplo.</p>
<p>//pseudo-código C# gerado inicialmente (sem usar caches)<br />
object fun_v0 (object a, object b) {<br />
    object tmp = Invoke (2, "*", a"); //_this, nome do método, argumentos<br />
    return Invoke (tmp, "-", b);<br />
}</p>
<p>//pseudo-ćodigo C# gerado após especialização:<br />
int fun_int_int (int a, int b) {<br />
    int tmp = 2 * a; //o método que implementava multiplicação foi inlined<br />
    return tmp - b;<br />
}</p>
<p>object fun_v1 (object a, object b) {<br />
    if (a.Type == typeof (int) &#038;&#038; b.Type == typeof (int) &#038;&#038; typeof (int).version == 1)<br />
        return fun_int_int ((int)a, (int)b);<br />
    object tmp = Invoke (2, "*", a"); //_this, nome do método, argumentos<br />
    return Invoke (tmp, "-", b);<br />
}<br />
</code></p>
<p>Não precisa ir muito longe para imaginar a diferença de performance entre as duas versões. Porém entre descobrir os métodos as serem especializados e gerar código de máquina existe um Just-In-Time compiler que é, surpresa, surpresa, muito trabalhoso de ser escrito para executar rapidamente e gerar código eficiente.</p>
<p>Possui um bom JIT é atualmente um grande dilema entre as implementações de ruby. Pois ao usar o JIT de máquinas virtuais maduras, como HotSpot ou mono, a implementação fica limitada ao que é possível a linguagens gerenciadas. Em contrapartida, ao não utilizá-las, construções de baixo nível como profiler e interpretador podem ser implementadas de forma muito mais eficiente.</p>
<p>Apesar de do futuro parecer muito legal, futuras VMs terão o trabalho adicional de educar a comunidade de desenvolvedores sobre como escrever código rápido em ruby. Coisas como monkey patching furam qualquer esquema de caching ou especialização pois cada objeto passa a ter uma singleton class distinta.</p>
<p>Não existe solução fácil e todas implementações tem muito chão pela frente até Ruby ter uma performance competitiva com outras linguagens dinâmicas. Soluções como as aqui apresentadas devem conseguir melhorias de uma ordem de magnitude tranquilamente, de acordo com os resultados já encontrados. Performance é um problema que é resolvido via muito suor, com uma contínua série de melhoras, atacando um pouco por vez.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2008/05/22/como-fazer-uma-linguagem-dinamica-ser-rapida/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Monkeypatching: gambiarra du-jour</title>
		<link>http://www.kumpera.net/blog/index.php/2008/03/03/monkeypatching-gambiarra-du-jour/</link>
		<comments>http://www.kumpera.net/blog/index.php/2008/03/03/monkeypatching-gambiarra-du-jour/#comments</comments>
		<pubDate>Mon, 03 Mar 2008 14:20:00 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[language design]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2008/03/03/monkeypatching-gambiarra-du-jour/</guid>
		<description><![CDATA[Finalmente o óbvio atingiu a comunidade de desenvolvedores de Ruby. Enfim descobriram que meta-programação sem disciplina é um engôdo. No começo produz resultados fabulosos rapidamente, só que mais adiante se torna um inferno de integração. Não falta gente calejada em Rails para te contar uma miríade de problemas ao integrar frameworks que modificam classes como [...]]]></description>
			<content:encoded><![CDATA[<p>Finalmente o óbvio atingiu a comunidade de desenvolvedores de Ruby. Enfim descobriram que meta-programação sem disciplina é um engôdo. No começo produz resultados fabulosos rapidamente, só que mais adiante se torna um inferno de integração. Não falta gente calejada em Rails para te contar uma miríade de problemas ao integrar frameworks que modificam classes como Object ou Fixnum.</p>
<p>Sistemas grandes e complexos exigem que seus componentes sejam isolados o máximo possível entre si para minimizar a interferência que um pode causar no outro. Em linguagens como Java, com um sistema de tipos simples, normalmente isso se resume a usar interfaces para delimitar fronteiras e protocolos de comunicação inter-módulo. Porém quando temos classes abertas o problema é muito maior, já que o sistema todo pode ser modificado de um único lugar. Permitir que a modificação de classes fundamentais como Kernel em um canto do sistema influencie todo o resto é um sério problema pois fica difícil controlar o estrago que essas mudanças causam.</p>
<p>O problema com Ruby pode ser entendido melhor se olharmos para ele segundo o a classificação de <a href="http://fragmental.tw/research-on-dsls/language-oriented-programming-lop/">domínios de page-jones</a>. Segundo o mesmo, podemos classificá-los em fundamental, arquitetural, negócios e aplicação; sendo que a especificidade aumenta na mesma ordem. Outro ponto é que o domínio menos específico não deve depender de um mais específico, assim como dependências laterais devem ser evitadas. Por essa ótica, código da aplicação alterando uma classe fundamental do sistema é uma clara violação desse modelo.</p>
<p>O motivo pelo qual Ruby viola o modelo de page-jones é por não ser possível definir um escopo que não seja global para alterações feitas a classes externas a código em questão. Outro problema que agrava a situação é a impossibilidade de realmente controlar o mecanismo de resolução de nomes de um bloco de código, isso é um grande problema para criação de DSLs que acabam por fazer enormes cirurgias no core da linguagem ou apelam para o monkeypatching, uma &#8220;solução&#8221; muito menos intrusiva.</p>
<p>Existem duas formas de ser realizar meta-programação; uma é a intrínseca, a qual se permite operar sobre a definição dos tipos e, uma vez feita a alteração, ela é visível a todos usuários do dado tipo, podemos dizer também que é meta-programação no ponto de definição; a outra é a extrínseca, na qual se altera o mecanismo de resolução de nomes para um dado corpo de código, isso permite realizar as mesmas operações que o método anterior, porém todo código precisa informar direta ou indiretamente se existe algo alterando tal mecanismo, podemos dizer também que é meta-programação no ponto de uso.</p>
<p>A vantagem do primeiro é simplicidade e alcance, uma vez feita a modificação nada mais precisa ser feito para sua aplicação utilizar a versão modificada do tipo, porém também é sua fraqueza, pois se uma função depender explicitamente do comportamento anterior ela não mais funcionará &#8211; Ruby é um ótimo exemplo de meta-programação intrínseca. Já a segunda técnica é quase o oposto, pois exige que as modificações sejam explicitamente ativadas, que é sua principal vantagem, pois permite facilmente compor conjuntos de alterações e restringir seu escopo, em contrapartida é sua fraqueza pois não permite que uma dada alteração seja definida por completo em um único lugar &#8211; extension methods do C# 3.0 é um exemplo simples de meta-programação extrínseca.</p>
<p>Tentar comparar ambas as técnicas e concluir qual a melhor é um exercício fútil, pois sempre existirão fartos casos no qual uma falha e a outra brilha. Assim como achar que Ruby é uma linguagem quebrada por possuir seus defeitos, pois apesar de tudo é um modelo ao mesmo tempo muito rico e simples de usar.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2008/03/03/monkeypatching-gambiarra-du-jour/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Erlang é realmente difícil?</title>
		<link>http://www.kumpera.net/blog/index.php/2008/01/19/erlang-e-realmente-dificil/</link>
		<comments>http://www.kumpera.net/blog/index.php/2008/01/19/erlang-e-realmente-dificil/#comments</comments>
		<pubDate>Sat, 19 Jan 2008 18:03:15 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programming languages]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2008/01/19/erlang-e-realmente-dificil/</guid>
		<description><![CDATA[Conversando com um amigo sobre Erlang, ele me comentou que acha a sua sintaxe quase indecifrável, note que se trata de um ótimo programador. Continuando a discussão, resolvi ver qual a diferença de algoritmos simples. Para tornar a comparação justa, vou mostrar o mesmo trecho de código em Java e Erlang. Meu objetivo é explorar [...]]]></description>
			<content:encoded><![CDATA[<p>Conversando com um amigo sobre Erlang, ele me comentou que acha a sua sintaxe quase indecifrável, note que se trata de um ótimo programador. Continuando a discussão, resolvi ver qual a diferença de algoritmos simples. Para tornar a comparação justa, vou mostrar o mesmo trecho de código em Java e Erlang. Meu objetivo é explorar quais são os maiores obstáculos de adoção eaprendizado. Começo com algo bem simples, somar todos os elementos de uma seqüência de inteiros:</p>
<p>Em Java:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">int</span> soma_array <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> array<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">int</span> r <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> array.<span style="color: #006633;">length</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span>
        r <span style="color: #339933;">+=</span> array<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">return</span> r<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Em Erlang:</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #ff3c00;">soma_lista</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Lista</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #ff3c00;">soma_lista</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Lista</span><span style="color: #6bb810;">,</span> <span style="color: #ff9600;">0</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">soma_lista</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">H</span> | <span style="color: #45b3e6;">T</span><span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Acc</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #ff3c00;">soma_lista</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">T</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">H</span> <span style="color: #014ea4;">+</span> <span style="color: #45b3e6;">Acc</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
&nbsp;
<span style="color: #ff3c00;">soma_lista</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Acc</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #45b3e6;">Acc</span><span style="color: #6bb810;">.</span></pre></div></div>

<p>Nada de especial na versão em Java, já a versão em Erlang é bem enigmática, para a maioria quase indecifrável. O problema, talvez, seja o fato de ser uma linguagem puramente funcional, que significa, entre outras coisas, que não existe destructive assignment &#8211; não é possível alterar o valor de qualquer coisa depois de definida. Por isso que todo loop deve ser escrito usando tail recursion*.</p>
<p>Há quem possa achar que a sintaxe não ajuda, pois estamos usando notação própria para pattern matching e processamento de listas. Porém, como veremos, é possível reescrevê-lo removendo a sintaxe enxuta por algo mais familiar a linguagens imperativas. Para exemplificar esse processo, vou aproximar a versão Java o máximo da em Erlang e o primeiro passo é introduzir recursão.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">int</span> soma_array<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> array<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">return</span> soma_array <span style="color: #009900;">&#40;</span>array, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">int</span> soma_array<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> array, <span style="color: #000066; font-weight: bold;">int</span> idx, <span style="color: #000066; font-weight: bold;">int</span> acc<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>idx <span style="color: #339933;">==</span> array.<span style="color: #006633;">length</span><span style="color: #009900;">&#41;</span>
        <span style="color: #000000; font-weight: bold;">return</span> acc<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">return</span> soma_array<span style="color: #009900;">&#40;</span>array, idx <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span>, acc <span style="color: #339933;">+</span> array<span style="color: #009900;">&#91;</span>idx<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Bem melhor agora! O código lembra um pouco mais a versão funcional. Porém ainda tem a diferença que Erlang usa listas encadeadas no lugar de arrays e são processadas maneira similar ao LISP, utilizando uma função que retorna o primeiro elemento e outra que retorna o resto da lista depois do primeiro. Se modificarmos o código Java para levar isso em conta, vamos ter algo que lembra muito Erlang. O código fica da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">interface</span> Lista <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">int</span> head<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003399;">List</span> tail<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">boolean</span> isEmpty<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">int</span> soma_lista<span style="color: #009900;">&#40;</span>Lista list<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">return</span> soma_array <span style="color: #009900;">&#40;</span>list, <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">int</span> soma_lista<span style="color: #009900;">&#40;</span><span style="color: #003399;">List</span> list, <span style="color: #000066; font-weight: bold;">int</span> acc<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>list.<span style="color: #006633;">isEmpty</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #000000; font-weight: bold;">return</span> acc<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">return</span> soma_lista <span style="color: #009900;">&#40;</span>list.<span style="color: #006633;">tail</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, acc <span style="color: #339933;">+</span> list.<span style="color: #006633;">head</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Agora que temos uma versão do código Java com o devido processamento de listas, que tal reescrever a versão em Erlang para não usar a notação de processamento de listas e pattern matching. Com isso teremos algo que é gritantemente próximo ao exemplo anterior, como veremos a seguir:</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #ff3c00;">soma_lista</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Lista</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #ff3c00;">soma_lista</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Lista</span><span style="color: #6bb810;">,</span> <span style="color: #ff9600;">0</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">soma_lista</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Lista</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Acc</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #186895;">if</span>
        <span style="color: #45b3e6;">Lista</span> <span style="color: #014ea4;">==</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #45b3e6;">Acc</span><span style="color: #6bb810;">;</span>
        true <span style="color: #6bb810;">-&gt;</span> <span style="color: #ff3c00;">soma_lista</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff3c00;">tl</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Lista</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Acc</span> <span style="color: #014ea4;">+</span> <span style="color: #ff3c00;">hd</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Lista</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#41;</span>
    <span style="color: #186895;">end</span><span style="color: #6bb810;">.</span></pre></div></div>

<p>Agora sim, temos aquilo que meu amigo pode chamar de código decifrável. Porém não é sem abrir mão do poder da linguagem &#8211; o que é uma pena, eu diria. Um programador de Erlang provavelmente iria estranhar ver algo como escrito na última versão. Para terminar esse artigo vou mostrar como ficaria se utilizarmos as funções de acesso aleatorio a listas, algo não muito aconselhável, já que é uma operação O(N).</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #ff3c00;">soma_lista</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Lista</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #ff3c00;">soma_lista</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Lista</span><span style="color: #6bb810;">,</span> <span style="color: #ff9600;">1</span><span style="color: #6bb810;">,</span> <span style="color: #ff9600;">0</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">soma_lista</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Lista</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Idx</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Acc</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #186895;">if</span>
        <span style="color: #45b3e6;">Idx</span> <span style="color: #014ea4;">&gt;</span> <span style="color: #ff3c00;">length</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Lista</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #45b3e6;">Acc</span><span style="color: #6bb810;">;</span>
        true <span style="color: #6bb810;">-&gt;</span> <span style="color: #ff3c00;">soma_lista</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Lista</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Idx</span> <span style="color: #014ea4;">+</span> <span style="color: #ff9600;">1</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Acc</span> <span style="color: #014ea4;">+</span> <span style="color: #ff4e18;">lists</span>:<span style="color: #ff3c00;">nth</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Idx</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">List</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#41;</span>
    <span style="color: #186895;">end</span><span style="color: #6bb810;">.</span></pre></div></div>

<p>*Já me descobri péssimo com tradução, por isso não me arriscarei com essa também.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2008/01/19/erlang-e-realmente-dificil/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Sobre Ponteros e Pattern Matching</title>
		<link>http://www.kumpera.net/blog/index.php/2007/06/10/sobre-pointeros-e-pattern-matching/</link>
		<comments>http://www.kumpera.net/blog/index.php/2007/06/10/sobre-pointeros-e-pattern-matching/#comments</comments>
		<pubDate>Sun, 10 Jun 2007 23:45:52 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2007/06/10/sobre-pointeros-e-pattern-matching/</guid>
		<description><![CDATA[
Existem alguns conceitos na computação que a partir do momento que são compreendidos se mostram triviais, ao ponto que ser difícil justificar a dificuldade de aprender. Dentre eles tenho ponteiros e pattern matching como dois bons exemplos. Foram, de longe, as duas coisas mais difíceis que aprendi, apesar de hoje considerá-las simples, beirando o trivial. [...]]]></description>
			<content:encoded><![CDATA[<p>
Existem alguns conceitos na computação que a partir do momento que são compreendidos se mostram triviais, ao ponto que ser difícil justificar a dificuldade de aprender. Dentre eles tenho ponteiros e pattern matching como dois bons exemplos. Foram, de longe, as duas coisas mais difíceis que aprendi, apesar de hoje considerá-las simples, beirando o trivial. O problema está mesmo em desenvolver o raciocínio associado a ambos.
</p>
<p>
Ponteiros exigem que a pessoa desenvolva a disciplina mais complicada a um programador, que entender e explorar indireção. Todo problema difícil pode ser resolvido facilmente quando adicionamos um nível extra de  indireção, está é uma das máximas da nossa área, que é importante para todo profissional. O complicado é conseguir ver uma pessoa assimilando a idéia de comportamento indireto, ainda mais por ser algo sem exemplos na natureza.
</p>
<p>
Quando falamos de pattern matching, o segredo por trás é a decomposição estrutural, pela qual os casamentos são realizados. Erlang e Scala são exemplos de linguagens que suportam esse recurso. Sua principal utilidade está em expressar uma série de condicionais de maneira muito mais simples e clara que usando operadores tradicionais. O porém fica pelo fato de sua operação ser muito mais interessante quando usamos tipos algébricos (assunto para outro artigo) que para objetos, então não é nada simples integrar com um linguagem OO.
</p>
<p>
A utilidade em aprender ambos vai além de saber como usá-las, está em entender o fundamento por traz de cada um pois muitos dos grandes avanços da programação estão enraizados neles &#8211; reparem como a maioria do catalogo do GoF trata apenas do uso de indireção adicional.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2007/06/10/sobre-pointeros-e-pattern-matching/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Lugar errado, problema errado</title>
		<link>http://www.kumpera.net/blog/index.php/2007/05/11/lugar-errado-problema-errado/</link>
		<comments>http://www.kumpera.net/blog/index.php/2007/05/11/lugar-errado-problema-errado/#comments</comments>
		<pubDate>Sat, 12 May 2007 02:19:05 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Arquitetural Design]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2007/05/11/lugar-errado-problema-errado/</guid>
		<description><![CDATA[
Os comentários do Phillip no blog do Vitor só me fazem rir de alguém considerar o prevayler para nada que brinquedos. Digo isso por duas razões, pela experiência dos projetos que passei e pelo fato de Java ser uma das piores linguagens possíveis para se implementar prevalencia. Pelos projetos eu eu passei, sempre existiram requisitos [...]]]></description>
			<content:encoded><![CDATA[<p>
Os <a href="http://www.jroller.com/page/vfpamp?entry=schema_evolution_e_retrocompatibilidade_com">comentários do Phillip no blog do Vitor</a> só me fazem rir de alguém considerar o prevayler para nada que brinquedos. Digo isso por duas razões, pela experiência dos projetos que passei e pelo fato de Java ser uma das piores linguagens possíveis para se implementar prevalencia. Pelos projetos eu eu passei, sempre existiram requisitos que inviabilizam seu uso e quanto a Java, bom, basta olhar para o lado para entender.
</p>
<p>
Curiosamente volume de dados nunca foi a razão pelo qual o prevayler não tinha razão. Uma delas foi <strong>latência</strong> e tempo médio de resposta, mas como pode isso ocorrer se o prevayler é tão super mais rápido nas consultas? Simples, o enorme uso de heap tornava o tempo de garbage collection proibitivo, um SGBD usa memória de maneira muito mas eficiente sob o viés do tempo para dar manutenção nela, esse sistema terminou com uma JVM usando 64Mb e a base toda dentro do cache do banco de dados. Outro problema foi <strong>confiabilidade</strong>, o log do prevayler não é protegido de <em>partial writes</em> e usa <em>statement based logging</em>, que não permite recuperação parcial, então se tua controladora corromper o meio do teu log, você se lascou. Porém o maior problema do prevayler é o desenvolvimento com equipes distribuídas ou de médio porte em uma estrutura matricial de projetos, isto é, o esforço de coordenar schema evolution é massacrante, não existe como compartilhar facilmente uma base de dados e a integração entre projetos é infernal.
</p>
<p>
Quanto ao fato de Java ser uma péssima escolha, primeiro pelo fato de não ser uma linguagem baseada em imagem, como smalltalk ou factor, na qual salvar a imagem da heap toda é tão difícil quanto chamar um único método, você não tem que se preocupar com criar toneladas de Commands e transações com rollback são possíveis de ser criadas usando STM(<em>Software Transactional Memory</em>) ou simplesmente alguns <em>become()</em>. Outro problema é que criar buscas complexas com Java é um desastre, muito difícil de bater álgebra relacional ou simplesmente SQL nisso, nesse ponto linguagens funcionais dão um show no Java que beira a humilhação, aplicar predicados e transformações sobre coleções, criando e processando tuplas é super simples, é arroz-com-feijão.
</p>
<p>
No geral, eu vejo o prevayler com um brinquedo educacional para se aprender sobre serialização e só, usar profissionalmente não é interessante do aspecto que vai significar muito provavelmente trabalhar em projetos desintessantes ou mentalmente castrantes. Klaus e companhia que me desculpem, mas esse tipo de problema eu passo adiante, prefiro ficar com os mais divertidos e interessantes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2007/05/11/lugar-errado-problema-errado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Classloader hell</title>
		<link>http://www.kumpera.net/blog/index.php/2007/05/09/classloader-hell/</link>
		<comments>http://www.kumpera.net/blog/index.php/2007/05/09/classloader-hell/#comments</comments>
		<pubDate>Wed, 09 May 2007 21:14:57 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[anger management]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2007/05/09/classloader-hell/</guid>
		<description><![CDATA[
Lendo esse artigo do blog do Daniel, me lembrei que explicar e entender o conceito de defining classloader é bem difícil, principalmente da parte que dita as consequências. Em primeira análise é até simples, toda classe esta associada ao classloader responsável por sua carga, porém a segunda parte que guarda a chave do inferno, o [...]]]></description>
			<content:encoded><![CDATA[<p>
Lendo esse <a href="http://nullability.org/?p=95">artigo do blog do Daniel</a>, me lembrei que explicar e entender o conceito de defining classloader é bem difícil, principalmente da parte que dita as consequências. Em primeira análise é até simples, toda classe esta associada ao classloader responsável por sua carga, porém a segunda parte que guarda a chave do inferno, o defining classloader (aquele que carregou a classe) limita a visibilidade dela e será sempre o primeiro acionado para resolver os tipos que ela depende.</p>
<p>
A regra de escopo que torna classloading um enorme inferno, principalmente pela sutileza que acontece e te morde. De acordo com o Daniel, o classloader acionado não é necessariamente aquele que resolve o tipo, isso acontece devido a delegação. O mecanismo de delegação funciona muito bem quando somente um classloader da hierarquia é capaz de carregar uma dada classe e não existe dependências entre classes no sentido inverso da hierarquia existente entre eles.
</p>
<p>
Explicando melhor esses dois pontos; primeiro, somente um classloader da hierarquia deve ser capaz de carregar uma dada classe, isso se faz necessário senão acabamos com problemas de esquizofrenia de tipos, quando uma classe é carregada por dois classloaders e passa a existir como dois tipos distintos e gera vários <em>ClassCastException</em> sem razão aparente.
</p>
<p>
Por exemplo, dado o código a seguir e a existência de dois classloaders: <em>João</em> e <em>José</em>. Imaginemos a situação na qual a tanto <em>José</em> quanto <em>João</em> carregam a classe <em>Exemplo</em>, cada um definindo um tipo. Vamos supor agora que a aplicação chame <em>novaCoisa</em> de uma instância de <em>Exemplo</em> criada a partir do tipo definido pelo classloader <em>João</em> e passe como parâmetro de uma chamada a <em>fazCoisa</em> de uma instância vinda de <em>José</em>. Por mais curioso que seja, o resultado vai ser um <em>ClassCastException</em> e &#8220;nome da classe: Exemplo&#8221; escrito no console. Legal, não?
</p>
<p><code><br />
class Exemplo{<br />
	public void fazCoisa(Object obj) {<br />
		System.out.println("nome da classe: "+obj.getClass());<br />
		Exemplo ex= (Exemplo)obj;<br />
		ex.toString();<br />
	}</p>
<p>	public Object novaCoisa() {<br />
		return new Exemplo();<br />
	}<br />
}<br />
</code></p>
<p>
O problema anterior é causado por falta de isolamento, objetos de classloaders no mesmo nível hierárquico jamaisdevem se comunicar, a aplicação deve garantir essa separação. Caso seja realmente necessária esta comunicação, ela deve ser feita via call-by-value, ou seja, serializando os objetos nas bordas.
</p>
<p>
O outro problema é o do espelho de duas direções, no qual uma classe enxerga a outra mas a recíproca é falsa. Isso ocorre quando uma classe carregada por um classloader mais próximo da raiz depende de uma classe que pode ser carregada apenas por um classloader mais distante. Como exemplo, dada as classes a seguir e dois classloader, <em>Pai</em> e <em>Filho</em>, vamos ver como isso acontece:</p>
<p><code><br />
class VimDoPai {<br />
	public void print() {<br />
		System.out.println(new VimDoFilho());<br />
	}<br />
}</p>
<p>class VimDoFilho {<br />
	public void print() {<br />
		System.out.println(new VimDoPai());<br />
	}<br />
}<br />
</code></p>
<p>Vamos supor que o classloader <em>Filho</em> delega para <em>Pai</em> a carga de classes. Supondo que <em>Filho</em> carregue a classe <em>VimDoFilho</em> e <em>Pai</em> carregue <em>VimDoPai</em>, quando <em>VimDoFilho.print()</em> for chamado, o classloader <em>Filho</em> delega para <em>Pai</em> e consegue uma referencia para a classe <em>VimDoPai</em>, porém quando <em>VimDoPai.print()</em> é chamado, o classloader <em>Pai</em> não encontrará a classe <em>VimDoFilho</em> e um <em>ClassNotFoundError</em> irá acontecer.
</p>
<p>
No exemplo anterior podemos notar o motivo pelo quando o escopo do classloading é um problema difícil de decifrar. Quando uma classe é carregada por um dado classloader, todas suas dependências serão resolvidas através dele. Tratá-se de uma imposição draconiana, pois abre espaço para uma enorme gama de problemas, como o visto anteriormente. Mais grave é o fato de acabarmos com um sistema no qual objetos que interagem entre sí possuem visões divergentes dos tipos existentes. Infelizmente esta é uma limitação necessária para criar um sistema de tipos sonoro e seguro.
</p>
<p>
Classloading é um mecanismo muito interessante do Java, pois permite criar coisas fabulosas como o container OSGi, porém não deixa de ser a parte mais dolorosa da plataforma quando ocorrem problemas. Java não possui suporte a realmente isolar um classloader de outro, como outras plataformas possuem, e quando precisamos violar o mecanismo de delegação uma enorme quantidade de problemas podem acontecer.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2007/05/09/classloader-hell/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>EJB3 contra Generics</title>
		<link>http://www.kumpera.net/blog/index.php/2007/04/29/ejb3-contra-generics/</link>
		<comments>http://www.kumpera.net/blog/index.php/2007/04/29/ejb3-contra-generics/#comments</comments>
		<pubDate>Sun, 29 Apr 2007 14:52:04 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2007/04/29/ejb3-contra-generics/</guid>
		<description><![CDATA[Esta semana eu descobri que misturar EJB3 e Generics não acontece sem alguns problemas. EJB3 é um bom exemplo de porque erasure nunca foi uma boa idéia e te proibe usar alguns idiomas comuns. Bom, felizmente não é o fim do mundo e tem como contornar sem muita dor.

Para entender o problema, vamos lembrar um [...]]]></description>
			<content:encoded><![CDATA[<p>Esta semana eu descobri que misturar EJB3 e Generics não acontece sem alguns problemas. EJB3 é um bom exemplo de porque <i>erasure</i> nunca foi uma boa idéia e te proibe usar alguns idiomas comuns. Bom, felizmente não é o fim do mundo e tem como contornar sem muita dor.</p>
<p>
Para entender o problema, vamos lembrar um pouco como Generics funciona com herança, temos as interfaces <i>Foo&lt;T&gt;</i> e <i>Bar extends Foo&lt;String&gt;</i>, os métodos de <i>Foo</i> que dependem de <i>T</i> vão, na verdade, usar <i>Object</i>, o mesmo acontece com <i>Bar</i>, que possui nenhum método a mais que <i>Foo</i>. Diferente do que acontece com classes, não são criados métodos sintéticos com a assinatura especializada, por exemplo, em <i>Bla implements Comparable&lt;Bla&gt;</i>, vamos ter um método sintético <i>int compareTo(Bla b)</i>.</p>
<p>
Qual a relação de <i>erasure</i> e métodos sintéticos com EJB3? Simples, em um <i>Stateless Session Bean</i> definimos as interfaces remota e local, mas não precisamos implementá-las. Isso cria uma espécie de ilusão de ótica, pois de um lado achamos que os métodos implementados possuem a assinatura correta e de outro, por conta do <i>erasure</i>, a assinatura é toda reduzida para <i>Object</i>. O resultado é um só, o container não localiza o método com a assinatura solicitada. O seguinte exemplo demonstra este problema:</p>
<p><code><br />
public interface Foo<T> {<br />
   T concat(T t1, T t2);<br />
}</p>
<p>public interface Bla extends Foo<String> {</p>
<p>}</p>
<p>@Stateless<br />
@Remote(Bla.class)<br />
@Local(Bla.class)<br />
public class BlaBean {<br />
   public String concat(String str1, String str2) {<br />
        return str1 + str2;<br />
   }<br />
}</p>
<p></code></p>
<p>
Podem testar este código, vão notar que o container reclama não consegue chamar <i>Object concat(Object, Object)</i>. Nós queremos implementar o código utilizando o tipo especializado, só que para resolver isso vamos ter que jogar pelas regras do compilador e fazer BlaBean implementar Bla. Dessa forma, implementando a interface, o compilador vai aplicar <i>erasure</i> no bean também e a chamada do método vai funcionar corretamente.</p>
<p>
Esta situação me ocorreu quando refatorei a interface de vários SLSB para usarem uma inteface base genérica. Quebrei a cabeça por um bom tempo até me ocorrer que o erasure do generics criou este problema, gostaria de ter encontrado uma solução melhor, mas a que apresentei aqui é um comprometimento razoavel. Meu gosto seria por uma solução da plataforma, como generics implementado direito, ou então uma atualização no RMI para levar reification em conta.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2007/04/29/ejb3-contra-generics/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Utilidade da configuração programática</title>
		<link>http://www.kumpera.net/blog/index.php/2007/04/16/utilidade-da-configuracao-programatica/</link>
		<comments>http://www.kumpera.net/blog/index.php/2007/04/16/utilidade-da-configuracao-programatica/#comments</comments>
		<pubDate>Mon, 16 Apr 2007 14:23:02 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Arquitetural Design]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2007/04/16/utilidade-da-configuracao-programatica/</guid>
		<description><![CDATA[
Parece que configuração programática ficou em voga esses tempos na comunidade Java. A razão não me é muito clara, afinal, todo bom framework deve permitir ser usado de tal forma, porém não de maneira restritiva. Posso ter a opinião viciada nesse caso, mas acredito que configuração deve possuir sua DSL própria e a parte programática [...]]]></description>
			<content:encoded><![CDATA[<p>
Parece que configuração programática ficou em voga esses tempos na comunidade Java. A razão não me é muito clara, afinal, todo bom framework deve permitir ser usado de tal forma, porém não de maneira restritiva. Posso ter a opinião viciada nesse caso, mas acredito que configuração deve possuir sua DSL própria e a parte programática tem sentido apenas quando seu uso automatiza novas tarefas ou, de alguma forma, melhora sua usabilidade pelos desenvolvedores.
</p>
<p>
O maior argumento contra utilizar arquivos de configuração nunca foi muito o formato, seja xml ou qualquer outro, mas sim a quantidade abusiva de informação necessária para satisfazer o framework. Convenhamos, boa parte do tempo vamos usar apenas um conjunto pequeno dos recursos oferecidos e de uma maneira comum. Essas funcionalidades e interações recorrentes, devem possuir uma notação mais sucinta &#8211; o configuração deve ser ser otimizada para o uso comum. Para esse comportamento temos por uso de valores padrão inteligentes.
</p>
<p>
Porem, pode ser feito ainda mais. Neste caso, o framework assume que uma série de interações e padrões de uso serão utilizados e o usuário apenas configura aquilo que for diferente. Por esta maneira de trabalho, temos aquilo que chamamos por configuração por convenção. Juntando com valores padrão inteligentes, configuração deixa de ser uma preocupação, um martírio, para ser apenas um detalhe do projeto &#8211; que é seu devido lugar.
</p>
<p>
Em um cenário como esse, existe valor em expor uma extensa camada programática de acesso à configuração? Pelo resultado encontrado em vários projetos, sim, definitivamente existe, mas longe de ser uma boa ferramenta para substituir os arquivos. Primeiro, acho importante definir quais tipos de configuração existe em um framework e como isso afeta o valor ao abrir as portas para demais programadores.
</p>
<p>
Temos a Configuração de Inicialização, que pode ser vista como uma receita de bolo, que depois de utilizada, é descartada. O Hibernate é um bom exemplo, a configuração informada é utilizada para construir a SessionFactory e depois jogada fora. Outra forma de configuração é o Repositório de Parâmetros, onde toda configuração é armazenada de maneira que possa ser consultada em tempo de execução, o exemplo aqui fica por conta do Struts2, que transforma toda sua configuração em um modelo de objetos que representam os elementos envolvidos no processamento de uma requisição.
</p>
<p>
Das utilidades para configuração programática, destaco transformação, pois é aplicável no caso de Configuração de Inicialização. Transformação, como o nome sugere, altera a configuração já existente em algo mais útil, como colocar todas collections com lazy-loading; ou a partir de dados externos cria novos elementos, por exemplo, mapeando automaticamente todo um pacote de classes.
</p>
<p>
Quando existe um repositório, as possibilidades são maiores, o mecanismo de transformação pode ser aplicado na inicialização ou durante a execução. Para estender o comportamento do repositório utilizasse normalmente o padrão de projeto Plugin, para a descoberta do interessado, caso sejam muito, utiliza-se Chain-of-Responsibility para coordenar as transformações. O Struts2 funciona desta forma, é possível contribuir plugins que são responsáveis por instanciar as actions ou recuperar o mapeamento de um path. É possivel, por exemplo, descobrir quais actions existem no sistema e criar o mapeamento automaticamente.
</p>
<p>
Configuração programática é muito útil, porém não deixa de ser apenas uma ferramenta e, como tal, não deve ser o principal valor que um framework tem a oferecer, pois, a rigor, não trata do problema proposto a ser resolvido. Um framework MVC, por exemplo, deve ter como valores auxiliar no desenvolvimento de sites, dos quais configuração não é uma benéfice, mas sim um ardor maior ou menor para seu usuário.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2007/04/16/utilidade-da-configuracao-programatica/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Green threads &#8211; idéia ruim ou implementações péssimas?</title>
		<link>http://www.kumpera.net/blog/index.php/2007/04/12/green-threads-ideia-ruim-ou-implementacoes-pessimas/</link>
		<comments>http://www.kumpera.net/blog/index.php/2007/04/12/green-threads-ideia-ruim-ou-implementacoes-pessimas/#comments</comments>
		<pubDate>Thu, 12 Apr 2007 15:10:20 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Scalability]]></category>
		<category><![CDATA[concurrency]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2007/04/12/green-threads-ideia-ruim-ou-implementacoes-pessimas/</guid>
		<description><![CDATA[ Todo lugar que se prese a falar sobre modelos de threading, native x green, fala que não existe razão para ter threads implementadas em user-space, chamadas de green-threads, se o SO possuir uma boa implementação nativa. Bom, se olharmos em volta, como  neste blog, nas listas de discussão do JikesRVM, do Ruby ou [...]]]></description>
			<content:encoded><![CDATA[<p> Todo lugar que se prese a falar sobre modelos de threading, native x green, fala que não existe razão para ter threads implementadas em user-space, chamadas de green-threads, se o SO possuir uma boa implementação nativa. Bom, se olharmos em volta, como <a href=" http://ciaranm.org/show_post/110"> neste blog</a>, nas listas de discussão do JikesRVM, do Ruby ou do JRockit da época de 2004, vamos notar que todos reclamam muito das limitações e problemas impostos pelo uso de green-threads. As falhas apontadas são tantas que cria uma duvida se existe alguma justa razão em usá-las.
</p>
<p> Para entender melhor a situação, vejamos o modelo de execução que todo sistema operacional espera de seus processos. Um processo possui uma ou mais threads, cada thread possui apenas uma linha de execução* e faz chamadas bloqueantes ao kernel. Ou seja, cada uma deve seguir executando por apenas um caminho e deve parar enquanto uma chamada ao sistema não completa. Contrastemos agora com modelo de green-threads, que pode ser visto da seguinte forma: um processo possui uma ou mais threads, cada uma administra varias linhas de execução e uma chamada ao kernel não impede prosseguir com as demais.
</p>
<p> Essa diferença de funcionamento gera dois problemas. Primeiro de identidade, já que cada thread não possui somente uma linha de execução associada, então primitivas de locking não funcionam pois duas green-thread vão aparecer para o kernel como uma só. O segundo está relacionado ao comportamento do kernel, uma chamada bloqueante partindo de uma linha de execução vai causar várias outras pararem junto.</p>
<p> Ambos problemas dificultam muito a integração com bibliotecas externas, que podem usar o mecanismo de locking do sistema operacional, ou então bloquear indevidamente demais threads. Por exemplo, no Gtk+, o acesso aos widgets é protegido por locks nativos, que em um ambiente com green-threads vai por água abaixo e acaba corrompendo o estado, também tem o fato que executar processamento pesado fora da thread de eventos não ajuda, pois se uma bloqueia, todas bloqueiam. Por fim, tem a questão da escalabilidade, já que várias threads são bloqueadas sem precisar.</p>
<p> Existem alguns sistemas que conseguiram transpor essas barreiras, mas não sem um alto custo associado. Passam, primeiro, a adotar uma primitiva de mais alto nível que uma thread, como um ator, que é muito mais simples de utilizar. Depois fazem o trabalho pesado, criam um mecanismo de execução assíncrona das tarefas bloqueantes, seja fazendo offload para threads nativas auxiliares, ou usando aio e/ou multiplexação. Por fim, partem para as medidas radicais, definindo uma interface para código estrangeiro que garante a semântica e o comportamento das green-threads.
</p>
<p> A interface de integração com código estrangeiro, também conhecida por FFI (Foreign Function Interface), é o elemento mais crítico e problemático, pois precisa impor uma forma diferente de trabalho aos integradores, normalmente via troca assíncrona de mensagens entre uma thread com o código &#8216;perigoso&#8217; e as demais gerenciadas. Uma versão muito mais cabeluda do JNI, para quem conhece.</p>
<p> Das linguagens que implementam efetivamente userland threading, que eu conheço são<br />
Erlang, Scheme e Factor. Elas permitem o uso de milhares de thread leves que consomem poucos recursos e não fazem o escalonador do SO entrar em parafuso. A JVM da BEA, JRockit, uma época suportou green-threads, mas devido a dificuldade de implementar a parte GUI do Java e não criar caos durante chamadas nativas, desistiram do projeto quando o linux passou a ter suporte nativo descente.</p>
</p>
<p>* Por linha de execução entenda o conjunto de registradores e a pilha de funções.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2007/04/12/green-threads-ideia-ruim-ou-implementacoes-pessimas/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
