Una profonda conoscenza del C ++ ti aiuterà ad apprendere altre lingue più velocemente / più facilmente? [chiuso]


9

Esiste la possibilità che qualcuno che abbia imparato tutti gli aspetti chiave del C ++ e conosca molto bene i fondamenti della lingua, imparerà altre lingue (come Python, Perl, Java) più velocemente e più facilmente?


9
Direi che C ++ è abbastanza diverso dalla maggior parte delle altre lingue per rendere più confuso raccogliere qualcos'altro (se è l'unica lingua che conosci). Molte lingue condividono la sintassi del C ++, ma poche si sono evolute nella stessa direzione. Il C ++ ha molte cruft storiche specifiche solo per il C ++. La soluzione migliore per acquisire rapidamente nuove lingue è concentrarsi sull'apprendimento di lingue diverse da paradigmi diversi. Più paradigmi diventerai familiare, più velocemente sarai in grado di raccogliere altre cose da quei paradigmi.
KChaloux,

3
Non credo che conoscere il C ++ ti dia un vantaggio nell'apprendimento di altre lingue in generale. Dipende davvero da quali altre lingue imparerai. Il mio professore di linguaggi di programmazione diceva che dovremmo concentrarci sulla comprensione dei concetti generali: questo renderà sicuramente molto più facile l'apprendimento dei singoli linguaggi.
Giorgio,

9
L'apprendimento approfondito di una lingua è un buon inizio per l'apprendimento della programmazione in generale, tranne per il fatto che potresti confondere il know-how specifico della lingua con la conoscenza generale. Il C ++ moderno è un linguaggio eccezionale, ma una volta che sei passato a un livello intermedio, trarrai enormi vantaggi dal conoscere altre prospettive - forse dai un'occhiata a OCaml e Ruby anche se non li userai mai sul serio. Una volta che sei un programmatore costante e puoi distinguere tra cose specifiche della lingua e cose generali, diventare produttivi in ​​nuove lingue diventa abbastanza facile, anche se la padronanza richiede sempre tempo.
amon

1
Rispetto a cosa? Imparare bene un'altra lingua, conoscere bene C ++ ma non profondamente, non conoscere nulla?
Telastyn,

2
Sì, ma anche il contrario. Conoscere Ocaml o Scheme rende molto più comprensibili molte nuove funzionalità di C ++ 11
Basile Starynkevitch

Risposte:


12

In termini generali

Una profonda conoscenza di qualsiasi linguaggio di programmazione è probabile che ti aiuti a imparare altre lingue più velocemente. Questo è in parte così perché la programmazione è un modo di pensare più di quanto non sia l'apprendimento della sintassi. La maggior parte delle pratiche di programmazione sarebbe vera per la maggior parte degli altri linguaggi di programmazione. Ecco perché la gente dice che impari sempre il secondo linguaggio di programmazione più velocemente del primo.

In termini specifici

Il C ++ è un linguaggio che consente un "controllo" molto maggiore rispetto ad altre lingue. Questo può essere sia buono che cattivo. Ad esempio, una vera pistola è meglio di una pistola ad aria quando vai nella foresta (perché puoi effettivamente abbattere qualcosa con essa), ma è anche più pericolosa per te e per quelli che ti circondano. C ++ ha concetti come la gestione della memoria, di cui non devi preoccuparti nella maggior parte delle altre lingue. Avere una solida conoscenza di questi concetti è tutt'altro che inutile anche quando si lavora con linguaggi di gestione automatica della memoria. Puoi anche eseguire operazioni bit per bit e scendere molto al "metal" con un linguaggio come C ++. Anche una conoscenza di base in queste aree può aiutarti molto come programmatore in qualsiasi lingua.

Opinione personale

Personalmente ho imparato Java per quasi 3 anni prima di imparare il C ++, e dovrei dire che me ne rammarico (corso uni ...). Ciò ha reso l'apprendimento del C ++ (sto ancora imparando - lungi dall'essere una conoscenza "profonda": D) non così semplice come mi piacerebbe. Se l'avessi fatto al contrario direi che sarebbe stato molto più facile per me. Soprattutto quando sai PERCHÉ qualcosa viene fatto in un modo specifico, e non solo ti assicuri dell'automagia della lingua. Se mi è permesso di esprimere un'opinione, suggerirei: C (per i paradigmi di programmazione universale e di base) -> C ++ (per la comprensione di base di OOP insieme alla gestione della memoria) -> Quindi puoi andare in qualsiasi linguaggio "reale" di OOP con un buona base oppure puoi continuare con argomenti più avanzati in C ++, tutto a seconda di ciò che


3
Sono contento che la mia università ci abbia fatto iniziare con Pascal. Quindi siamo passati a C (per la parte relativa alla gestione della memoria e alle operazioni sui bit) e infine a java for oop (sebbene questo potesse ovviamente essere stato qualsiasi altro linguaggio oo). Ad essere sincero, trovo abbastanza inquietante quante università iniziano con Java. Inevitabilmente imparerai che java (e, soprattutto, OOP) sbagli, dal momento che il vero OOP è troppo complicato per i principianti che stanno ancora lottando con la differenza tra OReAND
Lovis,

2
@Doval: Garbage Collection ti dà l'illusione di non doverti preoccupare della gestione della memoria. Basta vedere con quale frequenza i programmi a codice gestito ottengono perdite di memoria perché alcuni riferimenti sono rimasti validi in un luogo inaspettato (le raccolte sono un trasgressore perenne) per vedere quanto sia veramente illusorio.
Mason Wheeler,

1
@Doval: Dimensione, posizione, allineamento errati: come si fa esattamente una di queste cose in un linguaggio orientato agli oggetti quando la dimensione corretta è nota al compilatore e l'allocatore gestisce il posizionamento e l'allineamento? Liberarsi presto: questo è esattamente ciò che GC dovrebbe prevenire, quindi dire che non è rilevante per questa discussione non è semplicemente vero. Ma lo fa a costo di trasformare ogni allocazione in una perdita di memoria. E non bloccare i dati di altri oggetti è un problema di controllo dei limiti , non un problema di garbage collection.
Mason Wheeler,

2
Il C ++ richiede così tanto apprendimento specifico per l'implementazione del C ++, ma non verrà mai usato al di fuori del C ++ a causa delle sue infinite peculiarità, delle sue librerie e di vari sistemi. Nella mia esperienza, tutti coloro che scrivono C ++ fondamentalmente concordano sul fatto che tutto il C ++ è scritto male e pieno di stranezze e stranezze che sono per lo più specifiche del C ++. Imparare a muoversi in quel campo minato non renderà nulla di utile in altre lingue quando la maggior parte delle lingue non ha la maggior parte dei problemi che ha C ++.
Jimmy Hoffa,

2
@Doval: Sì, questo è il mio punto: queste cose sono algoritmicamente indecidibili nel caso generale , motivo per cui devono essere gestite da una persona intelligente, non un algoritmo, per essere gestite correttamente. E dire "non è una perdita, è un programma inefficiente" è solo una scissione semantica dei capelli; per un osservatore esterno, il comportamento del programma è lo stesso di un programma che perde memoria, specialmente nel contesto di sistemi multitasking in cui la compressione della memoria sotto carico può causare gravi problemi.
Mason Wheeler,

9

Sfortunatamente no. Questo in realtà è un grosso problema quando insegni il C ++ nelle lezioni di programmazione, in particolare le lezioni di livello principiante: puoi imparare i principi di programmazione o puoi imparare il linguaggio C ++, ma il linguaggio C ++ ha troppe insidie ​​e stupidi piccoli trucchi per imparare entrambi in modo efficace all'interno l'ambito di una classe di un semestre!

Ci sono molte cose che sono state provate in C ++ e alla fine sono diventate idiomatiche nel linguaggio per pura inerzia, che praticamente ogni altra lingua da quando ha guardato e respinto perché si è rivelato essere un enorme errore. I principali sono i modelli di C ++ e il modello di oggetti di C ++ (gli oggetti come tipi di valore non sono mai una buona cosa, perché interrompono la sostituzione di Liskov e mille OOP stesso).

Quindi se prima acquisisci una profonda conoscenza del C ++ e poi vuoi imparare altri linguaggi di programmazione, ci sarà un sacco di roba dannosa e controproducente che dovrai disimparare per essere efficace in altri linguaggi di programmazione.


4
Ci sono ragioni per cui Java e C # hanno un sistema di template strettamente più debole, ma è perché hanno bisogno di metadati completi su tutto. E sarei interessato a una spiegazione di come gli oggetti come valori rompono le cose. Soprattutto considerando che ci sono riferimenti ...
Deduplicatore

3
@Deduplicator: Java e C # hanno un sistema generics completamente diverso , poiché l'esperienza mostra che i template causano ogni sorta di gravi problemi, molti dei quali sorgono perché il sistema Templates non è stato ben pianificato in primo luogo. (Turing-complete per caso , per fare un ovvio esempio!) E gli oggetti come valori interrompono la sostituzione di Liskov perché se hai una classe Derivata il cui genitore è Base, e sovrascrive un metodo virtuale su Base e lo passi per impostazione predefinita passando a una funzione che accetta una base e chiama il metodo virtuale, non invocherà la versione derivata.
Mason Wheeler,

2
@MasonWheeler: Ah, ti riferisci affettare .
Fred Larson,

2
@FredLarson: avrei dovuto immaginare che un problema così diffuso e pernicioso avrebbe avuto un nome specifico. (E, trattandosi di C ++, un nome sciocco in questo. Quando un programmatore al di fuori del mondo C ++ sente "slicing", probabilmente penserà al taglio di array !: P
Mason Wheeler,

4
Anche se sono d'accordo con molte cose che hai scritto, penso che tu abbia un punto di vista molto parziale ;-) L'IMHO che impara il C ++ non rende le persone più stupide.
Doc Brown,

8

No. Conoscere bene il C ++ renderà più facile l'apprendimento di altre lingue come il C ++. Ma sarebbe noioso. Perché vorresti conoscere due lingue uguali? Questo non ti compra nulla. (Nota che questo non è specifico per il C ++. Si applica a qualsiasi lingua. Confronta con le lingue naturali: imparare l'italiano non renderà più facile l'apprendimento di altre lingue. Semplificherà l'apprendimento dello spagnolo, del francese o del portoghese e l'apprendimento di tre di questi renderà più facile l'apprendimento della quarta, ma anche l'apprendimento di tutte le lingue romanze non ti aiuterà a imparare un po 'finlandese, cinese, hindi, ebraico, arabo, pashtu, greco, ecc.)

I linguaggi di programmazione implementano paradigmi. Peter van Roy ha raccolto un poster dei 34 principali paradigmi di programmazione .

I paradigmi, a loro volta, sono composti da concetti. Quel poster elenca circa 18 concetti.

Tutti i paradigmi (o almeno quelli nel poster) sono composti da quei concetti. Tutte le lingue implementano uno o più paradigmi composti da tali concetti. Quindi, se impari quei concetti, imparerai (in un certo senso) tutti i linguaggi di programmazione contemporaneamente.

Naturalmente ci sono ancora molte stranezze specifiche per la lingua (sintassi tra loro). Inoltre, quel poster ignora completamente la digitazione, e c'è ovviamente una differenza significativa tra un sistema di tipo System F <: ω , un sistema di tipo Scala o un sistema di tipo dinamico duck duck, per non parlare di un sistema di tipo dipendente à la Idris, Agda, Coq, Guru o ATS.


Hindi , non indù . Nulla ti aiuterà a "imparare gli indù", figuriamoci l'italiano o il C ++ ;-) +1.
PKG

In realtà, l'apprendimento di lingue diverse, anche se molto simili, allarga ancora la tua mente e ti aiuta quindi leggermente per le lingue più lontane.
coloranti

Dovrei essere in disaccordo con il confronto con i linguaggi naturali poiché il C ++ è un linguaggio multi-paradigma a differenza dei linguaggi naturali. Inoltre, imparando in dettaglio una funzionalità linguistica, conosceresti le decisioni di progettazione per quella funzionalità e molto probabilmente comprenderesti i pro e i contro di altre implementazioni. Ad esempio, prova ad apprendere approfonditamente i modelli di c ++ senza apprenderne i vantaggi e gli svantaggi rispetto ai generici dinamici. Anche se non ti imbatti in alcuna menzione di C # (difficile al giorno d'oggi), sapresti comunque cosa sono i generici dinamici e immediatamente conoscere le limitazioni dei generici C # quando ne apprendi dopo
Rado,

5

Direi che conoscere profondamente qualsiasi linguaggio di programmazione aiuterà a imparare gli altri, almeno altre lingue nella stessa famiglia. Ad esempio, la conoscenza del C ++ non aiuterà molto con LISP o Haskell, ma per i linguaggi procedurali orientati agli oggetti, lo farà. Il mio approccio è stato quello di cercare di imparare una lingua da ciascuna delle diverse famiglie (procedurali, funzionali, orientate agli oggetti, ecc.) Delle lingue, quindi quella conoscenza può essere trasferita in altre lingue di quella famiglia. D'altra parte, una profonda conoscenza di APL non aiuterà con nient'altro ...


3
Ho visto come appare il codice Self o Smalltalk o Ruby scritto da qualcuno che ha imparato il C ++ come prima lingua. In realtà direi che conoscere il C ++ è piuttosto dannoso per l'apprendimento di OO. Penso che Self o Newspeak sarebbero molto più adatti a questo. A proposito, una profonda conoscenza di APL aiuterà almeno con linguaggi come J e K. Aiuterà anche a pensare a astrazioni di raccolta di livello superiore e liftig, che probabilmente aiuteranno con MapReduce o alla programmazione in stile Hadoop, e anche a pensare a Functors , Applicativi, Monadi e Categorie.
Jörg W Mittag

1
@ JörgWMittag: è risaputo che si può scrivere COBOL in qualsiasi lingua ... qual è il punto?
Deduplicatore

@Deduplicator Se la tua prima lingua è COBOL, hai molte più probabilità di scrivere COBOL in altre lingue.
Doval,

In realtà, sono d'accordo con la cosa COBOL. Avevo un ragazzo che lavorava per me anni fa che ha scritto COBOL in Pascal ...
Jim Nutt

5

Prenderò un'interpretazione diversa qui.

Il C ++ è un buon linguaggio per l'apprendimento della memoria e delle strutture di dati, poiché ti costringe a pensare attentamente a concetti come la proprietà dell'oggetto e la durata della vita. E conoscere le strutture di memoria e dati è una delle parti essenziali di qualsiasi curriculum di ingegneria del software.

Ma devi conoscere le strutture di dati. Se semplicemente "impari il C ++", non otterrai molto, e potrebbe rallentare il processo di apprendimento di altre lingue nel breve periodo.

Quando ero al college, Data Structures era un corso richiesto a livello di matricola, seguito da CS1 (che almeno metà della classe aveva posto fuori). Era difficile. Il formato del corso era sostanzialmente "Ecco una struttura di dati che non hai mai visto prima [ad esempio un heap di sinistra ]. Implementalo in C ++ in una settimana e fai in modo che il tuo output corrisponda esattamente al nostro output previsto, byte per byte, quindi noi può classificarlo automaticamente. " Quindi, la prossima settimana otterrai una nuova struttura di dati e un nuovo incarico. Probabilmente ho imparato di più in quel corso rispetto a tutti gli altri corsi messi insieme.

Questo è il tipo di apprendimento che devi fare affinché C ++ sia prezioso.


2

Ogni lingua che impari rende più facile l'apprendimento della prossima, specialmente all'interno dello stesso paradigma. Si indebitano pesantemente l'uno dall'altro, e dopo un po 'si arriva al punto in cui una nuova lingua sembra semplicemente una raccolta di funzionalità di altre lingue, con alcuni colpi di scena unici.

Non credo che il C ++ sia migliore o peggiore di qualsiasi altro linguaggio in questo senso. È una delle lingue più prolisse che conosco e rende difficili alcune cose che sono facili nella maggior parte delle altre lingue, ma ciò non si traduce necessariamente in una lingua più facile da imparare . In genere, tuttavia, rende la lingua successiva più facile da usare . C'è una differenza


0

No. Una conoscenza approfondita di C , o del sottoinsieme di C ++ che è "fondamentalmente C", aiuterà durante l'apprendimento di altre lingue, almeno quando si immagina cosa devono fare le loro implementazioni. Una profonda conoscenza del C ++ , d'altra parte, sarà principalmente un'informazione confusa o irrilevante nell'apprendimento di altre lingue; se impari l'orientamento agli oggetti di C ++ a più di un livello di superficie, ad esempio, quando passi a Perl / Python / Ruby, trascorri più tempo a imparare ciò che sai che a usarlo, poiché gli oggetti in quelle lingue sono implementati in un modo completamente diversoche in C ++. La stessa cosa è vera in misura maggiore o minore per la maggior parte delle altre lingue e per le altre funzionalità linguistiche (ad esempio, i modelli C ++ e il polimorfismo di Haskell sono sostanzialmente la stessa funzionalità, con, di nuovo, implementazioni completamente diverse). Quindi la conoscenza approfondita del C ++ sarà principalmente specifica per il C ++.


questo post è piuttosto difficile da leggere (wall of text). Ti dispiacerebbe modificarlo in una forma migliore?
moscerino del
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.