II.

Linguaggi di programmazione e sviluppo software

Una comune definizione di linguaggio di programmazione è: "un linguaggio artificiale costruito per permettere di dare istruzioni ad un computer". I computer non comprendono l'inglese, l'arabo o il cinese e, anche se gli umani possono teoricamente imparare il binario (il linguaggio di base dei computer), quasi nessuno lo fa. Ecco perché abbiamo bisogno di un metodo di intermediazione per comunicare, il quale chiamiamo linguaggio di programmazione.

Come si è visto nella sezione I, i programmatori hanno creato linguaggi di programmazione e soluzioni software fin dagli inizi dell'era dei sistemi di computo. In questa sezione si comprenderà in che modo i linguaggi di programmazione si siano evoluti e cosa si possa fare per mezzo di essi.

Linguaggi di programmazione a basso livello

All'inizio dell'era dei computer il codice assembly ed il codice binario erano i principali linguaggi per comunicare con i computer e chiedergli di eseguire dei comandi traducendo dati in uno e zero; cioè in linguaggio binario.

Il codice macchina, anche noto come linguaggio binario, è una serie di uno e di zero che rappresentano un comando per il processore di un computer (CPU). Il linguaggio assembly è molto più leggibile rispetto al linguaggio binario. Per riferirsi ad istruzioni in codice macchina, l'assembly impiega codici mnemonici invece di usare direttamente i valori numerici delle istruzioni.

Si potrebbe pensare che questi linguaggi abbiano perso d'importanza dal momento che sono invisibili per la maggior parte degli utenti di computer, ma in realtà essi sono ancora in uso nei moderni computer. Sono gli elementi di base di ogni computer. Ogni CPU può eseguire una serie di istruzioni specifiche che corrispondono al tipo o al tipo di architettura di quella particolare CPU.

Ma perché si dovrebbe voler imparare i linguaggi e la programmazione a basso livello in generale? Le ragioni sono molteplici ed includono il fatto che:

  • Alcune parti dei nostri sistemi operativi, inclusi i virus, sono scritte in assembly.

  • Se si intende lavorare alla programmazione di GPU utilizzando linguaggi ad alto livello come CUDA o OpenCL, è necessario capire la programmazione a basso livello.

  • Se si vuol migliorare l'apprendimento automatico, si può ottimizzare il codice utilizzando il linguaggio assembly e gestire la memoria in modo efficiente.

  • Se si vuole capire nel profondo come funzionano i sistemi operativi, sarà utile conoscere il linguaggio assembly. Il linguaggio assembly è solitamente impiegato nel codice di avvio di un sistema, cioè nel codice a basso livello che avvia e testa l'hardware di un sistema prima dell'avvio del sistema operativo.

  • Il linguaggio assembly è utile nei processi di ingegneria inversa. Molti programmi vengono distribuiti solo sotto forma di linguaggio macchina, che può essere facilmente tradotto in linguaggio assembly da un programma disassemblatore, ma che è più difficile da tradurre in un linguaggio ad alto livello attraverso un decompilatore.

Dopo aver visto come e perché si possono approfondire i linguaggi a basso livello, siamo pronti per imparare qualcosa a proposito dei linguaggi ad alto livello.

Lista di nomi di linguaggi software
Lista di nomi di linguaggi software

Linguaggi di programmazione ad alto livello

Sappiamo che un computer comprende il codice binario ma noi no, o meglio solo poche persone lo comprendono.

Alla fine degli anni cinquanta, gli utenti di computer (per la maggior parte scienziati e grandi aziende) spesso dovevano scrivere il loro proprio software. Lo svantaggio era che ogni business o laboratorio aveva bisogno di qualcuno capace di programmare un computer ed il software veniva creato per quel specifico sistema di computazione, cosicché era impossibile scambiarlo con altri a causa di problemi di incompatibilità. Quindi vennero inventati i compilatori e ciò permise lo sviluppo di linguaggi di programmazione ad alto livello, cioè linguaggi più astratti e di più facile comprensione.

Note

Un compilatore traduce il codice scritto nel linguaggio di un computer in quello di un altro computer.

I primi linguaggi ad alto livello sviluppati negli anni cinquanta furono FORTRAN, COBOL e BASIC. Essi permisero ai programmi di venir specificati in modo astratto, indipendentemente dai dettagli specifici dell'architettura hardware di un computer. (Wolfram 2002).

Questi linguaggi vengono impiegati per scrivere programmi che rappresentano una serie completa e funzionale di istruzioni che il computer utilizza per svolgere alcune operazioni, come caricare una pagina web, generare analisi statistiche e calcolare la somma di due numeri. Tuttavia, il codice non viene letto direttamente dalla CPU. Ma deve venir compilato in un linguaggio a basso livello.

Poiché la compilazione di ampie porzioni di codice può richiedere molto tempo, i programmatori hanno inventato gli interpreti.

Note

Un interprete esegue direttamente le istruzioni scritte in un linguaggio di programmazione senza aver bisogno di un compilatore che le compili in un programma in linguaggio macchina.

Alcuni linguaggi di programmazione fanno uso sia di compilatori che di interpreti. Se si scrive un programma in Java in un elaboratore di testo, quando viene compilato dal compilatore Java, si crea una cosa chiamata bytecode. Il bytecode può essere pensato come un passaggio intermedio tra il codice sorgente ed il codice oggetto. Quando un computer esegue un programma in Java, alcuni programmi libreria su quella macchina interpretano il bytecode. Ciò permette a Java di funzionare indipendentemente dalla piattaforma su cui gira. Un utente ha solo bisogno di avere le giuste librerie di runtime per Java sul computer per poter eseguire i programmi.

Che differenza c'è tra linguaggi a basso livello e linguaggi ad alto livello?

La principale differenza consiste nel fatto che i programmatori possono comprendere, interpretare o compilare più facilmente un linguaggio ad alto livello rispetto al codice macchina. D'altro canto le macchine comprendono il linguaggio a basso livello più facilmente rispetto agli esseri umani. Si considerino alcune altre differenze:

Linguaggio ad alto livello Linguaggio a basso livello
Linguaggio pensato per i programmatori Linguaggio pensato per la macchina
Il linguaggio ad alto livello fa un uso poco efficiente della memoria Il linguaggio a basso livello fa un uso molto efficiente della memoria
Più facile da debug Comparativamente complesso da debug
Manutenzione più semplice Manutenzione comparativamente più complessa
Portatile Non portatile
Può venir eseguito su ogni piattaforma Dipende da una macchina specifica
Richiede la traduzione di un compilatore o un interprete Richiede la traduzione di un assemblatore
Ampiamente usato nella programmazione Non comunemente usato oggi in programmazione

Scrivere i propri programmi/software

Esiste un'intera disciplina dedicata alla creazione di (prodotti) software chiamata ingegneria software. Per cominciare tratteremo brevemente il tema dell'ingegneria software poi tratteremo i linguaggi di programmazione.

Cos'è l'ingegneria software?

Quando si pensa al software, si immagina di solito un'interfaccia che ci permette di fare qualcosa con il computer per esempio scrivere un testo. L'ingegneria software si definisce come quel processo di analisi dei requisiti d'utilizzo (il bisogno degli utenti per esempio di scrivere testi) per la costruzione del prodotto software desiderato. Si tratta quindi di progettare, costruire e testare applicazioni software che soddisfino quei requisiti.

Esempio

Si prendano in considerazione varie definizioni di ingegneria software:

  • l'IEEE nello standard 610.12-1990 definisce l'ingegneria software come l'applicazione di un approccio sistematico, disciplinato e computazionale per lo sviluppo, l'esecuzione e la manutenzione del software.

  • Fritz Bauer l'ha definita come "determinare ed impiegare principi ingegneristici standard. Ciò aiuta ad ottenere in modo economico un software affidabile e che funziona in modo efficiente nelle macchine reali".

  • Boehm definisce l'ingegneria software come ciò che comporta "l'applicazione pratica di conoscenze scientifiche alla progettazione creativa e alla costruzione di programmi per il computer. Essa include anche la relativa documentazione richiesta per il loro sviluppo, funzionamento e manutenzione”.

Cosa comporta l'ingegneria software oltre alla programmazione?

La creazione di un software richiede molti passaggi sia prima che dopo la programmazione. Ciò è noto come il Ciclo di Sviluppo Software (o Software Development Life Cycle, SDLC) e si tratta di una sequenza ben definita di passaggi che rendono il processo di progettazione e sviluppo efficienti. Le sue fasi sono le seguenti:

  • La comunicazione rappresenta la prima fase. Di solito un potenziale cliente di un'azienda di software richiede un particolare prodotto software.

  • La raccolta dei requisiti consiste nel cercare di raccogliere quante più informazioni possibili sui requisiti del cliente.

  • Lo studio di fattibilità prevede la proposta da parte del team di un piano abbozzato del processo software.

  • L'analisi di sistema prevede l'analisi di squadra dello scopo del progetto e in relazione ad esso la pianificazione del tempo e delle risorse necessarie.

  • La progettazione software prevede la combinazione dei risultati prodotti dallo studio dei requisiti e dall'analisi di sistema per procedere alla progettazione del prodotto software.

  • La fase di programmazione o coding consiste nella scrittura del codice del programma in un linguaggio di programmazione idoneo sviluppando in modo efficiente programmi eseguibili esenti da errori.

  • La fase di collaudo è una parte essenziale del processo per individuare e correggere eventuali errori.

  • La fase di integrazione è richiesta qualora il software debba integrarsi con entità esterne come database o altri programmi.

  • La fase di implementazione è quella in cui il nuovo software è pronto e può venir installato sulle macchine degli utenti.

  • La fase di operazione e manutenzione riguarda la conferma nella realtà dell'efficienza del software. Si verificano e si correggono possibili errori.

Sviluppo a cascata e sviluppo agile a confronto

Tutte le fasi o attività del SDLC menzionate sopra possono venire eseguite in ordine diverso a seconda dei diversi approcci esistenti. Inoltre approcci diversi investono più o meno tempo in diverse fasi dell'SDLC. Queste fasi possono svolgersi una dopo l'altra come richiesto dalla metodologia a cascata o ogni fase può venir ripetuta in varie iterazioni per uno sviluppo incrementale del prodotto software come suggerito dalla metodologia agile.

Confronto tra sviluppo a cascata e sviluppo agile
Confronto tra sviluppo a cascata e sviluppo agile

I metodi tradizionali di sviluppo software impiegano un modello di sviluppo noto come sviluppo a cascata. Prima che gli aggiornamenti software potessero essere facilmente scaricati da o implementati automaticamente su internet, il processo di sviluppo a cascata era pensato per fare in modo che quando un programma software veniva consegnato ad un cliente esso contenesse tutte le caratteristiche richieste e che tutti i problemi noti fossero stati testati e risolti fino a che la successiva versione del programma software non venisse rilasciata. Questo processo ha un alto potenziale di rischio e richiede molto tempo, perché il collaudo del prodotto avviene alla fine dopo che gli sviluppatori e i designer hanno speso una considerevole quantità di tempo a progettare e costruire tutto il programma. Questo tipo di processo di sviluppo privilegia inoltre l'efficienza ingegneristica piuttosto che l'esperienza dell'utente finale, il che può portare a problemi che gli ingegneri non hanno previsto ma che generano frustrazione nell'utente e nel cliente, il quale non viene più coinvolto nel processo di sviluppo dopo lo studio iniziale dei requisiti. Questa frustrazione nell'utente finale può generare una perdita commerciale e costosi ritocchi.

L'approccio agile è lo standard moderno per uno sviluppo software a cui collaborano sviluppatori e clienti attraverso una ripetizione continua delle fasi di pianificazione, apprendimento e comunicazione per una consegna del software in modo incrementale e non tutto in una volta alla fine del progetto. Gli utenti finali (le persone che effettivamente utilizzeranno il software) vengono posti al centro dei requisiti e delle caratteristiche di progettazione e viene chiesto loro di testarle a piccole dosi durante tutto il progetto. In questo modo, se viene fuori un errore procedurale nel progetto del prodotto, i necessari aggiustamenti possono venir fatti immediatamente prima di continuare lo sviluppo. Dividere il processo in parti più piccole, collaudare continuamente ed integrare le caratteristiche software un po' alla volta diluisce il rischio d'investimento nello sviluppo e velocizza la forniture del software ai suoi utenti.

Ora che ci è noto l'intero processo che soggiace alla creazione di un software, possiamo ritornare al tema dei linguaggi di codificazione e programmazione..

Note

Come è ormai noto, la maggior parte dei programmi per computer vengono scritti in linguaggi di programmazione ad alto livello; tuttavia la versione leggibile per l'uomo di un programma si chiama codice sorgente. Chiunque insieme ad uno sviluppatore software può creare e modificare un codice sorgente scritto in un linguaggio ad alto livello utilizzando un software IDE o anche un semplice elaboratore di testo.

Cos'è un software IDE?

L'espressione software IDE significa "integrated development environment" o ambiente di sviluppo integrato e si tratta di un applicazione che gli sviluppatori utilizzano per creare programmi per computer. In questo caso la parola "integrato" si riferisce al modo in cui molteplici strumenti di sviluppo vengono combinati in un singolo programma. Per esempio un tipico IDE include un editor per codice sorgente, un debugger e un compilatore. La maggior parte degli IDE forniscono anche un'interfaccia di progetto che permette ai programmatori di gestire tutti i file relativi ad un progetto. Molti consentono pure di gestire le diverse versioni di un programma.

Alcuni IDE forniscono un "runtime environment” (RTE) per collaudare i programmi software. Quando un programma viene fatto girare nell'RTE lo sviluppatore può seguire ogni evento che ha luogo durante il collaudo dell'applicazione. Questo può essere utile all'identificazione e correzione dei bug e per la localizzazione delle fonti di memory leaks o fuoriuscite di memoria. Poiché le IDE forniscono un'interfaccia utente centralizzata per la scrittura del codice ed il collaudo dei programmi, un programmatore può apportare velocemente una modifica, ricompilare il programma e farlo ripartire di nuovo. La programmazione rimane un duro lavoro ma i software IDE aiutano a rendere più efficiente il processo di sviluppo.

Esiste un numero considerevole di linguaggi di programmazione per computer utilizzati da coder, sviluppatori di software, sviluppatori per il web ed altri professionisti in ambito informatico. Ma quanti sono in realtà?

Secondo Wikipedia esistono circa 700 linguaggi di programmazione inclusi alcuni linguaggi di codificazione esoterici.  Altre fonti che tengono conto solo dei linguaggi più degni di nota contano un numero comunque considerevole di 245 linguaggi. Un'altra lista, chiamata HOPL, la quale dichiara di includere ogni linguaggio di programmazione mai esistito, ne presenta un numero totale di 8.945. Alcuni addirittura stimano un totale che arriva fino a 25.000.

Ma come si fa a scegliere quale linguaggio di programmazione imparare? E si può davvero imparare a programmare? La risposta è sì! Si può e si deve, perché molteplici lavori richiedono sempre di più i rudimenti della programmazione.

Carlcheo ha creato un'utile infografica per aiutarci a scegliere quale linguaggio di programmazione imparare e ha raccolto alcune buone risorse per cominciare ad imparare alcuni dei linguaggi menzionati.

  • Se si è alla ricerca di un linguaggio per i propri figli, Scratch è il più indicato e dopo che si è imparato quello, si consiglia di passare a Python.

  • Se si vuol imparare un linguaggio per lavorare per Facebook o Google, il più indicato potrebbe essere Python. In generale Python è un'ottima scelta poiché viene considerato uno dei relativamente più semplici da imparare.

  • A detta degli sviluppatori, se si vuol imparare un linguaggio "semplice” le scelte migliori sono Python,Ruby e JavaScript. Questi linguaggi possono fornire una solida base per la logica e la sintassi della programmazione. E una volta acquisita una solida base tutti gli altri linguaggi saranno più facili da imparare.

  • Se si vogliono sviluppare videogiochi, C++ è tendenzialmente il linguaggio prescelto.

  • Per programmare ad un livello relativamente basso si scelgono il C e il C++ perché vengono tendenzialmente compilati direttamente nel linguaggio macchina della piattaforma in uso. Inoltre C e C++ permettono di scrivere codice in un modo che è piuttosto vicino al comune codice macchina (con puntatori ecc.). In questo ambito Rust è un linguaggio più nuovo.

  • Se si intende lavorare a progetti per iPhone, quindi a progetti che hanno a che fare con iOS, la scelta ricade su Swift.

  • Se si intende lavorare a progetti che hanno a che fare con Android, la scelta ricade su Java o Kotlin.

  • Se si è attratti dall'estetica dei siti web, è molto probabile che si troverà interessante la programmazione di ciò che è visibile per l'utente (sviluppo web front end) ed il linguaggio prescelto per questo è JavaScript.

  • Se si è attratti dai server (sviluppo web back end) e dai database, il linguaggio da prediligere potrebbe essere Ruby o Python.

  • Se si sa già quale parte dello stack tecnologico ci interessa di più, la scelta ricade o su un linguaggio per lo sviluppo front end o su un linguaggio per lo sviluppo back end.

Ecco infine il nostro ultimo consiglio: Poiché ci sono centinaia di opzioni per apprendere un linguaggio, è sempre una buona idea rispondere a due domande fondamentali prima di effettuare una scelta.

  • Cosa ha destato in me un interesse per la programmazione?

  • Cosa intendo fare come programmatore?

Ci sono moltissime opportunità per dare uno slancio alla propria carriera. Il primo linguaggio che si impara può insegnarci a pensare come un programmatore e quale sia la logica di base della programmazione. Ma non bisogna dimenticare che bisogna continuare ad imparare tutta la vita per tenersi al passo con le nuove tendenze in fatto di linguaggio e di tecnologia.

Next section
III. Comprendere ed usare il software installato sui nostri dispositivi