Passa da Java a c++


Ho sviluppato applicazioni basate su c# (. net) e Java (J2EE) negli ultimi 3 anni.

Ma ora sento, Java, C# ti rende zoppo (dal punto di vista dell'apprendimento) e puoi sviluppare rapidamente le tue app ma non riesci a capire i concetti di base della programmazione.

Quindi, sto cercando di imparare il C++, ma lo trovo un po ' "confuso" a causa del puntatore, dell'ereditarietà multipla, di alcune convenzioni e di altri concetti di C++ che non esistono in Java. Allora, cosa fate ragazzi suggerire? Come dovrei sentirmi?

Grazie

PS: Io sono uno studente, in modo da avere tutto il tempo del mondo e in realtà spostare.

Author: Ispirer SQLWays Migrations, 2010-04-05

16 answers

A mio parere, dovresti prima imparare il C per capire correttamente la base su cui è costruito il C++. Prendi una copia di" The C Programming Language " di Kernighan e Ritchie, ampiamente considerato il miglior riferimento sul linguaggio, e inizia a leggerlo. Una volta compreso pienamente C, avrai la base di basso livello di cui hai bisogno.

 11
Author: avpx, 2010-04-04 22:36:34

C++ non è più "base e sottostante" di qualsiasi altro linguaggio di programmazione moderno. Ha un modello di un computer (uno spazio di indirizzi di memoria piatto), ma il sistema operativo e la CPU simulano semplicemente quel modello usando molti livelli di caching e paging, quindi non è "reale". Il risultato è che la stessa operazione può talvolta richiedere 1000 volte più tempo per essere completata rispetto ad altre volte.

Anche il moderno C++ ha molte astrazioni potenti che non hanno più una relazione diretta con il funzionamento di un computer di fai le astrazioni fornite in Java e C#. L'OP menziona l'ereditarietà multipla-chiaramente non più elementare dell'ereditarietà in altre lingue OO. Molte altre caratteristiche del C++ omesse da Java sono astrazioni di alto livello (o consentono di costruirle) e quindi in qualche modo Java è il linguaggio più di basso livello. In Java il significato dei simboli dell'operatore è sempre lo stesso, mentre in C++ un semplice == potrebbe costruire un oggetto che verrà successivamente utilizzato per generare un'espressione SQL invece di essere eseguito in-process.

I runtime JVM e CLR sono (quasi certamente) scritti in C e/o C++, quindi in questo senso ovviamente capita di formare livelli oggi. Ma al livello C / C++ continuerai a lavorare in un'astrazione che non è "come funziona davvero la macchina", quindi imparerai davvero un diverso insieme di astrazioni, piuttosto che "realtà". E un sistema operativo (o addirittura un chip hardware) può essere progettato specificamente in modo che JVM o CLR come runtime siano il livello nativo di basso livello del sistema; su un tale sistema sarebbe il runtime C / C++ che richiederebbe un livello di emulazione "di alto livello" (costoso) per funzionare.

Quindi probabilmente non vale la pena provare a imparare come programmare in "realtà". Nessuno lo fa davvero in questi giorni; è una perdita di tempo. Stai meglio imparando come le astrazioni di programmazione ti aiutano a scrivere programmi corretti. Se una lingua ti rende la vita difficile, questo non dimostra che stai facendo la "cosa reale". Significa solo te ho scelto la lingua sbagliata per quello che stai cercando di fare.

 9
Author: Daniel Earwicker, 2010-04-04 23:27:48

Non sono d'accordo con il sentimento che devi prima imparare il linguaggio C o assembly. C++ e C possono essere simili in teoria, ma sono molto diversi in termini di utilizzo pratico. Si guadagna poco o nulla in termini di idiomi C++ usando solo C, e mentre è bene avere esperienza pratica in più lingue, è un esercizio di futilità specificare i prerequisiti nell'apprendimento delle lingue. Penso che il modo migliore per imparare i concetti di programmazione è quello di sedersi con qualcuno che capisce loro bene e solo parlarne, sia che su StackOverflow, nei forum, o, se siete fortunati, di persona.

Alla fine della giornata, penso che la programmazione non sia poi così difficile, e potresti aver bisogno di qualcuno che lo spieghi bene solo una volta per fare clic su tutto. Si tratta di rielaborare gli stessi concetti semplici più e più volte per costruire macchine complesse e belle.

 5
Author: Jon Purdy, 2010-04-04 23:03:59

Per imparare il c++ consiglio di leggere il C++ per i programmatori Java di Mark Allen Weiss. Mi ha aiutato molto quando mi sono trasferito da Java a C++ in quanto è molto bravo a evidenziare le differenze tra le lingue.

 3
Author: SiPe, 2010-04-05 07:31:32

Ma, ora sento, Java, C# ti rende zoppo (dal punto di vista dell'apprendimento) e puoi sviluppare rapidamente le tue app ma non riesci a capire i concetti di base della programmazione.

Se stai cercando di imparare i concetti di programmazione, piuttosto che l'architettura della macchina, non c'è molto beneficio nell'apprendimento del C++. Suggerirei di andare con qualcosa di diverso da Java tutti insieme. Una variante Lisp, forse.

Come progettare programmi è una bella bel libro.

 2
Author: Dennis Zickefoose, 2010-04-05 00:17:02

Se vuoi capire i concetti alla base della programmazione lingue, suggerirei un libro come Concetti di John Mitchell nei linguaggi di programmazione. Segui questo scrivendo alcuni parser / interpreti per linguaggi semplici. Un'altra buona risorsa è SICP, che è specifico per Scheme (un dialetto LISP), e disponibile per intero qui. Una volta che hai imparato alcune lingue, non ci vuole troppo tempo per raccogliere la sintassi e la semantica di una nuova (le librerie principali d'altra parte, può richiedere un po ' di tempo per essere familiarizzato con).

Se vuoi sapere come funzionano i computer di oggi, ti consiglio di imparare C e leggere libri come i moderni sistemi operativi di Tanenbaum. C è utile in questo contesto soprattutto per la lettura di codice a livello di sistemi. Implementare un (molto) semplice sistema operativo può essere incredibilmente educativo. Tuttavia, qualcosa di semplice come l'implementazione di una shell di base (come bourne shell, tranne simpler) è probabilmente un posto migliore per Inizia. Consiglierei anche di imparare come funziona il networking in modo specifico, dal momento che è una parte integrante dei moderni sistemi informatici.

 1
Author: Andreas, 2010-04-04 23:16:18

C e C++ rendono alcuni concetti di programmazione di base più evidenti, ma non sono stati progettati da Dio. Secondo il suggerimento di studiare i sistemi di basso livello effettivi dietro il codice di basso livello: sistemi operativi, compilatori/runtime (prova "Essentials of Programming Languages") e architettura della macchina.

PS In generale potrebbe essere meglio studiare C++ da solo, piuttosto che iniziare con C, ma per il tuo scopo particolare getting diventare più intimo con il basso livello, costrutti non sicuri come i puntatori, dopo aver già imparato Java think penso che sia meglio iniziare con C (e K&R) dove questi sono davanti e al centro.

 1
Author: Max Strini, 2010-04-04 23:56:09

Suggerirei di imparare prima il linguaggio assembly. Questo vi darà una base molto solida in ciò che sta accadendo a un livello basso. Ciò contribuirà anche a rafforzare l'idea che "tutto è in realtà solo un indirizzo".

Prendere una classe che si concentra sul linguaggio assembly è consigliabile poiché ti "costringerà" a impararlo (personalmente, non penso che ASM sia /quello/ divertente, ma ne è valsa la pena [e un requisito per la laurea] per me prendere la classe).

Dopo che lo sai assemblaggio, passare a C e C++.

Buon divertimento!

 0
Author: Jay Taylor, 2010-04-04 22:41:03

Sembra che tu stia evitando il primo errore che la maggior parte delle persone commette, il che presuppone che la nuova lingua sia la stessa di quella vecchia. C++ è diverso e dovrebbe essere appreso come un linguaggio neww(-ish).
Un riferimento che suggerirei sarebbe C++ Come programmare che viene utilizzato nella mia Università per le classi C++ introduttive.

Dopodiché, guarda il precedente software Java che hai scritto e vedi come tradurli in C++. La sintassi può essere facilmente riferimento da CPlusPlus.com. Mentre si fa questo, è importante tenere a mente ciò che tutte le diverse sintassi rappresenta, e come cambia ciò che sta succedendo nel software (cioè le differenze tra le due lingue). Questo ha il vantaggio di consentire di vedere come l'architettura sottostante è rappresentata per entrambi i linguaggi (e per i linguaggi di programmazione in generale). Non conosco un buon libro che spieghi come funzionano i linguaggi di programmazione sotto le coperte, o lo farei lo raccomando.

Se sei, tuttavia, interessato ad imparare come funziona la programmazione, allora il linguaggio Assembly sarebbe un buon punto di partenza. Linguaggio assembly per computer basati su Intel è quello che ho usato per imparare il linguaggio assembly ed è stato molto utile.

 0
Author: chustar, 2010-04-04 22:54:52

Linguaggio assembly.

Inizia con la Z-80. Quindi aggiungere ' x86. Quindi prova 68000. Quindi la serie TI 320 di DSP. Si potrebbe anche voler aggiungere la Z-8. Solo per vedere come le diverse macchine lo fanno.

 0
Author: MSimon, 2010-04-04 22:59:25

Se vuoi davvero saperne di più sulla programmazione di basso livello ti consiglio di imparare C e Assembly. C++ è molto più complesso di C, ma in realtà non ti dà molte più informazioni sulle preoccupazioni di basso livello. Potrebbe essere interessante se vuoi conoscere il tipo di concetti e costrutti di cui può essere composto un linguaggio di programmazione, dal momento che C++ ne ha molti.

C'è anche un livello inferiore della tua VM che non sembri ancora conoscere e che potresti voler esplorare. Per scopri gli interni di Java Consiglierei di imparare come programmare la JVM in linguaggio Assembly (Java). Gelsomino ( http://jasmin.sourceforge.net/) è l'assemblatore / sintassi di riferimento per questo tipo di programmazione. Un'altra grande risorsa è la specifica del linguaggio Java (http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html) che contiene molti interni Java. Quando hai imparato C puoi anche utilizzare alcune API di livello inferiore fornite dalla JVM ( http://java.sun.com/javase/6/docs/technotes/guides/jvmti / ) che ti permettono di recuperare informazioni di basso livello su una JVM in esecuzione e scrivere cose interessanti come i debugger.

Se impari questa roba e fai un po ' di hacking da solo imparerai come funziona la JVM e cosa il compilatore mette effettivamente nei tuoi file di classe. È anche molto probabile che tu scopra alcune cose nuove sul linguaggio di programmazione Java stesso che non sapevi prima anche se pensi di sapere tutto su di esso.

A proposito, puoi anche programmare la VM.Net in assembly.

 0
Author: ahe, 2010-04-05 00:19:25

Penso che dovresti iniziare con C, ma non come preambolo necessario per imparare C++. Piuttosto, per imparare C. In altre parole, mentre impari C metti i tuoi sforzi nell'apprendimento della lingua, sentendo la filosofia della lingua e concentrandoti sul lasciarla sorseggiare nella tua pelle. Sii un buon programmatore C e sarai un buon programmatore, punto. Non solo un buon programmatore C++ - questo non ha nulla a che fare con l'apprendimento C-ma un buon programmatore.

C'è un altro motivo per imparare C prima. È più facile del C++, molto più facile del C++, e si collega bene al C++ (a differenza di Java, che non lo fa in tutti gli aspetti ma in quelli più superficiali orientati agli oggetti). Non sto parlando delle somiglianze di sintassi: sto parlando di programmazione di basso livello. Sto parlando dei concetti di puntatori, che esistono come se stessi e sotto forma di iteratori in C++. Puoi passare intorno alle funzioni in C e puoi passare intorno agli oggetti funzione in C++. C è veloce da imparare, e vi scalderà in modo molto efficace.

Imparare C eliminerà anche la paura delle funzioni libere che alcuni programmatori OO puri tendono ad avere. C++ è un linguaggio ibrido e C è veramente un sottoinsieme di C++, non solo per sintassi ma anche per filosofia.

Inizia procurandoti il libro K&R e bevendolo. Non te ne pentirai.

 0
Author: wilhelmtell, 2010-04-05 02:04:25

Qualunque cosa tu inizi, il mio suggerimento sarebbe scaricare gli IDE completi. Usa buoni editor di testo (vim/emacs)

La curva di apprendimento è migliore quando si utilizzano editor di testo poiché tutto deve essere scritto da solo. Nessun prompt e nessun codice pre-scritto.

Hai tutte le migliori risposte sopra, in anycase. :)

  • Ivar
 0
Author: topgun_ivard, 2010-05-19 10:47:28

Imposta un ambiente di compilazione C++ performante come Microsoft Visual C++ 2008 Express e passa attraverso tutti i link nel sito di Bjarne Strousrup Il linguaggio di programmazione C++ , iniziando con C ++ Style and Technique FAQ . Se sei sperimentato in qualsiasi altra lingua non hai bisogno di più: -)

 0
Author: Alain Rist, 2011-09-27 13:41:38

Impara C e C++ allo stesso tempo, sto parlando per esperienza qui. Molto spesso mi imbatto in codice che mescola C e C++, quindi è meglio conoscere entrambi e le loro differenze. Pick up K & R per C (capire puntatori, file di intestazione e allocazione manuale della memoria e la pulizia...che non sono usati da Java!) e qualsiasi libro per principianti C++ decente (ho scelto Prata, ma qualunque cosa tu sia più a tuo agio). Pratica gli stessi esempi facendo versioni di C, C++ in modo sequenziale, orientato agli oggetti (OO) moda, generico / modello di moda ecc. C++ ha una libreria standard più grande di C: templates, contenitori STL (non c'è bisogno di puntatori, ma è possibile eseguire la messa a punto del puntatore scrivendo il proprio contenitore), thread (dal C++11). Puoi sempre usare C se non hai scelta (o Aumenta le librerie), qualsiasi compilatore C++ lo consentirà.

Se vieni da Java dovresti già conoscere i concetti OO per C++ e, forse, alcuni programmi generici come nei modelli C++. C++ è erroneamente considerato come un linguaggio OO, ma è più di questo. A proposito, gli oggetti sono un concetto dinamico (runtime), mentre i modelli sono statici (tempo di compilazione), quindi impara i CONCETTI del linguaggio, non solo la sintassi! Una volta appresi i concetti leggi il libro di Stroustrup (ha creato C++) per imparare la sua filosofia per le migliori regole di progettazione per il codice C++.

Impara l'ultimo standard C++ (C++11) in quanto aggiunge molte cose nuove al linguaggio (auto, nullptr, thread, funzioni lambda, nuovi contenitori, ecc.). Ultimo ma non meno importante, si prega di utilizzare Doxygen in C / C++ allo stesso modo in cui hai usato Javadoc....non c'è niente di peggio del codice non documentato e illeggibile, indipendentemente dalla lingua che stai usando.

 0
Author: wgodoy, 2013-02-01 01:11:19

Imparare avanti. Ha oggetti migliori. Ed è una macchina virtuale. A meno che tu non voglia una vera macchina vedi Green Array o Sandpiper/John Rible per questo.

Le versioni interpretate con thread gratuiti sono in tutta la 'rete. Per la pratica. Quando lo capisci scrivi la tua versione filettata diretta. Oppure vedi Forth Inc e comprane uno per la tua macchina o usa la loro versione gratuita di Windows.

Java è un ibrido Forth/C quindi se vuoi andare su Java avrai alcune delle cose sotto il tuo cintura.

Istruzione:

Partendo - Brodie Pensare avanti-Brodie

Il secondo è eccellente per qualsiasi lingua perché è il miglior libro sul factoring che conosco. Versioni gratuite di entrambi in rete.

Se vuoi fare un hardware / FPGA Forth Stack Machines: La nuova ondata di Koopman

Tutti i libri di cui sopra sono gratuiti in rete.

 -2
Author: MSimon, 2010-04-04 22:50:45