Wednesday, 9 February 2011

"Impariamo il C", un corso collaborativo

Qualche settimana fa ho dato via ad un piccolo esperimento sul forum di NGI. Si tratta di un micro-corso di programmazione C di stampo collaborativo: una breve lezione "frontale" discussa con la community.

L'approccio che seguo è bottom-up: son voluto partire dalle minuzie (cioé il ferro, quella che viene chiamata architettura dell'elaboratore) e risalire lentamente, introducendo un piccolo tassello aggiuntivo ad ogni lezione. Naturalmente, tutto scritto in maniera easy, con molte metafore, illustrazioni ed esercizietti.

Perché proprio il C? Beh, perché è la base dei linguaggi imperativi. In fondo, praticamente tutti i linguaggi non funzionali e non logici sono dialetti del C. Una volta imparata la logica, poi ci si può spostare su altri contesti senza paura, dai sistemi embedded alle web-application, passando per il mondo emergente del GPGPU computing.

Queste sono le "lezioni" effettuate finora:
  1. installazione dell'IDE, cenni di architettura degli elaboratori
  2. sintassi del C, programmazione strutturata
  3. ancora sulla sintassi, i tipi di dato, le variabili
  4. variabili parte seconda: gli array
  5. introduzione delle funzioni
  6. operatori aritmetici e logici
  7. costrutti di selezione
  8. costrutti di iterazione
  9. ancora sull'iterazione
  10. array multipli e struct
  11. ricorsione
  12. ancora ricorsione, memoria (record attivazione, heap, stack, ecc), introduzione dei puntatori
  13. le liste e l'allocazione di memoria (malloc)
  14. accenni dei costi asintotici, e ancora liste
Cercherò di tenere aggiornato l'indice. Il corso, per ora, ha un discreto séguito anche se abbiamo subito molti "abbandoni", vuoi per l'incapacità dell'insegnante, vuoi perché la programmazione C può essere rognosa (molti son saltati giù con la ricorsione, chissà perché!).

Come sosteneva Schoenberg, anche il maestro impara nell'insegnare all'allievo. Trasmettendo il C sto scoprendo aspetti che proprio cui non avevo mai prestato attenzione o di cui ignoravo completamente l'esistenza. Per esempio, ho reagito in maniera un po' scomposta alla scoperta che sia sizeof che la virgola sono operatori in C, e in particolare la virgola (grazie ACray!) che in base alle situazioni può avere una semantica che definire balzana è usare un eufemismo. Il C non finisce mai di stupire.

4 comments:

AkiRoss' said...

Io quelle cose le sapevo.

N00b.

:D

Comunque complimenti per l'idea ;) Ci butto un occhio veloce :D

Marco S. Nobile said...

io proprio no! ad esempio ho sempre usato sizeof come una funzione, anche perché mi pareva logico.

tu mica stavi lavorando ad un tuo linguaggio? probabilmente conosci altre perversioni di C/C++ che nemmeno mi immagino.

AkiRoss' said...

Si', ci stavo lavorando, ma anche se ogni tanto pianifico di aggiungerci feature, non ho molto tempo da dedicarci :S

Bhe m'e' capitato di sentire qualcuno che considerasse anche return una funzione, perche' l'ha sempre usato (e a quanto pare visto usare) con le parentesi: return(val);

Comunque tante cose le ho dimenticate :) Purtroppo e' molto tempo che non mi esercito a dovere col C++, e ancora di piu' con C...

Mado', certo che son lunghi i thread di quelle lezioni XD non li ho letti tutti.

Marco S. Nobile said...

le parole povere portano via un sacco di spazio... alle volte vorrei tagliare corto con due formalismi, ma poi so che devo spendere un'ora a fornire chiarimenti! XD

ps: return(valore) non si può vedere!! argh!