Learning GNU C | Capitoli SUCCESSIVI | ||||
Benvenuti. Lo scopo di questo libro, Learning GNU C, è insegnare, agli utenti di sistemi GNU, come scrivere software in linguaggio C. Questo testo è scritto come un tutorial per principianti, ma è così dettagliato da poter essere usato anche da programmatori esperti. Tutti i concetti fondamentali vengono esposti nei primi capitoli: i principianti dovranno leggere questi capitoli con molta cura, mentre gli utenti più esperti potranno evitarli. Tutte le informazioni utili sono qui: non è richiesta alcuna conoscenza preliminare di programmazione. Dal lettore ci si aspetta che abbia accesso ad un computer, con installato un sistema operativo GNU ( GNU/Linux ). Nonostante l'utenza di riferimento sia l'utenza GNU, il contenuto di questo manuale dovrebbe essere utile, almeno al 98%, anche agli utenti dei sistemi operativi OpenBSD ( UNIX ), FreeBSD ( Basato su BSD UNIX ) o NetBSD ( Unix-like Open Source ). Sarebbe molto utile una certa familiarità con la shell, o riga di comando, anche se, nella maggior parte dei casi, i singoli comandi verranno spiegati nel corso degli esempi pratici. Il solo software per il quale si richiede un minimo di esperienza è l'editor di testo, qualunque sia il vostro preferito. GNU Emacs è un editor particolarmente indicato per la programmazione. E' un programma sviluppato da più di vent'anni, che contiene centinaia di comandi utili. Un altro editor di testo che potete usare è GNU Nano. Alcuni programmatori preferiscono usare "vi". Se avete un editor di testo preferenziale, usate quello. Esistono anche editor grafici, scritti per la programmazione, quali Anjuta e KDevelop, ma la gran parte dei programmatori preferiscono gli editor testuali. Il contenuto di questo libro può essere suddiviso in due argomenti: il linguaggio C e le funzionalità standard rese disponibili al programmatore. Queste ultime vengono offerte dalla libreria "GNU Libc", parte integrante di ogni sistema operativo GNU. Nessuno di questi due argomenti ha una prevalenza d'uso sull'altro; nonostante ciò, il linguaggio C è trattato all'inizio del libro, mentre la libreria "GNU Libc" è trattata verso la fine. L'ordine degli argomenti è dettato dal metodo di insegnamento scelto, di tipo incrementale, in cui ogni capitolo si fonda sul precedente. Ecco il motivo per cui alcuni aspetti del linguaggio C, destinati agli utenti più esperti, si trovano verso la fine del libro. Il linguaggio C, di per se, può prendere decisioni, ripetere i comandi, memorizzare dati, eseguire operazioni matematiche. Altrettanto importante: il linguaggio C offre una serie di funzionalità extra, quali quelle offerte dalla libreria "GNU Libc". La libreria "GNU Libc" offre funzionalità quali: aprire, in lettura e scrittura, i file, cercare ed ordinare i dati, accettare input dagli utenti, stampare a video i dati, comunicare via rete, creare programmi facilmente portabili, e molto altro. Il linguaggio di programmazione C è uno standard. E' il linguaggio di programmazione dei programmatori. E' il linguaggio di programmazione standard per i sistemi operativi GNU e BSD. La gran parte di questi sistemi operativi e le applicazioni installate con i sistemi operativi è scritta in C. Il linguaggio di programmazione C è nato più di 30 anni fa, proprio per scrivere sistemi operativi ed applicazioni. Le sue dimensioni ridotte ed il suo design flessibile gli hanno permesso di evolversi parallelamente all'industria informatica. Grazie alla sua età ed alla sua popolarità, C è un linguaggio molto ben supportato. Esistono, ormai, molti software che rendono la programmazione in C molto semplice: questi software, inoltre, sono software maturi e di alta qualità. Tutto il software utilizzato in questo libro è scritto in C. GNU è un sistema operativo Unix-like completo, in sviluppo da più di venti anni. Il software GNU è noto per la sua stabilità e la sua conformità allo standard. La gran parte dei sistemi operativi GNU utilizzano Linux come kernel. Questi sistemi operativi sono noti come sistemi GNU/Linux. La più gran cosa di GNU è che l'intero sistema operativo rappresenta ciò che è noto come Software Libero ( Free Software ). Il software è Software Libero quando chiunque può, liberamente: usare il software, per qualsiasi scopo; apportare modifiche al software; condividere il software con chiunque altro; distribuire versioni modificate del software. Il software che non è Software Libero viene definito Software Proprietario. Il suo nome deriva dal fatto che una persona ne reclama la proprietà, impedendo agli altri di condividerlo e di modificarlo. Da un punto di vista etico, scrivere Software Libero è un modo di agire molto più rivolto al sociale. Il Software Libero rende più responsabili gli utenti, permettendo loro di apportare al software le modifiche desiderate ( o facendo apportare da qualcun altro quelle modifiche ). Il Software Libero permette alle persone di aiutare i loro vicini, grazie alla condivisione del software. Il software proprietario fa esattamente il contrario: rende la condivisione illegale, dicendo alla gente che dire di sì a qualcuno che chiede aiuto sia un crimine. Il Software Libero, inoltre, permette alle persone di aiutare i loro amici, grazie alla libertà di distribuire versioni migliorate del software. Il Software Libero, ancora, non discrimina le persone più povere o la gente delle nazioni in via di sviluppo. Permettendo loro tutte le libertà di cui abbiamo appena parlato, il Software Libero permette loro di usare il computer, senza dover pagare cifre impossibili per quel privilegio. Infine, passiamo ai benefici tecnici. Il Software Libero è libero da strategie di marketing. Non pone alcun limite al proprio uso, per poi costringere gli utenti ad acquistare software aggiuntivi. Ogni pezzo di GNU è progettato per essere il più utile possibile. Come programmatore, potete utilizzare gli stessi software C che vengono usati nei progetti più grandi. I programmi non liberi, solitamente, vengono distribuiti solo in codice eseguibile. Questo comporta che l'utente non possa vedere quello che succede all'interno di un programma. Al contrario, il software libero deve essere distribuito con il codice sorgente, in un formato facile da comprendere. Come programmatore, potete leggere il codice sorgente di tutti i software liberi che vorrete. Se troverete errori in un programma, potrete correggerli. Questa libertà di correggere gli errori e di aggiungere funzionalità è ciò che ha reso il software GNU così buono. Tutto il codice sorgente è disponibile per tutti. Il Software Libero cambierà il mondo. In meglio.
Un linguaggio di programmazione definisce un formato per la creazione di una lista di istruzioni da far eseguire ad un computer. Esistono tre tipi di linguaggi di programmazione: i linguaggi interpretati, i linguaggi compilati ed i linguaggi macchina. Un computer è in grado di comprendere solo il terzo di questi tre tipi di linguaggi di programmazione: i linguaggi macchina. Un linguaggio macchina è una serie di istruzioni che il processore ( CPU o Central Processing Unit ) di un computer riesce a comprendere. Tutte le istruzioni e le informazioni sono rappresentate da numeri: veloci per il computer, difficili da ricordare per gli esseri umani. Per rendere più semplice la programmazione, furono creati i linguaggi assembly. Un linguaggio assembly è un linguaggio di programmazione che prevede nomi testuali per tutti i comandi disponibili in linguaggio macchina. Questo, abbinato al fatto che i linguaggi assembly permettono al programmatore di utilizzare, all'interno del codice di programmazione, spazi e tabulazioni, ha reso i linguaggi assembly un utile strumento per una programmazione più semplice. Il codice di programmazione assembly viene, poi, passato ad un software, l'assembler, che lo traduce nel linguaggio macchina accettato dalla CPU del computer in cui avverrà l'esecuzione. L'uso dei linguaggi di programmazione assembly, noti ormai come "linguaggi di seconda generazione", si diffuse rapidamente. I linguaggi assembly, però, comportavano ancora due grossi problemi. Innanzitutto, ciascuna istruzione eseguiva un solo compito elementare, quale fare l'addizione di due numeri oppure caricare in memoria un valore, rendendo la programmazione davvero noiosa. Il secondo problema, poi, era ancora più grande. I programmi scritti in assembly potevano essere eseguiti solo da un modello di CPU. Infatti, ogni CPU prevede un suo proprio linguaggio macchina, quindi, un suo proprio linguaggio assembly. La prossima sfida sarebbe stata quella di creare un linguaggio di programmazione che potesse essere tradotto nei linguaggi macchina di più CPU. Questi nuovi linguaggi di programmazione, indipendenti dalla macchina, vennero chiamati "linguaggi di terza generazione", o "linguaggi di alto livello". Disegnati per essere facili da leggere, questi nuovi linguaggi erano composti da parole inglesi, simboli matematici semplici e qualche carattere di punteggiatura, che permettevano di esprimere, in modo conciso, costrutti molto semplici: per esempio, per eseguire l'addizione di due numeri ed inviare alla memoria il risultato dell'operazione, bastava scrivere:
invece della sequenza:
Un programma, chiamato "compilatore", viene utilizzato per convertire il codice sorgente di alto livello in codice macchina. Quindi, un programma può essere scritto in linguaggio C e compilato per qualsiasi computer, visto che il compito del compilatore è proprio quello di identificare le istruzioni macchina specifiche per quella CPU. Per verificare quanto sia più facilmente leggibile il codice scritto in C, rispetto al codice scritto in Assembly, date un'occhiata al seguente programmino. Questa prima versione è scritta in linguaggio Assembly:
mentre questa seconda versione è scritta in linguaggio C:
La versione in C dovrebbe essere semplice da capire, anche senza una gran conoscenza di C. L'output dei due programmi è lo stesso: "Tax Due: 131 euro". Il codice Assembly utilizzato in questo esempio è preso dal set di istruzioni per i processori "80386", che non funzionerebbe su processori che avessero un set di istruzioni differente. Il codice sorgente scritto in C, al contrario, potrà essere compilato su un qualsiasi computer. Gli strumenti di programmazione GNU viene distribuito con un compilatore, chiamato GCC. Originariamente, GCC stava per "GNU C Compiler", ma, visto che ormai può compilare anche linguaggi diversi dal C, il suo nome è cambiato in "GNU Compiler Collection". Se volete sapere se GCC è installato nel vostro sistema, scrivete:
Naturalmente, la versione di GCC che avete installato potrebbe essere differente: "2.95.2" o "3.3.0". Se ricevete un errore, che dice "command not found", significa che non avete installato GCC. Se avete installato GNU da un CD, dovreste trovare GCC nel CD. Se non sapete come installare i programmi da un CD, chiedete ad un amico o alla persona che vi ha installato il sistema operativo GNU di farlo per voi. Introduzione al compilatore GCC Ora vediamo un piccolo esempio di codice C e come compilarlo. L'obiettivo, qui, è vedere il funzionamento di GCC: quindi, non spiegheremo ancora il codice C. Eccovi il più piccolo programma in C che GCC potrà mai compilare. Questo programma non fa nulla:
Scrivete questo codice nel vostro editor di testo e salvatelo in un file chiamato
Questo comando dovrebbe essere eseguito senza emettere alcun output. Se ricevete un messaggio di errore, verificate di avere scritto correttamente il programma. Trattandosi di otto caratteri, prenderemo per assodato che lo abbiate scritto correttamente e proseguiremo. A questo punto, dovrebbe essere apparso, nella vostra directory, un file, con nome
Questi avvisi appaiono perchè il nostro programma non è completo. Per liberarsi di questi messaggi, è necessario aggiungere due righe. Ecco, quindi, il più piccolo programma valido scritto in C:
Se compilate questo codice con l'opzione
Per eseguire il vostro programma:
Chi definisce la validità del codice C? Per voi, programmatori, il codice C valido viene definito dal compilatore. Esistono diversi dialetti C, ma, fortunatamente, essi sono davvero molto simili tra loro. Esistono, poi, altri linguaggi di programmazione che si fondano su C, quali Objective C e C++. Questi linguaggi sembrano molto simili a C, ma il loro uso è piuttosto diverso. GCC comprende molti dialetti di C, così come molti altri linguaggi ( inclusi Objective C e C++ ). "K&R" C: il linguaggio di programmazione C venne creato, tra il 1969 ed il 1973, da Dennis Ritchie. Nel 1978, Dennis Ritchie e Brian Kernighan pubblicarono un eccellente tutorial C: "The C programming language". Questo tutorial fu la prima definizione formale del linguaggio. Trattandosi del dialetto C originale, spesso viene chiamato C Tradizionale. Sfortunatamente, il libro lasciò indefiniti molto aspetti del linguaggio: questo comportò che coloro che scrivevano i compilatori dovettero prendere la decisione su come gestire questi aspetti. La conseguenza di ciò fu che alcuni pezzi di codice si comportavano in modo differente da un compilatore all'altro. Questo dialetto, oggi, non è più usato: GCC lo supporta solo per la compilazione di programmi molto vecchi. Noi lo menzioniamo solo per ragioni storiche. ISO C: nel 1983, l'American National Standards Institute ( ANSI ) creò una commissione che disegnasse uno standard più preciso e risolvesse quelle poche lacune presenti nel linguaggio. Nel 1989, lo standard era pronto e veniva accettato dalla International Standards Organisation ( ISO ). Questo nuovo dialetto venne conosciuto come "C89". Viene anche chiamato "ISO C" o "ANSI C". GCC è uno dei compilatori meglio aderenti a questo standard. C99: La commissione per l'ANSI C si incontra, molto raramente, per aggiornare lo standard. L'ultimo aggiornamento risale al 1999 ed è conosciuto come "C99". Sono pochi i compilatori che supportano C99: modificare i pezzi più importanti di software per un sistema operativo richiede tempo. Il supporto GCC a C99 è, praticamente, completo ( nel momento in cui scrivo ), ma gli sviluppatori sono ancora all'opera. GNU C: GNU C è molto simile a C89, ma contiene molte delle nuove funzionalità di C99 e qualche altra estensione. Queste estensioni furono introdotte, dagli sviluppatori, con finalità conservative, visti i problemi riscontrati, per i quali C99 non offriva alcuna soluzione adeguata. GNU C è il dialetto di default di GCC ed è il dialetto che verrà usato in questo libro. Cercheremo di segnalare l'uso delle estensioni, ma, in generale, è molto meglio affidarsi al GNU C. ISO C limiterebbe i vostri programmi al minimo comun denominatore e dovrebbe essere usato solo in casi speciali. Se preferite utilizzare un dialetto specifico, al posto del dialetto di default, è possibile farlo, utilizzando l'opzione:
seguita dal nome del dialetto. I nomi sono: c89, c99, gnu89 e gnu99. Per esempio:
"gnu89" è il valore di default attuale, ma "gnu99" diventerà il valore di default, dal momento in cui verrà completato il supporto a C99. Il cambiamento non sarà molto evidente. Le estensioni, quali quelle aggiunte da GCC, sono la principale fonte di ispirazione per i nuovi standard ISO C. Quando il gruppo di lavoro per l'ANSI C vede che molti compilatori utilizzano una estensione, verifica la necessità di quella funzionalità e, se decide che potrebbe apportare un qualche beneficio, lavorano per implementarla in una modalità standard. Alcune estensioni GCC entrano nello standard, altre no. Qui si conclude la nostra introduzione. Ora, dovreste capire bene cosa sia la programmazione. Nel prossimo capitolo, inizieremo a scrivere qualche programma di base, che fa davvero qualcosa, spiegando come funziona.
|
|||||
Learning GNU C | Disclaimer: questo è un link a contenuti ospitati su server esterni. |