Cerrado . Esta pregunta está
basada en opiniones . Actualmente no acepta respuestas.
Comentarios
Responder
La pregunta debería ser " ¿Qué lenguaje es más adecuado para el desarrollo de aplicaciones modernas y típicas? ".
Editar : Abordé algunos de los comentarios a continuación. Una pequeña observación: considere que cuando tiene muchas cosas de forma nativa, como modismos, es una gran diferencia que implementarlas o descargarlas y usarlas usted mismo cada vez. Casi todo se puede implementar en cualquiera de estos lenguajes. La pregunta es: ¿qué los lenguajes te lo proporcionan de forma nativa.
Así que fuera de mi mente (algunos argumentos se aplican a ambos lenguajes) …
C # es mejor que C ++ en eso:
- Tiene recolección de basura nativa .
- Le permite tratar las firmas de métodos de clase «como funciones libres (es decir, ignorando el
this
argumento de puntero), y por lo tanto crear relaciones más dinámicas y flexibles entre clases. edite si no sabe lo que esto significa, intente asignar un método de miembro que devuelva void y acepte void a un void (*ptr)()
variable. Los delegados de C # llevan el puntero this
con ellos, pero el usuario no siempre tiene que preocuparse por eso. Pueden simplemente asignar un método void()
de cualquier clase a cualquier otro void()
delegado.
- Tiene un estándar enorme biblioteca con tantas cosas útiles que están bien implementadas y son fáciles de usar.
- Permite bloques de código tanto administrados como nativos.
- El control de versiones en ensamblador soluciona fácilmente los problemas del infierno de DLL.
- Puede configurar clases, métodos y campos para que sean internos del ensamblaje (lo que significa que son accesibles desde cualquier lugar dentro de la DLL en la que están declarados, pero no desde otros ensamblados).
C # es mejor que Java en que:
- En lugar de mucho ruido (EJB, implementaciones de clases estáticas privadas, etc.), obtienes construcciones nativas elegantes y amigables como Propiedades y Eventos. .
- Tiene genéricos reales (no el chiste de mal casting que Java llama genéricos), y puede reflexionar sobre ellos.
- Admite modismos nativos de administración de recursos (el
using
declaración). Java 7 también admitirá esto, pero C # lo ha tenido durante mucho más tiempo.
- No tiene excepciones comprobadas 🙂 (discutible si esto es bueno o malo)
- Está profundamente integrado con Windows, si eso es lo que desea.
- Tiene Lambdas y LINQ, por lo que admite una pequeña cantidad de programación funcional.
- Permite tanto la covarianza genérica como la contravarianza explícitamente.
- Tiene variables dinámicas, si las desea.
- Mejor soporte de enumeración, con la instrucción
yield
.
- Le permite definir nuevos tipos de valor (o no referencia).
Editar – Dirección de comentarios
- No dije que C ++ no es compatible con RAII nativo. Dije que Java no lo tiene (tienes que probarlo explícitamente / finalmente). C ++ tiene punteros automáticos que son geniales para RAII, y (si sabes lo que estás haciendo) también puede sustituir la recolección de basura.
- No dije nada acerca de emular funciones gratuitas. Pero, por ejemplo, si necesita acceder a un campo mediante un
this
puntero, y vincular el método que lo hace a un puntero de función genérico (es decir, no en la misma clase), entonces simplemente no hay forma nativa de hacerlo. En C #, obtienes gratis. Ni siquiera tienes que saber cómo funciona.
- Al " tratar los métodos de miembros como funciones libres " Quise decir que no puedes, por ejemplo, vincular de forma nativa un método de miembro a una firma de función libre, porque el método de miembro " en secreto " necesita el puntero
this
.
- La instrucción
using
, obviamente junto con los contenedores IDisposable, es un gran ejemplo de RAII. Consulte este enlace . Tenga en cuenta que no necesita RAII tanto en C # como en C ++, porque tiene el GC. Para los momentos específicos en que lo necesita, puede usar explícitamente el using
declaración. Otro pequeño recordatorio: liberar memoria es un procedimiento costoso. GC tiene su ventaja de rendimiento en muchos casos (especialmente cuando tiene mucha memoria). La memoria no se filtrará y no gastará mucho tiempo de desasignación. Es más, la asignación también es más rápida, ya que no asigna memoria cada vez, solo de vez en cuando. Llamar a new
es simplemente incrementar un último puntero-objeto.
- " C # es peor porque tiene recolección de basura ". Esto es de hecho subjetivo, pero como dije en la parte superior, para el desarrollo de aplicaciones más moderno y típico, la recolección de basura es una gran ventaja.
En C ++, sus opciones son administrar manualmente su memoria usando new
a nd delete
, que empíricamente siempre conduce a errores aquí y allá, o (con C ++ 11) puede usar punteros automáticos de forma nativa, pero tenga en cuenta que agregan muchos y mucho ruido en el código. Así que GC todavía tiene una ventaja.
- " Los genéricos son mucho más débiles que las plantillas " – simplemente no » No sé de dónde sacaste eso. Las plantillas pueden tener sus ventajas, pero en mi experiencia, las restricciones, la verificación de tipos de parámetros genéricos, la contravarianza y la covarianza son herramientas mucho más fuertes y elegantes. La fortaleza de las plantillas es que te permiten jugar con el lenguaje bit, lo cual puede ser genial, pero también causa muchos dolores de cabeza cuando quieres depurar algo. Así que, en general, las plantillas tienen sus características agradables, pero encuentro los genéricos más prácticos y limpios.
Comentarios
Respuesta
El entorno
.NET Framework y clientes de Windows
Windows es el sistema operativo dominante en los equipos cliente. Los mejores marcos de GUI para aplicaciones de Windows son Winforms y WPF junto con .NET Framework . El mejor lenguaje de programación para trabajar con .NET Framework y sus API es C # . Java no es una alternativa para esto.Y C ++ es un lenguaje más antiguo sin administración automática de memoria. C # es similar a C ++, pero tiene administración automática de memoria y no tiene que trabajar con punteros, lo que lo hace más productivo. C ++ puede ser la mejor opción en algunos casos, pero no para aplicaciones de bases de datos con uso intensivo de formularios que es común en negocio.
IIS y Windows Server
Si está acostumbrado a trabajar en el entorno Windows y con C #, necesitará la menor inversión para aprender IIS para la programación de servidores y Windows Server para administración básica.
Active Directory y Windows Server
Si está desarrollando software que se implementará en las redes de la empresa, es probable que utilicen un entorno centrado en Windows utilizando un Windows Server con Active Directory. En tal entorno, es fácil integrar e implementar una solución creada en C # y .NET Framework .
Personalmente, soy un desarrollador de Java, no un desarrollador de C #, pero trabajo con la web. Cambiaría a C # si estuviera desarrollando aplicaciones de red para la red de Windows. Pero prefiero Java para servidores web basados en Linux. Elegiría C ++ para los sistemas embebidos donde «no gané» muchas dependencias.
Sí, C # es un lenguaje mejor con características más modernas que C ++ y Java, pero eso es no lo más importante para elegir C # .
Resumen
El entorno de su software es lo más importante para elegir C # . Si trabaja en un entorno con clientes Windows, servidores Windows, Active Directory, IIS y tal vez SQL Server luego C # es el mejor idioma con .NET Framework .
Si trabaja en un entorno Unix con, por ejemplo, servicios web, Java sería mi elección. Y si trabaja con sistemas integrados o tiene que integrarse con dispositivos de hardware, C ++ sería una buena opción.
Comentarios
Respuesta
C # y Java
C # es un muy buen lenguaje si:
- Quiere hacer un desarrollo orientado a objetos de propósito general. Es un lenguaje clásico de programación orientada a objetos de tipo estático.
- Está apuntando a plataformas de Microsoft únicamente (vale la pena recordar que Microsoft clonó efectivamente Java para crear C # porque querían un lenguaje similar a Java que encerraría a las personas en Windows. Podrían haber usado Java, pero eso habría permitido a la gente ejecutar aplicaciones fácilmente en otras plataformas …)
C # como lenguaje es mejor que Java en varias formas (mejor sintaxis para propiedades, tipos de valor, genéricos reificados, etc.). Prefiero C # como lenguaje a Java, pero en el gran esquema de las cosas, son lenguajes bastante similares y adecuados para aplicaciones similares.
Por otro lado, Java también tiene grandes ventajas:
- Enorme ecosistema de código abierto: las bibliotecas para Java que puede obtener de forma gratuita son por lejos lo mejor de cualquier idioma. Es difícil exagerar la importancia de esto: desde el punto de vista de hacer las cosas, Java es muy efectivo.
- Herramientas: las herramientas de Java son, en mi opinión, mejores que lo que puede obtener el mundo .Net . p.ej. Maven (¡una vez que lo domines!) Es particularmente impresionante.
- Mantenibilidad – Java ha existido por un tiempo y ha tenido éxito en las grandes empresas precisamente porque es relativamente estable y se ha realizado un gran esfuerzo en la compatibilidad con versiones anteriores. La sintaxis simple y ligeramente detallada también ayuda a Java aquí: es más fácil de leer y mantener el código si el código es muy claro y explícito.
- Nuevos lenguajes: la JVM tiene algunos nuevos lenguajes asombrosos (Scala, Clojure , Groovy, etc.) que son el futuro de la plataforma Java. Aquí es donde está ocurriendo gran parte de la innovación del lenguaje, y está sucediendo mucho más rápido que en Java o C #.
Así que Java vs. C # es una decisión bastante cercana y realmente se reduce a si quieres estar en el campo de Microsoft o en el campo de código abierto / multiplataforma.
Personalmente, prefiero Java porque:
- El ecosistema de la biblioteca es, en mi opinión, mucho más importante que el hecho de que C # tiene una sintaxis más agradable que Java
- A largo plazo, quiero que todo mi código sea correctamente cruzado -plataforma y capaz de ejecutarse en grandes grupos de máquinas linux baratas en la nube.
- Clojure es en mi humilde opinión el lenguaje más prometedor del mundo en este momento, y si me quedo con la plataforma JVM, podré para tran colocar mi código y mis habilidades fácilmente en Clojure a lo largo del tiempo.
C / C ++
C / C ++ es básicamente una bestia completamente diferente. No lo recomendaría para el desarrollo de aplicaciones de propósito general hoy en día por las siguientes razones:
- Gestión de memoria – para la mayoría de la programación de propósito general hoy en día, no quieres ser administrar su propia memoria. La recolección de basura en C # o Java es mucho mejor para su productividad y cordura que cualquiera de las técnicas explícitas de administración de memoria que tendrá que usar en C / C ++
- Complejidad: C ++ en particular es una Lenguaje extremadamente complejo. Se necesita mucho tiempo para dominarlo y el código en sí también puede ser endiabladamente complejo. (Las plantillas de C ++, por ejemplo, son particularmente complicadas …)
- Productividad: la mayor parte del tiempo y todo lo demás. siendo igual, le llevará más tiempo hacer las cosas en C / C ++.
Sin embargo, es sin duda una gran elección en un número limitado de dominios especiales, en particular:
- Sistemas operativos: probablemente desee utilizar C / C ++ si está escribiendo un sistema operativo.
- Desarrollo de juegos: casi todos los t Los mejores motores de juegos comerciales son C / C ++. Sigue siendo la mejor opción si está desarrollando un título AAA exigente (C # y Java están perfectamente bien para juegos menos exigentes / casuales)
- Computación de alto rendimiento: C / C ++ optimizado es probablemente la mejor manera de crear código de muy alto rendimiento. Para la mayoría de las aplicaciones, hacer este nivel de optimización no vale la pena el esfuerzo, pero en ciertos dominios puede ser extremadamente valioso (comercio de alta frecuencia, por ejemplo)
- Acceso al hardware: necesita acceso directo acceso al hardware (por ejemplo, para un sistema integrado)
Básicamente, C / C ++ es una gran opción si y solo si está enfocado en uno de los dominios donde es particularmente adecuado .
Comentarios
Responder
I heard that syntactically they are almost the same.
¿Sintácticamente? ¿A quién le importa la sintaxis a los monos voladores? La sintaxis solo sirve para una cosa: permitir una migración más rápida desde lenguajes sintácticamente similares. Eso es.
C # es mucho mejor que Java. Considere su soporte de programación genérico y funcional: C # está muy por delante de Java. Sin mencionar las sobrecargas de operadores y otras cosas buenas: C # tiene muchas mejores características. No hay forma de que Java pueda considerarse mejor que C #.
C ++ y C # es más un concurso. C ++ tiene un modelo de compilación arcaico increíblemente molesto y un montón de enfermedades de C, pero sus plantillas son mucho más poderosas que las genéricas, y sus enfoques de administración de recursos son mucho más flexibles y poderosos en general, ya que using
es un completo fracaso , y se ejecuta más rápido.
Comentarios
Respuesta
Bueno, C#
tiene algunas funciones integradas agradables como LINQ
y delegados. Está obteniendo lo mejor de ambos mundos: Java
y C++
. Mira aquí para ver una comparación completa.
Pero me gusta el Java
mejor, mucho más marcos de código abierto y se ejecuta en todas las plataformas. Y no me hable de Mono
; no es una opción confiable.
Comentarios
Respuesta
De acuerdo con algunas fuentes (consulte, por ejemplo, http://www.indeed.com/jobtrends ) C # sigue siendo menos popular que Java y tan popular como C ++.
C # proporciona características de las que Java carece, p.ej soporte directo para ciertos lenguajes de programación como propiedades, estilo de programación funcional, etc. C # tiene un mayor nivel de abstracción que C ++, lo cual es una ventaja cuando el tiempo de desarrollo es más importante que la velocidad del programa.
Personalmente, sigo prefiriendo los mundos Java / C ++. Como dijo Petar Minchev, Java tiene más marcos y aplicaciones de código abierto, se ejecuta en todas partes, está menos vinculado a un proveedor y sistema operativo en particular. C ++ tiene ventajas similares, aunque el código a menudo necesita adaptaciones de una plataforma a otra. Como prefiero desarrollar en Linux y, que yo sepa, no puedo tener C # completo en Linux, nunca tuve un interés real en C # porque mis necesidades de programación están cubiertas por C, C ++, Java, Scala.
Por otro lado, para muchos desarrolladores estar vinculados a un proveedor en particular no es un problema: Microsoft tiene una posición dominante en el mercado de sistemas operativos y C # ofrece muchas oportunidades laborales. Por lo tanto, en mi opinión, muchos desarrolladores adoptan C # porque, además de ser un lenguaje rico en funciones, también es una buena inversión.
Comentarios
Respuesta
¿Qué pasa con " Qué marco de desarrollo de software, que incluye un lenguaje de programación " su ¿mejor?
Olvidó incluir otras cosas, como el " entorno " con el que trabajará.
-
¿Va a trabajar solo para el sistema operativo Windows, pero no tiene que ser de bajo nivel y tener mucha memoria y otros recursos?
Elija .NET como marco sobre Windows, y usa C #.
-
¿Vas a trabajar solo para Windows, pero no tiene que ser de bajo nivel, PERO no ¿Tiene muchos recursos?
Elija el marco Delphi (y el lenguaje de programación Object Pascal Delphi o el lenguaje de programación Lazarus Object Pascal)
-
¿Se requiere su aplicación para apoyar seve ral, como un juego, en diferentes móviles?
Elija Java Framework y el lenguaje de programación Java.
-
¿Es Linux con KDE como gráfico ¿Interfaz?
Elija QT framework, con C ++
-
¿Es Linux con Gnome como interfaz gráfica?
Elija GObject / GLib framework , con C ++
-
¿Va a trabajar con muchas operaciones de bajo nivel, como el desarrollo de controladores?
C o C ++ simple se usa para varias operaciones Sistemas, con bibliotecas estándar, como marco.
Solo mis dos centavos.
Comentarios
Respuesta
Si realiza una búsqueda, es probable que se encuentre con una discusión sobre los principales lenguajes de programación. Este es uno de los resultados de la búsqueda: http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html : Java parece ser el idioma más popular.
Java intentó eliminar algunas de las deficiencias de C ++ (y simplificó la vida de los programadores para las aplicaciones que no son de tiempo real ni críticas). C #, que llegó tarde a la fiesta, evitó algunas de las deficiencias del lenguaje Java. C # ha avanzado mucho (ya que Microsoft tiene mucho control sobre él) mientras que los avances en Java se bloquearon durante un período de tiempo considerable debido a un conflicto entre sus partes interesadas.
Respuesta
Un par de cosas que aún no se han mencionado:
C # es mejor que C ++ porque:
Elimina con archivos de encabezado, lo que se traduce en una gran simplicidad.
C # es mejor que Java porque:
Admite tanto el tipo de referencia (clase) como el tipo de valor (estructura) definido por el usuario tipos, que, si sabe lo que está haciendo, pueden producir importantes beneficios de rendimiento.
Admite delegados, que son como interfaces de método único, lo que simplifica enormemente la codificación de construcciones que ocurren con frecuencia y que involucran objetos de método único.
Comentarios
¿Puede explicar de qué manera tener tipos de tipo de referencia y de tipo de valor puede generar beneficios de rendimiento en C #?
Por ejemplo, si desea tener una matriz de registros , en Java no tiene más opción que describir su registro usando una clase, por lo que su matriz será una matriz de referencias a una multitud de objetos asignados por separado. En C # puede describir su registro usando una estructura, por lo que su matriz será solo un área continua de memoria que contiene sus estructuras una tras otra, al igual que en C.
Como otro ejemplo, si lo desea para definir un nuevo tipo pequeño (un tipo que encajaría dentro de una palabra de máquina) no es necesario definir una nueva clase para él; simplemente puede convertirlo en una estructura, por lo que obedecerá a la semántica de valores. Pasar tales estructuras no será más costoso que pasar referencias a objetos, pero tendrá la ventaja de no asignar, construir y recolectar basura ningún objeto.
Entiendo. Entonces, las clases se instancian en el montón y se accede a ellas a través de referencias, mientras que las estructuras se instancian en la pila (?)
Casi correcto. La única inexactitud en esta declaración es que una estructura se encontrará en el montón si está incrustada dentro de otro objeto, o si está dentro de una matriz de estructuras. Y también se encontrará en el montón si alguna vez se encajona, exactamente de la misma manera que los tipos de valor están encerrados en Java.
Respuesta
Debe elegir el mejor idioma para su entorno esperado y su experiencia.
Elija C # si está trabajando en un entorno exclusivo de Microsoft. Si bien C # está estandarizado bajo ISO / IEC 23270: 2003, la versión de Microsoft sigue siendo la única implementación completa. Varias partes clave del lenguaje no están cubiertas por el estándar y, por lo tanto, están sujetas a las patentes de Microsoft. Nadie más implementará una versión completamente compatible del idioma para otros sistemas, por lo que, en efecto, su proveedor está limitado a Microsoft Windows y .Net mientras use el idioma. Si está buscando habilidades para usar en el mercado móvil, lo mejor es buscar otro idioma.
Java funciona, pero tiene una gran cantidad de gastos generales, en parte debido a características como la recolección de basura. Java tampoco está estandarizado por ISO / IEC, por lo que no tiene garantías si cambia de plataforma y versión de Java, solo las mejores intenciones de Sun / Oracle. Si finalmente planea trabajar con Android, este es definitivamente el camino a seguir. . La programación de Android es básicamente Java, con algunos cambios.
C ++ está estandarizado y casi todos los compiladores siguen el estándar internacional, por lo que tienes un comportamiento garantizado PERO el lenguaje no te protege de ti mismo. Debe realizar la limpieza y la verificación de desbordamiento por su cuenta. Esto no es dificil. Los programadores de C / C ++ han estado haciendo esto durante muchos años. Apple usa Objective C para todo, así que si quieres apuntar a Apple, te recomiendo que pruebes esto.
Si se ve dejando atrás Windows en algún momento, le sugiero que aprenda tanto C / C ++ como Java, ambos comercializables en este momento.
Respuesta
En relación con C ++ vs C # (ya que no soy lo suficientemente competente en Java), lo que me falta aquí es la capacidad de acceder a cosas de bajo nivel en Windows. Por ejemplo, no puede desarrollar un controlador de pantalla nativo en C # (todavía), pero puede hacerlo con C ++. Esto no hace que C ++ sea mejor. Veo C ++ versus C # como Ensamblador versus C.
C # está en mi ver mucho más eficiente si observa el tiempo que lleva implementar una función. La penalización del rendimiento del tiempo de ejecución de .Net es insignificante para el 99% de las aplicaciones desarrolladas. Puede ser importante si está ejecutando un ciclo estrecho, sí por supuesto, pero la mayoría de las veces una aplicación está inactiva, esperando cualquier tipo de entrada, señal o interrupción (E / S de disco, clic de botón, red, finalización de la animación).
La biblioteca CLR con todos sus funciones tiene otra r gran beneficio. Cuando estaba entrenando C # para desarrolladores junior, la mayoría de ellos dijeron que les gustaba la convención de nombres lógica de clases, miembros y espacios de nombres. Encontrar una característica de método era lógico en todo el SDK, algo en lo que Visual Basic 5 tenía graves fallas. Esto les ha ayudado enormemente a adoptar la biblioteca. Después de aprender la sintaxis de un idioma, aprender una nueva biblioteca es importante para comprender bien cualquier SDK. Te evita reinventar la rueda.