Casa / Browser / Linguaggio di programmazione C. Panoramica delle principali attività dei compilatori CC SIT e degli ambienti di sviluppo

Linguaggio di programmazione C. Panoramica delle principali attività dei compilatori CC SIT e degli ambienti di sviluppo

corso pratico

Cos'è?

Un tempo (1991-1992), scegliendo una lingua Essendo il principale linguaggio di programmazione per le lezioni di matematica, l'autore ha dovuto affrontare il problema della mancanza di normali libri di testo che potessero essere consigliati agli scolari. Ciò lo costrinse a scrivere i suoi appunti di lezione, come si potrebbe chiamare "Corso pratico di programmazione in » - includeva le informazioni di cui l'autore aveva realmente bisogno nella pratica. Molti anni di esperienza nell'insegnamento hanno dimostrato che gli appunti sono davvero richiesti e sono ampiamente utilizzati sia dagli scolari che dai laureati.

L'ambiente di sviluppo è una shell Dev-C++ gratuita e open source che include il compilatore GCC.

L'autore sarà grato per feedback e critiche costruttive riguardanti il ​​contenuto e la progettazione di questi materiali. Se noti un errore o hai suggerimenti, commenti, reclami, richieste o dichiarazioni, scrivi.

Contratto di licenza

  1. 1) pubblicazione di materiali in qualsiasi forma, inclusa la pubblicazione di materiali su altri siti Web;
  2. 2) distribuzione di materiali incompleti o alterati;
  3. 3) inclusione di materiali in raccolte su qualsiasi supporto;
  4. 4) ottenere vantaggi commerciali dalla vendita o altro utilizzo dei materiali.

Il download dei materiali implica l'accettazione dei termini del presente contratto di licenza.

Scaricamento

L'abstract è distribuito liberamente nel formato PDF. Per la visualizzazione richiede il programma gratuito Acrobat Reader. Lo schema del corso è diviso in 4 parti:

  1. Introduzione alla programmazione in C (860 Kb) 29.03.2014
    Studio dei costrutti linguistici di base e delle tecniche per la scrittura di programmi.
  2. Archiviazione ed elaborazione dati (792 KB) 21.11.2013
    Linguaggio C: array, matrici, strutture, stringhe di caratteri, strutture, ricorsione.
  3. Sviluppo programmi in linguaggio C (937 Kb) 01.03.2014
    Tecniche di progettazione di programmi, programmazione strutturata, algoritmi interi, metodi numerici, modellazione.
  4. Strutture dati dinamiche in linguaggio C (666 KB) 11.06.2009
    Liste, pile, alberi, grafici.

Presentazioni

Insegnanti e studenti possono trarre beneficio da presentazioni basate su questo riassunto. Possono essere scaricati nella pagina Presentazioni.

Metodologia

L'obiettivo principale è introdurre gli studenti alle strutture di base della lingua : cicli, istruzioni condizionali, procedure. Lo studio delle sezioni legate alla grafica e all'animazione ha molto successo.

8 ° grado

Il programma si compone delle seguenti sezioni (tra parentesi è indicata parte della sintesi): Array (II), Lavorare con file (II), Stringhe di caratteri (II), Rotazione di oggetti (III), Modellazione (III). Particolare attenzione è rivolta allo studio degli algoritmi per lavorare con gli array, inclusa la ricerca, l'ordinamento, ecc. Viene fornito il concetto di efficacia dei metodi computazionali.

9° grado

L'obiettivo principale è lo studio metodi di sviluppo del software nella lingua . Gli studenti completano un compito individuale, durante il quale imparano a costruire grafici sullo schermo, acquisiscono familiarità con le trasformazioni dei sistemi di coordinate, studiano i metodi per risolvere equazioni, acquisiscono familiarità con i metodi numerici e imparano a progettare correttamente i programmi (Sezioni 1-2 della Parte III). Uno dei compiti è dedicato all'uso Metodo Montecarlo calcolare l'area di una figura complessa. Dalle nuove sezioni studiamo anche Matrici (II), Array di stringhe di caratteri (II). Viene introdotto il concetto puntatori e con essi vengono studiate le operazioni più semplici.

Grado 10

Apprendimento delle lingue raggiunge un livello più serio. Temi principali - Gestione della memoria (II), Ricorsione (II), Strutture (II). Si prevede di studiare il Pascal come secondo linguaggio di programmazione. Da questo momento in poi, gli algoritmi nelle lezioni teoriche vengono scritti alternativamente in due lingue.

Grado 11

Non sono tanto le caratteristiche delle lingue ad essere studiate quanto gli algoritmi. Sezioni principali - Metodi numerici (III), Modellazione (III), Strutture dati dinamiche (IV).

Comprendi come funzionano i loop. I cicli sono uno degli aspetti più importanti della programmazione perché consentono di eseguire ripetutamente singoli blocchi di codice finché non viene soddisfatta una determinata condizione. Ciò semplifica la scrittura di azioni ripetitive a livello di codice e ti evita di dover scrivere nuove condizioni ogni volta che vuoi che il programma faccia qualcosa.

  • Esistono tre tipi principali di cicli: FOR, WHILE e DO...WHILE.
  • Utilizzare un ciclo FOR. Questo è il più popolare e utile dei cicli. Continua ad eseguire la funzione data finché non vengono soddisfatte le condizioni impostate in FOR. I cicli FOR richiedono che siano specificate tre condizioni: la variabile da inizializzare, la condizione da soddisfare e come aggiornare il valore della variabile. Se non sono necessarie tutte e tre queste condizioni, è necessario lasciare al loro posto uno spazio con un punto e virgola, nel qual caso il ciclo durerà per sempre.

    #includere int main () ( int y ; for ( y = 0 ; y< 15 ; y ++ ){ printf ( "%d \n " , y ); } getchar (); }

    • Nel programma precedente, il valore iniziale della variabile y è zero e il ciclo continua finché il valore della variabile rimane inferiore a 15. Ogni volta che viene visualizzato un nuovo valore di y, viene incrementato di uno e il ciclo si ripete. Non appena la variabile y sarà uguale a 15, il ciclo terminerà.
  • Usa un ciclo WHILE. I cicli WHILE sono più semplici dei cicli FOR. Impostano solo una condizione e il ciclo viene eseguito finché questa condizione viene soddisfatta. Qui non è necessario inizializzare o aggiornare la variabile, ma questo può essere fatto nella parte principale del codice del ciclo stesso.

    #includere int main() ( int y ; while ( y<= 15 ){ printf ( "%d \n " , y ); y ++ ; } getchar (); }

    • Il comando y++ aggiunge uno al valore della variabile y ogni volta che viene eseguito il ciclo. Non appena la variabile y diventa 16 (nota che il ciclo deve essere eseguito finché la variabile minore o uguale a 15), il ciclo si ferma.
  • Applicare un ciclo FARE...MENTRE. Questo ciclo è molto utile nei casi in cui le operazioni del ciclo devono essere eseguite almeno una volta. Nei cicli FOR e WHILE la condizione viene verificata all'inizio, ovvero se si ottiene un risultato falso, l'operazione specificata dalla condizione viene saltata e non eseguita. Il ciclo DO...WHILE verifica le condizioni alla fine, il che consente l'esecuzione del ciclo almeno una volta.

    #includere int main () ( int y ; y = 5 ; do ( printf ("Il ciclo è in esecuzione! \n " ) ) while ( y != 5 ); getchar ( ; )

    • Questo ciclo visualizzerà il messaggio previsto anche se il test della condizione fallisce. La variabile y è impostata su cinque e il ciclo deve ripetersi quando la variabile non è uguale a cinque, quindi il ciclo viene chiuso. Il messaggio viene visualizzato sullo schermo una volta, poiché la condizione viene verificata solo alla fine.
    • La clausola WHILE in un ciclo DO...WHILE deve terminare con un punto e virgola. Questo è l'unico ciclo che richiede un punto e virgola alla fine.
  • Consiglio intersettoriale per la standardizzazione delle tecnologie dell'informazione del comitato RSPP per la regolamentazione tecnica, la standardizzazione e la valutazione della conformità.

    Accedi al vecchio sito web TK-MTK-22

    Si prega di scusare eventuali errori temporanei. Il portale è in fase di sviluppo, quindi alcune sezioni sono temporaneamente bloccate.

    Il Centro di competenza nel campo della standardizzazione delle tecnologie dell'informazione (CC SIT) è stato creato nell'interesse dello sviluppo delle capacità del Consiglio intersettoriale del Comitato RSPP per la regolamentazione tecnica, la standardizzazione e la valutazione della conformità (di seguito denominato Consiglio). La pratica ha dimostrato che il funzionamento del Consiglio solo come organo consultivo non produce più l’effetto desiderato di fronte ai nuovi compiti.

    Con l’adozione e l’avvio dell’attuazione del programma di economia digitale, nuove sfide hanno cominciato a sorgere nel campo della standardizzazione informatica. Innanzitutto è stata rilevata la mancanza di informazioni a disposizione degli specialisti in questo settore, molte decisioni non sono sufficientemente giustificate da un punto di vista scientifico, sono obsolete o prive dei regolamenti e degli atti legislativi necessari ed è diventata evidente la mancanza di personale specializzato . E, soprattutto, sono necessarie soluzioni interdipartimentali o intersettoriali nel campo della creazione di uno spazio informativo unificato, che dovrebbe diventare un fattore significativo nella transizione verso una nuova struttura tecnologica.

    Lo status del Consiglio come organizzazione pubblica ha cessato di soddisfare i compiti emergenti ed è nata la necessità di creare una struttura con lo status di persona giuridica, alla quale potrebbero essere affidati i nuovi compiti derivanti nel campo della standardizzazione informatica.

    Revisione delle principali attività del Comitato Centrale del SIT

    Standardizzazione

    Quello che è uno standard IT - dovrebbe diventare uno standard IT - non dovrebbe essere uno standard IT

    Il C è un linguaggio di programmazione abbastanza “antico”; è stato formato all’inizio degli anni ’70. Nonostante ciò, il C è un linguaggio vivo nel senso che viene utilizzato attivamente oggi. È stato inventato, utilizzato e viene utilizzato per scrivere parti significative del codice di programma dei sistemi operativi simili a Unix. Viene utilizzato anche per scrivere utilità, compilatori e, meno comunemente, programmi applicativi. Ecco perché il C è chiamato linguaggio di programmazione di sistema.

    La sua sopravvivenza può essere spiegata dal fatto che i principi operativi dei sistemi operativi sono relativamente universali; non sono soggetti al progresso e alla diversità che possono essere osservati nell’ambiente dei software desktop e mobili e delle applicazioni Web. Il C non è un linguaggio di altissimo livello, è più vicino all'architettura del computer. Di conseguenza, i programmi C sono compatti e veloci.

    Il C non supporta la programmazione orientata agli oggetti. Il supporto OOP è implementato in C++. Sebbene quest'ultimo derivi dal linguaggio C, non ne è una “continuazione”, ma è un linguaggio separato che può essere appreso senza conoscere il C. Tuttavia, imparare il C è utile prima di conoscere il suo “fratello minore evoluto”, perché La sintassi dei linguaggi è simile, C non sovraccarica il cervello di un programmatore alle prime armi con superpoteri e gli insegna a comprendere l'essenza di ciò che sta accadendo.

    Il C è utile per iniziare a programmare per la prima volta? Se non stai studiando in un'università in una specialità legata all'informatica, allora no. Il C richiede la comprensione dell'organizzazione e del funzionamento dell'hardware, in particolare della memoria. Molto di questo viene fatto con i puntatori, che svolgono un ruolo chiave; questo argomento è piuttosto difficile da capire e di solito non viene studiato a scuola.

    Naturalmente è possibile apprendere le basi della programmazione in C senza dover imparare i puntatori. Tuttavia, una persona penserà di conoscere C senza saperne molto nella sostanza. Il linguaggio C è stato creato da programmatori professionisti esperti di hardware per scrivere il sistema operativo UNIX. Non era inteso come lingua per insegnare ai principianti.

    Ambienti e compilatori per la programmazione in C

    Se stai utilizzando una delle distribuzioni GNU/Linux, andrà bene qualsiasi editor di testo con evidenziazione della sintassi, avrai bisogno anche di GCC e di un terminale.

    Esistono editor per programmatori che includono vari componenti aggiuntivi, tra cui un terminale, la navigazione nelle directory, ecc. Ad esempio Geany o Atom.

    C è un linguaggio di programmazione compilato. In GNU/Linux, per ottenere file eseguibili, viene utilizzato GCC, un insieme di compilatori, incluso un compilatore per C. Per ottenere un file eseguibile da un file sorgente (di solito tali file hanno l'estensione *.c), è necessario eseguire un comando nel terminale che assomigli a questo:

    gcc -o ciao ciao.c

    Dove gcc è un comando che avvia un programma che esegue la compilazione e altre azioni; -o – un interruttore che indica che specifichiamo manualmente il nome del file eseguibile; ciao – nome del file eseguibile risultante; ciao.c è il nome del file del codice sorgente. Il nome del file eseguibile può essere omesso:

    gcc ciao.c

    In questo caso il file eseguibile avrà il nome predefinito a.out.

    Windows ha il proprio set di compilatori: MinGW. Può essere utilizzato da solo, ma è incluso nel semplice ambiente di sviluppo Dev-C++, che può essere una buona scelta per imparare a programmare in C e C++.

    Durante il salvataggio selezionare il tipo di file "File sorgente C (*.c)". Il programma viene compilato e avviato premendo il tasto F9. Dopo l'esecuzione, il programma si chiude immediatamente e il risultato non può essere visto. Per evitare che ciò accada, scrivi due righe aggiuntive: #include e prendi(). (Questo potrebbe non essere rilevante per una versione più recente di Dev-C++.)

    "Ciao mondo" in GNU/Linux:

    #includere \N") ; }

    "Ciao mondo" su Windows:

    #includere #includere int main() (printf("Ciao mondo \N") ; getch(); )

    D'altra parte, esiste un gran numero di ambienti di sviluppo multipiattaforma. Ad esempio, modulo Eclipse + CDT, KDevelop, CLion. Quest'ultimo è a pagamento, prodotto da JetBrains, leader nello sviluppo IDE, ma prevede un periodo di prova di 30 giorni, che potrebbero bastare per la formazione. CLion è più conveniente di altri IDE.

    "Ciao mondo" in C

    Utilizzando l'esempio di un semplice programma, noteremo immediatamente alcune caratteristiche del linguaggio di programmazione C.

    Nel linguaggio C la funzione main() assume il ruolo di ramo principale del programma. Questa funzione deve essere sempre presente in un programma C completo e con essa inizia l'esecuzione del programma. Tuttavia, le variabili dichiarate al suo interno non sono globali; il loro ambito si estende solo a main(). Tuttavia, nel linguaggio di programmazione C, quasi tutto il codice del programma è contenuto in una funzione e la funzione main() è quella principale e richiesta.

    Per impostazione predefinita, la funzione main() restituisce un tipo di dati int, quindi non è necessario specificare un tipo restituito. Tuttavia, in questo caso il compilatore emette un avviso.

    La funzione printf() è progettata per stampare i dati. Il suo scopo è simile alla procedura write() in Pascal e alla funzione print() in Python. La funzione printf() non si interrompe su una nuova riga dopo la stampa. Pertanto per la transizione viene utilizzato un carattere speciale, indicato dalla combinazione \n. Le espressioni C complete sono separate da punto e virgola.

    In C, le funzioni di I/O non fanno parte del linguaggio. Ad esempio, in Python non abbiamo bisogno di importare alcun modulo per utilizzare le funzioni print() e input(). In C, non possiamo semplicemente chiamare la funzione printf(), perché C stesso semplicemente non ce l'ha. Questa funzione, così come molte altre, può essere abilitata utilizzando il file di intestazione stdio.h. Questo è proprio il motivo per cui la riga è scritta all'inizio del programma #includere . Include è tradotto dall'inglese come "accendi" e stdio è l'abbreviazione di "input-output standard".

    I file header (terminano con *.h) solitamente contengono dichiarazioni di determinate funzioni. Una dichiarazione è semplicemente la descrizione di una funzione: quali parametri accetta e cosa restituisce. Il codice funzione stesso (definizione) non si trova nel file header, ma nelle librerie (altri file), che potrebbero essere già compilati e posizionati nelle directory di sistema. Prima della compilazione di un programma, viene avviato il preprocessore del linguaggio C. Esso include tra l'altro all'inizio del file di programma il contenuto dei file header in esso specificati.

    Lavoro pratico

    Commenta la prima riga del codice HelloWorld. Prova a compilare il programma. Sei riuscito a ottenere il file eseguibile? Che avvertimento ha dato il compilatore?

    1 // - commento di una riga in linguaggio C; /* … */ - commento su più righe in linguaggio C.

    Peculiarità

    Revisione

    Il linguaggio di programmazione C è caratterizzato dal minimalismo. Gli autori del linguaggio volevano che i programmi in esso contenuti fossero facilmente compilabili utilizzando un compilatore a passaggio singolo, dopo la compilazione, ogni componente elementare del programma corrispondeva a un numero molto piccolo di istruzioni macchina e l'uso degli elementi di base del linguaggio non lo faceva coinvolgere una libreria runtime. Un compilatore a passaggio singolo compila un programma senza tornare al testo già compilato. Pertanto l'utilizzo di una funzione deve essere preceduto dalla sua dichiarazione. Il codice C può essere facilmente scritto a un basso livello di astrazione, quasi come il linguaggio assembly. C è talvolta chiamato "assemblatore universale" o "assemblatore di alto livello", che riflette le differenze nei linguaggi assembly per diverse piattaforme e l'unità dello standard C, il cui codice può essere compilato senza modifiche su quasi tutti i computer modello. Il C è spesso chiamato linguaggio livello medio o anche basso livello, considerando quanto si avvicina ai dispositivi reali.

    I compilatori C sono relativamente facili da sviluppare a causa del livello relativamente basso del linguaggio e di un insieme modesto di elementi. Pertanto, la lingua è disponibile su un'ampia varietà di piattaforme (forse più piattaforme di qualsiasi altra lingua esistente). Inoltre, nonostante la sua natura di basso livello, il linguaggio consente di creare programmi portabili e supporta il programmatore in questo. I programmi conformi a uno standard linguistico possono essere compilati su un'ampia varietà di computer.

    Programma "Ciao mondo!"

    Questo semplice programma, apparso nella prima edizione di The C Programming Language di Kernighan e Ritchie, è solitamente il primo programma nella maggior parte dei libri di testo in C. Digita il messaggio "Hello World!" sul dispositivo di output standard (che solitamente è un monitor (display), ma può anche essere un file, un dispositivo o un'area di memoria, a seconda di come il dispositivo di output standard si riflette su una determinata piattaforma).

    Main() ( printf ("Ciao mondo! \N") ; }

    Sebbene questo programma possa essere compilato correttamente sulla maggior parte dei compilatori moderni, genera diversi avvisi sui compilatori C ANSI. Inoltre, questo codice non verrà compilato se il compilatore segue rigorosamente lo standard

    #includere int main(void) ( printf ("Ciao mondo! \N") ; ritorno 0; )

    La prima riga del programma contiene la direttiva del preprocessore #include; quando la incontra, il compilatore la sostituisce con il testo completo del file a cui fa riferimento. In questo caso, questa riga verrà sostituita dal file di intestazione standard

    La riga successiva è la dichiarazione di una funzione chiamata main. Questa funzione nel programma C è speciale poiché viene eseguita per prima all'avvio del programma, cioè funge da cosiddetta punto di ingresso al programma.

    Le parentesi graffe dopo la funzione principale ne indicano la definizione. La parola int dice che la funzione principale restituisce (calcola) un numero intero. La parola void indica che la funzione principale non richiede parametri o argomenti dal chiamante.

    La riga successiva "chiama" o esegue la funzione stdio.h e contiene informazioni che descrivono come dovrebbe essere chiamata la funzione. In questo esempio, a questa funzione viene passato un singolo argomento, contenente la stringa di testo “Hello, World!\n” . La sequenza \n viene tradotta in un carattere di “nuova riga” che, quando visualizzato, denota corrispondentemente un'interruzione di riga. La funzione printf restituisce un valore int, che in questo esempio viene completamente scartato.

    L'istruzione return fa sì che il programma interrompa l'esecuzione della funzione data (main in questo caso), restituendo alla funzione chiamante il valore specificato dopo la parola chiave return (0 in questo caso). Poiché la funzione corrente è main , il chiamante è colui che ha avviato il programma. L'ultima parentesi graffa segna la fine della definizione della funzione principale.

    Commenti

    Il testo racchiuso tra i simboli /* e */ in questo ordine viene completamente ignorato dal compilatore. I compilatori compatibili con C99 consentono anche commenti che iniziano con // e terminano con una nuova riga.

    Tipi

    Archivio dati

    Una delle funzioni più importanti di qualsiasi linguaggio di programmazione è fornire funzionalità per la gestione della memoria e degli oggetti in essa archiviati.

    Esistono tre modi diversi per allocare memoria per gli oggetti in C:

    • Allocazione di memoria statica: lo spazio per gli oggetti viene creato nell'area di memorizzazione dei dati del codice del programma al momento della compilazione; la vita di tali oggetti coincide con la vita di questo codice.
    • Allocazione automatica della memoria: gli oggetti possono essere temporaneamente memorizzati nello stack; questa memoria viene poi automaticamente liberata e può essere riutilizzata dopo che il programma esce dal blocco utilizzandola.
    • Allocazione dinamica della memoria: Durante l'esecuzione del programma è possibile richiedere blocchi di memoria della dimensione desiderata utilizzando le funzioni di libreria malloc, realloc e liberare un'area di memoria denominata heap. Questi blocchi vengono liberati e possono essere riutilizzati dopo aver richiamato su di essi la funzione free.

    Tutti e tre questi metodi di archiviazione dei dati sono adatti a diverse situazioni e presentano vantaggi e svantaggi. Ad esempio, l'allocazione statica della memoria non ha alcun sovraccarico di allocazione, l'allocazione automatica ha solo un piccolo sovraccarico di allocazione, ma l'allocazione dinamica ha un sovraccarico potenzialmente elevato sia nell'allocazione che nella deallocazione. D'altra parte, la memoria dello stack è molto più limitata della memoria statica o dell'heap. È possibile utilizzare solo la memoria dinamica nei casi in cui la dimensione degli oggetti utilizzati non è nota in anticipo. La maggior parte dei programmi C fa un uso intensivo di tutti e tre questi metodi.

    Ove possibile, si preferisce l'allocazione della memoria automatica o statica perché questo metodo di archiviazione degli oggetti è controllato dal compilatore, che libera il programmatore dal fastidio di allocare e liberare memoria manualmente, che di solito è fonte di errori di programma difficili da trovare. Sfortunatamente, molte strutture dati hanno dimensioni variabili in fase di esecuzione, quindi poiché le aree allocate automaticamente e staticamente devono avere una dimensione fissa nota in fase di compilazione, è molto comune utilizzare l'allocazione dinamica. Gli array di dimensioni variabili sono l'esempio più comune di questo tipo di utilizzo della memoria.

    Insieme di simboli utilizzati

    Il linguaggio C è stato creato dopo l'introduzione dello standard Fortran; Lisp e Cobol usavano solo parentesi (), ma C ha parentesi (), quadrate e ricci (). Inoltre, il C distingue tra lettere maiuscole e minuscole, mentre le lingue più antiche utilizzavano solo lettere maiuscole.

    I problemi

    Molti elementi C sono potenzialmente pericolosi e le conseguenze di un uso improprio di questi elementi sono spesso imprevedibili. Kernighan dice: " C è uno strumento estremamente affilato: può essere utilizzato sia per creare un programma elegante che per creare un pasticcio sanguinoso" A causa del livello relativamente basso del linguaggio, molti abusi di elementi pericolosi non sono e non possono essere rilevati né in fase di compilazione né in fase di esecuzione. Ciò porta spesso a un comportamento imprevedibile del programma. A volte, a causa dell'uso analfabeta degli elementi linguistici, compaiono vulnerabilità nella sicurezza. Va notato che l'uso di molti di questi elementi può essere evitato.

    La fonte di errore più comune è l'accesso a un elemento dell'array inesistente. Sebbene C supporti direttamente gli array statici, non dispone di controlli dell'indice degli array (controlli dei limiti). Ad esempio, è possibile scrivere sul sesto elemento di un array di cinque elementi, il che, naturalmente, porterà a risultati imprevedibili. Un caso speciale di tale errore è chiamato errore di overflow del buffer. Questi tipi di errori portano alla maggior parte dei problemi di sicurezza.

    Un'altra potenziale fonte di situazioni pericolose è il meccanismo del puntatore. Un puntatore può fare riferimento a qualsiasi oggetto in memoria, incluso il codice del programma eseguibile, e un uso errato dei puntatori può produrre effetti imprevedibili e portare a conseguenze catastrofiche. Ad esempio, un puntatore potrebbe non essere inizializzato o, a seguito di operazioni aritmetiche errate, puntare a una posizione di memoria arbitraria; su alcune piattaforme, lavorare con un puntatore di questo tipo può causare l'arresto hardware del programma; su piattaforme non protette, ciò può portare alla corruzione di dati arbitrari in memoria, e questa corruzione può manifestarsi nei momenti più arbitrari e molto più tardi rispetto al momento dell'attivazione. corruzione. Inoltre, l'area della memoria dinamica a cui si riferisce il puntatore può essere liberata (e anche assegnata successivamente a un altro oggetto) - tali puntatori sono chiamati "pendenti". Oppure, al contrario, dopo aver manipolato i puntatori a un'area di memoria dinamica, potrebbero non rimanere più riferimenti e quindi quest'area, chiamata "spazzatura", non verrà mai liberata, il che può portare a "perdite di memoria" nel programma. Altri linguaggi cercano di risolvere problemi simili introducendo tipi di riferimento più restrittivi.

    Un altro problema è che gli oggetti creati automaticamente e dinamicamente non vengono inizializzati e potrebbero contenere valori rimasti in memoria da oggetti precedentemente eliminati. Questo valore è del tutto imprevedibile, cambia da una macchina all'altra, da esecuzione a esecuzione, da chiamata di funzione a chiamata. Se un programma utilizza tale valore, il risultato sarà imprevedibile e potrebbe non apparire immediatamente. I compilatori moderni tentano di diagnosticare questo problema mediante l'analisi del codice sorgente, sebbene in generale ciò non possa essere risolto mediante un'analisi statica.

    Un altro problema comune è che la memoria non può essere riutilizzata finché non viene liberata dal programmatore utilizzando la funzione free(). Di conseguenza, il programmatore potrebbe dimenticarsi accidentalmente di liberare questa memoria, ma continuare ad allocarla, occupando sempre più spazio. Questo è indicato dal termine perdita di memoria. Al contrario, è possibile liberare la memoria troppo presto ma continuare ad utilizzarla. Poiché il sistema di allocazione può utilizzare la memoria liberata in modo diverso, ciò porta a conseguenze imprevedibili. Questi problemi vengono risolti nelle lingue raccolte dai rifiuti. D'altra parte, se la memoria è allocata in una funzione e deve essere liberata dopo l'uscita dalla funzione, questo problema viene risolto chiamando automaticamente i distruttori in C++ o utilizzando array locali utilizzando le estensioni C99.

    Anche le funzioni con argomenti variabili sono una potenziale fonte di problemi. A differenza delle funzioni ordinarie che hanno un prototipo, lo standard non regolamenta il test delle funzioni con un numero variabile di argomenti. Se viene passato il tipo di dati errato, si verificano risultati imprevedibili, se non fatali. Ad esempio, la famiglia di funzioni printf della libreria C Standard, utilizzata per generare testo formattato per l'output, è ben nota per la sua interfaccia con argomenti variabili potenzialmente pericolosa, che è descritta da una stringa di formato. Il controllo del tipo nelle funzioni variadiche è responsabilità di ogni singola implementazione della funzione variadica, ma molti compilatori moderni controllano specificamente i tipi in ogni chiamata printf, generando avvisi quando l'elenco degli argomenti non corrisponde alla stringa di formato. Va notato che è impossibile controllare staticamente anche tutte le chiamate alla funzione printf, poiché la stringa di formato può essere creata dinamicamente nel programma, quindi di regola il compilatore non esegue alcun controllo per altre funzioni con un numero variabile di argomenti.

    Per aiutare i programmatori C a risolvere questi e molti altri problemi, sono stati creati un gran numero di strumenti separati dai compilatori. Tali strumenti includono programmi per il controllo aggiuntivo del codice sorgente e il rilevamento di errori comuni, nonché librerie che forniscono funzioni aggiuntive non incluse nello standard del linguaggio, come il controllo dei limiti dell'array o una forma limitata di garbage collection.

    Storia

    Primi sviluppi

    Il linguaggio di programmazione C è stato sviluppato presso i Bell Labs tra il 1973 e il 1973. Secondo Ritchie, il periodo più attivo di creatività si è verificato nel 1972. La lingua veniva chiamata "C" (C è la terza lettera dell'alfabeto latino) perché molte delle sue caratteristiche derivano dall'antica lingua "B" (B è la seconda lettera dell'alfabeto latino). Esistono diverse versioni dell'origine del nome Bi. Ken Thompson indica un linguaggio di programmazione

    Esistono diverse leggende sulle ragioni dello sviluppo del C e sulla sua relazione con il sistema operativo, ad esempio con i display grafici;

  • alcuni compilatori non aderiscono per impostazione predefinita allo standard ANSI C o al suo successore; O
  • sono progettati per ospitare una dimensione specifica di determinati tipi di dati o un modo specifico di archiviare tali dati in memoria per una piattaforma specifica.
  • C99

    articolo principale: Nel 1995 è stata apportata la Prima Modifica Normativa allo standard C, ma quasi nessuno lo ha riconosciuto). Tuttavia, alla fine degli anni ’90 lo standard venne rivisto, portando alla pubblicazione ISO9899:1999 nel 1999 . Questo standard è solitamente chiamato "C99". Nel marzo 2000 è stato adottato e adattato dall'ANSI.

    Ecco alcune nuove funzionalità di C99:

    • funzioni inline (inline);
    • nessuna restrizione sulla dichiarazione delle variabili locali (come in C++);
    • nuovi tipi di dati come long long int (per facilitare la transizione dai numeri a 32 a 64 bit), un tipo di dati booleano esplicito e un tipo complesso per rappresentare numeri complessi;
    • array di lunghezza variabile;
    • supporto per puntatori limitati (restrict);
    • inizializzazione con nome di strutture: struct ( int x, y, z; ) point = ( .y=10, .z=20, .x=30 );
    • supporto per commenti a riga singola che iniziano con // , presi in prestito dal C++ (molti compilatori C li supportavano in precedenza come aggiunta);
    • diverse nuove funzioni di libreria come snprintf;
    • diversi nuovi file di intestazione, come stdint.h.

    L'interesse nel supportare le nuove funzionalità del C99 è attualmente contrastante. Mentre GCC, il compilatore C di Sun Microsystems e molti altri compilatori attualmente supportano la maggior parte delle nuove funzionalità C99, i compilatori di Microsoft no, e le due società non sembrano aggiungerle.

    Connessione con C++

    Priorità delle operazioni in C

    Le operazioni sono elencate di seguito in ordine decrescente di priorità. Le operazioni elencate sulla stessa riga hanno la stessa priorità. Le operazioni contrassegnate da R->L sono associative a destra (ovvero, quando si combinano operazioni di uguale priorità senza parentesi, vengono valutate da destra a sinistra; tuttavia, l'ordine in cui vengono valutati gli argomenti della maggior parte delle operazioni non è specificato e dipende dalle implementazioni ):

    Operazioni suffisse () . -> ++ --
    Operazioni unarie (R->L) ++ -- & * + - ~ ! dimensione(tipo)
    Moltiplicativo * / %
    Additivo + -
    Taglio << >>
    Confronto delle operazioni < > <= >=
    Operazioni di test di uguaglianza == !=
    Bit per bit & ^ |
    rompicapo && ||
    Operazione condizionata (R->L) ?:
    Operazioni di assegnazione (R->L) = *= /= %= += -= <<= >>= &= ^= |=
    Calcolo sequenziale ,

    Famosi compilatori C

    • OpenWatcom

    Compilatori per linguaggi e piattaforme dinamici

    A volte, per trasferire alcune librerie, funzioni e strumenti scritti in C in un altro ambiente, è necessario compilare il codice C in un linguaggio di livello superiore o nel codice della macchina virtuale progettato per tale linguaggio.

    A questi scopi sono destinati i seguenti progetti:

    • Alchemy è un compilatore C/C++ per applicazioni Flash e Adobe AIR.
    • AMPC - Compilatore C per macchina virtuale

      Appunti

      Guarda anche

      • Cyclone (linguaggio di programmazione) - un dialetto sicuro del linguaggio C
      • Categoria:Compilatori C

      Collegamenti

      • Home ufficiale ISO/IEC JTC1/SC22/WG14 (inglese) . - Pagina ufficiale del gruppo di lavoro internazionale sulla standardizzazione del linguaggio di programmazione C. Estratto il 20 febbraio 2009.