

<?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; máquinas virtuais</title>
	<atom:link href="http://www.kumpera.net/blog/index.php/tag/maquinas-virtuais/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kumpera.net/blog</link>
	<description>Meus achados sobre tecnologia</description>
	<lastBuildDate>Mon, 30 Aug 2010 12:00:15 +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>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>
	</channel>
</rss>
