2009-05-07 10 views
31

Recientemente comencé a leer (solo un poco) el current draft para el futuro estándar C++ 11.C++ 11: ¿un nuevo idioma?

Hay muchas características 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. Por lo tanto, te pido (a responderlas):

1) El lenguaje mismo

Esta actualización es enorme, tal vez demasiado grande para una sola 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 me dijo "esta es una especie de idioma nuevo".

  • ¿Podemos considerarlo un nuevo lenguaje después de esta actualización?
  • ¿Piensa cambiar al nuevo estándar o mantenerse al día con los "viejos" estándares?

2) El conocimiento de la lengua

  • Como la curva de aprendizaje se verá afectada por la nueva norma?
  • ¿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 incorporaciones podría ser una pesadilla, ¿o no?

Respuesta

18

En resumen, no, no podemos considerar que se trata de 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 tiene para usar el nuevo estándar mientras usa un compilador que sea compatible con 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 el estándar 0x trae harán hacer que ciertas cosas sean más fáciles y menos propensas a errores, por lo que es una ventaja saber cuáles son 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 "cambio a la nueva norma", si eso significa que voy a aprender la nueva norma y usarlo cuando sea pertinente y me aumenta la productividad, entonces sí, desde luego planificar a conmutador. Sin embargo, si esto significa que voy a limitar a trabajar solo con las nuevas características del estándar 0x, entonces no, ya que gran parte de mi trabajo implica código escrito antes del estándar y sería una tarea colosal rediseñar todo para usar las nuevas características. 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 se puede hacer 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. .

+2

En efecto inicialización uniforme, auto, ... son cosas que un principiante aprenderá como "normales "parte de la lengua ... –

+1

'la gente todavía va a aprender acerca de los punteros y cómo funcionan, sino que también va a aprender acerca de punteros inteligentes y cómo se gestionan.' - la nueva escuela de enseñanza de C++ no es para enseñar a los punteros :) –

+0

La respuesta es realmente buena. La última línea es el mejor punto. –

9

Su amigo es parte de razón, pero sobre todo mal: es el lenguaje mismo con características adicionales.

Lo bueno es que no tiene 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, tendrá que estar al tanto de los cambios. Este es un proceso que puede estirar durante años si es necesario.

Mi consejo es aprender cuáles son todas las nuevas características en un alto nivel (aunque solo sea para saber en entrevistas de trabajo) pero aprenda los detalles lentamente.

14

1) El lenguaje mismo

Por lo que yo sé, en realidad no hay cambios de ruptura entre de C++ y C++ 03 '0x. El único en el que puedo pensar aquí se relaciona con el uso de auto como un especificador de clase de almacenamiento, pero dado que no tenía semántica lo que significa que no veo que eso sea un problema.

Hay muchas otras soluciones académicas a la norma que son muy necesarias, por ejemplo mejores descripciones para el diseño de los datos del miembro . Finalmente, con las arquitecturas multi-core/cpu convirtiéndose en la norma, la fijación del modelo de memoria era imprescindible.

2) El conocimiento de la lengua

Personalmente, siento que para el 99,9% de C++ desarrolladores de la lengua nueva va a 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 las plantillas variad , etc. que ayudan a los usuarios más avanzados.

Pero no hay nada nuevo aquí, todavía estoy sorprendido por la cantidad de desarrolladores de C++ de que no han usado (o escuchado) 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.

actualización posterior FDIS salir a votar:

Como suele suceder, se dejó caer 'conceptos' para C++ 0x y se tomarán de nuevo para C++ 1x. Al final hay algunos cambios que no sean auto que podrían romper su 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).

+2

Creo Concepto solucionará la mayoría de los problemas con el uso de plantilla (y depuración). De todos modos, tal vez debería agregar que el futuro nuevo usuario de C++ no necesitará conocer todas las reglas antiguas del lenguaje que serán reemplazadas bastante bien por algunas características nuevas. – Klaim

+0

Sé que algunas personas que usan C++ como una herramienta fácil de usar C: no hay clases, no hay ninguna iostreams, STL, ... Me encanta conceptos, pero creo que son un poco difícil de entender y utilizar para el programador medio. Gracias. –

7

¿Piensa cambiar al nuevo estándar o mantenerse al día con los "viejos" estándares?

Hace un año, escribía estrictamente 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.

Así que no espero poder escapar de C++ 03 pronto.

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.

5

Su carrera de programación siempre implicará el aprendizaje y el reaprendizaje. 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 :)

+1

Como dije antes, me gusta el estándar. Mi preocupación es acerca de algunos programadores que puedan abusar de todas las nuevas características por el simple hecho de mirar "fresco" (en realidad no es un C++ - único problema) ... –

+0

Eso es lo mismo que toda la programación, utilizar las herramientas que mejor se adapten la situación. –

3

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.

Acerca de aprender el idioma, recuerde que muchas de las nuevas características están ahí para hacer que el lenguaje sea más fácil para aprender y usar. 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, lo que hace que sea más fácil para que los recién llegados aprendan.

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 son solo algunos de los diseñadores de idiomas que se sientan y hacen una lluvia de ideas sobre las nuevas funciones que les gustaría probar.

+0

Solo por ejemplo, estoy absolutamente contento con los valores, pero la diferencia semántica rvalue/lvalue me parece demasiado académica, al menos en la definición. Dicho esto creo que esta nueva característica es demasiado bueno para ser ignorado por la mayoría de los programadores y/o tratada como una biblioteca de sólo cosas, ¿verdad? –

+0

Es una de las características * principalmente * destinadas a los desarrolladores de bibliotecas. Permite algunas mejoras de rendimiento bastante importantes en el STL, por ejemplo. No es una función que esperaría ver utilizada mucho en el código de la aplicación. La mayoría de las personas puede ignorar la función de forma segura y simplemente disfrutar de que su código STL se volvió mucho más rápido. Pero, por supuesto, si comprende la función, probablemente también pueda usarla usted mismo. – jalf

8

En algunos aspectos, C++ 0x debe ser más fácil para enseñar/aprender que la corriente de C++:

  • Retransmisión de un contenedor - la nueva sintaxis for es mucho más fácil que for_each + funtor o bucle manualmente utilizando iteradores
  • la inicialización de los recipientes: vamos a ser capaces de inicializar secuencias con la misma sintaxis que las matrices
  • memoria de gestión: a cabo va poco fiables edad auto_ptr, en viene bien definidos y 012

Las lambdas, aunque son necesariamente más complejas que los equivalentes de otros idiomas, serán más fáciles de aprender que el proceso C++ 98 de definir objetos de función en un ámbito diferente. Hace

4

unos meses oí Bjarne Stroustrup dar una charla titulada de 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.

+0

El vínculo se rompe: v. ( – Potatoswatter

+0

bien, no pude encontrar un enlace (público) disponibles, por lo que lo he borrado – PTBNL

3

Conceptos y concepto Los mapas aumentarán en gran medida la capacidad de crecimiento 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".

12

Para mí, uno de los más importantes, habrá:

unique_ptr + std :: move()!

Imagínese:

  1. puntero inteligente sin ningún tipo de gastos:

    • ninguna operación de recuento de referencia
    • no de almacenamiento adicional para la referencia variable contador
  2. puntero inteligente que puede ser movido, es decir.no hay llamadas de destructor/constructor cuando se mueven

¿Qué le ofrece 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. Así, una vez más:

  1. Usted puede utilizar punteros
  2. Será seguro (no hay pérdidas de memoria)
  3. le costará nada
  4. Usted será capaz de almacenarlos en contenedores, y podrá hacer movimientos "masivos" (como memcpy) con ellos a bajo costo.
  5. Será excepción segura

:)

Otro punto de vista:

  1. En realidad, cuando se mueve un grupo de objetos utilizando la copia(), no es constructor y el destructor de llamadas 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.
  2. Si desea evitar las miles de llamadas, debería usar punteros.
  3. Pero los punteros son: peligrosos, etc. Los punteros inteligentes actuales no lo ayudarán, ya que resuelven otros problemas.
  4. 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.

+1

¡Totalmente! Esa es una característica realmente genial. –

6

Tiene razón, pero siempre ha sido así. 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 espacio de nombres std:: (antes espacios de nombres, de hecho), cuando todos escribieron su propia clase de cadenas, 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 debe 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 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 equipos de desarrollo en todo el mundo:

JOVEN: 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 malo con mi vieja clase 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.

JOVEN: Eres demasiado atrapado en sus formas, anciano, ni siquiera deberíamos estar usando C++ estos días ... si fuera por mí -

oldster: Si era hasta Me hubiéramos 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.