<?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>ivanmosquera.net &#187; haxe</title>
	<atom:link href="http://ivanmosquera.net/index.php/tag/haxe/feed/" rel="self" type="application/rss+xml" />
	<link>http://ivanmosquera.net</link>
	<description> Just another computing weblog</description>
	<lastBuildDate>Mon, 26 Jul 2010 18:54:58 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Probando Haxe</title>
		<link>http://ivanmosquera.net/index.php/2009/11/02/probando-haxe/</link>
		<comments>http://ivanmosquera.net/index.php/2009/11/02/probando-haxe/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 20:07:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[software]]></category>
		<category><![CDATA[cpp]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[haxe]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://ivanmosquera.net/?p=20</guid>
		<description><![CDATA[Haxe es el sucesor de MTASC, pero no se limita a tener como objetivo la tecnología flash sino que también genera Javascript, PHP y otros. Además, se acompaña de una máquina virtual, Neko, que le sirve para la ejecución en servidor. Yo personalmente creo que es un proyecto que está intentando abarcar demasiado pero hay [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://haxe.org">Haxe</a> es el sucesor de <a href="http://mtasc.org">MTASC</a>, pero no se limita a tener como objetivo la tecnología flash sino que también genera Javascript, PHP y otros. Además, se acompaña de una máquina virtual, Neko, que le sirve para la ejecución en servidor. Yo personalmente creo que es un proyecto que está intentando abarcar demasiado pero hay varios puntos que me han animado a probarlo:</p>
<ul>
<li>Las nuevas funcionalidades y rendimiento mejorado de AVM2 (máquina virtual en las últimas versiones de Flash).</li>
<li>El lenguaje de Haxe es mejor que ActionScript.</li>
<li>La posibilidad de portar aplicaciones flash a plataforma nativa fácilmente. Esto se está utilizando por ejemplo para aplicaciones iPhone.</li>
</ul>
<p><img src="http://ivanmosquera.net/wp-content/uploads/haxe.gif" alt="" /><br />
A continuación los pasos necesarios para la instalación y un par de ejemplos de Haxe contra Flash y CPP usando el mismo código:</p>
<p><span id="more-20"></span></p>
<p>La instalación en Debian (testing) es sencilla:</p>

<div class="wp-terminal">user@computer:$ apt-get install haxe<br/>apt-get install neko<br/></div>

<p>Si no está disponible en tu distribución o se trata de versiones no actualizadas, una buena opción puede ser utilizar el instalador estándar de haxe para Linux y los siguientes pasos seguirán siendo los mismos.</p>
<p>Instalado Haxe y Neko, hacemos:</p>

<div class="wp-terminal">user@computer:$ mkdir -p /usr/lib/haxe/lib/<br/>haxelib setup<br/></div>

<p>Instalaremos hxcpp para hacer alguna prueba.</p>

<div class="wp-terminal">user@computer:$ haxelib install hxcpp<br/></div>

<p>Instalamos el fichero de sintaxis de Haxe para Vim:</p>

<div class="wp-terminal">user@computer:$ wget http://tech.motion-twin.com/zip/haxe.vim &amp;&amp; cp haxe.vim /usr/share/vim/vim72/syntax/<br/></div>

<p>Añadimos lo siguiente en nuestro .vimrc<br />
<code>" Haxe<br />
au BufNewFile,BufRead *.hx                setf haxe</code><br />
Ya estamos listos para probar un &#8220;hola mundo&#8221;:</p>
<p><code lang="actionscript"><br />
class Hola {<br />
static function main() {<br />
trace("Hola mundo");<br />
}<br />
</code></p>
<p>Compilamos a  swf con</p>

<div class="wp-terminal">user@computer:$ haxe -swf9 salida.swf -main Hola<br/></div>

<p>Podemos abrir el swf directamente con el navegador y deberíamos ver el trace. La función trace de Haxe se dibuja directamente, algo muy práctico la verdad.</p>
<p>Ahora vamos a compilar el mismo fichero a código nativo. Veremos que lo que hace Hxcpp es traducir nuestro fichero fuente en Haxe a código C++. Si falla es probable que sea porque nos falta algún paquete C++, podemos servirnos de apt-file para localizarlos.</p>
<p>Vemos que él mismo se encarga de invocar al compilador C++ con los parámetros adecuados así que nosotros obtenemos el resultado final simplemente con la línea de haxe.</p>
<p>El resultado estará en la carpeta &#8220;salida&#8221;. Ahí encontraremos nuestro ejecutable ELF (&#8220;Hola&#8221;) y las carpetas &#8220;include&#8221;, &#8220;obj&#8221; y &#8220;src&#8221;.</p>

<div class="wp-terminal">user@computer:$ ./Hola<br/>Hola.hx:3: Hola mundo<br/></div>

<p>Echamos un vistazo a las librerías de las que depende nuestro ejecutable:</p>

<div class="wp-terminal">user@computer:$ ldd Hola<br/>linux-gate.so.1 =&gt;  (0xb80d6000)<br/>libpthread.so.0 =&gt; /lib/i686/cmov/libpthread.so.0 (0xb80ad000)<br/>libdl.so.2 =&gt; /lib/i686/cmov/libdl.so.2 (0xb80a9000)<br/>libstdc++.so.6 =&gt; /usr/lib/libstdc++.so.6 (0xb7fb6000)<br/>libm.so.6 =&gt; /lib/i686/cmov/libm.so.6 (0xb7f90000)<br/>libgcc_s.so.1 =&gt; /lib/libgcc_s.so.1 (0xb7f65000)<br/>libc.so.6 =&gt; /lib/i686/cmov/libc.so.6 (0xb7e06000)<br/>/lib/ld-linux.so.2 (0xb80d7000)<br/></div>

<p>Vemos que no depende de nada extraño, es decir, neko o similar.</p>
<p>Muy bien pero esto se queda un poco pobre tratándose de un simple trace así que vamos a probar algo más. Para ello necesitaremos instalar una librería más. Con Haxe podremos programar contra el API de Flash y generar CPP gracias al wrapper de SDL que implementa NME.</p>

<div class="wp-terminal">user@computer:$ haxelib install neash<br/></div>

<p>Verás que él mismo baja de internet los ficheros necesarios y configura la instalación por lo que al parecer haxelib viene a ser algo parecido a CPAN o PEAR.</p>
<p>El código fuente del nuevo fichero que vamos a probar es el siguiente:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw3">import</span> flash.<span class="me1">events</span>.<span class="me1">MouseEvent</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">import</span> flash.<span class="me1">events</span>.<span class="me1">Event</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">import</span> flash.<span class="me1">display</span>.<span class="kw3">MovieClip</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">class</span> Prueba <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw3">private</span> <span class="kw2">var</span> mc: flash.<span class="me1">display</span>.<span class="kw3">MovieClip</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw3">private</span> <span class="kw2">var</span> square: flash.<span class="me1">display</span>.<span class="kw3">MovieClip</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw2">function</span> <span class="kw2">new</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mc = flash.<span class="me1">Lib</span>.<span class="me1">current</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;drawSquare<span class="br0">&#40;</span>0xAFAFF0,<span class="nu0">50</span>,<span class="nu0">50</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mc.<span class="kw3">stage</span>.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_DOWN</span>, <span class="kw3">onPress</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp;<span class="kw3">private</span> <span class="kw2">function</span> drawSquare<span class="br0">&#40;</span>pColor:<span class="kw3">Int</span>,pStartX:<span class="kw3">Int</span>,pStartY:<span class="kw3">Int</span><span class="br0">&#41;</span>:<span class="kw3">Void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;square = <span class="kw2">new</span> <span class="kw3">MovieClip</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;square.<span class="me1">graphics</span>.<span class="kw3">beginFill</span> <span class="br0">&#40;</span>pColor<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;square.<span class="me1">graphics</span>.<span class="kw3">moveTo</span> <span class="br0">&#40;</span>pStartX,pStartY<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;square.<span class="me1">graphics</span>.<span class="kw3">lineTo</span> <span class="br0">&#40;</span><span class="nu0">100</span>,<span class="nu0">50</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;square.<span class="me1">graphics</span>.<span class="kw3">lineTo</span> <span class="br0">&#40;</span><span class="nu0">100</span>,<span class="nu0">100</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;square.<span class="me1">graphics</span>.<span class="kw3">lineTo</span> <span class="br0">&#40;</span><span class="nu0">50</span>,<span class="nu0">100</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;square.<span class="me1">graphics</span>.<span class="kw3">endFill</span> <span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mc.<span class="me1">addChild</span><span class="br0">&#40;</span>square<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw3">static</span> <span class="kw2">function</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">#if cpp</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; neash.<span class="me1">Lib</span>.<span class="me1">mOpenGL</span> = <span class="kw2">true</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; neash.<span class="me1">Lib</span>.<span class="me1">Init</span><span class="br0">&#40;</span><span class="st0">&quot;Prueba&quot;</span>,<span class="nu0">320</span>,<span class="nu0">200</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; neash.<span class="me1">Lib</span>.<span class="me1">SetBackgroundColour</span><span class="br0">&#40;</span>0xFFFFFF<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">#end</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> prueba:Prueba = <span class="kw2">new</span> Prueba<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">#if cpp</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; neash.<span class="me1">Lib</span>.<span class="me1">ShowFPS</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; neash.<span class="me1">Lib</span>.<span class="me1">Run</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">#end</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw2">function</span> <span class="kw3">onPress</span><span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">trace</span><span class="br0">&#40;</span><span class="st0">&quot;Yepa!!&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; square.<span class="me1">x</span> += <span class="nu0">4</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Al igual que antes, primero probamos con flash:</p>

<div class="wp-terminal">user@computer:$ haxe  -swf prueba.swf -swf-version 10 -main Prueba<br/><br/><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="557" height="557" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://ivanmosquera.net/wp-content/uploads/2009/11/prueba.swf" /><embed type="application/x-shockwave-flash" width="557" height="557" src="http://ivanmosquera.net/wp-content/uploads/2009/11/prueba.swf"></embed></object><br/></div>

<p>Y ahora a código nativo:</p>

<div class="wp-terminal">user@computer:$ haxe -cpp salida_prueba --remap flash:neash -lib neash -main Prueba -cp /usr/lib/haxe/lib/neash/1,0,1/neash/<br/></div>

<p>Vemos que en este caso ha sido necesario directiva de precompilación y decirle a haxe que sustituya las ocurrencias de flash por neash.</p>
<p>Por ahora la sensación que me da es que Haxe como plataforma open source para Flash ya es estable, pudiendo sustituir a MTASC perfectamente pero en cuanto a CPP la cosa puede estar demasiado verde como para cosas serias.</p>
]]></content:encoded>
			<wfw:commentRss>http://ivanmosquera.net/index.php/2009/11/02/probando-haxe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
