number - C++ 11: ¿un nuevo idioma?
strdup c++ (11)
En algunos aspectos, C ++ 0x debería ser más fácil de enseñar / aprender que C ++ actual:
- Looping a través de un contenedor: lo nuevo
for
sintaxis es mucho más fácil que parafor_each
functor o bucle manual utilizando iteradores - Inicializando contenedores: podremos inicializar secuencias con la misma sintaxis que las matrices
- Gestión de memoria: sale mal
auto_ptr
viejo, viene bien definidounique_ptr
yshared_ptr
Lambdas, aunque necesariamente más complejo que los equivalentes de otros idiomas, será más fácil de aprender que el proceso C ++ 98 de definir objetos de función en un ámbito diferente.
Recientemente comencé a leer (solo un poco) el borrador actual para el futuro estándar C ++ 11.
Hay muchas funciones nuevas, algunas de ellas ya disponibles a través de Boost Libs. Por supuesto, estoy muy contento con este nuevo estándar y me gustaría jugar con todas las características nuevas tan pronto como sea posible.
De todos modos, hablando de este borrador con algunos amigos, desarrolladores de C ++ desde hace mucho tiempo, surgieron algunas preocupaciones. Entonces, te pregunto (para responderlas):
1) El idioma en sí
Esta actualización es enorme, tal vez demasiado grande para una única actualización estándar. Enorme para los proveedores de compiladores (incluso si la mayoría de ellos ya comenzaron a implementar algunas características), sino también para los usuarios finales.
En particular, un amigo mío me dijo " este es un tipo de lenguaje nuevo ".
- ¿Podemos considerarlo un lenguaje nuevo después de esta actualización?
- ¿Piensa cambiar al nuevo estándar o mantenerse al día con los "viejos" estándares?
2) Conocimiento del idioma
- ¿Cómo se verá afectada la curva de aprendizaje por el nuevo estándar?
- Enseñar el idioma será más difícil?
- Algunas características, aunque bastante increíbles, me parecen demasiado "académicas" (quiero decir, me refiero a la definición). ¿Me equivoco?
- Dominar todas estas nuevas adiciones podría ser una pesadilla, ¿no es así?
En resumen, no, no podemos considerar esto como un nuevo idioma. Es el mismo idioma, nuevas características. Pero en lugar de utilizar las bibliotecas Boost, ahora serán inclusiones estándar si está utilizando un compilador que admita el estándar 0x.
Uno no tiene que usar el nuevo estándar mientras usa un compilador que admita el nuevo estándar. Sin embargo, habrá que aprender y usar el nuevo estándar si existen ciertas limitaciones en el software que se está desarrollando, pero eso es una limitación para cualquier esfuerzo de software. Creo que las nuevas características que trae el estándar 0x harán que sea más fácil y menos propenso a errores, por lo que es una ventaja conocer las nuevas características y cómo mejorarán su estrategia de diseño para el trabajo futuro. También habrá que aprenderlo para que, al trabajar en un software desarrollado con él, comprendan lo que está sucediendo y no hagan grandes abucheos.
En cuanto a si voy a " cambiar al nuevo estándar ", si eso significa que aprenderé el nuevo estándar y lo usaré donde corresponda y donde aumente mi productividad, entonces sí, ciertamente planeo cambiar . Sin embargo, si esto significa que me limitaré a trabajar solo con las nuevas características del estándar 0x, entonces no, ya que gran parte de mi trabajo involucra código escrito antes del estándar y sería una tarea colosal rediseñar todo para usar el nuevo caracteristicas. No solo eso, sino que puede introducir nuevos errores y problemas de rendimiento que no conozco sin experiencia.
Aprender C ++ siempre ha sido uno de los viajes más desafiantes que puede emprender un programador. Agregar nuevas características al lenguaje no cambiará la dificultad de aprender su sintaxis y cómo usarlo efectivamente, pero el enfoque cambiará. Las personas aún aprenderán sobre indicadores y cómo funcionan, pero también aprenderán sobre indicadores inteligentes y cómo se administran. En algunos casos, las personas aprenderán las cosas de manera diferente que antes. Por ejemplo, las personas aún necesitarán aprender cómo inicializar las cosas, pero ahora aprenderán sobre Inicialización Uniforme y Listas de Inicializadores como formas principales de hacer las cosas. En algunos casos, tal vez sea más fácil entender las cosas con la adición de la sintaxis nueva para rangos o el tipo de retorno automático en una declaración de función. Creo que, en general, C ++ será más fácil de aprender y usar y, al mismo tiempo, será más fácil de enseñar.
Dominar un idioma es un objetivo a largo plazo, no puede hacerse durante la noche. Es una tontería pensar que uno puede dominar rápidamente algo tan complejo como C ++. Se necesita práctica, experiencia y código de depuración para realmente anotar algo. Académicamente aprender es una cosa, pero poner en uso ese conocimiento es un monstruo completamente diferente. Creo que si uno ya domina el lenguaje C ++, los nuevos conceptos no representarán una gran carga, pero un nuevo visitante puede tener la ventaja de que no se molestará en aprender algunas de las formas más obsoletas de hacer las cosas. .
Hace unos meses escuché a Bjarne Stroustrup dar una charla titulada 50 años de C ++ . Es cierto que no soy un programador de C ++, pero me pareció que ciertamente no cree que 0x sea un nuevo idioma.
Los conceptos y los mapas conceptuales aumentarán en gran medida la viabilidad de los marcos de plantilla. Si alguna vez has usado la fuente de Boost, sabrás a qué me refiero. Va constantemente de la fuente a los documentos porque el lenguaje simplemente no tiene las funciones para expresar los conceptos de la plantilla. Es de esperar que Concepts + Duck Typing nos brinde lo mejor de ambos mundos, ya que los puntos de entrada a las bibliotecas de plantillas pueden declarar requisitos explícitamente pero aún así tener la libertad que proporciona Duck Typing al escribir código genérico.
Hay muchas cosas buenas en C ++ 0x, pero en su mayoría son cambios evolutivos que refinan o amplían las ideas existentes. No creo que sea lo suficientemente diferente como para justificar llamarlo un "nuevo idioma".
Para mí, uno de los más importantes será:
unique_ptr + std :: move ()!
Imagina:
Puntero inteligente sin ninguna sobrecarga:
- sin operaciones de conteo de referencia
- sin almacenamiento adicional para la variable de contador de referencia
Puntero inteligente que se puede mover , es decir. no hay llamadas de destructor / constructor cuando se mueven
¿Qué te da esto? Excepción de contenedores seguros, baratos (indicadores ...) sin ningún costo . El contenedor podrá simplemente memcpy () unique_ptrs, por lo que no habrá pérdida de rendimiento al envolver el puntero regular con el puntero inteligente. Entonces, una vez más:
- Puedes usar punteros
- Será seguro (sin pérdidas de memoria)
- No te costará nada
- Podrá almacenarlos en contenedores y podrá hacer movimientos "masivos" (como memcpy) con ellos de forma económica.
- Será una excepción segura
:)
Otro punto de vista:
- En realidad, cuando mueves un grupo de objetos usando copy (), hay una llamada de constructor y destructor para cada instancia de objeto. Cuando copie 1000 objetos de 1kb de tamaño, habrá al menos un memcpy () y 2000 llamadas de función.
- Si desea evitar las miles de llamadas, debería usar punteros.
- Pero los punteros son: peligrosos, etc. Los indicadores inteligentes reales no lo ayudarán, ya que resuelven otros problemas.
- No hay solución por ahora. Debe pagar de vez en cuando el diseño C ++ RAII / puntero / valuevars. Pero con C ++ 0x, usar unique_ptr permitirá hacer movimientos "masivos" de objetos (sí, prácticamente objetos, porque el puntero será inteligente) sin llamadas "masivas" de constructor / destructor, ¡y sin riesgo de usar punteros! Para mí, esto es realmente importante.
Es como relajar el concepto de RAII (debido al uso de punteros) sin perder los beneficios de RAII. Otro aspecto: el puntero envuelto en unique_ptr () se comportará en muchos aspectos similares a la variable de objeto de referencia java. La diferencia es que unique_ptr () solo podrá existir en un ámbito a la vez.
Si podemos considerarlo o no como un "nuevo idioma", creo que es semántica. No hace la diferencia. Es retrocompatible con nuestro código C ++ actual, y es un mejor lenguaje. Si lo consideramos o no como "el mismo idioma" no importa.
Sobre aprender el idioma, recuerde que muchas de las nuevas características están ahí para facilitar el aprendizaje y el uso del idioma. La mayoría de las características que agregan complejidad están destinadas solo para desarrolladores de bibliotecas. Pueden usar estas nuevas funciones para crear bibliotecas mejores, más eficientes y fáciles de usar, que luego puede usar sin conocer las características. Varios de los cambios realmente simplifican y generalizan las características existentes, haciéndolas más fáciles de aprender para los recién llegados.
Es una gran actualización, sí, pero está guiada por una década de experiencia con el estándar actual de C ++. Cada cambio está ahí porque la experiencia ha demostrado que es necesario. De hecho, el comité está siendo extremadamente cauteloso y conservador, y ha rechazado una gran cantidad de otras mejoras en el lenguaje. Lo que se agrega aquí son solo los fundamentos que 1) todos podrían estar de acuerdo, y 2) podrían especificarse a tiempo, sin retrasar el nuevo estándar.
No se trata simplemente de que algunos diseñadores de idiomas se sienten e intenten aportar nuevas funciones que les gustaría probar.
Tu amigo está parcialmente en lo cierto, pero sobre todo está equivocado: es el mismo idioma con características adicionales.
Lo bueno es que no tienes que dominar todas las funciones nuevas. Uno de los mandatos principales para un cuerpo de estándares es no romper el código existente, por lo que podrá continuar, codificando felizmente en su viejo estilo (sigo siendo un codificador C a pesar de que hago aplicaciones "C ++": -).
Solo cuando quiera echarle un vistazo a las nuevas funciones, necesitará concentrarse en los cambios. Este es un proceso que puede estirar durante años si es necesario.
Mi consejo es que aprendan cuáles son todas las nuevas características en un alto nivel (aunque solo sean sólidas en las entrevistas de trabajo), pero aprendan los detalles lentamente.
Tu carrera de programación siempre implicará aprender y volver a aprender. No puede esperar que c ++ permanezca igual hasta que se jubile y utilice los mismos métodos y prácticas que usaba hace 40 años. La tecnología avanza y rueda rápidamente. Tu trabajo es mantenerte al día. Por supuesto, puede ignorar eso y continuar trabajando de la misma manera que lo hace actualmente, pero en 5/10 años se volverá tan obsoleto que se verá obligado a aprenderlo todo cuando intente cambiar de trabajo. . Y habrá sido mucho más fácil aprender en el trabajo todos esos años antes :)
Usted tiene un punto, pero siempre ha sido el caso. Hay un montón de código C ++ que todavía no incorpora nada del estándar ''98 solo por el conservadurismo innato de algunos codificadores. Algunos de nosotros recordamos un momento oscuro antes del std::
nombres std::
(antes de los espacios de nombres, de hecho), cuando todos escribieron su propia clase de cuerdas, y los punteros caminaron desnudos todo el tiempo. Hay una razón por la que hablamos del "estilo moderno de C ++": para distinguirlo del estilo anterior porque algunas personas aún tienen que mantener o actualizar el código en ese estilo.
Cualquier idioma tiene que evolucionar para sobrevivir, y cualquier idioma que evolucione tendrá una base de usuarios dividida, aunque solo sea porque las personas varían en su actitud hacia la estimación de los costos de oportunidad al aplicar nuevas funciones lingüísticas a su propio trabajo.
Con el advenimiento de C ++ 0x en los compiladores de envío, esta conversación se reproducirá una y otra vez en los equipos de desarrollo en todo el mundo:
YOUNGSTER: ¡Acabo de descubrir estas cosas llamadas lambdas! ¡Y estoy encontrando muchas maneras de usarlos para hacer que nuestro código sea más expresivo! Mira, reescribí tu vieja clase de Foo, ¿no es mucho más ordenado?
OLDSTER: No había nada de malo en mi antigua clase de Foo. Solo busca excusas para usar una característica nueva y "cool" innecesariamente. ¿Por qué sigues tratando de hacer mi vida tan complicada? ¿Por qué sigo teniendo que aprender cosas nuevas? Necesitamos otra guerra, eso es lo que necesitamos.
YOUNGSTER: Estás demasiado atrapado en tus caminos, viejo, ni siquiera deberíamos estar usando C ++ en estos días ... si dependiera de mí,
OLDSTER: Si dependiera de mí, nos habríamos quedado con PL / 1, pero no ... mi esposa tuvo que votar por Carter y ahora estamos atrapados con toda esta basura orientada a objetos. No hay nada que puedas hacer con std::transform
y lambdas que no puedo hacer con un goto
y un par de etiquetas.
etc.
¿Piensa cambiar al nuevo estándar o mantenerse al día con los "viejos" estándares?
Hace un año, escribía el estricto C89, porque el producto en cuestión era agresivamente portátil para plataformas integradas, algunas de las cuales tenían compiladores con ideas radicalmente diferentes de qué partes de C99 valía la pena soportar. Entonces, un estándar de 20 años todavía no ha sido completamente reemplazado por su sucesor de 10 años.
Por lo tanto, no espero poder alejarme de C ++ 03 en el corto plazo.
Espero usar las características de C ++ 0x cuando corresponda. Del mismo modo que utilizo las características C99 en el código C y las extensiones gcc en C y C ++ (y usaría las extensiones MSVC, aunque nunca he trabajado en el código MSVC solo por períodos de tiempo más que triviales). Pero espero que sea "agradable tener" en lugar de la línea de base, casi indefinidamente.
1) El idioma en sí
Por lo que yo sé, en realidad no hay cambios de ruptura entre C ++ ''03 y C ++'' 0x. El único que puedo pensar aquí se relaciona con el uso de auto
como un especificador de clase de almacenamiento, pero como no tiene un significado semántico, no veo que eso sea un problema.
Hay muchas otras soluciones académicas al estándar que son muy necesarias, por ejemplo, mejores descripciones para el diseño de los datos de los miembros. Finalmente, con las arquitecturas multi-core / cpu convirtiéndose en la norma, la reparación del modelo de memoria era imprescindible.
2) Conocimiento del idioma
Personalmente, creo que para el 99.9% de los desarrolladores de C ++ el lenguaje más nuevo será más fácil de usar. Estoy pensando específicamente en funciones como auto, lambda y constexpr. Estas características realmente deberían hacer que el uso del idioma sea más agradable.
En un nivel más avanzado, tiene otras características tales como plantillas variadas, etc. que ayudan a los usuarios más avanzados.
Pero no hay nada nuevo aquí, todavía estoy sorprendido de la cantidad de desarrolladores C ++ diarios que no han usado (o escuchado) el STL.
Desde una perspectiva personal, la única característica que me preocupa un poco en el nuevo estándar es la de los conceptos. Como es un cambio tan grande, los mismos problemas que ocurrieron con las plantillas (es decir, implementaciones completamente rotas) es un peligro real.
Actualizar la publicación de FDIS para votar:
Da la casualidad de que ''conceptos'' se eliminó para C ++ 0x y se retomará para C ++ 1x. Al final hay algunos cambios que no son auto
que podrían romper tu código, pero en la práctica probablemente sean bastante raros. Las diferencias clave se pueden encontrar en el Apéndice C.2 del FDIS (pdf) .