

<?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; erlang</title>
	<atom:link href="http://www.kumpera.net/blog/index.php/category/erlang/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>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>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>
		<item>
		<title>Como funciona esse tal de classpath?</title>
		<link>http://www.kumpera.net/blog/index.php/2006/11/02/como-funciona-esse-tal-de-classpath/</link>
		<comments>http://www.kumpera.net/blog/index.php/2006/11/02/como-funciona-esse-tal-de-classpath/#comments</comments>
		<pubDate>Fri, 03 Nov 2006 02:35:03 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[erlang]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2006/11/02/como-funciona-esse-tal-de-classpath/</guid>
		<description><![CDATA[
Qual programador java não ouviu essa pergunta várias vezes? No guj lemos ela quase que diariamente e na maioria dos casos pensamos como pode alguém não saber do que se trata, ou não ser capaz de descobrir sozinho. Bom, hoje senti isso na pele, de não saber algo tão trivial que é quase um insulto [...]]]></description>
			<content:encoded><![CDATA[<p>
Qual programador java não ouviu essa pergunta várias vezes? No guj lemos ela quase que diariamente e na maioria dos casos pensamos como pode alguém não saber do que se trata, ou não ser capaz de descobrir sozinho. Bom, hoje senti isso na pele, de não saber algo tão trivial que é quase um insulto perguntar.
</p>
<p>
Embarquei em um projeto pessoal envolvendo erlang, quero desenvolver um software de tamanho substancial. Quero aprender esse treco e aprender de verdade. Fiz isso com java, desenvolvi, junto com alguns amigos, um software que chegou a ter mais de 330 classes e 52 mil linhas de código. O resultado foi que aprendi muito e fico assustado como acertamos, quase que por acidente, em muitas coisas. Quero repetir isso e quem quiser participar, sinta-se convidado.
</p>
<p>
Voltando ao assunto deste artigo, que era sobre dúvidas elementares. Até então eu só tinha usado erlang através de seu console interativo, resolvi então ver como iniciar uma aplicação diretamente. Mãos a obra! Eu sei java e sei que preciso definir um classpath no qual a VM encontrará minha classe com método o main desejado. Facil, não?
</p>
<p>
Acho que ninguém imagina que  <i>&#8220;erl -classpath&#8221;</i> funcionaria. Depois de ler a documentação com os muitos parâmetros que o erl, que é o equivalente moral ao java.exe, continuei sem ter idéia de como fazer. Minha solução foi baixar o yaws, um servidor http escrito em erlang, e decifrar o script de inicialização dele. Consegui, depois de quase duas horas de frustações, fazer o trivial.
</p>
<p>
Essa empreitada de hoje me mostrou que iniciar em uma tecnologia completamente nova é trabalhoso, até mesmo para tarefas supostamente simples. Como pode que não existe um tutorial facilmente acessivel que me diz como fazer isso? Provavelmente o mesmo ocorre com Java e, descontato aqueles que não tem empenho suficiente, gera muita frustação para quem está no começo.
</p>
<p>
Aproveitando, caso interesse a alguém fazer o mesmo que eu, primeiro use o parâmetro &#8220;-pa&#8221; para indicar os diretórios que contém os arquivos beam e depois use &#8220;-s&#8221; para o processo init do emulador chamar a função que você deseja.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2006/11/02/como-funciona-esse-tal-de-classpath/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HotSwap de código é a muleta do Java</title>
		<link>http://www.kumpera.net/blog/index.php/2006/09/16/hotswap-de-codigo-e-a-muleta-do-java/</link>
		<comments>http://www.kumpera.net/blog/index.php/2006/09/16/hotswap-de-codigo-e-a-muleta-do-java/#comments</comments>
		<pubDate>Sat, 16 Sep 2006 04:15:04 +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/2006/09/16/hotswap-de-codigo-e-a-muleta-do-java/</guid>
		<description><![CDATA[O Daniel comentou como fazer o HotSwap funcionar com o oc4j, dai veio o Diego e falou de como isso é coisa velha na plataforma desde a 1.4 &#8211; me lembro be de todo maldito beta desse release, que cada um vinha com bugs diferentes no java.nio. Hot Code Replace é uma técnica util, não [...]]]></description>
			<content:encoded><![CDATA[<p>O Daniel comentou como fazer o HotSwap funcionar com o oc4j, dai veio o Diego e falou de como isso é coisa velha na plataforma desde a 1.4 &#8211; me lembro be de todo maldito beta desse release, que cada um vinha com bugs diferentes no java.nio. Hot Code Replace é uma técnica util, não tanto para debug até, só que é extremamente restritivo e vira motivo de chacota quando comparamos com linguagens dinâmicas.</p>
<p>Linguagens dinâmicas, como Python e Ruby tem a obrigaçào moral de suportar um sistema muito mais dinâmico que Java. Os dois motivos são bem razoaveis: o primeiro que não existem informações de tipos no código da aplicação, logo não existe o problema da assinatura da função mudar de &#8220;int f(int)&#8221; para &#8220;short f(int)&#8221;; e tem a vantagem de possuirem runtimes muito mais simples &#8211; apenas com um interpretador, lidar com todos os problemas do ponto de vista de um JITer é um caos.</p>
<p>HCR é super importante para o recurso de intrumentação introduzido no java5. Tem um monte de ferramentas de diagnóstico e profiling leves que se baseiam na API java.lang.instrument.</p>
<p>Imagine que sua aplicação em produção está deixando a desejar em termos de performance, mas felizmente ela foi intrumentada em pontos estratégicos para monitorar coisas como tempo de resposta do banco e quais actions do Struts estão causando problemas. Esse troubleshooting ocorre no sistema de produção e quase não orera o sistema &#8211; diferente de um profiler.<br />
Não acho que vale muito a pena perder tempo tentando melhorar essa tecnologia, pois é muito complexa. Seria muito mais interessante uma JVM com suporte a isolates super super leves, ao ponto de podermos criar um para cada requisição web que desejássemos processar. Com isso teriamos aquilo que todo programador de cobol e mainframe esfrega com tanto orgulho na nossa cara, a robustes e isolamento a falhas da plataforma deles. Uma requisição web que causa um OOM mata o sistema inteiro, mas se pudessemos utilizar isolates, dava até para dormir melhor com estagiarios trabalhando no projeto.</p>
<p>Por isso que Erlang é a linguagem mineirinha da atualidade, ela vai comendo quieta pelas bordas e vai supreender, nós desenvolvedores de Java, c# e Ruby, pois quando a Intel lançar um processador com 32 cores e o MacPro vier com 8 desses brinquedos nós não vamos ter a menor idéia de como fazer o load do sistema chegar em 10% sem tudo explodir. Se você acha que estou exagerando, os quad-core da intel saem no final desse ano, coisa de 18 meses depois dos primeiros Core 2 Duo e nosso querido Gordon Moore vai continuar acertando.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2006/09/16/hotswap-de-codigo-e-a-muleta-do-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Futuro da programação concorrente</title>
		<link>http://www.kumpera.net/blog/index.php/2006/09/07/futuro-da-programacao-concorrente/</link>
		<comments>http://www.kumpera.net/blog/index.php/2006/09/07/futuro-da-programacao-concorrente/#comments</comments>
		<pubDate>Fri, 08 Sep 2006 02:45:18 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[concurrency]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[shared-memory]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2006/09/07/futuro-da-programacao-concorrente/</guid>
		<description><![CDATA[Programação concorrente é dificil, mais dificil que acordar cedo em pleno inverno. Arrumar gente que entenda e saiba escrever corretamente aplicações multi-threaded é muito dificil. O pior que é bem razoavel esperar isso, afinal acompanhar mentalmente o fluxo de várias threads em paralelo no mínimo faz o cérebro doer. Ou resolvemos isso logo, ou estaremos [...]]]></description>
			<content:encoded><![CDATA[<p>Programação concorrente é dificil, mais dificil que acordar cedo em pleno inverno. Arrumar gente que entenda e saiba escrever corretamente aplicações multi-threaded é muito dificil. O pior que é bem razoavel esperar isso, afinal acompanhar mentalmente o fluxo de várias threads em paralelo no mínimo faz o cérebro doer. Ou resolvemos isso logo, ou estaremos nos condenando a passar os próximos anos apenas tentando arrumar esse embrólio.</p>
<p>O grande problema é o modelo que as linguagens que usamos, tais como Java, C ou Ruby, tem essa coisa horrivel que é memória compartilhada entre as várias linhas de execução, nossas queridas threads. O Joe Armstrong, um guru nesta área argumenta sobre isso <a href="http://armstrongonsoftware.blogspot.com/2006/09/why-i-dont-like-shared-memory.html">neste artigo</a> e defende o porque de ser um problema muito bem.</p>
<p>O Joe também fala que apenas usando múltiplos procesos e passagem de mensagens entre eles é possivel conseguir o mesmo resultado, só que de forma muito mais facil e confiavel, ele ainda sugere usar Erlang. A um tempo <a href="http://www.kumpera.net/blog/index.php/2006/07/28/construindo-sistemas-multi-threaded-de-forma-facil/">escrevi um artigo</a> falando um pouco sobre como Erlang funciona e ainda continuo firme que o seu modelo de execução é muito superior ao que temos nas linguagens mainstream &#8211; mas peca por ser uma linguagem dificil de usar.</p>
<p>Mas quais são as característica que tornam Erlang tão interessantes? Primeiro, seu suporte a processos super leves, manter um milhão deles executando em paralelo é perfeitamente possivel, já que para criar um basta pouco mais de 1kb de memória e o tempo de alocá-la &#8211; compare isso com o tempo e o uso de memória para subir uma JVM. Depois temos uma sintaxe especial para troca de mensagens assíncronas entre processos &#8211; que é uniforme em relação a localização de cada um. Cada processo possui sua área propria de memória, se um processo fizer muita meleca e morrer, nada interfere no funcionamento dos demais. Essa resiliência torna Erlang uma linguagem muito mais segura e confiavel que as demais.</p>
<p>Por isso que eu acredito que o próximo Java vai ser a linguagem que suportar um ambiente de execução semelhante ao do Erlang. Esse me parece ser o avanço técnológico que justificaria uma adoção em massa, e para entender isso bastar olharmos para tras. Gerenciamento manual de memória é facil de explicar e fazer um estagiário entender, ele vai saber que quando terminar de usar um pedaço de memória, ele deve ser liberado &#8211; apesar disso excelentes desenvolvedores gastam muito tempo caçando memory-leaks em código C/C++. Programação concorrente com memória compartilhada é dificil achar plenos/seniors que são capazes de entender direito. Java introduziu gerenciamento automático de memória para as massas, agora precisamos uma linguagem que faça o mesmo com processos leves e passagem de mensagens.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2006/09/07/futuro-da-programacao-concorrente/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
