Nel post precedente abbiamo visto l'evoluzione dei linguaggi di programmazione, e quindi del modo di scrivere il codice, partendo da un livello cosiddetto "macchina", andando via via verso un livello di astrazione sempre più alto, sino ad arrivare ai linguaggi di programmazione moderni.
Possiamo affermare che tutti i linguaggi moderni più utilizzati hanno in comune alcuni elementi, come la possibilità di suddividere il codice in blocchi, e la presenza di strutture di controllo.
Al di là di questo, possiamo dividere i linguaggi di programmazione cosiddetti moderni in due categorie: quelli che permettono una programmazione ad oggetti, e quelli che non la permettono.
Possiamo quindi dividere ulteriormente la categoria dei linguaggi di programmazione ad oggetti: esistono infatti linguaggi che permettono la programmazione ad oggetti, ma non obbligano il programmatore ad utilizzarla, e linguaggi ad oggetti puri, che obbligano il programmatore ad utilizzare una logica di programmazione ad oggetti.
Come abbiamo già visto, tra i linguaggi di programmazione moderni non ad oggetti, il più utilizzato e popolare è il C.
I primi linguaggi ad introdurre il paradigma di programmazione orientata agli oggetti (object oriented in inglese) furono prima il Simula e poi lo Smalltalk.
Questi linguaggi sono stati fonte di ispirazione per i linguaggi ad oggetti più recenti, e tra i linguaggi ad oggetti puri più importanti, oltre al già citato Smalltalk, merita una citazione anche il più recente Eiffel.
Questi linguaggi, anche se un po' datati, sono ancora utilizzati (così come d'altronde lo è lo stesso Assembly), ma rappresentano un'area minoritaria all'interno del vasto mondo della programmazione.
A noi interessa vedere i linguaggi più diffusi, e che quindi offrono un maggiore supporto e una possibilità maggiore di sviluppare programmi che vanno oltre la semplice didattica.
Per carità, ogni linguaggio offre la possibilità di realizzare progetti importanti e anche commerciali, tuttavia per una serie di motivi sono poco utilizzati, o sono utilizzati solo in ambiti ristretti e più specifici, mentre noi cerchiamo un linguaggio potente ma allo stesso tempo generico.
Ad esempio esistono linguaggi di scripting molto potenti, utilizzati per creare pagine web dinamiche (un esempio è il PHP), ma inutili se si vuole programmare un'applicazione desktop o un motore grafico tridimensionale.
Altri esempi di linguaggi ad oggetti utilizzati per scopi più specifici sono il Python ed il Perl, vi rimando a Wikipedia per approfondire nel caso foste interessati.
Andando a vedere tra i linguaggi di programmazione orientati agli oggetti, i più diffusi sono (questo ovviamente è opinabile, non si tratta della verità assoluta): C++, Java e C#
Come faccio a dire che sono i più diffusi? Da una parte perché sono i linguaggi più richiesti in ambito lavorativo, basta sfogliare degli annunci di offerte di lavoro per rendersene conto; e dall'altra parte considerando il numero di applicazioni scritte in questi linguaggi.
Per quanto riguarda il C++ (C Plus Plus), di cui parleremo meglio più avanti, basti considerare che i videogiochi per PC e per Console (Playstation, XBox, Nintendo Wii ecc..) sono scritti in C++, e le stesse librerie grafiche (ad esempio le famose DirectX della Microsoft, o le OpenGL) utilizzate per programmare il lato visuale dei videogiochi sono scritte in C++.
Altri esempi includono i programmi di editing audio e di mixaggio più utilizzati negli studi di registrazione, come Pro-Tools o Cubase, e in generale la maggior parte dei programmi che utilizziamo ogni giorno per navigare su internet, ascoltare gli mp3, guardare i dvd o manipolare le immagini.
Per quanto riguarda invece il Java, è molto utilizzato soprattutto in ambito web: a chi non è mai capitato di giocare ad un gioco online in Java? E' facile saperlo perché i programmi in Java per essere eseguiti hanno bisogno di una "macchina virtuale", e se non l'abbiamo ancora installata nel nostro computer ci viene notificato con un link dove è possibile scaricarla.
Esistono tuttavia anche programmi desktop scritti in Java, mi viene in mente Eclipse, un ambiente di sviluppo utilizzato dai programmatori per scrivere e compilare i programmi. Ma tanti programmi utilizzati dalle banche o nelle amministrazioni pubbliche sono scritti in Java, per non parlare delle applicazioni e dei giochi per i cellulari.
Tra i tre linguaggi citati prima, il C# (si legge C Sharp) è quello relativamente più recente. E' un linguaggio di programmazione simile a Java, al quale si ispira, e come Java ha bisogno di una virtual machine (vedremo in seguito di cosa si tratta) perché i programmi in C# vengano eseguiti.
Tra i tre linguaggi di programmazione la mia scelta è caduta sul C++, nonostante il livello di difficoltà maggiore nei confronti degli altri due linguaggi. Questo perché il C++ è un linguaggio più performante.
Infatti il C++, a differenza di Java e C#, è un linguaggio compilato. Questo significa che il programma scritto in C++ viene trasformato dal compilatore in codice macchina e viene eseguito direttamente.
Mentre in Java il programma viene trasformato in un codice che non verrà eseguito direttamente dalla CPU ma da una Virtual Machine, che si occupa di fare da tramite tra il programma in Java e la CPU.
Perché è stato fatto questo? Perché il programma Java sarà identico in tutte le macchine e sistemi operativi, e sarà eseguibile in qualsiasi computer abbia installata al suo interno la Virtual Machine. In altre parole il programmatore scrive il codice e lo compila una sola volta, dopodiché il programma sarà distribuibile senza modifiche e sarà utilizzabile su tutti i sistemi operativi e su tutte le architetture hardware per le quali esiste una versione della virtual machine.
Mentre un programma scritto in C++, una volta compilato su Windows girerà solo su Windows. Se viene compilato per un sistema operativo a 64 bit, non funzionerà sui sistemi operativi a 32 bit. Per questo spesso, quando ci apprestiamo a scaricare un programma dal sito della software house che lo distribuisce, ci viene chiesto di selezionare una tra le tante versioni del programma, in base al nostro hardware e sistema operativo.
Se un programmatore ad esempio vuole rendere disponibile il suo programma anche per Linux, deve ricompilarlo su Linux e distibuire anche quella versione. Spesso addirittura non basta limitarsi a ricompilare il programma, ma bisogna modificarlo per renderlo compatibile con il sistema operativo. Ad esempio i programmi che utilizzano un'interfaccia grafica si appoggiano a delle interfacce di programmazione del sistema operativo, ad esempio le API Windows nel caso di Vista o XP, le librerie QT o GTK nel caso di Linux, e altre librerie ancora nel caso di MacOS.
Lo stesso vale per i videogiochi, possiamo programmare un gioco con le DirectX, ma se vogliamo portarlo su Linux dobbiamo riscriverlo con delle librerie supportate da Linux (o utilizzare Wine). Tuttavia esistono delle librerie intermedie che offrono un'interfaccia generica, e si appoggiano a librerie grafiche diverse in base al sistema operativo in cui vengono utilizzate.
Per fare un esempio pratico, per fare un videogioco prima di tutto dobbiamo creare una finestra in full-screen. Mettiamo che su Windows l'istruzione necessaria a fare ciò sia System_DRAW(FULLSCREEN), mentre su Linux la stessa cosa si ottiene scrivendo drawWindow(full).
Se scrivessimo un videogioco per Windows e poi volessimo portarlo su Linux dovremmo modificare tutte le funzioni, in questo caso sostituendo System_DRAW con drawWindow.
Se invece ci appoggiamo ad una libreria intermedia, dovremo utilizzare la stessa funzione su ogni sistema operativo, ad esempio draw_w(FULL = TRUE).
Sarà lei a richiamare la funzione System_DRAW quando la compilazione del programma avviene su Windows, mentre quando lo facciamo su Linux chiamerà la funzione drawWindow.
In realtà questo non basta a rendere il codice al 100% portabile, e delle modifiche sono sempre necessarie, senza considerare che dobbiamo avere a disposizione vari sistemi operativi e architetture dove poter compilare il codice se vogliamo che il nostro programma sia disponibile per il maggior numero di macchine.
Se però consideriamo che Windows è il sistema operativo più diffuso, e che la maggior parte dei computer sono Intel/ADM a 64bit, il problema è trascurabile. Se vogliamo programmare un videogioco, o scegliamo una console (è raro trovare giochi multiconsole, e di sicuro quei pochi non sono creati da programmatori amatoriali) o scegliamo il PC e la scelta cade inevitabilmente su Windows.
Per applicazioni più semplici invece, possiamo focalizzarci sul nostro sistema operativo preferito, ad esempio io utilizzo Linux e se dovessi scrivere ad esempio un editor di testo lo farei per Linux.
Perciò Java è più portabile ma, avendo un passaggio in più da compiere prima di arrivare alla CPU, è meno reattivo, e si presta meno ad applicazioni multimediali esose di risorse, come lo sono appunto i videogiochi.
Un'altra differenza tra il C++ e il Java e C# è che i secondi gestiscono la memoria in modo "managed", e cioé automatico, il che li rende più semplici ma allo stesso tempo meno performanti.
Per concludere, il C++ mi sembra una buona scelta per via delle sue performance, a discapito della portabilità. Ad ogni modo una volta imparato il C++, la sintassi di Java e C# è molto simile, e non sarà difficile imparare un secondo linguaggio. Il processo inverso sarebbe invece più complicato.
Infine, dal momento che il mio obiettivo finale è quello di creare un bel videogame, la scelta del C++ mi pare obbligata.
Nessun commento:
Posta un commento