C#

Il linguaggio C#

Dopo quanto visto nel capitolo precedente è arrivato il momento di presentare C# vero linguaggio principe di .Net.

Esso è stato concepito e creato come strumento per programmare specificatamente utilizzando il framework di Microsoft e, come il framework stesso o meglio ad esso, ha subito una notevole evoluzione nel tempo. E’ abbastanza naturale capire il perchè di questa scelta o meglio di questo “parto”. Creare un nuovo linguaggio di programmazione è una una mossa comunque pesante ma in questo caso spontanea in quanto .Net è un qualche cosa che si sposta in maniera vistosa dalle precedenti tecnologie di sviluppo quanto meno in casa Microsoft; in questo senso è senza dubbio assai produttivo ideare un nuovo strumento che si adatta completamente alla nuova tecnologia. L’adattamento faticoso e laborioso di Visual Basic e C++ al mondo .Net è la riprova che una novità radicale in questo senso è stata una buona idea. Si è trattato una evoluzione cominciata nel 2000 e proseguita fino a far diventare il linguaggio uno strumento maturo ed utilizzabile per i più svariati compiti. Esso trae la sua ispirazione a livello sintattico da C/C++ e da Java oltre che da Object Pascal, sia pure per quest'ultimo in maniera meno evidente; tuttavia il la mente principale che si cela dietro C# è Anders Hejlsberg che, prima di lavorare in Microsoft, era a capo del progetto Delphi in Borland (dopo alcune vicissitudini Delphi ora è un sempre valido prodotto di Embarcadero Software). Logicamente qualche cosa se la è portata dietro, vista anche la bontà di quel prodotto che il tecnico danese seguì quasi fino alla uscita della versione 3.0. L'evoluzione pubblica di C# ha preso il via come detto nell'anno 2000, anche se il progetto originale pare datasse 1998, ed è continuata ininterrotta fino ai giorni nostri ricevendo nel frattempo il riconoscimento come standard ECMA e ISO almeno fino alla versione 2.0, successivamente il processo di standardizzazione non è stato ulteriormente portato avanti.
C# nasce quindi con un background notevole e la sua sintassi non rinnega le origini; va però tenuto presente che il
team di sviluppo ha lavorato in modo da renderlo il più semplice possibile ma soprattutto cercando di modellare la sua espressività in maniera che non si distaccasse troppo da quanto largamente utilizzato dai programmatori Java e C/C++ i quali avranno una curva di apprendimento molto dolce, almeno a livello sintattico; si tratta ovviamente di un modo per attrarre programmatori anche da quei linguaggi. La semplicità in questo aspetto era comunque sicuramente uno dei target dei progettisti.

Ma quali sono le caratteristiche di C#? Non dimentichiamoci che esso gode di tutte le features di .Net alcune delle quali abbiamo già sfiorate nel capitolo di introduzione al framework. Tuttavia in questa sede le reincontriamo, insieme ad altre, per completezza descrittiva:

  • Abbraccia vari paradigmi di programmazione, come la maggior parte dei nuovi linguaggi. Certamente l'aspetto object oriented è quello più utilizzato e conosciuto ma si può usare C# anche per programmare usando l'approccio funzionale (così non era nella versione 1.0), event-driven, generico e anche, perchè no, imperativo. Tutto questo grazie appunto all'evoluzione avutasi nel tempo che ha notevolmente arricchito il linguaggio di costrutti ed espressività. Anche i paradigmi riflessivo e concorrente sono supportati.

  • Nasce come linguaggio a tipizzazione statica, ovvero una variabile nasce e muore rimanendo sempre dello stesso tipo. Tuttavia, a partire dalla versione 4.0, grazie all'introduzione del DLR di cui abbiamo parlato nel capitolo relativo al framework .Net, è possibile anche dichiarare una variabile in maniera dinamica, aumentando ancora di più la duttilità del linguaggio. Nel caso in cui si opti per la tipizzazione statica essa è anche forte, ovvero sono permesse su di esse solo operazioni "legali" e sicura, quindi non ammette pericolose conversioni implicite che possono portare a perdita di informazione. Grazie alla sua nuopva natura dinamica C# ammette ora anche una parziale inferenza di tipo.

  • Nell'ambito della programmazione a oggetti permette solo l'ereditarietà singola da classi ma è possibile ereditare da quante interfacce si vuole. Se siete dei fan dell'ereditarietà multipla (come me, forse a torto) con C# rimarrete delusi. Ovviamente questo non preclude nulla in termini di potenzialità ed espressività del linguaggio e d'altronde è innegabile che l'ereditarietà singola sia l'approccio a oggi di maggior successo.

  • Non viene fatto uso dei puntatori croce (soprattutto...) e delizia dei programmatori C/C++, se non in speciali blocchi di codice marcati come unsafe (guarda caso)

  • Offre un valido supporto per l'internazionalizzazione.

  • Supporta nativamente la generazione di documentazione XML e anche scrittura di servizi Web XML Based.

  • Può facilmente cooperare con altri linguaggi .Net compliant, vale la pena ripeterlo perchè è un concetto pilastro per .Net.

  • Tramite il progetto Mono gira anche su piattaforme Linux e Mac. (diciamolo: non è l'ambito dove esprime il meglio di se). Tramite la eccellente suite Xamarin può essere adoperato anche per creare applicazioni Android (in realtà Xamarin permette, in generale, uno sviluppo multipiattaforma)

  • Dispone, in breve, pienamente di tutte le features proprie di .Net quindi un efficiente meccanismo di garbage collection, gestione delle eccezioni avanzata, ecc... segnalo che dalla versione 4.0 in avanti è possibile usare anche il design by contract e sfruttare le CPU multi core grazie al parallelismo (il progetto in origine si chiamava Parallel FX), tutti argomenti già accennati nel capitolo precedente.

Tutto questo naturalmente detto per sommi capi e restando un po’ sulle linee generali; mi riesce difficile racchiudere tutto in un elenco sintetico. Soprattutto preferisco evitare confronti diretti con altri linguaggi, confronti di cui il web è pieno zeppo anche da fonti molto più qualificate di me. I dettagli “veri” del linguaggio li vedremo strada facendo. In realtà infatti le caratteristiche di C# sono molteplici ed in particolare è profondo l'intreccio con le tecnologie che Microsoft ha sviluppato negli ultimi anni. Parole come Linq o Wpf, piuttosto che SilverLight (anche se quest'ultima tecnologia sembra abbandonata) saranno oggetto di dicussione (molto più avanti...), capiremo meglio come C# interagisce con .Net e come da questo potentissimo motore tragga risorse e potenzialità enormi. C# è nato con .Net ed è il linguaggio che in assoluto meglio lavora in congiunzione con questo ambiente. Tra l’altro pare che la gran parte della BCL sia stata scritta proprio questo linguaggio e scusate se è poco. Ogni evoluzione della piattaforma sottostante inoltre aumenta automaticamente le potenzialità del linguaggio. Le varie tappe evolutive, qui di seguito ne diamo appena un accenno, del resto lo dimostrano:

C# 1.0 è stato il punto di partenza agli inizi degli anni 2000
C# 2.0 introdotti concetti come generici, nulla types, tipi parziali, funzioni anonime ecc...
C# 3.0 supporto per tipi anonimi, funzioni lambda, metodi parziali ecc, LINQ...
C# 4.0 dinamic binding, parametri opzioni e con nome
C# 5.0 metodi asincroni

Ma, ripeto, sono solo accenni... e comunque lo sviluppo continua

Altro punto da non sottovalutare è la grande disponibilità di risorse presenti sul Web in termini di codice, tutorials, materiale vario e communities, con il sito di MSDN che è un reference enorme ed insositutibile. Va anche aggiunto che, negli anni, Microsoft ha investito molto su C# cercando di arricchirlo ad ogni release di quelle features che gli sviluppatori richiedevano, un processo di adeguamento che è costantemente in evoluzione. Insomma c'è un supporto di alto livello alle spalle di tutto. Ed è interessante accennare ai tanti progetti sperimentali che hanno dato origine a dialetti tramite i quali sono state sperimentate nuove features. Cω, Spec#, Polifonic C# sono alcuni di questi dialetti, in realtà veri e propri linguaggi completi la cui nascita ed analisi ha permesso di riversare ulteriore conoscenza in C#.

Il target di C# in definitiva è lo sviluppo di applicazioni di qualsiasi tipo nell'ambiente Windows, che si parli di database, n-tier, GUI, si tratta comunque di termini e sigle che non sfuggono al potenziale applicativo di questo linguaggio; ma anche in se si guarda al Web esso è fortemente utilizzato come linguaggio principale nell'ambito di Asp.Net. Certamente non è il linguaggio "definitivo", che non esiste ancora e forse non esisterà mai, ma sicuramente è un compagno di viaggio che può dare molte soddisfazioni.

Mi permetto di aggiungere a questa presentazione una mia piccola esperienza personale: ho chiesto a vari sviluppatori che cosa ne pensassero sinceramente di C# e, tolto qualche raro interlocutore palesemente schierato da una parte o dall’altra, ovvero un po’ troppo pro o un po’ troppo contro, ho avuto la sensazione che, mediamente, sia considerato un linguaggio molto buono, anche da parte di altri “language writer”. Certo non è un sondaggio definitivo, si è trattato di poco più di un centinaio di contatti ma qualche cosa, secondo me, vuol dire.

Ci sono delle controindicazioni? Beh, si, d'altronde come abbiamo detto il linguaggio perfetto non c'è. Tralasciamo l'appartenenza alla galassia Microsoft che ad alcuni non piace "per principio". Le critiche maggiori derivano proprio da questa paternità, e il fatto che sia stato comunque standardizzato e, di fatto, aperto, non lo ha salvato da lugubri sospetti che vedono tra i principali sostenitori Stallman (che avrebbe detto in sostanza: “dipendere da C# è pericoloso e quindi è bene non usarlo” non tanto temendo il linguaggio quanto l’uso che Microsoft potrebbe farne) e la Free Software Foundation. Qui però siamo sul politico piuttosto che sul tecnico e certamente non mi addentro nel discorso. Ritornando ad aspetti eminentemente pratici va evidenziato come stiano ottenendo sempre più grande successo linguaggi interpretati come Ruby e ancor più Pythoni, più leggeri,  basati su di un approccio diverso e per alcuni versi più semplici. Questo però è un aspetto di cui diffidare: non esiste un linguaggio che renda semplice tutte le cose che non lo sono. Alcuni sono più predisposti verso alcune problematiche, ma insomma, programmare non è facile specialmente se lo si vuol fare davvero bene. La sintassi C based di C# può non piacere, così come in alcuni casi le sue performance sono controverse, d'altronde in fase di design Hejlsberg e i suoi colleghi non sono andati alla ricerca delle prestazioni da record. Per sistemi real-time forse non è il linguaggio ideale, come non lo è nessuno di quelli general purpose. Però sinceramente, anche da questo punto di vista, non ho mai riscontrato criticità negative nell’ampio ventaglio di tipologie di problemi che ho dovuto affrontare. Insomma C# è veloce il giusto, secondo me. Provare è comunque sempre il modo migliore per scegliere e valutare.

Per chiudere una piccola curiosità: il nome C# si vuole contenga un richiamo, abbastanza ovvio, alla “alma mater” ovvero il linguaggio C unito ad un simbolo musicale, appunto #... secondo alcuni proprio l’ultimo simbolo, vista la conformazione, che lo fa assomigliare alla composizione di 4 simboli “+”, farebbe si che C# sia in realtà C++++ (!). Altra piccola curiosità: pare che prima di C# uno dei nomi che si pensava di attribuire al nuovo linguaggio era "Cool", poi vi furono dei problemi di registrazione di tale nome e non se ne fece nulla. Per noi italiani forse è meglio: non è carino dire "programmo in Cool".....