Ho “riesumato” questo mio articolo scritto un po’ di anni fa. L’ho leggermente rivisto, aggiornando qualcosina qua e là, tuttavia credo sia ancora attuale ed interessante.
INTRODUZIONE
Che cos’è un linguaggio di sviluppo? Un elaboratore elettronico, alias PC (Personal Computer), ha un suo linguaggio personale. Questo linguaggio viene chiamato codice macchina, per intendere che ogni macchina, quindi ogni elaboratore (PC Compatibili, Apple, Unix, ecc…), ne ha uno esclusivo e proprietario. I programmi che vediamo “girare” sul nostro PC vengono principalmente eseguiti da quel misterioso oggetto chiamato microprocessore. Questo rappresenta il cuore, l’unità intelligente, di ogni elaboratore elettronico. In realtà una applicazione non viene eseguita solo dal microprocessore ma si appoggia, per così dire, a quello che viene chiamato sistema operativo: uno strato software fornito dal produttore della macchina (si veda, ad esempio, i Macintosh della Apple). I PC compatibili, ad esempio, che montano i famosi microprocessori Pentium, possono avere come sistema operativo i vari Windows forniti dalla società di Redmond di Bill Gates Microsoft (Windows 95, 98, 2000 ecc…) e, ultimamente, anche sistemi operativi alternativi completamente gratuiti come Linux e derivati. Un’applicazione, quindi, dev’essere scritta per un particolare sistema operativo più che per un particolare microprocessore. Questo perchè il software che si scrive oggi si pone ad un livello più alto rispetto alla macchina stessa (al suo Hardware).
Inoltre il sistema operativo fornisce tutta una serie di funzionalità atte a semplificare la vita dello sviluppatore che non deve, quindi, partire da zero nella stesura di un programma.
I linguaggi di programmazione, come il C, il Pascal, l’Assembly, sono stati inventati per avvicinare il modo di esprimersi degli esseri umani al modo con cui, invece, “ragiona” un computer.
IL LINGUAGGIO ASSEMBLY
Il linguaggio Assembly fu il primo passo per semplificare la vita degli sviluppatori. Il codice macchina, il linguaggio del microprocessore, era all’inizio l’unico modo per scrivere dei “semplici” applicativi. La scrittura del codice avveniva tramite l’inserimento delle “istruzioni” che altro non erano che numeri: 21, 45, 77. Il significato di questi numeri veniva documentato nei cosiddetti Data Sheet: documenti rilasciati dal produttore del microprocessore dove venivano elencate le istruzioni possibili, la loro funzione e altre importatati informazioni. Il tastierino numerico era l’unica cosa che serviva allo sviluppatore. Con l’avvento l’Assembly, finalmente, si potè legare questi numeri a delle sigle così da velocizzare la scrittura del codice. Per fare un semplice esempio, immaginate di dover caricare un dato, ad esempio 1, in una variabile, ed aggiungerci il valore 5 per poi uscire. Questo era il principio:
1 2 3 | 46 01 ; carica 1 34 05 ; aggiunge 5 96 ; esce |
in Assembly il tutto si traduceva nel più comprensibile:
1 2 3 | LDA #1 ;carica 1 nell'accumulatore ADDA #5 ;aggiunge 5 all'accumulatore RTS ;esce |
Era quindi stato “inventato” il primo linguaggio di programmazione. Un linguaggio ancora di “bassissimo livello”, molto vicino quindi al codice macchina, che dava tuttavia una maggiore lettura del codice. L’invenzione del linguaggio altro non significava che la creazione di un apposito programma in grado di tradurre “parole” (o istruzioni) come LDA in numeri.
A questo programma venne dato il nome di compilatore.
IL COMPILATORE
Il compilatore è un applicativo in grado tradurre un testo, scritto in un linguaggio, in codice macchina. Tutti gli applicativi, a prescindere dal linguaggio con cui sono scritti, per essere eseguiti su di un elaboratore devono essere “convertiti” in codice macchina o, più semplicemente, in Assembly. Lo scopo di un compilatore è quindi quello di tradurre delle sigle (o istruzioni) in numeri. Esistono, infatti, compilatori Assembly, compilatori C, compilatori Pascal, ecc… Un linguaggio è sempre legato ad un compilatore e un compilatore è legato ad una macchina. Questo significa che per poter sviluppare in Assembly, non basta dotarsi di un compilatore Assembly qualsiasi ma, bensì, di un compilatore Assembly per la macchina – e sistema operativo – su cui dovrà essere eseguito il nostro applicativo.
Esistono, poi, elementi intermedi, indicati con il nome di interpreti. Questi, in parole povere, sono come i compilatori con la differenza che svolgono l’operazione di conversione (da istruzione a codice macchina) “al volo”, senza quindi generare fisicamente nessun file eseguibile. Esempi di questo tipo, molto diffusi un tempo, sono il Basic del Commodore 64! Ancora oggi, sotto diverse spoglie, gli interpreti giocano un ruolo fondamentale; Java, il Player Flash o Adobe AIR, sono tutti esempi – di fatto – di interprete.
LA PORTABILITÀ DEL CODICE
Il linguaggio Assembly fu sicuramente un passo avanti nella programmazione, ma ancora siamo lontani dai linguaggi a cui siamo abituati oggi. Uno dei problemi dell’Assembly è la non portabilità del codice.
Per portabilità del codice s’intende la capacità di un sorgente – cioè questo:
1 2 3 | LDA #1 ;carica 1 nell'accumulatore ADDA #5 ;aggiunge 5 all'accumulatore RTS ;esce |
di essere ri-compilato, così com’è (o con minime modifiche), su un altra macchina (sistema operativo) senza modificare il codice stesso, a patto di avere a disposizione il compilatore per quella macchina e per quel sistema operativo.
Macchine diverse hanno, molto probabilmente, codice macchina differente. Questo significa che l’istruzione LDA, che convertita prende il valore 46, ha senso su una particolare macchina, ma non su un’altra. L’Assembly, essendo legato al microprocessore, semplificava lo sviluppo solo per quel microprocessore. Quando si doveva portare un’applicazione su un’altro microprocessore si doveva, in pratica, riscrivere l’intero codice. Tutto ciò è diventato, con il tempo, inaccettabile. E fu così che si cominciarono a sviluppare dei compilatori basati su dei linguaggi che in qualche modo prescindessero dalla tipologia di microprocessore.
DOPO IL B FU IL C
Saltiamo le leggende, i preamboli e le classiche introduzioni da libro. Se avete voglia di sorridere e immergervi nel periodo d’oro dell’informatica, potete andare in libreria e fare una nutrita scorta di testi sul linguaggio C. Io, invece, mi soffermerei sull’essenza del linguaggio C.
Il C è sicuramente il più noto dei linguaggi di programmazione, il più usato e abusato. Tra l’era dell’Assembly e l’era del C si trovano anni di test, modifiche, apparizioni e sparizioni di altri linguaggi. Il C ha riscosso successo perchè aveva tutto quello che sembrava mancare in quel periodo. Esso, a differenza dell’Assembly, è completamente inventato, nel senso che è il frutto dello studio e dell’immaginazione di due “semplici” programmatori. L’Assembly, come abbiamo visto nei paragrafi precedenti, è invece strettamente legato al microprocessore. Le sue istruzioni, o chiavi sintattiche, sono – involontariamente – indicative del microprocessore utilizzato:
Microprocessori 6502
1 2 3 | LDA #1 ;carica 1 nell'accumulatore ADDA #5 ;aggiunge 5 all'accumulatore RTS ;esce |
Microprocessori Intel 80×86
1 2 3 | MOV AX,#1 ;carica 1 nel registro a 16 bit AX ADD AX,#5 ;aggiunge 5 al registro AX RET ;esce |
Microprocessori Motorola 680×0
1 2 3 | MOVEQ #1,D0 ;carica 1 nel registro D0 ADDQ #5,D0 ;aggiunge 5 al registro D0 RTS ;esce |
Ricapitolando, se è vero che esiste un compilatore Assembly quest’ultimo non può essere considerato un vero e proprio linguaggio di programmazione. Infatti se portiamo il sorgente Assembly scritto per Motorola 680×0 e proviamo a compilarlo con il compilatore per microprocessori Intel, una serie – infinita – di Syntax Error ci faranno subito cambiera idea! L’Assembly, quindi, a differenza del C, è un compilatore anomalo. Più che di “linguaggio Assembly” possiamo parlare di “strumento in grado di semplificare il codice macchina” – il codice dei numeri visto nei paragrafi precedenti.
IL LINGUAGGIO C
Il C è il linguaggio più diffuso, non esiste elaboratore elettronico al mondo che non abbia il suo compilatore C. Non a caso il C è stato il linguaggio su cui la programmazione ad oggetti ha avuto, e sta avendo, la sua migliore palestra. Il C è il vero prototipo di linguaggio portatile: uno stesso sorgente può essere compilato su macchine diverse senza dover modificare una riga di codice. La pratica, purtroppo, ci insegna che in particolari casi questa portabilità svanisce come per incanto. Rimane comunque il fatto che il C ha una sua sintassi, ha un suo standard riconosciuto in tutto il mondo. Il C è un linguaggio di sviluppo. I testi che lo trattano sono infatti svincolati dalla macchina su cui eseguire gli esercizi. Se andate in libreria e comprate un testo – anche universitario – sul linguaggio C, noterete che non vi sono riferimenti all’ambiente su cui svolgere gli esercizi. Forse qualche testo può sottolineare che gli esempio sono stati compilati su questa macchina e quest’ambiente, ma è comunque irrilevante alla maggioranza dei lettori. La cosa interessante è che tutti possono verificare il codice a “casa propria” senza dover possedere la tale macchina o il tale sistema operativo. Tutto ciò, ovviamente, rimane valido in ambito generale, ma quando si scende nel dettaglio si trovano vincoli sia di macchine che di sistemi operativi.
Un buon testo C, per coloro che sono alle prime armi, è sicuramente un testo generico, nel senso che tratta il linguaggio e non la sua applicazione particolare. Chi ha le basi del linguaggio C può migliorare – o specializzare – le sue conoscenze su particolari applicazioni del C. Se non avete mai sviluppato software e in aggiunta mai in C, evitate, ad esempio, di acquistare libri come Microsoft C Language! Mi pare ovvio che il testo stesso sia teso a dare informazioni sull’ambiente di sviluppo della casa – Microsoft – e non sul C stesso. Non rimarrei certo sorpreso alla domanda: «ma il C non l’ha inventato Microsoft?». No! Microsoft, a dire il vero, ha inventato ben poco, almeno rispetto ai sui predecessori. Ma questa è un altra storia…
Inoltre, moltissimi linguaggi usati oggi altro non sono che l’evoluzione del C stesso, o, quantomeno, propongono una sintassi base estremamente simile – per non dire identica – al C! Il C, quindi, è la madre di molte nuove tecnologie. Javascript, PHP, Actionscript, Java, e altri, nonostante siano in verità linguaggi orientati agli oggetti, hanno la sintassi del C degli anni 60!
LINGUAGGI OBJETCT ORIENTED
Cosa sono i linguaggi Object Oriented? Potrebbe essere complicato rispondere a questa domanda visto che confusione e fraintendimento sono comuni in questo ambito. Comincerei con il sottolineare che la programmazione ad oggetti è, prima di tutto, una filosofia. Chi sviluppa ad oggetti non cambia solo il compilatore ma anche il modo di analizzare il problema. Nella programmazione ad oggetti la filosofia cambia radicalmente e non esiste un vero e proprio flusso principale come accade nella programmazione strutturata classica. Sviluppare con prodotti orientati a oggetti (Visual Basic, C++, Java, …) può confondere non poco le idee a chi non ha solide basi di vecchia programmazione. Il C++, ad esempio, dev’essere affrontato solo da chi ha una discreta preparazione di C standard. Nella programmazione ad oggetti, ancor più che in quella strutturata, non è importate terminare il progetto, ma riuscire a realizzarlo in un ben determinato modo.
La nostra panoramica sui linguaggi di sviluppo termina qui. Per ulteriori approfondimenti potete fare esplicita richiesta contattando l’autore. I linguaggi di sviluppo oggi disponibili sono vari e vengono spesso scelti in base a particolari esigenze. Uno sviluppatore, quindi, dev’essere in grado di sviluppare in qualsiasi linguaggio, specializzandosi su uno o più strumenti di sviluppo all’occorrenza. Oggi, quello che manca ad alcuni sviluppatori, è il concetto di programmazione nella sua essenza. Conoscere il C è ben diverso da saper programmare in C!








11
Non ci sono commenti per questo Post
Lascia un commento