NGI.Home > Forum
  EOLO HOME  OFFERTE INTERNET WIRELESS EOLO  FORMULA ADSL
   
   
WEBMAIL
   
 
  > Register  
  > FAQ  
  > Members List  
 
  > Calendar  
  > Today's Posts  
   
 

Go Back   NGI Forum > Tech & Tech > Developer's Zone

Reply
 
Thread Tools Rate Thread
Old 2nd December 2010, 01:31   #1
Arësius
Soft computer
 
Arësius's Avatar
 
Join Date: Feb 2000
Posts: 67,290
[Impariamo il C] Lezione 1

Buongiorno.

Voglio provare questo esperimento di corso collaborativo di programmazione.

Il corso si articola di più pseudolezioni (auspicabilmente più corte di questa ), che pretendono di spiegare un passo alla volta la ars programmandi, sfruttando il più celebre dei linguaggi di programmazione: il C.

Questo primo capitolo ha un duplice scopo:
  • spiegare cosa significa programmare (in particolare, cosa significa veramente programmare in C)
  • dare gli strumenti per iniziare SUBITO a giocare

Cosa significa programmare... e un briciolo di architettura
Facendola veramente molto più breve di quanto meriterebbe di essere, la questione è questa: l'uomo odia fare di calcolo, sopratutto in maniera ripetitiva e su grandi quantità di dati.

Il motivo è presto detto: la probabilità di errore è molto grande, il tedio insorge subitaneo, e in generale da sempre avrebbe desiderato che dei macchinari facessero al posto suo una serie di compiti.

Un signore di nome Alan Turing suggerì l'idea (tutt'oggi non dimostrata) che qualunque calcolo eseguibile da una persona, armata di sola carta e penna, poteva essere "ridotto" ad un semplicissimo macchinario in grado di manipolare una testina magnetica.

Successivamente, un altro signore di nome Von Neumann propose una architettura generale che rendesse implementabile nella realtà tale macchina "calcolante". Nacquero così i computer.

Anche se oggi ci sembra che siano in grado di fare cose ben più complesse che manipolare numeri, in realtà vediamo solo un aspetto "ad altissimo livello" di quello che sta avvenendo nel cuore "ragionante" della macchina, la cosidetta CPU, central processing unit, unità centrale di elaborazione. Ma cosa elabora? fondamentalmente numeri. In realtà, elabora bit, che sono i mattoncini base di rappresentazione nell'elettronica digitale.

Il bit può assumere solo due valori: 0 e 1. Sono i soli valori che possiamo trovare nell'elettronica digitale, e quindi all'interno delle CPU. Naturalmente, è un po' difficile elaborare qualcosa con un solo bit, dunque i dati che elabora l'unità centrale sono gruppi di bit chiamati word. Da quando sono entrati in commercio i processori Intel 386, le CPU dei cosidetti "personal computer" usano word composte di 32 bit. Ancora oggi, gran parte dei processori lavorano con gruppi di questo tipo, anche se sono ormai sdoganati processori a 64.

Le word sono un po' ingombranti da utilizzare, perché possono rappresentare un range di valori enormi (2^32), quindi esiste un raggruppamento più "compatto" di 8 bit chiamato byte. Le word standard sono dunque lunghe 4 bytes. Un byte, ad esempio, è sufficiente per rappresentare tutti i caratteri alfanumerici e di punteggiatura, e in effetti è così: da qualche parte, nella memoria del computer che stai utilizzando, le lettere che leggi sono immagazzinate in maniera tale che ad ogni lettera e simbolo corrisponde un byte.

Ho citato la parola "memoria", ma è un concetto nuovo. Finora abbiamo detto solo che la CPU può contenere delle "word" e manipolarle (anche se non sappiamo come). Il punto è che la CPU non è il posto adatto dove immagazzinare i dati. Questi, in base alla teoria di Von Neumann, devono essere collocati al di fuori della CPU (che si occupa SOLO di prenderli, processarli e rispedirli indietro), in appositi dispositivi chiamati appunto memorie.

Ma vediamola questa architettura di Von Neumann:



Si riconoscono la CPU (e quello che fa) e la memoria. Si osserva che le due sono collegate da un attrezzo chiamato "bus": questo non è altro che un collegamento fisico sul quale transitano i dati. Tali dati non è detto che debbano riguardare solo memoria e CPU, e infatti è possibile "aggiungere" elementi di input/output di vario genere, con cui estendere la nostra macchina calcolante. Tali dispositivi saranno schede video, audio, tastiere, memorie di massa (hard disk, DVD, ecc), qualsiasi cosa.

Molto bene. Dunque riassumiamo:
  • abbiamo i dati in memoria
  • la cpu li preleva un po' alla volta
  • li "esegue"
  • memorizza il risultato nella memoria
due domande dovrebbero sorgere spontanee: ma 'sti dati da dove arrivano? come faccio a "eseguire" dei dati? La risposta è: programmando!

Chiaramente, è assai arduo programmare al livello del singolo bit o word. Attenzione però, arduo non significa impossibile. C'è chi lo fa di lavoro, e si chiama programmazione assembly. Tuttavia, chiunque abbia provato più di dieci minuti sa quanto può essere odioso, e quindi ad un certo punto un signore di nome Ritchie decise di "tradurre" alcune operazioni dell'assembly in parole e comandi un po' più comprensibili da un essere umano, pur mantenendo corrispondenza col loro significato originale. In termini informatici, Ritchie ha introdotto una sintassi più semplice mantenendo inalterata la semantica. Questa sintassi è il linguaggio C.

Chiaramente, quanto scriviamo in C non viene dato immediatamente al processore. Avviene il passaggio della cosidetta compilazione, nella quale i nostri comandi "ad alto livello" vengono tradotti nel linguaggio dei bit (chiamato linguaggio macchina); durante questa fase, il programma compilatore*si occupa sì di trasformare il C in linguaggio per la CPU, ma si occupa anche di verificare che il codice che abbiamo inserito abbia senso (ovvero, rispetta la sintassi). Questa verifica è importante, perché in informatica non sono graditi i comandi ambigui, i quali possono avere effetti imprevedibili e disastrosi. Altri dettagli del compilatore saranno visti alla fine del corso.

Ora un ultimo aspetto prima di passare alla seconda parte.

Il C come abbiamo visto è molto vicino all'assembly. Quindi, è vicinissimo al cuore del computer, non aggiunge orpelli e livelli "intermedi": punta dritto al massimo potenziale della macchina, garantisce grandi performance e ci consente di fare qualsiasi cosa sia in grado di fare. Tuttavia, questa potenza si paga in altri aspetti: i comandi base sono pochini, cose apparentemente semplici possono richiedere molto sforzo e la gestione della memoria può essere uno sconcertante dramma esistenziale. In particolare, quest'ultimo punto è quello che rende il C croce e delizia della programmazione: la possibilità di fare quello che ci pare con la memoria, in particolare con l'uso dei puntatori. Ma allora perché partire dal C? Perché la sua sintassi è stata riciclata da molti linguaggi (quindi vi sentirete sempre a casa) e perché è il paradigma tradizionale di programmazione, quello imperativo: tu dici, il computer esegue. In maniera sequenziale, ubbidiente, deterministica. Ovviamente non esiste solo il C, esiste una pletora di linguaggi, e due signori italiani (Bohm e Jacopini) han dimostrato che qualunque linguaggio in grado di fare alcune semplici cose si adatta a fare tutto.

* la cosa divertente è che i compilatori stessi sono scritti in C. Ci si potrebbe domandare come l'abbiano compilato, il primo compilatore!


Sporchiamoci le mani!
Abbiamo visto che per programmare ci bastano due cose: un programma per scrivere testi e un compilatore. Ed è così!

Tuttavia, è più comodo utilizzare le cosidette IDE (integrated development environment - ambiente integrato di sviluppo), che sono fondamentalmente dei mega-editor di testo che consentono di compilare, lanciare programmi e anche di effettuare il cosidetto debug, ovvero analisi del flusso del programma per identificare gli errori del nostro codice.

Esistono pletore di IDE gratuite; una vale l'altra. In questa fase ne consiglio tre:
sono in ordine dimensione (e features). Ne esistono ovviamente altre, ma queste sono le più diffuse.

Io consiglio Dev-CPP, perché ha una simpatica feature: vi consente di realizzare in automatico il cosidetto "programma hello world" (nuovo progetto > introduzione > hello world), che tradizionalmente è il primo che ogni programmatore realizza nella sua vita. E' un buon modo per avere subito un codice funzionante, pronto da lanciare e modificare. Per questa prima lezione mi limiterei a installare un IDE e giocherellare con il codice di Hello World (che copio/incollo di seguito), cercando di capire ogni istruzione che cosa combina. Buon divertimento ^^

Code:
void main()
{
  printf("Hello World!\n");
  system("pause");
}
__________________
Lode a Bacco, in saecula saeculorum.
Emergent

Last edited by Arësius; 2nd December 2010 at 01:32.
Arësius is offline   Reply With Quote
Old 2nd December 2010, 09:03   #2
Knu
(\/) (;,,;) (\/)
 
Knu's Avatar
 
Join Date: Jan 2009
Location: Mantova/Verona/Brescia
Posts: 5,704
mi permetto subito di fare un paio di correzioni

- la funzione main dovrebbe ritornare un valore per indicare la chiusura corretta o meno (moar quando ci sara' la lezione su funzioni e procedure)
- system("pause"); e' inguardabile (moar piu' avanti )

il vero hello world dovrebbe essere
Code:
int main()
{
  printf("Hello World!\n");
  return 0;
}
compito per casa: qualcuno intuisce la differenza a livello di funzionamento tra i due programmi?
__________________
· My Steam ·

Last edited by Knu; 2nd December 2010 at 09:06.
Knu is offline   Reply With Quote
Old 2nd December 2010, 09:28   #3
Arësius
Soft computer
 
Arësius's Avatar
 
Join Date: Feb 2000
Posts: 67,290
obiezione giusta. inoltre, il vero main dovrebbe anche prendere i parametri argc/argv.

ma ho intenzionalmente scarnificato il codice di Dev-CPP allo stretto indispensabile cmq buona la domanda.

ora attendo feedback di Nightmare e spammo un po' in giro.
__________________
Lode a Bacco, in saecula saeculorum.
Emergent

Last edited by Arësius; 2nd December 2010 at 09:29.
Arësius is offline   Reply With Quote
Old 2nd December 2010, 09:48   #4
visitatore
no no ma 4tino
 
visitatore's Avatar
 
Join Date: Dec 2006
Posts: 12,482
iniziamo bene 2 errori
__________________
Mi sono laureato perché a differenza della conoscenza in ambito giuridico e classico, la scienza è un enorme frattale di cui se tu cogli l'essenza puoi solo sapere la prima iterazione

gg no re
visitatore is offline   Reply With Quote
Old 2nd December 2010, 09:48   #5
Pier4R
Ex falso quodlibet
 
Pier4R's Avatar
 
Join Date: Jul 2004
Location: equgpbc.r2.Frisia
Posts: 18,664
Quote:
Originally Posted by Knu View Post
compito per casa: qualcuno intuisce la differenza a livello di funzionamento tra i due programmi?
Uno va in attesa e l'altro termina?
__________________
Ngi the e.FlameeXperience .Fe ! ngi.agorà@twitter (sottoscrivi per essere incluso)
You must play online: warSow EnemyTerritory + etpro quake 4 + q4max & quake 3 + cpma & quakelive Teeworlds! hoi2series

Ringrazio i grammar nazi che mi fanno comprendere gli errori ; my.IL
; lettere porno
Pier4R is offline   Reply With Quote
Old 2nd December 2010, 09:53   #6
Ganker
<insert_team_name>
 
Ganker's Avatar
 
Join Date: Mar 2007
Location: Napoli
Posts: 5,365
Buongiorno prof
all'uni ho fatto solo c++ per ora (sto al 3° ing inf), ha usi pratici differenti rispetto al c ?
__________________
Is God willing to prevent evil, but not able? Then he is not omnipotent. ..........Is he able, but not willing? Then he is malevolent.
Is he both able, and willing? Then whence cometh evil? ..........Is he neither able nor willing? Then why call him God?
Epicurus

Last edited by Ganker; 2nd December 2010 at 09:54.
Ganker is offline   Reply With Quote
Old 2nd December 2010, 09:55   #7
FollowTheMedia
MoVimento 5 Pinne
 
FollowTheMedia's Avatar
 
Join Date: Jun 2005
Location: In fondo al mar
Posts: 8,595
Quote:
Originally Posted by Ganker View Post
Buongiorno prof
all'uni ho fatto solo c++ per ora, ha usi pratici differenti rispetto al c ?
Sono entrambi general purpose. Di solito il C lo usi quando scrivi roba per livelli vicini all'hardware (driver di dispositivi, sistemi operativi, ecc...).
__________________
Se la sardina fa una moina c'è da impazzir
La moneta ufficiale di Agorà è ora reale. Scoprila anche tu e richiedi subito i tuoi BORZI! Il mio indirizzo BORZI: 53RKEhoMPB3ZzsyY1jwzijsGRqZn7J1cMu
FollowTheMedia is offline   Reply With Quote
Old 2nd December 2010, 10:05   #8
Mangus
WWI Flying Ace
 
Mangus's Avatar
 
Join Date: Jan 2000
Location: Ravenna - Romagna
Posts: 12,943
Quote:
Originally Posted by Pier4R View Post
Uno va in attesa e l'altro termina?
* this?
__________________
MaNGuS
Mangus is offline   Reply With Quote
Old 2nd December 2010, 10:07   #9
Arësius
Soft computer
 
Arësius's Avatar
 
Join Date: Feb 2000
Posts: 67,290
Quote:
Originally Posted by Ganker View Post
Buongiorno prof
all'uni ho fatto solo c++ per ora (sto al 3° ing inf), ha usi pratici differenti rispetto al c ?
il C++ incorpora il C (viene definito "il C con le classi"), quindi se conosci il primo puoi andare tranquillo.

come ti ha ben detto Followthemedia, il C è preferibile usarlo quando son importanti performance e "leggerezza" in memoria. L'astrazione ad oggetti del C++, sopratutto le librerie che si porta dietro, tendono a renderlo sconveniente in queste situazioni.
__________________
Lode a Bacco, in saecula saeculorum.
Emergent

Last edited by Arësius; 2nd December 2010 at 10:13.
Arësius is offline   Reply With Quote
Old 2nd December 2010, 10:11   #10
Niymiae
Five Leaf Clover
 
Niymiae's Avatar
 
Join Date: Mar 1999
Location: Magrathea
Posts: 3,081
Quote:
il C++ incorpora il C
Il che non significa però che col C++ ti puoi dimenticare del C

Domanda, visto che di C si parla, io avrei un progettino in cantiere, adatto ai netgamer, buono come "banco di prova", senza nessun impegno o responsabilità richiesta, e già in stadio di completamento piuttosto avanzato...
Ditemi voi se posso parlarne qui o se devo riferirmi altrove.
__________________
the e.UGO Xperience
The HyperIntelligent Shade of the color Green
Who the hell do you think I am?
Niymiae on X360 Live and Steam


Last edited by Niymiae; 2nd December 2010 at 10:13.
Niymiae is offline   Reply With Quote
Old 2nd December 2010, 10:15   #11
Arësius
Soft computer
 
Arësius's Avatar
 
Join Date: Feb 2000
Posts: 67,290
un pezzo del tuo progetto potrebbe essere l'esamino finale
__________________
Lode a Bacco, in saecula saeculorum.
Emergent
Arësius is offline   Reply With Quote
Old 2nd December 2010, 10:16   #12
Knu
(\/) (;,,;) (\/)
 
Knu's Avatar
 
Join Date: Jan 2009
Location: Mantova/Verona/Brescia
Posts: 5,704
ora che ci penso, nello spezzone da te postato manca l'inclusione di stdio

Code:
#include <stdio.h>

int main()
{
  printf("Hello World!\n");
  return 0;
}
ecco, ora e' corretto (anche se prima compilava comunque, avrebbe dato un warning)


EDIT: addendum

per compilare da linux (in teoria avete gcc da installato, quindi non dovete scaricare inutili ide (in b4 flame)) vi basta incollare il testo in gedit o in qualsiasi editor di testo, salvarlo come helloworld.c

aprite un terminale, posizionatevi nella directory

per compilare:

gcc nomesorgente -o nomeeseguibile

quindi

gcc helloworld.c -o helloworld

e per lanciarlo da terminale ovviamente

./helloworld
__________________
· My Steam ·

Last edited by Knu; 2nd December 2010 at 10:23.
Knu is offline   Reply With Quote
Old 2nd December 2010, 10:30   #13
Niymiae
Five Leaf Clover
 
Niymiae's Avatar
 
Join Date: Mar 1999
Location: Magrathea
Posts: 3,081
Se volete vi (aresius e knu) accenno la cosa in pm e mi dite se può in qualche modo essere una componente del "corso".
Magari di livello un pelo più avanzato.
__________________
the e.UGO Xperience
The HyperIntelligent Shade of the color Green
Who the hell do you think I am?
Niymiae on X360 Live and Steam

Niymiae is offline   Reply With Quote
Old 2nd December 2010, 10:33   #14
xam8re
newbie PRO!
 
xam8re's Avatar
 
Join Date: Dec 2007
Location: in my city
Posts: 785
buco se vi serve collaboratore (in C)
__________________
101110101011101111100000
xam8re is offline   Reply With Quote
Old 2nd December 2010, 10:53   #15
Mr. Mustard
14/63
 
Mr. Mustard's Avatar
 
Join Date: Jun 2010
Posts: 396
ottimo io sono un iper ultra uber noob provo a vedere se riesco a seguire... ma non andate troppo veloci, altrimeni non ci capisco una sega.
Mr. Mustard is offline   Reply With Quote
Reply

Bookmarks

Tags
#include <pr0n.h>, faiunbelcerchio ecco il c, gcc aresius.c, programmo con i piedi

Thread Tools
Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +2. The time now is 21:30.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright 1998-2014 by NGI SpA