2010-02-26 10 views
19

¿Alguien puede describir qué ventajas tendría un programador C o C++ sobre una programación .Net cuando se desarrolla para Windows?¿Hay alguna razón por la cual un programador de Windows .Net necesita aprender C o C++ nunca más?

+7

He visto esta pregunta antes, ¡lo juro! – Eric

+1

necesita? no no no. (los extras no son para eludir la restricción ... aunque no estoy seguro de por qué agregué este comentario.) – kenny

+0

¿Porque ".NET" no encaja en los sistemas integrados? –

Respuesta

29

Hay un dicho que dice que cada aplicación de C lo suficientemente compleja finalmente termina reimplementando partes de C++. Lo mismo ocurre con los programas C++ y los idiomas superiores. Aprender C y C++ indirectamente te hará un mejor programador ayudándote a obtener una comprensión más profunda de cómo funciona realmente .Net, y por qué los diseñadores tomaron las decisiones que tomaron.

Un programador es tan bueno como su comprensión de las capas debajo de él. .Net hace un buen trabajo de abstracción de muchos problemas de arquitectura de máquina fuera de la vista, pero no es perfecto. Todavía hay filtraciones en la capa de abstracción en las que la comprensión de problemas de menor nivel lo ayudará a tomar buenas decisiones en la capa .Net.

Un resumen, lista incompleta de estos temas incluye:

  1. interoperabilidad con código nativo, especialmente con la API de Windows
  2. coherencia caché de la CPU (si no me cree, Google las diapositivas de la Presentación de PLINQ en PDC '09)
  3. Rendimiento de tipo de valor frente a rendimiento de tipo de referencia (esto está firmemente establecido en el mundo .Net, pero aprender C/C++ hace que las diferencias entre las asignaciones de pila y montón sean más explícitas de alguna manera).
  4. Kernel problemas de programación (es decir, por qué es una mala idea de escindir 1000 hilos)
  5. Comprender el recolector de basura también se logra mejor mediante la escritura de unos esquemas de gestión de memoria en idiomas no basura recogidas.
+7

+1 para esto: "Un programador es tan bueno como su comprensión de las capas debajo de él". Me gusta eso. – cschol

+0

@cschol Gracias, estoy bastante seguro de que lo robé de alguna parte, probablemente no al pie de la letra, y no podría decir de dónde. –

+0

No solo mire las diapositivas de la presentación PLINQ; mira el video, también. – Gabe

10

Debe aprender lo suficiente C para sentirse cómodo con la API nativa de Windows, ya que es bastante útil cuando se escribe una interfaz de usuario complicada y cuando se interactúa con el sistema.

+4

No sé c o C++, pero creo que es bastante fácil buscar las definiciones de función Win32 API en Msdn y usarlas desde el código .NET. – Samuel

+3

realmente no necesita saber C o C++, solo cómo convertir entre tipos de datos para firmas API .... –

+2

Sí, pero necesita comprender el modelo de memoria de C si no desea perder memoria. – SLaks

3

Aunque me he comprometido a programar solo en .NET de ahora en adelante, sé que habrá casos en los que deba usar interoperabilidad para usar bibliotecas de terceros, y probablemente también necesite poder explorar su código para arreglar loco.

3

Para ser honesto, solo será útil cuando necesite acceder a la API de Win32, pero la mayoría de estas firmas están disponibles en línea (como pinvoke.net), y cada versión nueva de .NET incluye más envoltorios para llamadas de API de Win32 de uso común.

Tener conocimiento C/C++ vale la pena en el esquema más grande de cosas, pero si no lo usa todos los días, ¡pierde el conocimiento rápidamente!

0

Es posible que desee aprender C++/CLI si planea hacer alguna interoperabilidad no trivial.

2

Otros han cubierto la necesidad de la interacción API de Windows, pero también me parece fallar la suposición de que puede garantizar (o que usted necesariamente querrá estar limitado a) el desarrollo de .NET para el resto de su carrera .

.NET es un marco excelente, pero es muy poco probable que sea el último. Y, por muy bueno que sea, no es la mejor opción para cada proyecto.

Aprender los conceptos básicos (y consideraría los conceptos básicos esenciales de C/C++) abre el camino para cualquier cantidad de rutas, incluyendo .NET y lo que sea el próximo gran marco.

4

sólo algunos que se me ocurrió justo a la salida:

  1. velocidad.
  2. Portabilidad.
  3. Evite la instalación de .NET.
  4. Según el tipo de cosas que esté haciendo, C++ puede ser más productivo.
  5. Nunca tiene que debatir si su dentista es más doloroso que P/Invocar.
1

Entender C y C++ realmente le hacen apreciar .NET más y ser más cuidadoso y consciente de la responsabilidad del objeto, la gestión de la memoria y el concepto de rendimiento. Tendrá más sentido de lo que puede pasar bajo el capó cuando llame a un método en el marco y simplemente hace el trabajo por usted.

Alguna programación paralela para maximizar la potencia del hardware como la CPU multinúcleo y la GPU aún están más restringidas a un lenguaje de nivel inferior como C/C++. Para elegir uno para aprender ahora, haré C++. C++ es el sucesor de C y tiene más conceptos avanzados y modernos incorporados. Personalmente aprendí C++ y descubrí que cambiar y trabajar en un entorno C complejo era bastante fácil.

1

Si usted es un programador .Net de Windows que quiere trabajar en Google algún día (¿no es así?), Entonces sería útil aprender C++.

+0

¿Referencia? Encuentro esto difícil de creer. ¿Google tiene algún programador .Net? – prestomation

+0

Google tiene programadores de Python, programadores de Java, programadores de C++ e incluso programadores de .Net (Orkut es ASPX). Sin duda tienen personas que también trabajan en otros idiomas. – Gabe

+2

(no, no lo somos) – ima

0

C++ tiene mejores bibliotecas para muchas tareas menos comunes. Especialmente relacionado con las matemáticas, donde obtiene una gran ventaja del acceso a SSE y algunas otras optimizaciones específicas del procesador. Hay muchos protocolos y estándares basados ​​en C++, COM no va a ir a ningún lado pronto, y la interoperabilidad compleja requiere aún más conocimiento esotérico que simplemente escribir C++.

C++ se dirige a la obsolescencia, pero el camino será largo.

En cuanto al rendimiento general: si bien es posible escribir un código C++ más rápido que el equivalente a .NET, la mayoría de los programas C++ no lo son y muchos son realmente más lentos.

Y a las respuestas de "comprensión básica" ... elija un lenguaje sin meta-programación de plantillas para eso. Por favor.

1

.NET es ideal para proyectos del lado del servidor, pero el uso de .NET para el código del lado del cliente (aplicaciones WinForm o servicios de Windows) puede no ser adecuado en todos los casos. .NET tiene un gran tiempo de ejecución, ocupa una cantidad significativa de memoria y toma un tiempo considerable para cargar. Por lo tanto, si su aplicación o servicio no es el instrumento principal para el usuario final (por ejemplo, el software de respaldo), .NET podría no ser la mejor opción.

+0

¿cuál es su alternativa para winform? MFC? ¡Creo que esa es una de las principales razones a favor de .NET! – Fakrudeen

+0

Prefiero ATL/WTL a MFC. Alternativamente, una interfaz de usuario se puede construir como un control de navegador que aloja DHTMLs. Pero no todo el software es UI ... –

-1

C++ es a menudo más seguro debido a su gestión de recursos automática. La diferencia de rendimiento (a favor de C++) no suele importar, pero el uso de la memoria realmente podría (GC gasta mucha RAM).

+0

No estaría de acuerdo con usted en afirmar que GC desperdicia RAM. Existen escenarios razonables en los que un entorno de GC tendrá éxito donde fallará el esquema de asignación estándar de C++. Si tiene un patrón de asignación y desasignación que deja su pila muy fragmentada, escasamente poblada pero sin grandes bloques contiguos, un malloc grande posterior fallará. GC tiene la libertad de moverse asignada alrededor de la cual permitiría la desfragmentación a necesidad. En segundo lugar, GC solo deja objetos huérfanos en el montón cuando no vale la pena la molestia de limpiarlos. En otras palabras, solo desperdicia memoria que no necesita. –

+0

El GC utiliza memoria que otros procesos o el sistema VM del sistema operativo (cachés del sistema de archivos, etc.) podrían usar mejor. Si bien la fragmentación de la memoria es un problema muy grave y, aunque algunos lenguajes permiten mover datos para evitar la fragmentación, en general, esto no supera la pérdida de memoria debido a la recolección diferida. En las situaciones que usted describe, asignación frecuente y desasignación, este problema se vuelve particularmente malo. Hacer la colección más frecuente evita la pérdida de memoria, pero también tiene un gran impacto en el rendimiento. – Tronic

0

Lo entiendo es .NET es una base para soportar lenguajes de programación, y no es un lenguaje en sí mismo. Hay Visual Basic .NET, Visual C .NET, etc.

Sugiero continuar con C y C++, ya que nunca se sabe cuando .NET será reemplazado por otra tecnología. Hasta ahora, C y C++ son lentos para cambiar y requieren un consorcio para aprobar cambios en el idioma. Tampoco puede limitarse y aprender otros lenguajes útiles como Java, Perl, PHP y LISP.Sugiero LISP ya que es completamente diferente de C o C++ y te iluminará.

0

Si alguna vez quiere ser más que un pony de 1 truco, aprenda C y C++.

Windows se irá un día, porque eso es lo que sucede con las empresas y los productos. Tal vez obtendremos Skylights en lugar de Microsoft, y .NET se reformará en una cosa diferente: .NEW. (como quieras llamarlo).

¿Dónde está tu .NET entonces? Se ha ido, al igual que la generalidad de su experiencia, se ha convertido en la próxima generación de programador de COBOL, un programador de solo legado.

La única manera de poder mantenerse en la cima es conocer los principios de todo, desde el ensamblaje hasta SQL.

Pero eso es luego. ¿Qué pasa con ahora? Obtiene la capacidad de programar juegos triple-A para Windows, para poder escribir controladores para Windows, para poder comprender el mundo de kernel de Windows, para poder entender los detalles de fallas de seguridad para Windows, para ser capaz de mantener aplicaciones antiguas para Windows, para poder ser contratado para empresas que usan C++.

Y esas razones - IMO - son suficientes.

Cuestiones relacionadas