

<?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; Programming</title>
	<atom:link href="http://www.kumpera.net/blog/index.php/category/programming/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>Limites da orientação a objetos</title>
		<link>http://www.kumpera.net/blog/index.php/2009/08/30/limites-da-orientacao-a-objetos/</link>
		<comments>http://www.kumpera.net/blog/index.php/2009/08/30/limites-da-orientacao-a-objetos/#comments</comments>
		<pubDate>Sun, 30 Aug 2009 20:00:06 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Programming language Theory]]></category>
		<category><![CDATA[language design]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[plt]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[type systems]]></category>
		<category><![CDATA[typeclasses]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/?p=136</guid>
		<description><![CDATA[Toda linguagem de programação pode ser analisada pela sua junção de três elementos distintos: forma, comportamento e taxonomia. Cada um define um aspectodistinto de como o conjunto de valores que compõe um programa é usado.
Cada um destes valores possui um forma, que é a representação concreta para o conceito abstrato que cada um significa. Um [...]]]></description>
			<content:encoded><![CDATA[<p>Toda linguagem de programação pode ser analisada pela sua junção de três elementos distintos: forma, comportamento e taxonomia. Cada um define um aspectodistinto de como o conjunto de valores que compõe um programa é usado.</p>
<p>Cada um destes valores possui um forma, que é a representação concreta para o conceito abstrato que cada um significa. Um array de bytes e uma lista de chars são duas maneiras de representar uma string &#8211; um conceito abstrato. Forma admite composição e extensão, mas isso é razoavelmente óbvio.</p>
<p>Por comportamento me refiro a um grupo que operações definido que operam em um dado conjunto de valores. Repetindo nosso exemplo, strings, podemos definir particionamento, remover espaços em branco e pois ai vai. Ou seja, nada mais simples que um conjunto de funções.</p>
<p>Por fim, taxonomia é como damos nomes a conjuntos de valores. Ruby, que usa um sistema nominal de tipos, damos um nome explicitamente a um dado conjunto de valores que irão habitar uma classe. Outro aspecto importante é que podemos usar os operadores da teoria de conjuntos para definir relações entre pares. Voltando a Ruby, a única relação é a de subconjunto, que é a herança entre duas classes.</p>
<p>São três elementos bem distintos, porém, linguagens OO misturam dois, as vezes mesmo todos. Por exemplo, classes são os três ao mesmo tempo, atributos a forma, métodos o comportamento e a taxonomia vem através da relação herança entre duas classes. Interfaces misturam comportamento e taxonomia. Mixins misturam forma e comportamento. O problema disso é quando você quer manipular apenas um e os outros vem de brinde.</p>
<p>Linguagens funcionais costumam lidar de forma mais efetiva com esse problema. Haskell separa muito bem isso, com datatypes para forma, funções lidam com o comportamento e typeclasses resolvem a questão da taxonomia. Dessa forma é possível focar apenas em um dos três sem nenhuma bagagem extra.</p>
<p>Um problema com haskell é que uma typeclass classifica todos habitantes de um dado tipo, não é possível fazer isso com uma parte apenas. Nesse sentido Qi possui um sistema de tipos muito interessante, baseado em sequent calculus, permitindo definir de forma mais precisa quais valores compõe um dado tipo.</p>
<p>Eu acredito que essa limitação da orientação a objetos é a razão pelo qual tantas pessoas preferem fugir para linguagens OO dinâmicas, que aliviam boa parte do problema dado que forma e taxonomia poder ser consideradas ad-hoc, agrada a vários, mas realmente não me agrada para construir sistema de grande escala.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2009/08/30/limites-da-orientacao-a-objetos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Onde estão os profissionais?</title>
		<link>http://www.kumpera.net/blog/index.php/2009/05/15/onde-estao-os-profissionais/</link>
		<comments>http://www.kumpera.net/blog/index.php/2009/05/15/onde-estao-os-profissionais/#comments</comments>
		<pubDate>Fri, 15 May 2009 12:34:56 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[misc]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/?p=133</guid>
		<description><![CDATA[Todo mundo fala que existe um deficit de profissionais de tecnologia enorme. Aquele mítico número de cem mil profissionais que ninguém consegue achar. Que isso é um fato, não ha de se discutir, todas empresas com que tenho contato próximo possuem varias vagas em aberto a muitos meses.
A primeira solução que vem à cabeça de [...]]]></description>
			<content:encoded><![CDATA[<p>Todo mundo fala que existe um deficit de profissionais de tecnologia enorme. Aquele mítico número de cem mil profissionais que ninguém consegue achar. Que isso é um fato, não ha de se discutir, todas empresas com que tenho contato próximo possuem varias vagas em aberto a muitos meses.</p>
<p>A primeira solução que vem à cabeça de todos são as faculdades, afinal, uma boa graduação em ciências da computação é uma sólida fundação para um profissional da área. Devem faltar vagas ou coisa parecida, não?</p>
<p>Não, os números da educação superior em computação podem ser entendidos por sórdidos ou desastrosos &#8211; ao gosto do leitor. Segundo <a href="http://www.ibm.com/developerworks/blogs/page/academicbr?entry=produzo_software_no_brasil_na">esse artigo</a> são ofertadas todos os anos 150 mil vagas pelas faculdades. Porém apenas noventa mil se inscrevem nos processos seletivos e, pasmem, apenas 44mil se matriculam de fato em algum curso.</p>
<p>Não satisfeito com tal injúria, informo que apenas 17 mil destes se formam todos os anos. Assustador, no mínimo. Porém sejamos realistas, de seus colegas graduados quantos realmente ingressam na área? No meu caso, digo que esse número é próximo da metade.</p>
<p>Por essa análise, a cada ano o pais oferece 150mil vagas que resultarão em 8.500 novos profissionais ou, em termos relativos, uma taxa de aproveitamento de 5.6%. Pífio, péssimo, patético. Agora de quem é a culpa disso? Provavelmente minha, e sua, de todos nós. Está mais que na hora de fazermos algo pelos alumni de tecnologia deste pais.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2009/05/15/onde-estao-os-profissionais/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Lançado Mono 2.2 com estréia de Mono.Simd</title>
		<link>http://www.kumpera.net/blog/index.php/2009/01/14/lancado-mono-22-com-estreia-de-monosimd/</link>
		<comments>http://www.kumpera.net/blog/index.php/2009/01/14/lancado-mono-22-com-estreia-de-monosimd/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 01:36:43 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[mono simd programming performance]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/?p=125</guid>
		<description><![CDATA[Acabou de ser lançado versão 2.2 do Mono. Foram vários meses de trabalho e muito suor em corrigir centenas de bugs para podermos fazer nosso melhor release de todos os tempos. Dentro das novidades gostaria de destacar duas relativa ao time que participo. A primeira é o novo JIT baseado em uma representação intermediaria linear, [...]]]></description>
			<content:encoded><![CDATA[<p>Acabou de ser l<a href="http://www.mono-project.com/Release_Notes_Mono_2.2">ançado versão 2.2 do Mono</a>. Foram vários meses de trabalho e muito suor em corrigir centenas de bugs para podermos fazer nosso melhor release de todos os tempos. Dentro das novidades gostaria de destacar duas relativa ao time que participo. A primeira é o novo JIT baseado em uma representação intermediaria linear, os ganhos de performance podem chegar em até 50% e, também importante, o código do JIT ficou muito mais simples e extensível.  A segunda novidade, resultado da maior flexibilidade do mono, é a disponibilização preliminar da biblioteca Mono.Simd, que permite usar a unidade vetorial de processadores modernos.</p>
<p>A impossibilidade utilizar a unidade vetorial a partir de linguagens gerenciadas sempre foi uma das principais críticas dos desenvolvedores C e C++ sob a viabilidade em utilizá-las para código rico em calculo matemático. Isso agora é passado e usando mono e C# é possível gerar código com de alta performance similar ao possível com linguagens de baixo nível.</p>
<p>Para se ter uma ideia das possibilidades, um simples exemplo que transforma uma série de vetores com uma mesma matriz chega a ser 3x mais rápido usando Mono.Simd que o código não vetorial em C, Java ou C#. Isso sem perder as vantagens de se utilizar uma linguagem de alto nível e segura. Mas vamos ao código:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">//Primeiro transformação usando ponto flutuante normal</span>
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Transform <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">ref</span> Matrix matrix, <span style="color: #0600FF;">ref</span> Vector vector, <span style="color: #0600FF;">ref</span> Vector result<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        result.<span style="color: #0000FF;">x</span> <span style="color: #008000;">=</span> vector.<span style="color: #0000FF;">x</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m00</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">y</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m01</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">z</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m02</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">w</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m03</span><span style="color: #008000;">;</span>
        result.<span style="color: #0000FF;">y</span> <span style="color: #008000;">=</span> vector.<span style="color: #0000FF;">x</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m10</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">y</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m11</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">z</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m12</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">w</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m13</span><span style="color: #008000;">;</span>
        result.<span style="color: #0000FF;">z</span> <span style="color: #008000;">=</span> vector.<span style="color: #0000FF;">x</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m20</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">y</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m21</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">z</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m22</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">w</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m23</span><span style="color: #008000;">;</span>
        result.<span style="color: #0000FF;">w</span> <span style="color: #008000;">=</span> vector.<span style="color: #0000FF;">x</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m30</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">y</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m31</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">z</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m32</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">w</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m33</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">//Agora usando Mono.Simd</span>
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Transform <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">ref</span> Matrix4f matrix, <span style="color: #0600FF;">ref</span> Vector4f vector, <span style="color: #0600FF;">ref</span> Vector4f result<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        Vector4f v <span style="color: #008000;">=</span> vector<span style="color: #008000;">;</span>
&nbsp;
        Vector4f r0 <span style="color: #008000;">=</span> v.<span style="color: #0000FF;">Shuffle</span> <span style="color: #000000;">&#40;</span>ShuffleSel.<span style="color: #0000FF;">XFromX</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">YFromX</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">ZFromX</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">WFromX</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        Vector4f r1 <span style="color: #008000;">=</span> v.<span style="color: #0000FF;">Shuffle</span> <span style="color: #000000;">&#40;</span>ShuffleSel.<span style="color: #0000FF;">XFromY</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">YFromY</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">ZFromY</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">WFromY</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        Vector4f r2 <span style="color: #008000;">=</span> v.<span style="color: #0000FF;">Shuffle</span> <span style="color: #000000;">&#40;</span>ShuffleSel.<span style="color: #0000FF;">XFromZ</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">YFromZ</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">ZFromZ</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">WFromZ</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        Vector4f r3 <span style="color: #008000;">=</span> v.<span style="color: #0000FF;">Shuffle</span> <span style="color: #000000;">&#40;</span>ShuffleSel.<span style="color: #0000FF;">XFromW</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">YFromW</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">ZFromW</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">WFromW</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        r0 <span style="color: #008000;">=</span> r0 <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">row0</span><span style="color: #008000;">;</span>
        r1 <span style="color: #008000;">=</span> r1 <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">row1</span><span style="color: #008000;">;</span>
        r2 <span style="color: #008000;">=</span> r2 <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">row2</span><span style="color: #008000;">;</span>
        r3 <span style="color: #008000;">=</span> r3 <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">row3</span><span style="color: #008000;">;</span>
&nbsp;
        result <span style="color: #008000;">=</span> r0 <span style="color: #008000;">+</span> r1 <span style="color: #008000;">+</span> r2 <span style="color: #008000;">+</span> r3<span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span></pre></div></div>

<p>O código usando Mono.Simd fica um pouco mais complexo, principalmente até se entender como Shuffle e outros combinadores funcionam. Porém quando executado, a versão tradicional precisa executar 16 operações de multiplicação e 12 de soma contra 4 multiplicações 3 somas simd na versão vetorizada. A diferença é clara e o números também.</p>
<p>O release 2.2 foi o resultado de muito esforço pelo time por traz do mono e todos seus contribuidores. Esse release, porém, é especial para mim pois Mono.Simd é resultado de alguns meses de trabalho meu e fiquei muito feliz com a repercussão positiva que recebemos &#8211; vários projetos estão estudando como implementar bibliotecas de matemática vetorial usando ela.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2009/01/14/lancado-mono-22-com-estreia-de-monosimd/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Ode ao C</title>
		<link>http://www.kumpera.net/blog/index.php/2009/01/12/ode-ao-c/</link>
		<comments>http://www.kumpera.net/blog/index.php/2009/01/12/ode-ao-c/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 02:34:40 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[anger management]]></category>
		<category><![CDATA[language design]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[macros]]></category>
		<category><![CDATA[type systems]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/?p=123</guid>
		<description><![CDATA[A parte que mais odeio no C é ser minha melhor opção. Sim, sério, para aquilo que faço hoje em dia, realmente não existe linguagem melhor. E isso de deixa maluco pois se trata de uma linguagem anacrônica, cheia de problemas enormes que aparentemente toda comunidade de PLR esqueceu de tentar resolver.
Para quem já programou [...]]]></description>
			<content:encoded><![CDATA[<p>A parte que mais odeio no C é ser minha melhor opção. Sim, sério, para aquilo que faço hoje em dia, realmente não existe linguagem melhor. E isso de deixa maluco pois se trata de uma linguagem anacrônica, cheia de problemas enormes que aparentemente toda comunidade de PLR esqueceu de tentar resolver.</p>
<p>Para quem já programou em C, ou mesmo C++, e em uma linguagem de alto nível tais quais C#, Haskell ou LISP sabe o tamanho do sofrimento que é trabalhar com uma ferramenta tão primitiva. Aos incautos não estou me referindo nem me referindo as vantagens óbvias dessas linguagens como gerenciamento automático de lixo, um sistema de tipos rico ou tipagem ou dinâmica[1].</p>
<p>Quando se programa próximo do metal ter um controle e visão muito clara daquilo que é gerado é muito importante, então coisas como verificações inseridas pelo compilador, não ter controle fino sobre a representação dos dados ou simplesmente não podem burlar o sistema de tipos inviabilizam o uso de uma linguagem &#8211; por mais estranho que pareça.</p>
<p>Entretanto usar destes argumentos para defender as relíquias que são C e C++ é temerário. Ambas linguagens foram construídas sob as bases do que era avançado em termos de compiladores nos anos 70 e para a capacidade de processamos do começo dos anos 90. Muita coisa mudou de lá para cá, menos o fato de C++ demorar horrores para compilar.</p>
<p>A primeira grande falha do C, e uma que chama muito a atenção, é o sistema de módulos e compilação separada. Que realmente não existe. Em ambas as linguagens se usa inclusão textual de cabeçalhos com declarações supostamente exportadas por outros módulos do sistema e pronto. O problema disso é óbvio se já tiver trabalhado em projetos grandes. O tempo de compilação individual aumenta sem razão aparente, conflitos com o nome de símbolos ocorrem e, em geral, atrapalham a vida de todos.</p>
<p>Continuando com a questão de processamento de texto. Macros em C provavelmente são o recurso mais importante da linguagem, aquele que a tira da lista de inúteis. É bem freqüente encontrar uma infinidade de truques feitos usando macros para sanar a falta de expressividade da linguagem. Porém tão comum quanto é encontrar gente frustada com a dificuldade de depurar um sistema rico em macros. Ao mesmo tempo, programando um dia com LISP qualquer um enxerga que um grande sistema de macros faz qualquer linguagem medíocre ir muito longe.</p>
<p>Por fim, minha última reclamação é devido ao fato de estar em 2009 e ainda ser obrigado a usar uma linguagem sem inferência de tipos. O artigo do Robin Milner tem quase 31 anos e ainda assim sou obrigado a pagear o compilador com aquilo que ele consegue descobrir sozinho. Inferência de tipos é um recurso ainda mais importante quando falamos de sistemas de tipos mais ricos.</p>
<p>Ainda assim, por algum motivo que me escapa, não existe um substituto usável para C ou C++. Talvez seja pelo fato de tal linguagem não possuir muito acadêmico em termos de papers e PHDs, ou que a enorme parte da comunidade de programadores destas linguagens é cega por achar que são o último biscoito do pacote.</p>
<p>[1]Ou latente, caso tenha um fetiche pelo Fowler.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2009/01/12/ode-ao-c/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Herança não funciona, parte III</title>
		<link>http://www.kumpera.net/blog/index.php/2008/12/01/heranca-nao-funciona-parte-iii/</link>
		<comments>http://www.kumpera.net/blog/index.php/2008/12/01/heranca-nao-funciona-parte-iii/#comments</comments>
		<pubDate>Mon, 01 Dec 2008 14:35:14 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Programming language Theory]]></category>
		<category><![CDATA[language design]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/?p=119</guid>
		<description><![CDATA[Em artigos anteriores eu descrevi algum dos problemas associados com herança, ou subtipagem, e questões ligadas a co/contravariância. Porém outra questão me chamou muito a atenção recentemente, é o fato de classes e objetos como normalmente vemos em linguagens com tipagem explícita são uma mistura de conceitos que talvez não deveriam estar juntos.
O que exatamente [...]]]></description>
			<content:encoded><![CDATA[<p>Em <a href="http://www.kumpera.net/blog/index.php/2007/11/13/heranca-nao-funciona/">artigos</a> <a href="http://www.kumpera.net/blog/index.php/2007/12/31/heranca-nao-funciona-parte-2/">anteriores</a> eu descrevi algum dos problemas associados com herança, ou subtipagem, e questões ligadas a co/contravariância. Porém outra questão me chamou muito a atenção recentemente, é o fato de classes e objetos como normalmente vemos em linguagens com tipagem explícita são uma mistura de conceitos que talvez não deveriam estar juntos.</p>
<p>O que exatamente objetos de linguagens comuns, feito C++, oferecem? Basicamente três coisas: layout, interfaces e subtipagem. Uma classe derivada define uma estrutura de dados que é uma extensão do layout daquelas de seus parentes; o mecanismo de funções virtuais é a única forma sã de se definir interfaces; e, por fim, herança é a forma de se definir uma relação de subtipagem entre dois tipos, no caso do C++ classes.</p>
<p>As duas primeiras propriedades são realmente úteis, a terceira é questionável &#8211; mas não vamos atentar para isso agora. Não existe uma razão óbvia para deixar extensão estrutural e interfaces atadas uma a outra. De fato, é uma enorme limitação. Java e C# possuem o mecanismo de interfaces para resolver isso, porém ambas exigem que todas sejam definidas de antemão, ou seja, são uma minúscula fração do número potencial de interfaces que suportam. Ou seja, adora um modelo de interfaces prescritivo e não latente.</p>
<p>Algumas linguagens funcionais resolvem este problema adotando alguma forma de <a href="http://en.wikipedia.org/wiki/Higher-order_logic">tipos de alta ordem</a>*, que permitem uma função ser definida em termos da interface exigida de um objeto e basta este atendê-la para poder ser usado, independente de herança. Pode ser visto, a grosso modo, como um mecanismo equivalente à interfaces no Java ou C# onde cada classe não precisa definir quais suportam, basta implementar os métodos relacionados.</p>
<p>À primeira vista, tipos de alta ordem, ou <a href="http://en.wikipedia.org/wiki/Type_class">classes de tipos</a> na terminologia e implementação do Hakell, podem parecer a mesma coisa que templates do C++, porém a semelhança fica apenas na superfície, templates são um mecanismo de macro-expansão estruturada, não existe como validar uma função em sua definição ou uso, é necessário sempre fazer sua expansão para verificar sua validade. Outra diferença gritante é a ampla possibilidade de compartilhar código entre as várias instanciações de uma função que usa tipos de alta ordem. Existe uma longa literatura sobre o assunto e várias formas de favorecer uso de memória ou performance.</p>
<p>Mas voltando a questão de se subtipagem é uma propriedade interessante ou não para uma linguagem ter. Bom, teoricamente é muito interessante poder definir relações de substituibilidade, mas na prática, a maioria dos frameworks não se valem de tal princípio. Um bom exemplo é o pacote de coleções do Java, ela é toda construída em termos de interfaces e herança é usada como uma forma tosca de promover reuso de código.</p>
<p>O súbito interesse por linguagens funcionais nesses últimos anos vem trazendo a tona uma série de avanços que estas linguagens possuem e estavam até então restritos à comunidade científica. Está mais que na hora para começarmos a repensar todos os antigo erros e quimeras que as linguagens de programação de mercado promovem e começar a pensar como produzir algo que nos permita dar o mesmo salto dos anos 60 que Algol e Fortran garantiram &#8211; e dessa vez nenhum idéia pode ser refém.</p>
<p>*A wikipedia, apesar de extensão não tem uma referencia para tipos de alta ordem, então vou me valer como referencia lógica de alta ordem e deixar como exercício a aplicação do mesmo para teoria de tipos. Type classes do Haskell podem ser construídas aplicando lógica de alta ordem à um sistema de tipos básico como o descrito em &#8220;Basic Simple Type Theory &#8211; Hindley, J. Roger&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2008/12/01/heranca-nao-funciona-parte-iii/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Code swarm: representando visualmente um projeto</title>
		<link>http://www.kumpera.net/blog/index.php/2008/10/02/code-swarm-representando-visualmente-um-projeto/</link>
		<comments>http://www.kumpera.net/blog/index.php/2008/10/02/code-swarm-representando-visualmente-um-projeto/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 17:52:34 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[code swarm]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[moonlight]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/?p=104</guid>
		<description><![CDATA[Como podemos produzir uma representação visual da evolução de um projeto? O pessoal do projeto code swarm tem uma ótima resposta. Um vídeo gerado a partir do histórico de commits do projeto.
O mais legal disso tudo é que o software é de código aberto, então qualquer um pode produzir vídeos também. Resolvi então fazer uma [...]]]></description>
			<content:encoded><![CDATA[<p>Como podemos produzir uma representação visual da evolução de um projeto? O pessoal do projeto <a href="http://code.google.com/p/codeswarm/">code swarm</a> tem uma ótima resposta. Um vídeo gerado a partir do histórico de commits do projeto.</p>
<p>O mais legal disso tudo é que o software é de código aberto, então qualquer um pode produzir vídeos também. Resolvi então fazer uma série deles baseados no mono. Abaixo está o primeiro deles, mostrando o moonlight. Fico devendo o áudio para o próximo.</p>
<p><object width="640" height="480"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=1867774&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=1867774&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"></embed></object><br /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2008/10/02/code-swarm-representando-visualmente-um-projeto/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A Nova onda de interpretadores</title>
		<link>http://www.kumpera.net/blog/index.php/2008/09/30/a-nova-onda-de-interpretadores/</link>
		<comments>http://www.kumpera.net/blog/index.php/2008/09/30/a-nova-onda-de-interpretadores/#comments</comments>
		<pubDate>Tue, 30 Sep 2008 05:00:33 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[language design]]></category>
		<category><![CDATA[Dalvik]]></category>
		<category><![CDATA[interpretadors]]></category>
		<category><![CDATA[máquinas virtuais]]></category>
		<category><![CDATA[SquirelFish]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/?p=92</guid>
		<description><![CDATA[Interpretadores voltaram a ser um assunto muito discutido devido aos resultados alcansados pela SquirrelFish (interpretador de javascript do Webkit) e ao fato da VM do Android também usar um. Curiosamente, ambas VMs são baseadas em registradores em vez de pilha, como as máquinas virtuais tradicionais como JVM e CLR.
A grande diferença está na forma como [...]]]></description>
			<content:encoded><![CDATA[<p>Interpretadores voltaram a ser um assunto muito discutido devido aos resultados alcansados pela SquirrelFish (interpretador de javascript do Webkit) e ao fato da VM do Android também usar um. Curiosamente, ambas VMs são baseadas em registradores em vez de pilha, como as máquinas virtuais tradicionais como JVM e CLR.</p>
<p>A grande diferença está na forma como valores intermediários são calculados. Em uma VM baseada em pilha, operandos são adicionados ao topo da pilha enquanto operadores os retiram e realizam alguma operação. Uma máquina baseada em registradores usa de variaveis para armazenar resultados intermediários.</p>
<p>Para exemplificar melhor, o código &#8220;a = b * c + 10&#8243; ficaria algo como:</p>
<p>Máquina de pilha:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">push_local <span style="color: #ff0000;">'b'</span>
push_local <span style="color: #ff0000;">'c'</span>
mul
push_const <span style="color: #0000dd;">10</span>
add
store_local <span style="color: #ff0000;">'a'</span></pre></div></div>

<p>Máquina de registradores:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">load_local R0 <span style="color: #339933;">&lt;=</span> <span style="color: #ff0000;">'b'</span>
load_local R1 <span style="color: #339933;">&lt;=</span> <span style="color: #ff0000;">'c'</span>
mul R2 <span style="color: #339933;">&lt;=</span> R0<span style="color: #339933;">,</span> R1
load_const R3<span style="color: #339933;">,</span> <span style="color: #0000dd;">10</span>
add R4 <span style="color: #339933;">&lt;=</span> R2<span style="color: #339933;">,</span> R3
store_local <span style="color: #ff0000;">'a'</span> <span style="color: #339933;">&lt;=</span> R4</pre></div></div>

<p>A primeira vista a diferença é quase que estética, porém se considerarmos quanto espaço precisamos para representar o código e o número de operações de leitura e escrita à memória cada uma faz, vamos notar como são técnicas fundamentalmente diferentes.</p>
<p>Vamos assumir um formato bem simples para representar o código de ambas, que é um byte para designar a operação seguido de um byte para cada operando. Aplicando esta forma, temos.</p>
<p>Máquina de pilha:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">push_local <span style="color: #ff0000;">'b'</span> <span style="color: #666666; font-style: italic;">//2 bytes</span>
push_local <span style="color: #ff0000;">'c'</span> <span style="color: #666666; font-style: italic;">//2 bytes</span>
mul <span style="color: #666666; font-style: italic;">//1 byte</span>
push_const <span style="color: #0000dd;">10</span> <span style="color: #666666; font-style: italic;">//2 bytes</span>
add <span style="color: #666666; font-style: italic;">//1 byte</span>
store_local <span style="color: #ff0000;">'a'</span> <span style="color: #666666; font-style: italic;">//2 bytes</span></pre></div></div>

<p>Total: <strong>10 bytes</strong></p>
<p>Máquina de registradores:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">load_local R0 <span style="color: #339933;">&lt;=</span> <span style="color: #ff0000;">'b'</span> <span style="color: #666666; font-style: italic;">//3 bytes</span>
load_local R1 <span style="color: #339933;">&lt;=</span> <span style="color: #ff0000;">'c'</span> <span style="color: #666666; font-style: italic;">//3 bytes</span>
mul R2 <span style="color: #339933;">&lt;=</span> R0<span style="color: #339933;">,</span> R1 <span style="color: #666666; font-style: italic;">//4 bytes</span>
load_const R3 <span style="color: #339933;">&lt;=</span> <span style="color: #0000dd;">10</span> <span style="color: #666666; font-style: italic;">//3 bytes</span>
add R4 <span style="color: #339933;">&lt;=</span> R2<span style="color: #339933;">,</span> R3 <span style="color: #666666; font-style: italic;">//4 bytes</span>
store_local <span style="color: #ff0000;">'a'</span> <span style="color: #339933;">&lt;=</span> R4 <span style="color: #666666; font-style: italic;">//3 bytes</span></pre></div></div>

<p>Total: <strong>20 bytes</strong></p>
<p>Fica claro aqui que uma máquina de pilha admite uma representação muito mais compacta do mesmo programa. Em geral essa relação não é tão gritante, pois existe uma série de formas de diminuir o número de instruções necessárias para uma máquina de registradores.</p>
<p>Agora vamos analisar quantas operações de memória cada máquina faz, verificando cada instrução individualmente.</p>
<p>Maquina de pilha:</p>
<p><em>push_local</em> X</p>
<ol>
<li>lê a variavel local X</li>
<li>lê o endereço atual do topo da pilha</li>
<li>escreve X no topo da pilha</li>
<li>incrementa e armazena o novo valor para topo da pilha</li>
</ol>
<p><em>mul / add</em></p>
<ol>
<li>lê o endereço atual do topo da pilha</li>
<li>lê o valor do topo da pilha</li>
<li>lê o valor abaixo do topo da pilha</li>
<li>escreve o resultado no local abaixo do topo da pilha</li>
<li>decrementa e armazena o novo valor para topo da pilha</li>
</ol>
<p><em>push_const</em> X</p>
<ol>
<li>lê o endereço atual do topo da pilha</li>
<li>escreve X no topo da pilha</li>
<li>incrementa e armazena o novo valor para topo da pilha</li>
</ol>
<p>store_local X</p>
<ol>
<li>lê o endereço atual do topo da pilha</li>
<li>lê o valor no topo da pilha</li>
<li>escreve o valor em X</li>
<li>decrementa e armazena o novo valor para topo da pilha</li>
</ol>
<p>Aplicando esses valores ao programa em questão temos um total de <strong>25 operações</strong>.</p>
<p>Máquina de registradores:</p>
<p><em>load_local</em> X <= Y</p>
<ol>
<li>lê o valor da variavel local Y</li>
<li>escreve o valor no registrador X</li>
</ol>
<p><em>mul / add</em> X <= Y, Z</p>
<ol>
<li>lê o valor do registrador local Y</li>
<li>lê o valor do registrador local Z</li>
<li>escreve o valor no registrador X</li>
</ol>
<p><em>load_const</em> X <= Y</p>
<ol>
<li>escreve o valor de Y no registrador X</li>
</ol>
<p><em>store_local</em> X <= Y</p>
<ol>
<li>lê o valor do registrador Y</li>
<li>escreve o valor no registrador X</li>
</ol>
<p>Fazendo a conta, temos um total de <strong>13 operações</strong>.</p>
<p>Ironicamente neste caso, uma máquina de registradores leva uma significante vantagem em relação a uma máquina de pilha. Apesar de se tratar de uma simplificação, na prática o resultado é o mesmo. Em máquinas modernas onde o custo de acessar a memória principal é muito grande, uma máquina de registradores tem o potencial de ser mais rápida.</p>
<p>Essas dicotomia entre qual admite uma representação mais compacta e qual permite uma implementação mais eficiente é fundamental na arquitetura de qualquer máquina virtual. Apesar disso, existe muito além da simples forma de funcionar do interpretador que define a real performance da VM, ainda mais se falarmos de linguagens dinâmicas. Em um artigo futuro pretendo mostrar uma implementação de exemplo de ambos os tipos de máquinas virtuais.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2008/09/30/a-nova-onda-de-interpretadores/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Otimizar nunca é fácil</title>
		<link>http://www.kumpera.net/blog/index.php/2008/09/29/otimizar-nunca-e-facil/</link>
		<comments>http://www.kumpera.net/blog/index.php/2008/09/29/otimizar-nunca-e-facil/#comments</comments>
		<pubDate>Mon, 29 Sep 2008 04:32:44 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/?p=90</guid>
		<description><![CDATA[Otimização não é difícil apenas pelo fato de que tornar um pedaço de código mais rápido seja uma tarefa complicada, mas também por nem sempre ser possível ter oque medir ou mesmo saber como medir.
Nessas duas últimas semanas passei por isso, estou trabalhando em um novo recurso do JIT do mono e tinha que medir [...]]]></description>
			<content:encoded><![CDATA[<p>Otimização não é difícil apenas pelo fato de que tornar um pedaço de código mais rápido seja uma tarefa complicada, mas também por nem sempre ser possível ter oque medir ou mesmo saber como medir.</p>
<p>Nessas duas últimas semanas passei por isso, estou trabalhando em um novo recurso do JIT do mono e tinha que medir qual era o ganho de performance possível. Meu primeiro problema foi encontrar um benchmark que representasse uso real e que fosse significativo o suficiente para os números não ficarem perdidos no meio de muito barulho.</p>
<p>Uma vez que encontrei qual era um bom programa para medir a performance, me deparei com outro problema, o tamanho do working set. CPUs modernas trabalham com até três níveis de caching antes de ir à memória principal. O custo de um acesso a memória pode chegar a uma centena de ciclos, o suficiente para calcular o produto de uma matriz 4&#215;4 por um vetor. Logo não importa o quao significante for o benchmark, se o working set dele não for realístico, o teste é inválido pois tudo executara do cache, bem diferente no mundo real.</p>
<p>Ou seja, é necessário dimensionar e modelar o teste para cada ciclo não utilizar dados que sobraram em cache da execução anterior. Para isso é preciso conhecer o tamanho e a hierarquia de cache do seu processador, mesmo porque isso tem um impacto muito significativo na forma que o código deve ter.</p>
<p>Isso leva ao último desafio que tive de enfrentar, indeterminismo nos resultados do benchmark, a variância dos resultados era grande demais para ser apenas interferência externa, ela chegava a 30% para execuções de de algumas dúzias de segundos. A única diferença eram os endereços de alguns arrays usados extensivamente. Mais  precisamente, a discrepância era no alinhamento dos elementos. Nos testes lentos eram múltiplos de 4, nos rápidos eram de 16. Novamente uma peculiaridade dos processadores modernos, que preferem os dados alinhados em endereços múltiplos de 8 ou 16.</p>
<p>Pode até parecer piada, mas o mesmo teste, depois de ajustado todos os detalhes aqui descritos, saiu de um ganho de 10% para 300%. Diferença essa que não é só resultado de um benchmark, mas aplicável ao uso real que esperamos que veja a tenha. Recurso esse que espero integrar ao mono muito em breve.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2008/09/29/otimizar-nunca-e-facil/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Sobre performance e benckmarks</title>
		<link>http://www.kumpera.net/blog/index.php/2008/08/03/sobre-performance-e-benckmarks/</link>
		<comments>http://www.kumpera.net/blog/index.php/2008/08/03/sobre-performance-e-benckmarks/#comments</comments>
		<pubDate>Sun, 03 Aug 2008 07:56:29 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/?p=85</guid>
		<description><![CDATA[Performance nunca foi um assunto fácil. Medir é complicado, comparar resultados é quase irrelevante, comparar linguagens é inútil. Porém as pessoas continuam insistindo no assunto, de um lado os que defendem linguagens gerenciadas dizendo que elas são tão rápidas quanto C ou C++; do outro lado ficam a demonstrar como isso não é possível.
Não se [...]]]></description>
			<content:encoded><![CDATA[<p>Performance nunca foi um assunto fácil. Medir é complicado, comparar resultados é quase irrelevante, comparar linguagens é inútil. Porém as pessoas continuam insistindo no assunto, de um lado os que defendem linguagens gerenciadas dizendo que elas são tão rápidas quanto C ou C++; do outro lado ficam a demonstrar como isso não é possível.</p>
<p>Não se trata apenas do uso de micro-benchmarks, ou de otimizar melhor um alvo, ou da metodologia ser falha. Se trata apenas de falta de comprometimento. Não se pode medir performance daquilo que não se está envolvido pois o resultado é irrelevante. Qualquer tentantiva nessa direção só vai provar que a pessoa é tola.</p>
<p>Quando falo em compromisso me refiro ao fato de que não adianta tentar medir a performance sem estar envolvido na melhora dela. Medições devem ser feitas em softwares reais, não de fabricações de Oz. E o corolário disso é que comprar linguagens é um exercício de futilidade, pois não faz sentido manter o mesmo programa em Java e C++, por exemplo.</p>
<p>A performance de um programa é fator de muito mais coisas que apenas a velocidade bruta do meio de execução &#8211; seja uma VM ou código nativo. Principalmente para grandes sistemas, a complexidade arquitetural e características sistêmicas tem muito maior influencia. Já vi isso acontecer demais para ignorar.</p>
<p>Isso significa que micro-benchmarks são irrelevantes e pura obra do ego de seus criadores? Não, pelo contrário, diz apenas que quase sempre as pessoas envolvidas não estão comprometidas com os resultados. Um exemplo prático, medir a performance com ponto flutuante do gcc só é útil aos seus desenvolvedores, pois somente estes tem o compromisso em melhorá-la, para os demais é uma enorme perda de tempo.</p>
<p>Toda discussão de &#8220;Minha linguagem é mais rápida que a sua&#8221; parece esquecer de que para aplicações de significativa complexidade a maioria dos micro-benchmaks usados são irrelevantes. Para a maioria dos projetos, oque importa é quanto a plataforma torna fácil escrever programas que sejam rápidos. Não adianta ser super veloz se o desenvolvedor vai precisar fazer uma enorme série de sacrifícios para manter sua produtividade.</p>
<p>Existe uma série de exemplos bem intrigantes de como escolhas óbvias trazem resultados não óbvios em termos de performance. Desde gerenciamento de memória a execução especializada de código. Porém não espero ver as pessoas se eduquem nesse ponto, pois é uma causa fundamentalmente perdida, já que não existe razão suficiente contra um ego ferido e o fato de alguém na internet estar errada.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2008/08/03/sobre-performance-e-benckmarks/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>O futuro da programação &#8211; hoje</title>
		<link>http://www.kumpera.net/blog/index.php/2008/06/14/o-futuro-da-programacao-hoje/</link>
		<comments>http://www.kumpera.net/blog/index.php/2008/06/14/o-futuro-da-programacao-hoje/#comments</comments>
		<pubDate>Sat, 14 Jun 2008 04:26:26 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[language design]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2008/06/14/o-futuro-da-programacao-hoje/</guid>
		<description><![CDATA[Sempre que leio qualquer coisa feita pelo Iam Piumarta fico impressionado. Outro dia ao ler os slides sobre o progresso do grupo dele para construir uma linguagem que seja uma real evolução ao que temos hoje, me dei conta de como aquilo que eles propõem é radicalmente diferente ao que a prática de que estamos [...]]]></description>
			<content:encoded><![CDATA[<p>Sempre que leio qualquer coisa feita pelo Iam Piumarta fico impressionado. Outro dia ao ler <a href="http://piumarta.com/papers/S3-2008-slides.pdf">os slides</a> sobre o progresso do grupo dele para construir uma linguagem que seja uma real evolução ao que temos hoje, me dei conta de como aquilo que eles propõem é radicalmente diferente ao que a prática de que estamos habituados.</p>
<p>A atenção excessiva na meta-recursividade do sistema, assim como ser trivial criar e integrar novas gramáticas a linguagem, me faz pensar qual seria o limite de duas propriedade com emergence como essas. O efeito imediato é no compilador, que tem suporte direto a <a href="http://en.wikipedia.org/wiki/Parsing_expression_grammar">PEG</a>s e pattern matching.</p>
<p>O compilador é capaz de se adaptar a mudanças nas regras de sintaxe e passar a usá-las instantaneamente apos serem definidas, ou seja, você pode definir uma mini linguagem em 5-10 linhas e usá-la logo em seguida. Não só isso, mas elas possuem escopo e podem operar em apenas um bloco de texto do seu fonte. Junta isso ao fato de que PEGs poderem ser  compostas facilmente e o compilador suportar staged compilation que o resultado é ter uma linguagem que é maleável ao extremo.</p>
<p>A outra é a máquina virtual, que é construída com essa nova linguagem, de forma que ela mesmo siga o modelo de protótipos e delegação na sua implementação. Isso permite que ela seja tão flexível e dinâmica quanto suas aplicações. Essa é, de longe, a característica mais interessante, pois nenhuma linguagem baseada e máquina virtual que eu conheço chega a esse ponto.</p>
<p>Mas quais seriam aplicações reais disso? Aquilo que hoje fazemos com frameworks e bibliotecas, poderíamos fazer com DSLs. Então em vez de aprender um enorme framework que precisa seguir às regras da linguagem, bastaria aprender uma pequena nova linguagem. Da mesma forma, muita coisa que hoje se traduz em referencia direta ao código de bibliotecas, poderia ser feito como uma série de modificações à gramática corrente.</p>
<p>Porém eu acho que é possível ir muito mais além, com uma VM flexível, seria possível ajustar o modelo de execução para melhor realizar a tarefa que o programa deseja. Como, por exemplo, introduzir processos leves ao estilo do Erlang simplesmente incluindo uma biblioteca.</p>
<p>Quem ainda não se ligou o que gente como Ian Piumarta e Alan Kay tem feito no <a href="http://www.vpri.org/">Viewpoints Research Institute</a> deve parar um pouco e se dedicar àquilo que um dia poderia ser o próximo passo na evolução da computação.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2008/06/14/o-futuro-da-programacao-hoje/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
