Ultima modifica:
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
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.
- 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.
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).
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).
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)
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).
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
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!
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:
- https://it.wikipedia.org/wiki/Linguaggio_di_programmazione
- https://it.wikipedia.org/wiki/Programmazione_(informatica)
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.
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.
- 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".
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++).
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
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).
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.
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.
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)
LINK: https://it.quora.com/Cosa-rende-un-compilatore-migliore-di-un-altro-se-i-compilatori-sono-decidibili-dato-un-linguaggio