herramientas - C para programador de Java?
herramientas de java netbeans (7)
- Depende de lo que quieras aprender. Creo que probablemente es mejor sentarse y considerar por qué realmente quieres hacer esto. Si Java hace lo que usted quiere, y solo está haciendo esto por un sentido del deber fuera de lugar, creo que probablemente haya mejores maneras de gastar su tiempo. La reputación de C ++ como un "gigante de la pesadilla" se propaga principalmente por programadores Java inseguros que intentan justificar lo que, en su corazón, saben que ha sido una opción de segunda categoría 1 .
- Hay un par de libros escritos específicamente para programadores de Java que aprenden C y / o C ++. Aunque no es específicamente para los programadores de Java, si decides usar C ++ en lugar de C, consideraría Acclerated C ++ .
1 Por supuesto, estoy bromeando, pero hay un número casi increíble de programadores de Java que parecen tener un chip en su hombro. Si le dices a alguien que usa Python o Ruby (solo por un par de ejemplos) que es lenta, la reacción típica es que se vean un poco confundidos y digan algo como: "Si lo dices, me parece bastante rápido". Está prácticamente garantizado que sugerir lo mismo sobre Java produce afirmaciones de que obviamente eres ignorante y no expresas nada más que odio ciego.
Edición: En lo que respecta a elegir entre C y C ++, para alguien acostumbrado a Java, C simplemente será un ejercicio de frustración. La diferencia en el lenguaje requeriría un ajuste considerable de todos modos, pero pasar de una biblioteca del tamaño de Java a uno del tamaño de C simplemente destruirá su productividad por un tiempo, y es más probable que solo le vuelva a perjudicar a todos los idiomas con "C "En el nombre que le ayude a aprender realmente nada.
Pasar directamente de Java a C es como llevarse a alguien cuya idea de un automóvil deportivo es cuando conduce el Lincoln Town Car en lugar de ser chofer en la limusina, y cuando decide que las carreras son buenas, lo dejas directamente en el asiento de un Outlaw coche de velocidad Dale una oportunidad en (no solo mucho más seguro, sino en realidad más rápido) el auto deportivo callejero legal primero ...
Posible duplicado:
¿Debo aprender C antes de aprender C ++?
Como programador profesional (Java) y usuario pesado de Linux, siento que es mi responsabilidad aprender algo de C (aunque nunca lo use profesionalmente), solo para hacerme un mejor programador.
Dos preguntas :
Debería probar con C o C ++ primero, me doy cuenta de que son idiomas diferentes con algunos puntos en común. ¿Es útil aprender un poco de ambos o simplemente probar uno? Escuché que C ++ es un pesadilla para un lenguaje.
¿Cuáles son los mejores recursos (libros, tutoriales, programas de práctica, códigos de referencia) para un desarrollador de Java como yo?
Gracias
C ++ probablemente se sentirá más familiar para usted que C, y probablemente será más fácil ser productivo con el bate. Sin embargo, C es un lenguaje mucho más pequeño y debería ser razonablemente sencillo de aprender (aunque tenga cuidado, al aprender C corre el riesgo de sufrir un daño cerebral permanente). Mi referencia personal es "C: A Reference Manual" de Harbison & Steele (actualmente, 5ª edición). Para C ++, acabo de usar el libro de pocas palabras de O''Reilly.
Como programador de C con algo de experiencia en C ++ y actualmente haciendo la transición a Java, puedo decirle las cosas sobre C que probablemente lo harán tropezar casi de inmediato:
- C tiene muy poco en cuanto a abstracciones; Punteros y flujos de bytes son bastante más que eso. No hay tipos de contenedores estándar (listas, mapas, etc.). Si desea algo más sofisticado que un arreglo de longitud fija, tendrá que hacer su propio rollo (o usar una biblioteca desarrollada por otra persona).
- No hay tal cosa como la recolección de basura en C. Cada byte que asigna dinámicamente (a través de
malloc()
ocalloc()
) está en el gancho para desasignar (a través defree()
). - Las matrices en C no se comportan como matrices en Java; hay algunas reglas extravagantes con respecto a los tipos de arreglos que a primera vista no tienen sentido (y no lo harán hasta que no se haya establecido suficiente daño cerebral). No hay límites de verificación en los arreglos, y algunas funciones de biblioteca estándar (en particular,
gets()
yscanf()
) hacen que el aprovechamiento del búfer sea un riesgo real. - La sintaxis de declaración C puede ser bastante retorcida. Aunque probablemente no veas nada tan feo, declaraciones como
int *(*(*(*f)())[10])();
son posibles (f es un puntero a una función que devuelve un puntero a una matriz de 10 elementos de punteros a las funciones que devuelven el puntero a int`). - Los límites de implementación de C pueden variar de una plataforma a otra; por ejemplo, el estándar de idioma solo exige rangos mínimos para tipos como
short
,int
ylong
, pero pueden ser más amplios que los requisitos mínimos. Si espera que unint
sea siempre del mismo tamaño, independientemente de la plataforma, tendrá algunas sorpresas. - Procesamiento de texto en C es un dolor en el culo . Seriamente. C no tiene un tipo de cadena como tal.
Con respecto a (1), probablemente diría C. Es mucho más extraño. Dado que su objetivo es ser multilingüe por sí mismo, avanzar hacia un lenguaje que sea muy diferente a Java probablemente sea más útil que aprender C ++, lo que probablemente lo enojará. C ++ recibe mucha basura de la gente, y no es necesariamente horrible, pero la razón principal es que está tratando de forzar un nuevo paradigma en la estructura de C, que no funciona tan bien como un lenguaje que comienza con ese paradigma. en primer lugar.
Para (2), recomendaría altamente, K&R . Asume cierta familiaridad con la programación, es breve, hasta el punto, pero también es lo suficientemente profundo como para explicar conceptos. No incluye ejercicios, sin embargo, que tendrás que encontrar en otro lugar. Aprendí C en el trabajo, me temo (¡y sigo pagando por ello!), Así que no puedo brindarte ayuda educada allí.
Si el objetivo es convertirte en un mejor programador, apunta a lenguajes que realmente intenten ser diferentes. Java, C ++ y C están estrechamente relacionados.
Es cierto que uno es principalmente un lenguaje de procedimiento, uno trata realmente de ser OOP y uno es una mezcla de al menos 4 paradigmas diferentes, pero todos son lenguajes imperativos, todos comparten mucha sintaxis y, básicamente, Todos son parte de la misma familia de idiomas.
Aprender C no te va a enseñar nada dramáticamente nuevo. Puede que le enseñe un poco sobre el diseño de la memoria y demás, pero puede aprenderlo de muchas otras maneras, y no es muy relevante para un programador de Java.
Por otro lado, el lenguaje es relativamente fácil de aprender y se usa ampliamente para una gran cantidad de software de Linux, por lo que si desea contribuir a cualquiera de ellos, aprender C es una buena idea. Simplemente no te hará un programador de Java mucho mejor.
En cuanto a C ++, llamarlo "pesadilla de un lenguaje" probablemente no esté lejos de la verdad. Es grande y complejo y está lleno de trampas y trampas extrañas para el principiante incauto.
pero también tiene algunas cualidades redentoras. Por un lado, es uno de los únicos lenguajes que admiten el paradigma de programación genérico, y eso le permite expresar muchos conceptos avanzados de manera muy concisa, y con un alto grado de flexibilidad y reutilización de código.
Es un lenguaje que probablemente te hará odiar a C ++ por ser un lío tan ingenieril, y todos los demás lenguajes por las características faltantes de C ++ que habrían simplificado mucho tu código.
Una vez más, aprender C ++ no supondrá una gran diferencia para usted como programador de Java, excepto que revelará una serie de deficiencias en Java de las que no estaba al tanto hasta ahora.
Aprender cualquiera de los dos idiomas es bueno, pero lo que es mejor es aprender algo diferente .
Aprende SML o Scheme o Haskell. O Ruby, Python o Smalltalk. ¿Qué hay de Erlang o Occam? O Prolog.
Aprenda algo que no es ni el hermano ni el antepasado de Java, algo que está diseñado desde cero para que no tenga nada en común con Java. Aprenda un lenguaje funcional como SML, o uno de tipo dinámico como Python, o uno que cambie radicalmente la forma en que maneja la concurrencia, como Erlang.
Viniendo de ASM, C, luego C ++ y finalmente aterrizando (forzado) en el territorio de Java, pensé que podría proporcionar una opinión sobre el tema.
Primero, con el debido respeto a la comunidad de Java, la experiencia de negocios muestra que mientras los programadores de C / C ++ pueden acostumbrarse a los principios y la programación de Java (puede que no sea tan fácil), lo contrario sucede más raramente. En otros términos, un programador de C ++ tendrá que aprender y hacer frente a toneladas de reglas de Java (Frameworks ...) pero eventualmente (y normalmente) podrá producir un código de trabajo a largo plazo inyectando gran parte de su experiencia en el sistema en el proceso. Un programador de Java que va a C, acostumbrado a principios más teóricos, y reglas de estructura estrictas pueden
- se siente insegura ya que tiene que decidir muchas cosas, como la organización y estructura del programa
- Siéntase sorprendido con los punteros y la gestión de la memoria: asignación y liberación, que debe pensarse cuidadosamente: descubrir el mundo de las fugas de memoria.
- sentirse desanimado, ya que los errores no aparecerán en negro sobre blanco en una consola dictada por la JVM a través de 200 líneas de seguimiento de pila, pero puede suceder a un nivel más profundo / del sistema, tal vez atrapado gracias a un IDE frente al cual el programador de Java Contemplará un código de ensamblaje por primera vez en su vida.
- Siéntase perplejo con respecto a qué algoritmo y cómo implementarlo, el que estaba integrado en Java y nunca tuvo que preocuparse ...
Entonces, ahora, mi tarea es ayudarlo a sentirse seguro, seguro y motivado antes de aprender C / C ++.
Mi consejo es comenzar con C, porque
- C por sí mismo posee todos los conceptos que nunca tuvo que enfrentar con Java
- como programador de Java, ya tiene un enfoque de clases y, a partir de C ++, puede verse tentado a seguir los principios de Java OO.
- Los principios de C están limitados a unos pocos. C parece la última cosa humana antes de entrar en el oscuro mundo del lenguaje ensamblador.
Lo que enfatizaría durante el estudio de C es, por ejemplo,
Indicadores Java utiliza punteros, por supuesto, pero oculta su acceso y pasa las clases a los métodos como indicadores. En C, tendrá que aprender la diferencia entre
value
yreference
. Además, la diferencia más sutil entrechar x[3]
ychar *x = "ab"
. Y cuán convenientes son los punteros para ir a través de una matriz, etc., ya sabes*++x
o*x++
. Mucho se ha dicho sobre los punteros, mi consejo sería- siempre mantenga el control, es decir, no ponga demasiadas direcciones cuando no sea necesario
- no
typedef
punteros, comotypedef int *pointerToInt
; parece más fácil al principio (pointerToInt pi
lugar deint *pi
) después de unos pocos niveles, prefiero contar las estrellas que el ''pointerTo'' [algunas grandes cies lo hacen]. Excepto tal vez los punteros a las funciones, ilegibles de todos modos.
Memoria Cuando necesita memoria, la asigna y, cuando ya no la necesita, la libera. Fácil. La cuestión es asignar la cantidad correcta, y no liberarla dos veces ... Tengo que acostumbrarme a eso. Y familiarícese con el montón, la pila ... Y cuando su programa se ejecute y se dirija a NULL (0), es posible que tenga una excepción visible. Tal vez no.
Estructura de datos ¿Quieres usar un HashMap conveniente? Claro, después de que lo desarrollaste. O hay algunas bibliotecas que puede vincular que hacen ese tipo de cosas, simplemente elija la correcta. Para ser justos, al programar en C, [tienes que] pensar diferente, y puedes encontrar un algoritmo más apropiado que un mapa para un problema dado.
En general, se sentirá desorientado al principio, pero eventualmente (a menos que tenga pesadillas) encontrará ante usted mucho espacio para la diversión y el placer. C le permite a una persona programar con total libertad: C va de acuerdo con sus ideas, no a la inversa.
Ya que estás haciendo esto por tu propia realización y aprendizaje, te digo que te tomes un descanso y le pruebes a C ++.
Un pequeño prefacio antes de elaborar: solía trabajar principalmente con C ++ y nunca he trabajado con código C de ningún tamaño significativo. Ahora trabajo con C # en su mayor parte, solo uso C ++ en raras ocasiones.
Creo que C ++ es una mejor opción porque:
- Es un conjunto parcial parcial de programas C: C que generalmente no se compilarán como programas C ++, pero la superposición entre los dos idiomas es lo suficientemente importante como para que no le resulte difícil redirigir sus habilidades para trabajar con el código C si necesitas.
- C ++ le presentará más conceptos: obtendrá toda la diversión de la gestión de la memoria y la combinación de bits que puede hacer en C. Pero también podrá ver genéricos como nunca los ha visto, cómo pueden ser los algoritmos escrito independientemente de los contenedores, cómo hacer el polimorfismo en tiempo de compilación, cómo la herencia múltiple puede ser realmente útil a veces, etc.
- Aprenderá a apreciar mucho más el diseño del lenguaje Java: C ++ es un lenguaje complicado con muchos casos de trampas y problemas (consulte las FAQ y el FQA para ver algunos ejemplos). Al experimentarlos por ti mismo, podrás comprender mejor muchas de las decisiones de diseño que se tomaron para crear Java y C #.
Todo se reduce a esto: cuanto más aprendes, más podrás aprender. Y C ++ te obliga a aprender mucho, definitivamente más que a C. Y eso es algo bueno.
C es simple de aprender, difícil de dominar. como programador de Java, la barrera será la memoria y la estructura .
Recomendaría familiarizarse con la cadena de herramientas de GCC en su caja de Linux, a través de tutoriales en Internet. Luego lea el lenguaje de programación C , y una copia del desarrollo de aplicaciones de Linux no hace daño. Además, en Linux glib te evitará reinventar la rueda ... pero al menos intenta crear tu propia lista de enlaces, hashmap, gráfico y otra API para aprender. La aritmética de punteros, las matrices y el aprendizaje de que elementos como las estructuras son solo compensaciones nombradas en una porción binaria son todos importantes. Pasa tiempo con malloc
y de forma free
y memcheck. Con C, sus herramientas y su cadena de herramientas son muy importantes y el IDE no es necesariamente su amigo cuando aprende.
Elegiría C sobre C ++, ya que C es una buena base para acostumbrarme a la administración de la memoria y al uso del puntero de C.
Lo mejor que puedes hacer es aplicar lo que aprendes a un proyecto real. Pero prepárate para golpear tu cabeza contra el muro asignado en Valgrind y GDB . Llevo años programando C, y sigo sin ser C monk.
Estoy de acuerdo en que C es un gran lenguaje, aparece un mal programador. Pero recuerda:
Cualquier programa de C suficientemente complicado contiene una implementación lenta, ad hoc, informalmente especificada, cargada de errores, de la mitad de Common Lisp.
¡La moraleja de esto es aprender otros idiomas también, en lugar de solo los derivados de C! Considere algunos dialectos Lisp, Erlang (que es genial en este momento), Haskell, etc. Ampliarán sus horizontes desde la celda 2x2 de Java. Considera mirar el SICP también.