Cuando aprendí C ++ por primera vez hace 6-7 años, lo que aprendí fue básicamente "C con clases". std::vector
definitivamente era un tema avanzado, algo sobre lo que podría aprender si realmente quisiera. Y ciertamente no había nadie que me dijera que los destructores podrían aprovecharse para ayudar a administrar la memoria. Hoy, a donde miro veo RAII y SFINAE y STL y Boost y, bueno, Modern C ++. Incluso las personas que recién comienzan con el idioma parecen aprender estos conceptos casi desde el día 1.
Mi pregunta es, ¿es esto simplemente porque solo estoy viendo lo "mejor", es decir, las preguntas aquí en SO y en otros sitios de programación que tienden a atraer principiantes (gamedev.net), o es esto realmente representativo de la Comunidad C ++ en su conjunto?
¿C ++ moderno se está convirtiendo realmente en el predeterminado? En lugar de ser algo elegante sobre lo que escriben los expertos, ¿se está convirtiendo en "la forma en que C ++ es"? ¿O simplemente no puedo ver a las miles de personas que todavía aprenden "C con clases" y escriben sus propias matrices dinámicas en lugar de usarlas std::vector
, y hacen la administración de memoria al llamar manualmente nuevo / eliminar de su código de nivel superior?
Por mucho que quiera creerlo, parece increíble si la comunidad de C ++ en su conjunto ha evolucionado tanto en básicamente unos pocos años. ¿Cuáles son tus experiencias e impresiones?
(descargo de responsabilidad: Alguien que no esté familiarizado con C ++ podría malinterpretar el título como si C ++ estuviera ganando popularidad frente a otros lenguajes. Esa no es mi pregunta. "C ++ moderno" es un nombre común para un dialecto o estilo de programación dentro de C ++, llamado así por el libro " Diseño moderno de C ++: programación genérica y patrones de diseño aplicados ", y solo estoy interesado en esto versus" viejo C ++ ". Así que no hay necesidad de decirme que el tiempo de C ++ ha pasado, y todos deberíamos usar Python;))
Respuestas:
Así es como creo que las cosas han evolucionado.
La primera generación de programadores de C ++ fueron programadores de C, que de hecho usaban C ++ como C con las clases. Además, el STL aún no estaba en su lugar, así que eso era esencialmente C ++.
Cuando salió el STL, eso avanzó, pero la mayoría de las personas que escribieron libros, elaboraron planes de estudio y enseñaron clases aprendieron primero C, luego esas cosas adicionales de C ++, por lo que la segunda generación aprendió desde esa perspectiva. Como señaló otra respuesta, si te sientes cómodo escribiendo regularmente para bucles, cambiar de uso
std::for_each
no te compra mucho, excepto la cálida sensación difusa de que estás haciendo las cosas de la manera "moderna".Ahora, tenemos instructores y escritores de libros que han estado usando todo C ++ y obteniendo sus instrucciones desde esa perspectiva, como Koenig & Moo's Accelerated C ++ y el nuevo libro de texto de Stroustrup. Entonces no aprendemos
char*
entoncesstd::strings
.Es una lección interesante sobre cuánto tiempo lleva reemplazar los métodos "heredados", especialmente cuando tienen un historial de efectividad.
fuente
Absolutamente sí. Para mí, si no estás programando C ++ en este estilo "C ++ moderno" como lo llamas, ¡entonces no tiene sentido usar C ++! También podría usar C. "Modern C ++" debería ser la única forma en que C ++ está programado en mi opinión, y esperaría que todos los que usan C ++ y lo hayan programado de esta manera "moderna" estén de acuerdo conmigo. De hecho, siempre estoy completamente conmocionado cuando escucho de un programador de C ++ que desconoce cosas como un auto_ptr o un ptr_vector. En lo que a mí respecta, esas ideas son básicas y fundamentales para C ++, por lo que no podría imaginarlo de otra manera.
fuente
En los días de Windows 3.1, C era el estándar. Cuando C ++ llegó al mercado de desarrolladores y luego se convirtió en el estándar ANSI, fue la nueva moda. Popularizó el acrónimo OOP y algunos de los patrones de diseño básicos que utilizan polimorfismo.
Ahora, con la mayor aceptación de las plataformas administradas de baja barrera de entrada, como C # /. NET, hay menos razones para usar C ++. Gran parte de la base de desarrolladores tendrá una opción y seamos honestos: C ++ es un oso para aprender para un novato. Con C #, puedes simplemente ejecutarlo.
Eso deja realmente solo las plataformas que NECESITAN C ++ y los evangelistas acérrimos de C ++ para continuar practicando el arte. Esta es la comunidad que necesita y quiere todas las capas de abstracción que se consideran "Modern C ++".
Entonces sí, creo que "C ++ moderno", como usted lo dice, se está volviendo más frecuente. Aunque, prevalece con un público diferente al que lo ha usado en el pasado.
fuente
Soy uno de estos tipos que aprendió a trabajar con el STL y escuchó mucho sobre RAII y las buenas prácticas de programación en C ++ desde el día 1. Parecen algunos de los libros más recomendados para aprender C ++ en la actualidad (como Accelerated C ++ y la serie Effective C ++). ) se centran en usar herramientas STL en lugar de acumular sus propias cosas, y también dan muchas "reglas" para una programación efectiva (o "moderna").
Pero hablando con amigos, también noté que algunas compañías todavía trabajan con "C con clases", no con "C ++ moderno". Tal vez la cultura propuesta por los autores y usuarios del "Modern C ++" prevalecerá algún día :)
fuente
Creo que acabas de tener una mala experiencia al comenzar.
Necesitas conseguir libros efectivos de Scott Meyers en C ++. Empecé con C ++ con ira en 1999, el líder de mi equipo me hizo sentarme y leer C ++ efectivo y C ++ más efectivo antes de que me permitieran registrar CUALQUIER código.
La mayoría de sus consejos se refieren a "No use esta función , pero si debe hacerlo, tenga esto en cuenta"
Si sigues sus consejos, escribirás bien o "C ++ moderno".
Ahora también tiene un libro sobre STL, pero eso no lo he leído.
fuente
En mis trabajos en C ++, descubrí que las funciones modernas se utilizan cada vez más, y más personas me preguntaron sobre ellas en las evaluaciones y entrevistas del teléfono. Por lo que puedo decir, se están dando cuenta.
Aprendí C ++ originalmente como algo así como C con clases; Aunque el lenguaje había avanzado mucho más allá de eso, los libros que leía y las personas con las que trabajaba estaban firmemente atrapados en el "viejo C ++". RAII es algo en lo que la gente pensaría, en lugar de hacerlo automáticamente, y recuerdo haber leído algunos de los primeros artículos sobre los problemas de seguridad de excepción.
Como se señaló, ahora hay nuevos libros. Muchos de los antiguos siguen siendo relevantes, pero cada vez más parecen estar llenos de explicar por qué obviamente las malas ideas son malas. (Del mismo modo, es difícil para los lectores modernos comprender cuán revolucionarias eran las ideas de Freud sobre una mente inconsciente, ya que ahora es la sabiduría convencional).
Stroustrup acaba de publicar un libro de texto, Programación: Principios y práctica con C ++ . Lo compré porque todavía no he fallado en aprender cosas buenas de un libro de Stroustrup, pero no he pasado los primeros capítulos. Hasta ahora, todo lo que puedo decir es que apruebo la forma en que está comenzando, y al menos es una buena introducción a cómo se debe usar C ++.
fuente
Mientras trabajo en el proyecto en el que estoy involucrado actualmente, hay una gran cantidad de código C ++ que ha evolucionado durante un período de tiempo significativo (más de 10 años). La evolución de la que habla es claramente visible allí: el código más antiguo suele ser "C con clases": punteros sin formato,
char*
cadenas y uso de funciones de C asociadas, matrices, etc. el código más nuevo usa punteros inteligentes ATL y similares para administrar los recursos, pero aún se adhiere a los bucles codificados a mano la mayor parte del tiempo, y el iterador es algo raro; y el más nuevo está repleto de contenedores STL, algoritmos,shared_ptr
(incluidos eliminadores personalizados para gestionar identificadores, etc.), funciones muy genéricas y plantillas de clase, etc. La mayoría de las técnicas de codificación "C con clases" tradicionales, como los punteros sin encapsular sin procesar con administración manual de por vida, están muy mal vistas en las revisiones de códigos en estos días. A juzgar por esto, parece que su observación es precisa.El desarrollo más reciente parece ser una moda para C ++ 0x lambdas, que tiene un lado positivo en que también inclina la balanza a favor del uso de algoritmos estándar sobre bucles codificados a mano, ya que ahora puede tener todo su código en línea con algoritmos también.
fuente
No diría que std :: vector califica como "moderno" en estos días. Es realmente básico.
En general, mi impresión es que las personas han adquirido algo de experiencia con el estilo moderno de C ++ y se han tranquilizado un poco. Solo para tomar un ejemplo simple, STL for_each fue interesante, pero en la práctica no agrega un gran valor terrible sobre un ciclo C simple. Es más difícil de depurar y, a veces, no proporciona el mejor rendimiento. Además, las construcciones para la programación funcional en STL actual son generalmente muy engorrosas, especialmente si tienes experiencia de un lenguaje funcional real como ML.
fuente
En mi experiencia (universidad española), desafortunadamente, la norma es no considerar los idiomas en sí mismos. Usan los lenguajes más fáciles para enseñar programación (es decir, Java), porque se supone que es fácil para maestros y estudiantes, y luego usan C para las clases de SO y demás.
C ++ se introduce muy ligeramente (en cualquier caso en cualquier curso), solo para proporcionar una C con clases. No entran en impulso o incluso STL. Creo que mantenerse al día con todas las características y la forma de pensar de C ++ es costoso tanto para maestros como para estudiantes. ¿Cuántos programadores de C ++ aquí conocen lo suficiente de todas las bibliotecas de Boost para usarlas para dar una mejor solución o para diseñarla? Uno tiene que estar interesado en mantenerse al día con todas las nuevas bibliotecas y modismos.
Sin embargo, como dije, parece que la programación en general (y los lenguajes de programación en particular) no se toman demasiado en serio, ya que parece ser una asignación temporal cuando comienzan un trabajo, luego olvidan cómo programar a medida que avanzan en el Árbol de empresa. Muchas empresas aquí, y la propia Universidad, tienen la sensación de que cualquiera puede realizar la programación.
Si sigues esta filosofía, para la mayoría de las personas que conozco, C ++ siempre será "C con clases".
Saludos,
fuente
En mi experiencia, depende en gran medida de la edad del producto / proyecto de software. La mayoría de los proyectos nuevos que conozco utilizan C ++ moderno (RAII, STL, Boost). Sin embargo, hay muchos proyectos de C ++ que tienen más de 10 años, y no se ve C ++ moderno allí.
Además, tenga en cuenta que algunas de las implementaciones de STL más populares estuvieron prácticamente rotas hasta hace unos 5 años (MSVC <7.0 y GNU <3.00)
fuente
Creo que la barrera más grande que he encontrado es el soporte de la cadena de herramientas, especialmente en proyectos multiplataforma. Hasta hace unos años, era común ver notas de compilación que decían "la plataforma x necesita que STLport funcione porque su compilador está descifrado". Incluso ahora, veo problemas con las personas que intentan usar múltiples dependencias de terceros vinculadas a diferentes versiones de BOOST. Esto hace que la vinculación sea imposible, lo que significa que tienes que volver atrás y reconstruir tus departamentos desde cero.
Ahora que casi todos han dejado de usar MSVC ++ 6, el desastre de STLport ha quedado atrás. Pero tan pronto como TR1 salga por la puerta, volveremos a "qué versiones de qué entornos lo admiten y lo hacen bien" y una vez más, esto retrasará la adopción.
Trabajo en un proyecto que comenzó en C (no C ++) en 1992. Implementar prácticas modernas en la base de código heredada sería imposible. Asimismo, trabajo en otro proyecto que está mucho más cerca de la vanguardia del lenguaje C ++.
fuente
Muchos equipos en los que he estado y que he escuchado consideran el gran "¿estamos usando excepciones?" pregunta. Este es el código para "¿estamos usando C ++ moderno?"
Una vez que no esté utilizando excepciones, no podrá utilizar todo el poder del lenguaje y sus bibliotecas.
Pero muchas bases de código antiguas no tienen excepciones, y se percibe que es difícil calzar excepciones en una base de código que no las espera, o en un equipo que no sabe cómo usarlas, por lo que la respuesta en tales casos es a menudo 'no'.
En mi experiencia, el C ++ moderno necesita a alguien que le apasione en el equipo, que no pueda soportar la vista de nada menos, para impulsarlo. También necesita superar las objeciones de aquellos que quieren que se parezca más al código heredado.
Si bien no creo que las bases de código antiguas de C ++ desaparezcan muy rápidamente, sí creo que hay más personas apasionadas en el mundo que hace cinco años. Se enfrentan a la misma batalla cuesta arriba que enfrentaron hace cinco años, pero es más probable que encuentren espíritus afines.
fuente
Antes de responder a esa pregunta, tendrías que estar de acuerdo en lo que es "Moderno". No es probable que esto suceda, ya que "Moderno" es una palabra mal definida y significa cosas diferentes para diferentes personas. El título del libro de Alexandrescu (Diseño moderno de C ++) tampoco ayuda mucho, ya que es en gran parte un libro sobre Metaprogramación de plantillas, que es un área específica de C ++ pero de ninguna manera es la única.
Para mí, "Modern C ++"! = "Metaprogramming de plantillas". Diría que las características de C ++ sobre C caerían en estas categorías:
Ninguno de estos es particularmente moderno, ya que todos han estado alrededor de casi 10 años o más. La mayoría de estas características son útiles y le permitirán ser más productivo que la C directa para muchos casos de uso. Un buen programador debería usarlos y los usará en un proyecto de tamaño decente, pero una de estas cosas no es como la otra:
Metaprogramación de plantillas.
La respuesta corta a la metaprogramación de plantilla es simplemente decir no. Desafortunadamente para algunas personas es sinónimo de "programación moderna de C ++", debido al libro, pero al final crea más problemas de los que resuelve. A menos que C ++ desarrolle mejores mecanismos de programación genéricos como la reflexión, no será adecuado para la programación genérica, y los lenguajes de nivel superior como Python serán más adecuados para esos casos de uso. Por esa y muchas otras razones, vea el C ++ FQA
fuente
El mejor libro para aprender C ++. "C ++ acelerado" de Koenig & Moo, enseña lo que usted describe como C ++ moderno, por lo que supongo que la mayoría de las personas lo usan en la actualidad. Para aquellos de nosotros que hemos estado usando C ++ durante bastante tiempo (desde mediados de los años 80 en mi caso), C ++ moderno es un gran alivio de las tediosas tareas de escribir nuestras propias matrices, cadenas, tablas hash (repita hasta la saciedad).
fuente
He examinado los trabajos de C ++ y las bibliotecas "modernas" se utilizan cada vez más en las descripciones de los trabajos, MFC, que es una biblioteca de C ++ bastante "antigua", se usa menos.
fuente
La estandarización del lenguaje a fines de la década de 1990 fue el primer paso, permitió a los creadores del compilador enfocarse en el conjunto de características "estándar", también permitió que el lenguaje arreglara algunos de los bordes ásperos, que aparecieron a través del proceso de estandarización.
Esto a su vez permitió el desarrollo de marcos basados en características estándar del lenguaje, y no en características proporcionadas por una implementación particular del compilador. La biblioteca Boost es notable en este sentido. Además, esto permitió que el nuevo desarrollo se base en trabajos previos, lo que hace posible soluciones a problemas más complejos.
Un cambio notable aquí es cómo los marcos anteriores se basaban en la noción de clases base y clases derivadas (una característica de tiempo de ejecución). Pero ahora las funciones más avanzadas a menudo se basan en gran medida en plantillas "recursivas" (una función de tiempo de compilación).
El STL tiene sus pros y sus contras, pero sobrevivió a la prueba del tiempo, si quieres algo que funcione y sea simple, el STL seguramente tiene algo para ayudarte a comenzar. No tiene sentido reinventar la rueda (a menos que sea por razones didácticas).
El hardware de la computadora también ha dado grandes saltos desde la década de 1990, luego la memoria y la CPU ya no son una restricción para el compilador. Entonces, la mayoría de las optimizaciones teóricas de los libros ahora son posibles.
Los siguientes pasos del lenguaje son el soporte de la programación multi-core, que es parte del esfuerzo estándar 0x.
fuente
Si y no. Ciertamente, para nuevos proyectos es cada vez más popular. Sin embargo, todavía hay barreras para la adopción que son prácticas, no políticas, que otros no han mencionado. Hay muchas bibliotecas comerciales de C ++ que usan ABI de compiladores antiguos que no son compatibles con las características que se ven en Modern C ++, y muchas empresas confían en estas bibliotecas. Sun Studio en Solaris, por ejemplo, no puede funcionar con Boost sin el uso de STLport, pero cualquier biblioteca comercial de terceros que desee usar requerirá la versión de Sun de STL. Misma historia con GCC 2.95 y Redhat Enterprise Linux.
fuente
Es sorprendente el poco esfuerzo realizado para hacer que c ++ sea más estable. El sistema de advertencia está en su lugar, pero no está evolucionando mucho. Es aún más fácil pegarse un tiro que hace 10 años. No sé por qué, pero c ++ sigue siendo mi lenguaje favorito. :)
fuente