<?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>SlashCode</title>
	<atom:link href="http://davideaversa.it/slashcode/feed/" rel="self" type="application/rss+xml" />
	<link>http://davideaversa.it/slashcode</link>
	<description></description>
	<lastBuildDate>Thu, 03 May 2012 14:28:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Game Development: Architettura Component-Based</title>
		<link>http://davideaversa.it/slashcode/2012/05/game-development-architettura-component-based/</link>
		<comments>http://davideaversa.it/slashcode/2012/05/game-development-architettura-component-based/#comments</comments>
		<pubDate>Thu, 03 May 2012 14:28:53 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[Game Development]]></category>
		<category><![CDATA[component-based]]></category>
		<category><![CDATA[game-engine]]></category>
		<category><![CDATA[tecniche di programmazione]]></category>

		<guid isPermaLink="false">http://davideaversa.it/slashcode/?p=816</guid>
		<description><![CDATA[<div><a href="http://davideaversa.it/slashcode/2012/05/game-development-architettura-component-based/"><img title="Game Development: Architettura Component-Based" src="http://davideaversa.it/slashcode/wp-content/uploads/2012/05/inheritance.png" alt="Game Development: Architettura Component-Based"  width="" /></a></div><br/>Dopo la prima introduzione al Game Development iniziamo ad affrontare qualche tema interessante. Mi sono preso un po&#8217; di tempo per realizzare questo articolo perché sebbene semplice, contiene alcuni concetti delicati che ad una prima lettura possono sembrare inutili sebbene in realtà possano veramente cambiarvi la vita (almeno quella informatica ). L&#8217;articolo fa uso di <a href='http://davideaversa.it/slashcode/2012/05/game-development-architettura-component-based/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Dopo la prima introduzione al Game Development iniziamo ad affrontare qualche tema interessante. Mi sono preso un po&#8217; di tempo per realizzare questo articolo perché sebbene semplice, contiene alcuni concetti delicati che ad una prima lettura possono sembrare inutili sebbene in realtà possano veramente cambiarvi la vita (almeno quella informatica <img src='http://davideaversa.it/slashcode/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ). L&#8217;articolo fa uso di immagini ed esempi presi da <a href="http://forums.tigsource.com/index.php?topic=10112.0">questo topic</a>, quindi è bene dare a Cesare ciò che è Cesare e il giusto riconoscimento al suo autore.</p>
<p>Uno degli aspetti più complessi della progettazione di un videogioco è la <strong>formalizzazione del mondo</strong>. Con formalizzazione del mondo si intende il processo di sintetizzare in modo formale i vari aspetti di un ambiente o modello che si vuole rappresentare, elencando gli oggetti rilevanti e le relazioni fra gli stessi. </p>
<p><span id="more-816"></span>Videogiochi anche banali hanno un gran numero di oggetti. Prendiamo ad esempio un platform come <strong>Super Mario Bros</strong>. Il gioco è concettualmente semplice ma contiene un bel gruzzolo di oggetti: <em>Mario</em>, i <em>mostri</em> (ognuno con un suo comportamento), i <em>proiettili</em> (martelli e palline di fuoco), <em>tubi</em>, <em>attivatori</em>, <em>power-up</em> e molto altro. Tutti questi oggetti hanno i loro comportamenti caratteristici, i loro effetti e le loro proprietà. Per questo strutturare un &#8220;<em>diagramma delle classi</em>&#8221; che catturi il mondo da modellare in modo preciso può diventare un lavoro complesso e frustrante.</p>
<p><strong>L&#8217;APPROCCIO GERARCHICO</strong></p>
<p>Supponiamo che voi e il vostro team stiate progettando un piccolo gioco RPG-like. Se siete programmatori con un po&#8217; di esperienza e avete dato esami di &#8220;Progettazione del Software&#8221; nella vostra vita, la prima cosa che vi verrà in mente di fare è di progettare la gerarchia delle classi con lo scopo di duplicare il meno possibile il codice necessario e relazionare gli oggetti fra loro in modo che siano coerenti con l&#8217;idea che abbiamo in mente.</p>
<p><img src="http://davideaversa.it/slashcode/wp-content/uploads/2012/05/inheritance.png" alt="" title="Inheritance Scheme" width="591" height="340" class="aligncenter size-full wp-image-817" /></p>
<p>Una volta individuati gli elementi principali del vostro gioco (ad esempio tavoli, mobilia, porte, NPC, oggetti e il giocatore) si comincia con il vedere quali proprietà/abilità/caratteristiche hanno in comune disponendoli all&#8217;interno di una <strong>gerarchia</strong> in cui il figlio eredita tutte le caratteristiche del padre (ed eventualmente ne aggiunge di nuove). </p>
<p>Con riferimento all&#8217;esempio del gioco RPG, gli oggetti si possono dividere fra oggetti &#8220;<em>fissi</em>&#8221; (come le porte, i tavoli e gli scaffali) e oggetti &#8220;dinamici&#8221; che possono muoversi e interagire (persone, animali e pozioni). A loro volta gli oggetti dinamici si dividono fra &#8220;item&#8221; (pozioni e armi) e personaggi in grado di parlare (come gli NPC, negozianti, mostri e il giocatore). Il risultato è molto probabilmente lo schema nella figura precedente. Lo schema funziona, è coerente con il mondo che progettavate e potete cominciare ad usarlo per programmare il vostro gioco. Tutti sono felici.</p>
<p>Poiché è innaturale e improbabile che tutto il gioco sia definito nei minimi dettagli prima di cominciare a programmare è possibile (diciamo certo) che ad un certo punto dello sviluppo i game designer vi chiamino dicendo: &#8220;Abbiamo pensato di inserire in questa mappa una porta parlante!&#8221; Voi nello schema precedente avete assunto che le porte non parlino, quest&#8217;idea dei game designer è interessante ma va in conflitto con il mondo che avete modellato! Sfortunatamente la porta parlante è una parte fondamentale della storia che i game designer si rifiutano di modificare. Cosa fate?</p>
<p>Per vostra sfortuna lo schema precedente è fisso! Le porte, per come le avete definite <strong>non si muovono</strong> e soprattutto <strong>non parlano</strong>. Lo schema gerarchico è rigido e pieno di assunzioni. Le soluzioni a questo punto sono poche:</p>
<ul>
<li>Aggirare il problema: la porta è in realtà un NPC con le sembianze di una porta, con vita infinita e inamovibile che &#8220;muore&#8221; quando viene aperta per poi &#8220;resuscitare&#8221; quando viene chiusa. Inquietante. No. Questa soluzione non è sufficientemente robusta ed elegante.</li>
<li>Decidete che le porte possono parlare. Per fare ciò viene duplicato il codice di <em>Talkable_Entity</em> all&#8217;interno di <em>Door_Entity</em>. Questo però duplica il codice andando contro almeno sessantamila principi della programmazione (oltre che vanificare lo scopo dello schema precedente) il che non è desiderabile. In particolare stiamo sporcando il codice di tutte le porte per far parlare una porta che compare una ed una sola volta nel gioco!</li>
<li>Si può spostare l&#8217;abilità di parlare da <em>Talkable_Entity</em> a <em>Entity</em> (o ad una super-classe qualsiasi in comune fra la porta e le <em>Talkable_Entity</em>). Ma questo non ha molto senso! In questo modo tutti gli oggetti possono potenzialmente parlare! Non solo la porta che voglio io ma anche scaffali, sedie e latrine.</li>
<li>Oppure si può modificare l&#8217;intero schema in modo che tenga conto anche dell&#8217;evenienza di una porta parlante con conseguente riscrittura di gran parte del codice.</li>
</ul>
<p>Poiché la porta parlante sarà solo la prima delle decine di eccezioni e entità fantasiose partorite dai vostri game designer, scoprirete presto che vi troverete a riscrivere il codice del vostro motore di gioco decine di volte solo per riadattarlo ad uno schema gerarchico in continua evoluzione!</p>
<p>In un gioco mediamente complesso vi ritroverete infine con centinaia e centinaia di classi, con fumose dipendenze e gerarchie. La complessità tecnica del gioco va alle stelle. Voi impazzite e il gioco finisce nel dimenticatoio.</p>
<p><strong>L&#8217;APPROCCIO COMPONENT-BASED</strong></p>
<p>La soluzione però esiste e per afferrarla è necessario dimenticarsi completamente di tutto ciò che sapete sulla progettazione del software. Per il solo fatto di parlarvene potrei essere bastonato dai vostri professori.</p>
<p>Ora seguitemi bene perché la questione è semplice ma sfuggente! Tornando al problema precedente una soluzione non ortodossa deriva dalla soluzione numero 3. Spostiamo la capacità di parlare da <em>Talkable_Entity</em> a <em>Entity</em> e aggiungiamo al costruttore un flag (ad esempio <em>canTalk</em>) in modo tale da poter scegliere durante la sua inizializzazione se l&#8217;oggetto può parlare oppure no. Una cosa di questo tipo:</p>
<div class="codecolorer-container java dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">Class</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aentity+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Entity</span></a><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;....<br />
&nbsp; &nbsp;...<br />
&nbsp; &nbsp;<span style="color: #006633;">Talkable</span> talkSystem<span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<span style="color: #000066; font-weight: bold;">boolean</span> canTalk<span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp;...<br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aentity+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Entity</span></a><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">boolean</span> canTalk, Talkable talkSystem<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">canTalk</span> <span style="color: #339933;">=</span> canTalk<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">talkSystem</span> <span style="color: #339933;">=</span> talkSystem<span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> Talkable getTalk<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>canTalk<span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">return</span> talkSystem<span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&#125;</span><br />
<br />
..<br />
<span style="color: #009900;">&#125;</span></div></div>
<p>A questo punto però ci rendiamo conto che possiamo usare la stessa tecnica per ogni <strong>componente</strong> dei nostri oggetti. Possiamo spostare in <em>Entity</em> la capacità di un oggetto di muoversi, la capacità di sparare, la capacità di essere raccolta, la capacità di ferire il giocatore, la capacità di essere distrutta e così via. Potete aggiungere ogni componente che vi pare basta aggiungere a <em>Entity</em> un flag e il rispettivo <em>ComponentSystem</em>.</p>
<p>Coa abbiamo ottenuto con questo? Ora abbiamo un unica classe per <strong>tutti</strong> gli oggetti del gioco (<em>Entity</em>) più una classe per ogni componente.</p>
<p>Notate che siamo passati da un approccio classico in cui gli oggetti sono caratterizzati dalla relazione <strong>is-a</strong>, oggetti diversi sono identificati dalla loro classe e dalle relazioni di ereditarietà che li lega, ad un&#8217;approccio basato sulla relazione &#8220;<strong>has-a</strong>&#8220;, in cui ogni oggetto è identificato dalle componenti che possiede. </p>
<p>Ovvero: <strong>ogni oggetto è definito unicamente dall&#8217;aggregato delle sue componenti!</strong></p>
<p><img src="http://davideaversa.it/slashcode/wp-content/uploads/2012/05/Fig-2.gif" alt="" title="Component System" width="640" height="531" class="aligncenter size-full wp-image-818" /></p>
<p>Lo schema qui sopra rappresenta l&#8217;approccio a componenti di un piccolo gioco FPS e può aiutarvi a chiarificare il concetto. Primo: tutti gli oggetti nel gioco appartengono ad un unica classe (solitamente chiamata <strong>Entity</strong>. Secondo ogni entità può contenere una o più <strong>Componenti</strong> che definiscono le funzionalità del singolo oggetto. Ad esempio una granata ha una posizione, può muoversi, viene renderizzata, può essere un target e subisce l&#8217;influenza della fisica del gioco. Similmente il giocatore avrà molte capacità in comune con la granata ma non può essere un target (il giocatore non può spararsi da solo). E così via.</p>
<p><img src="http://davideaversa.it/slashcode/wp-content/uploads/2012/05/component.png" alt="" title="component" width="588" height="351" class="aligncenter size-full wp-image-819" /></p>
<p><strong>IN PRATICA</strong></p>
<p>Una volta capito il concetto di approccio a componenti vediamo come può venir implementato. Cominciamo dalla classe <strong>Component</strong>. Ai fini di rendere l&#8217;architettura il più elastica, scalabile e coerente possibile, tutte le componenti devono mostrare la stessa interfaccia.</p>
<div class="codecolorer-container java dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">class</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Acomponent+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Component</span></a><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">/* Tutte le componenti hanno una Entity come genitore*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aentity+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Entity</span></a> getParent<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000066; font-weight: bold;">void</span> setParent<span style="color: #009900;">&#40;</span>Ent p<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">/* Tutte le componenti hanno un tipo unico (position, movement, etc..) */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000066; font-weight: bold;">int</span> getType<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">/* Tutte le componenti possono fare qualcosa per modificare la logica di gioco.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Ogni classe Entity invoca update() su tutte le componenti. */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000066; font-weight: bold;">void</span> update<span style="color: #009900;">&#40;</span>GameTime delta<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">/* Tutte le componenti possono renderizzare qualcosa sullo schermo.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Ogni classe Entity invoca render() su tutte le componenti.*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000066; font-weight: bold;">void</span> render<span style="color: #009900;">&#40;</span>GameTime delta<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">/* Se una componente ha necessità di risorse quali immagini, suoni, ecc..<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;possono essere caricati da questo metodo. Quando una Entity<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;viene inizializzata essa carica le risorse di tutte le sue componenti.*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000066; font-weight: bold;">void</span> loadAssets<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">/*Quando un'entità viene rimossa vanno rimosse anche le componenti <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; collegate. */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000066; font-weight: bold;">void</span> die<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span></div></div>
<p>Questa è una classe astratta e quindi tutti i metodi vanno &#8220;riempiti&#8221; dalle singole componenti che ereditano dalla classe madre &#8220;Components&#8221;. Il tipo di un componente (come Talkable, Physics, Movements, e così via) serve ad identificare il componente e può essere identificato da un intero, come in questo esempio di classe Components, oppure in qualunque altro modo vogliate (stringhe, decimali, pittogrammi e chi più ne ha più ne metta).</p>
<p>Ora vediamo la classe <strong>Entity</strong>. Poiché la classe Entity altro non fa che fungere da &#8220;aggregatore&#8221; di componenti, l&#8217;implementazione risulta molto elementare:</p>
<p>Primo, la classe contiene un <strong>hash-table</strong> (o qualunque altra struttura efficiente) in grado di memorizzare la lista delle componenti dell&#8217;entità. Secondo implementa questi due metodi:</p>
<div class="codecolorer-container java dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> hasComponent<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> identifier<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">return</span> component_table.<span style="color: #006633;">Contains</span><span style="color: #009900;">&#40;</span>identifier<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Acomponent+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Component</span></a> getComponent<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> identifier<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>hasComponent<span style="color: #009900;">&#40;</span>identifier<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">return</span> component_table.<span style="color: #006633;">Get</span><span style="color: #009900;">&#40;</span>identifier<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>La classe Entity inoltre fa da tramite per la comunicazione fra componenti (anche se esistono approcci in cui due componenti possono comunicare direttamente).</p>
<p><strong>VANTAGGI</strong></p>
<p>Supposto per assurdo che quello che vi ho raccontato non bastasse, ecco una lista di vantaggi dell&#8217;architettura component-based.</p>
<ul>
<li><strong>Scalabilità</strong>: non dovrete più conoscere a priori tutti gli elementi del vostro gioco, vi basta sapere quali componenti vi servono. Aggiungere oggetti o componenti si riduce ad aggiungere una classe e aggregare nel modo che più vi aggrada i componenti esistenti!</li>
<li><strong>Flessibilità</strong>: l&#8217;architettura è molto versatile. Talmente versatile che potete creare e modificare oggetti a runtime e farlo fare anche a chi non è pratico di programmazione (sfruttando ad esempio dei file XML in cui ogni oggetto viene definito semplicemente come una lista di componenti). Magari in qualche altro articolo vi farò vedere un esempio.</li>
<li><strong>Riusabilità</strong>: è molto comune che due giochi abbiano componenti in comune. Con il sistema component-based vi basta importare le classi componenti da un gioco all&#8217;altro e tutto funzionerà alla perfezione.</li>
</ul>
<p><strong>CONTRO</strong></p>
<p>Ogni architettura ha i suoi vantaggi e svantaggi. Nel caso dell&#8217;architettura component-based il principale svantaggio consiste nel rispondere alla domanda <strong>&#8220;Questa particolare entità che oggetto è?&#8221;</strong>. Poiché gli oggetti sono tutti <em>Entity</em> e l&#8217;unica cosa che permette di discriminare fra loro sono le componenti che possiedono, se voglio identificare un oggetto devo mettermi la coscienza in pace e prepararmi ad una serie stremante di <em>if-else</em> per controllare la presenza di un particolare sotto-insieme di componenti. Nell&#8217;approccio tradizionale tutto questo si ridurrebbe nel farsi restituire il nome della classe dell&#8217;oggetto.</p>
<p>Nello sviluppo di videogiochi questo non è un grande problema ed è comunque controbilanciato dagli innumerevoli vantaggi che l&#8217;architettura component-based offre. Però se volete usare quest&#8217;approccio (o uno ibrido) per qualche altra tipologia di applicazioni vi conviene tenere a mente questo problema e valutare se sia conveniente o meno per il vostro scenario.</p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=816&amp;md5=41db9930ed017272bba5d6c369423706" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2012/05/game-development-architettura-component-based/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2012%2F05%2Fgame-development-architettura-component-based%2F&amp;language=it_IT&amp;category=text&amp;title=Game+Development%3A+Architettura+Component-Based&amp;description=Dopo+la+prima+introduzione+al+Game+Development+iniziamo+ad+affrontare+qualche+tema+interessante.+Mi+sono+preso+un+po%26%238217%3B+di+tempo+per+realizzare+questo+articolo+perch%C3%A9+sebbene+semplice%2C+contiene+alcuni+concetti...&amp;tags=component-based%2Cgame-engine%2Ctecniche+di+programmazione%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Primi Passi nel Game Development</title>
		<link>http://davideaversa.it/slashcode/2012/04/primi-passi-nel-game-development/</link>
		<comments>http://davideaversa.it/slashcode/2012/04/primi-passi-nel-game-development/#comments</comments>
		<pubDate>Tue, 17 Apr 2012 16:37:53 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[Game Development]]></category>

		<guid isPermaLink="false">http://davideaversa.it/slashcode/?p=814</guid>
		<description><![CDATA[<div><a href="http://davideaversa.it/slashcode/2012/04/primi-passi-nel-game-development/"><img title="Primi Passi nel Game Development" src="http://davideaversa.it/slashcode/wp-content/uploads/2012/04/GameArchitecture.png" alt="Primi Passi nel Game Development"  width="" /></a></div><br/>Volevo iniziare a parlarvi un po&#8217; del Game Development, tuttavia mi sono reso conto che c&#8217;è molta confusione sull&#8217;argomento a livello tecnico. Domande del tipo &#8220;Voglio sviluppare videogiochi, meglio OpenGL o DirectX?&#8221; fanno accapponare la pelle e sono indice del livello di nebulosità che avvolge la materia. Per questo, per prima cosa faremo un bel <a href='http://davideaversa.it/slashcode/2012/04/primi-passi-nel-game-development/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Volevo iniziare a parlarvi un po&#8217; del <strong>Game Development</strong>, tuttavia mi sono reso conto che c&#8217;è molta confusione sull&#8217;argomento a livello tecnico. Domande del tipo <em>&#8220;Voglio sviluppare videogiochi, meglio OpenGL o DirectX?&#8221;</em> fanno accapponare la pelle e sono indice del livello di nebulosità che avvolge la materia. Per questo, per prima cosa faremo un bel punto della situazione sui vari elementi di un videogioco.</p>
<p><span id="more-814"></span><strong>Fare un videogame è una delle cose più complicate del mondo.</strong> Il game development è una disciplina in cui non si incontra solo la bruta tecnica informatica bensì anche arti visive, musica, narrazione, design e un vero oceano di materie diverse. Anche restando solo nel livello informatico, la programmazione richiede un insieme eterogeneo di materie informatiche, dalla programmazione grafica, all&#8217;architettura di sistemi, all&#8217;IA, al data managment e così via. Per progettare un gioco gli sviluppatori indipendenti e gli aspiranti tali (come me) devono quindi aver ben chiaro come si struttura l&#8217;architettura di un programma complesso quanto un videogame. Cosa che in realtà non è così semplice e che cercherò di chiarire almeno nei suoi punti fondamentali.</p>
<p><img src="http://davideaversa.it/slashcode/wp-content/uploads/2012/04/GameArchitecture.png" alt="" title="GameArchitecture" width="815" height="577" class="alignleft size-full wp-image-815" /></p>
<p>Ok. Questa è a grandissime linee l&#8217;architettura di un gioco. Stampatevela in testa. Tenete presente però che nella pratica la divisione fra livelli non è sempre così netta ed è possibile trovare librerie che ne coprono due (o più) insieme .</p>
<p><strong>Librerie Grafiche di Basso Livello</strong></p>
<p>Tralasciando l&#8217;hardware (la cui spiegazione è più che ovvia), il primo strato che incontriamo riguarda le librerie di basso livello. Rientrano in questa categoria <strong>OpenGL</strong> e le <strong>Direct3D</strong> (badate bene, non le DirectX di cui le Direct3D sono la parte grafica). </p>
<p>Le librerie grafiche di basso livello sono la struttura più vicina all&#8217;hardware ed offrono una grande libertà al prezzo di un elevata complessità. Esse spesso fungono da interfaccia fra la CPU e la GPU tramite <strong>linguaggi di shading</strong> <em>ad-hoc</em> come <strong>HLSL</strong> o <strong>GLSL</strong>.</p>
<p>Raramente si sviluppa un gioco partendo da tali librerie. Guardando il diagramma precedente la motivazione è intuitiva: partendo dalle librerie di basso livello bisogna ricostruirsi tutti gli strati superiori. Cosa che per dei programmatori indipendenti è un compito lungo, noioso e quasi mai portato a termine.</p>
<p><strong>Audio Engine e Librerie Audio di Basso Livello</strong></p>
<p>Parlerò di questi due livelli assieme poiché nella pratica è difficile trovarli completamente separati. Queste librerie, come ad esempio le <strong>OpenAL</strong>, si occupano della gestione della parte audio del gioco. A seconda del livello di astrazione, tali librerie non si limitano solamente a leggere e riprodurre un file audio ma offrono funzionalità più avanzate quali ad esempio aggiungere effetti d&#8217;ambiente, riverbero, eco o la simulazione della spazialità del suono e dell&#8217;effetto doppler.</p>
<p>La programmazione dell&#8217;audio è solitamente considerata meno complessa della programmazione grafica e l&#8217;uso di librerie come OpenAL è decisamente comune. Tuttavia come vedremo i livelli superiori spesso e volentieri integrano tali librerie al loro interno.</p>
<p><strong>Input</strong></p>
<p>Il layer di input gestisce i comandi in arrivo dalle periferiche dell&#8217;utente come mouse, tastiera o gamepad. Librerie corrispondenti a questo livello sono ad esempio le <strong>OIS</strong> e parte di <strong>FreeGLUT</strong>. L&#8217;uso di queste librerie è solitamente piuttosto intuitivo e non necessita molte spiegazioni. I layer superiori di solito si limitano a wrappare semplicemente le librerie di input.</p>
<p><strong>Rendering Engine</strong></p>
<p>I <strong>motori di rendering</strong> sono molto simili alle librerie grafiche di basso livello ma aggiungono funzionalità importantissime quali: importazione di texture e modelli, gestione dello <strong>scenegraph</strong> e gestione delle animazioni (oltre a nascondere tutti i dettagli tecnici dei livelli inferiori). Oltre a questo spesso i motori di rendering sviluppano due backend separati e permettono quindi di scrivere codice che si poggia indistintamente su OpenGL o Direct3D in modo da facilitare la portabilità del codice su sistemi diversi.</p>
<p>Un motore di rendering molto noto è <strong>Ogre3D</strong>.</p>
<p><strong>Multimedia/Game Library</strong></p>
<p>Salendo di un livello troviamo le <strong>game library</strong>. I motori di rendering infatti si limitano a gestire la grafica ma non offrono ad esempio nessun supporto per l&#8217;audio e l&#8217;input.</p>
<p>A mettere tutto assieme sono proprio le game library, librerie che non solo uniscono e mescolano tutte le librerie degli strati inferiori (grafica, audio e input) ma aggiungono altre caratteristiche importantissime per i videogame come gestione dell&#8217;output su disco, l&#8217;integrazione di librerie fisiche (quali ad esempio <strong>Bullet</strong> o <strong>Box2d</strong>) e chi più ne ha più ne metta.</p>
<p>Rientrano nella categoria librerie come <strong>XNA</strong>, <strong>Panda3D</strong>, <strong>DeltaEngine</strong>, <strong>jMonkeyEngine</strong> (in gran parte) e per quanto riguarda il 2D <strong>SFML</strong>. </p>
<p>Le game library sono solitamente un buon punto di partenza per chi vuole sviluppare un videogame perché offrono un ottimo compromesso fra alto e basso livello.</p>
<p><strong>Game Engine</strong></p>
<p>La prima cosa da fare quando si sviluppa un videogame è scrivere il game engine. Oppure lo si può prendere già pronto. I game engine offrono un livello di astrazione ancora maggiore delle game library, implementano costruttori di mappe, gestione degli assets, generatori di terreni, acqua e condizioni climatiche e molto altro, lasciando allo sviluppatore solo la parte divertente: la logica di alto livello, la costruzione dei livelli e così via. I game engine commerciali sono vere e proprie applicazioni, una specie di IDE dei videogame e offrono quasi sempre tools di modellazione e design visuali all&#8217;avanguardia.</p>
<p>Game engine molto noti sono <strong>Unity3D</strong>, <strong>Unigine</strong>, <strong>CryEngine</strong>, <strong>Source Engine</strong>, <strong>Unreal SDK</strong> e molti altri ancora. I game engine sono molto potenti e permettono in breve tempo di tirare fuori qualcosa di interessante. Il rovescio della medaglia è che costano. Per usufruire di versioni complete o della possibilità di vendere il proprio gioco si può arrivare a sborsare centinaia o migliaia di euro.</p>
<p>Molti game engine inoltre offrono delle API di backend per poter scrivere i propri personali moduli di basso livello (ad esempio per gestire la rete, il multiplayer o un personale sitema di input).</p>
<p><strong>Logica di Alto Livello</strong></p>
<p>Siamo arrivati alla punta dell&#8217;iceberg e al livello più interessante. Arrivati a questo punto si programma il gioco vero e proprio, si decide la grafica, si impostano le strutture dati, si progetta l&#8217;IA e poi si lancia il tutto sul game engine. Spesso questo livello è implementato con linguaggi di alto o altissimo livello (proprietari come l&#8217;Unigine Script oppure generici come Lua, C# o Python).</p>
<p>Se arrivate a questo punto siete nella parte creativa del game developing.</p>
<p><strong>Conclusione</strong></p>
<p>Dopo questa panoramica veloce della struttura di un videogame siamo pronti a passare ad argomenti più pratici e meno teorici e forse anche più divertenti! <img src='http://davideaversa.it/slashcode/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=814&amp;md5=f0dc60ffb0a148fc3f4a5f5887b89560" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2012/04/primi-passi-nel-game-development/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2012%2F04%2Fprimi-passi-nel-game-development%2F&amp;language=it_IT&amp;category=text&amp;title=Primi+Passi+nel+Game+Development&amp;description=Volevo+iniziare+a+parlarvi+un+po%26%238217%3B+del+Game+Development%2C+tuttavia+mi+sono+reso+conto+che+c%26%238217%3B%C3%A8+molta+confusione+sull%26%238217%3Bargomento+a+livello+tecnico.+Domande+del+tipo+%26%238220%3BVoglio+sviluppare+videogiochi%2C+meglio+OpenGL...&amp;tags=blog" type="text/html" />
	</item>
		<item>
		<title>Oltre Java: Ceylon</title>
		<link>http://davideaversa.it/slashcode/2012/04/oltre-java-ceylon/</link>
		<comments>http://davideaversa.it/slashcode/2012/04/oltre-java-ceylon/#comments</comments>
		<pubDate>Fri, 13 Apr 2012 11:50:39 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[TheSlashCodeProject]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[ceylon]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://davideaversa.it/slashcode/?p=811</guid>
		<description><![CDATA[<div><a href="http://davideaversa.it/slashcode/2012/04/oltre-java-ceylon/"><img title="Oltre Java: Ceylon" src="http://davideaversa.it/slashcode/wp-content/uploads/2012/04/ceylon_icon_128px.png" alt="Oltre Java: Ceylon"  width="" /></a></div><br/>Chi mi conosce sa bene il mio rapporto di amore-odio con Java. Amore perché Java è un linguaggio performante, di alto livello e soprattutto portabile. L&#8217;ho usato spesso, lo uso tutt&#8217;ora e ci ho fatto addirittura del game development. Odio perché, proprio perché ci ho combattuto tanto, ne conosco tutti i difetti, i limiti e <a href='http://davideaversa.it/slashcode/2012/04/oltre-java-ceylon/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Chi mi conosce sa bene il mio rapporto di amore-odio con <strong>Java</strong>. <strong>Amore perché</strong> Java è un linguaggio performante, di alto livello e soprattutto portabile. L&#8217;ho usato spesso, lo uso tutt&#8217;ora e ci ho fatto addirittura del game development. <strong>Odio perché</strong>, proprio perché ci ho combattuto tanto, ne conosco tutti i difetti, i limiti e le idiosincrasie. Java è sintatticamente prolisso e ha qualche problema di &#8220;vecchiaia&#8221; che andrebbe risolto (ed <a href="http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java">il confronto con C# è impietoso</a>). <span id="more-811"></span></p>
<p>Giusto per fare un esempio in Java è abitudine leggere (o scrivere) codice raccapricciante quale</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">foo.setAttributeX(bar.getAttributeY());</div></div>
<p>che in C# si risolve con un semplice</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">foo.X = bar.Y;</div></div>
<p>Qualcuno considererà questa caratteristica (tecnicamente si parla di <em>Accessor</em> e <em>Mutators</em>) un puro vezzo sintattico, ma quando si lavora con decine e decine di classi vi posso assicurare che questo facilita di un fattore dieci la produttività e la manutenibilità del codice. Problemi come questo ed altri più &#8220;concreti&#8221; sono ciò che mi hanno spinto a passare <em>al lato oscuro della forza</em> ogni qualvolta mi è possibile.</p>
<p><img src="http://davideaversa.it/slashcode/wp-content/uploads/2012/04/ceylon_icon_128px.png" alt="" title="Ceylon Icon" width="128" height="128" class="alignleft size-full wp-image-812" /></p>
<p>In attesa che Java venga riformato (sperando nella <a href="ww.theregister.co.uk/2011/10/03/java8_revolution_not_evolution_oracle/">rivoluzionaria (?) versione 8 e 9 del linguaggio</a>) la comunità si è messa in moto in modo autonomo. Uno dei progetti a mio avviso più interessanti è senza dubbio <strong><a href="http://ceylon-lang.org/">Ceylon</a></strong>, di <strong>Red-Hat</strong>.</p>
<p>Ceylon è un linguaggio JVM-based, ovvero che viene compilato generando <em>byte-code</em> compatibile con la Java Virtual Machine. Questo garantisce due vantaggi: il linguaggio sfrutta la portabilità e le ottime performance della JVM ed è potenzialmente compatibile con le librerie Java esistenti.</p>
<p>Ceylon è un linguaggio molto interessante perché non solo alleggerisce Java da tutti gli inutili orpelli sintattici di cui è infestato ma aggiunge anche una sorta di dinamismo opzionale nella gestione delle variabili (tramite il tipo jolly <em>value</em>). Ma facciamo qualche esempio.</p>
<div class="codecolorer-container java dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">doc <span style="color: #0000ff;">&quot;The classic Hello World program&quot;</span><br />
by <span style="color: #0000ff;">&quot;Gavin&quot;</span><br />
see <span style="color: #009900;">&#40;</span>goodbye<span style="color: #009900;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">IOException</span></a><span style="color: #009900;">&#41;</span><br />
<span style="color: #000066; font-weight: bold;">void</span> hello<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; value message <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Hello,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;World!&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; print<span style="color: #009900;">&#40;</span>message.<span style="color: #006633;">normalized</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Come non partire dal mitico <em>&#8220;Hello, World!&#8221;</em>? In realtà non è un &#8220;Hello, World!&#8221; semplice perché ci mostra due nuove caratteristiche del linguaggio. La prima è il modo con cui vengono documentati metodi e classi: niente commenti,  ma una sintassi specifica che può essere letta dal generatore di documentazione integrato di Ceylon. La seconda è il tipo variabile <code class="codecolorer text dawn"><span class="text">value</span></code> che può essere usato per simulare una certa dinamicità del linguaggio. Da notare però che nessuno ci obbliga ad usarlo: se siamo sicuri che la variabile <code class="codecolorer text dawn"><span class="text">message</span></code> sia una stringa possiamo direttamente dichiararla come tale tramite <code class="codecolorer text dawn"><span class="text">String message</span></code>.</p>
<p>Un&#8217;altra funzionalità molto utile è l&#8217;operatore di <em>null check</em>. Vediamolo in azione:</p>
<div class="codecolorer-container java dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> shoutedGreeting <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;HELLO, &quot;</span> <span style="color: #339933;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name<span style="color: #339933;">?</span>.<span style="color: #006633;">uppercased</span> <span style="color: #339933;">?</span> <span style="color: #0000ff;">&quot;WORLD&quot;</span><span style="color: #339933;">;</span></div></div>
<p>In questo esempio troviamo i due operatori in azione. Il primo è l&#8217;operatore <strong>&#8220;?&#8221;</strong>. Considerando il codice precedente, tale operatore restituisce <code class="codecolorer text dawn"><span class="text">name.uppercased</span></code> se e solo se quest&#8217;ultimo è diverso da <code class="codecolorer text dawn"><span class="text">null</span></code>, altrimenti restituisce il valore che lo segue (in questo caso la stringa &#8220;WORLD&#8221;). L&#8217;altro operatore nell&#8217;esempio è <strong>&#8220;?.&#8221;</strong>. Quest&#8217;ultimo fa in modo che si acceda alla funzione/attributo <code class="codecolorer text dawn"><span class="text">uppercased</span></code> se e solo se <code class="codecolorer text dawn"><span class="text">name</span></code> è diverso da <code class="codecolorer text dawn"><span class="text">null</span></code>. Questi due operatori ci risparmiano quindi tutta una serie di noiosi &#8220;if&#8221; annidati!</p>
<p>Le caratteristiche di Ceylon sono numerosissime e per maggiori informazioni vi rimando alla loro <a href="http://ceylon-lang.org/documentation/1.0/tour/basics/">pagina ufficiale</a>. Ceylon è ancora in fase di sviluppo ma è già possibile scaricare delle versioni preliminari!</p>
<p>Come se non bastasse è in progetto lo sviluppo di un backend che compili Ceylon in JavaScript rendendone possibile l&#8217;uso anche per lo sviluppo di applicazioni web.</p>
<p>Insomma, Ceylon è un progetto che vi consiglio caldamente di tenere d&#8217;occhio! </p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=811&amp;md5=3517c61620eabb35afb16675110a175d" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2012/04/oltre-java-ceylon/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2012%2F04%2Foltre-java-ceylon%2F&amp;language=it_IT&amp;category=text&amp;title=Oltre+Java%3A+Ceylon&amp;description=Chi+mi+conosce+sa+bene+il+mio+rapporto+di+amore-odio+con+Java.+Amore+perch%C3%A9+Java+%C3%A8+un+linguaggio+performante%2C+di+alto+livello+e+soprattutto+portabile.+L%26%238217%3Bho+usato+spesso%2C+lo+uso...&amp;tags=C%2Cceylon%2Cjava%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Tre motivi per cui preferisco i linguaggi statici</title>
		<link>http://davideaversa.it/slashcode/2012/04/tre-motivi-per-cui-preferisco-i-linguaggi-statici/</link>
		<comments>http://davideaversa.it/slashcode/2012/04/tre-motivi-per-cui-preferisco-i-linguaggi-statici/#comments</comments>
		<pubDate>Tue, 03 Apr 2012 15:07:35 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[tipizzazione dinamica]]></category>
		<category><![CDATA[tipizzazione statica]]></category>

		<guid isPermaLink="false">http://davideaversa.it/slashcode/?p=808</guid>
		<description><![CDATA[<div><a href="http://davideaversa.it/slashcode/2012/04/tre-motivi-per-cui-preferisco-i-linguaggi-statici/"><img title="Tre motivi per cui preferisco i linguaggi statici" src="http://davideaversa.it/slashcode/wp-content/uploads/2012/04/ducktyping.jpeg" alt="Tre motivi per cui preferisco i linguaggi statici"  width="" /></a></div><br/>Ogni tanto mi capita di trovarmi immischiato nella discussione che da anni tormenta programmatori e informatici di ogni nazione ed etnia: meglio usare un linguaggio tipizzato dinamicamente o staticamente? Senza pretese di scientificità o di dogma o di starvi a rivelare chissà quale verità arcana nascosta, vi dirò la mia sull&#8217;argomento. Innanzitutto sappiate che sulla <a href='http://davideaversa.it/slashcode/2012/04/tre-motivi-per-cui-preferisco-i-linguaggi-statici/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Ogni tanto mi capita di trovarmi immischiato nella discussione che da anni tormenta programmatori e informatici di ogni nazione ed etnia: <strong>meglio usare un linguaggio tipizzato dinamicamente o staticamente?</strong></p>
<p>Senza pretese di scientificità o di dogma o di starvi a rivelare chissà quale verità arcana nascosta, vi dirò la mia sull&#8217;argomento. <span id="more-808"></span> Innanzitutto sappiate che sulla faida statico/dinamico ci sono tonnellate di discussioni filosofiche, euristiche, epistemologiche e tecniche capaci di far impallidire chiunque provi ad avvicinarsi alla questione.</p>
<p><img src="http://davideaversa.it/slashcode/wp-content/uploads/2012/04/ducktyping.jpeg" alt="Esempio di Duck Typing " title="Duck Typing" width="477" height="396" class="aligncenter size-full wp-image-810" /></p>
<p>Celeberrimo è il <em>duck test</em> di <strong>Whitcomb Riley</strong>: <em>&#8220;Quando io vedo un uccello che cammina come un&#8217;anatra, nuota come un&#8217;anatra e starnazza come un&#8217;anatra, io chiamo quell&#8217;uccello &#8220;anatra&#8221;"</em>. Concetto che i sostenitori della tipizzazione dinamica sintetizzano in: guardate la vignetta precedente, se la scritta vi è stata di aiuto allora la tipizzazione statica fa per voi.</p>
<p>In pratica la questione è prettamente filosofica: <strong>l&#8217;identità di un <em>oggetto</em>-barra-<em>valore</em> deve derivare dalle sue caratteristiche o da una specifica esterna?</strong> Ovvero: un&#8217;anatra è un anatra perché vola, nuota, ha le piume, etc&#8230; oppure è un anatra perché dico che è un anatra?</p>
<p>Dal punto di vista della rappresentazione della conoscenza possiamo essere d&#8217;accordo che un oggetto sia identificato dalle sue proprietà, dal punto di vista informatico invece la questione è più spinosa. In informatica tutto è un numero e i numeri non hanno proprietà per natura bensì caratteristiche che nascono dall&#8217;interpretazione che io ne do (tramite l&#8217;assegnazione di un tipo).</p>
<p>Ma chiudendo la parentesi filosofica torniamo all&#8217;atto pratico: perché dovrei scegliere un linguaggio statico rispetto ad un linguaggio dinamico? Non c&#8217;è risposta, serve solo l&#8217;esperienza e il gusto personale. Tuttavia negli ultimi dieci anni ci hanno distrutto l&#8217;anima raccontandoci che i linguaggi statici (C, Java e compari) erano obsoleti e che il futuro era dinamico. Il risultato di questa campagna è che attualmente abbiamo decine di linguaggi dinamici liberi e di ottimo livello (Python, Ruby, PHP e molti altri) e solo un paio di linguaggi statici decenti. Io, da estimatore dei linguaggi statici, vengo qui per raccontarvi le mie personali considerazioni sull&#8217;argomento.</p>
<p><strong>1. Ordine nel caos</strong></p>
<p>Quando mi sono messo ad usare il Python per progetti di media complessità (vedi <a href="http://code.google.com/p/cobra-draughts/">CobraDraughts</a>) ho sempre avuto l&#8217;impressione che tutto era avvolto dal disordine. Il fatto che non bisognava dichiarare da nessuna parte gli attributi di una classe mi inquietava.</p>
<p>Oltre ai miei problemi psicologici però c&#8217;era un comportamento oggettivamente fastidioso: presa la classe A non c&#8217;era verso dalla classe B di sapere durante la digitazione del codice quali attributi avesse e, soprattutto, di che tipo fossero. Questo perché non esiste nessun tipo associato alle variabili di un linguaggio dinamico!</p>
<p>Questo comporta due grossi problemi:</p>
<ul>
<li>Il compilatore è quasi inutile come strumento di correzione degli errori. Se passo una stringa ad una variabile che nell&#8217;intero arco della sua vita <strong>deve</strong> contenere solamente interi non lo vengo a scoprire fino a quando non eseguo quella porzione di codice e il programma muore. Insomma, l&#8217;analisi statica del codice è praticamente nulla. Bisogna armarsi di pazienza e code-coverage ed  eseguire il codice.</li>
<li>L&#8217;overloading di funzioni con lo stesso numero di parametri è un parto greco. Probabilmente non si usano ma il mio cuore ne ha sofferto.</li>
</ul>
<p>A me personalmente tutta questa cosa fa sembrare che il programma si regga su un sottobosco di magia che non apprezzo. Inoltre la stretta maglia dei tipi mi costringe anche a strutturare meglio il codice e ad essere più rigoroso nello sviluppo.</p>
<p><strong>2. Prestazioni</strong></p>
<p>Qui c&#8217;è poco da fare. I linguaggi statici stracciano spesso e volentieri un linguaggio dinamico sul campo prestazionale, sia per il tempo che per la memoria. Ciò è causato semplicemente da tutto l&#8217;overhead necessario a gestire la &#8220;naturalissima&#8221; dinamicità delle variabili. Per alcune applicazioni ciò non è un problema (anche grazie all&#8217;uso di librerie che wrappano codice C) ma per molte altre invece si!</p>
<p>Molti dicono che questo non è un gran problema perché abbiamo macchine sempre più efficienti. Io credo che questo sia come dire che posso ingrassare venti chili perché tanto ho i pantaloni con l&#8217;elastico.</p>
<p><strong>3. Didattica</strong></p>
<p>Un aspetto da non trascurare. Quando mi trovo davanti la solita domanda su quale linguaggio sia meglio per cominciare a programmare, sento che molti consigliano linguaggi come il Python perché sono più semplici. Questo è sicuramente vero, la tipizzazione dinamica permette di trascurare una gran parte di aspetti della programmazione, ma mentre ciò può essere buono per chi già programma, a mio avviso, è un problema per chi comincia. Sarebbe come se un maestro di scacchi mi insegnasse a giocare senza cavalli, alfieri e 4 pedoni perché così è &#8220;più facile&#8221;.</p>
<p>Il risultato di certe politiche è l&#8217;inondazione di brutto codice e la prolificazione di programmi orrendamente progettati. Senza contare i bimbominkia del development che vanno in giro a raccontare che &#8220;il C è inutilmente complesso e fa schifo&#8221; mentre &#8220;il PHP ruleggia&#8221;.</p>
<p>È quindi importante per chi tiene corsi o si vuole avvicinare alla programmazione senza tutta la vicinanza alla macchina del C, di mantenersi almeno all&#8217;inizio sui linguaggi statici (come il Java o il C#) che aiutano a creare quella <em>forma mentis</em> necessaria anche per i linguaggi dinamici.</p>
<p>Inoltre, se ciò non bastasse, è più facile passare dallo statico al dinamico che viceversa. Quindi sul lungo periodo si risparmia anche fatica.</p>
<p><strong>In conclusione:</strong> questi sono i motivi per cui trovo molto molto più divertente lavorare con linguaggi staticamente tipizzati rispetto ai linguaggi dinamicamente tipizzati. Non sono leggi assolute e potete benissimo rispondermi che &#8220;io col Python ho programmato un AI senziente ed è stato facilissimo&#8221;. Ci credo, anche io uso il Python spesso.</p>
<p>Chiudo con una speranza. La speranza che i linguaggi statici vengano riscoperti e portati avanti in modo da avere la stessa scelta che abbiamo oggi con quelli dinamici. Lasciare questo mondo solo al C/C++, allo sgangherato Java e al controverso C# secondo me è una grandissima occasione sprecata.</p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=808&amp;md5=777bb2d421c30e0936d5dc695bd7dc5b" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2012/04/tre-motivi-per-cui-preferisco-i-linguaggi-statici/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2012%2F04%2Ftre-motivi-per-cui-preferisco-i-linguaggi-statici%2F&amp;language=it_IT&amp;category=text&amp;title=Tre+motivi+per+cui+preferisco+i+linguaggi+statici&amp;description=Ogni+tanto+mi+capita+di+trovarmi+immischiato+nella+discussione+che+da+anni+tormenta+programmatori+e+informatici+di+ogni+nazione+ed+etnia%3A+meglio+usare+un+linguaggio+tipizzato+dinamicamente+o+staticamente%3F+Senza...&amp;tags=programmazione%2Ctipizzazione+dinamica%2Ctipizzazione+statica%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Solo questione di ricerca?</title>
		<link>http://davideaversa.it/slashcode/2012/04/solo-questione-di-ricerca/</link>
		<comments>http://davideaversa.it/slashcode/2012/04/solo-questione-di-ricerca/#comments</comments>
		<pubDate>Mon, 02 Apr 2012 06:00:37 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[AI e Neuroscienze]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[ricerca]]></category>

		<guid isPermaLink="false">http://davideaversa.it/slashcode/?p=802</guid>
		<description><![CDATA[Era il 1971 quando in un celebre libro comparve la frase Nell&#8217;analizzare variazioni complicate si deve esaminare ogni ramo dell&#8217;albero una ed una sola volta. A scriverla non un informatico ne un matematico bensì il maestro di scacchi sovietico Alexander Kotov nel suo famoso Pensa come un Grande Maestro. La cosa che più sorprende della <a href='http://davideaversa.it/slashcode/2012/04/solo-questione-di-ricerca/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Era il 1971 quando in un celebre libro comparve la frase</p>
<blockquote><p>
Nell&#8217;analizzare variazioni complicate si deve esaminare ogni ramo dell&#8217;albero una ed una sola volta.
</p></blockquote>
<p>A scriverla non un informatico ne un matematico bensì il maestro di scacchi sovietico <strong><a href="http://it.wikipedia.org/wiki/Aleksandr_Aleksandrovi%C4%8D_Kotov">Alexander Kotov</a></strong> nel suo famoso <em>Pensa come un Grande Maestro</em>.</p>
<p><span id="more-802"></span>La cosa che più sorprende della frase, nonché di tutta l&#8217;opera di Kotov, è che in un epoca in cui l&#8217;informatica muoveva i suoi primi passi, un maestro sovietico di scacchi usasse con tanta naturalezza termini come <em>ramo</em> ed <em>albero</em> per descrivere il processo umano di analisi di una posizione scacchistica e della <strong>ricerca</strong> della migliore soluzione.</p>
<p>Ed è proprio la parola <em>&#8220;ricerca&#8221;</em>, secondo Kotov, il centro nevralgico di tutto il gioco: il grande maestro si differenzia dal principiante per la sua capacità di organizzare la mente, di strutturare il pensiero e di cercare in modo efficiente la migliore mossa possibile.</p>
<p>Oggi, a 40 anni di distanza da quelle parole, sappiamo che quelle parole erano vere e sono ancora oggi la base di tutta l&#8217;AI moderna. Il concetto di ricerca infatti rappresenta le fondamenta di tutte le tecniche di AI. Sia che si tratti di cercare un percorso,  pianificare una serie di azioni, trovare una mossa in un gioco o il minimo di una funzione non-lineare, tutta l&#8217;intelligenza sintetica ha in comune lo stesso principio: navigare l&#8217;incerto alla <em>ricerca</em> della soluzione migliore.</p>
<p>La differenza vera riguarda il <em>come</em> questa ricerca viene effettuata. Gli algoritmi di ricerca solitamente si possono descrivere in 20 righe di pseudocodice, eppure nessuno di questi algoritmi, preso così com&#8217;è, potrebbe essere applicato con successo ad un problema reale. Prendiamo ad esempio l&#8217;<a href="http://en.wikipedia.org/wiki/Alpha-beta_pruning">alpha-beta pruning</a>, algoritmo alla base di un infinità di intelligenze artificiali di giochi.</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">def</span> alphabeta<span style="color: black;">&#40;</span>node<span style="color: #66cc66;">,</span> depth<span style="color: #66cc66;">,</span> alpha<span style="color: #66cc66;">,</span> beta<span style="color: #66cc66;">,</span> Player<span style="color: black;">&#41;</span> &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> &nbsp;depth <span style="color: #66cc66;">==</span> <span style="color: #ff4500;">0</span> <span style="color: #ff7700;font-weight:bold;">or</span> node <span style="color: #ff7700;font-weight:bold;">is</span> a terminal node<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> the heuristic value of node<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> &nbsp;Player <span style="color: #66cc66;">==</span> MaxPlayer<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> each child <span style="color: #ff7700;font-weight:bold;">in</span> node<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; alpha <span style="color: #66cc66;">=</span> <span style="color: #008000;">max</span><span style="color: black;">&#40;</span>alpha<span style="color: #66cc66;">,</span> alphabeta<span style="color: black;">&#40;</span>child<span style="color: #66cc66;">,</span> depth-<span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span> alpha<span style="color: #66cc66;">,</span> beta<span style="color: #66cc66;">,</span> <span style="color: #ff7700;font-weight:bold;">not</span><span style="color: black;">&#40;</span>Player<span style="color: black;">&#41;</span> <span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> beta ? alpha<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">break</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#(* Beta cut-off *)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> alpha<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> each child of node<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; beta <span style="color: #66cc66;">=</span> <span style="color: #008000;">min</span><span style="color: black;">&#40;</span>beta<span style="color: #66cc66;">,</span> alphabeta<span style="color: black;">&#40;</span>child<span style="color: #66cc66;">,</span> depth-<span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span> alpha<span style="color: #66cc66;">,</span> beta<span style="color: #66cc66;">,</span> <span style="color: #ff7700;font-weight:bold;">not</span><span style="color: black;">&#40;</span>Player<span style="color: black;">&#41;</span> <span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> beta ? alpha<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">break</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#(* Alpha cut-off *)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> ?beta<br />
<span style="color: #808080; font-style: italic;">#(* Initial call *)</span><br />
alphabeta<span style="color: black;">&#40;</span>origin<span style="color: #66cc66;">,</span> depth<span style="color: #66cc66;">,</span> -infinity<span style="color: #66cc66;">,</span> +infinity<span style="color: #66cc66;">,</span> MaxPlayer<span style="color: black;">&#41;</span></div></div>
<p>L&#8217;algoritmo è tutto qui, poco meno di 20 righe, eppure preso così è inutile. Prima bisogna rispondere a domande del tipo <strong>&#8220;Come costruisco l&#8217;albero?&#8221;</strong> o <strong>&#8220;Come posso valutare in modo preciso un nodo?&#8221;</strong> e <strong>&#8220;Come minimizzare il numero di nodi esplorati?&#8221;</strong>. Risposte che richiedono centinaia e centinaia di righe di codice e dalla cui risposta dipendono drammaticamente le prestazioni di ricerca.</p>
<p>Ad esempio sia <strong>Deep Blue</strong> che <strong>Junior</strong> utilizzano come base l&#8217;alpha-beta pruning per la ricerca e l&#8217;analisi di una posizione scacchistica, eppure Deep Blue, che altro non è che un gigantesco mainframe divora mosse, viene tranquillamente stracciato da Junior (che tra l&#8217;altro gira su un normalissimo PC) grazie ad una serie di ottimizzazioni che rendono il suo gioco molto più intelligente.</p>
<p>A questo punto la domanda sorge spontanea: quanto è simile tutto questo all&#8217;intelligenza umana? Onestamente credo che la risposta non abbia molta importanza. Per dirla come <strong>Drew McDermott</strong> </p>
<blockquote><p>Dire che Deep Blue non pensa davvero quando gioca a scacchi equivale dire che un aereo non vola davvero perchè non sbatte le ali.</p></blockquote>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=802&amp;md5=06c3aa832db2cb731138c740e9a2ec6a" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2012/04/solo-questione-di-ricerca/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2012%2F04%2Fsolo-questione-di-ricerca%2F&amp;language=it_IT&amp;category=text&amp;title=Solo+questione+di+ricerca%3F&amp;description=Era+il+1971+quando+in+un+celebre+libro+comparve+la+frase+Nell%26%238217%3Banalizzare+variazioni+complicate+si+deve+esaminare+ogni+ramo+dell%26%238217%3Balbero+una+ed+una+sola+volta.+A+scriverla+non+un+informatico...&amp;tags=ai%2Cricerca%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Mono, C# e il Game Development</title>
		<link>http://davideaversa.it/slashcode/2012/03/mono-c-e-il-game-development/</link>
		<comments>http://davideaversa.it/slashcode/2012/03/mono-c-e-il-game-development/#comments</comments>
		<pubDate>Wed, 28 Mar 2012 10:19:06 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[Game Development]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[game development]]></category>
		<category><![CDATA[mono]]></category>

		<guid isPermaLink="false">http://davideaversa.it/slashcode/?p=797</guid>
		<description><![CDATA[<div><a href="http://davideaversa.it/slashcode/2012/03/mono-c-e-il-game-development/"><img title="Mono, C# e il Game Development" src="http://davideaversa.it/slashcode/wp-content/uploads/2012/03/magika-1024x576.jpg" alt="Mono, C# e il Game Development"  width="" /></a></div><br/>Qualche tempo fa, durante l&#8217;incontro annuale di AltDevConf 2012, Miguel de Icaza ha partecipato con un talk dal titolo &#8220;Mono for Game Development&#8221;. Una presentazione interessante (che trovate nel link) che dava una panoramica piuttosto completa dell&#8217;utilizzo di C# e di Mono nello sviluppo videoludico e dei vantaggi che ne conseguono. Ok. Una presentazione di <a href='http://davideaversa.it/slashcode/2012/03/mono-c-e-il-game-development/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Qualche tempo fa, durante l&#8217;incontro annuale di <strong>AltDevConf 2012</strong>, <strong>Miguel de Icaza</strong> ha partecipato con un <em>talk</em> dal titolo <a href="http://www.slideshare.net/Xamarin/mono-for-game-developers-altdevconf-2012">&#8220;Mono for Game Development&#8221;</a>. Una presentazione interessante (che trovate nel link) che dava una panoramica piuttosto completa dell&#8217;utilizzo di C# e di Mono nello sviluppo videoludico e dei vantaggi che ne conseguono.</p>
<p>Ok. Una presentazione di de Icaza sui vantaggi di Mono suona molto come chiedere all&#8217;oste se il vino è buono. Tuttavia l&#8217;argomento è interessante e lancia subito una domanda: &#8220;Mono e C# sono veramente linguaggi utili e con un futuro nello sviluppo di videogame?&#8221;</p>
<p><span id="more-797"></span><strong>C#</strong></p>
<p>Innanzitutto va precisata una cosa: C# è un ottimo linguaggio. Che che ne dicano i detrattori di qualunque cosa sia Microsoft, C# è uno dei migliori linguaggi staticamente tipizzati in circolazione ed il tentativo di Mono di portare su altre piattaforme quella che sarebbe stata una tecnologia limitata a Windows è da ringraziare.</p>
<p>Il C# è un linguaggio che a prima vista ricorda molto il Java ma si differenzia da esso per essere molto più snello, avere una sintassi più pulita ed intuitiva e, al contempo, la possibilità di spingersi più a basso livello. Per esempio in C# possiamo implementare l&#8217;incapsulamento degli attributi di una classe in questo modo:</p>
<div class="codecolorer-container csharp dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">string</span> nome<span style="color: #008000;">;</span><br />
<br />
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> Nome<br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; get<br />
&nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">return</span> nome<span style="color: #008000;">;</span><br />
&nbsp; <span style="color: #008000;">&#125;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<p>Questo creerà un&#8217;attributo pubblico &#8220;fittizio&#8221; chiamato Nome accessibile normalmente ma vincolato dalle funzioni &#8220;get&#8221; e &#8220;set&#8221; in esso contenute (in questo caso, non essendoci &#8220;set&#8221;, Nome è un&#8217;attributo in sola lettura).</p>
<p>Allo stesso tempo però C# mantiene un gran numero di elementi di basso livello (come le &#8220;struct&#8221;) che permettono un&#8217;integrazione diretta, quasi nativa, con il codice C e C++. Insomma, per i miei canoni è un ottimo strumento di lavoro.</p>
<p>Detto questo rimane la domanda iniziale: C# ha ed avrà un ruolo chiave nel settore ludico? </p>
<p><strong>XNA e Unity3D</strong></p>
<p>Per quanto mi riguarda la risposta è positiva e i motivi sono principalmente due:</p>
<ul>
<li>C# è un linguaggio che offre un ottimo compromesso fra l&#8217;immediatezza poco performante di un linguaggio di scripting e la complessità efficiente di un linguaggio di basso livello. Questo gli permette di soppiantare (totalmente?) l&#8217;uso dello scripting nei giochi (come per l&#8217;AI) migliorando le prestazioni.</li>
<li><strong>XNA e Unity3D</strong> (non c&#8217;entra Ubuntu stavolta). Due game engine che utilizzano C# come linguaggio predefinito che hanno riscosso enorme successo.</li>
</ul>
<p><a href="http://davideaversa.it/slashcode/wp-content/uploads/2012/03/magika.jpg"><img src="http://davideaversa.it/slashcode/wp-content/uploads/2012/03/magika-1024x576.jpg" alt="" title="magika" width="695" height="390" class="aligncenter size-large wp-image-799" /></a></p>
<p>Mentre il primo è un motivo, se mi permettete il termine, <em>oggettivo</em>, il secondo sembra una marchetta. In realtà XNA ha avuto e probabilmente avrà un ruolo chiave nello sviluppo videoludico, specialmente per il settore <em>indie</em>.</p>
<p>XNA, per chi non lo conoscesse, è un ottimo game engine e ha permesso in questi anni la realizzazione di numerosi giochi indipendenti di successo (per esempio <strong><a href="http://en.wikipedia.org/wiki/Magicka">Magicka</a></strong> di Arrowhead Game Studio o <strong>Bastion</strong>). Uno dei grandi punti a favore di XNA è la possibilità di operare sia ad alto livello (entità, scene, collisioni e input), sia a basso livello (ad esempio con la possibilità di scrivere uno shader o di personalizzare la rappresentazione di un vertice variando il numero di bit da allocare e il modo di utilizzarli nella memoria video).</p>
<p>Lo svantaggio principale di XNA è il solito di ogni tecnologia Microsoft: gira solo su prodotti Microsoft (Windows, XBox e Windows Phone). Il corrispettivo di XNA per Mono, chiamato <a href="http://monogame.codeplex.com/">MonoGame</a>, che dovrebbe colmare questa lacuna, è ancora incompleto (attualmente è implementata solo la parte 2D di XNA), speriamo ancora per poco.</p>
<p><a href="http://davideaversa.it/slashcode/wp-content/uploads/2012/03/unity3d.png"><img src="http://davideaversa.it/slashcode/wp-content/uploads/2012/03/unity3d.png" alt="Unity3D Screenshot" title="Unity3D Screenshot" width="700" height="443" class="aligncenter size-full wp-image-801" /></a></p>
<p>Un&#8217;altro famoso game engine utilizzato massivamente dalla comunità indie (e anche da alcune realtà commerciali) è <strong><a href="http://unity3d.com/">Unity3D</a></strong>. Questo è un motore gratuito (tuttavia con una licenza gratuita più restrittiva di XNA) dotato di un editor grafico e integrato con MonoDevelop. Il punto di forza di Unity è il numero di piattaforme su cui gira: è possibile infatti rilasciare giochi scritti in Unity su PC, Mac, Android, iPhone, PS3, XBox, Wii e un&#8217;altro paio di piattaforme. Sfortunatamente fra queste, al momento, non c&#8217;è Linux.</p>
<p><strong>Le Alternative Open</strong></p>
<p>Ovviamente non di solo codice proprietario è fatto il mondo e ciò vale anche per i game engine Mono-based. Nel mondo open source ci sono fondamentalmente due motori C# per giochi:</p>
<ul>
<li><strong><a href="http://axiom3d.net/wiki/index.php/Main_Page">Axiom 3D</a></strong>: giunto alla versione 0.8 rappresenta un wrapping di OGRE in C#.</li>
<li><strong><a href="http://www.deltaengine.net/">Delta Engine</a></strong>: giunto alla versione 0.9.4, Delta Engine è un motore di gioco scritto interamente in C#.</li>
</ul>
<p>Personalmente non ho provato nessuno dei due ma ne ho sentito parlare in modo positivo. </p>
<p><strong>Il Futuro</strong></p>
<p>In definitiva, se avete sogni di game development è bene quindi fare un pensierino ad imparare il C# poiché, come abbiamo visto, oltre ad essere divertente (almeno per me lo è) è utilizzato da due dei più promettenti motori di sviluppo attualmente disponibili.</p>
<p>C# e Mono hanno dimostrato ampiamente di avere tutte le carte in regola per essere nel prossimo futuro uno strumento importante nello sviluppo di videogame e le future versioni del linguaggio promettono vantaggi ancora più importanti.</p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=797&amp;md5=9599d29433fa5176ca48465320eb43d0" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2012/03/mono-c-e-il-game-development/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2012%2F03%2Fmono-c-e-il-game-development%2F&amp;language=it_IT&amp;category=text&amp;title=Mono%2C+C%23+e+il+Game+Development&amp;description=Qualche+tempo+fa%2C+durante+l%26%238217%3Bincontro+annuale+di+AltDevConf+2012%2C+Miguel+de+Icaza+ha+partecipato+con+un+talk+dal+titolo+%26%238220%3BMono+for+Game+Development%26%238221%3B.+Una+presentazione+interessante+%28che+trovate+nel+link%29...&amp;tags=C%2Cgame+development%2Cmono%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Ricominciamo da 3</title>
		<link>http://davideaversa.it/slashcode/2012/03/ricominciamo-da-3/</link>
		<comments>http://davideaversa.it/slashcode/2012/03/ricominciamo-da-3/#comments</comments>
		<pubDate>Mon, 26 Mar 2012 06:00:37 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[TheSlashCodeProject]]></category>
		<category><![CDATA[slashcode]]></category>

		<guid isPermaLink="false">http://davideaversa.it/slashcode/?p=794</guid>
		<description><![CDATA[Eccoci di nuovo qui a qualche mese di distanza. Innanzitutto grazie a tutti quelli che hanno continuato e continuano a seguirmi sui vari social network (principalmente G+ e Twitter), spero che la rinnovata attività di SlashCode possa farvi piacere come fa piacere a me condividere qui idee e dibattiti. La terza reincarnazione di SlashCode porta <a href='http://davideaversa.it/slashcode/2012/03/ricominciamo-da-3/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Eccoci di nuovo qui a qualche mese di distanza. Innanzitutto grazie a tutti quelli che hanno continuato e continuano a seguirmi sui vari social network (principalmente <strong>G+</strong> e <strong>Twitter</strong>), spero che la rinnovata attività di SlashCode possa farvi piacere come fa piacere a me condividere qui idee e dibattiti. </p>
<p>La terza reincarnazione di SlashCode porta con se un paio di novità. Per prima cosa SlashCode ha subito un grosso restyling grafico: nuovo template, nuovi colori e nuovo logo. Ho puntato ad eliminare tutti i dettagli inutili per cercare di mantenere l&#8217;attenzione sugli articoli piuttosto che sul contorno. Spero che sia una modifica gradita!</p>
<p>Secondo, come forse sapete è da febbraio che collaboro con <a href="http://www.oneopensource.it/">OneOpensource</a> ed <a href="http://blog.html.it/">Edit</a>. Questo significa che su SlashCode eviterò (quasi del tutto) di parlare di argomenti sovrapponibili e cercherò quindi di concentrarmi sulla programmazione e l&#8217;AI.</p>
<p>Alla luce dei miei interessi attuali credo che gli argomenti principali saranno l&#8217;<strong>AI</strong>, il <strong>Game Development</strong> e qualcosa riguardante framework web quali <strong>Django</strong>. Questo sommario comunque non è un giuramento quindi mi riservo il diritto di cambiare idea. <img src='http://davideaversa.it/slashcode/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Questo è tutto. Ci vediamo presto con qualche nuovo post. <img src='http://davideaversa.it/slashcode/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=794&amp;md5=a54c3ec8b66ca07ec5eab6d5c27fa83a" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2012/03/ricominciamo-da-3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2012%2F03%2Fricominciamo-da-3%2F&amp;language=it_IT&amp;category=text&amp;title=Ricominciamo+da+3&amp;description=Eccoci+di+nuovo+qui+a+qualche+mese+di+distanza.+Innanzitutto+grazie+a+tutti+quelli+che+hanno+continuato+e+continuano+a+seguirmi+sui+vari+social+network+%28principalmente+G%2B+e+Twitter%29%2C+spero...&amp;tags=slashcode%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Quick Fix: error while loading shared libraries</title>
		<link>http://davideaversa.it/slashcode/2011/09/quick-fix-error-while-loading-shared-libraries/</link>
		<comments>http://davideaversa.it/slashcode/2011/09/quick-fix-error-while-loading-shared-libraries/#comments</comments>
		<pubDate>Thu, 01 Sep 2011 17:46:17 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Generale]]></category>
		<category><![CDATA[Guide]]></category>
		<category><![CDATA[librerie]]></category>
		<category><![CDATA[sistema operativo]]></category>

		<guid isPermaLink="false">http://davideaversa.it/slashcode/?p=790</guid>
		<description><![CDATA[Salve a tutti e ben tornati dalle vacanze!Per riprendere un po&#8217; il ritmo con il blog vi propongo dei mini-post che rispondono velocemente ai più comuni problemi di compilazione ed esecuzione di programmi. Il primo problema che risolveremo è il seguente error while loading shared libraries: libXXX.so: cannot open shared object file: No such file <a href='http://davideaversa.it/slashcode/2011/09/quick-fix-error-while-loading-shared-libraries/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Salve a tutti e ben tornati dalle vacanze!Per riprendere un po&#8217; il ritmo con il blog vi propongo dei mini-post che rispondono velocemente ai più comuni problemi di compilazione ed esecuzione di programmi.</p>
<p>Il primo problema che risolveremo è il seguente</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">error <span style="color: #000000; font-weight: bold;">while</span> loading shared libraries: libXXX.so: cannot open shared object file: No such <span style="color: #c20cb9; font-weight: bold;">file</span> or directory</div></div>
<p>A chi non è capitato almeno una volta nella vita?</p>
<p><span id="more-790"></span></p>
<p><strong>PREMESSA:</strong></p>
<p>Ogni applicazione sul vostro sistema usa delle <strong>librerie</strong>. Una libreria non è altro che un insieme di codice già pronto e compilato che esegue delle funzioni specifiche. Questo permette ad ogni sviluppatore di <em>non reinventare la ruota ogni volta</em> ma di utilizzare il codice già scritto da altri.</p>
<p>Una libreria può essere <strong>statica</strong> (.a) o <strong>dinamica</strong> (.so o .dll su Windows). Nel primo caso la libreria viene inglobata nell&#8217;eseguibile in fase di compilazione, nel secondo invece la libreria è un file separato che viene agganciato all&#8217;eseguibile durante il caricamento del programma da un componente del sistema operativo chiamato <strong>linker dinamico</strong>.</p>
<p>Ovviamente le librerie dinamiche ottimizzano meglio le risorse evitando che del codice uguale venga replicato inutilmente in ogni eseguibile.</p>
<p><strong>CAUSA:</strong></p>
<p>Il messaggio di errore non lascia alcun dubbio: la libreria dinamica non è presente nel sistema o il linker dinamico non riesce a trovarla.</p>
<p><strong>SOLUZIONE:</strong></p>
<p>Se la causa è semplice la soluzione è altrettanto semplice.</p>
<p>Per prima cosa accertiamoci che la libreria sia installata e presente nel nostro sistema. Possiamo verificarlo agilmente con</p>
<p><code class="codecolorer text dawn"><span class="text">locate libXXX.so</span></code></p>
<p>Che restituirà il percorso della libreria.</p>
<p>Se la libreria è stata installata durante la sessione corrente allora dobbiamo forzare l&#8217;aggiornamento del database con</p>
<p><code class="codecolorer text dawn"><span class="text">sudo updatedb</span></code></p>
<p>A questo punto probabilmente la libreria si troverà in un percorso non standard. Non ci resta che aggiungere questo percorso nella lista dei percorsi scandagliati dal linker.</p>
<p>Per fare questo apriamo il file <code class="codecolorer text dawn"><span class="text">/etc/ld.so.conf</span></code> (o creiamo un file nella cartella <code class="codecolorer text dawn"><span class="text">/etc/ld.so.conf.d/</span></code>) e inseriamoci dentro il percorso della libreria, ad esempio:</p>
<p><code class="codecolorer text dawn"><span class="text">/usr/local/lib</span></code>.</p>
<p>A questo punto chiamiamo</p>
<p><code class="codecolorer text dawn"><span class="text">sudo ldconfig</span></code></p>
<p>per aggiornare la cache del linker. </p>
<p>E il gioco è fatto.</p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=790&amp;md5=73d45dff39a2dba303463570623e8199" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2011/09/quick-fix-error-while-loading-shared-libraries/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2011%2F09%2Fquick-fix-error-while-loading-shared-libraries%2F&amp;language=it_IT&amp;category=text&amp;title=Quick+Fix%3A+error+while+loading+shared+libraries&amp;description=Salve+a+tutti+e+ben+tornati+dalle+vacanze%21Per+riprendere+un+po%26%238217%3B+il+ritmo+con+il+blog+vi+propongo+dei+mini-post+che+rispondono+velocemente+ai+pi%C3%B9+comuni+problemi+di+compilazione+ed...&amp;tags=librerie%2Csistema+operativo%2Cblog" type="text/html" />
	</item>
		<item>
		<title>JavaScript War : Firefox 5 &#8211; Chrome 13</title>
		<link>http://davideaversa.it/slashcode/2011/08/javascript-war-firefox-5-chrome-13/</link>
		<comments>http://davideaversa.it/slashcode/2011/08/javascript-war-firefox-5-chrome-13/#comments</comments>
		<pubDate>Thu, 04 Aug 2011 12:35:44 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://davideaversa.it/slashcode/?p=784</guid>
		<description><![CDATA[<div><a href="http://davideaversa.it/slashcode/2011/08/javascript-war-firefox-5-chrome-13/"><img title="JavaScript War : Firefox 5 &#8211; Chrome 13" src="http://davideaversa.it/slashcode/wp-content/uploads/2011/08/FirefoxChrome-150x150.jpg" alt="JavaScript War : Firefox 5 &#8211; Chrome 13"  width="" /></a></div><br/>JavaScript ha lo spiacevole effetto scaricare il costo della sua esecuzione sui browser. Vediamo quindi chi se la cava meglio.]]></description>
			<content:encoded><![CDATA[<p><a href="http://davideaversa.it/slashcode/wp-content/uploads/2011/08/FirefoxChrome.jpg"><img src="http://davideaversa.it/slashcode/wp-content/uploads/2011/08/FirefoxChrome-150x150.jpg" alt="" title="FirefoxChrome" width="150" height="150" class="alignleft size-thumbnail wp-image-785" /></a></p>
<p>In questa nuova rivoluzione Web chiamata per brevità <strong>HTML5</strong>, uno dei protagonisti è senza alcun dubbio il riesumato <strong>JavaScript</strong>. Tornato dalla tomba in cui sembrava essere stato sepolto per riportare nuova luce e dinamicità ai contenuti Web.</p>
<p>JavaScript, in quanto computazione client-side ha anche lo spiacevole effetto di condizionare le prestazioni di un sito e di scaricare il gravoso costo della sua esecuzione sui browser. Questa è la <em>casus belli</em> della JavaScript War che imperversa nei centri di sviluppo dei vari browser da qualche anno.</p>
<p>Iniziamo quindi ad analizzare la battaglia dei contendenti più accreditati: <strong>Firefox</strong> e <strong>Chrome</strong>.</p>
<p><span id="more-784"></span></p>
<p><strong>Firefox</strong></p>
<ul>
<li><strong>Versione:</strong> 5.0</li>
<li><strong>Rendering:</strong> Geko 5.0</li>
<li><strong>Motore JavaScipt:</strong> SpiderMonkey</li>
</ul>
<p><strong>Chrome</strong></p>
<ul>
<li><strong>Versione:</strong> 13</li>
<li><strong>Rendering:</strong> WebKit 535.1</li>
<li><strong>Motore JavaScipt:</strong> V8 3.3.10.22</li>
</ul>
<p><strong>BENCHMARK 1 : SUNSPIDER 0.9.1</strong></p>
<p>Il primo benchmark è SUNSPIDER di casa WebKit. Il test mi ha sorpreso perché Firefox risulta più performante di Chrome. Come potete vedere dal risultato (FROM è Firefox e TO è Chrome) la differenza è minima ma a favore di Firefox.</p>
<p>Risultato:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">TEST &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; COMPARISON &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FROM &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TO &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DETAILS<br />
<br />
=============================================================================<br />
<br />
** TOTAL **: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *1.067x as slow* &nbsp;735.1ms +/- 0.3% &nbsp; 784.3ms +/- 2.4% &nbsp; &nbsp; significant<br />
<br />
=============================================================================<br />
<br />
&nbsp; 3d: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*1.186x as slow* &nbsp;102.4ms +/- 1.3% &nbsp; 121.4ms +/- 7.7% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; cube: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*1.082x as slow* &nbsp; 37.8ms +/- 2.1% &nbsp; &nbsp;40.9ms +/- 7.2% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; morph: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *1.54x as slow* &nbsp; &nbsp;18.6ms +/- 2.7% &nbsp; &nbsp;28.7ms +/- 3.5% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; raytrace: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*1.126x as slow* &nbsp; 46.0ms +/- 0.7% &nbsp; &nbsp;51.8ms +/- 16.3% &nbsp; &nbsp; significant<br />
<br />
&nbsp; access: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1.47x as fast &nbsp; &nbsp; &nbsp;99.7ms +/- 1.4% &nbsp; &nbsp;67.8ms +/- 5.9% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; binary-trees: &nbsp; &nbsp; &nbsp;4.46x as fast &nbsp; &nbsp; &nbsp;25.0ms +/- 3.0% &nbsp; &nbsp; 5.6ms +/- 12.3% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; fannkuch: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1.70x as fast &nbsp; &nbsp; &nbsp;42.6ms +/- 2.3% &nbsp; &nbsp;25.0ms +/- 6.5% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; nbody: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *1.66x as slow* &nbsp; &nbsp;15.0ms +/- 3.2% &nbsp; &nbsp;24.9ms +/- 17.8% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; nsieve: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1.39x as fast &nbsp; &nbsp; &nbsp;17.1ms +/- 2.4% &nbsp; &nbsp;12.3ms +/- 12.6% &nbsp; &nbsp; significant<br />
<br />
&nbsp; bitops: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*1.77x as slow* &nbsp; &nbsp;45.5ms +/- 1.3% &nbsp; &nbsp;80.7ms +/- 7.9% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; 3bit-bits-in-byte: *7.47x as slow* &nbsp; &nbsp; 1.7ms +/- 20.3% &nbsp; &nbsp;12.7ms +/- 20.6% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; bits-in-byte: &nbsp; &nbsp; &nbsp;1.43x as fast &nbsp; &nbsp; &nbsp;25.7ms +/- 1.3% &nbsp; &nbsp;18.0ms +/- 9.5% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; bitwise-and: &nbsp; &nbsp; &nbsp; *6.26x as slow* &nbsp; &nbsp; 4.3ms +/- 8.0% &nbsp; &nbsp;26.9ms +/- 14.9% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; nsieve-bits: &nbsp; &nbsp; &nbsp; *1.67x as slow* &nbsp; &nbsp;13.8ms +/- 6.4% &nbsp; &nbsp;23.1ms +/- 17.6% &nbsp; &nbsp; significant<br />
<br />
&nbsp; controlflow: &nbsp; &nbsp; &nbsp; &nbsp; 3.06x as fast &nbsp; &nbsp; &nbsp;34.3ms +/- 1.0% &nbsp; &nbsp;11.2ms +/- 31.5% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; recursive: &nbsp; &nbsp; &nbsp; &nbsp; 3.06x as fast &nbsp; &nbsp; &nbsp;34.3ms +/- 1.0% &nbsp; &nbsp;11.2ms +/- 31.5% &nbsp; &nbsp; significant<br />
<br />
&nbsp; crypto: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*1.090x as slow* &nbsp; 61.1ms +/- 1.2% &nbsp; &nbsp;66.6ms +/- 12.4% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; aes: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *1.116x as slow* &nbsp; 25.1ms +/- 1.6% &nbsp; &nbsp;28.0ms +/- 11.7% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; md5: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.124x as fast &nbsp; &nbsp; 22.6ms +/- 1.6% &nbsp; &nbsp;20.1ms +/- 26.1% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; sha1: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*1.38x as slow* &nbsp; &nbsp;13.4ms +/- 2.8% &nbsp; &nbsp;18.5ms +/- 5.8% &nbsp; &nbsp; significant<br />
<br />
&nbsp; date: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*1.059x as slow* &nbsp;114.0ms +/- 1.0% &nbsp; 120.7ms +/- 3.5% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; format-tofte: &nbsp; &nbsp; &nbsp;1.82x as fast &nbsp; &nbsp; &nbsp;81.6ms +/- 0.9% &nbsp; &nbsp;44.9ms +/- 5.8% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; format-xparb: &nbsp; &nbsp; &nbsp;*2.34x as slow* &nbsp; &nbsp;32.4ms +/- 1.9% &nbsp; &nbsp;75.8ms +/- 3.7% &nbsp; &nbsp; significant<br />
<br />
&nbsp; math: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1.33x as fast &nbsp; &nbsp; &nbsp;73.5ms +/- 1.4% &nbsp; &nbsp;55.3ms +/- 3.8% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; cordic: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2.22x as fast &nbsp; &nbsp; &nbsp;21.5ms +/- 1.8% &nbsp; &nbsp; 9.7ms +/- 6.1% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; partial-sums: &nbsp; &nbsp; &nbsp;*1.046x as slow* &nbsp; 28.5ms +/- 1.8% &nbsp; &nbsp;29.8ms +/- 4.2% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; spectral-norm: &nbsp; &nbsp; 1.49x as fast &nbsp; &nbsp; &nbsp;23.5ms +/- 2.2% &nbsp; &nbsp;15.8ms +/- 10.8% &nbsp; &nbsp; significant<br />
<br />
&nbsp; regexp: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1.30x as fast &nbsp; &nbsp; &nbsp;34.0ms +/- 2.6% &nbsp; &nbsp;26.1ms +/- 2.7% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; dna: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.30x as fast &nbsp; &nbsp; &nbsp;34.0ms +/- 2.6% &nbsp; &nbsp;26.1ms +/- 2.7% &nbsp; &nbsp; significant<br />
<br />
&nbsp; string: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*1.37x as slow* &nbsp; 170.6ms +/- 1.2% &nbsp; 234.5ms +/- 1.6% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; base64: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*1.79x as slow* &nbsp; &nbsp;10.4ms +/- 3.5% &nbsp; &nbsp;18.6ms +/- 9.3% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; fasta: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *1.145x as slow* &nbsp; 31.8ms +/- 2.8% &nbsp; &nbsp;36.4ms +/- 2.5% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; tagcloud: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;?? &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 52.3ms +/- 2.5% &nbsp; &nbsp;53.4ms +/- 2.0% &nbsp; &nbsp; not conclusive: might be *1.021x as slow*<br />
&nbsp; &nbsp; unpack-code: &nbsp; &nbsp; &nbsp; *1.54x as slow* &nbsp; &nbsp;53.9ms +/- 0.8% &nbsp; &nbsp;82.9ms +/- 1.9% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; validate-input: &nbsp; &nbsp;*1.95x as slow* &nbsp; &nbsp;22.2ms +/- 2.0% &nbsp; &nbsp;43.2ms +/- 3.0% &nbsp; &nbsp; significant</div></div>
<p><strong>BENCHMARK 2 : V8 BENCHMARK</strong></p>
<p>Questo è un benchmark piuttosto minimale fatto da Google appositamente per V8 e usato per il tuning dello stesso. C&#8217;è poco da sorprendersi che il risultato sia a vantaggio di V8 per un buon 168% in più.</p>
<p>Risultati Firefox:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Score: 1326 &lt;----<br />
<br />
Richards: 2606<br />
DeltaBlue: 1351<br />
Crypto: 2397<br />
RayTrace: 550<br />
EarleyBoyer: 1184<br />
RegExp: 596<br />
Splay: 2204</div></div>
<p>Risultati Chrome:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Score: 3560 &lt;----<br />
<br />
Richards: 4815<br />
DeltaBlue: 5203<br />
Crypto: 6233<br />
RayTrace: 4653<br />
EarleyBoyer: 9177<br />
RegExp: 910<br />
Splay: 1195</div></div>
<p><strong>BENCHMARK 3 : Kraken 1.1</strong></p>
<p>Per par condicio ho lanciato anche Kraken, benchmark minimale di casa Mozilla. Tuttavia anche Kraken va contro la sua stessa creatura. La differenza è meno marcata (106%) ma comunque sostanziosa. In pratica Firefox ci mette<strong> il doppio</strong> del tempo del concorrente a terminare il benchmark.</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">TEST &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; COMPARISON &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FROM &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TO &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DETAILS<br />
<br />
====================================================================================<br />
<br />
** TOTAL **: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.06x as fast &nbsp; &nbsp; 17426.2ms +/- 1.6% &nbsp; 8456.6ms +/- 1.2% &nbsp; &nbsp; significant<br />
<br />
====================================================================================<br />
<br />
&nbsp; ai: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;9.85x as fast &nbsp; &nbsp; &nbsp;5491.4ms +/- 4.5% &nbsp; &nbsp;557.6ms +/- 4.8% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; astar: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 9.85x as fast &nbsp; &nbsp; &nbsp;5491.4ms +/- 4.5% &nbsp; &nbsp;557.6ms +/- 4.8% &nbsp; &nbsp; significant<br />
<br />
&nbsp; audio: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.74x as fast &nbsp; &nbsp; &nbsp;4684.1ms +/- 1.0% &nbsp; 2697.0ms +/- 1.8% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; beat-detection: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1.34x as fast &nbsp; &nbsp; &nbsp;1123.9ms +/- 0.7% &nbsp; &nbsp;839.7ms +/- 2.6% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; dft: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.54x as fast &nbsp; &nbsp; &nbsp;1409.8ms +/- 2.5% &nbsp; &nbsp;913.2ms +/- 1.4% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; fft: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.64x as fast &nbsp; &nbsp; &nbsp; 880.6ms +/- 0.7% &nbsp; &nbsp;537.4ms +/- 3.3% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; oscillator: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;3.12x as fast &nbsp; &nbsp; &nbsp;1269.8ms +/- 2.1% &nbsp; &nbsp;406.7ms +/- 2.2% &nbsp; &nbsp; significant<br />
<br />
&nbsp; imaging: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.45x as fast &nbsp; &nbsp; &nbsp;4511.9ms +/- 1.6% &nbsp; 3111.2ms +/- 2.5% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; gaussian-blur: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.46x as fast &nbsp; &nbsp; &nbsp;1748.3ms +/- 1.8% &nbsp; &nbsp;711.0ms +/- 2.5% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; darkroom: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*1.36x as slow* &nbsp; &nbsp; 827.2ms +/- 0.5% &nbsp; 1121.2ms +/- 1.8% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; desaturate: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1.51x as fast &nbsp; &nbsp; &nbsp;1936.4ms +/- 3.7% &nbsp; 1279.0ms +/- 5.9% &nbsp; &nbsp; significant<br />
<br />
&nbsp; json: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1.039x as fast &nbsp; &nbsp; &nbsp;495.2ms +/- 0.2% &nbsp; &nbsp;476.8ms +/- 2.0% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; parse-financial: &nbsp; &nbsp; &nbsp; &nbsp; *1.037x as slow* &nbsp; &nbsp;283.6ms +/- 0.2% &nbsp; &nbsp;294.2ms +/- 3.2% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; stringify-tinderbox: &nbsp; &nbsp; 1.159x as fast &nbsp; &nbsp; &nbsp;211.6ms +/- 0.3% &nbsp; &nbsp;182.6ms +/- 0.7% &nbsp; &nbsp; significant<br />
<br />
&nbsp; stanford: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1.39x as fast &nbsp; &nbsp; &nbsp;2243.6ms +/- 1.4% &nbsp; 1614.0ms +/- 0.4% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; crypto-aes: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1.44x as fast &nbsp; &nbsp; &nbsp; 625.4ms +/- 5.1% &nbsp; &nbsp;435.1ms +/- 0.8% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; crypto-ccm: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1.058x as fast &nbsp; &nbsp; &nbsp;461.2ms +/- 1.8% &nbsp; &nbsp;435.8ms +/- 0.8% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; crypto-pbkdf2: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.69x as fast &nbsp; &nbsp; &nbsp; 809.2ms +/- 0.8% &nbsp; &nbsp;477.7ms +/- 1.1% &nbsp; &nbsp; significant<br />
&nbsp; &nbsp; crypto-sha256-iterative: 1.31x as fast &nbsp; &nbsp; &nbsp; 347.8ms +/- 0.9% &nbsp; &nbsp;265.4ms +/- 1.5% &nbsp; &nbsp; significant</div></div>
<p><strong>BENCHMARK 4 : Dromaeo</strong></p>
<p>Per finire ecco il risultato del benchmark javascript più completo che conosco: Dromaeo. Sempre di casa Mozilla ma è chiaro, verificabile e il codice del benchmark è disponibile a chiunque voglia controllarlo.</p>
<p><a href="http://dromaeo.com/?id=146341">Risultati Firefox</a> = 132.72runs/s</p>
<p><a href="http://dromaeo.com/?id=146339">Risultati Chrome</a> = 238.36runs/s</p>
<p>Potete controllare i dettagli cliccando sui link.</p>
<p>Chrome è più performante del 79.6% rispetto a Firefox.</p>
<p><strong>CONCLUSIONE</strong></p>
<p>Questa sfida è terminata 3-1 per il browser di Google e quel punto di Firefox è strappato per un soffio. Insomma, Chrome si classifica, come da pronostico, estremamente più veloce di Firefox nell&#8217;esecuzione del JavaScript. Tenendo però conto della velocità con cui questi Browser si <em>riproducono</em> non ci resta che aspettare qualche mese per vedere come evolverà questa appassionante sfida.</p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=784&amp;md5=e8159604c010ab392bb742e024b5e5ee" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2011/08/javascript-war-firefox-5-chrome-13/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2011%2F08%2Fjavascript-war-firefox-5-chrome-13%2F&amp;language=it_IT&amp;category=text&amp;title=JavaScript+War+%3A+Firefox+5+%26%238211%3B+Chrome+13&amp;description=In+questa+nuova+rivoluzione+Web+chiamata+per+brevit%C3%A0+HTML5%2C+uno+dei+protagonisti+%C3%A8+senza+alcun+dubbio+il+riesumato+JavaScript.+Tornato+dalla+tomba+in+cui+sembrava+essere+stato+sepolto+per+riportare...&amp;tags=benchmark%2Cchrome%2Cfirefox%2Cjavascript%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Python Profiling</title>
		<link>http://davideaversa.it/slashcode/2011/08/python-profiling/</link>
		<comments>http://davideaversa.it/slashcode/2011/08/python-profiling/#comments</comments>
		<pubDate>Wed, 03 Aug 2011 15:09:27 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[graph]]></category>
		<category><![CDATA[profiling]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://davideaversa.it/slashcode/?p=780</guid>
		<description><![CDATA[<div><a href="http://davideaversa.it/slashcode/2011/08/python-profiling/"><img title="Python Profiling" src="http://davideaversa.it/slashcode/wp-content/uploads/2011/08/time-150x150.jpg" alt="Python Profiling"  width="" /></a></div><br/>Dato che non c'è un unico strumento adatto ho deciso di spiegare passo passo come ottenere dei dati di profiling veloci, puliti e graficamente guardabili.]]></description>
			<content:encoded><![CDATA[<p><a href="http://davideaversa.it/slashcode/wp-content/uploads/2011/08/time.jpg"><img src="http://davideaversa.it/slashcode/wp-content/uploads/2011/08/time-150x150.jpg" alt="" title="Time" width="150" height="150" class="alignleft size-thumbnail wp-image-781" /></a></p>
<p>Durante lo sviluppo di Cobra Draugths ho avuto la necessità di trovare un profiler per Python che facesse al caso mio. Dato che non c&#8217;è un unico strumento adatto ho deciso di spiegare passo passo come ottenere dei dati di profiling veloci, puliti e graficamente guardabili.</p>
<p>È una guida espressa: niente discussioni, niente commenti, solo fatti e procedure.</p>
<p><span id="more-780"></span></p>
<p><strong>1. cProfile</strong></p>
<p>Primo passo. Installare i tool di profiling per python.</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get install</span> python-profiler</div></div>
<p>Supponiamo che il vostro programma/libreria abbia un file che invoca i metodi che volete profilare. Possiamo lanciare il comando</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">python <span style="color: #660033;">-m</span> cProfile <span style="color: #660033;">-o</span> output.prof test.py</div></div>
<p>Questo avvierà il file test.py e, una volta terminato, creerà un file output.prof contenente tutte le informazioni di profiling.</p>
<p><strong>2. Esplorare il file</strong></p>
<p>Il modo più semplice per esplorare il file creato è usare il modulo <strong>pstats</strong>.</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">python <span style="color: #660033;">-m</span> pstats</div></div>
<p>Ci troveremo davanti una shell. Primo comando da dare è</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">read</span> output.prof</div></div>
<p>Che carica il file. Dopo di che possiamo ordinarlo per ordine di tempo (prima le funzioni più costose)</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sort</span> <span style="color: #000000; font-weight: bold;">time</span></div></div>
<p>E poi leggere i primi 10 elementi</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">stats <span style="color: #000000;">10</span></div></div>
<p><strong>3. Grafo dei tempi</strong></p>
<p>Il modo più elegante, chiaro e stiloso per ottenere un report leggibile è trasformare tutto in un bel grafo colorato. Per fare questo usiamo il tool <a href="http://code.google.com/p/jrfonseca/wiki/Gprof2Dot">Gprof2dot</a>.</p>
<p>Scaricate lo script Python e <em>installatelo</em> con un</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">chmod</span> +x gprof2dot.py<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">cp</span> gprof2dot.py <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span></div></div>
<p>A questo punto createvi uno script bash con questo contenuto:</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#!/bin/bash</span><br />
gprof2dot.py <span style="color: #660033;">-f</span> pstats <span style="color: #007800;">$1</span> <span style="color: #000000; font-weight: bold;">|</span> dot <span style="color: #660033;">-Tpng</span> <span style="color: #660033;">-o</span> <span style="color: #007800;">$2</span></div></div>
<p>Chiamatelo, ad esempio, gprof2png. Installatelo alla stessa maniera.</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">chmod</span> +x gprof2png<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">cp</span> gprof2png <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span></div></div>
<p>A questo punto potete lanciarlo semplicemente con</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">gprof2png output.prof grafo.png</div></div>
<p>Questo creerà una gradevole immagine png con tutti i dati di vostro interesse. Come esempio posto l&#8217;immagine generata per Cobra Draughts in una partita AI vs. AI.</p>
<p><a href="http://davideaversa.it/slashcode/wp-content/uploads/2011/08/out.png"><img src="http://davideaversa.it/slashcode/wp-content/uploads/2011/08/out-184x300.png" alt="" title="cobra_graph" width="184" height="300" class="aligncenter size-medium wp-image-782" /></a></p>
<p>Buon profiling. </p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=780&amp;md5=b8ae6e889cb1ba329ccba273365619df" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2011/08/python-profiling/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2011%2F08%2Fpython-profiling%2F&amp;language=it_IT&amp;category=text&amp;title=Python+Profiling&amp;description=Durante+lo+sviluppo+di+Cobra+Draugths+ho+avuto+la+necessit%C3%A0+di+trovare+un+profiler+per+Python+che+facesse+al+caso+mio.+Dato+che+non+c%26%238217%3B%C3%A8+un+unico+strumento+adatto+ho...&amp;tags=bash%2Cgraph%2Cprofiling%2Cpython%2Cblog" type="text/html" />
	</item>
	</channel>
</rss>

