Guida [VECCHIO CORSO] Corso programmazione linguaggio C - Lezione #2 : linguaggi di programmazione ( PT.2 ) e introduzione al linguaggio C

giovy2707

Utente Electrum
27 Giugno 2019
96
38
62
103
Ultima modifica:
LEZIONE X IMMAGINE.png


LEGGI QUESTO PRIMA DI CONTINUARE

Se non hai già letto le avvertenze/istruzioni presenti nella LEZIONE 1 ti invito a leggerle (puoi farlo da questo link: Lezione 1 ) , ho evitato di fare copia e incolla delle varie avvertenze/istruzioni poichè mi sembrava inutile aggiungere a ogni post tutto quel testo.

FILE ZIP DEL CORSO :


Vedi: https://drive.google.com/file/d/1sPuNna2S3b0sqmFHK448j4vKg1MVUlSM/view?usp=sharing




ATTENZIONE È PRESENTE 1 FILE NON DI MIA PROPRIETÀ

Crediti al creatore del materiale:

LOGO PYTHON - IMMAGINE 2 :
™/®Python Software Foundation, GPL <http://www.gnu.org/licenses/gpl.html>, via Wikimedia Commons

NOTA PER I LETTORI: in questa seconda lezione ci sono alcune parti che ho scritto dopo aver fatto un pò di ricerche, non sono un programmatore esperto (sono uno studente universitario), questo significa che potrebbero essere presenti alcune imprecisioni riguardo tali argomenti, non penso ci siano gravi errori , tuttavia se qualche utente più esperto di me dovesse notare qualsiasi imprecisione apprezzerei molto se me lo segnalasse nei commenti, ogni consiglio e/o segnalazione è ben accetta.

Vi ricordo che parte del post è il continuo della prima lezione
.

2.4 - Linguaggi ad alto e basso livello


Possiamo suddividere i linguaggi di programmazione anche tra:
  • Linguaggi ad alto livello
  • Linguaggi a basso livello
Vediamo di capire la differenza tra questi due tipi di linguaggio, fate finta che che in un palazzo di dieci piani ci siate voi e il vostro computer, ora immaginate di essere al 10 piano, mentre il computer si tal primo piano del palazzo:

1663761269568.png


Ora immagina che:
  • più un linguaggio si avvicina al piano 1 (quindi più si avvicina al computer) più diventa difficile da leggere e sempre più simile al linguaggio macchina (cioè il linguaggio che parla il computer, il linguaggio binario)
  • mentre più un linguaggio si avvicina al 10 piano più è semplice da leggere e più è simile al linguaggio umano.
Ebbene i linguaggi di programmazione di alto e basso livello si basano su qualcosa di simile:
  • più un linguaggio è vicino al linguaggio umano (piani alti del nostro palazzo immaginario) e più esso viene definito di livello alto.
  • più un linguaggio è vicino al linguaggio binario (piani bassi del nostro palazzo immaginario) e più esso viene definito di livello basso.

1663761462601.png


Potete facilmente notare come linguaggi di livello basso siano difficili da leggere e spesso poco comprensibili, mentre man mano che il livello si alza la sintassi diventa molto più semplice da comprendere , infatti se leggete il codice in python anche senza sapere nulla di programmazione potete facilmente comprendere cosa dice quell' istruzione, infatti c'è un sola riga che inizia con la parola inglese "print" (significa stampa) con all'interno la frase "hello world" (non bisogna essere dei geni per immaginare cosa possa mai fare).

1663761528631.png


Anche qui come nei linguaggi compilati e interpretati troviamo diversi vantaggi e svantaggi:
  • infatti i linguaggi di basso livello sono molto più prestanti (essendo di basso livello sono molto più vicini al computer e quindi il processo di traduzione per il computer è più rapido) e permettono un maggiore controllo sull'hardware, ma difficili da leggere e da scrivere (più tutti vantaggi/svantaggi dati dall'essere compilato o interpretato).

  • i linguaggi di alto livello (di solito sono sempre linguaggi interpretati) sono molto meno prestanti (essendo di alto livello sono molto più lontani dal computer e quindi il processo di traduzione per il computer è più lento)
    e permettono un minore controllo sull'hardware, ma facili da leggere e da scrivere (più tutti vantaggi/svantaggi dati dall'essere compilato o interpretato).

1663761679748.png


1663761715695.png



3 - Versioni dei linguaggi di programmazione


I linguaggi di programmazione non sono sempre uguali, essi si evolvono col tempo: le prestazioni dei linguaggi vengono migliorate, nuove funzioni aggiunte, nuove librerie standard aggiunte (se non sai cosa sono non ti preoccupare te lo spiego appena parliamo del C) ecc... .

Dopotutto se linguaggi come il C o il C++ vengono ancora usati dopo anche decine di anni dalla loro creazione non è di certo perché in origine fossero perfetti, di volta in volta sono state rilasciate nuove versioni dei vari linguaggi per tenerli a passo con i tempi e per fare in modo che si adeguassero ai continui cambiamenti che spesso avvengono nel mondo dell'hardware degli elaboratori e nel mondo dell'informatica in generale.

Per darti un idea:
  • Linguaggio C
    • Nascita: 1972
    • Versione attuale: C17 (giugno 2018) (Significa che il C esiste da 40 anni!!)
  • Linguaggio C++
    • Nascita: 1983
    • Versione attuale: C++20 (dicembre 2020)
Ovviamente anche altri linguaggi sono cambiati col tempo però non posso di certo farvi una lista infinita di tutti i linguaggi, comunque penso abbiate capito il concetto, e cioè che i linguaggi si evolvono!

Insieme ai linguaggi si devono evolvere anche i compilatori, infatti quando diciamo che un linguaggio si evolve significa che viene cambiata la relativa sintassi e/o semantica, ma sta poi ai compilatori (e ai loro sviluppatori) stare al passo coi tempi e permettere che le nuove funzioni possano essere compilate correttamente.

Quando programmi in un linguaggio di programmazione decidi anche lo standard (la versione di esso) in cui lo farai, poiché non è detto che tutti i compilatori possano compilare l'ultima versione del linguaggio di programmazione (soprattutto se tale versione è molto recente).

1663761928012.png


1663761955924.png


Per saperne di più su come è fatto il kernel linux ti rimando a questo link:
Per quanto riguarda il passaggio dal kernel Linux da C89 a C11:


3 - Linguaggi "semi-interpretati"

Abbiamo parlato della differenza tra linguaggi compilati e interpretati, e vi ho anche parlato della differenza tra linguaggi di programmazione ad alto livello e a basso livello, ora abbiamo tutte le informazioni di base per comprendere come funzionato i linguaggi "semi-interpretati".
(Il motivo per cui non ne ho parlato nella parte dei linguaggi compilati o interpretati è perché volevo che capiste prima il concetto di linguaggio ad alto o basso livello, poiché ci sarà utile per questa spiegazione)


3.1 - Java

Il modo migliore per spiegarvi come funzionano i linguaggi "semi-interpretati" è parlarvi del linguaggio semi-interpretato per eccellenza: il Java.

Il Java è un linguaggio che come il C è general-purpose, ma a differenza del C con il java i programmi vengono:

1. Compilati
2. Interpretati

1664740757568.png


Quando compilate un programma java esso non viene tradotto in codice macchina, bensì in uno linguaggio di basso livello (diciamo che è una specie di assebly) che è chiamato "byte code", tale byte code viene poi interpretato dalla JVM (Java virtual machine) , dal momento che il byte code è di basso livello anche se interpretato il programma richiede molta meno potenza di calcolo di quella necessaria per un normale linguaggio interpretato, quindi non si ha una grande perdita di prestazioni rispetto ai linguaggi compilati.

Ma la cosa migliore di questo metodo di compilazione dei file è che essendo la JVM a effettuare la traduzione, ovunque ci sia un JVM installata possiamo eseguire codice Java compilato (senza doverlo ricompilare)!

Nel C anche se usiamo lo stesso compilatore su pc diversi e con diversi sistemi operativi non possiamo eseguire file compilati da uno dei due pc sull'altro, ma dobbiamo ricompilare il codice, mentre in Java se abbiamo un file compilato ci basta avere un'altro pc con una JVM installata e il file sarà eseguibile!

1664740951930.png


1664740974964.png


LINK:

Note finali


Ho parlato un pò dei linguaggi di programmazione così da permettere anche a chi non ha mai avuto esperienze nella programmazione di seguire questo corso senza essere svantaggiato, ci sarebbe ancora molto da dire sui linguaggi di programmazione ma verrebbe fuori una lezione interminabile, se intendete approfondire l'argomento lascio qualche link utile:
E con questo abbandoniamo i concetti generali e ci concentriamo sul linguaggio C! (Lo so che non ce la facevate più a sopportare lo spiegone su tutta questa roba teorica
😏
)



Linguaggio C - introduzione

Il linguaggio C è un linguaggio di programmazione di livello piuttosto basso ed è un linguaggio compilato: questo significa che permette un grande controllo sull'hardware sottostante ed è molto potente , motivo per il quale è diffusissimo: infatti esso è usato spesso per la creazione di programmi che richiedono un alto livello di prestazioni e/o un grande controllo sull'hardware (come ad esempio i sistemi operativi), in poche parole:
  • Il linguaggio C è veloce e permette di fare un po' quello che ti pare con l'hardware con cui lavori.
Per darti un idea: i sistemi operativi sono fatti in parte C, il kernel Linux è fatto in C, i firmware dei router sono fatti in C, parte di Windows è fatta in C, parte di Android è fatta in C (dopotutto Android è fatto usando il kernel Linux) , molti linguaggi si basano in un modo o nell'altro sul C , probabilmente perfino tu sei fatto in C (scherzo, forse..) . Comunque battute (che non fanno ridere nessuno) a parte avrai capito che il C è usato in una marea di progetti , quindi conoscere il C ti sarà sicuramente utile, soprattutto perché se riesci a padroneggiare il C allora difficilmente avrai problemi a imparare qualsiasi altro linguaggio.


2 - Che cos'è C++ e cosa cambia dal C?


C++ lo puoi vedere come un linguaggio C con più funzionalità e più moderno, diciamo che è un "C con i muscoli", per quanta il riguarda il motivo per cui non partiamo direttamente dal C++, ci sono varie motivazioni, la più importante è sicuramente:
  • conoscere il C equivale a conoscere PARTE del C++, ma non è vero il contrario.
Questo significa che non potrai lavorare su progetti scritti in C se conosci solo il C++ (e proprio poco fa ti ho detto perché il C è così importante da conoscere), poi:
  • Il C è più "semplice" rispetto a C++, questo lo rende perfetto per apprendere le basi della programmazione senza scontrarsi fin da subito con cose come il paradigma "Object Oriented".
Quindi il mio consiglio è:

impara le basi del C e poi puoi buttarti sul C++ (tanto come abbiamo detto conoscere il C equivale a conoscere parte del C++, quindi non ti complichi la vita e in più avrai già studiato parte del C++).

1663762582221.png


LINK: https://www.inforge.net/forum/threads/frequently-asked-questions-da-dove-si-parte.441093/


3 - La compilazione del C


Ricordi quando abbiamo parlato dei linguaggi compilati?
Ebbene non ti ho detto una cosa (per evitare di complicare inutilmente il concetto di base , che era ciò che volevo comprendessi) e cioè che il codice scritto in C non viene subito tradotto in linguaggio macchina, ma segue dei passaggi intermedi, infatti il codice C prima di diventare codice macchina viene prima tradotto in un altro linguaggio più semplice (dal punto di vista del computer, quindi di più basso livello) che abbiamo già avuto modo di incontrare quando abbiamo parlato dei linguaggi di programmazione:
  • Il linguaggio Assembly
Senza stare qui a parlare per ore ti basti sapere che il linguaggio Assembly è generalmente il linguaggio più a basso livello che puoi usare su un calcolatore, più vicino alla macchina c'è solo quello binario.

Il linguaggio assembly è composto da un "set di istruzioni" (Instruction Set) che è fortemente dipendente dal processore della macchina, poichè ogni architettura (su cui sono basati i processori) ha il suo linguaggio Assembly (sarà il compilatore poi a scegliere il linguaggio Assembly da usare per tradurre il nostro codice in base alla macchina su cui viene eseguito).

1663763306440.png


Il file contenente il codice tradotto in linguaggio assembly verrà poi tradotto in binario tramite un "compilatore" fatto appositamente per l'assembly che si chiama "Assembler" che traduce l'assembly in binario.

1663763388041.png


Dopodiché un programma chiamato "linker" collegherà insieme tutti i file che compongono il programma (se è composto da più file) e restituirà in output un file eseguibile.

1663763475999.png


Quando vogliamo avviare un file eseguibile viene utilizzato un programma che si chiama "Loader", il suo compito è caricare in un area di memoria libera (memoria RAM) il programma per poi avviarne l'esecuzione.

3.1 - Versioni del linguaggio C


I linguaggio C è attualmente alla versione C17, nel mio caso ti insegnerò le basi della versione C11 (perfino il kernel Linux sta passando a questa versione) che ti permetterà di mettere mano a buona parte dei progetti scritti in C senza problemi, ovviamente nulla ti vieta di imparare ad usare C17 una volta imparata C11.

3.2 - Compilatori C


Abbiamo già parlato abbondantemente su come funziona un compilatore e a che serve, ma è ora che ti spieghi come si sceglie un compilatore (come installarlo sarà argomento della prossima lezione).
Partiamo dal fatto che esistono più compilatori diversi (almeno per quanto riguarda il C), ogni compilatore ha:
  • determinate performance (velocità di compilazione, uso ottimizzato dell'hardware, ottimizzazione del codice ecc..)

  • una versione massima del linguaggio supportata

  • una certa predisposizione per essere usato su determinate piattaforme
    • Progetto eseguibile per windows: compilatore integrato nella suite VC++
    • Progetto multi-piattaforma: compilatori integrati in IDE come Code::Blocks o compilatori contenuti nella suite GCC o MinGW (tranquillo parleremo di sta roba nelle prossime lezioni)
1663763727470.png


LINK: https://it.quora.com/Cosa-rende-un-compilatore-migliore-di-un-altro-se-i-compilatori-sono-decidibili-dato-un-linguaggio
 

Allegati

  • Linguaggi di programmazione.pdf
    752.1 KB · Visualizzazioni: 5
  • Linguaggio C - introduzione.pdf
    190.9 KB · Visualizzazioni: 6
Non mi trovo molto con questa parte:

  • infatti i linguaggi di basso livello (di solito sono sempre linguaggi compilati) sono molto più prestanti (essendo di basso livello sono molto più vicini al computer e quindi il processo di traduzione per il computer è più rapido) e permettono un maggiore controllo sull'hardware, ma difficili da leggere e da scrivere (più tutti vantaggi/svantaggi dati dall'essere compilato o interpretato).

  • i linguaggi di alto livello (di solito sono sempre linguaggi interpretati) sono molto meno prestanti (essendo di alto livello sono molto più lontani dal computer e quindi il processo di traduzione per il computer è più lento)
    e permettono un minore controllo sull'hardware, ma facili da leggere e da scrivere (più tutti vantaggi/svantaggi dati dall'essere compilato o interpretato).

Dire che di solito quelli di alto livello sono interpretati, non è propriamente corretto (come infatti dici nell'immagine sotto). C, C++, Go, Rust, Delphi,... sono compilati e non sono di basso livello (anche se hanno livelli di astrazione differenti).
Toglierei solo quella parte tra parentesi.

praticamente ogni processore ha il suo linguaggio Assembly

Probabilmente intendi ogni architettura e non "processore".


Bella guida, e grazie per averla scritta. ;)
 
  • Mi piace
Reazioni: giovy2707
Non mi trovo molto con questa parte:



Dire che di solito quelli di alto livello sono interpretati, non è propriamente corretto (come infatti dici nell'immagine sotto). C, C++, Go, Rust, Delphi,... sono compilati e non sono di basso livello (anche se hanno livelli di astrazione differenti).
Toglierei solo quella parte tra parentesi.



Probabilmente intendi ogni architettura e non "processore".


Bella guida, e grazie per averla scritta. ;)
Grazie a te per l'aiuto 👍🏻
 
  • Mi piace
Reazioni: DispatchCode
Penso che domani o al massimo dopodomani pubblico la 3 lezione e magari aggiungo pure una piccola parte alla prima (mi spiace per l'attesa, ho avuto "impegni universitari" se così possiamo chiamarli)
 
  • Mi piace
Reazioni: DispatchCode