<?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>Gigabytes&#039; blog 2.0</title>
	<atom:link href="http://www.gigabytes.it/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gigabytes.it/blog</link>
	<description>Random bits from a deterministic programmer</description>
	<lastBuildDate>Thu, 26 Jan 2012 13:50:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Il problema della fermata</title>
		<link>http://www.gigabytes.it/blog/2012/01/il-problema-della-fermata/</link>
		<comments>http://www.gigabytes.it/blog/2012/01/il-problema-della-fermata/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 13:01:48 +0000</pubDate>
		<dc:creator>gigabytes</dc:creator>
				<category><![CDATA[Generale]]></category>

		<guid isPermaLink="false">http://www.gigabytes.it/blog/?p=460</guid>
		<description><![CDATA[No, questo post non parla ne di autobus ne di treni (anche se di problemi con questo tipo di fermate ce ne sono molti). Una sera della scorsa settimana mi sono ritrovato in mezzo ad una discussione &#8220;quasi&#8221; tecnica tra un paio di bravi ingegneri elettronici con tanta voglia di bere birra e chiacchierare. Uno <a href='http://www.gigabytes.it/blog/2012/01/il-problema-della-fermata/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>No, questo post non parla ne di autobus ne di treni (anche se di problemi con questo tipo di fermate ce ne sono molti).<br />
Una sera della scorsa settimana mi sono ritrovato in mezzo ad una discussione &#8220;quasi&#8221; tecnica tra un paio di bravi ingegneri elettronici con tanta voglia di bere birra e chiacchierare. Uno dei due ad un certo punto sfodera con ammirevole sicurezza una rassicurante verità:</p>
<blockquote><p>Qualsiasi cosa tu abbia bisogno di calcolare, un computer può farlo. Basta conoscere l&#8217;algoritmo giusto e avere abbastanza tempo.</p></blockquote>
<p>La leggerezza della conversazione e il mezzo litro di De Koninck ormai in dirittura di arrivo hanno persuaso il matematico che c&#8217;è in me dal contraddire questa affermazione a prima vista scontata.<br />
Non è così facile da intuire, ma esistono problemi che un computer non può risolvere. Risposte che non possono essere calcolate.</p>
<p><span id="more-460"></span></p>
<p>Questo fatto, dimostrato da personalità come Alan Turing e Alonso Church nei primi decenni del Novecento, assieme al teorema di incompletezza di Gödel (che è, a ben vedere, una riformulazione dello stesso concetto), ha causato un terremoto nella matematica che, dagli anni &#8217;30 in poi, non è stata più la stessa&#8230; Quello che più mi stupisce personalmente del risultato di Turing è la relativa facilità ed &#8220;eleganza&#8221; con cui sia possibile spiegarlo e comprenderlo, tanto che proverò a riassumerlo nelle poche righe di un articolo del mio blog.</p>
<p>Cominciamo mettendo in chiaro di cosa stiamo parlando. Cosa intendiamo per &#8220;risolvere un problema?&#8221;. Per noi ogni problema di calcolo è rappresentato da una funzione <img src="http://l.wordpress.com/latex.php?latex=f%3A%5Cmathbb%7BN%7D%5Crightarrow%5Cmathbb%7BN%7D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0" title="f:\mathbb{N}\rightarrow\mathbb{N}" style="vertical-align:-20%;" class="tex" alt="f:\mathbb{N}\rightarrow\mathbb{N}" /> che per ogni valore in input assume un preciso valore di output. Risolvere il problema significa calcolare il valore della funzione a partire da un preciso input. Per fare ciò è necessario eseguire un algoritmo, ovvero una serie finita di istruzioni non ambigue che portano in un tempo finito al calcolo del risultato. La clausola &#8220;tempo finito&#8221; non è scontata. In effetti alcuni algoritmi, su alcuni input, possono non terminare mai, per esempio entrando in un ciclo infinito. In questo caso si dice che l&#8217;algoritmo <b>diverge</b>.</p>
<p>La prima cosa di cui dobbiamo renderci conto è che l&#8217;insieme di tutti gli infiniti possibili algoritmi è numerabile, ovvero ogni algoritmo è associabile biunivocamente ad un numero naturale. Dimostrare formalmente questo fatto è lungo e tedioso, ma possiamo rendercene conto pensando a come rappresentiamo nei calcolatori un algoritmo scritto in un qualche linguaggio di programmazione. Un file di testo contenente il codice sorgente dell&#8217;algoritmo cos&#8217;è se non un grosso numero naturale codificato in forma binaria?</p>
<p>Una volta capito ciò, un primo indizio del fatto che esistano problemi irrisolvibili, ovvero per i quali non esiste un algoritmo adatto, ci viene dalla teoria degli insiemi. Sappiamo infatti che l&#8217;insieme delle funzioni <img src="http://l.wordpress.com/latex.php?latex=f%3A%5Cmathbb%7BN%7D%5Crightarrow%5Cmathbb%7BN%7D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0" title="f:\mathbb{N}\rightarrow\mathbb{N}" style="vertical-align:-20%;" class="tex" alt="f:\mathbb{N}\rightarrow\mathbb{N}" /> ha la cardinalità del continuo e quindi non è numerabile. In altre parole, non c&#8217;è una corrispondenza biunivoca tra problemi e algoritmi: i problemi possibili sono molti di più.<br />
Questo però, non è un risultato facile da ottenere senza scrivere pagine e pagine su teoria degli insiemi e numeri cardinali, mentre io vi avevo promesso un ragionamento semplice e facilmente spiegabile. Inoltre, ragionare in questo modo non ci aiuta affatto a capire quali sono effettivamente i problemi che possiamo risolvere e quali no.</p>
<p>Per capire meglio la questione ci concentriamo ora su un problema specifico, il cosiddetto <b>problema della fermata</b> o Halting problem per gli amici anglosassoni. Si può formulare così: dato un algoritmo P e un input I, l&#8217;algoritmo termina con una risposta? Più precisamente vogliamo calcolare la seguente funzione:</p>
<p><center><img src="http://l.wordpress.com/latex.php?latex=H%28P%2C%20I%29%20%3D%20%5Cbegin%7Bcases%7D%5Ctext%7BSI%7D%20%26%20%5Ctext%7Bse%7D%5C%2CP%28I%29%5C%2C%5Ctext%7Btermina%7D%20%5C%5C%5Ctext%7BNO%7D%20%26%20%5Ctext%7Bse%7D%5C%2CP%28I%29%5C%2C%5Ctext%7Bdiverge%7D%5Cend%7Bcases%7D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0" title="H(P, I) = \begin{cases}\text{SI} &#038; \text{se}\,P(I)\,\text{termina} \\\text{NO} &#038; \text{se}\,P(I)\,\text{diverge}\end{cases}" style="vertical-align:-20%;" class="tex" alt="H(P, I) = \begin{cases}\text{SI} &#038; \text{se}\,P(I)\,\text{termina} \\\text{NO} &#038; \text{se}\,P(I)\,\text{diverge}\end{cases}" /></center></p>
<p><b>Nota per i pignoli</b><br />
Detta così non sembra una funzione <img src="http://l.wordpress.com/latex.php?latex=%5Cmathbb%7BN%7D%5Crightarrow%5Cmathbb%7BN%7D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0" title="\mathbb{N}\rightarrow\mathbb{N}" style="vertical-align:-20%;" class="tex" alt="\mathbb{N}\rightarrow\mathbb{N}" />. In realtà lo è, perché l&#8217;algoritmo P è, come abbiamo visto, codificabile da un numero naturale, e la coppia (P,I) è a sua volta codificabile da un numero naturale con la classica formula di Cantor <img src="http://l.wordpress.com/latex.php?latex=N%20%3D%202%5EP%282I%20-%201%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0" title="N = 2^P(2I - 1)" style="vertical-align:-20%;" class="tex" alt="N = 2^P(2I - 1)" />, che fornisce una biezione tra numeri naturali e coppie di numeri naturali. Le risposte SI e NO ovviamente possono essere codificate con 1 e 0, 42 e 69, o qualsiasi cosa&#8230;<br />
<b>Fine della nota per i pignoli</b></p>
<p>Detto ciò, vediamo dove vogliamo arrivare. Vogliamo dimostrare che non esiste un algoritmo capace di calcolare la funzione H. Per farlo dovremmo fare un giro su noi stessi ottenendo una contraddizione. Se esistesse un tale algoritmo, allora potremmo scrivere un algoritmo <img src="http://l.wordpress.com/latex.php?latex=G&#038;bg=FFFFFF&#038;fg=000000&#038;s=0" title="G" style="vertical-align:-20%;" class="tex" alt="G" /> con queste caratteristiche:</p>
<p><center><img src="http://l.wordpress.com/latex.php?latex=G%28P%29%20%3D%20%5Cbegin%7Bcases%7D%5Ctext%7BNO%7D%20%26%20%5Ctext%7Bse%7D%5C%2CH%28P%2C%20P%29%3DNO%20%5C%5C%5Ctext%7Bdiverge%7D%20%26%20%5Ctext%7Bse%7D%5C%2CH%28P%2C%20P%29%3DSI%5Cend%7Bcases%7D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0" title="G(P) = \begin{cases}\text{NO} &#038; \text{se}\,H(P, P)=NO \\\text{diverge} &#038; \text{se}\,H(P, P)=SI\end{cases}" style="vertical-align:-20%;" class="tex" alt="G(P) = \begin{cases}\text{NO} &#038; \text{se}\,H(P, P)=NO \\\text{diverge} &#038; \text{se}\,H(P, P)=SI\end{cases}" /></center></p>
<p>La funzione G, banale da implementare una volta ottenuto un algoritmo per H, restituisce NO se H riferisce che P(P) diverge, mentre diverge, ovvero entra in un ciclo infinito, in caso contrario. Quando scrivo P(P) intendo l&#8217;esecuzione dell&#8217;algoritmo P usando come input la codifica di se stesso. </p>
<p>Come si comportano le nostre due funzioni H e G messe assieme? Vediamo ad esempio cosa succede se valutiamo H(G,G). Che risposta possiamo ottenere? Entrambe sarebbero paradossali! </p>
<p>Infatti se ottenessimo SI, vorrebbe dire che G(G) termina, ma G(G) termina solo se H(G, G) risponde NO! Viceversa, se H(G, G) rispondesse NO vorrebbe dire che G(G) diverge. Ma G(G) diverge solo se H(G, G) risponde SI! </p>
<p>Ecco scovata la contraddizione. Guardando bene tutto il ragionamento ci accorgiamo che l&#8217;unica supposizione che abbiamo fatto è l&#8217;esistenza di un algoritmo per calcolare H, e abbiamo quindi dimostrato per assurdo che è impossibile.</p>
<p>Un problema non risolvibile come questo è detto <b>indecidibile</b>, e come questo ce ne sono infiniti altri. Il problema della fermata è stato il primo ad essere dimostrato tale da Turing, e riveste quindi una certa importanza storica, ma non solo. La dimostrazione di indecidibilità di moltissimi altri problemi si basa sulla riduzione di tali problemi all&#8217;halting problem. Se si dimostra che la soluzione di un problema risolverebbe anche l&#8217;halting problem, se ne deduce automaticamente che una tale soluzione non esiste.</p>
<p>In un certo senso è un bene che non abbia speso la serata in birreria a convincere i miei amici ingegneri di ciò che ho scritto in questo post. Una pagina web è senz&#8217;altro un posto migliore per questo genere di discorsi!</p>
<p>Per concludere in bellezza non posso non linkare <a href="http://www.lel.ed.ac.uk/~gpullum/loopsnoop.html">questa geniale pagina</a>, dove l&#8217;indecidibilità dell&#8217;halting problem è dimostrata&#8230; in quartine in rima!<br />
Buona lettura <img src='http://www.gigabytes.it/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.gigabytes.it/blog/2012/01/il-problema-della-fermata/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Rilasciato FreeBSD 9, con clang integrato</title>
		<link>http://www.gigabytes.it/blog/2012/01/rilasciato-freebsd-9-con-clang-integrato/</link>
		<comments>http://www.gigabytes.it/blog/2012/01/rilasciato-freebsd-9-con-clang-integrato/#comments</comments>
		<pubDate>Fri, 13 Jan 2012 11:26:19 +0000</pubDate>
		<dc:creator>gigabytes</dc:creator>
				<category><![CDATA[Generale]]></category>

		<guid isPermaLink="false">http://www.gigabytes.it/blog/?p=452</guid>
		<description><![CDATA[Spezzo il semestrale silenzio di questo blog per riportare una notizia che mi sta particolarmente a cuore. Proprio ieri il team di FreeBSD ha rilasciato la versione 9.0 del loro sistema operativo UNIX. La lista delle novità è lunga, ma il motivo per cui la notizia mi è balzata subito agli occhi è che FreeBSD <a href='http://www.gigabytes.it/blog/2012/01/rilasciato-freebsd-9-con-clang-integrato/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Spezzo il semestrale silenzio di questo blog per riportare una notizia che mi sta particolarmente a cuore. Proprio ieri il team di FreeBSD ha rilasciato la versione 9.0 del loro sistema operativo UNIX.<br />
La lista delle novità è lunga, ma il motivo per cui la notizia mi è balzata subito agli occhi è che FreeBSD 9 integra LLVM e Clang nel sistema base, che può essere totalmente compilato usando il nuovo compilatore (kernel compreso), anche se per ora solo su i386 e amd64.<br />
Questo rende FreeBSD il primo sistema operativo open source ad integrare clang nel proprio sistema base, oltre ad avvicinarsi al grande passo di eliminare completamente la propria dipendenza da codice GPL, obiettivo che è sempre stato nella roadmap a lungo termine degli sviluppatori dei sistemi BSD.<br />
Questioni di licenza a parte, un sistema FreeBSD compilato con clang gode di tutti i benefici portati da LLVM, ed è anche possibile abilitare la link-time optimization durante la compilazione del sistema e dei ports.<br />
Per informazioni più tecniche c&#8217;è questa pagina <a href="http://wiki.freebsd.org/BuildingFreeBSDWithClang" title="wiki">wiki</a>, che dovrebbe essere abbastanza aggiornata.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gigabytes.it/blog/2012/01/rilasciato-freebsd-9-con-clang-integrato/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Un WWDC 2011 succulento per gli sviluppatori</title>
		<link>http://www.gigabytes.it/blog/2011/07/un-wwdc-2011-succulento-per-gli-sviluppatori/</link>
		<comments>http://www.gigabytes.it/blog/2011/07/un-wwdc-2011-succulento-per-gli-sviluppatori/#comments</comments>
		<pubDate>Fri, 01 Jul 2011 19:47:34 +0000</pubDate>
		<dc:creator>gigabytes</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Lion]]></category>
		<category><![CDATA[LLVM]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://www.gigabytes.it/blog/?p=398</guid>
		<description><![CDATA[L&#8217;Apple World Wide Developer Conference 2011 è finito da un po&#8217;, e Apple ha pubblicato sul suo portale developers i video delle sessioni tecniche tenute dai suoi ingegneri durante la manifestazione. Chiunque può accederci dopo una registrazione gratuita, dall&#8217;indirizzo http://developer.apple.com/videos/wwdc/2011/. Si tratta di interventi tecnici molto specifici, tenuti da membri di rilievo dei team di <a href='http://www.gigabytes.it/blog/2011/07/un-wwdc-2011-succulento-per-gli-sviluppatori/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>L&#8217;Apple World Wide Developer Conference 2011 è finito da un po&#8217;, e Apple ha pubblicato sul suo portale developers i video delle sessioni tecniche tenute dai suoi ingegneri durante la manifestazione. Chiunque può accederci dopo una registrazione gratuita, dall&#8217;indirizzo <a href="http://developer.apple.com/videos/wwdc/2011/">http://developer.apple.com/videos/wwdc/2011/</a>.<br />
Si tratta di interventi tecnici molto specifici, tenuti da membri di rilievo dei team di sviluppo di Apple. Oltre ad essere interessanti per il loro contenuto, la loro pubblicazione svela le novità introdotte in Lion e iOS 5, dal punto di vista dello sviluppo di software, anche a chi non essendo iscritto al Developer Program non ha a disposizione le beta release e la relativa documentazione.</p>
<p>Dopo essermi divorato la maggior parte dei video disponibili, quindi, mi divertirò scrivendo la mia opinione sulle novità che ritengo più importanti.</p>
<p><span id="more-398"></span></p>
<h4>LLVM vs The Rest Of The World</h4>
<p>Apple investe fortemente nel progetto LLVM ormai da quattro anni, e i risultati si vedono. Xcode 4.2, che verrà rilasciato assieme ad iOS 5 questo autunno, includerà quello che Apple chiama &#8220;LLVM 3.0&#8243;, che aggiunge tra le altre cose un nuovo register allocator, e supporto per il type-based alias analysis. Apple ha incluso Clang come compilatore alternativo per i linguaggi C/C++ e Objective-C già da tempo, ma la novità è che per la prima volta GCC viene ufficialmente dichiarato deprecato sia su OS X che su iOS, e che Apple incoraggia gli sviluppatori a migrare al nuovo compilatore. Non mi stupirei se tra due anni, OS X 10.8 non includesse più alcuna versione di gcc.<br />
Tra le novità di rilievo che verranno ufficialmente introdotte con Xcode 4.2, quella che mi sta più a cuore è il supporto al C++0x. Il supporto al nuovo standard non è ancora completo, ma le novità già implementate sono tra le più importanti, come gli r-value references e i vararg templates. Xcode 4.2 includerà anche libc++, la nuova implementazione della libreria standard del C++, del progetto LLVM. Oltre a supportare al 99% tutte le caratteristiche della libreria standard di C++98 e C++0x (manca solo &lt;atomic&gt;), i benefici in termini di performance di libc++ rispetto all&#8217;implementazione GNU sono sbalorditivi. </p>
<h4>Objective-C Automatic Reference Counting</h4>
<p>Questa novità è senza dubbio la più interessante, anche dal punto di vista tecnico. Objective-C ha sempre supportato un modello abbastanza particolare di gestione della memoria. La gestione è manuale, a carico del programmatore, ma al contrario del C++, ogni oggetto ha un <i>reference count</i>, ovvero un contatore che tiene traccia di quanti riferimenti attivi stanno puntando all&#8217;oggetto. Quando il conteggio va a zero, il runtime dealloca l&#8217;oggetto. Assicurarsi che questo conteggio resti coerente è compito del programmatore, ma le convenzioni adottate dalle librerie di sistema rendono questo compito relativamente semplice, e abbastanza meccanico. Ciononostante, la gestione automatica della memoria è la moda del ventunesimo secolo, per cui con OS X 10.5 Apple ha introdotto in Objective-C 2.0 il supporto al garbage collection. Il garbage collector implementato da Apple funziona molto bene ma porta con se due principali problemi:</p>
<ol>
<li>Codice compilato con il garbage collector non è binary-compatible con codice compilato senza</li>
<li>Tutti gli svantaggi di un garbage collector: pause dovute all&#8217;esecuzione del collector, uso della memoria non deterministico, ecc&#8230;</li>
</ol>
<p>Per quest&#8217;ultimo motivo, legato a performance ed uso della memoria, Apple non ha mai reso disponibile su iOS il garbage collector dell&#8217;Objective-C. Anche su OS X, l&#8217;uso del GC non è mai diventato molto popolare&#8230;</p>
<p>L&#8217;Automatic Reference Counting risolve il problema della gestione della memoria in modo totalmente diverso. Con ARC, il modello di gestione della memoria del linguaggio resta <i>reference-counted</i>, ma ora è il compilatore ad assicurarsi che il reference count venga mantenuto coerente, al posto del programmatore, seguendo automaticamente le convenzioni di ownership che prima venivano adottate manualmente dagli sviluppatori. Il risultato è una gestione totalmente automatica della memoria, senza gli inconvenienti di inefficienza e non determinismo di un garbage collector.</p>
<p>Una caratteristica interessante di ARC sono i cosiddetti <i>zeroing weak pointers</i>. Un weak pointer è un puntatore che non trattiene l&#8217;ownership dell&#8217;oggetto, ovvero non viene considerato nel conteggio dei riferimenti attivi. Un oggetto può quindi essere deallocato anche se ci sono dei weak pointers che lo puntano. I weak pointers sono assolutamente necessari in un sistema reference-counted, per evitare i cosiddetti <i>ref-cycles</i>, ovvero situazioni in cui due o più oggetti si puntano a vicenda in circolo, impedendo quindi ai singoli reference count di andare a zero. Un garbage collector si accorge di questa situazione eseguendo qualche algoritmo di rilevamento dei cicli, che è il task che porta via la maggior parte del tempo in tutti i normali garbage collector. In un sistema puramente refcounted, invece, questa situazione va gestita spezzando intenzionalmente il ciclo, tramite un weak pointer. Prima di ARC, spezzare il ciclo faceva parte dell&#8217;attività di gestione della memoria manuale affidata al programmatore, che doveva però anche preoccuparsi di non lasciare dangling pointers verso oggetti ormai defunti. Una proprietà importante dei weak pointer implementati da ARC è che diventano automaticamente nulli quando l&#8217;oggetto a cui puntano viene deallocato. Ciò evita in partenza numerosi tipi di bug.</p>
<p>I dettagli del funzionamento di ARC sono molto interessanti dal punto di vista dell&#8217;implementazione. Una documentazione particolarmente dettagliata del funzionamento e dei criteri di design è disponibile sul sito del progetto LLVM, a questo indirizzo: <a href="http://clang.llvm.org/docs/AutomaticReferenceCounting.html">http://clang.llvm.org/docs/AutomaticReferenceCounting.html</a><br />
Non è un caso che questa documentazione si trovi sul sito di LLVM. Apple ha infatti implementato questa nuova caratteristica del linguaggio solo su Clang, senza toccare gcc. E visto che gli ingegneri Apple hanno più volte raccomandato di migrare prima possibile dal modello di gestione manuale ad ARC, questo fatto segna ulteriormente il deprecamento di gcc su OS X e iOS, in favore di Clang.</p>
<h4>App Sandboxing</h4>
<p>L&#8217;application sandboxing è l&#8217;evoluzione e l&#8217;estensione a livello dell&#8217;intero sistema operativo di un meccanismo che si vede da un po&#8217; di tempo su tutti i principali browser web. In Chrome, ad esempio, ogni tab viene gestita da un processo diverso. Lo scopo è quello di isolare eventuali bug a singole parti dell&#8217;applicazione. Su Lion, questo concetto è supportato direttamente dal sistema operativo che offre delle semplici API per la sua implementazione, e ci aggiunge vari meccanismi di sicurezza.</p>
<p>L&#8217;implementazione dell&#8217;App Sandboxing si snoda in due punti. La separazione dell&#8217;applicazione in parti separate che verranno eseguite in processi diversi, e la restrizione dei privilegi di ogni singola parte.<br />
Le API fornite dal sistema per modularizzare l&#8217;applicazione sembrano a prima vista molto semplici. Si definiscono in Xcode i vari componenti, che verranno compilati in eseguibili diversi. Solitamente, in questo tipo di sistemi il problema maggiore è la comunicazione tra i processi. Le nuove API si concentrano sulla richiesta di dati o servizi dai vari componenti, non sull&#8217;esecuzione e la comunicazione con dei processi. A seconda del servizio richiesto dall&#8217;applicazione principale (ad esempio &#8220;parsing di un file PDF&#8221;), il sistema si preoccupa di eseguire il componente giusto, e mettere le due parti in comunicazione, tramite un&#8217;API di scambio di oggetti ad alto livello, chiamato XPC. Assieme a questo meccanismo di scambio messaggi è stata aggiunta anche un&#8217;API chiamata IOSurface, basata su memoria condivisa, per la condivisione tra le varie componenti di grosse quantità di dati, buffer audio/video, ecc..</p>
<p>La seconda fase consiste nel definire i privilegi dei singoli moduli dell&#8217;applicazione. L&#8217;intenzione è quella di negare tutte le operazioni di cui un modulo non ha bisogno, in modo da limitare al minimo i danni causati da una falla di sicurezza di un componente. Se per esempio l&#8217;apertura e la decodifica di un file sono implementate in un modulo, questo avrà solo il permesso di leggere il filesystem, ma non di accedere alla rete. Se il contenuto del file va trasmesso via rete in qualche modo, il modulo che si occupa della trasmissione avrà il permesso di collegarsi ad un server remoto, ma non di accedere ai file. L&#8217;accesso al filesystem, in particolare, è gestito a mio avviso molto bene. Si può scegliere ad esempio, che un modulo o l&#8217;intera applicazione non abbia il permesso di accedere al filesystem se non in una particolare directory riservata ai dati dell&#8217;applicazione (dentro a qualche sottodirectory della home, di solito). Ma se si tratta, ad esempio, di una applicazione che tratta documenti dell&#8217;utente, l&#8217;accesso al filesystem va consentito per permettergli di aprire i propri documenti. Per casi come questo, le librerie di sistema fanno semplicemente il loro lavoro. Le finestre di dialogo per scegliere che file aprire o salvare, ad esempio, restituiscono un ticket che permette all&#8217;applicazione di aprire il file scelto dall&#8217;utente, ma nient&#8217;altro. Oltre all&#8217;accesso al filesystem e alla rete, è possibile decidere anche disciplinare l&#8217;accesso a dispositivi esterni, volumi rimovibili, stampanti, scanner, ecc&#8230;</p>
<p>Questi vincoli vengono forzati dall&#8217;OS, e se un&#8217;applicazione non li rispetta viene terminata. I vincoli del sandboxing sono specificati nel Property List dell&#8217;applicazione, per cui per far si che il meccanismo funzioni è necessario che l&#8217;applicazione sia firmata digitalmente dall&#8217;autore. La firma garantisce che l&#8217;applicazione non sia stata modificata, e quindi che i vincoli specificati dall&#8217;autore non siano stati successivamente alleggeriti. Il meccanismo si integra anche bene con il Mac App Store, che di default fornisce sempre applicazioni firmate. Sull&#8217;App Store per Lion, il Sandboxing è obbligatorio per tutte le applicazioni pubblicate sullo store, che devono per lo meno specificare i vincoli dell&#8217;applicazione principale, anche senza separare alcun modulo. La conseguenza di ciò, è che se un utente scarica dall&#8217;App Store un&#8217;applicazione di cui è scritto che &#8220;non accede alla rete&#8221; o che &#8220;non accede al filesystem&#8221;, può essere sicuro che si tratta della verità.</p>
<p>Nonostante il possibile overhead introdotto dalla comunicazione, sembra essere un meccanismo molto efficiente. Ad esempio, sembra che QuickTime sia stato riscritto con questo meccanismo in modo che il componente che decodifica i dati sia diverso dal componente che li visualizza a schermo. L&#8217;uso del sandboxing sembra sia stato adottato pesantemente all&#8217;interno del sistema stesso. Anche Anteprima, ad esempio, separa i componenti per la lettura e la decodifica dei file che legge, il che significa che possiamo dimenticarci quelle falle alla Acrobat che sfruttano PDF malformati per fare danni al sistema.</p>
<h4>Tutto il resto</h4>
<p>Di altre novità interessanti ce ne sono parecchie. Sono presenti, ovviamente, tutte le API necessarie per integrare le applicazioni con le nuove funzionalità di Lion, come Versions, Resume, e Mission Control, e l&#8217;accesso ad iCloud. C&#8217;è un nuovo framework per la crittografia. iOS 5 include GLKit, che rende molto più semplice la gestione di OpenGL ES 2.0. Su Lion, le novità di Cocoa includono un nuovo meccanismo di autolayout dei widget, e meccanismi di resolution independence simili a quelli usati nel passaggio al retina display dell&#8217;iPhone 4.</p>
<p>Alla fine sembra che le novità per gli sviluppatori siano interessanti quanto (e forse di più) di quelle per gli utenti finali. Bisogna solo aspettare di vedere come tutto ciò si comporta su strada. La notizia di oggi è che Lion è stato distribuito in Golden Master agli sviluppatori registrati al Developer Program, quindi basterà aspettare solo ancora un po&#8217;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gigabytes.it/blog/2011/07/un-wwdc-2011-succulento-per-gli-sviluppatori/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Le novità di C++ 2011: Lambda functions</title>
		<link>http://www.gigabytes.it/blog/2011/03/le-novita-di-cpp-2011-lambda-functions/</link>
		<comments>http://www.gigabytes.it/blog/2011/03/le-novita-di-cpp-2011-lambda-functions/#comments</comments>
		<pubDate>Thu, 31 Mar 2011 19:12:32 +0000</pubDate>
		<dc:creator>gigabytes</dc:creator>
				<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.gigabytes.it/blog/?p=297</guid>
		<description><![CDATA[Dopo un mese e mezzo di silenzio, la notizia della definitiva approvazione del nuovo standard internazionale ISO C++ 2011 mi ha spronato a scrivere qualcos&#8217;altro in merito. Questa volta mi concentrerò su una funzionalità forse marginale ma senza dubbio molto utile. Le lambda functions. Chi ha programmato almeno una volta in stile funzionale sa cosa <a href='http://www.gigabytes.it/blog/2011/03/le-novita-di-cpp-2011-lambda-functions/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Dopo un mese e mezzo di silenzio, la notizia della <a href="http://developers.slashdot.org/story/11/03/26/1949225/ISO-C-Committee-Approves-C0x-Final-Draft">definitiva approvazione</a> del nuovo standard internazionale ISO C++ 2011 mi ha spronato a scrivere qualcos&#8217;altro in merito. Questa volta mi concentrerò su una funzionalità forse marginale ma senza dubbio molto utile. Le lambda functions.<br />
<span id="more-297"></span></p>
<p>Chi ha programmato almeno una volta in stile funzionale sa cosa sono le lambda expression: delle espressioni con le quali è possibile definire in loco il corpo di una funzione anonima. In C++ 2011 la sintassi per definire una lambda expression è la seguente:</p>
<pre>
[capture-list](arguments) -> return_type {body}
</pre>
<p>Ed ecco un esempio concreto, che usa <i>std::sort</i> per ordinare un vettore in base al modulo degli elementi.</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> f<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
   std<span style="color: #008080;">::</span><span style="color: #007788;">vector</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> v<span style="color: #008080;">;</span>
   <span style="color: #666666;">// fill the vector...</span>
   std<span style="color: #008080;">::</span><span style="color: #007788;">sort</span><span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a, <span style="color: #0000ff;">int</span> b<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
      <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">abs</span><span style="color: #008000;">&#40;</span>a<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">abs</span><span style="color: #008000;">&#40;</span>b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>La coppia di parentesi quadre viene chiamata <i>lambda introducer</i>, ed indica l&#8217;inizio di una lambda expression. Dopo il lambda introducer si specifica la lista degli argomenti accettati dalla lambda con la solita sintassi tra parentesi tonde. In questo esempio, la lambda che ho scritto non specifica il valore di ritorno, perchè nel caso in cui il corpo contenga una singola istruzione di return, il tipo può essere automaticamente dedotto dal compilatore (in questo caso <i>bool</i>).</p>
<p>Il corpo di una lambda può riferirsi a variabili presenti nello scope che la racchiude. In questo caso, all&#8217;interno delle parentesi quadre si può specificare una lista di variabili che verranno <i>catturate</i> dalla lambda. Si può decidere di catturare le variabili per valore o per riferimento. Nel primo caso il valore viene copiato e la lambda ottiene una propria copia della variabile. Nel secondo caso la lambda cattura un reference alla variabile, che può quindi anche essere modificata. Un esempio:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> f<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> threshold<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
   std<span style="color: #008080;">::</span><span style="color: #007788;">vector</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> v<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> comparisons <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
   <span style="color: #666666;">// fill the vector ...</span>
   std<span style="color: #008080;">::</span><span style="color: #007788;">sort</span><span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>,
             <span style="color: #008000;">&#91;</span><span style="color: #000080;">=</span>threshold, <span style="color: #000040;">&amp;</span>comparisons<span style="color: #008000;">&#93;</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a, <span style="color: #0000ff;">int</span> b<span style="color: #008000;">&#41;</span> <span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span> <span style="color: #0000ff;">bool</span> <span style="color: #008000;">&#123;</span>
                comparisons<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
                <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">abs</span><span style="color: #008000;">&#40;</span>a<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">abs</span><span style="color: #008000;">&#40;</span>b<span style="color: #008000;">&#41;</span> <span style="color: #000040;">-</span> threshold<span style="color: #008080;">;</span>
             <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Array ordinato con &quot;</span> <span style="color: #000080;">&lt;&lt;</span> comparisons <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; confronti<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Com&#8217;è facile intuire, il simbolo &#8216;=&#8217; indica la cattura per valore mentre &#8216;&#038;&#8217; quella per riferimento.<br />
Non è necessario specificare l&#8217;intera lista delle variabili catturate. Specificando solo un singolo &#8216;=&#8217; o un singolo &#8216;&#038;&#8217;, si decide la modalità di cattura di default, dopodichè il compilatore si arrangerà a catturare tutte le variabili necessarie.</p>
<p>Chi è abituato a programmare in linguaggi funzionali, dove le funzioni sono un entità di prima classe, si starà chiedendo &#8220;un&#8217;espressione lambda che tipo ha?&#8221;.<br />
Rispondere a questa domanda richiede un approfondimento su come sono implementate sotto il cofano. In pratica il discorso è molto semplice, e prevede teoricamente &#8216;solo&#8217; una riscrittura del codice. Il codice dell&#8217;ultimo esempio viene trattato dal compilatore come se fosse riscritto così:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">class</span> __fresh_class_name <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">int</span> threshold<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> <span style="color: #000040;">&amp;</span>comparisons<span style="color: #008080;">;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
   __fresh_class_name<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> t, <span style="color: #0000ff;">int</span> <span style="color: #000040;">&amp;</span>c<span style="color: #008000;">&#41;</span> <span style="color: #008080;">:</span> threshold<span style="color: #008000;">&#40;</span>t<span style="color: #008000;">&#41;</span>, comparisons<span style="color: #008000;">&#40;</span>c<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
   <span style="color: #0000ff;">bool</span> operator<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a, <span style="color: #0000ff;">int</span> b<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span> <span style="color: #008000;">&#123;</span>
      comparisons<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">abs</span><span style="color: #008000;">&#40;</span>a<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">abs</span><span style="color: #008000;">&#40;</span>b<span style="color: #008000;">&#41;</span> <span style="color: #000040;">-</span> threshold<span style="color: #008080;">;</span>
   <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">void</span> f<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> threshold<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
   std<span style="color: #008080;">::</span><span style="color: #007788;">vector</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> v<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> comparisons <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
   <span style="color: #666666;">// fill the vector ...</span>
   std<span style="color: #008080;">::</span><span style="color: #007788;">sort</span><span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, __fresh_class_name<span style="color: #008000;">&#40;</span>threshold, comparisons<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>In pratica quindi, una lambda expression crea un&#8217;istanza di un function object, il cui tipo viene implicitamente dichiarato dal compilatore. Le variabili catturate sono memorizzate in variabili membro del function object, mentre il corpo finisce nell&#8217;overload dell&#8217;<i>operator()</i>. Questo approccio ha un vantaggio principale: la totale assenza di qualunque overhead a runtime. Anzi, molto spesso le lambda più semplici possono essere compilate inline generando codice molto efficente.</p>
<p>Il tipo generato dal compilatore per la dichiarazione di una singola lambda expression non è esplicitamente menzionabile nel codice. Oltretutto, diversamente da quello che accade in altri linguaggi, il tipo delle lambda <i>non ha a che fare con il tipo dei parametri e con il tipo di ritorno</i>, ma è specifico e univoco per ogni singola lambda expression.<br />
In altre parole, due lambda con gli stessi parametri e lo stesso tipo di ritorno <i>non</i> hanno lo stesso tipo.<br />
Tuttavia, volendo assegnare una lambda ad una variabile è possibile far dedurre automaticamente il tipo al compilatore con la parola chiave &#8216;auto&#8217;, il cui comportamento è un&#8217;altra novità del nuovo standard. Esempio:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> f<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">auto</span> square <span style="color: #000080;">=</span> <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000ff;">return</span> a <span style="color: #000040;">*</span> a<span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>  
   std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> square<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Per passare una lambda come parametro di una funzione invece, come nel caso dell&#8217;<i>std::sort</i> usata prima, l&#8217;assenza di un tipo ben definito non è un problema. Il codice è esattamente lo stesso di una funzione che si aspetta un function object. Il prototipo di <i>std::sort</i> ad esempio, non è cambiato rispetto al C++03, ed è il seguente (paragrafo 25.4.1.1 del documento ISO):</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> RandomAccessIterator, <span style="color: #0000ff;">class</span> Compare<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">void</span> sort<span style="color: #008000;">&#40;</span>RandomAccessIterator first, RandomAccessIterator last, Compare comp<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>

<p>In altri casi è difficile gestire le cose con questo meccanismo. Alcune volte ad esempio potremmo non voler implementare una funzione template. In questi casi torna molto utile una novità introdotta nella libreria standard, ovvero la classe <i>std::function</i>, dichiarata dall&#8217;header <i>&lt;functional&gt;</i>, che si comporta come un &#8216;wrapper&#8217; per oggetti &#8216;invocabili&#8217; con un certo prototipo, siano essi puntatori a funzione, function objects o lambda expression:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> f<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
   std<span style="color: #008080;">::</span><span style="color: #007788;">function</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">&gt;</span> square <span style="color: #000080;">=</span> <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000ff;">return</span> a <span style="color: #000040;">*</span> a<span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
   std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> square<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span></pre></div></div>

<p>L&#8217;implementazione di <i>std::function</i> è di per se molto semplice e sfrutta i vararg templates per poter funzionare qualsiasi sia il numero di parametri specificato.</p>
<p>Si chiude qua la mia (quasi) breve panoramica su questa funzionalità, che a mio avviso è una delle più interessanti del nuovo standard. Per poter provare su strada queste non tutti i compilatori sono adatti. Per ora le lambda sono supportate da GCC 4.5 e da Visual C++ 10, mentre non sono ancora implementate in Clang (non ho notizie riguardo ad altri compilatori).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gigabytes.it/blog/2011/03/le-novita-di-cpp-2011-lambda-functions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Le novità di C++0x: r-value references</title>
		<link>http://www.gigabytes.it/blog/2011/02/le-novita-di-c0x-r-value-references/</link>
		<comments>http://www.gigabytes.it/blog/2011/02/le-novita-di-c0x-r-value-references/#comments</comments>
		<pubDate>Sun, 20 Feb 2011 20:20:44 +0000</pubDate>
		<dc:creator>gigabytes</dc:creator>
				<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.gigabytes.it/blog/?p=159</guid>
		<description><![CDATA[Chi mi conosce sa che ultimamente ho programmato molto in C++. Di conseguenza, non potevo non interessarmi alle novità che verranno introdotte nel linguaggio dalla nuova versione dello standard internazionale ANSI/ISO, che verrà ratificato a breve, ormai ribattezzato da tutti C++0x nonostante si parli di un rilascio nel 2011. Nonostante lo standard internazionale attuale risalga <a href='http://www.gigabytes.it/blog/2011/02/le-novita-di-c0x-r-value-references/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Chi mi conosce sa che ultimamente ho programmato molto in C++. Di conseguenza, non potevo non interessarmi alle novità che verranno introdotte nel linguaggio dalla nuova versione dello standard internazionale ANSI/ISO, che verrà ratificato a breve, ormai ribattezzato da tutti C++0x nonostante si parli di un rilascio nel 2011.</p>
<p>Nonostante lo standard internazionale attuale risalga al 1998 (con qualche correzione nel 2003), il linguaggio ha visto un notevole sviluppo negli ultimi anni, grazie principalmente all&#8217;evoluzione dei vari compilatori presenti sul mercato, che oltre ad essere ormai completi e per la maggior parte aderenti allo standard, sono anche più performanti di quanto non si potesse sognare qualche anno fa (vedi ad esempio <a href="http://clang.llvm.org" target="_blank">Clang</a>). Il nuovo standard poggia su queste fondamenta e cerca di &#8220;modernizzare&#8221; il linguaggio, aggiungendo alcune feature veramente interessanti che, pur essendo a prima vista delle modifiche minori, rendono il C++ un linguaggio in alcuni sensi molto diverso.</p>
<p>La buona notizia è che, a differenza dello standard del 1998, i vari produttori di compilatori sembrano intenzionati a fare le cose per bene fin da subito. Il compilatore g++ di GNU, che è praticamente lo standard <em>de facto</em> su tutte le piattaforme diverse da Microsoft Windows, implementa già buona parte delle nuove caratteristiche del linguaggio, mentre Visual C++ 10 di Microsoft ne ha introdotto alcune tra le più interessanti.</p>
<p>In questo post cercherò di illustrare la novità più importante dal punto di vista delle performance del C++, ovvero l&#8217;introduzione dei cosiddetti r-value references.<br />
<span id="more-159"></span></p>
<h3>Il problema</h3>
<p>Il comitato di standardizzazione, nello scegliere le funzionalità da aggiungere al linguaggio, ha pensato a come risolvere i principali problemi incontrati dagli utenti del linguaggio attuale. Gli r-value references risolvono un problema molto sentito nella classica programmazione C++: le copie ridondanti di oggetti.</p>
<p>Il C++ è l&#8217;unico linguaggio object-oriented attualmente utilizzato in cui gli oggetti hanno una <em>copy semantics</em>. Gli oggetti automatici (quelli allocati sullo stack per capirci), quando vengono passati come parametri o restituiti da una funzione vengono <em>copiati</em>. Il chiaro vantaggio è la coerenza del comportamento degli oggetti rispetto ai tipi base.</p>
<p>Tutti i programmatori C++ sanno come gestire questa caratteristica in modo da evitare prestazioni penose: si passano gli argomenti per riferimento, o si usano soluzioni più sofisticate come l&#8217;implicit-sharing con copy-on-write (vedi i container di <a href="qt.nokia.com" target="_blank">Qt</a>). Per quanto ci si possa impegnare, però, rimarrà sempre un overhead dovuto a copie superflue.</p>
<p>Vediamo ad esempio la classica implementazione di una funzione swap:</p>
<pre>template &lt;typename T&gt;
void swap(T &amp;a, T &amp;b)
{
   T tmp = a;
   a = b;
   b = tmp;
}</pre>
<p>Passare i parametri per riferimento in questo caso non evita la copia dell&#8217;oggetto <em>a</em> nell&#8217;oggetto temporaneo <em>tmp</em>. Allo stesso modo, dopo la seconda istruzione ci saranno due copie dell&#8217;oggetto b. Queste copie sono inutili perchè noi non volevamo copiare niente, ma spostare il contenuto di un&#8217;oggetto nell&#8217;altro e viceversa. Con gli r-value references e una piccola funzione ausiliaria della libreria standard, la funzione swap in C++0x può essere scritta come segue:</p>
<pre>template &lt;typename T&gt;
void swap(T &amp;a, T &amp;b)
{
   T tmp = std::move(a);
   a = std::move(b);
   b = std::move(tmp);
}</pre>
<p>La funzione std::move() abilita la <em>move semantics</em> del proprio argomento, consentendoci di spostare, invece che copiare, il contenuto di <em>a</em> in <em>tmp</em>, spostare <em>b</em> in <em>a</em>, e poi spostare nuovamente <em>tmp</em> in <em>b</em>, senza eseguire alcuna copia inutile.</p>
<p>Il trucco non sta nel corpo della funzione std::move(), che come vedremo è una funzione veramente semplicissima. Il trucco sta nell&#8217;introduzione di un nuovo tipo di reference, detto r-value reference, che nelle prossime sezioni cercherò di spiegare in modo relativamente comprensibile.</p>
<h3>r-values e l-values</h3>
<p>Prima di vedere in dettaglio il funzionamento di questa nuova caratteristica è bene fare un po&#8217; di chiarezza su un concetto chiave della grammatica del C++: r-values vs l-values. Ogni espressione, quando viene valutata produce un valore. Ogni valore, in C++ come in tutti gli altri linguaggi imperativi, può essere un l-value, o un r-value (o entrambi).</p>
<p>Un l-value (che sta per left-value) è un valore che può stare a sinistra dell&#8217;operatore di assegnamento. Un r-value (che sta per right-value) è un valore che può stare solo a destra. È chiaro che un l-value è anche un r-value. In pratica tutto ciò che ha una precisa posizione in memoria ed è identificabile con un nome è un l-value. Ad esempio, i valori delle seguenti espressioni sono l-value:</p>
<pre>n     // valore di una variabile
*p    // valore puntato da un puntatore
v[0]  // valore di un elemento di un'array
</pre>
<p>Mentre i seguenti sono r-value:</p>
<pre>4          // una costante
func()     // il valore di ritorno di un metodo (se non ritorna un reference)
func() + 4 // un'espressione qualunque (se non ricade tra gli l-value)
</pre>
<p>È facile capire come mai non possiamo assegnare un valore ad una costante o all&#8217;oggetto temporaneo restituito da una funzione. La differenza tra l-values e r-values però non si nota solo in presenza di assegnamenti.<br />
Prendiamo una funzione qualsiasi:</p>
<pre>void func(int a, int &amp;b, int const&amp; c)
{
// ...
}</pre>
<p>Cosa possiamo passare come parametri di questa funzione? Il primo parametro viene passato per valore e quindi copiato. Possiamo ovviamente passare di tutto ad un parametro passato per valore, sia r-value che l-value, senza problemi.</p>
<p>Il secondo parametro è invece passato per riferimento, e potrebbe quindi essere modificato dal corpo della funzione. Per questo motivo, ai parametri by reference è possibile passare solo degli l-value, e quindi non è possibile passare, ad esempio, un&#8217;espressione come 4 + 5 ad un parametro di questo tipo. In altre parole, i reference si associano (bind in inglese) solo ad l-values. È bene notare a questo punto che tra gli r-values ricadono anche tutti gli oggetti temporanei che risultano dalla valutazione delle espressioni. Vietare di modificare un oggetto temporaneo è un buon modo di evitare una serie spiacevole di subdoli bug.</p>
<p>Il terzo parametro è passato per riferimento costante. Cosa si può passare ad un parametro di questo tipo? Di nuovo, la risposta è &#8220;qualsiasi cosa&#8221;. In questo caso infatti, non c&#8217;è nessun pericolo a passare un r-value, perchè il parametro non verrà comunque modificato, e possiamo quindi passare un valore temporaneo senza problemi.</p>
<p>Abbiamo visto quindi che i classici reference si associano solo ad l-value, mentre i const-reference si associano sia ad l-value che r-value. Gli r-value reference, introdotti in C++0x, sono un tipo di reference non costante che può associarsi <strong>solo</strong> ad un r-value. Dove un classico reference si indicava con il simbolo &amp;, gli r-value reference si indicano con &amp;&amp;. In altre parole:</p>
<pre>int   a     = 0;
int&amp;  lref  = a;   // Ok. l-value reference associato ad un l-value.
int&amp;&amp; rref  = a;   // Errore! r-value reference associato ad un l-value.
int&amp;  lref2 = 5;   // Errore! l-value reference associato ad un r-value.
int&amp;&amp; rref2 = 5;   // Ok. r-value reference associato ad un r-value.
</pre>
<p>La domanda è: perchè vorremmo poter fare tutto ciò? Non abbiamo appena detto che modificare oggetti temporanei può essere pericoloso? In effetti, l&#8217;oggetto temporaneo creato nell&#8217;ultima riga viene distrutto subito, e quindi usando il reference rref2 si incorre sicuramente in un crash.<br />
In realtà, combinando l-value ed r-value reference, si può implementare la <em>move semantics</em> di cui parlavamo sopra, permettendo di evitare moltissime copie semanticamente inutili.</p>
<h3>Move semantics</h3>
<p>Il trucco sta in come vengono risolte le chiamate in presenza di overloading di metodi. Prendiamo le seguenti due funzioni:</p>
<pre>void func(int &amp;i) { ... }
void func(int &amp;&amp;i) { ... }</pre>
<p>Questo overloading è perfettamente valido e viene risolto con la seguente regola. Se alla funzione viene passato un l-value, viene chiamata la versione che prende il parametro con l-value reference. Se viene passato un r-value, la prima forma non può essere utilizzata e quindi si usa quella che prende il parametro con r-value reference, quindi:</p>
<pre>int a = 0;
func(a);   // chiama func(int &amp;)
func(5);   // chiama func(int &amp;&amp;)</pre>
<p>Detto ciò entriamo finalmente nel vivo del discorso. Consideriamo una classe string, dichiarata in linea di massima così:</p>
<pre>class string
{
   char *data;
public:
   string();
   string(char *data);

   string(string const&amp; s) // copy constructor
   {
      copy(data, s.data);
   }

   string(string &amp;&amp;s) // move constructor
   {
      data = s.data;
      s.data = 0;
   }

   string operator=(string const&amp; s); // copy assignment
   string operator=(string &amp;&amp; s); // move assignment
};</pre>
<p>Fino al costruttore di copie non c&#8217;è nulla di nuovo. La novità arriva nel costruttore che ho commentato come &#8220;move constructor&#8221;. Questo costruttore viene chiamato quando l&#8217;argomento è un r-value, e come si può vedere dal codice l&#8217;effetto è di spostare i dati dal parametro, lasciandolo essenzialmente vuoto, evitando il costo dell&#8217;operazione di copia. Questo si può fare senza problemi perchè sappiamo che l&#8217;argomento è un oggetto temporaneo e quindi nessuno andrà più ad utilizzarlo. Lo stesso discorso vale per gli operatori di &#8220;copy assignment&#8221;, che è il classico operatore di assegnamento, e di &#8220;move assignment&#8221;, che invece sposta i dati dal parametro senza il costo di una copia.</p>
<p>Ora abbiamo quindi la possibilità di capire il funzionamento e l&#8217;utilità della funzione std::move() che accennavo prima. La sua definizione è (a meno di dettagli) la seguente:</p>
<pre>template &lt;typename T&gt;
T&amp;&amp; move(T&amp;&amp; a)
{
    return a;
}</pre>
<p>In pratica std::move() non fa altro che prendere un parametro di qualsiasi tipo e ritornarlo come r-value, senza causare nessuna copia (al contrario di un ritorno per valore che avrebbe sempre prodotto un r-value ma causando una copia).<br />
Nella versione di swap() definita prima quindi, è ora chiaro cosa accade. Il valore di std::move(a) è un r-value che viene passato al move constructor del tipo T (se esiste). Lo stesso discorso vale per i due assegnamenti successivi che andranno ad usare l&#8217;operatore di move assignment. In questo modo si eliminano tutte le copie inutili. Se il tipo in questione non supporta alcuna move semantics viene chiamato comunque il copy constructor e tutto continua a funzionare come prima.</p>
<p>Questo tipo di vantaggi non si applicano ovviamente solo a swap, ma a tutti quei casi in cui la copia è inutile, come ad esempio questo pezzo di codice:</p>
<pre>std::string s1 = "ciao ", s2 = "come ", s3 = "va?";
std::string r = s1 + s2 + s3;</pre>
<p>In un&#8217;espressione del genere abbiamo molte copie inutili. Prima viene copiato s1 nell&#8217;oggetto temporaneo che sarà il risultato di s1 + s2, per poi appendere il contenuto di s2. Fatto ciò, questo oggetto temporaneo viene copiato nell&#8217;oggetto temporaneo che sarà il risultato generale, che poi verrà copiato di nuovo dentro ad r. Ogni copia ha un costo proporzionale alla lunghezza della stringa copiata, e richiede un&#8217;allocazione di memoria dinamica. Utilizzando opportunamente la move semantics è possibile implementare un operator+(std::string &amp;&amp;s), che sposta i dati dei vari risultati intermedi invece di copiarli, richiedendo a tutti gli effetti una sola copia.</p>
<p>Utilizzando la move semantics, le prestazioni della maggior parte dei container e degli algoritmi standard aumenta drasticamente. Ad esempio, quando l&#8217;algoritmo sort() deve scambiare gli elementi di un vettore per ordinarlo, usando std::swap() sposta gli elementi invece di copiarli.<br />
Stesso discorso per tutti quei casi in cui un container deve spostare elementi durante la riallocazione della memoria.</p>
<p>Gli r-value reference sono una feature rivolta principalmente agli autori di librerie e componenti riutilizzabili.<br />
La cosa da notare è che il drastico aumento di performance che deriva da questa nuova funzionalità non richiede modifiche del codice che utilizza le nuove librerie. Alla fine, molto codice che usa la libreria standard o altre librerie che verranno portate al C++0x, potrà godere di un incremento di performance anche solo venendo ricompilato.</p>
<h3>Perfect forwarding</h3>
<p>Un altro problema risolto dagli r-value references ha a che fare con la programmazione generica.<br />
Supponiamo per esempio di voler scrivere una funzione factory che alloca oggetti di un certo tipo e li ritorna all&#8217;interno di uno smart pointer come ad esempio shared_ptr (che da Boost ora è incluso anche nel nuovo standard).<br />
In C++ classico potremmo scriverla così:</p>
<pre>template &lt;typename T, typename U&gt;
std::shared_ptr&lt;T&gt;
factory(const U&amp; arg)
{
    return std::shared_ptr&lt;T&gt;(new T(arg));
}</pre>
<p>Questa funzione è molto semplice e non fa altro che restituire lo shared_ptr costruito con un oggetto di tipo T allocato per l&#8217;occasione. Idealmente vorremmo poter usare questa funzione in tutti i posti in cui useremmo l&#8217;espressione new T(&#8230;). In realtà però non è sempre possibile.<br />
Ad esempio, cosa succede se il costruttore di A prende un parametro passato per riferimento non costante? Otteniamo un errore di compilazione nel punto in cui la funzione factory cerca di passare un const-reference ad un reference non costante.<br />
Per risolvere il problema si potrebbe pensare di togliere il qualificatore const dal parametro di factory. In questo caso il codice funzionerebbe anche con parametri reference, ma sarebbe impossibile scrivere codice di questo tipo:</p>
<pre>shared_ptr&lt;A&gt; ptr = factory&lt;A&gt;(5);
</pre>
<p>In questo caso, infatti la costante 5 non potrebbe essere passata by reference alla funzione factory.</p>
<p>Da questo esempio si vede che attualmente è impossibile creare una funzione generica che ripassi i propri argomenti ad un&#8217;altra funzione preservando esattamente lo stesso tipo con cui li riceve. Questo problema è noto come &#8220;perfect forwarding&#8221;. Con gli r-value references si risolve in modo molto semplice:</p>
<pre>template &lt;typename T, typename U&gt;
std::shared_ptr&lt;T&gt;
factory(U&amp;&amp; arg)
{
   return std::shared_ptr&lt;T&gt;(new T(std::forward&lt;U&gt;(arg)));
}</pre>
<p>La funzione std::forward() usata qui ha praticamente la stessa definizione di std::move(), ma grazie al nome diverso esprime chiaramente il suo intento, ovvero restituire direttamente il proprio argomento preservandone esattamente il tipo, compresa la sua natura di l-value o r-value. Così facendo, anche la chiamata factory&lt;A&gt;(5) sarà legale e la funzione factory funzionerà come voluto.</p>
<h3>Conclusioni</h3>
<p>Gli r-value references sono una delle feature di C++0x più difficili da capire ed utilizzare correttamente. Sono rivolti agli autori di librerie e componenti riutilizzabili, ma avvantaggiano la totalità degli utenti in modo trasparente.<br />
Come per i vararg templates (template con lista di argomenti di lunghezza variabile), l&#8217;aggiunta di questa feature aumenta le performance e la generalità delle librerie C++ mantenendo leggibile e di alto livello il codice che le usa.<br />
Volendo provare a sperimentare, i compilatori che già supportano questa novità sono G++ dalla 4.3 in poi, Microsoft Visual C++ dalla versione 10, e il branch di sviluppo di Clang ormai da parecchi mesi.<br />
Ho cercato di spiegare l&#8217;argomento nel modo più comprensibile possibile. Qualsiasi commento a riguardo è benvenuto.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gigabytes.it/blog/2011/02/le-novita-di-c0x-r-value-references/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Marcus du Sautoy: L&#8217;enigma dei numeri primi</title>
		<link>http://www.gigabytes.it/blog/2011/02/enigma-dei-numeri-primi/</link>
		<comments>http://www.gigabytes.it/blog/2011/02/enigma-dei-numeri-primi/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 11:07:22 +0000</pubDate>
		<dc:creator>gigabytes</dc:creator>
				<category><![CDATA[Libri]]></category>

		<guid isPermaLink="false">http://www.gigabytes.it/blog/?p=146</guid>
		<description><![CDATA[Forse il motivo per cui i matematici sono così attaccati alle dimostrazioni formali, è che se lo possono permettere. Così Marcus du Sautoy, nel suo libro &#8220;L&#8217;enigma dei numeri primi&#8221;, cerca di motivare l&#8217;amore della matematica per l&#8217;inconfutabilità delle dimostrazioni logiche. È per questo motivo che la comunità scientifica non può ancora accettare come prova l&#8217;enorme <a href='http://www.gigabytes.it/blog/2011/02/enigma-dei-numeri-primi/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Forse il motivo per cui i matematici sono così attaccati alle dimostrazioni formali, è che se lo possono permettere. Così Marcus du Sautoy, nel suo libro &#8220;L&#8217;enigma dei numeri primi&#8221;, cerca di motivare l&#8217;amore della matematica per l&#8217;inconfutabilità delle dimostrazioni logiche.</p>
<p>È per questo motivo che la comunità scientifica non può ancora accettare come prova l&#8217;enorme quantità di evidenze sperimentali a favore dell&#8217;<a href="http://it.wikipedia.org/wiki/Ipotesi_di_Riemann" target="_blank">ipotesi di Riemann</a>, uno dei più importanti quesiti aperti della matematica moderna.</p>
<p>Di cosa parla questa ipotesi, e perchè è così importante? Partendo dall&#8217;antica grecia, Marcus du Sautoy lo spiega ai &#8220;profani&#8221; ripercorrendo la vita e le vicissitudini dei più importanti matematici che nei secoli si sono cimentati con i misteri nascosti nella sequenza dei numeri primi. Come sono legati tra loro? C&#8217;è qualche regolarità nella sequenza, o sono distribuiti a caso? Quanti primi si trovano in un certo intervallo? È possibile, dato un numero primo, trovare velocemente il successivo?</p>
<p>L&#8217;ipotesi di Riemann è l&#8217;ultima di questa serie di domande, rimasta irrisolta ormai per più di un secolo e mezzo dopo che Riemann l&#8217;ha accennata in un articolo del 1859 dove sosteneva di avere in cantiere una dimostrazione, andata poi persa a causa di una domestica troppo diligente.</p>
<p>Nonostante l&#8217;argomento possa spaventare, in realtà &#8220;L&#8217;enigma dei numeri primi&#8221; è un libro sorprendentemente leggero e scorrevole, in cui l&#8217;autore dimostra una grande capacità divulgativa spiegando il significato di concetti matematici molto complessi con metafore semplici e naturali.</p>
<p>Per concludere, non posso non consigliare la lettura de &#8220;L&#8217;enigma dei numeri primi&#8221; , a chiunque sia anche minimamente interessato all&#8217;argomento.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gigabytes.it/blog/2011/02/enigma-dei-numeri-primi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Accordo Nokia/Microsoft: qual è il futuro di Qt?</title>
		<link>http://www.gigabytes.it/blog/2011/02/accordo-nokia-microsoft-futuro-di-qt/</link>
		<comments>http://www.gigabytes.it/blog/2011/02/accordo-nokia-microsoft-futuro-di-qt/#comments</comments>
		<pubDate>Sat, 12 Feb 2011 19:04:06 +0000</pubDate>
		<dc:creator>gigabytes</dc:creator>
				<category><![CDATA[Generale]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Nokia]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[Symbian]]></category>
		<category><![CDATA[Windows Phone 7]]></category>

		<guid isPermaLink="false">http://www.gigabytes.it/blog/?p=130</guid>
		<description><![CDATA[È notizia di oggi il nuovo accordo tra Nokia e Microsoft per l&#8217;integrazione tra la linea di smartphone di Nokia e l&#8217;ecosistema software di Windows Phone 7. Lo slogan è &#8220;Welcome to the third ecosystem&#8221;. Il motivo di questa mossa è chiaro, ed è stato perfettamente espresso dal CEO di Nokia, Stephen Elop, nella sua lettera <a href='http://www.gigabytes.it/blog/2011/02/accordo-nokia-microsoft-futuro-di-qt/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>È notizia di oggi <a href="http://conversations.nokia.com/nokia-strategy-2011/" target="_blank">il nuovo accordo tra Nokia e Microsoft</a> per l&#8217;integrazione tra la linea di smartphone di Nokia e l&#8217;ecosistema software di Windows Phone 7. Lo slogan è &#8220;Welcome to the third ecosystem&#8221;. Il motivo di questa mossa è chiaro, ed è stato perfettamente espresso dal CEO di Nokia, Stephen Elop, nella sua <a href="http://www.engadget.com/2011/02/08/nokia-ceo-stephen-elop-rallies-troops-in-brutally-honest-burnin/" target="_blank">lettera ai dipendenti</a> fatta sapientemente trapelare qualche giorno fa.</p>
<p>In poche parole, dopo essere stata per quasi 10 anni leader incontrastata del mercato dei telefoni cellulari, negli ultimi due anni Nokia non si è trovata preparata al nascere improvviso di agguerriti concorrenti.</p>
<p>Da un lato c&#8217;è Apple, che in tre anni con il suo iPhone ha rivoluzionato il mercato e monopolizzato il segmento degli smartphone high-end, attirando centinaia di migliaia di sviluppatori e centinaia di milioni di utenti.</p>
<p>Dall&#8217;altra parte c&#8217;è il sistema operativo Android di Google, assieme a tutti i produttori che l&#8217;anno adottato per i propri prodotti. Android ha avuto uno sviluppo rapidissimo negli ultimi due anni, e ora cominciano ad apparire proposte veramente interessanti nel comparto high-end, ma soprattutto continua a dilagare l&#8217;offerta nel segmento medio basso del mercato, con telefoni Android sotto i 100$.</p>
<p>Tra questi due giganti, Nokia si è trovata improvvisamente in inferiorità sia tecnica che commerciale. Il successo degli ultimi prodotti, nonostante la critica positiva, non è stato esaltante, e Symbian continua a non convincere ne gli sviluppatori, ne gli utenti. Relegato in una nicchia c&#8217;è MeeGo, eterna promessa che forse, se dio vuole, vedrà la luce su un vero dispositivo commerciale durante il 2011, ma di cui non si è ben capito il futuro.</p>
<p>La decisione di affidarsi al sistema operativo di Microsoft sembra azzeccata. Nonostante Microsoft non stia simpatica a nessuno, devo ammettere che Windows Phone 7 è un sistema molto interessante, che presenta alcuni elementi originali, una grande facilità d&#8217;uso, e strumenti di sviluppo veramente ottimi. D&#8217;altra parte, Microsoft non è un produttore di telefoni, e deve farsi strada tra i produttori per affermare il proprio sistema, cosa non facilissima vista l&#8217;agguerrita concorrenza di Android. L&#8217;accordo annunciato oggi permetterà di unire l&#8217;ecosistema software di Microsoft con l&#8217;esperienza di Nokia riguardo alla produzione di telefoni.</p>
<p>Leggendo bene quanto annunciato si vede che l&#8217;accordo va anche oltre, mettendo in gioco anche l&#8217;integrazione tra Bing e i servizi di mappe di Nokia, Xbox Live e l&#8217;Ovi Store ecc&#8230; In pratica, Nokia e Microsoft vogliono fondere i propri ecosistemi per dare vita ad un polo che attiri non solo utenti, ma anche sviluppatori. Per ora sembra una mossa vincente.</p>
<p>C&#8217;è una nota dolente in tutto ciò, non per Nokia, ma per chi contava di sviluppare sui prodotti Nokia. Nel 2008 Nokia acquistò Trolltech con lo scopo di fare di <a href="http://qt.nokia.com" target="_blank">Qt</a> il centro della propria strategia mobile. Di conseguenza, l&#8217;integrazione tra Qt e Symbian è cresciuta e Qt è diventato praticamente la piattaforma di sviluppo principale sui prodotti Symbian, soprattutto di fascia alta. Sembra quindi chiaro che il futuro di Qt nel mobile è legato a doppio filo a quello di Symbian.</p>
<p>La press-release di Nokia pubblicata oggi recita &#8220;Microsoft development tools would be used to create applications to run on Nokia Windows Phones, allowing developers to easily leverage the ecosystem’s global reach&#8221;. Questa frase non lascia molte speranze sull&#8217;eventualità di un porting di Qt per WP7.</p>
<p>Il team della divisione Qt Software di Nokia si è subito affrettato a <a href="http://blog.qt.nokia.com/2011/02/12/nokia-new-strategic-direction-what-is-the-future-for-qt/" target="_blank">chiarire il futuro di Qt</a> dopo questo annuncio, assicurando che Qt non morirà e Nokia continuerà ad investirci attivamente. Ma quanto detto non mi convince, dal punto di vista di uno sviluppatore. A prescindere dalla qualità attuale del framework, sicuramente molto alta, la domanda veramente importante è: investire su Qt ora, è conveniente in un quadro a lungo termine?</p>
<p>Lo slogan di Qt è sempre stato &#8220;code once, run everywhere&#8221;. Quando si parla di sviluppo desktop questo slogan è sicuramente azzeccato, ma in campo mobile non si può dire altrettanto. Dall&#8217;annuncio di oggi, è chiaro che nel futuro prossimo le tre principali piattaforme del mercato saranno iOS, Android, e Windows Phone. Su iOS e Windows Phone l&#8217;uso di Qt è impossibile a prescindere. Su Android, è in corso un porting sperimentale, basato su Lighthouse, una tecnologia a sua volta sperimentale che non vedrà la luce prima di Qt 4.8, non prima di fine 2011. L&#8217;unica piattaforma mobile su cui Qt è realmente utilizzabile è Symbian, che sembra proprio destinata a morire. Come un lettore del blog di Qt Software ha sapientemente commentato, lo slogan rischia di diventare &#8220;code once, run nowhere&#8221;.</p>
<p>Che fine farà quindi Qt in ambito mobile? Personalmente vedo il suo futuro molto grigio, e se avessi investito tempo, denaro e know-how nello sviluppo di applicazioni mobile in Qt avrei veramente molto di cui lamentarmi&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gigabytes.it/blog/2011/02/accordo-nokia-microsoft-futuro-di-qt/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Nuovi appunti: Calcolo Scientifico</title>
		<link>http://www.gigabytes.it/blog/2011/02/nuovi-appunti-calcolo-scientifico/</link>
		<comments>http://www.gigabytes.it/blog/2011/02/nuovi-appunti-calcolo-scientifico/#comments</comments>
		<pubDate>Thu, 10 Feb 2011 10:35:26 +0000</pubDate>
		<dc:creator>gigabytes</dc:creator>
				<category><![CDATA[Generale]]></category>

		<guid isPermaLink="false">http://www.gigabytes.it/blog/?p=123</guid>
		<description><![CDATA[Come promesso, ecco la versione quasi definitiva dei miei nuovi appunti del corso di Calcolo Scientifico, di cui a breve dovrò sostenere l&#8217;esame. Trovate tutte le informazioni necessarie nella sezione apposita del sito. Spero vivamente che questo documento torni utile al maggior numero possibile di persone e invito chiunque a collaborare.]]></description>
			<content:encoded><![CDATA[<p>Come promesso, ecco la versione quasi definitiva dei miei nuovi appunti del corso di Calcolo Scientifico, di cui a breve dovrò sostenere l&#8217;esame.</p>
<p>Trovate tutte le informazioni necessarie nella <a href="/blog/calcolo-scientifico">sezione apposita</a> del sito. Spero vivamente che questo documento torni utile al maggior numero possibile di persone e invito chiunque a collaborare.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gigabytes.it/blog/2011/02/nuovi-appunti-calcolo-scientifico/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hello, World!</title>
		<link>http://www.gigabytes.it/blog/2011/01/hello-world/</link>
		<comments>http://www.gigabytes.it/blog/2011/01/hello-world/#comments</comments>
		<pubDate>Tue, 25 Jan 2011 20:29:36 +0000</pubDate>
		<dc:creator>gigabytes</dc:creator>
				<category><![CDATA[Generale]]></category>

		<guid isPermaLink="false">http://www.gigabytes.it/?p=1</guid>
		<description><![CDATA[Ciao mondo. Il titolo di default che WordPress assegna al primo post di esempio mi sembrava azzeccato per il primo post di questo blog. &#8220;Hello world&#8221; è ciò che di solito si fa scrivere ai semplicissimi programmi di esempio mostrati a chi sta imparando le basi di un nuovo linguaggio di programmazione, come se quel <a href='http://www.gigabytes.it/blog/2011/01/hello-world/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Ciao mondo. Il titolo di default che WordPress assegna al primo post di esempio mi sembrava azzeccato per il primo post di questo blog.</p>
<p>&#8220;Hello world&#8221; è ciò che di solito si fa scrivere ai semplicissimi programmi di esempio mostrati a chi sta imparando le basi di un nuovo linguaggio di programmazione, come se quel piccolo programma fosse contento di essere stato scritto ed eseguito almeno una volta. Quale titolo migliore quindi per il primo post del neo-nato blog di un programmatore che ama programmare?</p>
<p>Personalmente torno online per la seconda volta, dopo quasi un anno di silenzio a seguito della completa cancellazione del mio blog precedente, causata da una spaventosa negligenza di Tophost sulla quale non mi dilungherò.</p>
<p>L&#8217;intenzione è rimasta la stessa: mettere ordine a tutte le idee e le nozioni che nel tempo si accumulano nella testa di uno studente universitario di Informatica e fare in modo, con un po&#8217; di fortuna, che siano utili anche a qualcun altro.</p>
<p>Il primo vero post verrà alla luce probabilmente a Febbraio, dopo il mio esame di Calcolo Scientifico di cui sicuramente sentirete molto parlare in futuro su queste pagine. Nel frattempo, ho ripubblicato gli appunti del corso di Matematica Discreta di due anni fa. Per saperne di più andate su <a title="questa pagina" href="/blog/matematica-discreta">questa pagina</a>.</p>
<p>Colgo l&#8217;occasione per ringraziare il mio amico Carmelo San Giovanni della <a title="NetMDM" href="http://netmdm.com" target="_blank">NetMDM</a>, che mi offre i suoi professionali servizi di hosting, e vi rimando al prossimo post.</p>
<p>Hello, World!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gigabytes.it/blog/2011/01/hello-world/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

