2010-04-04 9 views
13

He estado desarrollando aplicaciones basadas en C# (.net) y Java (J2EE) durante los últimos 3 años.Shift de Java a C++

Pero ahora creo que Java, C# te hace cojo (desde el punto de vista del aprendizaje) y puedes desarrollar tus aplicaciones rápidamente pero no entiendes los conceptos subyacentes básicos de la programación.

Por lo tanto, estoy tratando de aprender C++, pero me parece un poco "confuso" debido a puntero, herencia múltiple, algunas convenciones y otros conceptos de C++ que no existen en Java. Entonces, ¿qué sugieren? ¿Cómo debería sentirme al respecto?

Gracias

PD: Soy un estudiante, por lo que tienen todo el tiempo del mundo y, de hecho cambiar.

+7

¿No conoce los conceptos subyacentes de la programación? ... ¿De dónde aprendiste a codificar Java y C#? ¿Qué libros? No valen la pena allí si no enseñaron eso junto con los conceptos de programación, demonios, es lo primero que aprendí, incluso antes de programar; el ciclo fetch-execute, punteros ... ¡Y esto fue para Java! –

+4

Si realmente desea obtener información sobre cómo se compila su código y qué ocurre en un nivel inferior, le sugiero que lo ensamble. Para ser sincero, en realidad no es tan difícil como parece una vez que te involucras, y obtendrás mucha información sobre lo que está sucediendo con tu código una vez que esté compilado (estructura de pila, etc.). – Cam

+5

C> C++ menos es más. Pruebe C. –

Respuesta

11

En mi opinión, debes aprender C primero para entender correctamente la base sobre la cual se construye C++. Obtenga una copia de "The C Programming Language" (Lenguaje de programación C) de Kernighan and Ritchie, ampliamente considerada la mejor referencia sobre el idioma, y ​​comience a leerla. Una vez que entiendas completamente C, tendrás la base de bajo nivel que necesitas.

+0

Continuando con este tema, aprenda primero el lenguaje ensamblador para que pueda entender lo que hace el compilador de C. Continúa aprendiendo C++. –

+1

Estoy totalmente de acuerdo. Las convenciones de llamadas de aprendizaje y cómo funcionan realmente las funciones realmente me ayudaron a comprender cómo funciona el lenguaje C en su conjunto. – avpx

+32

El inventor del lenguaje C++ estaría en desacuerdo contigo: sus palabras "Si quieres aprender C++, aprende C++". –

9

C++ no es más "básico y subyacente" que cualquier otro lenguaje de programación moderno. Tiene un modelo de una computadora (un espacio de direcciones de memoria plano), pero el sistema operativo y la CPU simplemente simulan ese modelo utilizando muchas capas de almacenamiento en caché y paginación, por lo que no es "real". El resultado es que la misma operación a veces puede tomar 1000s de veces más tiempo para completarse que en otras ocasiones.

También la moderna C++ tiene muchas abstracciones poderosas que no tienen una relación más directa con el funcionamiento de una computadora que las abstracciones proporcionadas en Java y C#. El OP menciona la herencia múltiple, claramente no más elemental que la herencia en otros lenguajes OO. Muchas otras características de C++ omitidas de Java son abstracciones de alto nivel (o le permiten construirlas) y, en cierto modo, Java es el lenguaje de bajo nivel. En Java, el significado de los símbolos del operador es siempre el mismo, mientras que en C++ un simple == podría construir un objeto que luego se utilizará para generar una expresión SQL en lugar de ejecutarse en proceso.

Los tiempos de ejecución de JVM y CLR están (casi con toda certeza) escritos en C y/o C++, por lo que en ese sentido, obviamente, hoy forman capas. Pero en la capa C/C++ todavía estarás trabajando en una abstracción que no es "cómo funciona realmente la máquina", por lo que realmente estarás aprendiendo un conjunto diferente de abstracciones, en lugar de "realidad". Y un sistema operativo (o incluso un chip de hardware) se puede diseñar específicamente para que los tiempos de ejecución JVM o CLR sean la capa nativa de bajo nivel del sistema; en un sistema de este tipo sería el tiempo de ejecución C/C++ que requeriría una capa de emulación de "alto nivel" (costosa) para funcionar.

Por lo tanto, probablemente no valga la pena intentar aprender a programar en "realidad". Nadie realmente hace eso en estos días; es una pérdida de tiempo. Será mejor que aprenda cómo las abstracciones de programación lo ayudan a escribir programas correctos. Si un idioma te hace la vida difícil, eso no prueba que estés haciendo lo "real". Simplemente significa que elegiste el idioma equivocado para lo que intentas hacer.

+4

Tiendo a estar en desacuerdo con esto. Siento que C++, aunque moderno y de alto nivel, de hecho puede ser utilizado como una herramienta de aprendizaje para aprender cosas en un nivel bajo_ que Java o C#. – Cam

+1

Es cierto que C++ está lejos del silicio, en el sentido de que se podría decir lo mismo de C, o acerca del ensamblador x86 o ARM. Sin embargo, no estoy seguro de cuán importante es ese sentido. Bien podría ser que lo que mucha gente considera "fundamental" de hecho ahora está completamente desactualizado e irrelevante, o podría ser que pensar en el modelo de memoria de estilo C realmente ofrezca algunos buenos conocimientos que Java no tiene. –

+1

Assembler y C no tienen programación genérica, envío de métodos polimórficos, excepciones, sobrecarga del operador, constructores/destructores, etc. Así que C++ es mucho más alto que C, y esas son las partes buenas de C++. La parte "pasada de moda" de C++ (los indicadores que tienen el poder de destruir cualquier otra cosa en el espacio de direcciones) es la parte realmente mala; tal vez valga la pena entenderlo para transmitir la noción de qué mala elección de abstracción hace para la programación general. –

0

Sugeriría aprender primero el lenguaje ensamblador. Esto le dará una base muy sólida en lo que está sucediendo en un nivel bajo. Esto también ayudará a reforzar la idea de que "todo es realmente solo una dirección".

Es aconsejable tomar una clase que se enfoque en el lenguaje ensamblador ya que lo "forzará" a aprender (personalmente, no creo que ASM sea/eso/divertido, pero valió la pena [y un requisito para la graduación] para mí tomar la clase).

Después de saber ensamblar, vaya a C y C++.

¡Diviértete mucho!

-2

Conozca Forth. Tiene mejores Objetos. Y es una máquina virtual. A menos que quiera una máquina real, vea Green Arrays o Sandpiper/John Rible para eso.

Las versiones interpretadas con rosca libre se encuentran en toda la red. Para practicar. Cuando lo comprenda, escriba su propia versión Direct Threaded. O vea Forth Inc y compre uno para su máquina o use su versión gratuita de Windows.

Java es un híbrido Forth/C, así que si quieres ir a Java, tendrás algunas cosas en tu haber.

Educación:

A partir de Forth - Brodie Pensando Forth - Brodie

La segunda es excelente para cualquier idioma, ya que es el mejor libro sobre la factorización que conozco. Versiones gratuitas de ambos en la red.

Si usted quiere hacer un hardware/FPGA Forth Pila Máquinas: La nueva ola de Koopman

Todos los libros anteriores son libres en la 'red.

+2

Lo que ha conseguido ADELANTE que ver con Java o C++? ¿Intentó leer la pregunta antes de publicar esta respuesta? –

+0

Factoring. Maquinas virtuales. – MSimon

+0

Dijo que * ya * conoce Java y quiere obtener una perspectiva de menor nivel sobre la programación. No veo cómo otro lenguaje con una máquina virtual logrará eso. –

0

Parece que está evitando el primer error que comete la mayoría de las personas, lo que supone que el nuevo idioma es el mismo que el anterior. C++ es diferente y debe aprenderse como un lenguaje neww (-ish).
Una referencia que sugeriría sería C++ How to Program que se utiliza en mi Universidad para las clases introductorias de C++.

Después de eso, observe el software Java anterior que ha escrito y vea cómo los traduciría a C++. La sintaxis se puede referenciar fácilmente desde CPlusPlus.com. Al hacer esto, es importante tener en cuenta lo que representa la sintaxis diferente y cómo cambia lo que está sucediendo en el software (es decir, las diferencias entre los dos idiomas). Esto tiene la ventaja adicional de permitirle ver cómo se representa la arquitectura subyacente para ambos lenguajes (y para los lenguajes de programación en general). No sé de un buen libro que explique cómo funcionan los lenguajes de programación bajo las sábanas, o lo recomendaría.

Si, sin embargo, le interesa saber cómo funciona la programación, entonces el lenguaje Assembly sería un buen lugar para comenzar. Assembly language for Intel-Based Computers es lo que solía aprender el lenguaje ensamblador y era muy útil.

0

Ensamblaje Idioma.

Comience con la Z-80. Luego agrega 'x86. Luego pruebe 68000. Luego, la serie TI 320 de DSP. Es posible que también desee agregar el Z-8. Solo para ver cómo lo hacen las diferentes máquinas.

+0

Y si desea ver un aspecto de máquina de múltiples núcleos (144 núcleos) muy simple, vea Arrays verdes. – MSimon

+0

No veo el sentido de aprender más de uno si solo lo hace para obtener conocimientos previos sobre cómo funcionan las cosas de bajo nivel. – Cam

+0

La comprensión de los principios * * de lenguaje ensamblador es muy útil y no es difícil (registros, 3 códigos de dirección, a sabiendas de lo que los juegos de instrucciones contienen, etc.) ayudará. En mi humilde opinión, el esfuerzo de poder escribir un programa en asamblea no lo vale. Rara vez necesita ir más bajo que C. –

1

Si desea comprender los conceptos subyacentes de la programación de idiomas, sugeriría un libro como Conceptos de John Mitchell en lenguajes de programación. Siga esto escribiendo algunos analizadores/intérpretes para idiomas simples. Otro buen recurso es el SICP, que es específico de Scheme (un dialecto LISP), y está disponible in full here. Una vez que ha aprendido algunos idiomas, no toma demasiado tiempo recoger la sintaxis y la semántica de uno nuevo (las bibliotecas centrales, por otro lado, pueden tardar bastante tiempo en familiarizarse).

Si quiere aprender sobre cómo funcionan las computadoras de hoy, le recomiendo aprender C y leer libros como los sistemas operativos modernos de Tanenbaum.C es útil en este contexto principalmente para leer código de nivel de sistemas. Implementar un sistema operativo (muy) simple puede ser increíblemente educativo. Sin embargo, algo tan simple como implementar un shell básico (como bourne shell, excepto simple) es probablemente un mejor lugar para comenzar. También recomendaría aprender sobre cómo funciona la red específicamente, ya que es una parte tan integral de los sistemas informáticos modernos.

0

Establecer un performant compilar C++ entorno como Microsoft Visual C++ 2008 Express y pasar por todos los enlaces en el sitio de Bjarne Strousrup The C++ Programming Language, empezando con C ++ Style and Technique FAQ. Si se experimenta en otro idioma, no necesita más :-)

+0

¿Por qué dice que Microsoft Visual C++ 2008 Express es un "entorno de compilación de C++"? ¿No hay otros mejores? Funciono Linux. – zengr

+0

El IDE de depuración es excelente (esencial para el aprendizaje), es libre y de conformidad estándar. Para Linux, encontrará muchos IDE de C++. –

5

No estoy de acuerdo con el sentimiento de que primero necesita aprender C o el lenguaje ensamblador. C++ y C pueden ser similares en teoría, pero son muy diferentes en términos de uso práctico. Uno gana poco o nada en cuanto a las expresiones idiomáticas de C++ al usar solo C, y si bien es bueno tener experiencia práctica en múltiples idiomas, es un ejercicio inútil especificar requisitos previos en el aprendizaje de idiomas. Creo que la mejor manera de aprender los conceptos de programación es sentarse con alguien que los entienda bien y simplemente hablar sobre ello, ya sea en StackOverflow, en foros o, si tiene suerte, en persona.

Al final del día, creo que la programación realmente no es tan difícil, y es posible que necesite a alguien que lo explique justo una vez para que todo haga clic. Se trata de repetir los mismos conceptos simples una y otra vez para construir máquinas complejas y hermosas.

+0

zengr no está expresando interés en aprender un idioma, está expresando interés en descubrir cómo se implementan la gestión de memoria y la herencia. Aprender los modismos modernos de C++ no lo acercará un paso más a ese objetivo de lo que ya está en Java o C#. OTOH aprender C will, o aprender C idioms con un compilador C++, lo hará. –

+0

@Ben: "Estoy tratando de aprender C++". Respondí la pregunta del OP, la que él realmente me hizo, lo mejor que pude. –

1

C y C++ hacen algunos conceptos básicos de programación subyacente más evidentes, pero no fueron diseñados por Dios. Apoyaría la sugerencia de estudiar los sistemas reales de bajo nivel detrás de su código de bajo nivel: sistemas operativos, compiladores/tiempos de ejecución (pruebe "Fundamentos de los lenguajes de programación") y la arquitectura de la máquina.

P.S. En general, puede ser mejor estudiar C++ por sí mismo, en lugar de comenzar con C, pero para su propósito particular: acercarse más a constructos de bajo nivel e inseguros, como punteros, después de haber aprendido Java, creo que es mejor para comenzar con C (y K & R) donde están al frente y al centro.

2

Pero, ahora siento, Java, C# te hace cojo (desde el punto de vista del aprendizaje) y puedes desarrollar tus aplicaciones rápidamente pero no entiendes los conceptos subyacentes básicos de la programación.

Si está tratando de aprender los conceptos de programación, en lugar de arquitectura de máquina, no hay mucho beneficio para aprender C++. Sugeriría ir con algo diferente de Java todos juntos. Una variante de Lisp, tal vez.

How To Design Programs es un libro bastante bueno.

0

Si realmente quiere saber más sobre la programación de bajo nivel, le recomiendo aprender C y ensamblaje. C++ es mucho más complejo que C, pero realmente no le da mucha más información sobre preocupaciones de bajo nivel. Sin embargo, podría ser interesante si quieres aprender acerca de qué tipo de conceptos y construcciones se puede construir un lenguaje de programación, ya que C++ tiene muchos de ellos.

También hay un nivel más bajo de su máquina virtual que aún no parece conocer y que tal vez desee explorar. Para aprender sobre los aspectos internos de Java, recomendaría aprender a programar la JVM en el lenguaje ensamblador (Java). Jasmin (http://jasmin.sourceforge.net/) es el ensamblador/sintaxis de referencia para este tipo de programación. Otro gran recurso es la especificación del lenguaje Java (http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html) que contiene una gran cantidad de elementos internos de Java.Cuando haya aprendido C, también puede usar algunas API de nivel inferior que proporciona la JVM (http://java.sun.com/javase/6/docs/technotes/guides/jvmti/) que le permiten recuperar información de bajo nivel sobre una JVM en ejecución y escribir cosas interesantes como depuradores.

Si aprende esto y hace algunas intrusiones por su cuenta, aprenderá cómo funciona la JVM y qué es lo que el compilador realmente pone en sus archivos de clase. También es muy probable que descubras algunas cosas nuevas sobre el lenguaje de programación Java que no conocías antes, incluso si crees que sabes todo al respecto.

También puede programar la .Net VM en el montaje por cierto.

0

Creo que deberías comenzar con C, pero no como un preámbulo necesario para aprender C++. Más bien, para aprender C. En otras palabras, mientras aprende, C se esfuerza por aprender el idioma, sintiendo la filosofía del idioma y centrándose en dejar que se introduzca en su piel. Sé un buen programador de C y serás un buen programador, y punto. No solo un buen programador de C++, esto no tiene nada que ver con aprender C, sino un buen programador.

Hay otra razón para aprender C primero. Es más fácil que C++, mucho más fácil que C++, y se conecta bien con C++ (en contraste con Java, que no en todos los aspectos, pero los más superficiales orientados a objetos). No estoy hablando de las similitudes de sintaxis: estoy hablando de programación de bajo nivel. Estoy hablando de los conceptos de punteros, que existen como ellos mismos y en forma de iteradores en C++. Puede pasar funciones en C, y puede pasar alrededor de objetos de función en C++. C es rápido de aprender y te calentará muy eficazmente.

Learning C también eliminará el miedo a las funciones gratuitas que algunos programadores de OO puros tienden a tener. C++ es un lenguaje híbrido, y C realmente es un subconjunto de C++, no solo por sintaxis sino también por filosofía.

Comience obteniendo el libro K & R y aprovéchelo. No te arrepentirás de esto.

3

Para aprender C++ Recomiendo leer C++ para programadores de Java por Mark Allen Weiss. Me ayudó mucho al pasar de Java a C++, ya que es muy bueno para resaltar las diferencias entre los idiomas.

+0

Sí, acabo de recibir ese libro. – zengr

+0

Respuesta bonita y nítida a la pregunta "cómo pasar de java a cpp" :) – atamanroman

0

Cualquiera que sea el motivo por el que comiences, mi sugerencia sería eliminar completamente el IDE completo. Utilice buenos editores de texto (vim/emacs)

La curva de aprendizaje es mejor cuando se usan editores de texto, ya que todo debe escribirse por su cuenta. Sin indicaciones y sin código pre-escrito.

Tiene todas las mejores respuestas anteriores, en cualquier caso. :)

  • Ivar
+0

Buena idea, aprenda emacs o vim y no se molestará en aprender cpp; no hay más tiempo libre: PI todavía cree que el buen software es fácil e intuitivo de usar, incluso para principiantes. – atamanroman

+0

si lo notas, mencionó que tiene todo el tiempo del mundo ... Los IDEs son definitivamente buenos, sin duda, para aumentar tu productividad y todo ... pero para aprender algo básico ... definitivamente sugieren comenzar desde la base ... - Ivar –

0

aprender C y C++, al mismo tiempo, estoy hablando de la experiencia aquí. Muy a menudo encuentro un código que mezcla C y C++, por lo que es mejor conocer ambos y sus diferencias. Recoja K & R para C (comprender los punteros, los archivos de encabezado y la asignación y limpieza manual de la memoria ... que Java no usa!) Y cualquier libro decente para principiantes de C++ (elegí Prata, pero sea lo que sea más cómodo). Practique los mismos ejemplos haciendo versiones de C, C++ de manera secuencial, moda orientada a objetos (OO), moda genérica/plantilla, etc. C++ tiene una biblioteca estándar más grande que C: plantillas, contenedores STL (no es necesario punteros, pero usted puede hacer un ajuste fino del puntero escribiendo su propio contenedor), hilos (desde C++ 11). Siempre puede usar C si no tiene otra opción (o bibliotecas de Boost), cualquier compilador de C++ lo permitirá.

Si viene de Java, ya debe conocer los conceptos de OO para C++ y, tal vez, algunos de programación genérica como en las plantillas de C++. C++ es considerado erróneamente como un lenguaje OO, pero es más que eso. Por cierto, los objetos son un concepto dinámico (tiempo de ejecución), mientras que las plantillas son estáticas (tiempo de compilación), así que aprende el lenguaje CONCEPTOS, ¡no solo la sintaxis! Una vez que aprenda los conceptos, lea el libro de Stroustrup (él creó C++) para aprender su filosofía sobre las mejores reglas de diseño para el código C++.

Conozca el último estándar de C++ (C++ 11) ya que agrega muchas cosas nuevas al lenguaje (automático, nullptr, hilos, funciones lambda, contenedores nuevos, etc.). Por último, use Doxygen en C/C++ de la misma manera que usó Javadoc ... no hay nada peor que el código ilegible e indocumentado sin importar el idioma que esté usando.