it-swarm.it

Il C ++ è adatto come prima lingua?

Un college locale insegna C++ agli studenti del primo anno (16 anni) senza alcuna esperienza di programmazione.

Come primo linguaggio di programmazione, è C++ adatto?

26
Ed James

Enfaticamente No .

Per qualsiasi obiettivo che hai in mente per gli studenti, un'altra lingua o sequenza di lingue sarebbe più veloce e migliore. esempi.

"Gli studenti devono comprendere concetti di basso livello."

La codifica "di basso livello" non consiste nel recuperare oggetti da new, restituirli a delete e, occasionalmente, avere un puntatore che punta da qualche parte non dovrebbe. Funzioni, classi e modelli non sono di basso livello. RAII, 12 modi per usare const, std::ostream::operator<<, protected e new non sono concetti di basso livello. Queste cose hanno implicazioni di basso livello e le stai saltando per mesi o fino a una lezione futura e insegnando invece montagne di semantica C++.

Suggerisco assemblatore con un buon ambiente e materiale didattico come MIPS o MMIX. Se hai fretta, insegna a C con le deviazioni a guardare almeno l'output dell'assemblatore. Questo ti darà tutta la comprensione di basso livello che fa C++, e poi alcuni, più veloce.

"Gli studenti devono comprendere l'orientamento agli oggetti."

L'orientamento agli oggetti incorporato in C++ è troppo complicato per l'insegnamento OO, o quasi qualsiasi altro concetto di alto livello. Vedi Le domande frequenti su C++ per una lista lunga e piacevole di potenziali motivi per cui. O devi colpire tutta quella roba, che richiederà molto, molto tempo con i nuovi programmatori, oppure devi saltarne molti, lasciando i nuovi programmatori al buio - in modo efficace, non conoscendo davvero il C++!

Suggerisco di imparare prima un linguaggio semplice e di alto livello con oggetti (Python, Ruby, Squeak, Common LISP, Racket), se è necessario insegnare C++. Oltre a ciò, impara il polimorfismo come un concetto separato da OO visitando un linguaggio funzionale.

"Gli studenti devono comprendere i modelli e la metaprogrammazione dei modelli."

Nessuno lo chiede davvero, ma vorrei che lo facessero. C++ ha dei bei modelli e STL è interessante, ma non dovrebbero essere una priorità abbastanza alta per insegnare prima il C++. Insegnare il sistema di tipo OCaml o Haskell e poi adeguare quei concetti potrebbe essere comunque più veloce.

"Gli studenti devono imparare a risolvere i problemi."

Sì, lo ottieni in qualsiasi lingua e ne ottieni di più se in quasi tutte le lingue oltre al C++ perché c'è molto meno bagaglio. Ancora una volta, vedi Domande frequenti su C++ per un elenco di tutte le cose che gli studenti impareranno invece delle abilità di risoluzione dei problemi.

"Tutto quanto sopra, e dobbiamo usare solo una lingua." o "I datori di lavoro lo vogliono." o "Abbiamo bisogno di un linguaggio in stile C." o ...

Insegna più di una lingua.

L'idea di risparmiare tempo o energia insegnando o imparando una sola lingua è decisamente ridicola. Si basa sull'idea che l'apprendimento di una determinata lingua richiede esattamente X mesi uomo ( SUGGERIMENTO! SUGGERIMENTO! ) in cui X è un singolo numero o un numero per lingua. Questo è quasi identico all'idea che è possibile risparmiare tempo e denaro saltando tutti quei "requisiti" e "test" della spazzatura.

Per quanto riguarda le sintassi multiple, paralizzi pericolosamente gli studenti se insegni loro ad aspettarsi la sintassi C in ogni lingua rendendoli fortemente distorti rispetto ad altre lingue.

Quasi ogni percorso è più veloce e migliore che iniziare con C++. Imparare un linguaggio di alto livello semplice e quindi C++ sarebbe più veloce. L'apprendimento dell'assemblatore e quindi del C++ sarebbe più veloce. Qualsiasi cosa diversa dal C++ porterà gli studenti lì più velocemente e sapranno molto di più per l'avvio. Basta non insegnare prima C++.

61
Jesse Millikan

No, il C++ è un linguaggio difficile anche per gli sviluppatori C++ esperti. Anche per gli algoritmi più semplici devi spiegare molte delle sottigliezze del linguaggio. Prendi in considerazione un esempio di Hello World:

#include <iostream>

int main()
{
  std::cout << "Hello World!" << std::endl;
}

Cos'è quello #include comando? Che cos'è std::cout. Perché il ::? Cosa è <<? Ohhh, è un operatore sovraccarico! Cos'è un operatore sovraccarico? Quindi, per ints, fa un po 'di spostamento, ma per qualunque std::cout è, genera roba sulla console. Ohhh, std::cout è un flusso e i flussi hanno il loro << e >> operatore sovraccarico.

Vediamo lo stesso esempio in Python:

print("Hello World!")

Ecco fatto, andiamo a programmare alcuni algoritmi.

54
Marco Mustapic

Probabilmente non è un buon primo linguaggio: sintassi complessa, molte regole, vecchio linguaggio, gestione della memoria soggetta a errori. Meglio insegnare ai tuoi studenti qualcosa di più OO come Smalltalk, o qualcosa di più bello da programmare come Python o qualcosa di funzionale come Haskell.

Possono imparare il C++ più avanti nella vita (se non possono farne a meno), dopo aver imparato lingue migliori.

21
Andres F.

Risposta breve: Sì!

Direi che any language è un inizio adatto ma soprattutto C++ (o equivalente). In questi giorni C # e Java sono i principali linguaggi in uso e in programmazione con questi si impara rapidamente ad appoggiarsi alle API e agli IDE ma con C++ si ha la possibilità di imparare la programmazione da zero, comprese le prestazioni ottimizzazione, ecc.

Non è mai una cattiva idea imparare le basi della programmazione, del looping e dell'ordinamento prima di fare affidamento cieco su un linguaggio incorporato in .Sort ();

18
Mantisen

In realtà credo che probabilmente sia una buona scelta come prima lingua per un motivo molto pratico: dopo aver appreso il C++ qualsiasi altra lingua che incontri sembrerà un gioco da ragazzi imparare.

14
ennuikiller

Mi sono insegnato C++ quando avevo 15-16 anni.

È meglio lasciare la magia agli altri e imparare da soli il funzionamento interiore delle cose.


In parole povere, se non riesci a capire la sintassi e la semantica C++ entry-level, non sei così bravo con i computer. Non è così difficile. Non ci sono buoni motivi per evitare "C with Classes".

Se ti aspetti che gli studenti inizino a lavorare sulla metaprogrammazione dei modelli, deducendo le chiamate polimorfiche e districando le gerarchie ereditarie multiple, è ridicolo per una classe entry level per qualunque tipo di linguaggio tu usi.

C'è una pessima tendenza a voler nascondere la complessità della programmazione per gli studenti. Ciò non finisce bene (cfr. Spolsky Java Saggio sulle scuole). Quelle persone finiscono sul DailyWTF se non riescono a capire bene. Perdite di astrazione e quando (non se) l'astrazione perdite, che è peggio che doverlo affrontare. Ho lavorato come TA per gli studenti C++ entry level. O le cose devono essere nascoste fino in fondo, oppure devono essere portate alla luce da esaminare. La magia è nemica del discente.

Se dovessi raccomandare un linguaggio iniziale compilato in codice macchina, una variante Pascal sarebbe probabilmente l'approccio migliore. Ha un approccio più regolare e strutturato rispetto alla famiglia C da quello che ricordo.

10
Paul Nathan

No.

Come linguaggio di insegnamento, C++ è solo leggermente migliore di C, che è una delle peggiori lingue di insegnamento in circolazione. Presenta molta complessità in anticipo, alcune parti del linguaggio sono profondamente non intuitive e la maggior parte delle volte impari di più sul C++ che sulla programmazione in generale.

Questo non vuol dire che C++ (o C) siano lingue cattive o che non valga la pena imparare; solo che ci sono migliori lingue di insegnamento disponibili, come Python.

8
John Bode

Direi "no": avevo l'entusiasmo e il desiderio di imparare la programmazione e sono andato subito al mio anno di introduzione al college con il C++ subito. Insieme a un insegnante che insegnava C++ come se fosse un'altra lingua (concetti che avevano senso per loro, non necessariamente concetti della lingua o dell'applicazione del mondo reale) e progetti lanciati a noi immediatamente ogni settimana, mi sono schiantato e bruciato insieme metà della classe. Quando riuscii persino a digerire, sperimentare e applicare ciò che mi veniva insegnato, feci fatica a fare i compiti del progetto, che raddoppiò come test. Direi che era più un corso di livello 200 che 100.

Ho davvero fatto del mio meglio. Non ho chiesto simpatia, sapevo che sarebbe stata una sfida, ma l'insegnante non mi avrebbe nemmeno aiutato. Mi ha appena detto di andare a leggere il libro di testo, come avevo fatto io.

Direi (e alcuni non sarebbero d'accordo) che Ruby o Python è un linguaggio molto migliore per irrompere qualcuno nel mondo della programmazione. Pulito, conciso, leggibile , sintassi più chiara.

8
Kevin

Esistono due tipi essenziali di istruzione post-secondaria: l'università e la scuola professionale. La differenza è in ciò che vuoi essere pronto a fare dopo la laurea. Nel settore automobilistico, è che tu sia un meccanico o un ingegnere meccanico.

Detto questo, il C++ è un ottimo primo linguaggio se vuoi essere un ingegnere, e uno schifoso se vuoi essere l'equivalente di programmazione di un meccanico.

Una classe introduttiva su C++ impiegherà molto tempo a parlare di tipi di dati, definizioni, dichiarazioni, puntatori, allocazione della memoria e così via. Queste sono un'ottima base se intendi trascorrere diversi semestri costruendo per essere in grado di fare qualcosa di utile, ma vuoi sapere che una volta arrivato lì hai le basi per gestire qualsiasi grado di complessità.

D'altra parte, se vuoi essere in grado di fare qualcosa di utile più rapidamente, ma non preoccuparti se il dominio e la complessità sono limitati, passare tutto quel tempo su quei concetti di livello inferiore sarà uno spreco. Ci sono molti programmatori che sanno scrivere un validatore di moduli html, ma non hanno idea di come affrontare la progettazione di un driver di dispositivo.

7
Karl Bielefeldt

Sicuro. Il mio primo linguaggio era il C, ma era davvero solo per facilitare la nostra classe in C++. Ha reso Java molto più facile da gestire una volta arrivato all'università. Il C++ potrebbe avere una curva di apprendimento leggermente più ripida, ma se viene insegnato correttamente dovrebbe andare bene.

No, il C++ non è adatto come prima lingua. Come mostrato qui, molti programmatori professionisti condividono questa opinione, ma questa è anche un'opinione che hanno gli insegnanti professionisti.

Ecco cosa ha da dire un rapporto del decano della Carnegie Mellon University sull'uso del C++ per un corso introduttivo alla programmazione per matricole:

Linguaggi standard come C o C++ non sono adatti a questo corso perché la loro complessità e carenze impediscono tecniche di ragionamento sia informali che meccanizzate.

CMU offre due corsi introduttivi, uno imperativo e uno funzionale. SML è stato scelto per la programmazione funzionale. Non so cosa sia stato scelto per il corso imperativo, ma il rapporto menziona l'uso di un sottoinsieme di C.

4
Joh

No. Assolutamente no.

Se potessi fare a modo mio, non consentirei l'utilizzo in un ambiente accademico quasi interamente. Non per ragioni contrarie a quelle già fatte, ma perché troppi pensano che C++ (o variazioni) sia la risposta a quasi tutti i problemi perché è possibile utilizzarlo in quasi tutte le situazioni. È il cacciavite della programmazione.

Alcune persone lo usano per stringere le viti, uno strumento perfettamente ragionevole per il lavoro. Altri lo usano come un prybar, mentre spesso sono efficaci, non proprio ideali perché un cacciavite, non importa cosa tuo padre potrebbe dirti, non è un prybar e potrebbe fallire catastroficamente a causa di un uso improprio perché la composizione del gambo non è intenzionalmente costruita per il tipo di forze che un prybar incontrerebbe. Altri ancora potrebbero provare ad usarlo come un pugno o uno scalpello, e quasi sempre incontreranno problemi perché l'impugnatura del cacciavite non è stata costruita per il tipo di abuso che il punch o uno scalpello è progettato per resistere.

A mio avviso, il compito di un programmatore è di tradurre in genere problemi reali in automazione che fornisce un certo grado di miglioramento dell'efficienza (riduzione dell'impegno delle risorse in un'attività), velocità (riduzione del tempo necessario per eseguire un'attività), prevedibilità (aumento della ripetibilità di un'attività) o organizzazione (aumentare la consapevolezza della relazione tra attività).

Sebbene sia comprensibile che chiunque programmi abbia una conoscenza comune delle operazioni a basso livello dei computer, e in particolare device IO e allocazione della memoria, è sicuramente raro dover realmente utilizzare tale conoscenza per qualsiasi grado significativo, figuriamoci sfruttarlo per la stragrande maggioranza dei compiti. Il tentativo di farlo senza comprendere il contesto più ampio del problema inserisce un rischio incessante in uno sforzo.

È assurdo che un primo linguaggio di programmazione dovrebbe essere C/C++ o varianti simili, poiché la classe di problemi che C e i suoi derivati ​​risolvono non sono certamente adeguati per una percentuale arbitrariamente grande dei problemi attuali e futuri (tranne dove si deve salvare un programma precedentemente avvitato), e in effetti è più che altro un insieme minuscolo di problemi futuri. La maggior parte dei programmatori non si avvicinerà mai allo sviluppo delle funzionalità del sistema operativo principale o delle interfacce dirette dei dispositivi, nonostante la crescente prevalenza di piccoli dispositivi mobili e interconnessi. La maggior parte funzionerà e vivrà come abbiamo fatto noi. Correzione e eliminazione graduale del codice che ha più di due generazioni, implementazione sulla tecnologia che sta già mostrando età o che lavora ai margini della tecnologia sull'app killer (x + 1).

Per una prima lingua, guarderei Lego NXT, una variante leggera ma ricca di funzionalità di LabView. Sebbene Lego NXT non sia ampiamente utilizzato nelle iniziative commerciali, presenterà la natura fondamentale di ciò che deve essere programmato in modo "ricco di sensori". Potrei abbinarlo a un linguaggio di scripting piuttosto neutro come piattaforma come Javascript o TCL/TK. Entrambi avrebbero un impatto relativamente basso in termini di ciò che devi scoprire per svolgere compiti molto semplici ma efficaci, con un elevato ritorno in termini di ciclo di feedback e flessibilità per introdurre e risolvere vari gradi di complessità del problema. Inoltre, offre agli studenti una buona opportunità mentre avanzano per esplorare il potenziale per superare ciò che viene fornito nell'ambiente in scatola: un'opportunità per provare a lavorare nei luoghi bui, umidi e di basso livello del dispositivo IO e driver personalizzati con un piccolo sovraccarico.

Dopo aver imparato a guidare il quattro cilindri automatico, quindi aumentali nel grande hotrod manuale v8, se sono davvero interessati e motivati. Se Joel non riesce a trovare i programmatori delle rock star sotto una pietra sotto i suoi piedi, potrebbe semplicemente continuare a cercare altrove o ripensare al motivo per cui potrebbe aver bisogno di più di un gruppo di cacciaviti nella sua cassetta degli attrezzi.

2
JustinC

Sicuro. Esistono altre lingue che potrebbero essere più facili da comprendere per gli studenti del primo anno. Tuttavia, ci sono modi in cui un insegnante potrebbe lentamente introdurre concetti in C++.

2
jzd

Sicuramente C++ può essere la prima lingua. Ma riguarda quanto bene viene insegnato.

Tutti dicono, la prima lingua dovrebbe essere molto facile da capire. Ma il mio punto è che la maggior parte delle persone inizia a programmare a livello universitario. Quindi, puoi insegnare qualcosa che sono in grado di cogliere. E con C++, puoi passare da un livello inferiore a un livello più alto di programmazione.

2
Gulshan

Quando ero al college, il C++ era il linguaggio di base che veniva insegnato durante il primo anno di college. La teoria era che conteneva alcuni concetti di programmazione complessi, quindi se si poteva padroneggiarlo, si potevano prendere altre lingue. Mi è servito bene come una buona base.

Detto questo, durante il mio ultimo anno, ho fatto parte di un comitato per determinare se passare o meno il linguaggio principale a Java. Dopo aver parlato con alcuni importanti datori di lavoro e alcuni ex-alunni del dipartimento, è stato stabilito che il passaggio a Java era il miglior interesse degli studenti. I datori di lavoro con cui abbiamo parlato volevano che le persone avessero esperienza in un linguaggio che stavano usando per assumerli. Credo che, 10 anni dopo, stiano ancora usando Java come linguaggio principale.

Allo stesso modo, abbiamo cercato di assumere un paio di neolaureati con ottime competenze in C++. Non siamo riusciti a trovarne.

1
SchwartzE

Direi di si. Ma qualsiasi lingua può davvero essere una prima lingua. Penso che C++ sia buono perché mentre è complesso e talvolta difficile, ti mostra cosa puoi veramente fare (meno limiti). Inoltre, ha un design orientato agli oggetti che può aiutarti a prepararti ad affrontare altre lingue.

Il C++ è stato il mio primo linguaggio e sono contento che lo sia stato. Mi ha fatto pensare nella mentalità OOP all'inizio e ne sono grato. Ma alla fine, si riduce davvero a quello che vuoi fare. La lingua non importa come molto perché se riesci a capire bene una lingua, è probabile che non avrai problemi a sceglierne un'altra. Che cosa vuoi fare? Creare giochi? Programma per telefoni cellulari? Ognuno avrà strumenti e lingue più adatti per questo.

1
user16281

C++ è un linguaggio esperto, non principiante ... direi prima C, non Java o C # o Python ... perché? Perché C ti insegna a prenderti cura della tua memoria e di alcuni concetti complicati come puntatori che sono "nascosti" da tutte le lingue ma che sono presenti ovunque. Ho visto così tanti giovani sviluppatori che non capiscono nemmeno perché la memoria dovrebbe essere rilasciata a volte e credono che il garbage collector non sia un po 'nano che pulisce tutti i craps codificanti: istanziano, istanziano e boom esplode anche se hanno una RAM XXXXGb ... Ma non capiscono perché il garbage collector non stia semplicemente pulendo magicamente tutto! E ho visto questo tipo di sviluppatori codificare C++ (e anche più folle, a Corba) ed è stato un massacro !!!!!!!!!! Quindi consiglierei di imparare il codice in C e poi andare su Python/Java/C # per i concetti di oggetti e tutto lo zucchero intorno Quindi quando capisci tutto ciò, vai al C++ e senti la potenza del C++ ma scopri anche tutti i suoi pericoli e perché non dovrebbe essere usato da nessuno;)

1
mandubian

Alcuni dei punti in cui i principianti commettono facilmente errori in C++ sono:

fare incarichi dove volevi testare = vs ==

Mancante;

Leggibilità delle parentesi graffe rispetto ad esempio all'inizio-fine di Pascal

E poi ci sono tutti i file include, le macro, la gestione della memoria ecc. Da confondere.

Quindi direi che C++ non è il linguaggio migliore per iniziare, tuttavia non c'è dubbio che può essere molto utile quando l'hai imparato.

Vorrei - come anche altri hanno suggerito - usare C #, Java o forse anche VB - e un buon IDE con sintassi evidenziare, debugger ecc. per facilitare il recupero da errori.

1
Rune Andersen

NO. Ci sono così tante cose che ha C++, che rende difficile per un principiante capire. Non entrare nel fallacie "tutti i linguaggi di programmazione sono uguali".

Inizia con Basic o Pascal, (ignora le cose "sono deprecate") e, successivamente, con C/C++/Java/C #/Perl. O se ne hai la possibilità, prima con Logo & Karel e poi Basic o Pascal.

P.D. Alcune università e college hanno un corso di utilizzo e confronto del linguaggio di programmazione, e succede che avevo tenuto quel corso ;-)

1
umlcat

Ho iniziato con il C++ nella scuola media. Ho preso una copia di questo libro: C++ Come programmare da Deitel e Deitel . Questo libro è abbastanza buono.

Francamente non c'è una risposta giusta o sbagliata qui, ho scoperto personalmente che il C++ era comprensibile. L'ho imparato fino a OOP (mi sono inciampato in "questo" che ora non capisco come non riuscivo a ottenere ma qualunque cosa). Provalo, non farlo scoraggiarti. Se rimani bloccato, controlla altre lingue e continua ad apprenderne di nuove. L'idea è che vedendo lo stesso concetto in 2-3 forme diverse li capirai meglio. Come ho detto, il concetto di "questo "Il puntatore mi ha confuso, ma quando ho visto la stessa cosa in Python (invece si chiamava sé), aveva subito senso per me perché l'avevo capito in C++. Impara Java se puoi insegnare quante più università. Impara python o Ruby poiché è la lingua del giorno e se puoi esplorare più nicchia/nuove cose come Clojure (e tutte le altre lisps), Haskell, Scala ...

0
nkassis

Se "adatto" sta per "possibile", sì. Se per "buono", sicuramente no.

È possibile amare, anche amare il C++, ma per questo è meglio imparare diverse lingue e lavorare per qualche decennio con basi di codice marce e verde acqua, fare esperienza sulla "creazione di software non banale che funziona effettivamente" - quindi il C++ avrà fascino.

Non all'inizio quando sei vergine, giocherellare con piccoli, semplici (ma presumibilmente interessanti e divertenti) problemi.

Vorrei iniziare con Python, seguito da SICP (schema) o qualcosa di simile. Forse invertito o intercalato. Con quelli puoi semplicemente andare e affrontare il problema. Invece di combattere il sistema, camminare nel fango profondo e imparare tutti i tipi di stranezze illogiche e le loro ragioni storiche.

Più tardi, quando puoi già programmare l'uscita da un sacchetto di carta, passa al metallo nudo: impara le modalità di assemblaggio e diverse architetture, più forse Knuth's Mix. Non intendo memorizzare codici operativi o fare molte cose reali, solo per capire memoria, registri, ALU, cache, interruzioni e passare al livello di lettura.

Quindi con quella base puoi essere esposto ad altre lingue, incluso C++. Forse una buona idea per aggiungere un po 'di "storia ed evoluzione delle lingue" nel mezzo.

0
Balog Pal

Puoi scegliere qualsiasi lingua per apprendere le basi della programmazione. Ho imparato cose in C/C++. ma 7 anni dopo, gli strumenti/le lingue sono cambiati nella mia scuola e preferiscono Java/C #. le lingue sono semplici strumenti. Ciò di cui hai bisogno per migliorare sono i fondamenti. per esempio. in MIT le persone apprendono i fondamenti dell'algoritmo usando python. ad es. Java può essere buono per la programmazione web. ma C/C++ sono buoni per servizi e applicazioni ad alte prestazioni. Quindi dipende dalle tue situazioni.

0
sarat