di  -  martedì 4 novembre 2008

C/C++Assieme a “Mamma come si fanno i bambini?” è forse la domanda più ricorrente del giovane virgulto che, spaesato, muove i primi timidi passi nel mondo della programmazione.

Per amor del cielo non iniziare dal C, mio giovane padawan, perché il C (e il C++) sono il lato oscuro della programmazione. “Il C ti costringerà a pratiche che molti considerano… innaturali”.

Troppo complesso, troppo vicino alla macchina e non al tuo modo di pensare, troppi concetti che riguardano l’architettura dei dispositivi hardware e delle CPU con le quali dovrai farei  i conti ma che ancora non conosci. Ti distraggono dall’imparare a pensare alla soluzione di un problema come un programmatore umano.

Perché chiunque, caro mio, è in grado di scrivere codice che una macchina è in grado di comprendere, ma solo i buoni programmatori sono capaci di scrivere codice che un essere umano è in grado di comprendere.

Ti serve un linguaggio semplice, ad alto livello, che ti nasconda i dettagli a basso livello, che ti costringa piuttosto a imparare buone pratiche di programmazione ad oggetti al di là dei dettagli specifici di un’architettura, che ti scolpisca nella mente l’idea che la programmazione non e’ altro che un esercizio di gestione della complessità. I problemi da risolvere sono complessi, devi imparare a renderli semplici. E fornire soluzioni.

Per il programmatore pragmatico non c’è spazio per le guerre di religione: ignora i falsi profeti del C che cercheranno di imbonirti a colpi di puntatori e gestione della memoria dinamica. Le alternative sono varie e tutte di buon livello: accogli fra le tue braccia Java o C# se vuoi imparare un linguaggio con la sintassi C-like. Oppure l’esotico Python se ti incuriosiscono i linguaggi dinamici con le loro promesse di liberarti dal giogo della forte tipizzazione dei dati.

Disciplina e semplicità sono le chiavi del successo, mio futuro guerriero del codice. Quando avrai imparato i rudimenti, ti avvicinerai, se necessario, al lato oscuro del C e del C++ per domarlo e aggiungere nuovi strumenti al tuo bagaglio.

217 Commenti »

I commenti inseriti dai lettori di AppuntiDigitali non sono oggetto di moderazione preventiva, ma solo di eventuale filtro antispam. Qualora si ravvisi un contenuto non consono (offensivo o diffamatorio) si prega di contattare l'amministrazione di Appunti Digitali all'indirizzo info@appuntidigitali.it, specificando quale sia il commento in oggetto.

  • # 1
    sidew
     scrive: 

    Secondo me il miglior linguaggio per iniziare a imparare rimane sempre il buon vecchio pascal.

    LA sua strutturazione ti obbliga a strutturare correttamente i vari blocchi e alla corretta tipizzazione delle variabili.

    Dopo questo, sono indeciso tra c# e Java ( specialmente per l’approccio OOP)

    C/C++ invece non li consiglio come primo linguaggio da imparare, specialmente se non hai idee presuce sui puntatori..

  • # 2
    BrightSoul
     scrive: 

    Sono d’accordo con sidew, anche se – siamo realisti – è facile che un programmatore novello si scoraggi difronte alle poche applicazioni pratiche del Pascal.

    E’ più facile che uno si appassioni alla programmazione cominciando a scriptare il proprio sito web col Javascript. Essendo stimolato a migliorarlo, imparare risulta anche più divertente. Da lì consiglierei il C#, che torna utile sia per applicazioni web lato server che per programmi per windows.

  • # 3
    SirHaplo
     scrive: 

    Secondo me partire con C#, Java è comodo.
    Ma deleterio.
    Uno che inizia con C# appena si troverà davanti ad un puntatore, abituato bene com’è ci starà mesi a maneggiare i segmentation fault o peggio lock sui thread.

    Da sempre si inizia spiegando come funziona un processore, e poi si programma.
    Non si inizia dicendo cos’è una virtual machine e il garbage collector … o no ?

  • # 4
    Marco
     scrive: 

    Ma cos’è questo mito diffusissimo che il c++ non va bene per iniziare a programmare?
    Tutti i linguaggi imperativi sono praticamente la stessa cosa, hanno sempre gli stessi costrutti: if the else, for.. etc cambia la sintassi ma la sostanza è sempre quella.
    Il problema è semmai è imparare un OTTIMO STILE di programmazione, nel manuale si dovrebbe stressare questo punto con qualche capitolo dedicato alla programmazione strutturata, alle cose da evitare per poi passare alla programmazione a oggetti.
    Infine il lato oscuro del c++ come ad esempio l’uso dei puntatori, basta spiegarlo nell’ultimo capitolo del libro, con la raccomandazione di usarlo dopo qualche mese di apprendistato.

  • # 5
    thenext
     scrive: 

    Io inizierei dal pascal (nei primi anni ’90 ci sviluppai un tetris con le borland in DOS e un programma per la creazione di elementi basati su Flip Flop su Macintosh con tanto di interfaccia).

    Poi pero’ passerei al C per vedere proprio come le cose funzionano e con i decompilatori degli IDE analizzerei come gli stack frames sono creati/gestiti, le funzioni chiamate ecc… insomma il C accompagnato dal buon Assembler tanto per capirci e tanto per sapere come gira il mondo li dentro (guarda ci aggiungerei anche una intro al funzionamento dei processori, la base ovviamente senza tutte le features che ci sono oggi).

    A questo punto si puo’ passare a livelli piu’ alti: Java per un OOP static typed e di largo uso, ObjC o Smalltalk per apprezzare la potenza del vero OOP con il dinamic typing, dinamic binding ecc…
    Rimarrei cmq su liguaggi fruibili su tutte le piattaforme per poi passare ad uno specifico se mi assumono da qualche parte; tanto a questo punto e’ questione di grammatica.

    Insomma il percorso formativo della scuola di una volta quella con la S maiuscola, non quella di oggi che ti costringe a imparare solo Excel e VB.

  • # 6
    Francesco Carucci (Autore del post)
     scrive: 

    SirHaplo: si puo’ essere ottimi programmatori e produrre ottimo software che funziona senza vedere mai un segmentation fault e senza neppure sapere che cosa sia. Lo scopo della programmazione e’ risolvere problemi, non crearsene di nuovi con dettagli che nella stragrande maggioranza dei casi non sono rilevanti ai fini della soluzione.

    Marco: Non e’ un mito, e’ la realta’ dei fatti. Il C++ e’ un linguaggio troppo complesso per chi ha esperienza, ancor piu’ per un neofita. Concetti come puntatori sono troppo lontani dal livello d’astrazione al quale il cervello umano e’ abituato a pensare ai problemi. Non basta spiegarlo nell’ultimo capitolo: servono anni di esperienza. Vedo errori evitabili anche da chi programma da piu’ di dieci anni.

  • # 7
    thenext
     scrive: 

    >
    Il problema è semmai è imparare un OTTIMO STILE di programmazione

  • # 8
    thenext
     scrive: 

    Il problema del C++. Piu’ il linguaggio ti permette di fare “porcate” piu’ il codice sara’ sporco. Da questo punto di vista i frameworks e i paradigmi che ti “costringono ad usare” perche’ basati su quelli (mi viene in mente l’MVC, delegates ecc… per l’ObjC ad esempio) sono le linee guida e di conseguenza il codice risulta pulito ed organizzato. Il problema del C++ e’ che non e’ un vero linguaggio ad oggetti ma un ibrido, un ponte tra C e OOP e non ha alla sua base frameworks.

  • # 9
    Francesco Carucci (Autore del post)
     scrive: 

    Appunto, il problema e’ imparare un ottimo stile di programmazione e per farlo un utente alle prime armi (di loro stiamo parlando), deve usare lo strumento piu’ semplice possibile, senza distrazioni inutili al suo percorso di apprendimento. Questo strumento NON e’ il C++. Il C++ ha tanti usi, non quello didattico.

  • # 10
    SirHaplo
     scrive: 

    Francesco:
    Una volta un saggio mi disse “Tu impara a programmare, per imparare un linguaggio ci sono i manuali”
    E quindi capisco il programmare in alto livello per imparare.
    Io ho fatto un esempio sui dettagli, ma con c# rischi di non sapere nemmeno la differenza tra un array e una lista.

    Poi certo se devi fare un’interfaccina grafica : viva C#
    Un elaboratore : python
    Una pagina web : php + javascript
    Insomma se devi programmare viva i linguaggi di alto livello (comodi) ma se devi imparare parti dal basso, al massimo scoprirai che la vita è più semplice.

    Prima imparo a fare la divisione con la virgola a mano, poi uso la calcolatrice

  • # 11
    Syd
     scrive: 

    Sono sostanzialmente d’accordo con quello che dici, anche perché il C può indurre il programmatore a degli errori che poi rendono il codice vulnerabile. Tuttavia ritengo il C importante a livello formativo più come punto di inizio che come punto di arrivo. Mi sembra dura liberarci del tutto del C. Questo per una serie di motivi:
    1. E’ utile cominciare lo studio dell’informatica comprendendo grosso modo l’architettura di un computer e un linquaggio che le sta più vicino.
    2. Il C è un po’ uno standard di fatto per molte cose e la sitassi di molti linguaggi si ispira al C
    3. Esistono varie librerie in C con le quali si deve interagire
    4. Esistono svariati codici in C che bisognerebbe piu’ o meno saper leggere

    Detto questo, resta vero che ogni applicazione ha il suo linguaggio migliore, quello che rende il codice piu’ leggibile e corto possibile e che riduce i tempi di sviluppo. In alcuni casi, ma non sempre, può essere importante il tempo di esecuzione del codice.

  • # 12
    dab
     scrive: 

    Daccorddissimo con Francesco.
    Avendo programmato in C e Java, anche io consiglierei Java, per le motivazioni addette (andando cosí ad eliminare i dettagli a basso livello).
    Per un´azienda oggi conta avere un sw facilmente manutenibile (e soprattutto velocemente) piuttosto che uno che solo il suo inventore saprebbe modificare.

  • # 13
    Francesco Carucci (Autore del post)
     scrive: 

    SirHaplo: la differenza fra una lista e un vettore e’ un problema algoritmico e, di nuovo, spesso e volentieri non interessa. Molto probabilmente non interessa ad un neofita. Ti ricordo che stiamo parlando di chi non sa scrivere un loop. Quello che interessa e’ imparare il procedimento mentale che porta da un problema alla sua soluzione, nella maniera piu’ semplice possibile. Se gli serve un contenitore, ne usera’ uno standard, senza conoscerne i dettagli. Quando il problema che gli si presenta necessitera’ di questi dettagli, avra’ gia’ comunque una base solida dalla quale partire.
    Quindi C#, Python, Java, sono tutti linguaggi ad alto livello e vanno benissimo. C e C++ no. Dopo, ma solo se necessario Prima le basi del processo mentale, poi i dettagli.

    Syd: non e’ solo inutile iniziare a programmare cercando di capire l’architettura e un linguaggio a basso livello, e’ assolutamente deleterio. Chi inizia a programmare deve imparare a risolvere un problema, non a gestire l’heap.

  • # 14
    Jacopo Cocchi
     scrive: 

    ohhh finalmente!
    Finalmente una persona con esperienza sul campo e sul lavoro in un settore difficile come la VG industry che dice chiaro e tondo su quali siano gli strumenti didattici migliori.
    Ad un certo livello diventa una questione di gusti (static, dynamic-typed) ma è certo che alcuni di questi strumenti NON sono raccomandabili.
    Uno su tutti è C++ e per diversi motivi, tanto che lo stesso Stroustrop non lo consiglia come primo approccio alla programmazione. E se lo dice lui, ci sarà un perché.

    x SirHaplo

    Io non so in che sistema educativo sei cresciuto, ma una scuola normale insegna il bambino a fare i calcoli dalle tabelline, i regoli. Quel bambino crescerà e se vorrà passerà attraverso equazioni differenziali o calcoli ancora più complessi e astratti (nozioni di algebra per esempio).
    Ci si focalizza su un problema, lo si risolve e si passa al livello di difficoltà successivo.
    Difficoltà a salire non a scendere, altrimenti tranne quelle poche menti geniali, rimarremmo idioti a vita.

    Per la programmazione è la stessa cosa. Il punto è creare un algoritmo che soddisfi i requisiti del problema; se per farlo posso escludere dettagli legati all’implementazione o all’architettura (che NULLA mi danno di più nella risoluzione del problema tranne complicazioni) concentrandomi sul problema stesso, è decisamente un vantaggio.

    E’ già sufficientemente difficile cercare di modellare il nostro complesso sistema di relazioni con l’esterno attraverso il paradigma OO che non vedo un motivo uno per tirarsi la zappa sui piedi.
    Ti piace poi programmare su sistemi embedded e C/Assembly sono la via?
    Prima ti formi, acquisisci le competenze e una forma mentis, poi per scendere a basso livello e complicarti la vita c’è SEMPRE tempo.

  • # 15
    pageup
     scrive: 

    Io purtroppo sono passato attraverso il classico percorso C/C++/Java e devo dire che iniziare col C/C++ è stato deleterio.
    All’inizio ho passato dei mesi frustranti (se non anni) in cui avevo voglia di sperimentare algoritmi, creare programmi, implementare le mie idee, ma che non riuscivo mai a concludere e dovevo abbandonare i miei progetti per colpa di problemi e dettagli a basso livello che non c’entravano niente, che mi bloccavano continuamente e che avrei benissimo potuto imparare DOPO se mi fossero serviti.

    Uno che inizia a programmare deve concentrarsi sullo studio di algoritmi, alberi, hashmap, imparare a dare ai propri programmi design efficenti, comprensibili e che permettano di implementare tuttte le funzionalita di cui si ha bisogno mantenedo al minimo la complesstita.
    Meglio studiare subito tecniche come i design pattern o test driven development che perdere tempo a capire come gestire i puntatori in modo sicuro all’interno di programmi complessi, che è una cosa del tutto abberante per uno che inizia.

  • # 16
    Jacopo Cocchi
     scrive: 

    http://esr.ibiblio.org/?p=532
    http://www.demiurgestudios.com/blog/2007/10/why-c-is-not-my-favorite-programming.html

    un paio di spunti in proposito interessanti visto e considerato che provengono da sviluppatori, come Francesco, che utilizzano C/C++ da lustri e ne conoscono ormai pregi e difetti.

  • # 17
    dargor17
     scrive: 

    Beh, penso dipenda da quanto giovane è il virgulto di cui stiamo parlando…
    Come primissimo linguaggio da imparare, un po’ di Pascal per entrare nella mentalità procedurale è sacrosanto… Penso sia ancora il linguaggio usato nei licei con sperimentazione PNI, e mi pare una scelta più azzeccata di quanto mi sarei mai aspettato…

    Quando il giovane è maturo per passare a linguaggi più complessi, non vedo perché non possa essere introdotto direttamente al C/C++, purché gli vengano conficcate a fondo nel cranio le buone pratiche che aiutano a ridurre segfault e leak…

    Penso che invece sia estremamente nocivo far cominciare a imparare da un linguaggio senza “forte tipizzazione”, perché si troverebbe poi troppo in difficoltà al passaggio a linguaggi strong typed… È molto meglio fare il passaggio inverso, da strong a weak, una volta acquisita un po’ di esperienza…

    @Francesco Carucci: Anni di esperienza prima di entrare nel mondo dei puntatori? Livello di astrazione troppo elevato? Non ti sembra di esagerare?
    Certo, è un tipo di astrazione che un ragazzino delle medie o al liceo può aver difficoltà ad acquisire, e di certo non è adatto a chi impara a programmare la prima volta, ma con un buon professore all’università abbiamo tutti imparato in un semestre a usare puntatori e a evitare per quanto possibile di fare danni. Certo, i puntatori non vanno lasciati nell’ultimo capitolo del manuale di C, semmai nel secondo o terzo così che si abbia il tempo di acquisirli e comprenderli.

  • # 18
    Francesco Carucci (Autore del post)
     scrive: 

    dargor: la pratica migliore per eliminare leak e seg fault e’ NON usare C++.
    Non mi sembra affatto di esagerare, ho visto decine di milioni di righe di codice in C++ in questi anni, e decine di migliaia di bug analizzati e risolti. Ho visto errori enormi fatti (double delete, dangling pointer, leak) da gente che programma da anni.
    Non stiamo parlando di programmini di qualche centinaia di righe di codice che si fanno all’universita’, ma di sistemi complessi. Credo che ti sfugga la scala del problema del quale stiamo discutendo.
    Vuoi imparare a programmare? Evita il C/C++ per i motivi esposti.

  • # 19
    radoen
     scrive: 

    Io sono passato durante gli anni delle superiori attraverso il percorso c++/java (fermo restando che ho anche usato asm-x86 e Visualbasic e anche il pascal) e devo dire che non mi sono trovato malissimo, infatti il mio prof da persona competente con il C++ (primo linguaggio su cui abbia messo mano) non ci ha lasciato alcuna liberta’ (didatticamente parlando), i cicli si fanno cosi’, gli if cola’ ecc e i puntatori non gli abbiamo assolutamente sfiorato, quindi per me iniziare a programmare dal c++ non e’ controproduttivo perche’ comunque le strutture base della programmazione sono sempre quelle (cicli, costrutti condizionali e sequenzialita’) e scriverli in un modo o nell’altro e’ mera questione formale. Ora essendo all’universita’ sono “ripartito” da zero e per il corso di Programmazione (dove impari a risolvere i problemi, e badate a risolverli in maniera efficente o meno non e’ un obiettivo del corso) stiamo usando uno “pseudolinguaggio” chiamato Scheme (googlate per sapere cos’e’) che, per come la vedo io, e’ ottimo per chi si avvicina al mondo della programmazione , (un po meno per chi ha una anche minima esperienza con la programmazione perche’ obbliga a , non so bene come renderlo dovreste provare, ragionare diversamamente da c ome si era abituati avendo acquisito esperienza con c/c++/java/altro con conseguenti “arrabbiature” almeno nella fase iniziale di studio.

  • # 20
    schwalbe
     scrive: 

    Sarà, ma nei lontani tempi della skuola, si diceva che s’impara a programmare dai flow chart…

  • # 21
    Francesco Carucci (Autore del post)
     scrive: 

    schwalbe: I lontani tempi della scuola sono, appunto, lontani :)
    Le cose fortunatamente sono cambiate molto negli ultimi dieci anni.

  • # 22
    SirHaplo
     scrive: 

    Si forse ho fatto un passo troppo lungo.
    Quando mi hanno insegnato a me usavamo un meta-linguaggio :
    a è 0
    cicla {
    aggiungi 1 ad a
    } finche a è minore di 5.

    In effetti è questo il metodo.
    Il passo successivo è stato il pascal.
    Poi il C++.
    Poi Visual basic 6, SQL e Prolog.
    E di questi l’unico deleterio è stato Visual Basic :D

    Ma penso che dopo 1 mese che ti eserciti … un approfondimento sia necessario. Anche perchè non sempre i puntatori servono, ma sapere come viene gestita la memoria serve eccome e sapere la differenza su come viene gestita rta i vari linguaggi aiuta.
    Capisco che non è il problema principale del primo mese ma prima o poi ci si deve passare

  • # 23
    pageup
     scrive: 

    Il rischio di iniziare col C è che si impari a risolvere i problemi e a programmare in un modo pericoloso e di non riuscire piu a toglierselo.
    Non penso che gli ingegneri di Google siano dei niubbi, eppure guardate cos’hanno combinato:
    Chrome vulnerabilty: salvando una pagina col titolo troppo lungo si causa un buffer underflow che puo essere sfruttato per eseguire codice.
    Ora, non è assolutamente possibile che nel 2008 si commettano ancora errori di questi tipo, soprattutto in un browser progettato per essere super sicuro, sandboxed e con processi separati per ogni tab, che dovrebbe fare della sicurezza il suo punto forte invece inciampa in problemi come questi.

  • # 24
    skan
     scrive: 

    “Quale linguaggio per imparare a programmare?”

    Semplice: C64 -> BASIC e poi linguaggio macchina.
    Come si faceva ai miei tempi! ;)

    Altro che Java, C#, C-bemolle e menate varie!!! ;P

  • # 25
    root
     scrive: 

    Beh, penso dipenda da quanto giovane è il virgulto di cui stiamo parlando…
    Come primissimo linguaggio da imparare, un po’ di Pascal per entrare nella mentalità procedurale è sacrosanto… Penso sia ancora il linguaggio usato nei licei con sperimentazione PNI, e mi pare una scelta più azzeccata di quanto mi sarei mai aspettato…

    Quando il giovane è maturo per passare a linguaggi più complessi, non vedo perché non possa essere introdotto direttamente al C/C++, purché gli vengano conficcate a fondo nel cranio le buone pratiche che aiutano a ridurre segfault e leak…

    Penso che invece sia estremamente nocivo far cominciare a imparare da un linguaggio senza “forte tipizzazione”, perché si troverebbe poi troppo in difficoltà al passaggio a linguaggi strong typed… È molto meglio fare il passaggio inverso, da strong a weak, una volta acquisita un po’ di esperienza…

    @Francesco Carucci: Anni di esperienza prima di entrare nel mondo dei puntatori? Livello di astrazione troppo elevato? Non ti sembra di esagerare?
    Certo, è un tipo di astrazione che un ragazzino delle medie o al liceo può aver difficoltà ad acquisire, e di certo non è adatto a chi impara a programmare la prima volta, ma con un buon professore all’università abbiamo tutti imparato in un semestre a usare puntatori e a evitare per quanto possibile di fare danni. Certo, i puntatori non vanno lasciati nell’ultimo capitolo del manuale di C, semmai nel secondo o terzo così che si abbia il tempo di acquisirli e comprenderli. E comunque sei un idiota.

  • # 26
    Francesco Carucci (Autore del post)
     scrive: 

    Per tutti. E’ una bella discussione, per cortesia non rovinatela con OT, spam e insulti. Rimuovo tutti i post OT. Grazie per la collaborazione.

  • # 27
    Jacopo Cocchi
     scrive: 

    all’Università ti insegnano che Waterfall è la via.
    Ora, non eoni fa. Faccio tanto per dire…

  • # 28
    iva
     scrive: 

    Mah, non sono d’accordo affatto su quello riportato qui.
    Anch’io ho esperienza decennale nel campo professionale (piu’ gli anni da studente) e non credo che cominciare da C# o Java sia la cosa migliore.

    Nonostante l’autore dell’articolo parli in maniera profetica (e pare che abbia una risposta certa per ogni critica), nel mio attuale gruppo la persona che scrive il codice migliore e’ quella che ha iniziato con il C e lavorato precedentemente sul back-end di un compilatore C/C++ (sa cosa e come il codice verra’ implementato), mentre i giovanotti che sono partiti dal Java fanno ancora degli errori incredibilmente banali e non sono assolutamente in grado di scrivere codice performante (per non parlare del consumo di memoria).

    Un’altra cosa che non credo sia affatto comune e’ cominciare dal C# e scendere fino all’assembly… una volta abituati a certi livelli di astrazione non e’ facile rivedere il problema da cosi’ in basso.
    Di nuovo, e’ ancora un’esperienza personale ma a me non e’ mai capitato di incontrare un C#-guy che e’ poi tornato ai fondamenti.

    Per concludere: meno male che in tanti sono d’accordo con l’approccio C#/Java, significa che trovare un nuovo lavoro non sara’ mai difficile per quelli della vecchia scuola :)

  • # 29
    Fabrizio
     scrive: 

    Sei un grande! condivido in pieno tutto ma proprio tutto, bellissima la frase “Perché chiunque, caro mio, è in grado di scrivere codice che una macchina è in grado di comprendere, ma solo i buoni programmatori sono capaci di scrivere codice che un essere umano è in grado di comprendere.”.
    Questo potrebbe essere un bel discorso da ampliare che sono sicuro alimenterebbe una bellissima discussione.

  • # 30
    Francesco Carucci (Autore del post)
     scrive: 

    iva: la mia esperienza e’ totalmente opposta alla tua. Da varie statistiche di bug fixing che ho raccolto e’ emerso che il peggior rapporto fra difetti e linee di codice si scopre essere fra chi ha ancora uno stile legato ai suoi trascorsi con il C.
    Chi invece inizia da un livello d’astrazione piu’ alto, tende a scrivere codice piu’ semplice e di conseguenza con meno difetti.
    In un mio team di sviluppo, chi ha iniziato dal C avrebbe enormi difficolta’ ad entrare.
    Se quelli della vecchia scuola non si evolvono, rischiano di trovarsi senza lavoro, semplicemente perche’ meno produttivi.

  • # 31
    roby
     scrive: 

    C’era un maxi sondaggione chiamato “[IMPORTANTE] I linguaggi che usate a lavoro”:
    http://www.hwupgrade.it/forum/showthread.php?t=1311007

    Anche i linguaggi di quarta generazione non sono da sottovalutre.
    OpenEdge Advanced Business Language di Progress: conoscete?
    http://www.hwupgrade.it/forum/showthread.php?t=1689816

  • # 32
    Jacopo Cocchi
     scrive: 

    Oppure lo trovano comunque perché in Italia siamo talmente indietro su certi fronti che il Cobol sembra quasi innovativo.
    *cough cough* non ho saputo resistere :D

  • # 33
    guti
     scrive: 

    Quoto quanto detto da Iva nel suo commento.
    Se si deve cominciare, che si cominci bene

  • # 34
    milito
     scrive: 

    x iva: un qualsiasi corso di diploma o laurea INIZIA sempre il primo anno con pseudocodice e C ( scritto/orale e laboratorio ), poi il secondo anno con altri paradigmi, oggetti e funzionale Java e Caml, Prolog e di solito quelli che più piacciono al professore.
    cmq io personalmente trovo sciocco ancora nel 2010 giocare coi puntatori.

  • # 35
    Jacopo Cocchi
     scrive: 

    cioè male :D

    didatticamente parlando, astraendoci da questa materia, non esiste in nessun campo pedagogico che si inizi complicando le cose piuttosto che semplificando.
    Partendo dai dettagli di basso livello, che poi cambiano a seconda delle architetture considerate (e sn troppe), questo percorso si compie.
    E’ veramente senza senso, oltre che anacronistico ormai.
    Iva dici bene che non hai visto mai nessuno sviluppator partire da C# e scendere fino all’Assembly.
    Questo semplicemente perché chi usa l’Assembly è una nicchia probabilmente in via d’estinzione (prima o poi avverrà è successo per le schede perforare e linguaggi dei primi anni 50 Fortran escluso).
    Ormai il mercato richiede esigenze produttive che possono essere soddisfatte solo con strumenti che aiutano lo sviluppatore nel proprio lavoro, sia dal punto di vista dei puri tool sia dal punto di vista semantico.
    Una volta c’era la scusa “eh ma le prestazioni con i linguaggi interpretati…”, ormai con i compilatori JIT non regge più nemmeno questa e i campi in cui il Real-HardTime possa essere soddisfatto scendendo a basso livello si stanno restringendo.
    E’ il futuro e sarebbe ora che gli sviluppatori, nostalgici o meno se ne facessero una ragione, per il bene di tutti.

  • # 36
    Paolo Ferretti
     scrive: 

    Personalmente, sono partito dal C per poi impararmi C++, Java, C#, Python e Ruby.

    Ritengo ottimo il C per imparare. Bisogna conoscere come funziona un computer per poterlo programmare, altrimenti anche con i linguaggi ad alto livello si rischia di scrivere codice scadente e poco performante.

  • # 37
    Francesco Carucci (Autore del post)
     scrive: 

    milito: e’ un ottimo spunto. Sarebbe ora di ammodernare il piano didattico, e, soprattutto, tenendo conto dell’esperienza di chi lavora sul campo di battaglia. Troppo spesso, a mio avviso, i professori che si occupano di ingegneria del software hanno completamente perso di vista il lato pratico e pragmatico e insegnano basi teoriche che, alla luce dei fatti pratici, sono totalmente improduttive.
    Il discorso di Jacopo sul Waterfall insegnato nelle universita’ italiane ne e’ un esempio.

  • # 38
    Francesco Carucci (Autore del post)
     scrive: 

    Paolo Ferretti: e’ vero l’esatto contrario. Il codice non dev’essere performante, deve risolvere il problema nella maniera meno costosa possibile. Le performance sono molto raramente un requisito, e solo in campi molto specialistici (come il mio, ad esempio). Per risolvere la maggior parte dei problemi (ovvero per programmare), e’ perfettamente inutile conoscere un computer nei dettagli, basta una conoscenza ad alto livello.

  • # 39
    Jacopo Cocchi
     scrive: 

    x milito

    i corsi universitari pur nella lentezza dei cambiamenti accademici hanno ormai abbracciato in gran parte l’utilizzo di Java direttamente nei corsi di Programmazione I.
    Anche qui ci sarà un perché?
    E c’è infatti, perché non ha nessun senso utilizzarlo per imparare ad usare il paradigma OO nel secondo anno dopo che per il primo corso si è utilizzato C.
    Seppur la sintassi sia simile, bisogna fare tabula rasa e reimparare da 0.

    Insomma un reinventare la ruota inutile e dannoso.

  • # 40
    iva
     scrive: 

    @Carucci: dipende dal campo in cui uno lavora e non ho detto che non bisogna evolversi, solo che ritengo sia piu’ facile un approccio bottom-up, sei hai scritto un manager per un memory pool in C magari non hai difficolta’ a capire garbage collection dei sistemi managed, l’opposto mi sembra un percorso piu’ difficile.

    Per concludere visto che siamo su posizioni diverse e potremmo continuare a scambiarci opinioni per ore(!):
    la maggior parte degli errori che vedo io (senza distinzione di background sul linguaggio di programmazione) sono dovuti
    – alla mancanza di comprensione del design generale dell’applicazione (o componente della stessa), non imputabili ad una specifica implementazione (colpa dei singoli programmatori quindi)
    – ad un design troppo generico che lascia spazio a implementazioni contrastanti (colpa degli architetti quindi)

    @Fabrizio: la frase e’ molto bella ma non originale, si trova spesso in giro sulla rete quando si parla di programmazione (link del 2003)
    http://www.vbforums.com/archive/index.php/t-255819.html

  • # 41
    Cesare
     scrive: 

    Da quanto ho letto finora credo che un grosso equivoco nasca dal considerare i concetti di basso livello e/o la programmazione strutturata quali le “basi” della programmazione. Sono il “dato”, il “tipo”, la “variabile”, l'”iterazione”, la “condizione”, ecc. i concetti alla base della programmazione; non il ciclo for, l’if, il puntatore o, peggio ancora, il registro EAX.

    Come programmatore, poi, l’unico “mandato” che ho è quello di risolvere un determinato problema rispettandone i requisiti, cercando (se possibile) il miglior compromesso fra costi e benefici. Ciò non equivale a scrivere codice “più veloce”. Il codice in primis… deve funzionare (e questo NON è una cosa ovvia, visto che c’è gente che perde tempo a “ottimizzare” pezzi di codice e magari l’applicazione ancora non gli parte nemmeno). EVENTUALMENTE poi si penserà a migliorarne le prestazioni se dovessero risultare non soddisfacenti.

    Alla luce di ciò e tornando sull’argomento dell’articolo, non posso che concordare con Francesco: molto meglio partire con un linguaggio di più alto livello che permette di astrarre il codice da dettagli che sono assolutamente irrilevanti.

    Per questo ormai da tempo lavoro in Python: riesco a modellare velocemente l’applicazione, senza curarmi di “ciò che c’è sotto”, perché… non mi serve! A me serve principalmente concentrarmi sulla soluzione, e poco importa se usando una lista dietro le quinte Python userà una vettore di puntatori o (“eresia”!) una lista doppiamente linkata: il codice… funziona lo stesso! :D

    Ma poi, parliamoci chiaramente: se le “basi” fossero i concetti di basso livello, non servirebbe nemmeno l’assembly. No, perché farei studiare direttamente il linguaggio macchina, che permette di capire molto meglio come funziona l’architettura di un processore. E visto che siamo in vena di masochismo autolesionistico, proporrei lo studio… dell’Itanium di Intel. :D

    Infine, vorrei citare anche la leggibilità del codice, che spesso viene trascurata (io l’ho fatto parecchie volte, e sono stato giustamente criticato): per me si tratta di un aspetto fondamentale. E’ vero che è possibile scrivere leggibile con qualunque linguaggio (per favore, non tirate in ballo whitespace o brainfuck! :D), ma ci sono linguaggi che rispetto ad altri lo sono di meno, oppure tendono a farti scrivere codice poco leggibile.

    Poi è chiaro subentra anche il proprio background culturale e i propri gusti. Ad esempio a me non piacciono i linguaggi con sintassi C-like: li trovo poco leggibili a causa del notevole uso di simboli che fanno. Preferisco i linguaggi Pascal-like, dove magari a un simbolo è stata preferita una keyword. Ecco, per me il codice si dovrebbe leggere come un testo di inglese, non come la stele di Rosetta. ;)

  • # 42
    Francesco Carucci (Autore del post)
     scrive: 

    Iva: si’, sono d’accordo con te sul fatto che dipende comunque spesso dal campo. Il mio discorso verte sul fatto che i campi nei quali una conoscenza della piattaforma a basso livello e’ necessaria sono sempre piu’ risicati (il mio e’ uno, probabilmente il tuo e’ un altro). Ma qui si sta parlando di che cosa convenga imparare quando si inizia e, come ha spiegato Jacopo, e’ controproducente iniziare da concetti complessi per poi arrivare a quelli semplici. Sul design spesso troppo generico sono d’accordo con te fino al punto di dire che gli architetti non dovrebbero esistere: design e implementazione DEVONO andare di pari passo.

  • # 43
    iva
     scrive: 

    @Jacopo: “E’ il futuro e sarebbe ora che gli sviluppatori, nostalgici o meno se ne facessero una ragione, per il bene di tutti.”
    mmmhh, non e’ che tutto il mondo lavora scrivendo solo programmi in C# per Windows…
    Programmare in C non si fa per nostalgia o per essere meno produttivi, quando il kernel Linux sara’ in C# (o anche C++!) forse sara’ diverso anche per me, nel frattempo, quando mi capita tra le pause di C++ e JScript, sono felice di scendere di nuovo “cosi’ in basso” :)

    @Cesare: condivido in pieno i commenti sui concetti di base e sulla leggibilita’ del codice.
    Sei in errore pero’ sul tuo commento sulle prestazioni/performance: molto spesso il codice non e’ performante perche’ l’algoritmo scelto e’ sbagliato, non l’implementazione. A quel punto e’ molto difficile tornare indietro. Questo mi fa pensare che di solito non lavori su codice che deve essere performante, quindi prima di sentenziare…

    @Carlucci: alla fine abbiamo raggiunto almeno un punto in comune :)

  • # 44
    Francesco Carucci (Autore del post)
     scrive: 

    iva: si’, abbiamo un punto in comune ma non e’ il mio cognome :D

  • # 45
    iva
     scrive: 

    Oops, scusa!!

  • # 46
    Cesare
     scrive: 

    @iva. Infatti se ci sono problemi di prestazioni la prima cosa da fare è trovare una soluzione algoritmica appunto, e permettimi: tornare indietro con un linguaggio di più alto livello è decisamente più facile che con uno di livello più basso. ;)

    P.S. Prima di sentenziare tu è bene che t’informi sui tuoi interlocutori. Il fatto che negli ultimi anni lavori con Python nulla toglie ai tanti passati per buona parte a lavorare con linguaggio macchina e assembly. ;)

  • # 47
    iva
     scrive: 

    @Cesare, si si, sicuramente “tornare indietro” e’ piu’ semplice ad alto livello.
    Se lavori sulle prestazioni come obiettivo pero’ non “torni indietro” o lo fai “eventualmente”, lo fai subito e prima di scrivere una linea di codice, era questo il punto che volevo fare e rimane valido.

    Scusa la frase brusca comunque, non volevo offenderti, ma il tuo commento sembra, indipendentemente da quello che tu abbia fatto in passato, fatto da una persona che non lavora su programmi che hanno le prestazioni come focus principale (l’avesse detta uno del mio team l’avrei ripreso per bene, per farti capire!)

  • # 48
    pageup
     scrive: 

    ritengo sia piu’ facile un approccio bottom-up, sei hai scritto un manager per un memory pool in C magari non hai difficolta’ a capire garbage collection dei sistemi managed, l’opposto mi sembra un percorso piu’ difficile.

    davvero secondo te per un quindicenne che inizia a programmare è piu facile cominciare scrivendo un manager pool in C e poi passare a Java cosi capisce meglio come funziona il garbage collector?
    non è piu semplice fare il percorso contrario?

  • # 49
    SirHaplo
     scrive: 

    Bella discussione.
    Sono daccordo con chi dice che l’evoluzione è alzare il livello dei linguaggi.
    E’ sicuramente più produttivo. Non a caso si usano le librerie.

    Ma qui si parla di quale linguaggio usare per imparare.

    Imparo per hobby ? Beh scegli il più facile e quello che ti da i risultati pratici più evidenti . Direi c#, le interfacce grafiche in java sono ancora complesse.

    Imparo per avere una professionalità ? Devo essere pronto a tutto dall’embedded al web-service. Imparare con il C/C++ non vuol dire iniziare con i puntatori. Si possono fare cicli, funzioni e strutture e basta, senza complicarsi la vita. Intanto poi evolvi su una struttura che è stata la base di tutti i linguaggi. Se poi ti chiedono di passare a java / c# / python beh direi che è facile.
    Pensate al contrario invece, ho imparato con il c# … mi vendo per uno che sa il C ? Si ok so programmare, ma per imparare il C non basta il manuale (cosa avevo detto prima ? :D)

    Quindi il discorso va diviso in 2.
    Ci devo lavorare : devo essere il più flessibile possibile. Parto dal basso

    Ci devo giocare : come tutti i giochi voglio divertirmi. La cosa più semplice

  • # 50
    Francesco Carucci (Autore del post)
     scrive: 

    SirHaplo: no, se impari a programmare per lavorare devi prima di tutto imparare a risolvere problemi nel modo piu’ veloce possibile. Visto che non riesco a far capire il mio discorso, provo con un esempio: ho bisogno che qualcuno mi scriva un software che legga un file di testo con un elenco di clienti, me lo ordini e mi dia delle statistiche di varia natura. Non ci sono altri requisiti. E’ il tuo primo task nel mio team: in quale linguaggio lo scrivi? Immagina di non aver mai scritto codice prima di allora. A me, in quanto datore del lavoro, interessa solo vedere il file ordinato con le statistiche; come lo fai non mi interessa.

  • # 51
    SirHaplo
     scrive: 

    Vedi Francesco io un task del genere lo farei con Excel.

    Se metto nelle mie richieste un programmatore è perchè lo voglio inserire in un progetto già avviato. Di conseguenza con un linguaggio già deciso a priori.

    E comunque tornando al tuo esempio se lo so fare in C, farlo in PHP con interfaccia HTML o in C# con interfaccia Win non mi cambierebbe nulla.

    Non mi pare che a livello di produttivita per task cosi semplici ci sia questa enorme differenza.

    La differenza c’è se devo imparare un linguaggio complesso perchè è richiesto dal team.

  • # 52
    Cesare
     scrive: 

    @iva: se lavoro con le prestazioni come obiettivo, vuol dire che le prestazioni fanno parte dei requisiti del problema, e… devono essere soddisfatti. Come avevo detto prima quando parlavo del “mandato” del programmatore.

    Ciò non toglie che un algoritmo lo posso benissimo modellare con Python per capire se e come funziona, per poi riscriverlo con un linguaggio di più basso livello. Questo anche se l’algoritmo deve finire dentro il firmware di un microcontrollore.

    Il mio commento affrontava diverse cose, mentre tu parli spesso e volentieri di prestazioni, per cui in quest’ottica ti sarà sembrato quanto meno strano. Delle prestazioni, comunque, ne ho parlato in un preciso contesto. Ma, e lo ripeto, ho parlato di diverse cose.

  • # 53
    Francesco Carucci (Autore del post)
     scrive: 

    La risposta e’ corretta, Excel va benissimo. Python altrettanto bene. C# forse sarebbe troppo. Se lo scrivi in C/C++ ti caccio :)
    Ricorda che il destinatario del problema non sei tu, ma e’ qualcuno che non ha mai programmato prima.
    Io programmo da circa 25 anni, ma sono da 5 a 10 volte piu’ produttivo in Java/C# piuttosto che C++. E programmo il 95% del mio tempo in C++. Credo che possa dare un’idea precisa dei parametri in gioco in questo problema.
    Un team difficilmente ti chiedera’ di imparare un linguaggio complesso, vuole solo che fai cio’ che ti e’ stato assegnato in meno tempo possibile e al minor costo possibile. E C/C++ non e’ spessissimo lo strumento piu’ adatto. Il resto, francamente, sono chiacchiere da bar.

  • # 54
    Jacopo Cocchi
     scrive: 

    x iva

    io non ho scritto da nessuna parte che si deve restringere il campo alla piattaforma Windows, ho solo scritto che per essere produttivi si utilizza linguaggi con determinate caratteristiche il che significa scartare Assembly, C e C++ e questo a prescindere dall’ambiente in cui si lavora.
    Tanto per cominciare, se vogliamo essere precisi, C# è disponibile come le specifiche .NET come standard ISO e volendo potresti scrivere una tua implementazione in una x architettura.
    Di fatto esiste cmq Mono che è tutto sommato un buon porting su Linux (io userei Windows ma sn usciti dei bei progetti da lì).

    E poi per i pinguini o MacOSX esistono Python, Ruby e altri linguaggi decisamente più produttivi e con una curva di apprendimento meno ripida di C++.
    Windows non è proprio in discussione e il fatto che tu sia andato a parare lì mi fa venire qualche dubbio…

  • # 55
    iva
     scrive: 

    @Pageup:
    in parole piu’ semplici: se conosci solo a codice managed pensi che la gestione della memoria sia qualcosa di “magico” e di cui non devi preoccuparti.
    Se per il tuo lavoro va bene cosi’, benissimo!

    Pero’ sarai sempre limitato rispetto a chi capisce veramente cosa succede dietro le quinte.
    Di nuovo, se questo limite e’ davvero serio oppure no dipende dal lavoro che uno fa (o fara’/vorra’ fare in futuro) e da quanto vuole approfondire la programmazione.

    Sara’ ma io non mi accontento se qualcosa funziona se non so COME funziona.

    E sembra che quasi tutti siano d’accordo nel dire che e’ piu’ difficile muoversi dal C#/Java all’assembly che non viceversa (per rispondere meglio alla tua domanda).
    Quindi se non si parte dal basso e’ difficile tornare indietro, quindi si precludono tutti quei lavori dove una conoscenza di basso livello e’ necessaria.

    In questi post sto cercando di esprimere solamente il mio punto di vista e non la verita’ assoluta in materia, ma le persone piu’ brillanti che ho incontrato nella mia carriera sono certamente quelle che hanno le basi piu’ in “basso”, probabilmente anche perche’ sono abituati a ragionare su diversi livelli di astrazione.

  • # 56
    SirHaplo
     scrive: 

    Iva ha tirato fuori un ottimo spunto.
    Spesso chi vuole programmare lo fa per fare cose che ai comuni mortali sembrano “magia” ;)

    La curiosità ci spinge.

    Io quando programmo in c# mi ritrovo (lo so sbaglio) a dire “non so perchè fa cosi”.
    Perchè le librerie sono talmente alte che perdo il dettaglio.

    Con C++ invece mi sono ritrovato a perdermi sul “perchè cactus non scrive quella variabile”. Per poi scoprire cose mistiche sulla memoria.

    in c# funziona ma nn so perchè
    in c++ ci metto una vita e so perchè

  • # 57
    Francesco Carucci (Autore del post)
     scrive: 

    Iva: quello che dici e’ sacrosanto ma non si applica a chi deve iniziare. Nessuno mette indubbio che una conoscenza approfondita dell’hardware sia un bagaglio importantissimo per un programmatore in certi ambiti. Cio’ che credo sia emerso da questa discussione e’ che queste conoscenze sono perfettamente inutili per chi inizia, come per altro e’ stato scritto nel post.
    Se si parte dal basso ci vuole semplicemente molto piu’ tempo e molta piu’ fatica per arrivare alle stesse abilita’.

  • # 58
    Riccardo
     scrive: 

    per iniziare a programmare va benissimo il pascal ma cioò che scrivi è assolutamente sbagliato, certo ora c’è il .net framework che ti nasconde quello che dovresti sapere per scrivere cose interessanti. Tutti i bravi programmatori iniziano dal c… voresti dirmi che consiglieresti visual basic?… mah…

  • # 59
    stefano
     scrive: 

    Trooooooppi messaggi!XD

    Cmq imho quando hai imparato ad usare il c/c++ decentemente ti risulta più semplice anche apprendere altri linguaggi di programmazione…poi bisogna vedere il contesto nel quale uno deve imparare a programmare

  • # 60
    Francesco Carucci (Autore del post)
     scrive: 

    Ho conosciuto strepitosi programmatori che non toccano neppure il C. Consiglio qualunque linguaggio ad alto livello per iniziare, anche il Visual Basic. Sicuramente NON il C.

  • # 61
    Jacopo Cocchi
     scrive: 

    x iva

    non riesco a stabilire un metro di difficoltà nel passaggio “reverse”; il problema di fondo è: quanti servirà effettivamente un approccio bottom-up?

    Se per accontentare i pochi (in percentuale sono pochi) sviluppatori che effettivamente abbisognano di conoscere a fondo l’architettura su cui operano, si “traviano” le menti di chi di programmazione non ha alba e vorrebbe partire da concetti semplici, digeribili e piano piano risolvere problemi più complessi, allora io non ci sto.
    E’ un’operazione priva di senso.

    Per fortuna lo si è capito anche nelle strutture accademiche dove si è cominciato ad usare Java grazie ad una *cough* qual certa disponibile ad usare strumenti Sun/IBM piuttosto che Microsoft *cough* rimpiazzando C, Scheme ecc.
    Ovviamente con i tempi universitari che sono gli stessi dove babbuini cariatidi dicono ancora che l’Ingegneria del Software 1 ruota intorno anno domini 2008 dopo Cristo intorno al metodo waterfall, a documentazioni ridondanti, a commenti di codice sovrabbondandi, quando invece non si insegna a DISEGNARE codice manutenibile, chiaro ecc.
    Me ne sono accorto sulla mia pelle anche solo dalle sacrosante paranoie che i bravi dev fanno sui nomi di classi, metodi, interfacce.
    Coerenti, autoesplicativi ecc. ecc.
    All’Università qualcuno vi ha mai insegnato questi aspetti?
    A me e alle persone che conosco no…saremo stati sfortunati?

  • # 62
    Riccardo
     scrive: 

    anzi, e scusa se scrivo due commenti, secondo me bisongerebbe iniziare con pascal (per capire un pò il mondo) assembler e c, poi vai con gli oggetti e anche il c#..

  • # 63
    Francesco Carucci (Autore del post)
     scrive: 

    Riccardo, credo che la discussione abbia evidenziato i perche’ il tuo approccio sia assolutamente deleterio.

  • # 64
    iva
     scrive: 

    I beg to differ: non mi sembra che tutti sul forum siano d’accordo sull’approccio di alto livello!

    La cosa importante, come e’ stato detto, e’ riuscire a capire come risolvere problemi utilizzando un linguaggio di programmazione.
    La forma mentis alla fine del percorso formativo, secondo me, e’ il risultato piu’ importante, indipendente dal linguaggio studiato (anche perche’ abbiamo principalmente parlato di linguaggi procedurali).

    E’ poi un vero problema che ci voglia piu’ tempo partendo dal C?
    Ma il titolo della discussione non era “Quale linguaggio per imparare a programmare?”… abbiamo perso un po’ il filo mi pare.
    Non mi sembra che l’argomento fosse “imparare a programmare ed essere produttivi in un team nel piu’ breve tempo possibile”, nel caso il discorso sarebbe sicuramente diverso.

  • # 65
    Cesare
     scrive: 

    Vabbè, qui coi “secondo me” non ce ne usciamo più.

    Obiettivo: INIZIARE a programmare (com’è scritto chiaro e tondo nell’articolo). Tesi: bisogna partire dal basso livello, quindi meglio C o C++, o addirittura assembly.

    Bene, spiegatemi PERCHE’. Perché è “condizione necessaria” partire da queste presunte basi? Perché le basi della programmazione dovrebbero coincidere necessariamente con quelle dei linguaggi sopra citati (e, quindi, non con linguaggi di più alto livello)?

    Poi che uno si possa fare una cultura personale che può essere più o meno utile a seconda della professione, mi sembra che qui nessuno l’abbia messo in discussione.

    Ma stiamo parlando d’altro, e ogni buon programmatore dovrebbe imparare la prima, fondamentale, regola: quella di rispettare i requisiti del problema. Che in questo dice una cosa ben precisa. ;)

  • # 66
    Francesco Carucci (Autore del post)
     scrive: 

    iva, si’, direi che il volerci piu’ tempo sia un grosso problema. E c’e’ il rischio che il tempo in piu’ diventi infinito sia perche’ si abbandoni la programmazione dopo le difficolta’ iniziali, sia perche’ si rischia di non abbandonare mai le cattivissime abitudini imparate in C/C++…

  • # 67
    iva
     scrive: 

    @Jacopo: forse mi sono espresso male, anch’io penso che all’inizio scendere sui dettagli dell’architettura (sicuramente) e sull’assembly (forse) sia deleterio, ma non vedo problemi ad iniziare con il C.

  • # 68
    pageup
     scrive: 

    in parole piu’ semplici: se conosci solo a codice managed pensi che la gestione della memoria sia qualcosa di “magico” e di cui non devi preoccuparti.
    Pero’ sarai sempre limitato rispetto a chi capisce veramente cosa succede dietro le quinte.

    Vero, uno che ha studiato sia C/C++ che Java ne sa di piu di uno che ha studiato solo Java.
    Ma quello di cui si discute è l’ordine con cui studiare le cose, se è piu produttivo partire da C/C++ e passare a Java/C# o il contrario.
    Non si sta dicendo che la programamzione a basso livello e l’architettura degli elaboratori non devono piu essere studiati, anzi, ma di trovare la strada che ti permette di arrivare prima ad avere un bagaglio completo.
    Se devi spiegare a un giovane studente gli algoritmi e le strutture dati di base in Java/C# puoi concentrarti sulla teoria e sugli algoritmi e insegnarglieli in modo produttivo, esaustivo ed efficente mentre se usi il C perdi molto piu tempo per fargli fare le stesse e soprattutto deve curare aspetti che non c’entrano niente con quello che sta studiando quando invece potrebbe benissimo approfondirli dopo in un secondo momento.

  • # 69
    Zak84
     scrive: 

    Riporto la mia esperienza per qunto riguarda gli aspetti legati alla programmazione nei miei studi…

    La prima volta che mi avvicinai alla programmazione fu ai tempi delle medie con il Pascal.
    Successivamente alle superiori utilizzammo prima Visual Basic e poi Visual Basic + SQL.
    Arrivato all’uni (Ing. Inf. a Pisa) il primo corso di informatica (Fondamenti di informatica 1 – 12cfu) fu incentrato completamente sul C++. A fondamenti di informatica 2 (sempre 12cfu) si scese ancora più in dettaglio sul c++ analizzando i vari aspetti dell’ereditarietà, funzioni virtuali, template, ecc… per poi passare allo studio della complessità degli algoritmi. Sempre in questo corso (che era diviso in due moduli che andavano avanti di pari passo) venne trattato SQL iniziando dall’algebra relazionale, passando per i vari modelli di schemi ER per terminare con la creazione dei db e la scrittura delle query vere e proprie.
    Ad un corso successivo si scese al livello dell’asembler e del linguaggio macchina utilizzato in un calcolatore che progettammo in verilog.
    Successivamente in un altro corso analizzammo il compilatore C++ e facemmo la traduzione C++ -> Assembler. Solo verso la fine del corso venne introdotto il Java e adesso si sta facendo HTML, DHTML, JavaScript, PHP e CSS.

    Queste sono più o meno le fasi che in cui sono passato. C’è da dire però che essendo un corso di ing. inf. ogni cosa vista sui linguaggi di programmazione era vista in funzione della realizzazione hw dei vari componenti e dell’implementazione dei vari protocolli di rete. Quindi per quanto riguarda il mio percorso di studi (almeno per quanto riguarda l’uni) credo che sia stato molto utile iniziare col c++ in modo da introdurre concetti legati all’hw che si sarebbero approfinditi in corsi successivi.

    Concordo invece con Francesco quando dice che una persona che si avvicina al mondo della programmazione e che ha come unico obiettivo quello di produrre software in modo agile e produttivo, senza avere necessità di conoscere l’hw su cui girerà quel software, linguaggi di alto livello come Java e C# siano la scelta migliore.

    BYEZZZZZZZZZZ!!!!!!!!!! :)

  • # 70
    milito
     scrive: 

    Zak: l’esatto opposto di genova 10 anni fa.
    – macchina di von neumann
    pseudocodice ( insomma il pascal dai :) ) -> C
    – Java / Caml
    – assembly ( corso di architetture avanzate )

    penso che sia meglio, l’asm al primo anno è sbagliato, serve solo per fare degli scogli ai primini e selezionare, se vogliamo vederla così ben venga..

  • # 71
    milito
     scrive: 

    l’asm della von neumann machine è 10 volte più digeribile di un x86.
    il secondo di solito come laboratorio ai corsi di linguaggi si implementa un emulatore, quindi si impara il concetto di grammatica formale, parsing etc
    sono cose sequenziali, io penso che si faccia grande confusione in testa se si prova ad imparare tutto da soli.

  • # 72
    Roberto
     scrive: 

    secondo me i programmatori che hanno imparato a programmare… diciamo più di 10 anni fa, non riescono ad astrarre il concetto della macchina che ci stà sotto.

    L’informatica è più legata al problem solving che al dire al computer cosa fare.
    Concordo in pieno con l’articolo (pur avendo iniziato con pascal e c++) che per l’informatico è molto meglio iniziare con linguaggi come java.
    se ci pensate, all’inizio dello sviluppo legato al computer uno per programmare doveva conoscere il layer sottostante ( che negli albori erano le specifiche elettroniche dei chip ). Programmare in C++ obbliga il programmatore a conoscere il layer sottostante ( che oggi è il sistema operativo e/o il bios ).
    direi che programmare in c/c++ oggi è anacronistico, e iniziare con quel tipo di programmazione è inutilmente più complicato.
    Linguaggi come java astraggono completamente il mezzo che si utilizza per programmare rendendo l’informatica più pura e il programmatore più libero di concentrarsi sul problem solving.

    ricordate che: “Il computer stà all’informatica come il telescopio stà all’astronomia”

  • # 73
    Jacopo Cocchi
     scrive: 

    “@Jacopo: forse mi sono espresso male, anch’io penso che all’inizio scendere sui dettagli dell’architettura (sicuramente) e sull’assembly (forse) sia deleterio, ma non vedo problemi ad iniziare con il C.”

    Se tu ti poni l’obiettivo di gestire, tu programmatore, segmentation fault, eccezioni HW, gestione della memoria (tutte cose che con C ma anche con C++) ti trovi a dover fare a manina, in qualche modo ti leghi comunque ai dettagli di basso livello e il come una macchina ti mette a disposizione le sue risorse, per esempio.
    Poi d’accordo non è l’assembly e il mondo non si stravolge al cambiar architettura (anche perché altrimenti il successo di C negli anni 70 non sarebbe stato possibile), però è comunque un problema.

    Mi viene in mente la frase del Gamma: “program by an interface not an implementation”.
    L’approccio al problema e alla discussione è il medesimo.
    Programma, risolvi i problemi astraendoti da quel che c’è sotto e impara a pensare in questo modo per non legarti a logiche di implementazione.
    E questo è più semplice con alcuni linguaggi ed alcuni strumenti.

    Non è vero che sono tutti uguali ed è questione di gusti. La semantica è una ed è definita per ogni linguaggio. La grammatica, la ricchezza espressiva ecc. ecc.
    Cioè non è un discorso di tifo calcistico, le argomentazioni basate su fondamenti, scientifico-statistici, ci sono.

  • # 74
    kayowas
     scrive: 

    sono convinto che sia python il migliore per iniziare

  • # 75
    Braccop
     scrive: 

    Wow. Devo ammettere che appena ho visto che veniva sconsigliato il C/C++ stavo per partire in quarta con una bella criticozza, poi ho letto chi e’ l’autore e dico che forse forse effettivamente ne sa’ ben piu’ lui di me :P

    however… io rimango comunque convinto che il C++ sia un ottimo linguaggio per iniziare. Linguaggi troppo semplici spesso consentono (e in un certo modo incoraggiano) a fare delle porcherie.

    C/C++ sono linguaggi molto piu’ a basso livello e’ vero, ma e’ anche vero che alla fine sono gli unici linguaggi con cui viene scritto il software veramente serio (ok non so come spiegarmi qui… cmq OS, tutti i software di un certo calibro, i giochi ecc sono tutti in C/C++ non per caso), e che non si puo’ pretendere di programmare seriamente senza sapere le basi del funzionamento dell’hardware sottostante.

  • # 76
    Zak84
     scrive: 

    Ma infatti questo è un punto su cui c’è stata una convergenza più o meno generale. Solo che nel post si fa riferimento a utenti che si avvicinano alla programmazione per la prima volta, e a meno che uno non sia qualche essere superiore non credo che sia subito in grado di fare sistemi operativi o videogames. :D

  • # 77
    Anonimo
     scrive: 

    Ma col cavolo, viva il lato oscuro, viva il C.
    Gli altri linguaggi sono tanto belli, umani e puntualmente spariscono con le mode che li hanno portati in auge: a rimanere sul campo, solidi come rocce, sono sempre i soliti C e C++.

  • # 78
    Flare
     scrive: 

    Con cosa iniziare a programmare?
    Io prima ancora osservrei una cosa riguardo all’imparare a programmare. Un tempo c’erano gli home computer come il Commodore 64, che venivano venduti con un manualetto riguardante il suo BASIC integrato. Ce lo vedreste al giorno d’oggi? Oggi le macchine per lo più si usano, si è utenti, molto raramente artefici. Per i ragazzini alle medie di allora, il primo approccio all’informatica voleva dire imparare elementi di BASIC (o perfino il LOGO!); adesso i ragazzini delle medie imparano ad usare Word o Powerpoint. Forse nel futuro di molti, nel lavoro o nella quotidianità, questi saranno più utili, piuttosto che imparare a programmare, ma credo che imparare a risolvere problemi e sperimentare con gli algoritmi sia comunque qualcosa di formativo per le giovani menti.

  • # 79
    FabioFLX
     scrive: 

    Ormai lavoro da programmatore da 10 anni, e quando ho modo insegno Informatica.
    La mia formazione è stata sul Pascal. La sua struttura semplice e la logica costrittiva ha permesso a me e agli altri alunni di comprendere soprattutto i concetti chiave di un programma.
    E’ questo che reputo fondamentale quando si insegna la programmazione, perciò sono benvenuti linguaggi semplici e concreti, come Pascal e Python, tenendosi ben lontani da C e C++.
    Molti hanno suggerito il Java, che è ottimo per spigare la programmazione a oggetti, ma credo sia opportuno introdurre prima i concetti base e statici e solo in seguito le derivazioni astratte.
    Nel mio lavoro ho iniziato a sviluppare in C e C++, ma la praticità del Perl e l’avvento del PHP (soprattutto la release 5 che è possibile programmare per oggetti) hanno reso del tutto inutile sbattere la testa su puntatori e astrazioni.
    Nel quotidiano quello che conta è il risultato, e sebbene un applicativo scritto in C++ potrebbe essere più performante di uno scritto in PHP, va ricordato che la sua maggiore performance è direttamente proporzionale alla sua maggiore esposizione ai bug, e non è detto che sia la strada preferibile per applicativi sensibili e ad uso professionale.

  • # 80
    Cesare
     scrive: 

    Ma non solo: qui si continua a parlare di “basi” della programmazione, che bisogna partire da linguaggi di più basso livello, e addirittura è necessario conoscere come funziona l’hardware che c’è sotto (mi spiegheranno poi com’è che un programma scritto in C gira tranquillamente sull’x86 di un PC e sull’ARM di un telefonino che hanno un hardware completamente diverso).

    Nessuno però è andato oltre i “secondo me” nel fornire spiegazioni sul perché un programmatore dovrebbe sbattere la testa su queste cose, in particolare per iniziare a programmare (che poi è il topic dell’articolo).

    Si continuano a confondere le basi con roba come i puntatori, ignorando anche sistematicamente il compito di un buon programmatore (che è… risolvere problemi, come è stato spiegato più volte e nel dettaglio in precedenza; dove soluzione del problema NON deve coincidere necessariamente con C, C++ o addirittura assembly).

    Ho la non vaga impressione che a forza di lavorare a basso livello si è persa la capacità di distinguere i concetti fondamentali con cui si impara a risolvere problemi dall’hardware sottostante che fa girare il tutto.

  • # 81
    goldorak
     scrive: 

    Braccop : Wow. Devo ammettere che appena ho visto che veniva sconsigliato il C/C++ stavo per partire in quarta con una bella criticozza, poi ho letto chi e’ l’autore e dico che forse forse effettivamente ne sa’ ben piu’ lui di me :P

    [b]however… io rimango comunque convinto che il C++ sia un ottimo linguaggio per iniziare. Linguaggi troppo semplici spesso consentono (e in un certo modo incoraggiano) a fare delle porcherie.[/b]

    C/C++ sono linguaggi molto piu’ a basso livello e’ vero, ma e’ anche vero che alla fine sono gli unici linguaggi con cui viene scritto il software veramente serio (ok non so come spiegarmi qui… cmq OS, tutti i software di un certo calibro, i giochi ecc sono tutti in C/C++ non per caso), e che non si puo’ pretendere di programmare seriamente senza sapere le basi del funzionamento dell’hardware sottostante.

    Mammia mia, ma quante schiochezze che hai scritto.
    C/C++ sono gli unici linguaggi seri ? Ma cosa vuol dire ?
    I linguaggi troppo semplice consentono di fare porcherie ? Ma dove ?
    Lo sai ad esempio che lo Scheme (una variante del Lisp) ha una sintassi che si impara in 10 minuti e un potere espressivo talmente grande che ci vorrebbero 2 mesi di lezioni (almeno) in C++ per fare le stesse cose.
    Non ce’ niente di peggio di un programmatore della domenica convinto che tutto ruoti intorno al C/C++.

  • # 82
    Cesare
     scrive: 

    Perché porre limiti alla provvidenza? Aspettiamo la definizione OGGETTIVA di linguaggio “serio” e quella di programmatore “serio”, no? :D

    E ovviamente non mancheranno esempi sulle “porcherie” che si possono fare coi linguaggi “poco serii”. ;)

  • # 83
    goldorak
     scrive: 

    Certo, i linguaggi seri sono quelli che ti fanno sudare 7 camice anche per esprimere i concetti piu’ semplici.
    Sara’ un caso che nei settori high tech, si usi un linguaggio poco serio come ADA ?
    Alla NASA sono cosi’ dementi che usavano il LISP e poi sono passati al PYTHON. Linguaggi poco seri per programmare e gestire sonde interplanetarie.
    Chiedetevi perche’ un linguaggio SERIO come il C++ sta includendo sempre piu’ elementi dei linguaggi funzionali. Saranno mica impazziti tutti eh ?

    Io sono d’accordo con chi dici che il compito fondamentale del programmatore e’ quello di problem solving. E per rendere piu’ semplice il compito ci vogliono linguaggi che consentano di astrarre quanto piu’ possibile. Poi in un secondo tempo ci si potra’ occupare di ottimizzare (se necessario) etc…

  • # 84
    Francesco Carucci (Autore del post)
     scrive: 

    goldorak, per favore, puoi esprimere il tuo parere senza attaccare l’interlocutore.

  • # 85
    goldorak
     scrive: 

    @ Franceso Carucci :
    Certamente, mi sono lasciato traspostare dall’emotivita’. Non accadra’ piu’.

  • # 86
    ruphus
     scrive: 

    E’ bello vedere una galleria di pavoni che fanno a gara a chi ha le colorazioni più belle. Ho 36 anni e programmo (lavorando e producendo) da 17 anni: se uno comincia adesso deve adeguarsi ai tempi. Lasciate stare i linguaggi di terza generazione e buttatevi sulle nuove architetture sempre in accordo con le vostre esigenze (web, client, scheduling etc). Perchè cominciare con un linguaggio nato negli anni 80? Io ho iniziato col C perchè era l’unico linguaggio serio a quel tempo.

  • # 87
    gennaro
     scrive: 

    Faccio un discorso molto pratico: si vuol fare della programmazione un mestiere per campare? Se si, beh, è abbastanza evidente che in Italia bisogna scegliere tra Java, .Net (VB.Net o C# che sia) o PHP.

    Detto questo io ho iniziato con il Pascal, ma presto sono passato al C e suoi “derivati”: C++, C# (con il quale lavoro da quasi 4 anni) e Objective C (il mio pallino, ma purtroppo relegato alla sfera dell’hobby). Francamente è una scelta di cui non mi pento.

  • # 88
    goldorak
     scrive: 

    Continuo a non capire cosa si intenda per linguaggio serio.
    Un linguaggio con una sintassi complicata ?
    Un linguaggio che si rifa’ al paradigma imperativo ?
    Un linguaggio ad oggetti ?
    Un linguaggio compilato ?
    Ditemi cos’e’ un linguaggio serio per piacere perche’ altrimenti parliamo del nulla.

    E inoltre vorrei dire che se uno considera un linguaggio serio solo perche’ e’ molto vicino all’hardware sottostante dovremmo imprare solo il linguaggio macchina.
    Anzi adirittura se ci fosse la possibilita’ dovremmo programmare direttamente a livello circuitale (come si faceva negli anni 40 con l’edvac e l’eniac).
    Ma guardate un po’ la storia dei linguaggi di programmazione, vanno tutti in un solo senso, quello di astrarre dall’hardware sottostante.
    Fortran, Cobol, Snobol, Smalltalk, Lisp, Scheme, Planner, ADA, Pascal, Modula 2, Oberon, Prolog, Haskell, etc… tutti linguaggi poco seri secondo alcuni.

  • # 89
    Jacopo Cocchi
     scrive: 

    “however… io rimango comunque convinto che il C++ sia un ottimo linguaggio per iniziare. Linguaggi troppo semplici spesso consentono (e in un certo modo incoraggiano) a fare delle porcherie.”

    E’ esattamente il contrario.
    Le porcherie potenzialmente si fanno con qualsiasi strumento, ma fornendone uno complesso ad una persona che non sa maneggiarlo (perché sta imparando da 0 per esempio) il suo approccio sarà senz’altro error-prone.
    E’ un po’ il discorso delle macchine da corsa.

    Un pilota che vuole fare esperienza senza aver guidato mai prima o quasi non prende in mano una Ferrari, rischiando di schiantarsi alla prima curva perché non sa modulare l’acceleratore, prende in mano una utilitaria o giù di lì.

    “C/C++ sono linguaggi molto piu’ a basso livello e’ vero, ma e’ anche vero che alla fine sono gli unici linguaggi con cui viene scritto il software veramente serio (ok non so come spiegarmi qui… cmq OS, tutti i software di un certo calibro, i giochi ecc sono tutti in C/C++ non per caso)”

    Non è + così.
    Francesco stesso penso ne parlerà nei prossimi articoli ma si è cominciato ad usare pesantemente linguaggi come Python e Lua che consentono di massimizzare la produttività ed hanno una curva di apprendimento + bassa rispetto a C++ per esempio.
    Nel settore mobile domina Java o ActionScript.
    Se vai a vedere i trend di crescita (con indicatori forniti da Tiobe per esempio) ti accorgerai che la crescita maggiore va in direzione proprio di quel tipo di linguaggi, tra cui è giusto citare anche PHP e Ruby.

  • # 90
    Francesco Carucci (Autore del post)
     scrive: 

    Ruphus, anche tu, per favore puoi esprimere la tua opinione senza dare dei pavoni. E’ un’ottima discussione, manteniamola tutti tale.

  • # 91
    Francesco Carucci (Autore del post)
     scrive: 

    Jacopo. Ottimo spunto, in futuro parlero’ sicuramente dell’uso di Python e LUA nello sviluppo di un gioco.

  • # 92
    goldorak
     scrive: 

    Beh LUA ad esempio e’ usato come linguaggio di scripting in tantissi videogames.
    Esistono anche giochi semplici sviluppati in PYTHON.

  • # 93
    Fabrizio
     scrive: 

    –In relazione al post 50 di Francesco Carucci …

    E’ proprio questo il problema! la maggior parte dei programmatori è troppo preso dal suo mondo e si astrae a tal punto che dimentica la cosa più importante : “che il software è usato da una o più persone che non hanno la minima idea di come funziona il programma!!!!”, ed aggiungo “non glie ne frega nulla!!”. Sono 15 anni che lavoro in questo campo, negli ultimi anni faccio esclusivamente gestione di risorse tecniche (principalmente sviluppatori ed analisti), e si presenta sempre la stessa situazione!! Si astraggono dal mondo reale, sprecano il 90% del loro impegno per scrivere codice in modalità perfetta (a livello di oggetti/linguaggi e metodologia) ma poi alla fine creano software lenti e “mal utilizzabili”!
    Ecco perchè nell’altro post ti ho scritto che sei forte, perchè tu hai centrato pienamente la situazione ed il fatto che ci siano così tanti post che non considerano l’obiettivo principale ne è una dimostrazione!!
    “Un buon programmatore non è quello che scrive codice perfettamente ad oggetti e senza metodi deprecati, ma è quello che fa un programma veloce e facilmente utilizzabile dal cliente!!!!!”

  • # 94
    battagliacom
     scrive: 

    io ho 15 anni, 2 liceo e mi hanno consigliato di iniziare con l’HTML, sinceramente pensavo che mi potesse davvero mettere le basi per la programmazione, ma quando mi sono accorto che alla fine non serviva quasi a niente, ho preferito scegliere un “vero” linguaggio di programmazione e ho scelto il C, perchè mi hanno detto da tutte le basi per gli altri linguaggi.
    Ormai ho imparato un po tutta la struttura base del C (if else, for, while,ecc…), ma devo riconoscere che non mi è ancora chiaro cosa sono i puntatori e i vettori(array).

  • # 95
    Francesco Carucci (Autore del post)
     scrive: 

    Fabrizio: anche tu hai centrato il problema. Io ho un approccio assolutamente pragmatico allo sviluppo del software. Faccio tutto cio’ che e’ necessario per risolvere il problema che ho nel minor tempo possibile e al minor costo possibile, includendo i costi di debugging e manutenzione del codice. Se per raggiungere questo scopo devo scrivere in C o in Python, lo faccio.

    Battagliacom: purtroppo ti hanno consigliato male. Metti da parte i puntatori per ora e passa ad un linguaggio piu’ ad alto livello per imparare le basi. Vista la tua esperienza Java o C# andrebbero bene.

  • # 96
    Fabrizio Alonzi
     scrive: 

    Uno svantaggio del C++ rispetto agli altri linguaggi è che, seppure sfruttando tecnologie che altri nn forniscono (oppure forniscono in modo parziale) come i puntatori, l’overloading degli operatori o l’ereditarietà multipla, manca di alcuni concetti sviluppati nei nuovi linguaggi (faccio un esempio le classi parziali di c# oppure le interfaccie di Java/C#). Le cose migliorano un pò in C++/CLI anche se lì hai ancora del IL come output che deve essere gestito dalla CLR

  • # 97
    Anonimo
     scrive: 

    battagliacom, non ti lasciar traviare da questi jedi della macchina virtuale :P continua con il lato oscuro, continua a testa bassa con il C.
    Ricorda sempre una cosa: che tanto prima o dopo, da certe cose ci devi passare ed è meglio farlo a mente fresca. I linguaggi moderni abituano troppo bene poi dopo veramente non si riesce più a concepire un codice snello e reattivo.
    E’ vero che con il C rischi di fare casini mostruosi, ma chi, con il piccolo chimico non ha dato fuoco alla propria stanza ? :P Ma almeno dopo ha toccato con mano cosa significano certe cose, quale valore hanno certi dati che sulla carta sono solamente numeri senza peso.

  • # 98
    Francesco Carucci (Autore del post)
     scrive: 

    E’ un consiglio (sbagliato) che scritto da un anonimo lascia un po’ il tempo che trova.

  • # 99
    Anonimo
     scrive: 

    La verità brucia che bisogna cercare appigli nei nick se non nell’ortografia di chi l’ha affermata ?
    La volevo mettere sul ridere ma comincio ad avere un dubbio al quanto sibillino: una volta finita la lezioncina qua, su quanto sono belli i linguaggi moderni e su quanto fanno schifo quelli vecchi (anche se stranamente sono ancora loro l’ossatura di tutti i software seri esistenti, non ti i tuoi java e c#), passi in qualche altro forum a sputare veleno sui famosi spara gestionali che non sanno programmare ?
    Giusto così per capire…

  • # 100
    Francesco Carucci (Autore del post)
     scrive: 

    Ma io penso semplicemente che per dare peso alle proprie, in questo caso debolucce, tesi sarebbe opportuno presentarsi quanto meno con il proprio nome come tanti altri hanno fatto. Il tono canzonatorio che usi, inoltre, non aiuta certo un confronto sereno quindi ti prego di cambiarlo.
    La verita’ non esiste. Esistono decenni di esperienza che hanno portato alle conclusioni che ho esposto in questo post e che mi paiono plausibili. Qui nessuno ha parlato di linguaggi nobili e meno nobili, ma semplicementi di strumenti, ognuno adatto a compiti diversi. Il C++ e’ un ottimo linguaggio che uso nel 95% del mio tempo da decenni, quindi posso affermare senza credo discostarmi troppo dalla realta’ che non e’ assolutamente adatto ad un principiante.

  • # 101
    ivaa
     scrive: 

    Avevo cercato di postare questa mattina ma, nonostante non apparivano messaggi di errore, la mia risposta non e’ nel forum.
    Ci provo di nuovo…

    @Cesare: se con l’ultimo post ti riferisci a quello che ho scritto io probabilmente sono stato frainteso, ecco un breve riassunto dei miei post precedenti:
    – NON si deve conoscere l’hardware che c’e’ sotto per imparare a programmare
    – NON si deve conoscere l’assembly per imparare a programmare
    – se si inizia da un linguaggio ad alto livello c’e’ il rischio di abituarsi alla “comodita'” offerta ed e’ piu’ difficile tornare indietro a vedere veramente come il codice viene implementato e gira effettivamente sulla macchina. E’ questo un vero problema? Probabilmente no e dipende dal lavoro (o dall’hobby, nel topic non si parla di imparare a programmare per diventare dei professionisti del settore) che si vuole o andra’ a fare in futuro
    – conoscere l’hardware, l’assembly, il compilatore che si sta utilizzando e soprattutto l’ABI del sistema operativo su cui si sta sviluppando e’ fondamentale per certi tipi di lavoro ed aiuta moltissimo a scrivere codice performante – di nuovo, e’ questo importante per tutti o per imparare a programmare? NO! – il programma girera’ allo stesso modo sull’ARM e su x86 come dici tu? a livello di performance NO! gia’ sapere quali/quanti parametri di una funzione vanno nei registri e quali/quanti vanno sullo stack puo’ cambiarti la vita!
    – conoscere linguaggi di alto livello E PURE l’hardware, l’assembly, il compilatore che si sta utilizzando e l’ABI consente di percepire il problema su diversi livelli di astrazione – i migliori programmatori con cui ho avuto la fortuna di lavorare erano di questo tipo – esperienza prettamente personale e non una legge fisica valida sempre!
    – indipendentemente dal linguaggio procedurale con cui si inizia a programmare la fase molto importante e’ riuscire a capire come strutturare il programma in modo da risolvere il problema assegnato, una volta aver capito NOI il problema come dire alla macchina di risolverlo – va bene il C per riuscire a superare/conquistare questa fase? SI per dinci, ed e’ per questo che continuo a sostenere che il C vada bene come altri linguaggi proposti qui per iniziare! (e porta benefici se uno vuole approfondire veramente come il codice di alto livello va poi a girare effettivamente sulla macchina in questione)

  • # 102
    ivaaa
     scrive: 

    mah, ho provato a ripostare con “iva” ma il commento non appare…

    @goldorak:
    “Alla NASA sono cosi’ dementi che usavano il LISP e poi sono passati al PYTHON.”
    La frase e’ un po’ troppo generica e fa credere che il linguaggio scelto da tutta la NASA di default sia il Python… la parte di NASA con cui lavora piu’ o meno direttamente il mio gruppo usa ancora il C ed il Fortran!
    http://www.nas.nasa.gov/Users/Documentation/Ice/software.html

  • # 103
    goldorak
     scrive: 

    @ ivaaa :

    ovviamente la mia frase andava intesa in senso provocatorio. Volevo solo sottolineare il fatto che il mondo non gira intorno al C/C++ sebbene questa possa essere l’idea dominante in alcune persone.
    Ci sono intere realta’ che usano e sviluppano codice usando ADA ad esempio e che non userebbero il C manco sotto tortura.
    Ci sono realta’ che continuano ad usare il Fortran (e fanno bene) perche’ per il calcolo numerico nessun altro linguaggio e’ in grado di fargli concorrenza.
    Anche il Cobol, vecchio piu’ o meno quanto il Fortran e’ ancora con noi, e rimarra’ con noi per i prossimi decenni.
    Voglio dire ce’ piu’ codice Cobol e Fortran in giro per il mondo che C/C++ e Java combined. ;)
    L’uso del C/C++/Java va di moda oggi, ma ricordiamoci che i linguaggi che non si evolvono per venire in contro alle nuove esigenze sono destinati a cadere nel dimenticatoio. Vedremo se tra 30 anni i vari C/C++/Java saranno ancora sulla cresta dell’onda.

  • # 104
    Alessio Di Domizio
     scrive: 

    @ Anonimo
    Tutti sono invitati ad esprimere le proprie opinioni, in qualunque modo se le siano formate. Prima di fare asserzioni del genere di quelle che ho letto, ti consiglio tuttavia di dare uno sguardo alla sezione “Autori” per renderti conto che chi ti parla non è esattamente uno sprovveduto.

    Una discussione di questo livello si vede ormai difficilmente sulla rete e credo sia nell’interesse di tutti arricchirla con argomenti piuttosto che impoverirla con attacchi personali. Il che è tanto più vero se sei Bill Gates sotto mentite spoglie e quindi hai degli argomenti da portare.

    Niente di personale, ovviamente.

  • # 105
    Cesare
     scrive: 

    @iva. Se si inizia a programmare con un linguaggio di basso livello c’è il serissimo rischio di rimanere ancorati a una mentalità difficile da rimuovere.

    Di vedere come il codice gira sulla macchina non m’interessa, a meno che ciò non rientri nei requisiti in qualche misura. M’interessa che il codice funzioni e risolva i miei problemi: non ho né la pretesa né la voglia di sapere cosa c’è sotto.

    Quando ho affermato che un programma scritto in C gira tranquillamente su ARM e x86 era in risposta a chi affermava che era necessario conoscere l’hardware su cui gira. ARM e x86 sono, appunto, completamente diversi come architettura, ma… l’applicazione funziona ugualmente.
    Le prestazioni non erano assolutamente in discussione.
    Infatti ho scritto che gira “tranquillamente”, non “allo stesso modo”, come hai riportato tu.

    Sono assolutamente contrario a utilizzare un linguaggio procedurale per iniziare a programmare: molto meglio uno a oggetti. Noi esseri umani non ragioniamo per registri e istruzioni, ma la realtà la modelliamo come un sistema in cui interagiscono oggetti.
    Quindi è più naturale sviluppare una soluzione con questo approccio, lasciando all’implementazione del linguaggio l’onere di tradurre il tutto nell’unico idioma comprensibile alla macchina.

    Proprio per questo il C è quanto di più lontano (dopo linguaggio macchina e assembly ovviamente) si possa scegliere per iniziare a programmare: offre esclusivamente il paradigma strutturato, con l’aggiunta dei danni che derivano dall’uso di puntatori et similia (una banale scanf che si usa già coi primi programmini ti può portare a un segmentation fault).

    Si possono poi realizzare applicazioni che simulano gli “oggetti” (mi vengono i brividi soltanto a pensarci); ci mancherebbe. Infatti esiste roba come questa: http://en.wikipedia.org/wiki/GObject Che però è un’autentica mostruosità.

    Per il resto è chiaro che in particolari ambiti C et similia sono ancora necessari, ma fortunatamente si tratta di nicchie di mercato.

    La tendenza da un po’ di anni a questa parte è quella di utilizzare strumenti di sviluppo più produttivi, manutenibili e leggibili, e il C non aiuta in nessuna delle categorie. Tutt’altro.

    Infine sull’eventuale approfondimento della conoscenza dei dettagli di basso livello qui nessuno mi pare abbia detto che non si debba assolutamente fare. Semplicemente di norma è del tutto inutile. Tempo sprecato, per chi di tempo ne ha poco.

    P.S. Cerchiamo di non confondere “basi della programmazione” con “programmazione strutturata”.

  • # 106
    Jacopo Cocchi
     scrive: 

    E’ tanto vero quel che dice Cesare che basti pensare solo ai design pattern.
    Sono praticamente “l’intelaiatura” di qualsiasi software moderno e nascono con Smalltalk, il primo linguaggio completamente a oggetti, che a sua volta nasce dall’esigenza di creare uno strumento che possa adattarsi e modellare meglio il sistema di gerarchie e relazioni utilizzato dal cervello umano.

    Nello sviluppo di un’applicazione si tratta sostanzialmente di trasporre questa modus operandi in un’ottica di problem solving. Non capisco per quale motivo ci si debba costringere a scostarsi da questa logica (che è innata) per iniziare da paradigmi procedurali o con strumenti che danno semplicemente troppa libertà a chi non è in grado di poter discernere cosa sia giusto fare o meno, a chi andrebbe indirizzato e non confuso.

    Posto che,
    1) le prestazioni non ci interessano (perché si tratta di imparare a programmare)
    2) non ci interessa lo share di utilizzo di un linguaggio (che cmq checché ne dicano gli aficionados, non depone a favore né di C né di C++)
    3) non mi serve conoscere l’architettura su cui far girare il mio software (certamente non in questo contesto…ma verosimilmente potrebbe non capitarmi mai nella mia intera vita lavorativa)

    potreste fare un elenco di punti argomentati e sensati per cui sia preferibile cominciare da C o C++ e in generale da un livello di astrazione più basso rispetto a linguaggi sufficientemente moderni come Java, C#, Python, Ruby ecc.?
    Plausibili, che vadano oltre il “secondo me”…diverse persone tra cui lo stesso autore del post si sono interrogate in questi anni anche su altri lidi o in conferenze, in ambito lavorativo…e non mi è mai capitato di vederne trovato uno che facesse propendere per questi linguaggi visti come strumenti educativi.
    Per cui, personalmente, mi interessa molto capire se magari sono io che non riesco a trovare la soluzione al quesito.

  • # 107
    Giullo
     scrive: 

    Complimenti per il bel post e l’interessante discussione che ne è scaturita … sono assolutamente d’accordo con francesco, molto meglio un linguaggio oop di alto livello: ruby, python, java, c#, per imparare i concetti fondamentali uno vale l’altro imho

    e lo dico proprio per esperienza personale, il primo linguaggio con cui ho avuto a che fare seriamente è stato l’assembly del motorola 68000, quando poi una decina di anni dopo ho cominciato (per lavoro) a imparare java non nascondo che ho avuto delle difficoltà a “scrollarmi” di dosso una certa “forma mentis” e abitudini non proprio ortodosse.

    al momento utilizzo per lavoro ruby e objective-c per hobby: non rinuncerei per nulla al mondo alle “comodità” che questi linguaggi mi mettono a disposizione, anzi rimpiango il fatto che (ad esempio) sull’iphone non ci sia il Garbage Collector e si debba gestire a mano la memoria … solo tempo perso che potrei dedicare più proficuamente a migliorare il software che scrivo.

  • # 108
    caffeine
     scrive: 

    mmmm ma io non capisco… io all’uni ho iniziato col C…. alcuni di voi dicono che dovrei sapere come funziona la macchina etc…. infatti contemporaneamente al corso di LP1 (linguaggi di programmazione1) seguivamo un corso di architettura del processore, progettando cpu mips e programmandole in assembly….
    quindi dov’è il problema di iniziare col C?

    ma poi è vero che il C puo’ essere ostico, ma da qui a dire che è estremamente difficile, o addirittura inutile?????? cioe’ parliamo di un linguaggio prestazionalmente superiore di almeno 10 volte ai vari java, python, c#….
    ed appunto per questo ci sono apparecchi programmati addirittura in FORTRAN…. ancora oggi… o alcune piattaforme bancarie in COBOL…

    e poi se chi spiega è bravo, non è tanto arduo l’apprendimento del C
    tra: “programmazione TopDown” “trasmutazione da metacodice a codice” etc… si semplifica molto la vita all’allievo

  • # 109
    Jacopo Cocchi
     scrive: 

    x caffeine

    i motivi per cui l’approccio top-down non funziona in ambito didattico sn stati ampiamente elencati dall’articolo fin nei commenti precedenti al tuo.
    Ancora invece non vedo un motivo uno per cui preferire C/C++ come primo linguaggio ad altri come Python, Java ecc.
    Li vedo per non sceglierli, ma non per sceglierli. Ma io aspetto eh sn qui :)

    “ma poi è vero che il C puo’ essere ostico, ma da qui a dire che è estremamente difficile, o addirittura inutile?????? cioe’ parliamo di un linguaggio prestazionalmente superiore di almeno 10 volte ai vari java, python, c#….”

    Queste sn le classiche tavanate che vengono fuori tipicamente dall’ambiente universitario dove i professori o non conoscono Java o se lo conoscono sono rimasti alla JDK 1 o 2.
    10x volte o più più veloce è una panzana galattica; la notizia è che non solo non esiste questo gap ma ci sono ambiti in cui in realtà le prestazioni sono a favore di Java e degli altri linguaggi compilati JIT.

    Benchmark se ne trovano tanti in giro e da anni, ma uno abbastanza recente è questo: http://www.stefankrause.net/wp/?p=4

    Cito:” » Saying that C is generally several times faster than java is – according to those benchmarks – simply wrong. If you’re allowed to choose the fastest JVM the worst case for java was 30%. In other benchmarks Sun and JRockit were even able to beat ICC. Not by much but I guess it’s nevertheless just very remarkable that it’s possible to beat ICC.”

  • # 110
    iva
     scrive: 

    @Jacopo: niente da dire sui tuoi commenti (l’infondato mito urbano del C 10 volte piu’ veloce di Java!) e pagina interessante, peccato pero’ che ci sia scritto:
    “For icc I found the flags “-xT -fast” to create the best code.”
    Innanzitutto -fast include -xT di default in icc 10.0, quindi il parametro e’ ridondante (mi fa pensare se l’autore conosca cosi’ bene icc) e soprattutto -fast NON utilizza PGO (profiled guided optimization) che e’ l’ottimizzazione piu’ performante che c’e’.
    Nei benchmark su cui mi e’ capitato di lavorare usando PGO il divario tra icc e gcc cresce nettamente e naturalmente anche la performance assoluta (nell’applicazione su cui lavoravo io PGO su icc batteva gcc del 27%).
    Sarebbe interessante far girare i benchmark di nuovo dopo aver fatto ricompilare il codice C da qualcuno che conosce icc un po’ meglio (e magari utilizzando una versione nuova).

  • # 111
    Jacopo Cocchi
     scrive: 

    Ciao di nuovo iva.
    Sinceramente non conosco così bene i parametri per ottimizzare icc.
    Il discorso di fondo è uno e che il divario che viene spacciato non sussiste.
    La pagina cmq è stata aggiornata e se vedevi bene nei commenti dell’url linkato risultava anche la revisione degli stessi con l’aggiunta di altri test e compilatori.

    http://www.stefankrause.net/wp/?p=6

    L’appunto sulla versione nuova è un po’ capzioso nel senso che allo stesso modo potremmo/dovremmo considerare l’ultima JDK che per inciso porta notevoli miglioramenti sul fronte delle prestazion in particolar modo in ambienti distribuiti e di un numero molto alto di transazioni.

    E in ogni caso il punto è un altro.
    Nel momento in cui si stabilisce che il divario non si misura in termini di ordini di grandezza diversa, subentra un altro fattore, determinante, per poter giudicare ed è la produttività.
    In questo caso Java vince su C a mani basse ed è per questo che in ambito per esempio Enterprise J2EE è stato fino ad adesso un fattore dominante (prima che NET si imponesse sulla scena come un competitor convincente).

  • # 112
    banryu79
     scrive: 

    Sono d’accordo, rispetto alla domanda: “Quale tipo di linguaggio sia più adatto per chi inizia a programmare” col rispondere: un linguaggio moderno, di alto livello di astrazione, orientato agli oggetti.

    Non sono un professionista esperto di programmazione, ne ho molti anni di esperienza alle spalle (5), ma parlo invece per esperienza personale.

    Ho cominciato con C, da autodidatta, ho assaggiato C++, guidato in ambito universitario (non da studente però) e infine sono approdato a Java, lavorando con dei professionisti.

    Devo dire che avrei avuto vita molto più facile, all’inizio, se tra i tre linguaggi che ho citato fossi partito subito con Java.

    Sto ancora cercando di disimparare il metodo con cui concepivo le soluzioni ai problemi da risolvere dalla prospettiva dei linguaggi procedurali per utilizzare al meglio il paradigma oop, design patterns e refactoring efficace del codice che scrivo di primo acchito.
    Pensò mi ci vorrà ancora molta pratica per “ristrutturarmi mentalmente” (mental refactoring?)

    Ottima discussione.

    A scanso di equivoci non penso affatto che C e C++ siano linguaggi inutili, tutt’altro: però penso seriamente che siano “roba per esperti”, e forse un giorno (se avrò voglia o bisogno) tornerò a esplorarli.

    Per quello che faccio nel mio lavoro un linguaggio di alto livello mi va più che bene.
    Mi sarebbe andata ancora meglio se fossi partito subito con un linguaggio di questo tipo.

  • # 113
    iva
     scrive: 

    Jacopo, si il punto e’ un altro, questo l’abbiamo chiarito!
    Volevo solo rimarcare il fatto che quando si fa una comparazione specificamente sulle performance se non si utilizzano tutte le opzioni a disposizione il risultato non e’ valido (e’ come dire che la mia fiat va piu’ veloce di una ferrari in prima…).

    Naturalmente, riguardo “l’ultima versione” deve essere per tutti (pensavo fosse ovvio), altrimenti sono benchmark tra apple e oranges come dicono gli americani.
    Lo dicevo solo perche’ i risultati sono vecchi di un anno.

  • # 114
    Francesco Carucci (Autore del post)
     scrive: 

    x iva: PGO da’ un vantaggio che a seconda dello scenario puo’ variare dal 2/3% a 10%. Mai visto guadagni maggiori. Sicuramente nulla che possa avvicinarsi a 10 volte piu’ veloce.

    Comunque, le prestazioni NON sono un argomento di questo post.

  • # 115
    Jacopo Cocchi
     scrive: 

    x iva

    certo che le comparazioni devono essere fatte nelle migliori condizioni possibili, ma dà cmq un’idea di massima sufficiente a smontare (e sei concorde tu stesso) quelli che sn dei miti intorno a Java e linguaggi affini rispetto a C/C++.
    Io ho suggerito un link (poi la seconda versione è di pochi mesi fa per esempio) che fornisce un’idea di massima, non ho detto sia il Vangelo.

    E cmq come dice Francesco stiamo divagando dal punto focale: le prestazioni non sono una discriminante nella nostra riflessione.

    Attendo sempre speranzoso motivi per preferire C/C++ a Java e compagnia. Cioè che si dimostri la validità di chi sostiene la posizione antitetica rispetto a quella espressa da Francesco e altri interlocutori nei commenti relativi a questo post :)

  • # 116
    iva
     scrive: 

    Carucci, si il topic non erano le prestazioni, ma non sono io che ho cominciato a divagare e se si posta un link dove java batte icc, io controllo e vedo che qualcosa non e’ stato fatto come si deve, devo astenermi dal rispondere?

    Poi il fatto che tu affermi con certezza il fatto che PGO non superi mai il 10% e’ una frottola, come fai ad esserne cosi’ sicuro in modo ASSOLUTO?? Sono un bugiardo allora?
    Io cerco di essere il piu’ onesto possibile nei miei post, so di non avere la verita’ assoluta su niente e rimarco continuamente che le cose sono frutto della mia esperienza personale, le tue frasi invece sembrano spesso sentenze che non ammettono repliche.

    Ripeto: nel benchmark su cui ho lavorato (e tra parentesi era alla base di una pubblicazione scientifica di quest’anno) avevo il 27% di guadagno con PGO, se vuoi ti mando un bel link privatamente e vai a controllare, non sto qui a farmi pubblicita’.
    Di recente mi e’ capitato di lavorare ad un altro benchmark ed il vantaggio di icc con pgo era del 17% rispetto a gcc con pgo e del 23% rispetto ad icc senza pgo.
    Per concludere PGO non da la garanzia di avere il 20% di guadagno con ogni applicazione, certamente, ma i risultati che ho ottenuto (con due applicazioni completamente diverse tra parentesi, uno di calcolo numerico l’altra un motore per scripting) dicono che guadagni superiori al 10% che tu non hai mai visto, sfortunatamente, sono superabili.

  • # 117
    Francesco Carucci (Autore del post)
     scrive: 

    ila, chiamami pure Francesco :)
    Non ho visto alcun caso di applicazione reale nel quale superi il 10%. Non nego che in casi costruiti ad hoc possa accadere, ma sul campo non mi e’ mai capitato. Ti posso dire che il guadagno su Fable 2 e’ stato di un paio di punti percentuali.
    Sicuramente non si arriva a 10 volte.

  • # 118
    Giando
     scrive: 

    Ciao a tutti,
    io sono un neo laureato che sta per iniziare a lavorare in una nota azienda di consulenza informatica (partner Microsoft) con l’obiettivo (tra gli altri) di creare insieme al mio team un portale intranet piuttosto performante.
    Data la mia scarsa formazione universitaria come programmatore (ho fatto C e qualcosa di C++) , il mio capo (programmatore da oltre 15 anni) e il mio manager (con più di 20 anni di esperienza alle spalle)in queste settimane mi hanno messo sotto a studiare C# e net Framework (sto giochicchiando con visual studio 2008) dicendomi di resettare quanto avevo appreso con il C e il C++ e facendomi un discorso simile a quanto detto in questa discussione da Francesco Carucci.
    Ora io non so se sia la cosa migliore, ma in queste settimane mi sono accorto che iniziare con C# mi risulta molto più semplice e intuitivo di quando studiavo C e mi perdevo in mille problemi che mi sembravano irrisolvibili e in alcuni casi anche inutili.
    Se i miei capi mi hanno indirizzato su questa strada un motivo ci sarà.
    Ho voluto condividere con voi, che siete sicuramente più esperti di me, la mia esperienza per rendere il dibattito più interessante.
    Ciao a tutti

  • # 119
    Cesare
     scrive: 

    Sì, il motivo c’è sicuramente: il buon senso. :D

  • # 120
    banryu79
     scrive: 

    Buon senso, anche sencondo me.
    A mio parere molto spesso si tende a dimenticare una cosa fondamentale: di tutte le risorse in campo quella più scarsa e *mai recuperabile* è il tempo del programmatore.

    Su questa specifica risorsa non mi occorre essere un esperto con 20 anni di programmazione alle spalle per capire che i linguaggi ad alto livello di astrazione e OO sono molto più convenienti rispetto a quelli prettamente procedurali, a maggior ragione per chi inizia completamente da zero ed è quindi interessato ad ottenere *programmi funzionanti* prima ancora che *programmi funzionanti ed ottimizzati*.

  • # 121
    Jacopo Cocchi
     scrive: 

    iva nessuno dice ovviamente che devi astenerti ci mancherebbe :)

    Il tutto è partito da un’affermazione prima, dove si sostiene le prestazioni 10x di C su Java…a queste IO ho risposto…poi d’accordo il test non sarà accurato, i compilatori non sn aggiornati, tutto quello che vuoi. Ma quella affermazione è stata smentita e non da me dai fatti.
    Il “topic” è però sempre il fatto di cosa utilizzare per iniziare ed imparare a programmare.
    Questo è quello su cui ci siamo focalizzati finora, divagazioni che cmq ci stanno a parte.

  • # 122
    pageup
     scrive: 

    La libreria standard del C++ mette a disposione solo il minimo indispendabile e appena lo studente ha imparato le basi e vuole fare un programma un po piu complesso di quelli prettamente didattici deve cercare e scaricare librerie esterne, compilarle, configurare i path sull’IDE, importare le dll… e già qua stiamo cominciando a complicare le cose inutilmente e prematuramente.
    Per fare un semplice programmino in cui si usa qualche libreria di base come Boost, wxWidget, libcurl, libsndfile e qualcos’altro si perde mezza giornata a compilare e configurare roba… sempre che il tutto funzioni e che non ci siano incompatibilita tra le librerie che si sono scelte (ad esempio usano tipi diversi per le stesse cose e bisogna convertire dall’uno all’altro e viceversa ogni volta).
    Al contrario nelle piattaforme managed il problema si risove molto piu semplicemente… le librerie di base in genere sono gia molto grandi (e coerenti tra loro) e se servono librerie esterne è molto piu semplice caricarle. Ad esempio in java si scarica il jar ed è fatto, in python basta copiare il modulo nella cartella del programma e usare import.

  • # 123
    iva
     scrive: 

    ok allora, Francesco :)

    Le due applicazioni non le avevo scritte per dimostrare che pgo fosse performante.
    La prima era un applicazione anche in parte sviluppata da me e utilizzata per analisi di segnali biomedici in diverse universita’, il codice degli algoritmi usati per il benchmark era gia’ li’ e non l’ho modificato, ho solamente utilizzato il pgo, non era quello lo scopo della ricerca (il campo l’analisi di segnali biomedici non sara’ conosciuto come quello dei videogiochi ma sembra decisamente un caso reale).
    La seconda e’ relativa all’engine javascript di un famoso browser opensource, (con il 20% di share a livello mondiale sembra abbiano annunciato oggi), probabilmente rappresenta un altro caso decisamente reale e non codice messo su ad hoc per me e pgo :)

    Con questo chiudo l’offtopic performance, scusate.

  • # 124
    Jacopo Cocchi
     scrive: 

    Non ti preoccupare, la divagazione in temi così ampii e “scottanti” è naturale :)

  • # 125
    Fabio
     scrive: 

    Io, data la giovane età, ho cominciato con Java e poi C e C++. Non ho avuto alcun problema nel gestire gli strumenti di basso livello che mi metteva a disposizione il C. Piuttosto direi che venendo dal Java ho imparato a gestirli meglio, in maniera più consistente e senza ricorrervi quando non necessario.
    Al contrario ho visto molta gente con più esperienza di me trovare difficoltà nello sfruttare la programmazione OOP, che per loro risultava solo un peso e un overhead di lavoro.

  • # 126
    Francesco Carucci (Autore del post)
     scrive: 

    Testimonianza interessante.

  • # 127
    Fabio
     scrive: 

    Faccio un esempio: chi viene dal Java e mette mano al C/C++ si ritrova, contrariamente a quanto si potrebbe pensare, a fare un uso intensivo e consapevole di puntatori e delle diverse modalità di passaggio dei parametri.
    Questo per il semplice fatto che vuole ricreare l’esatto comportamento del Java che, se ha studiato, conosce bene. Poi, quelle rare volte che ha bisogno di forzarlo, può anche cambiare qualcosa.

    In sostanza credo che la libertà del C possa essere un po’ controproducente per chi deve imparare. Linguaggi come il Java vanno visti non come linguaggi monchi, ma come modelli fissi di utilizzo del C (tu passerai gli oggetti solo per riferimento, tu non userai l’ereditarietà multipla, tu non userai le struct, tu non userai l’aritmetica dei puntatori, etc).

  • # 128
    caffeine
     scrive: 

    sono l’unico che si divertiva con l’aritmetica dei puntatori? :)

    boh forse

    francesco io purtroppo ti ho portato un esempio, non essendo ancora ad un livello molto alto, specificatomi dal mio prof DI JAVA, di max 40 anni, che ci fa studiare su java5…. e vedendo il suo curriculum internazionale, mi sono fidato a priori….
    il fatto è che nella realta’ pratica, quando si parla di applicazioni molto pesanti, che si devono interfacciare molto con l’hardware, e nel migliore dei modi possibili, allora si prediligono sempre linguaggi meno astratti…
    mi viene da pensare per rimanere in ambito pratico, ai videogiochi, che variano tra c++ e c#(a seconda di quanto sono “imparentati con la microsoft” mi viene da pensare ai sistemi operativi, oltre ai kernel che per ovvie ragioni DEVE essere di basso livello, parlo anche della semplice interfaccia come ad esempio le qt di kde o le gtk di gnome….

    e allora dal basso della mia esperienza universitaria di appena 2 anni mi viene da chiedermi
    come mai questo tipo di applicazioni non viene sviluppato totalmente in java, dato che porterebbe molti vantaggi, primo tra tutti un minor numero di bug dovuto ad un codice molto piu’ debuggabile? come mai il java viene limitato nel suo uso, se a parita’ di complessita’ da performance pari o migliori?

    e soprattutto dal punto di vista pratico
    perchè io con il mio pc se apro applicazioni java (e quindi anche con supporto multithread dato che la macchina di sun lo supporta) ho sempre prestazioni minori ad un programma molto simile, ma in linguaggi di livello piu’ basso?

    ripeto, non voglio fare commenti arroganti, sono quesiti che mi pongo, e a cui il professore durante una lezione rispose dicendo che il java a parita’ di complessita’ del programma è molto meno performante…

    cmq ti ripeto che dal MIO punto di vista, nel momento in cui al corso di C mi viene affiancato un corso di architettura dell’elaboratore dove mi viene insegnato anche l’assembly… ne traggo molti vantaggi rispetto a se mi venisse insegnato il java, perchè i due corsi si completano, perchè con il c riesco a vedere molto meglio le congruenze con l’assembly, con lo spostamento dei dati nel datapath…

    mentre non sono sicuro che se un “totalmente niubbo” studiasse java e architettura/assembly sia in grado di capire allo stesso modo il preciso funzionamento di cio’ che sta facendo

    il c come astrazione è molto piu’ vicino,
    e ripeto sono fermamente convinto che se al primo anno avessi fatto java e assembly, non sarei riuscito a trasformare un algoritmo abb complesso in java, in uno in assembly, senza una approfondita conoscenza proprio di quelle cose che in java POTRESTI ANCHE FARE A MENO DI CONOSCERE
    e parlo di aritmetica dei puntatori su tutto, ma anche di struct etc…

    cioè non dimentichiamo che un informatico non deve essere un programmatore e basta… un informatico deve avere anche un alta conoscenza della macchina, di tutto cio’ che avviene dentro di lei etc….l’universita’ ti deve dare una base da INFORMATICO e non da programmatore e basta, e trovo molto piu’ sensato fare un DOWNTOP (asd) assembly–>C—>java che un assembly—>python—>java, nel primo caso è una salita… nel secondo è uno scalino alto quanto un muro :)

    e ripeto, a me mi ha facilitato molto il c in questo, perchè potevo saltare tra assembly e c molto facilmente…

    ovviamente metto sempre in conto che come in tutte le soggettivita’ di una persona, anche il metodo di apprendimento puo’ essere diverso…
    non penso che uno sia migliore dell’altro, ma che uno si adatti piu’ ad un tipo di percorso che ha un altro
    insomma secondo me è sbagliato iniziare dicendo “è meglio questo per imparare etc” perchè se si parla di ambito universitario, la facolta’ avra’ deciso i programmi insieme, valutando quindi sinergie tra corsi etc…
    parlando di ambito lavorativo, ovviamente imparero’ quello che mi servira’

    parlando di cultura personale ognuno puo’ decidere con cosa iniziare
    conosco persone che hanno iniziato con il perl, altre che hanno iniziato con java, altre ancora con il c++
    e posso assserire che quelli che tra quelli che conosco, chi ha dato prima l’esame di c, quello di java l’ha dato tranquillamente, chi ha dato prima l’esame di java, il c se lo porta ancora dietro al terzo anno

    cioe’ dai, sono d’accordo che è bellissimo che con 10 righe di codice di python fai quello che il c fa in 100 righe di codice….
    ma come faccio a sapere cio’ che sta facendo il python nella mia cpu se non ho almeno una minima conoscenza procedurale? come faccio a pensare a demorgan, all’algebra di boole etc con il python? :)mentre con il c sono problemi che affronti quasi sempre :)

  • # 129
    caffeine
     scrive: 

    errata corrige:

    sul fatto delle prestazioni, quindi se mi dici che magari giochi, sistemi operativi etc, non li fanno in java per questioni commerciali e non di performance, ti posso anche credere :)

    sul fatto didattico rimango convinto che una preparazione universitaria da informatico, e quindi non per forza da programmatore ( ad esempio la specializzazione in modelli della mia facolta’ è molto piu’ vicina ad un misto tra ingegneria informatica ed elettronica, che ad una da programmatore) richiede un alta conoscenza dei linguaggi procedurali, per il loro basso livello d’astrazione, e vicino quindi alla macchina

  • # 130
    Cesare
     scrive: 

    In due post hai snocciolato una quantità impressionante di luoghi comuni, leggende metropolitane e “secondo me”.

    Passiamo alle valutazioni oggettive. Ho scritto alcuni messaggi in cui ho fatto delle richieste ben precise:

    http://www.appuntidigitali.it/2506/quale-linguaggio-per-imparare-a-programmare/#comment-9012
    http://www.appuntidigitali.it/2506/quale-linguaggio-per-imparare-a-programmare/#comment-9040
    http://www.appuntidigitali.it/2506/quale-linguaggio-per-imparare-a-programmare/#comment-9067
    http://www.appuntidigitali.it/2506/quale-linguaggio-per-imparare-a-programmare/#comment-9118

    ma “stranamente” non hanno ancora ricevuto risposta.

    Visto che sembri così sicuro di cosa DEBBA SAPERE un informatico e/o programmatore, magari sarai in grado di tu di soddisfare la mia curiosità. ;)

    P.S. Non vedo com’è che in Python non si possa lavorare con De Morgan e l’algebra di Boole. Anche per questo immagino avrai una valida nonché oggettiva spiegazione. ;)

    P.P.S. Coi puntatori mi “divertivo” quando lavoravo in linguaggio macchina o assembly. Adesso che lavoro con linguaggi di livello molto più alto ne faccio più che volentieri a meno. :D

  • # 131
    Cesare
     scrive: 

    In due post hai snocciolato una quantità impressionante di luoghi comuni, leggende metropolitane e “secondo me”.

    Passiamo alle valutazioni oggettive. Ho scritto alcuni messaggi in cui ho fatto delle richieste ben precise (vedi i commenti 41, 65, 80 e 105 in particolare), ma “stranamente” non hanno ancora ricevuto risposta.

    Visto che sembri così sicuro di cosa DEBBA SAPERE un informatico e/o programmatore, magari sarai in grado di tu di soddisfare la mia curiosità. ;)

    P.S. Non vedo com’è che in Python non si possa lavorare con De Morgan e l’algebra di Boole. Anche per questo immagino avrai una valida nonché oggettiva spiegazione. ;)

    P.P.S. Coi puntatori mi “divertivo” quando lavoravo in linguaggio macchina o assembly. Adesso che lavoro con linguaggi di livello molto più alto ne faccio più che volentieri a meno. :D

  • # 132
    Francesco Carucci (Autore del post)
     scrive: 

    caffeine. L’uso di C++ o C# nei videogiochi non dipende dalla parentela o meno con Microsoft, infatti, semplicemente, C# non si usa in giochi commerciali. Io uso nel 95% del mio lavoro (motori 3d) C++, scelta che non ha nulla a che vedere con le prestazioni: ho bisogno di controllare in maniera precisa il ciclo di vita degli oggetti e, spesso, la loro collocazione in memoria. Questi requisiti sono soddisfatti meglio dal C++ rispetto a Java/C#, quindi scelgo questo strumento.
    Un programmatore sceglie lo strumento piu’ adatto a risolvere il suo problema: quando hai pochi mesi per produrre qualcosa che richiederebbe il doppio del tempo non fai considerazioni religiose, ma solo scelte pragmatiche.
    Domani uscira’ un articolo sull’uso di linguaggi di scripting come Python e LUA nei videogiochi. Ci saranno sorprese :)

    Infine, non ti interessa sapere che cosa fa Python con la CPU, ti interessa sapere solo se il tuo software soddisfa i requisiti e lo fa nella maniera meno costosa possibile. Anni di universita’ non ti serviranno a nulla fino a che non ti fissi nella mente questo semplice principio. Scrivitelo su un foglio e attaccalo al monitor: e’ l’unica cosa che conta per un programmatore.

  • # 133
    Rubatti D.
     scrive: 

    Sto studiano python da poco…saranno 5-6 giorni mi sto trovando molto bene a smanettare.Ora Francesco volevo sapere un infomazione.Tui hai scritto che il 95% è un motore 3D C++ scommetto che il restante è composto appunto da linguaggi scripting vero?
    Ancora è presto per pensare a videogiochi(fatti da me in python)ma quali sono le librerie utili?Magari se le sai q

  • # 134
    Rubatti D.
     scrive: 

    (133)

    Sto studiano python da poco…saranno 5-6 giorni mi sto trovando molto bene a smanettare.Ora Francesco volevo sapere un infomazione.Tui hai scritto che il 95% è un motore 3D C++ scommetto che il restante è composto appunto da linguaggi scripting vero?
    Ancora è presto per pensare a videogiochi(fatti da me in python)ma quali sono le librerie utili? Magari se le sai quelle più comuni utilizzate in CIVILITATION.

    Tempo fa studia JAVA non ricordo una mazza(nell’estate mi sono rilassato) ora sto studiando python e nei libri il punto di Francesco viene ribadito più volte:
    “interessa sapere solo se il tuo software soddisfa i requisiti e lo fa nella maniera meno costosa possibile”
    concordo anche io.

    Ciao e Grazie mille Francesco!

  • # 135
    Cesare
     scrive: 

    Intanto puoi cominciare a far pratica con PyGame: http://pygame.org/news.html ;)

    Sul resto penso che domani Francesco ce ne farà vedere delle belle. :D

  • # 136
    Rubatti D.
     scrive: 

    Anche io ne sono sicuro.Avevo già visto quel sito interessante.

    @Francesco:Force si usa anche C++ perchè è più veloce di linguaggi come Java,C# o Python?

  • # 137
    caffeine
     scrive: 

    francesco grazie per avermi chiarito questo punto, e questo penso che in parte risponda anche ai quesiti di cesare…

    cesare ti ho spiegato IO come la penso, da mia esperienza personale posso dirti che lo studio del C in parallelo all’architettura mi ha aiutato molto nella comprensione, dato che all’assembly gli abbiamo dedicato solo un mese di studi, quindi giusto la sintassi e la semantica… pero’ lo studio del C mi ha permesso di continuare a impratichirmi nello studio degli algoritmi assembly, proprio per la loro non eccessiva distanza

    e ti pongo io un quesito, premettendo una conoscenza basilarissima di assembly…
    secondo te lo studio del java o del python in cosa ti aiuterebbe nel migliorare la tua conoscenza in quell’ambito?
    io ti posso assicurare che molti “ragionamenti” che avvengono nella macchina e nei loro bit, li ho imparati spesso proprio facendo una sorta di top-down
    da c ad assembly alle tavole di verita’ e tutta l’algebra di boole e il resto
    invece la vedo ardua con python—>assembly… dato che il 90% del codice assembly risultante da un programma in python non sai neanche da dove venga quasi :)

    francesco dal punto di vista commerciale condivido in pieno il tuo pensiero, ma questo sempre partendo dal punto di vista che l’informatico inq uestione debba concentrarsi sulla programmazione software, o al massimo sulle reti….
    ma se come dici tu dovesse essere un programmatore di motori di rendering o che ne so, di un azienda che lavora su software su macchine chiuse(che spesso sono programmate a basso livello) o ancora un informatico che deve lavorare come programmatore di chip integrati etc

    secondo te una conoscenza del C non gli giova molto piu’ di una conoscenza di python in quell’ambito lavorativo?

    beh un universita’ ti deve preparare a piu’ sbocchi e non ad uno solo
    tanto è vero che al primo anno nella mia facolta’ si studia nei primi 2 anni (solo gli esami di programmazione e similari)

    linguaggi di programmazione 1 (C)(e annesso laboratorio)
    fondamenti di programmazione (algoritmi in metacodice, algoritmi in pascal e in c, basi di ricorsione etc)
    architettura e programmazione assembly
    linguaggi di programmazione 2 (java 5) (e laboratorio)
    algoritmi e strutture dati (studio di algoritmi, ottimizzazioni etc)
    laboratorio di algoritmi e strutture dati (applicazione dello studio degli algoritmi al JAVA)
    basi di dati (programmazione sql, gestione database, e interazioni java sql)

    come vedi è un programma pieno di java, pero’ secondo me quell’unico esame di C è fondamentale per una figura da informatico molto piu’ “variopinta” perchè gli da’ una miglior conoscenza di cio’ che sta facendo

    mentre se li’ in mezzo ci togli il C e ci metti il python, e focalizzi quindi lo studio degli algoritmi tra python e java
    c’è un gap tra la conoscenza architetturale del calcolatore e quella di pura programmazione, un gap non colmato da un mese di assembly o dalla perfetta conoscenza del datapath delle pipeline etc… perchè senza un visione vicina quanto il c, ma allo stesso tempo molto piu’ leggibile e vicina all’uomo dell’assembly, secondo me non si riesce ad apprendere totalmente il funzionamento dei meccanismi

    ovviamente come detto nel post di prima queste sono mie considerazioni personali basate su esperienze personali

    e ripeto, secondo me è molto piu’ facile con la conoscenza del C apprendere il java che viceversa… e questo l’ho notato con alcuni miei colleghi di anni piu’ avanzati che hanno ancora oggi problemi a farsi entrare in testa l’idea dell’aritmetica dei puntatori, delle strutture etc…
    mentre io ho trovato facile traslare al java e alle sue caratteristiche, dopo aver studiato per bene il c, proprio perchè mi viene spontaneo conoscendo il c, capire cosa c’è sotto quello che faccio in java…

    poi alla fine puo’ essere una considerazione soggettiva
    e ripeto io sono d’accordo con voi che magari nella vita reale usero’ molto piu’ il java che il c(infatti come detto nella mia universita’ in C c’è un singolo esame) ma secondo me per uno studio COMPLETO ho bisogno anche di quella conoscenza…
    e cmq in ambito lavorativo c’è ancora un alta richiesta di conoscenza di c++ e in alcuni casi anche di C(non dimentichiamo che quasi tutto il mondo unix tra kernel e desktop enviroment è basato SOPRATUTTO su c e c++)

    e non lo ripetero’ fino alla nausea, io non sono per niente un “fanboy dei linguaggi strutturali” dico solo che una base serve.
    infatti cesare, appoggio in pieno la tua parte di post dove dici che conta prima di tutto far funzionare bene un applicazione, che l’ottimizzazione in se etc…
    mi trovo totalmente d’accordo
    ma se permetti 6 mesi in 3/5 anni di universita’ secondo me portano piu’ vantaggi che svantaggi… anche perchè sappiamo entrambi che il python da autodidatta è molto piu’ facile del C da autodidatta…

  • # 138
    Cesare
     scrive: 

    cesare ti ho spiegato IO come la penso, da mia esperienza personale posso dirti che lo studio del C in parallelo all’architettura mi ha aiutato molto nella comprensione, dato che all’assembly gli abbiamo dedicato solo un mese di studi, quindi giusto la sintassi e la semantica… pero’ lo studio del C mi ha permesso di continuare a impratichirmi nello studio degli algoritmi assembly, proprio per la loro non eccessiva distanza

    Non metto in dubbio che per particolari ambiti come quelli citati il C possa risultare utile.

    e ti pongo io un quesito, premettendo una conoscenza basilarissima di assembly…
    secondo te lo studio del java o del python in cosa ti aiuterebbe nel migliorare la tua conoscenza in quell’ambito?
    io ti posso assicurare che molti “ragionamenti” che avvengono nella macchina e nei loro bit, li ho imparati spesso proprio facendo una sorta di top-down
    da c ad assembly alle tavole di verita’ e tutta l’algebra di boole e il resto

    Tavole di verità e algebra di Boole sono patrimonio di TUTTI i linguaggi di programmazione.

    invece la vedo ardua con python—>assembly… dato che il 90% del codice assembly risultante da un programma in python non sai neanche da dove venga quasi :)

    Si vede che non hai mai visto il codice assembly che tirano fuori i compilatori C più moderni: prova a dargli un’occhiata e poi dimmi se riesci a riconoscere il codice C dal quale provengono.

    francesco dal punto di vista commerciale condivido in pieno il tuo pensiero, ma questo sempre partendo dal punto di vista che l’informatico inq uestione debba concentrarsi sulla programmazione software, o al massimo sulle reti….
    ma se come dici tu dovesse essere un programmatore di motori di rendering o che ne so, di un azienda che lavora su software su macchine chiuse(che spesso sono programmate a basso livello) o ancora un informatico che deve lavorare come programmatore di chip integrati etc

    Si tratta di nicchie di mercato. Semmai e quando avrai a che farci allora sarà utile imparare C et similia.

    secondo te una conoscenza del C non gli giova molto piu’ di una conoscenza di python in quell’ambito lavorativo?

    Python lo si usa anche nei videogiochi ormai, quindi serve anche in questo settore.

    Inoltre è disponibile anche per diversi sistemi embedded.

    beh un universita’ ti deve preparare a piu’ sbocchi e non ad uno solo
    tanto è vero che al primo anno nella mia facolta’ si studia nei primi 2 anni (solo gli esami di programmazione e similari)

    linguaggi di programmazione 1 (C)(e annesso laboratorio)
    fondamenti di programmazione (algoritmi in metacodice, algoritmi in pascal e in c, basi di ricorsione etc)
    architettura e programmazione assembly

    Veramente si parla di pseudocodice, non di metacodice. Potresti spiegare come mai venga usato lo pseudocodice?

    Inoltre, secondo te per quale motivo per Python viene spesso chiamato “pseudocodice eseguibile”?

    linguaggi di programmazione 2 (java 5) (e laboratorio)
    algoritmi e strutture dati (studio di algoritmi, ottimizzazioni etc)
    laboratorio di algoritmi e strutture dati (applicazione dello studio degli algoritmi al JAVA)
    basi di dati (programmazione sql, gestione database, e interazioni java sql)

    come vedi è un programma pieno di java, pero’ secondo me quell’unico esame di C è fondamentale per una figura da informatico molto piu’ “variopinta” perchè gli da’ una miglior conoscenza di cio’ che sta facendo

    Dovresti definire cosa intendi per “miglior conoscenza”. Soprattutto perché la consideri “migliore” (rispetto a cosa).

    mentre se li’ in mezzo ci togli il C e ci metti il python, e focalizzi quindi lo studio degli algoritmi tra python e java
    c’è un gap tra la conoscenza architetturale del calcolatore e quella di pura programmazione, un gap non colmato da un mese di assembly o dalla perfetta conoscenza del datapath delle pipeline etc… perchè senza un visione vicina quanto il c, ma allo stesso tempo molto piu’ leggibile e vicina all’uomo dell’assembly, secondo me non si riesce ad apprendere totalmente il funzionamento dei meccanismi

    Non vedo perché si debbano NECESSARIAMENTE conoscere dettagli di così basso livello. A meno che il corso non preveda OBBLIGATORIAMENTE lo studio e la progettazione di architetture, sistemi embedded et similia, e allora il discorso cambia.

    ovviamente come detto nel post di prima queste sono mie considerazioni personali basate su esperienze personali

    e ripeto, secondo me è molto piu’ facile con la conoscenza del C apprendere il java che viceversa… e questo l’ho notato con alcuni miei colleghi di anni piu’ avanzati che hanno ancora oggi problemi a farsi entrare in testa l’idea dell’aritmetica dei puntatori, delle strutture etc…
    mentre io ho trovato facile traslare al java e alle sue caratteristiche, dopo aver studiato per bene il c, proprio perchè mi viene spontaneo conoscendo il c, capire cosa c’è sotto quello che faccio in java…

    poi alla fine puo’ essere una considerazione soggettiva
    e ripeto io sono d’accordo con voi che magari nella vita reale usero’ molto piu’ il java che il c(infatti come detto nella mia universita’ in C c’è un singolo esame) ma secondo me per uno studio COMPLETO ho bisogno anche di quella conoscenza…

    Anche qui, dovresti definire cosa intendi per “completo”. Deve includere anche conoscenze di basso livello? Se sì, mi spiegheresti per quale motivo?

    e cmq in ambito lavorativo c’è ancora un alta richiesta di conoscenza di c++ e in alcuni casi anche di C

    Chi l’ha mai negato questo. Purtroppo è più che altro un discorso legato al legacy e al mantenimento di codice già esiste, oltre ovviamente a settori di nicchia come sistemi embedded.

    (non dimentichiamo che quasi tutto il mondo unix tra kernel e desktop enviroment è basato SOPRATUTTO su c e c++)

    Questo avviene sia per quanto scritto sopra sia perché Unix è legato mani e piedi al C, non foss’altro per “tradizione”.

    e non lo ripetero’ fino alla nausea, io non sono per niente un “fanboy dei linguaggi strutturali” dico solo che una base serve.

    Ecco, io vorrei che mi DIMOSTRASSI che linguaggio strutturato = base della programmazione, perché mi sfugge quest’equivalenza.

    infatti cesare, appoggio in pieno la tua parte di post dove dici che conta prima di tutto far funzionare bene un applicazione, che l’ottimizzazione in se etc…
    mi trovo totalmente d’accordo
    ma se permetti 6 mesi in 3/5 anni di universita’ secondo me portano piu’ vantaggi che svantaggi…

    Io sto ancora cercando di capire quali sarebbero i vantaggi e quali gli svantaggi.

    anche perchè sappiamo entrambi che il python da autodidatta è molto piu’ facile del C da autodidatta…

    Un punto a favore di Python e uno a sfavore del C, allora. :D

  • # 139
    caffeine
     scrive: 

    cesare a quasi tutte le tue domande posso rispondere riprendendo da altri miei post

    una figura da informatico universitario deve essere completa sotto tutti i punti di vista, e deve avere quindi anche delle basi di basso livello, è questo che intendo per una migliore figura, una figura piu’ completa, piu’ varipinta, piu’ adattabile,
    i vantaggi te li ho ripetuti, miglior approfondimento dell’architettura e del suo funzionamento rispetto a linguaggi di livello piu’ alto, possibilita’ di programmazione “di nicchia” (parlo di molti software per macchine embedded) etc
    gli svantaggi, nel mettere un corso di 6 mesi di c, non li vedo ad esempio…. dato che ti ripeto il python da autodidatta è facile… il c sarebbe molto arduo

    cioe’ forse non mi sono spiegato bene, ora che francesco mi ha chiarito il fatto prestazionale, che era l’unico dubbio che avessi sull’uso di linguaggi interpretati, sono d’accordo con voi sul migliore utilizzo di quest’ultimi

    ma dal punto di vista strettamente didattico, universitario, e quindi con una conoscenza il piu’ completa possibile è fondamentale questa conoscenza… è lo stesso motivo per cui facciamo gli esami matematici, sono importanti, ma non tutti, e non tutti avranno un utilizzo pratico, eppure ne facciamo tantissimi…

    COMPLETO perchè un informatico ha una buona base DI STUDIO E PROGETTAZIONE DI ARCHITETTURE, percio’ ha OBBLIGATORIAMENTE bisogno di determinate conoscenze.
    ci sono 2 esami di architettura dell’elaboratore, uno obbligatorio, uno facoltativo, e poi c’è una specialistica che si basa proprio sulle architetture e sui sistemi embedded (ad uso robotico ad esempio etc)

    ma cio’ non significa che sono inutili, a me magari non serviranno, ma ad un altro che vorra’ seguire un percorso diverso si, è una base, un inizio verso un altro percorso

    è questo che intendo quando dico che una base di c è obbligatoria

    COMPLETEZZA
    COERENZA CON IL RESTO DEGLI STUDI (e ti continuo a citare la sinergia architettura linguaggi di basso livello)
    l’universita’ non deve creare solo programmatori bravissimi nel creare software, ma deve creare anche futuri programmatori assembler, futuri programmatori di sistemi embedded o che ne so….

    si cmq intendevo pseudocodice sorry, ma ieri stavo leggendo un po’ riguardo il l’indicizzazione dei metadati in nipemuk di kde4 prima di rispondere :)

    ed è ovvio che gli algoritmi si studiino in pseudocodice, non li usero’ mica solo in un linguaggio ;)

    e se rileggi bene il mio ultimo post
    non ho detto base della programmazione
    ma intendevo base dell’informatico
    infatti non sto cercando di dimostrare che è una base della programmazione, ma che è una base didattica di una figura professionale che non sia solo programmatore.

    riguardo unix etc, tu pensi che sia sviluppabile un kernel in python? o un HAL o qualunque forma di interfacciamento di basso livello tra hardware e software?
    io non saprei, il python gli diedi un occhiata un paio di mesi or sono
    per quanto riguarda il java, dalla mia esperienza per ora esigua… posso dire che non è certo il linguaggio piu’ adatto per un determinato campo di applicazione

    spero di essermi spiegato ;)
    ci stiamo confondendo a vicenda
    io parlo di didattica, non solo di programmazione, forse sono stato poco chiaro nei primi post :)

    cmq ora ti dico ad esempio a cosa dovrebbe preparare secondo me l’universita':

    programmatore software
    programmatore di basso livello
    progettazione e studio di architetture
    interazione uomo macchina
    sviluppo di intelligenza artificiale
    programmazione software per la rete
    sviluppo e programmazione di sistemi embedded
    programmazione di abstraction layer tra hardware e software
    e tante altre

    TUTTE queste sono fattibili senza toccare minimamente il c? secondo me no

    e se un universita’ non mi da’ modo di andare a lavorare alla ARM, alla INTEL, o piu’ semplicemente di programmare processori mips per un qualche apparecchio embedded o che ne so
    secondo te è un percorso di studio completo?

  • # 140
    Jacopo Cocchi
     scrive: 

    Caffeine c’è un fraindimento alla base del tuo ragionamento.
    L’Università non è un riempitivo (lo è già abbastanza ora con la nuova riforma ma tutto sommato i corsi non sono da buttare) ma un punto del proprio percorso formativo che ti dia determinati strumenti per affrontare i problemi e le richieste che avrai sul lavoro.
    Seriamente per poter avere un background e poter andare direttamente tutte le varianti che hai elencato non basterebbe nemmeno un corso quinquennale con dottorato incluso.
    Non solo. L’approccio che tu hai stilato è più sul versante ingegneristico, ma non è l’unico in Informatica, anzi se vogliamo proprio mettere i puntini sulle i, collimano per alcune materie e per Ingegneria Informatica ma tipicamente l’Informatica intesa come facente della facoltà di Scienze Matematiche Fisiche e Naturali è un altro paio di maniche e non ha certo tra gli obiettivi quello di formarti né per sviluppo/programmazione su piattaforme embedded né per la progettazione di architetture, se per architetture intendiamo HW.
    Se intendiamo architetture di tipo SW allora è più facile che sia un informatico a farlo piuttosto che un ingegnere.

    Per tutte le altre figure descritte non mi sembra che C sia assolutamente indispensabile.
    Ma poi si è sostanzialmente usciti dal discorso messo in luce nell’articolo.
    Quale linguaggio per imparare a programmare? Francesco né altri hanno scritto che C/C++ sono inutili, è stato scritto che non sono linguaggi consigliabili per chi inizia a programmare e vuole imparare una metodologia e un approccio corretto.
    Tutto qua.
    Chiaro che poi a seconda della carriera intrapresa potrebbe servire imparare a gestire la sintassi o i costrutti di C e C++.
    Ma un conto è cominciare, un conto è farlo quando ormai si ha una certa forma mentis ed esperienza.
    Questo è il succo.

    Sono stati stilati alcuni motivi per cui non è consigliabile partire da lì e sono abbastanza palesi ma ancora non se n’è visto uno plausibile per cui occorrerebbe PARTIRE con C e C++.
    E lo scopo ultimo è quello di imparare a programmare non quello di avere una marcia in più in settori comunque di nicchia come lo sviluppo su piattaforme embedded.
    Qualcuno quindi ne elenca qualcuno?

  • # 141
    tommaso
     scrive: 

    Io partirei con qualcosa di semplice come pascal o simili, giusto per familiarizzare e poi passarei a C.
    Da li poi guardandosi intorno uno decide che strada prendere, no?

  • # 142
    tek
     scrive: 

    Suggerirei il seguente percorso formativo:
    1. Scheme e/o Common Lisp
    2. Forth
    3. Smalltalk
    4. Haskell
    5. Java, C++, Python

  • # 143
    Cesare
     scrive: 

    Con Python, che è un linguaggio a oggetti (qualunque cosa è un oggetto, perfino il tipo di un oggetto), puoi emulare facilmente i paradigmi di programmazione strutturata, funzionale, a oggetti e la metaprogrammazione. Manca soltanto la programmazione logica (non si può avere tutto dalla vita :D). ;)

  • # 144
    Wing_Zero
     scrive: 

    Non sono del tutto d’accordo con l’articolo…
    I linguaggi ad alto livello rendono si la programmazione piu’ semplice, permettendo di imparare in maniera “veloce” dei paradigmi di programmazione ad oggetti che ti saranno utili nel corso della tua esperienza, MA hanno un grande contro:
    Non ti permettono di ottimizzare il codice in maniera “eccellente”, non ti permettono di conoscere come funziona una macchina partendo dalle astrazioni hardware basilari.
    “Demonizzare”, come fa questo articolo, il C/C++ e’ sbagliato e sconveniente:
    1) Sbagliato perche’ da un lato hanno i loro grandi vantaggi(velocita’, gestione dinamica della memoria, etc…)
    2) Sconveniente perche’ poi ci si lamenta che le nuove applicazioni sono “poco ottimizzate”, e richiedono hardware sempre piu’ potente. E’ la normale conseguenza della programmazione con linguaggi di sempre piu’ alto livello.

    Inoltre, oggi, i ragazzi che si avviano alla programmazione, vogliono iniziare tutti con il “python” , che in questo momento e’ molto in voga…
    Dal mio punto di vista e’ una cosa assurda per vari motivi:
    1) Assomiglia piu’ ad un linguaggio di scripting che di programmazione
    2) Non e’ “educativo” nel senso che programmando in python non imparerai mai come funziona una macchina dal basso. E se vuoi diventare un buon programmatore e’ quantomeno indispensabile
    3) E’ intepretato. Cosa che ne diminuisce le prestazioni in maniera “consistente”.

    Posso essere d’accordo che per “iniziare” possa andare bene anche il python, ma a patto di passare subito dopo al C/C++ … un passo difficile ma secondo me indispensabile.

    Saluti
    Wing

  • # 145
    Francesco Carucci (Autore del post)
     scrive: 

    Wing_Zero. Il post si domanda quale sia il linguaggio migliore per imparare a programmare, non quale sia il linguaggio migliore per imparare ad ottimizzare. Il C++ non e’ demonizzato, ma semplicemente collocato nella sua sfera d’uso che non e’ e non deve essere quella didattica, per la quale esistono alternative piu’ proficue, come emerso dalla lunga discussione.

    Infine: si puo’ essere ottimi programmatori (ovvero chi risolve un problema in maniera efficiente in base a diverse metriche) senza conoscere la macchina a basso livello. Questa conoscenza e’ necessaria solo in determinate sfere, non in tutte.

    Le prestazioni NON sono l’unica metrica di giudizio, al contrario, sono la metrica probabilmente meno significatica e SEMPRE l’ultima che va considerata nelle scelte degli strumenti di sviluppo.
    Un esempio concreto per spiegare questo discorso: immaginiamo che una giornata di lavoro di un programmatore costi all’azienda 300 euro (spesso molto di piu’) e che questo programmatore stia lavorando su un tool che per la sua esecuzione ha bisogno di 2gb di memoria mentre la macchina sulla quale gira ne ha a disposizione solo uno. Rispondi a questa domanda: conviene spendere uno o due giorni ad ottimizzare l’applicazione magari passando ad un linguaggio a livello piu’ basso… oppure comprare e installare 1gb di memoria in piu’ in cinque minuti?

  • # 146
    Jacopo Cocchi
     scrive: 

    Donald Knuth, una delle più brillanti menti dell’Informatica (che ha scritto The Art of Programming, a sua volta una delle “Bibbie” del settore) scriveva 35 anni fa:
    “We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.”

    Questo per rispondere al discorso che fai sull’ottimizzazione.
    E lo scriveva 35 anni fa quando le tecnologie erano di tutt’altro tipo; perchè era lungimirante lui e perché la vedeva da un punto di vista algoritmico.
    Non si cerca l’ottimizzazione, ma la soluzione al problema, l’algoritmi che funzioni poi, dopo diverse fasi iterative ci può stare anche quello.

    “Demonizzare”, come fa questo articolo, il C/C++ e’ sbagliato e sconveniente:

    Non viene demonizzato niente, semplicemente se ne sconsiglia l’utilizzo (C/C++ come strumento per imparare a programmare) a chi vuole avvicinarsi a questo mondo ed apprendere con la giusta forma mentis le basi ed una metodologia che potrà poi riutilizzare sul lavoro indipendentemente dalla tecnologia di cui si servirà

    1) Sbagliato perche’ da un lato hanno i loro grandi vantaggi(velocita’, gestione dinamica della memoria, etc…)

    Guarda quella della velocità è un grande mito, ma ancora perpretrato evidentemente (di solito da chi è fuori da un contesto aggiornato come può essere quello universitario) di cui ci si serviva ai tempi per demonizzare questo sì o comunque consigliare linguaggi compilati e non interpretati; ormai i JIT compiler e le architetture utilizzate hanno raggiunto un livello tale per cui vi sono situazioni reali in cui le prestazioni sono ribaltate e a favore per esempio di Java o affini

    2) Sconveniente perche’ poi ci si lamenta che le nuove applicazioni sono “poco ottimizzate”, e richiedono hardware sempre piu’ potente. E’ la normale conseguenza della programmazione con linguaggi di sempre piu’ alto livello.

    Cesare ti risponderebbe con “programmiamo allora con il linguaggio macchina (assembly non macchina…poi però valutiamo il costo in termini di tempo e se conviene un approccio a basso livello” :)
    La maggiore richiesta di risorse è un’evoluzione naturale del mercato: l’utente chiede più funzionalità.
    D’altra parte è anche risibile un discorso del tipo “sì vabbè ma consuma troppa RAM”. Hai 2GB, cosa li tieni a fare se non li usi?

    Inoltre, oggi, i ragazzi che si avviano alla programmazione, vogliono iniziare tutti con il “python” , che in questo momento e’ molto in voga…
    Dal mio punto di vista e’ una cosa assurda per vari motivi:
    1) Assomiglia piu’ ad un linguaggio di scripting che di programmazione

    Sei rimasto ai tempi in cui Van Rossum ha steso le prime specifiche ed in realtà già allora si capiva subito fosse ben altro ma a volte il marketing al contrario fa vendere un prodotto per quel che non lo è.
    L’espressività, la possibilità di lavorare praticamente in qualsiasi ambito (dalla programmazione di sistema, gestione di infrastrutture distribuite utilizzandolo come linguaggio da shell, per le applicazioni web, calcolo scientifico, architetture client-server ecc. ecc.), il supporto a più paradigmi, le funzioni built-in per la gestione del dato lo collocano ad un livello di gran lunga superiore rispetto ad un qualsiasi linguaggio di scripting.

    2) Non e’ “educativo” nel senso che programmando in python non imparerai mai come funziona una macchina dal basso. E se vuoi diventare un buon programmatore e’ quantomeno indispensabile

    Altro falso mito. Ci sono una pletora di ottimi programmatori che non hanno idea di come funzioni una macchina dal basso (a parte le solite cose che si vedono nei corsi di architettura, SO ecc.) semplicemente perché non ne hanno bisogno, mentre ce ne sono un sacco che con un approccio del genere scrivono codice illeggibile e poco manutenibile.

    3) E’ intepretato. Cosa che ne diminuisce le prestazioni in maniera “consistente”.

    Vedi risposta precedente

    Posso essere d’accordo che per “iniziare” possa andare bene anche il python, ma a patto di passare subito dopo al C/C++ … un passo difficile ma secondo me indispensabile.

    Niente affatto. C/C++ è uno strumento, se io nella mia vita lavorativa andrò ad occuparmi di un ambito in cui C e C++ non si usano non vedo per quale motivo debba perdere del tempo a formarmi su questa tecnologia.
    I linguaggi non sono vangeli, sono strumenti, che vanno utilizzati a seconda delle esigenze, dei contesti, aspettative e gusti personali.

  • # 147
    Cesare
     scrive: 

    Aggiungo soltanto una cosa (che si può trovare nel capitolo 1 dell’arcinoto “The Dragon Book”): un linguaggio definisce una ben precisa sintassi e semantica. Null’altro.

    Non esistono, quindi, linguaggi intrinsecamente interpretati o compilati: lo sono soltanto ALCUNE loro implementazioni.

    Esistono, infatti, compilatori come PyPy per Python che sono in grado di generare eseguibili binari, come esistono interpreti per linguaggi come il C e il C++. Quest’ultimo caso non mi autorizza assolutamente ad affermare che C e C++ sono linguaggi interpretati.

    Sull’etichetta “linguaggio di scripting” nemmeno mi pronuncio: lascia il tempo che trova.

  • # 148
    Sacchi
     scrive: 

    Non sono d’accordo. Programmare in C significa avere coscienza di quello che effettivamente andrà a girare sulla macchina (dalla struttura dei dati in memoria, a cosa viene passato sullo stack, puntatori, ecc). Credo che questo sia propedeutico per ogni linguaggio.

  • # 149
    Cesare
     scrive: 

    Le uniche cose che sono propedeutiche sono i concetti di dato, tipo, variabile, condizione, iterazione, ecc.

    Le cose che citi riguardano i dettagli della macchina, che NON è necessario conoscere per risolvere problemi. Tutt’altro.

    Diventano necessari soltanto con particolari linguaggi abbastanza poveri sintatticamente che ti costringono a doverci lavorare.

  • # 150
    Andrea
     scrive: 

    Premettendo che sono solo uno studente delle superiori, per imparare a programmare e risolvere problemi penso che il c/c++ nn sia il male.
    Io mi sono trovato molto bene partendo da questo livello e quasi quasi ora che uso il java e il c#(di cui nn metto in discussione i vantaggi) lo rimpiango un bel po’.
    Con il c mi sentivo più libero e per capire come programmare lo trovo sicuramente migliore visto che le cose devi costruirtele da te e non usare dei pachetti già fatti.

  • # 151
    Jacopo Cocchi
     scrive: 

    Andrea non sta scritto da nessuna parte che le cose devi “costruirle da te” e non usare pacchetti già fatti. Che poi cosa significa, che non userai mai librerie già pronte?

    Devi semplicemente risolvere i requisiti di un problema il più velocemente possibile e nel modo migliore.
    Questo significa anche non perdere tempo nel reinventare la ruota.

  • # 152
    banryu79
     scrive: 

    [QUOTE]
    Andrea non sta scritto da nessuna parte che le cose devi “costruirle da te” e non usare pacchetti già fatti. Che poi cosa significa, che non userai mai librerie già pronte?

    Devi semplicemente risolvere i requisiti di un problema il più velocemente possibile e nel modo migliore.
    Questo significa anche non perdere tempo nel reinventare la ruota.
    [END QUOTE]

    Ma lol, anche perchè se credi a questo concetto, Andrea, allora che diavolo includi a fare la libreria stdio per poter sfruttare printf, tanto per dirne una?

    Non stai usando un “pacchetto già fatto”? Vergogna :)

    La domanda che ti pongo io allora è questa: quando un “pacchetto” che puoi usare è troppo per te, e sarebbe meglio farlo a manina? E quando invece ne senti l’assenza e sarebbe bello se esistesse un “pacchetto” già pronto?

    Secondo me un linguiaggio e le librerie (e IDE e compagnia varia) con cui opero non definiscono altro che un preciso punto di astrazione/una precisa prospettiva/un ambiente/una precisa situazione al contorno/chiamatela come vi pare che io scelgo come migliore “base di partenza” per risolvere il problema che mi sta davanti.

    E i problemi che ho affrontato, nel mio piccolo, in 5 anni di programmazione non erano praticamente mai definiti criticamente dalle prestazioni, come requisiti del problema.

    Le prestazioni le ho solo incontrate come uno degli aspetti della soluzione.
    Tranne una volta, una sola volta, praticamente mai ho dovuto preoccuparmi di ottimizzare ad hoc il codice (posto di scriverlo comunque correttamente senza strafalcioni).

    Quell’unica volta, tra l’altro, per risolvere non ho dovuto riscrivere in C o assembly la porzione interessata: ho usato un po’ di tempo per studiare meglio la faccenda e trovate le cause ho semplicemente implementato un algoritmo migliore.

    Ricordiamo sempre che il topic si interrroga su quale sia il linguaggio migliore per chi sta bianco come un lenzuolo in fatto di programmazione.

    Non su quale linguaggio sia milgiore in senso assoluto (che poi non esiste, se è migliore degli altri lo deve essere rispetto a qualche settore, per fare qualcosa di presciso, non può esserlo contemporaneamente sempre e comunque in tutti i casi, questo è puro e semplice buon senso).

    Qui si dice che il Ce il C++, rispetto alla vasta pletora di linguaggi disponibili ad oggi, anno del Signore 2008, non sono i migliori linguaggi per chi sta a ZERO in fatto di programmazione.

    Nonostante io abbia cominciato proprio con C e C++ (e nutra ancora per il C un certo affetto e ogni tanto li rispolveri) è OVVIO che NON E’ il milgio linguaggio tra quelli possibili per iniziare a programmare.

    Per me questo è puro e semplice buon senso.

  • # 153
    massimo
     scrive: 

    io voglio imparare a programmare ma non so da dove iniziare.qualquno a un idea?magari inizialmente qualcosa di semplice.

  • # 154
    Cesare
     scrive: 

    Ovviamente Python. :D

    Cerca su Google “pensare da informatico”: il primo link è un libro per imparare a programmare partendo da zero. Vedrai che ti troverai bene con Python: è un liguaggio molto semplice (ma anche molto versatile). ;)

  • # 155
    Alberto
     scrive: 

    Boh.. io inizia con l’assembly per 6510 e poi 68×000. E ad oggi non mi sembra di scrivere grosse porcate.

  • # 156
    Alberto
     scrive: 

    Aggiungo una cosa. Quoto il commento di Fabio, arrivando da una scuola di programmazione prettamente non OOP, quando ho “dovuto” iniziare a lavorare in OOP ho trovato delle difficolta’ enormi.

  • # 157
    Luciano Biagioli
     scrive: 

    Per primo linguaggio consiglierei il Pascal.
    Ideato per principianti dal professor Niklaus Wirth.
    Poi si può passare a Java o C# molto richiesti nel mondo del lavoro.
    Ma è bene chiedersi: perchè imparare a programmare? Per hobby o anche per una futura professione?
    Perchè arrivare al professionismo sarà dura.
    Sviluppare programmi professionali è la differenza tra costruire barchette e fare barche vere.
    Comunque se non si vuole partire dal Pascal reperire libri sui linguaggi per programmatori principianti tipo “Java for Dummies” ecc. o della Deitel & Deitel,
    che trattano di Java, C, C++, ecc., per inepserti totali.
    Ciao!

  • # 158
    Jacopo Cocchi
     scrive: 

    Sì ma al di là del campo di applicazione (ovvio se si tratta non so di scrivere firmware per macchine a controllo numerico il discorso è molto specifico) quando si è imparato, si è imparato.
    Cambieranno requisiti e contesto tecnologico ma i fondamenti per riuscire a scrivere del buon codice sono sempre quelli.
    Infatti la domanda posta è “quale linguaggio per imparare a programmare” (cioè quale strumento) e non “quale linguaggio di programmazione imparare” :)

  • # 159
    Alessandro
     scrive: 

    Premetto che sto leggendo i commenti perché cerco anche io una risposta in quanto sogno di produrre software e gestionali da vendere e non capisco niente e non so da dove iniziare.
    Da quello che leggo ci sono due scuole di pensiero e penso che entrambi gli approcci siano corretti. Semplicemente ci sono pro e contro in entrambi i casi: una soluzione perfetta non esiste. Sicuramente è giustissimo sapere tutto e quindi partire dalla base, ma quanto costa (in termini di tempo/pazienza) in relazione ai risultati? E’ come imparare ad estrarre la radice quadrata di un numero a mano…a che serve? In teoria e giusto sapere come si fa, ma serve davvero? Soprattutto se visto in un’ottica costi-benefici.
    Lavoro in un’azienda di media grandezza, e la gestione degli ordini, degli imballi, di parte della fatturazione, dei pagamenti e altro è gestito da un “programmino” che ho fatto in MS Access senza scrivere un rigo di codice (che non conosco). Chiaramente ho molti limiti, ma vi assicuro che il “programmino” gira bene, non da mai errori, l’interfaccia grafica è user-friedly e genera stampe chiare e utili. Abbiamo un gestionale acquistato da una notissima software-house italiana, che mal si adatta alle nostre esigenze e viene utilizzato solo per la contabilità; il modulo ordini che abbiamo fatto modificare per soddisfare le nostre esigenze (e pagato a caro prezzo) non è stato mai utilizzato dai miei colleghi, che preferiscono il mio.
    E’ per questo che vorrei imparare un linguaggio di programmazione: vorrei trasformare il mio file di Access (in realtà sono 5 o 6) in un programma vendibile (quanto meno ad aziende che hanno esigenze simili alle nostre).
    Cosa mi consigliate?

  • # 160
    saggio81
     scrive: 

    per imparare a programmare è inutile buttarsi su linguaggi obsoleti non ad oggetti.
    Prima si impara un po’ di teoria: il concetto di variabile, di classe, di oggetto ; utilizzando pseudocodice.
    Poi si sceglie un linguaggio tra C#, Java o Vb.net e si impara la sintassi…
    Ci vuole tempo e passione, altrimenti si rimane sempre fermi al livello di Print(“Hello World”);

    byez

  • # 161
    carletto
     scrive: 

    A me programmare non piace nè interessa perciò non mi pongo il problema ^_-

    anche se a ing gestionale a pisa facciamo java + javascript (che rottura, proprio non mi piace come argomento la programmazione).

  • # 162
    mithrandir
     scrive: 

    Ruby???

  • # 163
    Marco
     scrive: 

    Andate tutti a cagare seguaci dell’object oriented… voi e il vostro miserrimo java o c# basato su codice pseudocompilato. Orrore della programmazione, chiavica dell’informatica…
    Non sottovalutate la potenza del lato oscuro della programmazione… viva il C e tutti i suoi puntatori…
    E ricordate: a volte ritornano!

  • # 164
    Cesare Di Mauro
     scrive: 

    Marco, potevi citare anche un altro linguaggio orientato alla programmazione strutturata, ma proprio il C, che è fra i peggiori e fra i più proni a far commettere errori veramente difficili da andare a scovare…

    Comunque potresti spiegare perché preferisci il C e, soprattutto, perché aborrisci i linguaggi di programmazione orientati agli oggetti? Non è che, per caso, non sei in grado di padroneggiare questo paradigma e automaticamente gli spari letame sopra? Perché è un comportamento che riscontro spesso…

  • # 165
    Marco
     scrive: 

    Ma sì… forse ho esagerato… d’altra parte mi sono messo dalla parte del lato oscuro e quindi…
    E’ vero che il passaggio da C a Java (attenzione C e non C++) non è stato così “aggratis” come si dice, però alla fine mi ritengo anche un buon programmatore Java. In realtà mi ritengo un buon programmatore a prescindere dal linguaggio di programmazione. D’altra parte, pur riconoscendo a java (tralasciamo un attimo C#) innegabili vantaggi dal punto di vista del programmatore (del resto è un linguaggio ad alto livello senza alcun dubbio), il C impone al programmatore in qualche modo la consapevolezza di ciò che la macchina dovrà fare e come lo potrà fare (solo da un punto di vista logico… ovviamente). Java maschera (o tenta di mascherare) molte “verità nascoste”. Nella mia esperienza (lavoro nell’IT dal 2000 e sono anche ingegnere elettronico… ma poco importa) riconosco che molti programmatori Java, anche molto bravi, non potrebbero nemmeno pensare di riuscire a scrivere buon codice in C; d’altra parte, molti programmatori C potrebbero scrivere ottimo codice in Java. Insomma è più semplice passare da C a Java che viceversa… ovviamente questo è un mio parere e può valere anche per altri linguaggi. Ad esempio, il passaggio da Pascal a C non è semplice, ma non lo sarebbe nemmeno da Pascal a Java (a maggior ragione in quanto il primo è procedurale, l’altro è a oggetti e il gap non è piccolo!). Non è solo questione di sintassi ma proprio di approccio alla programmazione. Anche il C è procedurale, ma si presta a tecniche di programmazione bellissime ed eleganti con l’uso dei puntatori a void e i puntatori a funzione. Stesso discorso di bellezza ed eleganza si può fare con Java mediante i concetti di ereditarietà e di interfaccia.
    Una cosa però non è da sottovalutare: un programma in C è adattabile a qualunque macchina che abbia un compilatore C, e un compilatore C non si nega a nessuna macchina (nemmeno tra le più vecchie o su controller elettronici), mentre un codice scritto in Java necessita di una virtual machine la quale a sua volta ha necessità di risorse ben più pesanti di un compilato C… poi si può imparare a programmare bene anche in VB6.0 (che tra l’altro ha il concetto di classe), di contro un’eventuale inserimento nel mondo dell’IT sarebbe garantita semplicemente conoscendo (bene) Java: cosa si vuole fare da grandi?!?!?

  • # 166
    Cesare Di Mauro
     scrive: 

    Non sono d’accorso sul fatto che programmatori Java non possono scrivere ottimo codice C, e viceversa che quelli C possano scrivere ottimo codice Java. E’ soltanto una questione di capacità individuale.

    Quanto all’esempio con Pascal, non capisco perché sarebbe più difficile passare da Pascal a Java rispetto al C. E’ più difficile, semmai, passare da C a Java, appunto perché i programmatori C sono abituati a lavorare coi puntatori, mentre in Java non esistono (a parte il concetto di riferimento) e in Pascal l’uso è molto limitato (anche in questo linguaggio c’è il concetto di riferimento).

    Quanto alla portabilità, C di per sé non è un linguaggio portabile: serve non poca esperienza e non pochi #define per “adattare” un sorgente C per farlo girare su una macchina con s.o. e/o architettura diversa.

    Sul maggior consumo di risorse dei linguaggi managed nulla da dire: per lo meno per la memoria le richieste sono superiori. Sulla velocità di calcolo no, perché le prestazioni di C e Java sono più o meno allineate da questo punto di vista (parlo di velocità nell’eseguire calcoli).

    Infine non concordo sul fatto che sia necessario avere “consapevolezza” della macchina per risolvere problemi. Si possono benissimo trovare soluzioni senza conoscere se la macchina su cui gira l’algoritmo è little-endian o big-endian, giusto per fare un esempio.

    Si può essere buoni programmatori con qualunque linguaggio, ma certi linguaggi ti indirizzano meglio di altri a scrivere codice in un certo modo. Il C non è fra quelli migliori. Java sì. Pascal idem, ecc.

  • # 167
    Marco
     scrive: 

    @Marco
    “mentre un codice scritto in Java necessita di una virtual machine”
    Ma parliamo di linguaggi o delle loro implementazioni? Guarda comunque che nessuno ti impedisce di compilare codice Java in codice nativo per il sistema target, che ci sono implementazioni in hardware (Jazelle su ARM ad esempio), e una schiera di JVM per tutti i gusti: dalla JVM embedded che richiede una manciata di KiB fino a interi SO (Jnode).
    Per quanto riguarda l’eleganza formale, credo che non ci sia niente di meglio dei linguaggi funzionali.
    Se il target e’ la correttezza formale del codice in genere ci si orienta verso ADA o Pascal, o comunque linguaggi fortemente tipizzati.

  • # 168
    Marco
     scrive: 

    E chi ha mai detto che programmatori Java non possono scrivere buon codice C? Ho solo detto che molti programmatori Java (anche ottimi) non sarebbero in grado di scrivere codice decente in C (molti… non tutti).

    Non ho mai parlato di prestazioni (che tra le altre cose dipendono da una miriadi di fattori).

    Little-endian e big-endian che diavolo centrano? Nel più dei casi sono concetti che possono essere trascurati.

    Pascal e C sono linguaggi procedurali, mentre Java e un linguaggio Object Oriented… sono paradigmi differenti che portano a ragionare in modo diverso… tutto qui!
    I linguaggi funzionali?!?!? Un altro paradigma di programmazione che porta a ragionare in modo diverso dai due precedenti… Ce ne sono altri di paradigmi di programmazione, ognuno con le proprie caratteristiche di cui è necessario fare i conti.

    Inoltre, che io sappia, fuori dall’ambito accademico nessuno ha mai richiesto un preciso skill professionale in ambito Pascal! Tuttavia il Pascal è un ottimo linguaggio per imparare a programmare (almeno nella classe dei linguaggi procedurali e strutturati a blocchi). Sempre secondo me, però, Java non è un buon linguaggio di programmazione per imparare a programmare ad oggetti… però Java ti apre le porte della I.T (almeno oggi).

    Per quanto riguarda i puntatori ovviamente il linguaggio C non può farne a meno. A meno che non si voglia rinunciare a gran parte delle potenzialità del linguaggio stesso… come se uno dicesse (per esempio… solo per esempio per carità) “il concetto di interfaccia non mi piace e quindi io, programmatore Java, vi rinuncio a priori!”
    I puntatori sono parte integrante del C e un loro buon uso è alla base della scrittura di librerie di utility generalizzate (Cosa certamente simile si può dire per il concetto di interfaccia in Java).

    Ultima cosa: chi tra voi programmatori Java ha mai gestito in qualche modo l’eccezione che potrebbe verificarsi a seguito dell’istanziazione di un nuovo oggetto tramite l’operatore new? (Siate sinceri però!)
    Eppure molti programmatori Java ignorano che ciò può verificarsi anche nei sistemi di calcolo moderni, nei quali la memoria non fa certo difetto, e per ragioni non imputabili ad una vera mancanza di memoria fisica… A seguito di un operatore new nessun programmatore Java si chiederebbe: “sì, ma quanta memoria sto cercando di allocare?”, in linea di massima egli non lo sa, non vuole saperlo e non può nemmeno saperlo (cosa nacora più grave)! Ecco la consapevolezza di cui parlavo: almeno in C alla funzione malloc devo passare il numero di byte che voglio allocare. Altro che big endian e little endian. Ma potrei fare altri innumerevoli esempi di non consapevolezza indotta da Java (ma anche dal Pascal, sebbene in misura ridotta).

    Infine (quasi scordavo): “il C non è un linguaggio portabile”… ne siete poprio sicuri? Il C è un linguaggio molto standard… certo però se uno programma in Visual C su sistemi Windows e usa le API di Windows per fare certi lavori, allora ecco l’incompatibilità da dove spunta.
    Vi riferivate ad altri tipi di incompatibilità? Per esempio sul numero di byte contenuti in un int a seconda dell’architettura? E qui casca l’asino: per quest’altro tipo di incompatibilità sarà la bravura del programmatore a fare la differenza… ma in modo equivalente: chi ha mai gestito l’overflow in una somma tra interi Java? Eppure è un problema da scuola superiore che molti programmatori (java e non Java) nel’I.T. ignorano o non si sono mai posti.

    La differenza la farà sempre e solo il programmatore, non il linguaggio di programmazione utilizzato.

    A voi, prego!

  • # 169
    Cesare Di Mauro
     scrive: 

    Andiamo per ordine. :D

    Allo stesso modo, molti programmatori C non sarebbero in grado di scrivere codice decente in Java. ;)

    L’endianess centra nella misura in cui, ad esempio, devi spedire dati via rete, oppure salvare dei dati su una macchina e recuperarli su un’altra.

    Se Java non è un buon linguaggio per imparare a programmare, è sicuramente di gran lunga meglio paragonato a C et similia.

    Se fallisce l’operatore new per l’allocazione di un oggetto in Java, può fallire anche la malloc per il C e creare gli stessi identici problemi (anzi, in C è anche peggio, perché può portare a sovrascrivere la memoria bassa).
    Il problema non sta nel fallimento, insomma, ma nel riconoscere la situazione e gestirla correttamente. Non c’entra nulla il sapere quanta memoria è stata allocata.

    Non puoi prendere un solo pezzo della frase. Ho detto che il C non è un linguaggio portabile e questo è intrinsecamente vero (basta leggere lo standard, e sono scritte a chiare lettere le situazioni in cui si verificano i problemi), ma ho aggiunto che è necessario lavorarci un po’ per ottenere la portabilità del codice. Infatti i sorgenti C di progetti non banali sono farciti #define, #ifdef et similia per definire correttamente tipi e altre informazioni a seconda della piattaforma su cui vengono compilati i sorgenti. E ciò non riguarda soltanto la dimensione degli int, ma anche l’endianess ad esempio.

    Le condotte errate, poi, esistono per tutti i linguaggi. Semplicemente il C è uno dei linguaggi che può favorirle, data la povertà dei costrutti di cui è dotato.

    Quindi la differenza la farà anche il programmatore, ma a parità di programmatore la fa senz’altro il linguaggio. ;)

  • # 170
    Marco
     scrive: 

    “L’endianess centra nella misura in cui, ad esempio, devi spedire dati via rete, oppure salvare dei dati su una macchina e recuperarli su un’altra.”

    … e certo! Scrivere programmi per lo scambio di dati a basso livello capita tutti i giorni!?!?!! Mi piacerebbe stilare una statistica con lo scopo di conoscere la percentuale di programmatori java e non Java che operano nell’IT e che abbiano affrontato un tale problema almeno una volta nella vita anche per scherzo!!!!!

    “Se Java non è un buon linguaggio per imparare a programmare, è sicuramente di gran lunga meglio paragonato a C et similia.”

    … vabbè va… ho già detto che si uò imparare a programmare anche in VB6… non ripetiamoci. Strano che tu non abbia tirato in ballo il python anche in questo caso!

    “Se fallisce l’operatore new per l’allocazione di un oggetto in Java, può fallire anche la malloc per il C e creare gli stessi identici problemi (anzi, in C è anche peggio, perché può portare a sovrascrivere la memoria bassa).
    Il problema non sta nel fallimento, insomma, ma nel riconoscere la situazione e gestirla correttamente. Non c’entra nulla il sapere quanta memoria è stata allocata.”

    … e certo: tutti i libri di programmazione java di basso, medio o alto livello hanno mai messo un try catch su una new?!?!? Boh vabbé… può darsi che io mi sbagli…
    Di contro qualunque libro serio sulla programmazione C insegna a testare che il risultato di una malloc sia != NULL!!! E in Pascal da nill (mi sembra che sia “nill”… abbiate pazienza se son 15 anni che non programmo in Pascal nemmeno per scherzo).

    “Non puoi prendere un solo pezzo della frase. Ho detto che il C non è un linguaggio portabile e questo è intrinsecamente vero (basta leggere lo standard, e sono scritte a chiare lettere le situazioni in cui si verificano i problemi), ma ho aggiunto che è necessario lavorarci un po’ per ottenere la portabilità del codice. Infatti i sorgenti C di progetti non banali sono farciti #define, #ifdef et similia per definire correttamente tipi e altre informazioni a seconda della piattaforma su cui vengono compilati i sorgenti. E ciò non riguarda soltanto la dimensione degli int, ma anche l’endianess ad esempio.”

    … Ancora con l’endianess: mi sa che non ci hai dormito più di una notte! Mentre invece non capita mai che una somma tra int vada in overflow oppure di calcolare correttamente il piano di ammortamento di un mutuo per valute a virgola fissa con due decimali? Ma fammi il piacere che questi ultimi casi sì che capitano spessissimo… e sai quanti interventi correttivi ho affrontato in tal senso su codici scritti da non si sa chi?!?!

    “Le condotte errate, poi, esistono per tutti i linguaggi. Semplicemente il C è uno dei linguaggi che può favorirle, data la povertà dei costrutti di cui è dotato.”

    … sacrosanta verità! Come contraddirti… ma l’asino casca sempre qui!

    “Quindi la differenza la farà anche il programmatore, ma a parità di programmatore la fa senz’altro il linguaggio. ;)”

    …Boh vabbé: siamo parzialmente d’acccordo… :-) infatti in linea di massima il programmatore sceglie il linguaggio ed anche l’ambito ? A me sembra che 99,9 volte su 100 ciò non accade mai, né per un verso né per l’altro!
    ————
    Per Marco:

    “Guarda comunque che nessuno ti impedisce di compilare codice Java in codice nativo per il sistema target, che ci sono implementazioni in hardware (Jazelle su ARM ad esempio), e una schiera di JVM per tutti i gusti: dalla JVM embedded che richiede una manciata di KiB fino a interi SO (Jnode).
    Per quanto riguarda l’eleganza formale, credo che non ci sia niente di meglio dei linguaggi funzionali.”

    … ah casco dalle nuvole: mi piacerebbe far girare un mio programmino scritto in Java sul mio vecchio M24; mi spedisci un link da cui scaricare una JVM per 8086 ? Ah dato che ci stai spediscimene una anche per il mio vecchio Commodore 64 (di cui esiste un ottimo compilatore C)… sai non ho tempo di scrivermi delle versioni personalizzate di JVM a manella!!!!! Ah.. ovviamente mi apsetto che le versioni funzionino decentemente (ma forse per l’8086 non è un’impresa disperata! Posso essere ottimista.)

    Java compilato!?!?! Quando lo chiesi a non mi ricordo ormai chi, di poco mi linciava quasi avessi detto una bestemmia! Evidentemente i tempi cambiano (e pure in fretta)!

  • # 171
    Cesare Di Mauro
     scrive: 

    Anche qui, andiamo con ordine. :)

    Per quanto riguarda l’endianess, beh, io farei sicuramente parte della statistica. :D
    http://wpython.googlecode.com/files/Beyond%20Bytecode%20-%20A%20Wordcode-based%20Python.pdf
    Slide #12. L’endianess è a dir poco fondamentale per la mia implementazione di Python. ;)
    E la verità è proprio quella: che non c’ho dormito la notte su queste cose (sì, anche sull’overflow derivante dalla somma di due interi), visto che lavoro al progetto principalmente dopo aver messo a letto i bambini.

    Python non l’ho tirato in ballo parlando dei migliori linguaggi per imparare a programmare perché l’ho già fatto ampiamente prima, se dai un’occhiata ai commenti. :D

    Il controllo dell’allocazione di memoria dipende sempre dall’obiettivo che si vuole raggiungere.
    In Java è più difficile trovare un try/catch perché al minimo problema ti ritrovi con lo stack trace che ti fa vedere dove hai fallito e cos’è successo.
    In C se non fai nessun controllo per bene che ti vada hai un segmentation fault, ma nessuno stack trace.
    Il differente approccio dei linguaggi giustifica le misure adottate.
    Poi, ripeto, dipende sempre dagli obiettivi che uno si pone: se mi serve essere assolutamente sicuro di quello che faccio, metto try/catch ovunque ci sia allocazione.
    Per il Pascal era nil. ;)

    Infine concordo con l’altro Marco: non solo Java si può compilare (vedi qui http://gcc.gnu.org/java/ ), ma esistono parecchie implementazione anche di ridotte dimensioni che potrebbero essere adattate per girare anche su un 8086 o C64. ;)

  • # 172
    Marco
     scrive: 

    ;-)) Va bene… stanotte andrò a letto più tranquillo!

  • # 173
    Marco
     scrive: 

    … ops… consentitemi un’ultima cosa sullo stack-trace (poi giuro che passo e chiudo… ognuno per la sua strada e amici come prima).

    Certo lo stacktrace è un gran bella cosa, così come il debug integrato, gli ambienti grafici per lo sviluppo rapido e tutte le migliorie moderne che negli anni hanno preso piede (magari pure a ragione… per carità ne faccio uso anch’io) ma se il cliente che magari ha atteso 2 mesi per il suo software customizzato e questo gli presenta uno stacktrace per lui incomprensibile dopo aver aperto l’n-esimo form-ordini clienti (senza averne chiuso nemmeno uno in precedenza) credo che s’incazzi oltremodo a prescindere… in questo caso magari un try-catch per mostrargli a video un alert avrebbe giovato alquanto… ma certo dipende dagli obiettivi (come affermavi giustamente), resta il fatto che bisogna averne la consapevolezza di un simile accadimento, cosa che l’approccio java non insegna assolutamente, anzi “vizia” il programmatore ad avere la certezza che le cose vadano bene a prescindere.

    P.S.
    Un mio ex collega (strapagato per giunta) è programmatore di questo e di quel linguaggio (anche di C). Stava realizzando un programma in C e ci ficcai il naso dentro, così per curiosità. Mi accorsi che egli non faceva mai nessun controllo su nessuna malloc… benissimo problemi suoi… ma io non mi feci i fatti miei e gli chiesi ingenuamente: “ma i controlli sulla malloc?”, e lui a me (con gli occhi sbarrati come se avessi detto l’ennesima bestemmia): “ma sì dai… voglio sperare che non mi finisce la memoria…”.
    Beh, in produzione la memoria finì perché guarda caso l’allocazione di memoria riguardava una select da tabella oracle da 130milioni di records…
    Morale: io sono passato per “il gufo” e mi rimase l’onere di trovare una soluzione a riguardo… lui prese comunque i soldi e ti saluto scuffia!

  • # 174
    Cesare Di Mauro
     scrive: 

    Vabbé, se non aveva nemmeno idea di come sarebbe stato usato il suo programma, allora è veramente scarso anche come programmatore C. :|

    Sullo stack trace la penso come te. Però considera che la differenza fra Java e linguaggi come il C è a dir poco abissale da questo punto di vista, perché intanto è una funzionalità che è presente, e poi perché gestire le eccezioni con un try/catch è decisamente più semplice e flessibile rispetto alla classica catena di S.Antonio degli if tipici di C et similia. ;)

  • # 175
    Marco
     scrive: 

    Catena di S. Antonio con gli if!??! Che orrore: roba da principianti! Io ti rispondo con questa coppia di funzioni assolutamente standard (vedi e opportunamente interagenti tra loro):

    int raise(int sig);

    void* signal(int sig, void (*func)(int));

    … i dettagli se li vede chi è interessato (in genere non faccio accademia, ma in questo caso un’eccezione solo per un’imbeccata penso ci voglia).

    Come vedi la gestione strutturata degli errori è possibile anche col semplice C:
    “Non sottovalutate il lato oscuro della programmazione… miei giovani apprendisti! AH-AH-AH-AH-AH…”

  • # 176
    Cesare Di Mauro
     scrive: 

    Visto che abbiamo parlato di portabilità, dovresti sapere che l’implementazione di signal.h & relative funzioni dipende dall’implementazione del compilatore (solo pochi segnali sono definiti). ;)

    A parte questo, implementare una gestione delle eccezioni con raise e signal è di gran lunga meno elegante del try/catch dei linguaggi che mettono a disposizione un meccanismo di gestione delle eccezioni (a livello di linguaggio intendo),.

    Soprattutto decisamente più incasinato della catena (all’indietro) degli if di cui parlavo prima (e credo sia decisamente meno performante).

    Fermo restando che almeno un if per controllare la condizione dell’errore dove serve devi comunque farlo, e fra un

    if (condizione d’errore)
    return NULL;

    e un

    if (condizione d’errore)
    raise(SIG_ERRORE_SPECIFICO);

    io preferisco di gran lunga la prima soluzione.

    Anche perché la seconda richiede comunque l’impostazione di un apposito segnale (sempre che sia possibile farlo, come dicevo prima), e al suo interno generalmente la chiamata a una longjmp (e, prima ancora, una setjmp per impostare il punto di salto).

    Infine, con questo meccanismo non è possibile eseguire correttamente il cleanup delle strutture eventualmente allocate, a meno di implementare un meccanismo di gestione delle risorse sopra quello già offerto dalla libreria standard.

    Insomma, roba da spaghetti BASIC dei primi anni ’80, e che difficilmente si vede in progetti “puliti” e “scritti bene”. ;)

  • # 177
    Flavio
     scrive: 

    E dire che il primo corso di programmazione che ho dovuto seguire all’università era proprio sulla programmazione in C… :\

  • # 178
    G
     scrive: 

    Penso che il miglior linguaggio di programmazione con cui un programmatore dovrebbe avere a che fare è proprio il C. E’ un linguaggio completo che ti fornisce le basi, ti insegna a ragionare, ti fa impostare in un certo modo il lavoro.
    Una volta compreso il C, i suoi costrutti e il modo in cui si possono risolvere i problemi, nessun altro linguaggio di programmazione potrà risultare tanto difficile. Vi siete anche mai chiedesti del perchè in università iniziano proprio da quello e poi proseguono con Java e Caml?

  • # 179
    Cesare Di Mauro
     scrive: 

    Veramente è da un bel po’ che all’università si inizia con Java, che rimane un linguaggio “centrale” (lo si usa quasi ovunque).

    Il C per iniziare è assolutamente sconsigliato perché le basi di cui parli in realtà sono i dettagli di più basso livello (struttura della memoria, puntatori, endianess, ecc.).

    I concetti di base sono, invece, quelli di dato, tipo di dato, iterazione, ricorsione, condizione, ecc., e questi si imparano molto meglio con linguaggi di alto livello, come Python.

    Non è un caso che proprio al MIT di recente abbiano abbandonato Scheme (quindi nemmeno il C, proprio perché il C come linguaggio NON è affatto didattico), per passare a Python. ;)

  • # 180
    alex
     scrive: 

    Prima si studia la teoria, poi si pensa al linguaggio.

    Altrimenti è come comprarsi una cassetta degli attrezzi con millemila utensili senza avere la minima idea di come si utilizzino.

  • # 181
    MaxArt
     scrive: 

    Io cominciai col BASIC, dall’età di 7 anni. Ed ho continuato col Quick Basic, con grandi soddisfazioni (per l’epoca), soprattutto quando, per far andare veloci i miei programmi, avevo cominciato a scrivere le mie routine in assembler (avevo programmato pure un mio compilatore!).
    Cominiciai coi linguaggi ad oggetti in maniera molto differente: era il 1995, c’erano i MOO, cominciai con quelli.
    Il C/C++ venne assai più tardi, terzo anno di università. Non programmavo praticamente più, ma per me fu molto facile impararlo. Avevo ormai la “forma mentis”.
    Il Java l’ho imparato un mese fa!

    Ad oggi, il BASIC lo vorrei tanto consigliare, ma è superato e la versione Visual non credo sia adatta alle prime armi.
    Io direi di imparare a scrivere una pagina web, e da lì imparare col Javascript.
    Poi passare a Java.

  • # 182
    Simone
     scrive: 

    Porto la mia (breve) esperienza:
    ho incominciato a programmare in seconda media (ormai cinque anni fa) in VB; ora sono in terza superiore e a scuola sto imparando molto lentamente il C++ (che non mi piace affatto, anche se non ho problemi ad impararlo) e a casa uso ancora il VB; insomma tirando le somme dico che personalmente mi sono trovato molto bene ad incominciare col VB, che ha “preparato” la mia mente ad un modo di ragionare molto adatto al C++.

  • # 183
    Robert
     scrive: 

    Vi parlo praticamente da ignorante:

    ma e il linguaggio Dynamics x++ può essere comparato ai linguaggi sopracitati?

    Com’è come linguaggio?

    Grazie della Vs risposta

  • # 184
    Dirg
     scrive: 

    Il C è IL LINGUAGGIO.

    Voi amanti di java o peggio ancora C# abituati a trascinare bottoni sui frame non azzardatevi ad aver l’arroganza di definirvi programmatori. Siete bravi a fare i copia-incolla con un abilità immensa nel ricercare algoritmi gia pronti sul web, come se i vostri linguaggi non vi dessero gia la pappa tutta pronta.
    Io non sono un programmatore perchè sviluppo applicazioni, sono un programmatore perchè risolvo problemi, creo algoritmi, trovò una soluzione logica efficiente e la insegno alla mia macchina con la piu PIENA e COMPLETA consapevolezza di come comunicare con lei.
    Perchè io la conosco molto bene, so come funziona, so con che fatica e con che facilità svolge i miei insegnamenti. Per questo i miei programmi realizzati in C sono piu leggeri completi ed efficienti dei vostri, perchè non ho l’illusione della legerezza su cervelli a QUAD CORE, non uso algoritmi preformati, non ho bisogno che qualcuno mi fornisca i suoi strumenti, sono in grado di plasmarmeli da solo, e come li voglio io.

    Non ho bisogno di un oggetto complesso composto da pagine e pagine di codice TOTALMENTE INUTILE quando il medesimo oggetto posso crearmelo in base alle mie esigenze e modificarlo, farlo evolvere ogni volta che lo desidero.

    Vi piace vincere facile? Bello non saper nulla di architettura informatica, tanto java la conosce molto meglio di me no? O forse no…

  • # 185
    Cesare Di Mauro
     scrive: 

    Ecco l’esempio di come un programmatore non dovrebbe essere: legato mani e piedi a un linguaggio come il C, che ti costringe ad avere a che fare con dettagli di più basso livello.

    La definizione che conta è quella di algoritmo, e lì non sta scritto che va implementato in C.

    Per cui un buon programmatore deve pensare a una sola regola da seguire: risolvere il problema che gli è stato sottoposto col miglior compromesso possibile.

    Il che significa che può anche decidere di usare il C, non che il C sia l’unico strumento da utilizzare allo scopo.

    Personalmente per il tipo di lavoro che faccio utilizzo quasi esclusivamente Python e riesco a essere estremamente produttivo. E non parlo di sciocchezze: grazie al mio lavoro la mia azienda ha fatturato cifre con diversi zeri. Se per fare le stesse cose avrei dovuto usare il C, probabilmente saremmo a spasso…

    La consapevolezza, quindi, rimane quella di valutare quale strumento utilizzare per risolvere il determinato problema. Il resto è filosofia, anzi, religione. E da ateo non posso certo condividerla.

  • # 186
    Gendo Ikari
     scrive: 

    Il linguaggio degli algoritmi non è il c, è la matematica. Potrei scrivere soluzioni ai problemi usando un pezzo di carta, un lapis ed una calcolatrice. “L’informatica non riguarda i computer più di quanto l’astronomia riguardi i telescopi” (E. W. Dijkstra).
    Detto questo la risposta di Di Mauro è definitiva. Posto un parametro di valutazione, ogni ambito richiederà linguaggi e compilatori diversi per massimizzare quel parametro. Non esiste il parametro definitivo, e non esiste il linguaggio universalmente utile.
    Qualcuno pensa il contrario? Provi a programmare un’agenda telefonica in assembly, un motore grafico in camL, un servizio web 2.0 in C, e… beh ho reso l’idea.

  • # 187
    fabio sing
     scrive: 

    Bene…io sono uno che di programmazione non sa molto se non quello imparato più di 10 anni fa al’ itis e quello che ho imparato facendo un corso di programmazione plc come il testo strutturato.
    Arriviamo al punto…io sono un tecnico elettronico che smanetto da più di 10 anni su impianti industriali (esempio: linee di imballaggio per mobili che sfornano 8.000 armadi a turno) da tutti i punti di vista meccanico elettrico e collaudo e chiaramente sono abbastanza ferrato sull’uso del pc e il campo dell’automazione mi piace e mi piacerebbe imparare un linguaggio che possa usare sulle macchine, in quanto vorrei fare il passaggio nell ufficio programmazione…e vi assicuro che sono molto interessato quello che imparerò non è questione di soldi ne di star comodi in ufficio.
    Ho visto che nell’ azienda dove lavoravo fino a pochi anni fa usavano il c++ per programmare la sps e anche i programmi di ottimizzazione delle lavorazione.
    Non esistono corsi di programmazione plc se non dai costruttori
    che ti insegnano a utilizzare solo il loro prodotto e normalmente con linguaggio a ladder o kop .
    Sono mesi che sto cercando una risposta e in questo forum mi sembra che ci siano un numero cospiquo di esperti.
    Vi ringrazio,
    ciao.

  • # 188
    loop
     scrive: 

    Come puo’ un bambino imparare a camminare se prima non impara a gattonare?
    Come si puo’ apprendere la lettura se prima non si conosce l’ alfabeto?
    Come si puo’ pretendere di scrivere se prima non si è a conoscenza
    della logica grammaticale(soggetto predicato e complemento)?
    Come si puo’ pretendere di programmare se si conosce come funziona un computer , hardware ,cpu etc..etcc..etcc..

    Un principio per un principiante?

    Come ci hanno insegnato nella scuola , dal BIG BANG , prime forme di vita , dinosauri , primitivi etc.. etc….
    posso solo che consigliare un introduzione all’Assembly , e approfondire e padroneggiare il C!!!!

    Solamente dopo aver appreso delle basi solide da questi 2 linguaggi , avrete solo l ‘ imbarazzo della scelta su quale linguaggio usare per le vostre applicazioni in quanto avrete capito la vera logica di programmazione e non solo, ma cio’ che avviene fisicamente dai cluster del disco all cpu. che nessun altro linguaggio potra’ darvi!

    Forse chi ha studiato il latino alle superiori potra’ compredere meglio cosa voglio dire , il latino, una lingua che nella vita di oggi non ha utlita’,osboleta , ma che grazie a lei per chi l’ avesse studiata ,si è poi compreso meglio la logica della lingua italiana!

    Come disse qualcuno , per qualunque cosa nella vita . meglio partire dal 1 gradino che ritrovarsi al 5 piano e non saper come scendere!
    Purtroppo per chi si cimenta nella VERA programmazione il lungo cammino comincia sempre con il 1 passo

    Saluti

    Lup

  • # 189
    Cesare Di Mauro
     scrive: 

    Infatti i veri programmatori iniziano direttamente col linguaggio macchina.

    Poi si rendono conto che nasconde tanti, troppi, dettagli di basso livello, e passano alla microelettronica. E da lì il passo alla fisica quantistica è breve…

  • # 190
    Geom. Righentini
     scrive: 

    Io iniziai con il Visual Basic e devo dire che imparato bene un linguaggio i concetti sono simili a tutti gli altri, a differenza ovviamente della sintassi. Per il resto mi sono avvicinato a qualsiasi linguaggio con estrema facilità.

    Non credo ci sia una legge con quale linguaggio di programmazione iniziare.

  • # 191
    Enry
     scrive: 

    Io ho 13 anni,vado in terza media, e sto studiando c: devo dire che per essere il primo vero linguaggio di programmazione che imparo è piuttosto complesso ma se piace si impara senza problemi.
    Invece trovo inutile iniziare con Pascal poichè è molto limitato, e pe iniziare, se proprio non si vuole iniziare con il c, consiglierei il vb o il Python.

  • # 192
    ufo.rob
     scrive: 

    Il fatto che bisognerebbe andare per difficoltà crescente e la frustrazioni di pageup nell’avvicinamento al C dovrebbe essere illuminanti. Certo anche se sono d’accordo con l’articolo ma quando Carucci dice nel commento “Consiglio qualunque linguaggio ad alto livello per iniziare” forse lì si esagera nel senso opposto (consiglieresti anche Perl?), sono d’accordo invece sul fatto che potrebbe andare bene anche Visual Basic. Conosco persone che lavorano in C e hanno iniziato con il Visual Basic. Oggi però sarebbe preferibile ovviamente iniziare con VB .NET e non con Visual Basic 6.
    Qui si spiegano i punti di forza di Python e perché va bene per iniziare
    http://www.cs.ubc.ca/wccce/Program03/papers/Toby.html

  • # 193
    ufo.rob
     scrive: 

    x Dirg:
    Tu soffri di quella che viene definita “C hacker syndrome” :-)

  • # 194
    Vittorio
     scrive: 

    Fuori dalle polemiche, non pensate forse che C e Java non siano in competizione fra loro?

    C è orientato alla macchina fisica.

    Java è orientato alla macchina virtuale.

    Si scriverà mai un compilatore per architettura x86 in Java. Penso di no.
    Si scriverà e si scrive in C.

    Secondo me i due piani su cui si muovono C e Java sono differenti.

    E’ un po’ come paragonare l’assembly al C.

    C farà morire l’assembly? Certo che no.

    Java farà morire C? Certo che no.

    Che ne dite? :)

  • # 195
    Gabriele
     scrive: 

    scusate e la prima volta che mi inoltro in questo nuovo mondo……. vorrei sapere cosa significa dettagliatamente programmare e dove bisogna scrivere con questi linguaggi per avere le prime esperienze in questo campo…..grazie

  • # 196
    ufo.rob
     scrive: 

    A supporto di Radoen, goldorak e gli altri che hanno citato Scheme pare che la programmazione funzionale stia prendendo piede sempre più ANCHE per introdurre alla programmazione

    # Carnegie-Mellon University Professor Robert Harper in March 2011 wrote: “This semester Dan Licata and I are co-teaching a new course on functional programming for first-year prospective CS majors… Object-oriented programming is eliminated entirely from the introductory curriculum, because it is both anti-modular and anti-parallel by its very nature, and hence unsuitable for a modern CS curriculum. A proposed new course on object-oriented design methodology will be offered at the sophomore level for those students who wish to study this topic.”[41]

    http://en.wikipedia.org/wiki/Object-oriented_programming#Criticism

    Io ho scoperto la programmazione funzionale abbastanza di recente ma non ho potuto addentrarmici molto però mi interessava (in particolare per la parallelizzazione), stavo quasi per fare la tesi su quello.

  • # 197
    ufo.rob
     scrive: 

    x Gabriele:
    Programmare significa costruire (“creare” se preferisci) programmi (sequenze di istruzioni) che possano essere eseguiti da un computer. I programmi possono essere di tutti i tipi: possono risolvere un problema matematico, essere un’applicazione interattiva tipo Word ecc.
    Al giorno d’oggi si usano i linguaggi di programmazione che ti permettono di “comunicare” al computer quello che vuoi fargli fare. Si scrivono delle cose che assomigliano a frasi in inglese e/o formule matematiche e un altro programma chiamato compilatore le traduce in un programma eseguibile dal computer. Il programma puoi scriverlo anche con blocco note, non importa, però ci sono programmi apposta chiamati IDE (ambienti di sviluppo integrati) che oltre a contenere le funzioni un editor di testo come blocco note ti “aiutano” a scrivere il codice e ti permettono di ottenere il programma finale più facilmente (ad esempio facendo solo un click per compilare).
    Come emerso dalla discussione puoi iniziare con quello che vuoi, basta che non siano il C e il C++ a meno che tu non abbia un obiettivo particolare (che ne so, programmare i sistemi embedded nelle auto, tipo il controllore dell’iniezione) ma dalle tue domande non sembri avere un interesse specifico e credo che tu sia l’esempio lampante di chi ha solo un’idea vaga e vuole iniziare a programmare e non dovrebbe iniziare né con C né con C++.
    Se sapessi quanti anni hai, che scuola fai e cosa pensi di fare programmando e come usi il computer (in particolare se usi Windows, Mac o Linux) potrei darti dei consigli più specifici.
    Qui c’è già una risposta che ho dato a una domanda simile
    http://it.answers.yahoo.com/question/index;_ylt=AtGpMO33GMy45ejH_5LLlb7xDQx.;_ylv=3?qid=20101027114911AAGmyMV
    Ti do due consigli a prescindere:
    1) Non cercare guide a uno specifico linguaggio ma *introduzioni alla programmazione* con quel linguaggio, tipo questa
    http://www.arcetri.astro.it/~lfini/AGauld/tutcont.htm
    2) Non pensare che le guide tipo “Java in 7 giorni” ecc. possano insegnarti veramente qualcosa se non hai altre basi

  • # 198
    ufo.rob
     scrive: 

    Mi è venuta in mente una cosa che poi è stata sommersa dalle altre cose che poi non ho scritto. Mi sono limitato a Windows, Linux e Mac ma per sottolineare il fatto che non importa come inizi (a meno di scegliere C o C++), all’inizio puoi imparare anche con una calcolatrice programmabile, un vecchio computer (tipo Commodore 64 o Amiga :-) o un vecchio PC con DOS e GWBASIC) o persino solo con i libri. Tra l’altro prima di fare qualunque cosa devi comunque leggere guide e libri.

  • # 199
    ufo.rob
     scrive: 

    Oggi ho proprio voglia di perdere tempo (o condividere la mia saggezza con gli altri ^_^, sono punti di vista ^_^)
    @Vittorio: qui si stava discutendo su quale linguaggio sia meglio per iniziare, hai scritto fuori dalle polemiche ma anche fuori dal discorso, che il C morirà per colpa di Java non mi sembra l’abbia scritto nessuno….
    Comunque esistono compilatori di Java (non ricordo se partono dal codice Java o dal bytecode) che producono eseguibili Windows http://jnc.mtsystems.ch/
    Esistono compilatori di C con la JVM come target
    http://en.wikipedia.org/wiki/Java_Virtual_Machine#C_to_bytecode_compilers
    Non so se esiste un compilatore scritto in Java (normalmente si usano Flex e Bison e il C per farli) ma da quello che ti ho scritto capisci che è possibile…
    Ovviamente queste cose non sono molto diffuse a livello di produttività e C e Java normalmente stanno ognuno al suo posto ^_^ ma le contaminazioni sono sempre possibili.
    Tornando al discorso, qui in pratica ci sono due fazioni:
    – il C è usato in molti campi o ti costringe a conoscere cose del computer o a ragionare e quindi va bene anche per iniziare
    – è meglio iniziare con altri linguaggi e il C solo in seguito se serve perché uno deve imparare a risolvere il problema fissato e non quelli a cui ti costringe un linguaggio come il C
    Io ho iniziato a studiare seriamente la programmazione all’università con il C eppure sono nella seconda fazione ^_^

  • # 200
    xinyiman
     scrive: 

    Io consiglio di iniziare con il pascal che è altamente propedeutico. Inoltre non è come tanti pensano, il pascal non è morto. Esiste l’object pascal con un ottimo IDE RAD che si chiama Lazarus e che a sua volta si basa sul Free Pascal. Inoltre è da poco nata una community tutta italiana al riguardo

    http://www.lazaruspascal.it

    che contiene guide, how to, esempi e persino una serie di articoli sul nintendo DS (ancora non sono tanti ma ci stiamo attrezzando per fare un corso completo). Inoltre Lazarus è multipiattaforma, opensource, gratuito. Per me è un ottimo strumento per muovere i primi passi e continuare alla grande.

  • # 201
    Carlo
     scrive: 

    ho inziato nel 1981 con basic del VIC 20 e C64 al GWBASIC e tutto il Visual BAsic fino alla 6 SP4 dove mi sono fermato facendo software anche molto complessi. Da li facilmente mi sono imparato Java, PHP e MySQL – penso ceh basti ad avanza. VB6 ance se non è NET èp cmq un buon punto di partenza, non diffcile, anceh se complesso, ma easy e fai di tutto.
    Ciao….ovviamente (io ormai della vecchia guardia) non conosco python o Ruby, probabilmente sono piu’ in su….nella prossima vita mi imparerò anche quelli. ciao ciao.
    Come dice il saggio…. “ogni cammino in questa vita anceh se difficile inizia sempre e solo con un semplice passo..” meditate.

  • # 202
    Fran (Autore del post)
     scrive: 

    Nulla e’ più fastidioso di chi conclude un commento con “meditate”. Insopportabile.

  • # 203
    marco
     scrive: 

    Io sinceramente ho iniziato il mio percorso di programmazione da C e mi sono trovato MOLTO bene.
    Il C ti insegna a ragionare in termini molto più semplici dato che le cose che puoi fare sono davvero MOLTO elementari, perciò avendo a disposizione questi pochi strumenti riesci davvero ad ingegnarti per risolvere un problema !!

  • # 204
    Salvatore Costanzo
     scrive: 

    Concordo con l’ autore. Meglio partire con Java, è orientato allo sviluppatore, e non alla macchina su cui risiede.

  • # 205
    sairos
     scrive: 

    ciao vorrei imparare a programmare e ho visto post che consigliavano java, altri pascal, e altri ancora vb.
    Quale è meglio per iniziare secondo voi?

  • # 206
    ufo.rob
     scrive: 

    @sairos
    Mi sembra un po’ inutile che tu domandi qual è il migliore quando dall’articolo e dai post è emerso che non c’è una risposta unica e ognuno ha esposto chiaramente il suo punto di vista (a volte con toni molto accesi^_^). Io ripeto, come l’autore, qualunque cosa tranne il C e C++ tranne, come ho già scritto, nel caso in cui tu abbia un obiettivo specifico. Se mi dici quanti anni hai, che scuola fai, per quale motivo vuoi imparare a programmare e di quali sistemi operativi (Windows, Linux o Mac OS X) disponi posso provare a consigliarti un linguaggio. Per il momento senza sapere altro posso solo sottoscrivere in parte il consiglio di xinyiman su FreePascal che proprio perché non è molto (mai?) utilizzato nella realtà potrebbe andare bene per iniziare indipendentemente da tutto il resto (inoltre derivando dal Pascal che è stato inventato proprio per insegnare la programmazione capisci che è adattissimo e non troppo difficile…) poi quando ti chiarirai le idee e avrai un interesse più specifico ti potrai spostare su un linguaggio più usato.
    Ripeto poi che c’è anche Python che ti permette di “vedere” i primi risultati in poco tempo e sperimentare diversi paradigmi (“modi” di programmare).
    Oppure VB .NET nella versione Express su Windows se questi due non ti van bene con l’avvertenza di non “fossilizzarti” poi solo su quello.

  • # 207
    Duccio A
     scrive: 

    Ho recentemente tradotto il celebre tutorial di Chris Pine “LearnToProgram” per imparare a programmare in Ruby partendo da zero.
    Devo dire che concordo pienamente con l’autore nel tessere le lodi di Ruby come linguaggio per finalità didattiche. Uno degli aspetti più interessanti del tutorial è come alcune cose tendano quasi a *spiegarsi da sole*. Nelle stesse parole parole dell’autore: <>

    Il tutorial lo trovate qui: http://corsorubyonrails.com/imparare-a-programmare/

  • # 208
    Alberto
     scrive: 

    E quelli della mia generazione che hanno iniziato con l’assembly prima di andare ad una scuola professionale? Dove poi ti insegnavano il pascal..ma tu i compiti in classe sia di Informatica che sistemi li facevi nella meta’ del tempo. Per poi passare al C, C++.. C#.. Php.. fare il salto alla OOP su Java.. studiarsi python e OBjC.. Un po di infarinatura di Perl e Shell scripting. Il tutto per scegliere lo strumento giusto per il problema da risolvere.
    Poi pero’ un bel giorno arrivi dopo i 40 e scopri che tanto il problema vero non e’ quello che sai e come lo fai.. ma quanto costa quello che fai. E chissenefrega se la soluzione implementata e’ un cesso e chissenefrega se il codice e’ elegante e manutenibile.
    Non e’ il mio caso.. ma ho visto troppe volte questi ragionamenti.

  • # 209
    carlo
     scrive: 

    Invece di dire stronzate!! ditemi quale kazz…. di codice imparare per prima!!il c il c+++,il java o il phyton!!!!

  • # 210
    Uno
     scrive: 

    @carlo: vai tranquillo col Java, il miglior linguaggio al mondo per imparare DAVVERO a programmare in OOP.

  • # 211
    ufo.rob
     scrive: 

    @Carlo
    Non mi sembra molto educato dire quello che hai detto quando ci sono più di 200 commenti praticamente tutti pertinenti e argomentati inoltre ripeto che non c’è una risposta sola. Comunque se ti devo consigliare per forza uno dei 4 linguaggi che hai elencato dico Python, se vuoi sapere perché rileggi bene l’articolo, i commenti dell’autore e i commenti (miei) #192 e #206
    Poi ti dico anche che parti con un approccio sbagliato parlando di “imparare il codice”, si impara un linguaggio (pensa a una lingua straniera, non basta imparare il lessico ma bisogna anche saper comporre le frasi)

  • # 212
    Fred
     scrive: 

    Ho letto tutto, e mi sembra di cadere dalle nuvole!

    “Il C ti insegna a ragionare in termini molto più semplici dato che le cose che puoi fare sono davvero MOLTO elementari, perciò avendo a disposizione questi pochi strumenti riesci davvero ad ingegnarti per risolvere un problema !!”

    Se questo discorso è vero, non c’è bisogno di dire altro per individuare il linguaggio “entry level” per “imparare a programmare”, che in definitiva vuol dire imparare ad sbatterti per far fare alla macchina quello che tu vuoi farle fare al meglio in funzione della sua logica, piuttosto che quello che altri artifizi ti offrono di farle fare in forme più o meno guidate o preconfezionate.

    Questo a casa mia vuol dire imparare: imparare a ragionare con la ferrea logica della macchina, non con la fumosa ed incerta logica spicciola dell’uomo della strada, senza offesa per la strada.

    In seguito, per quel che decidarai di fare una volta che le tue meningi si saranno aperte a queste capacità, avrai modo di decidere all’occorrenza. Tutto il resto è FUFFA!

    Come è fuffa il discorso che così iniziando si acquisisce una mentalità che fuorvia nel passare a linguaggi “più moderni” (ovvero più di moda, ad uso di chi le meningi intende preservarle).

    Abbiamo un cervello, ed allora usiamolo, perdinci, è con questo strumento che l’umanità è progredita. O no?

  • # 213
    fedefede
     scrive: 

    Quindi io che ho deciso di iniziare dal c (da autodidatta…chissà fino a dove continuerò a capirci)ho sbagliato tutto!:P

  • # 214
    Francesco
     scrive: 

    Il programmatore è il mestiere del futuro. Già adesso la domanda è altissima, l’offerta di programmatori bassissima

    a buon intenditore…..

  • # 215
    Ilario Scarpa
     scrive: 

    Per programmare un plc pixsys al tempo avevo imparato la logica Ladder. Essendo linguaggi molto specifici i corsi sono pochi, ma ultimamente sembra si stia muovendo qualcosina, anche per via telematica.

  • # 216
    Federico
     scrive: 

    Io ho scelto la facoltà di Informatica all’Università e il primo linguaggio che ti fanno imparare è proprio il c++

  • # 217
    Lariotos7
     scrive: 

    Beh ragazzi io sono nuovo nella programmazione,mio fratello che è un programmatore mi ha consigliato python ed è stupendo facile facile e ci possono fare tante cose pratiche e utili fin da subito

Scrivi un commento!

Aggiungi il commento, oppure trackback dal tuo sito.

I commenti inseriti dai lettori di AppuntiDigitali non sono oggetto di moderazione preventiva, ma solo di eventuale filtro antispam. Qualora si ravvisi un contenuto non consono (offensivo o diffamatorio) si prega di contattare l'amministrazione di Appunti Digitali all'indirizzo info@appuntidigitali.it, specificando quale sia il commento in oggetto.