Compilatori GNU in Linux: gcc e g++



Похожие документы
Introduzione a GCC: GNU Compiler Collection

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014

Codifica: dal diagramma a blocchi al linguaggio C++

Lezione 10: Librerie e compilazione separata

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

NOZIONI BASE PER ESERCITAZIONI


INTRODUZIONE, LINGUAGGIO, HANDS ON. Giuseppe Cirillo

Corso di Informatica

Visualizzazione grafica. dell'output di un programma con GNUplot

Introduzione al Linguaggio C

Linguaggio C. Fondamenti. Struttura di un programma.

Introduzione a Dev-C++

Corso di Laurea in Matematica. Seminario C/C++ Lorenzo Dusty Costa. Università degli Studi di Milano Dipartimento di Matematica

ZZZ01 Esercizi Vari. Esercizi per preparazione alla prova pratica di laboratorio

Funzioni in C. Violetta Lonati

COMPILAZIONE DI UN APPLICAZIONE. 1) Compilare il file (o i file se più d uno) che contengono il testo del programma. compilatore

FASE DEBUGGING: Compiler Linker. controllando che la voce Genera le informazioni per il debug cioè. "Generate debugging information"

RISOLUTORE AUTOMATICO PER SUDOKU

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

Modulo. Programmiamo in Pascal. Unità didattiche COSA IMPAREREMO...

Makefile. Un target in generale e' un file. Usando.PHONY: target specifichiamo a make che il target non e' un file

Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE

Richiamo compilatore FORTRAN 77

Programmare in Java. Olga Scotti

Header. Unità 9. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it

Corso di Informatica (Programmazione) Lezione 6 (31 ottobre 2008)

DevC++ vers Manuale d uso

GDB. The GNU Debugger

Dynamic Linking. Introduzione Creazione di una libreria dinamica Uso di una libreria dinamica

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

Introduzione alla programmazione in C

IL LINGUAGGIO C NOSTRO APPROCCIO AL C. Sempre con esempi che illustrano le caratteristiche del linguaggio. SCRIVERE ED ESEGUIRE IL PRIMO PROGRAMMA C

Concetto di Funzione e Procedura METODI in Java

Linguaggio C Compilazione, linking e preprocessor

Guida all utilizzo del compilatore lcc-win32 per creare una applicazione console

Cos'é Code::Blocks? Come Creare un progetto Come eseguire un programma Risoluzione problemi istallazione Code::Blocks Che cos è il Debug e come si usa

ToolChain: Come Generare Applicazioni in Linguaggio Macchina

Calcolare il massimo di una lista

Introduzione al Python

INSTALLAZIONE E UTILIZZO DEL COMPILATORE Code::Blocks 8.02

Il compilatore Dev-C++

Il Web Server e il protocollo HTTP

Corso di PHP. Prerequisiti. 1 - Introduzione

Dispensa YACC: generalità

Prova di Laboratorio di Programmazione

Tale attività non è descritta in questa dispensa

Il sistema operativo UNIX/Linux. Gli script di shell

ISTRUZIONI XCODE. Autore: Luca Florio (luca.florio<at>polimi.it)

Figura 1 Le Icone dei file di Excel con e senza macro.

COS È UN LINGUAGGIO? LINGUAGGI DI ALTO LIVELLO LA NOZIONE DI LINGUAGGIO LINGUAGGIO & PROGRAMMA

Backup e Restore di un database PostgreSQL Sandro Fioravanti INFN-LNF

Dipartimento di Sistemi e Informatica Università degli Studi di Firenze. Dev-C++ Ing. Michele Banci 27/03/2007 1

Prova Finale a.a. 2011/2012. Laboratorio 1: Introduzione a Java e Eclipse

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Schede ADI ADP ADEM Prestazioni aggiuntive MMG. - Manuale - Data Solution Provider s.r.l.

STAMPA DI UNA PAGINA SEMPLICE

INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI

Scrivere un programma in Java

INFORMATICA 1 L. Mezzalira

Panoramica: che cosa è necessario

Esercizi di JavaScript

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Uso di librerie preconfezionate. pezzi di programma già scritto da altri; di solito ben collaudati;

Il comando Make: : uno strumento per la compilazione ed esecuzione di software applicativo. A. Murli - Cacolo Scientifico a.a.

Librerie. Laboratorio di Informatica Antonio Monteleone 28

Funzioni. Il modello console. Interfaccia in modalità console

Prima Esercitazione. Unix e GNU/Linux. GNU/Linux e linguaggio C. Stefano Monti smonti@deis.unibo.it

Joomla! 2.5:Utenti e permessi - Il wiki di Joomla.it

GESCO MOBILE per ANDROID

Esercitazioni di Programmazione I canale A-D. Alessio Malizia malizia@di.uniroma1.it

Gian Luca Marcialis studio degli algoritmi programma linguaggi LINGUAGGIO C

Eclipse - Nozioni Base

GUIDA UTENTE MONEY TRANSFER MANAGER

LINGUAGGI DI PROGRAMMAZIONE

Introduzione. Installare EMAS Logo Generator

1. RETI INFORMATICHE CORSO DI LAUREA IN INGEGNERIA INFORMATICA SPECIFICHE DI PROGETTO A.A. 2013/ Lato client

TRASMISSIONE RAPPORTO ARBITRALE IN FORMATO PDF

FAQ RISPOSTE A DOMANDE FREQUENTI

MANUALE UTENTE Fiscali Free

I TUTOR. Massimiliano Cattafi Ilaria Laurenti

Esempio di utilizzo di Excel per la gestione delle liste - Predisposizione ed allineamento -

Josef Vitanostra INFORMATICA PARTHENOPE

La Stampa Unione. Individuare la lista indirizzi per la Stampa Unione

Servizio di backup dei dati mediante sincronizzazione

Pulire IM. Non tutti sanno che solo una corretta e regolare pulizia nelle cartelle di IM, assicura un funzionamento longevo del programma

Che cos'è un modulo? pulsanti di opzione caselle di controllo caselle di riepilogo

Consiglio regionale della Toscana. Regole per il corretto funzionamento della posta elettronica

Fondamenti di Informatica T-1 CdS Ingegneria Informatica a.a. 2011/2012. Introduzione a Visual Studio 2005/2008/2010

Automatizzare i compiti ripetitivi. I file batch. File batch (1) File batch (2) Visualizzazione (2) Visualizzazione

Corso di Laboratorio 2 Primo semestre Silvia Arcelli, Luca Pasquini. 29 Settembre 2014

PROTOTIPAZIONE DI UN TRADUTTORE DA SORGENTE PLC AD ASSEMBLY DI UNA MACCHINA VIRTUALE

Транскрипт:

Un compilatore integrato C/C++ Per Linux e' disponibile un compilatore integrato C/C++: si tratta dei comandi GNU gcc e g++, rispettivamente. In realta g++ e' uno script che chiama gcc con opzioni specifiche per riconoscere il C++. Il progetto GNU Il comando gcc, GNU Compiler Collection, fa parte del progetto GNU (web server www.gnu.org). Il progetto GNU fu lanciato nel 1984 da Richard Stallman con lo scopo di sviluppare un sistema operativo di tipo Unix che fosse completamente "free" software. Cosa è GNU/Linux? Gnu Non è Unix! "GNU, che sta per "Gnu's Not Unix" (Gnu Non è Unix), è il nome del sistema software completo e Unix-compatibile che sto scrivendo per distribuirlo liberamente a chiunque lo possa utilizzare. Molti altri volontari mi stanno aiutando. Abbiamo gran necessità di contributi in tempo, denaro, programmi e macchine." [Richard Stallman, Dal manifesto GNU, http://www.gnu.org/gnu/manifesto.html Quale versione di gcc sto usando? Si può determinare la versione del compilatore invocando: gcc -v gcc version 2.96 20000731 (Red Hat Linux 7.1 2.96-98) I passi della compilazione Sia gcc che g++ processano file di input attraverso uno o piu' dei seguenti passi: 1. preprocessing 2. rimozione dei commenti 3. interpretazioni di speciali direttive per il preprocessore denotate da "#" come: #include include il contenuto di un determinato file, Es. #include <math.h> #define definisce un nome simbolico o una variabile, Es. #define MAX_ARRAY_SIZE 100 3. compilation - traduzione del codice sorgente ricevuto dal preprocessore in codice assembly 4. assembly - creazione del codice oggetto 5. linking - combinazione delle funzioni definite in altri file sorgenti o definite in librerie con la funzione main() per creare il file eseguibile. Estensioni Alcuni suffissi di moduli implicati nel processo di compilazione:.c modulo sorgente C; da preprocessare, compilare e assemblare.cc modulo sorgente C++; da preprocessare, compilare e assemblare.cpp modulo sorgente C++; da preprocessare, compilare e assemblare.h modulo per il preprocessore; di solito non nominato nella riga di commando.o modulo oggetto; da passare linker.a sono librerie statiche.so sono librerie dinamiche

L' input/output di gcc gcc accetta in input ed effettua la compilazione di codice C o C++ in un solo colpo. Consideriamo il seguente codice sorgente C: /* il codice C pippo.c */ #include <stdio.h> puts("ciao pippo!"); Per effettuare la compilazione gcc pippo.c In questo caso l'output di default è direttamente l'eseguibile a.out Di solito si specifica il nome del file di output utilizzando l' opzione -o : gcc -o prova pippo.c L'eseguibile può essere lanciato usando semplicemente./prova ciao pippo! Nota. Usare "./" puo' sembrare superfluo. In realta' si dimostra molto utile per evitare di lanciare involontariamente un programma omonimo, per esempio il comando "test"! Consideriamo ora un codice sorgente C++ analogo: // Il codice C++ pippo.cpp cout<<"ciao pippo!"<<"\n"; Questa volta compiliamo usando g++ -o prova pippo.cpp Il valore restituito al sistema Per verificare il valore restituito dal programma al sistema tramite l'istruzione di return usiamo./prova ciao pippo! echo $? 0

Passaggi intermedi di compilazione Per compilare senza effettuare il link usare g++ -c pippo.cpp In questo caso viene creato il file oggetto pippo.o. Per effettuare il link usiamo g++ -o prova pippo.o I messaggi del compilatore Il compilatore invia spesso dei messaggi all'utente. Questi messaggi si possono classificare in due famiglie: messaggi di avvertimento (warning messagges) messaggi di errore (error messagges) I messaggi di avvertimento indicano la presenza di parti di codice presumibilmente mal scritte o di problemi che potrebbero avvenire in seguito, durante l'esecuzione del programma. I messaggi di avvertimento non interrompono comunque la compilazione. I messaggi di errore invece indicano qualcosa che deve essere necessariamente corretto e causano l'interruzione della compilazione. Esempio di un codice C++ che genera un warning: // example1.cpp float multi(int a, int b) ; float a=2.5; int b=1; cout<<"a="<<a<<", b="<<b<<'\n'; cout<<"a*b="<<multi(a,b)<<'\n'; In fase di compilazione apparirà il seguente warning: example1.cpp: In function `int main ()': example1.cpp:12: warning: passing `float' for argument passing 1 of 'multi (int, int)' example1.cpp:12: warning: argument to `int' from `float' Il messaggio ci avvisa che alla linea 12 del main() e' stato passato alla funzione multi un float invece che un int. Esempio di un codice che genera un messaggio di errore: // example1.cpp float multi(int a, int b) return a*b ;

int a=2; int b=1; cout<<"a="<<a<<", b="<<b<<'\n'; cout<<"a/b="<<multi(a,b)<<'\n'; Si noti che l' istruzione di return all'interno della funzione multi non termina con il punto e virgola (;). A causa di questo grave errore la compilazione non puo' essere portata a termine: example1.cpp: In function `float multi (int, int)': example1.cpp:5: parse error before `' example1.cpp:5: warning: no return statement in function returning non-void Controlliamo i livelli di warning Per inibire tutti i messaggi di warinig usare l' opzione -w g++ -w -o prova example1.cpp Per usare il massimo livello di warning usare l' opzione -Wall g++ -Wall -o prova example1.cpp Compilare per effetture il debug Se siete intenzionati ad effettuare il debug di un programma, utilizzate sempre l'opzione -g: g++ -Wall -g -o pippo example1.cpp L' opzione -g fa in modo che il programma eseguibile contenga informazioni supplementari che permettono al debugger di collegare le istruzioni in linguaggio macchina che si trovano nell'eseguibile alle righe del codice corrispondenti nei sorgenti C/C++. Ottimizzazione Il compilatore gcc consente di utilizzare diverse opzioni per ottenere un risultato più o meno ottimizzato. L'ottimizzazione richiede una potenza elaborativa maggiore, al crescere del livello di ottimizzazione richiesto. L' opzione -On ottimizza il codice, dove n é il livello di ottimizzazione. Il massimo livello di ottimizzazione allo stato attuale é il 3, quello generalmente più usato è 2. Quando non si deve eseguire il debug é consigliato ottimizzare il codice. Opzione -O, -O1 Descrizione Ottimizzazione minima -O2 Ottimizzazione media -O3 Ottimizzazione massima -O0 Nessuna ottimizzazione Esempio di un codice chiaramente inefficiente int a=10; int b=1; int c; for (int i=0; i<1e9; i++)

c=i+a*b-a/b; Confronto dei tempi di esecuzione in funzione di livelli di ottimizzazione crescente Livello Tempo di esecuzione (secondi) O0 32.02.00 O1 05.04.00 O2 05.02.00 O3 05.02.00 Compilazione di un programma modulare Un programma modulare e' un programma spezzettato in componenti più' piccole con funzioni specifiche. La programmazione modulare è più facile da comprendere e da correggere. Nel seguito abbiamo un programma C++ composto da tre moduli: main.cpp, myfunc.cpp e myfunc.h. // main.cpp #include"myfunc.h" int a=6; int b=3; cout<<"a="<<a<<", b="<<b<<'\n'; cout<<"a/b="<<div(a,b)<<'\n'; cout<<"a*b="<<mul(a,b)<<'\n'; // myfunc.h int div(int a, int b); int mul(int a, int b); // myfunc.cpp int div(int a, int b) return a/b; ; int mul(int a, int b) ; Per compilare usiamo g++ -Wall -g -o prova main.cpp myfunc.cpp Si noti che il file myfunc.h non appare nella riga di comando, verra' incluso dal gcc in fase di precompilazione. Inclusione di librerie in fase di compilazione L'opzione -lnome_libreria compila utilizzando la libreria indicata, tenendo presente che, per questo, verrà cercato un file che inizia per lib, continua con il nome indicato e termina con.a oppure.so. Modifichiamo i moduli myfunc.h e myfunc.cpp aggiungendo la funzione pot:

// myfunc.h int div(int a, int b); int mul(int a, int b); float pot(float a, float b); // myfunc.cpp int div(int a, int b) return a/b; ; int mul(int a, int b) ; float pot(float a, float b) return pow(a,b); La compilazione però si interrompe g++ -Wall -g -o prova main.cpp myfunc.cpp myfunc.cpp: In function `float pot (float, float)': myfunc.cpp:11: `pow' undeclared (first use this function) myfunc.cpp:11: (Each undeclared identifier is reported only once for each function it appears in.) La funzione pow e' contenuta nella libreria matematica math, dobbiamo allora aggiungere l'istruzione include nel modulo : // myfunc.cpp #include<math.h> int div(int a, int b) return a/b; ; int mul(int a, int b) ; float pot(float a, float b) return pow(a,b); e compilare con un link alla libreria libm.so g++ -Wall -g -o prova main.cpp myfunc.cpp -lm Di default il compilatore esegue la ricerca della libreria nel direttorio standard /usr/lib/. Tramite l' opzione -L/nome_dir, è possibile aggiunge la directory /nome_dir alla lista di direttori in cui gcc cerca le librerie in fase di linking.