<?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>Carmine Noviello &#187; C#</title>
	<atom:link href="http://www.carminenoviello.com/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.carminenoviello.com</link>
	<description>ilnovi&#039;s corner</description>
	<lastBuildDate>Mon, 06 Jun 2011 06:00:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>C# visto da un pythonista/1</title>
		<link>http://www.carminenoviello.com/2008/06/03/c-visto-da-un-pythonista1/</link>
		<comments>http://www.carminenoviello.com/2008/06/03/c-visto-da-un-pythonista1/#comments</comments>
		<pubDate>Tue, 03 Jun 2008 17:46:53 +0000</pubDate>
		<dc:creator>Carmine Noviello</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Mono]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.carminenoviello.name/archives/48</guid>
		<description><![CDATA[Era da un po&#8217; di tempo che mi solleticava l&#8217;idea di lanciarmi nello studio di un nuovo linguaggio di programmazione, visto che sono ormai 8 anni e pi&#249; che programmo esclusivamente in Python. E avendo abbandonato di sana pianta i linguaggi a tipizzazione statica, l&#8217;idea era proprio quella di ritornare a studiarne uno. Complice il [...]]]></description>
			<content:encoded><![CDATA[<p>Era da un po&#8217; di tempo che mi solleticava l&#8217;idea di lanciarmi nello studio di un nuovo linguaggio di programmazione, visto che sono ormai 8 anni e pi&ugrave; che programmo esclusivamente in Python. E avendo abbandonato di sana pianta i linguaggi a tipizzazione statica, l&#8217;idea era proprio quella di ritornare a studiarne uno.<br />
Complice il talk di <a href="http://www.pycon.it/pycon2/schedule/talk/questo-qui-non-e-un-pitone/">Federico di Gregorio al PyCon Due</a>, la mia attenzione &egrave; caduta su C#, il linguaggio di elezione per la piattaforma .NET di Microsoft. La scelta &egrave; stata effettuata per i seguenti motivi:</p>
<ol>
<li>Non &egrave; Java e in quanto tale <a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">non &egrave; molto diffuso</a></li>
<li>Non &egrave; un linguaggio di &#8216;basso livello&#8217; in cui ci si deve preoccupare di gestire l&#8217;allocazione di variabili, puntatori, ecc</li>
<li><span style="font-family: Verdana;">&Egrave;</span> sicuramente un linguaggio di ispirazione pi&ugrave; moderna</li>
<li>Non si &egrave; necessariamente vincolati alla Microsoft</li>
</ol>
<p>Quest&#8217;ultimo punto &egrave; quello che mi ha spinto ad avventurarmi nell&#8217;impresa: nonostante C# sia un linguaggio di casa Microsoft, &egrave; stato standardizzato (fino alla versione 2.0, ma &egrave; in corso di standardizzazione la 3.0) dalla ECMA, e grazie al progetto <a href="http://www.mono-project.com/">Mono</a> &egrave; possibile sviluppare e distribuire applicazioni C# (attenzione, ho detto C# e non .NET) su qualunque piattaforma (Linux, Win, Mac, UNIX). In realt&agrave; conoscevo gi&agrave; il progetto Mono, e in passato aveva provato a darci uno sguardo. Fino a 2 anni fa poteva considerarsi poco pi&ugrave; di un progetto sperimentale a vita (una sorta di <a href="http://www.winehq.org/">Wine</a>), ma di recente grazie al contributo di Novell si pu&ograve; considerare una piattaforma Open completa ed affidabile, che sta in tempi brevi supportando anche le versioni 3.0 e 3.5 di .NET.<br />
Quindi, secondo me, l&#8217;abbinata C# + Mono pu&ograve; essere considerata una valida alternativa per lo sviluppo di applicazioni multipiattaforma.</p>
<p><span id="more-48"></span></p>
<p>Ma veniamo al C#. Beh, devo dire che ritornare dopo anni a pensare &#8216;statico&#8217; &egrave; stato uno shock, molto ma molto pi&ugrave; forte del processo inverso, ossia abituarsi alla tipizzazione dinamica venendo da quella statica. La tipizzazione dinamica porta a pensare in termini di funzionalit&agrave; e di interfacce di oggetto (cosa ancor pi&ugrave; vera in Python che ha potenti funzionalit&agrave; di introspezione), a concentrarsi sulla struttura del programma e non sulla coerenza di tipi e variabili e a generare codice molto &#8216;prolisso&#8217; e dispersivo. Insomma, il <a href="http://en.wikipedia.org/wiki/Duck_typing">duck typing</a> spinge il programmatore a scrollarsi dalle frustrazioni tipiche che si hanno quando si programma con linguaggi pi&ugrave; tradizionali. E a dirla tutta, ho la sensazione che la tipizzazione statica sia la preistoria dell&#8217;informatica (e dell&#8217;ingegneria del software stessa), e che forse Microsoft poteva osare un po&#8217; di pi&ugrave; nel proporre un linguaggio nuovo. Ma ammetto che in genere questo tema divide non poco i programmatori.<br />
Mettendo per un attimo da parte la tipizzazione, cosa c&#8217;&egrave; in C# che pu&ograve; accumunarlo al Python, o magari renderlo ancora pi&ugrave; distante? Secondo <a href="http://www.pycon.it/pycon2/schedule/talk/questo-qui-non-e-un-pitone/">Federico</a>, addirittura a tratti C# &egrave; un Python con le parentesi graffe. Sar&agrave; cos&igrave;?<br />
Queste sono una serie di conclusioni a cui sono giunto dopo i primi 10 capitoli di <a href="http://www.oreilly.com/catalog/9780596527433/index.html">questo libro della O&#8217;Reilly</a>:</p>
<ol>
<li><em>quasi 100 keyword</em>: troppe. Punto.</li>
<li><em>le parentesi graffe se le potevano risparmiare</em>: non se ne pu&ograve; pi&ugrave;! Sono 35 anni che ci ritroviamo queste maledette {} d&#8217;avanti, e veramente &egrave; troppo. Innanzitutto, il codice sorgente diventa estremamente lungo e farraginoso, quando con il &#8216;:&#8217; di Python si riesce a rendere tutto molto pi&ugrave; compatto e pulito
<p class="code"><code>public void myFunc(int param) {<br />
    &nbsp;&nbsp;&nbsp;&nbsp; if (param &gt; 1) {<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(i);<br />
    &nbsp;&nbsp;&nbsp;&nbsp; }<br />
    }</code></p>
<p>    quando, invece, in Python basta scrivere:<tt><br />
    </tt></p>
<p class="code"><code>def myFunc(param):<br />
    &nbsp;&nbsp;&nbsp; if param &gt; 1: <br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print param</code></p>
<p>    Poi, a me sta venendo il tunnel carpale per digitare la combinazione Altgr+Shift+[<br />
    &nbsp;</li>
<li><em>datemi la print</em>: si &egrave; vero, anche Python 3.0 avr&agrave; la sua brava funzione <tt>print()</tt> al posto di una keyword, ma <tt>print()</tt> &egrave; infinitamente pi&ugrave; breve di <tt>Console.WriteLine()<br />
    </tt></li>
<li><em>ok agli shared references</em>: anche C# implementa il modello degli shared references come Python. In parole povere, una variabile C# &egrave; una terna del tipo (nome, tipo, riferimento), e i tipi primitivi generano oggetti immutabili. Quindi l'operazione di assegnamento implica far condividere a due nomi lo stesso riferimento ad un oggetto. L'unica differenza con Python &egrave; che il passaggio di parametri pu&ograve; avvenire anche nella modalit&agrave; 'ref', dove ad essere passata come parametro non &egrave; il solo riferimento ma tutta la varabile (poi, voglio capire perch&eacute; tutte le guide e i manuali che ho letto hanno un'abilit&agrave; tale a complicare l'argomento che difficilmente si riesce a comprendere che il concetto che c'&egrave; sotto &egrave; molto semplice).</li>
<li><em>non bastavano <tt>protected</tt>, <tt>private </tt>e </em><tt><em>public</em>: </tt>C# supporta i tipici modificatori di accesso del filone C++ (in realt&agrave; manca <tt>friend</tt>), ma ne introduce di nuovi come <tt>internal</tt> (accessibile dalle classi dello stesso assembly - una sort di <tt>friend </tt>con scope a visibilit&agrave; di modulo), ma anche <tt>override</tt> per indicare che una sottoclasse sta effettuando l'overriding di un metodo. Se non si &egrave; capito, faccio parte di quelli che sono convinti che impiegare 10 giorni per decidere se una metodo o un attributo devono essere <tt>private</tt>, <tt>internal </tt>o <tt>public </tt>&egrave; solo una perdita di tempo e un offesa all'intelligenza dei programmatori.</li>
<li><em>polimorfismo ed ereditariet&agrave; controllata</em>: C#, sulla falsa riga di C++, permette di controllare il polimorfismo con l'uso del modificatore <tt>virtual</tt>, ma anche con <tt>override </tt>per indicare espressamente che un metodo effettua l'overriding di un altro. Anche l'ereditariet&agrave; pu&ograve; essere controllata e anche impedita per mezzo della keyword <tt>sealed </tt>(l'equivalente del <tt>final </tt>Java). Tutti i tipi primitivi la usano, e quindi non si pu&ograve; derivare, ad esempio, dal tipo <tt>String</tt>, cosa che al contrario in Python &egrave; possibile da un bel po' di tempo (versione 2.2), ma &egrave; anche vero che le stringhe C# supportano in maniera nativa Unicode, cosa che in Python non avverr&agrave; prima della versione 3 con l'unificazione di oggetti <tt>str</tt> e <tt>unicode</tt>. 1-1 e palla al centro.</li>
<li><em>interessante l'implementazione del costrutto di interfaccia</em>: C# implementa il costrutto di interfaccia. Ora, non c'&egrave; molto da meravigliarsi dato che siamo in presenza di un linguaggio moderno a tipizzazione statica, per&ograve; lo fa in maniera molto interessante. Infatti, &egrave; possibile estendere interfacce (creare interfacce che ereditano da altre interfacce), &egrave; possibile definire polimorfismo a livello di interfaccia, &egrave; possibile definire vincoli sui tipi dei 'generics' in base ad un'interfaccia prestabilita (con la keyword <tt>where</tt>), esporre selettivamente i metodi di un interfaccia.</li>
<li><em>generics, servono</em>: mancavano nelle prime versioni di C#, ci sono dal 2.0. In un linguaggio a tipizzazione statica, se se ne abbraccia il credo, servono. Interessante la possibilit&agrave; di poter definire vincoli sull'interfaccia del tipo generico T.</li>
<li><em>direttamente da Python, i generatori</em>: pardon, gli enumeratori. Esattamente lo stesso concetto presente in Python (stessa keyword <tt>yield</tt>), ma basati su un'interfaccia specifica <tt>IEnumerable&lt;T&gt;</tt>. Inutile dire che sono utilissimi.</li>
<li><em>dizionari con keyword arbitrarie</em>: il tipo <tt>Dictionary&lt;K,V&gt;</tt> (che non &egrave; primitivo come in Python) consente di specificare tipi arbitrari per le chiavi, e non solo oggetti immutabili come in Python, a patto che tale oggetto non cambi nel flusso di esecuzione.</li>
<li><em>possibilit&agrave; di specificare funzioni di conversioni tra tipi</em>: questa &egrave; una funzionalit&agrave; che reputo sublime. A differenza di quanto si legge in giro, C# &egrave; un linguaggio fortemente tipato e quindi non c'&egrave; il concetto di <em>cast </em>presente nel C (che &egrave; debolmente tipato). Quello che viene chiamato erroneamente cast, &egrave; la possibilit&agrave; del C# di specificare le funzioni di conversione dei tipi, sia implicite sia esplicite. Ad esempio:<br />
    &nbsp;     </p>
<p class="code"><code>     public static implicit operator MyType(int i) {<br />
    &nbsp;&nbsp;&nbsp; //Qui il codice di conversione da intero<br />
    }<br />
    public static explicit operator int(MyType t) {<br />
    &nbsp;&nbsp;&nbsp; //Qui il codice di conversione verso intero<br />
    }<br />
    ...<br />
    public static void Main(string[] args) {<br />
    &nbsp;&nbsp;&nbsp; MyType t = 10; //Usa la conversione implicita<br />
    &nbsp;&nbsp;&nbsp; int a = (int)t; //Usa la conversione esplicita<br />
    }</code></p>
</li>
</ol>
<p>&nbsp;</p>
<p>Queste sono le prime osservazioni che riesco a fare su C#. Man mano che andr&ograve; avanti nello studio del linguaggio e del framework Mono poster&ograve; nuovi articoli. <em>Nel frattempo, come sempre, sono apprezzati commenti ed osservazioni</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.carminenoviello.com/2008/06/03/c-visto-da-un-pythonista1/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

