Robitex's Blog

Ideas in the web

Gli strumenti di Linux


Scarica l’articolo in PDF per la stampa

Quanto è immediato sviluppare

Improvvisamente mi sono reso conto che un sistema Linux è una formidabile collezione di strumenti informatici che molte volte sono immediatamente disponibili fin dalla prima installazione e, per di più, si tratta di software rilasciato con licenze libere e gratuite in continuo sviluppo.

Grazie ad internet, pochi minuti sono l’unica cosa che serve per attrezzare il nostro computer. Prendiamo per esempio Ubuntu che appena finita l’installazione offre già tutti i principali linguaggi di scripting come Bash, Python, Lua, Perl, Ruby, e che permette il prelievo dai repository ufficiali di potenti compilatori come gcc. Anche le altre maggiori distribuzioni non sono da meno.
Strumenti con cui siamo liberi di costruire i programmi complessi e le utility per compiti specifici, e che quindi ci mettono a disposizione direttamente l’enorme potenza elaborativa dell’informatica.

In altre parole, un sistema operativo libero offre un eccezionale kit di strumenti liberi per lo sviluppo e, viceversa, che è stato necessario scriverli per poter sviluppare liberamente.

Verificheremo ora quanto sia immediato accedere ad uno di questi strumenti.

Hello World!

E allora apriamolo il terminale per compilare ed eseguire il classico programma Ciao Mondo! in uno dei linguaggi per eccellenza che ha fatto il successo commerciale di Microsoft, Oracle e Google: il C++.

Step 0: gcc

Per installare gcc in Ubuntu date il comando (tranquilli se il compilatore è già installato il gestore di pacchetti vi dirà semplicemente se per esso sono disponibili o no aggiornamenti):

$ sudo apt-get install build-essential

Step 1: scrivere il sorgente C++

Aprite l’editor di testi che preferite per digitare il seguente codice del programma didattico per eccellenza:

#include <iostream>

int main () {
    std::cout << "Hello World!\n";
}

Salvate poi il file con il nome hello.cpp nella cartella cpp posizionata sulla Scrivania.
Diremo dopo qualche spiegazione sul codice perché vorrei concentrarmi per ora sulla procedura pratica di compilazione.

Il sorgente di Hello World! nell'editor

Il sorgente di Hello World! nell'editor

Step 2: compilazione

All’apertura del terminale la directory di lavoro è la /HOME dell’utente indicata anche con il carattere tilde ~ come potete notare nell’immagine quì sotto. Raggiungiamo la nostra directory di lavoro con il comando cd (change dir) usufruendo del completamento automatico dei nomi premendo il tasto Tab, e compiliamo il sorgente con il comando g++:

:~$ cd Scrivania
:~/Scrivania$ cd cpp
:~/Scrivania/cpp$ g++ hello.cpp -o hello

Il compilatore gcc per i programmi in C++ è chiamato appunto g++ e prende come argomenti il nome del file sorgente e il nome del programma risultante detto file oggetto per cui è individuato da quello che segue l’opzione -o.

La sequenza di compilazione ed esecuzione del programma

La sequenza di compilazione ed esecuzione del programma

Step 3: esecuzione

Il compilatore ha dunque prodotto il file oggetto che abbiamo chiamato hello. Si tratta di un file binario contenente le istruzioni eseguibili direttamente dal nostro processore. Eseguiamolo con:

:~/Scrivania/cpp$./hello

Quindi alla riga di comando basta semplicemente scrivere il nome del programma e dare un invio, considerando che il punto rappresenta la directory di lavoro (quindi ~/Scrivania/cpp). Si infatti i comandi digitati al terminale vengono ricercati per l’esecuzione in un set di directory di cui la nostra cpp non fa parte, allora è necessario dare il percorso completo del file oggetto, proprio con quel punto slash.

1.234.567 è un numero primo?

Non ho certo la pretesa di insegnare il C++, ma posso darvi alcune rapide spiegazioni commentando un esempio di programma più complesso: eseguire il test di primalità su un numero.

Si tratta di provare a dividere il numero n per tutti i suoi probabili divisori da 2 all’intero che non supera il valore della radice quadrata di n. Usiamo l’operatore modulo rappresentato dal simbolo di percentuale, che restituisce il resto della divisione intera tra due numeri naturali:

int a = 1234;
int b = 56;

int resto = a % b;

Nel precedente frammento di codice C++, si dichiarano gli interi a e b e si assegna ad una terza varibile il valore del resto della loro divisione. Se il resto è zero allora b è un divisore di a, che perciò non è un numero primo (in questo caso il resto vale 2).

Ecco il sorgente completo. Inseritelo in un file chiamato prime.cpp, compilatelo ed eseguitelo alla stesso modo degli step precedenti per conoscere se effettivamente il numero 1234567 è o non è un numero primo.

Potete anche copiare il file oggetto nella cartella ~/bin (la tilde vi ricordo rappresenta la home directory dell’utente), che è un percorso tra quelli del set di ricerca degli eseguibili. Una volta fatto, basterà digitare il nome del programma indipendentemente dalla working directory (veramente molto comodo).

#include <iostream>  // per cout
#include <cmath>     // per floor() e sqrt()

int main() {
    using namespace std;
 
    int n = 1234567;            // numero da testare
    int limit = floor(sqrt(n)); // limite superiore dei divisori
    bool isPrime = true;        // flag di uscita dal ciclo for
    int firstDiv;               // il più piccolo divisore trovato
    
    for (int i=2; i<=limit; i++){
         if (n%i==0){
              isPrime = false;
              firstDiv = i;
              break;
         }
    }
        
    if (isPrime) {
         cout << "The number " << n << " is prime!\n";
    } else {
         cout << "The number " << n << " is not prime, sorry\n";
         cout << "Divider: " << firstDiv << ".\n";
    }
}// end of program>

Le due direttive include del codice, a rigore non fanno parte del linguaggio. Indicano semplicemente che devono essere rese disponibili le funzionalità delle librerie iostream, per le operazioni standard di ingresso/uscita (ovvero input/output), e cmath, per le funzioni matematiche standard. Altra istruzione che ha a che fare con la gestione del codice è l’istruzione using namespace che inserisce i nomi di std nel namespace globale. Ciò significa che i nomi delle funzioni della libreria standard (namespace std) saranno direttamente disponibili senza che sia necessario specificarne il namespace, come invece abbiamo fatto nel primo programma, dove è stato utilizzato il qualificatore :: (la funzione cout, console output della libreria standard si scrive al completo std::cout).

Chi ha progettato il C++ ha fatto di tutto per consentire di strutturare i programmi in ogni maniera, ed il modo più scontato è quello di suddividerli in moduli funzionali. Alcuni particolari file chiamati header contengono appunto le dichiarazioni degli oggetti di un modulo, ne dichiarano in altre parole l’interfaccia, ed è questo che li rende possibili.

La sintassi del C++, che assomiglia volutamente a quella del genitore C, semplice, essenziale, è stata a sua volta ispiratrice di molti altri linguaggi successivi ed altrettanto famosi come Java e C#.

Alla prossima. Ciao.

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: