Pergunta

Recentemente eu comecei a ler (um pouco) o actual projecto para o futuro C 11 ++ padrão.

Existem muitos novos recursos, alguns deles já disponíveis através do impulso liberais. Claro, estou muito feliz com este novo padrão e eu gostaria de jogar com todos os novos recursos, logo que possibile.

De qualquer forma, falando sobre este projecto com alguns amigos, de longa data devs C ++, algumas preocupações surgiram. Então, peço-lhe (para respondê-las):

1) A linguagem em si

Esta atualização é enorme, talvez demasiado grande para uma única atualização padrão. Enorme para os fornecedores do compilador (mesmo que a maioria deles já começaram a implementar alguns recursos), mas também para os usuários finais.

Em particular, um amigo meu me disse " este é um tipo de nova linguagem ".

  • Podemos considerá-lo uma língua nova marca após essa atualização?
  • Você planeja mudar para o novo padrão ou manter-se com os "velhos" padrão (s)?

2) O conhecimento da língua

  • Como a curva de aprendizado será afetado pelo novo padrão?
  • Ensinar a língua será mais difícil?
  • Alguns recursos, ao mesmo tempo bastante impressionante, parece um pouco demasiado "académico" para mim (como definição que quero dizer). Estou errado?
  • dominar todas estas novas adições poderia ser um pesadelo, não poderia?
Foi útil?

Solução

Em suma, não, não podemos considerar esta uma nova língua. É a mesma língua, novos recursos. Mas em vez de ser aparafusado usando as bibliotecas Boost, que estão agora vai ser inclusões padrão se você estiver usando um compilador que suporta o padrão 0x.

Não se faz Have para utilizar o novo padrão ao usar um compilador que suporta o novo padrão. Um terá de aprender e usar o novo padrão se existem algumas restrições sobre o software que está sendo desenvolvido, no entanto, mas isso é uma restrição com qualquer empreendimento software. Eu acho que os novos recursos que o padrão 0x traz irá Faça fazer certas coisas mais fáceis e menos propenso a erros, por isso é a sua vantagem para aprender o que os novos recursos são, e como eles irão melhorar a sua estratégia de design para o trabalho futuro. A pessoa também terá que aprender isso para que quando se trabalha com um software desenvolvido com isso, eles vão entender o que está acontecendo e não fazer grandes metidas de pata.

Quanto a saber se eu vou " Mudar para o novo padrão ", se isso significa que eu vou aprender o novo padrão e usá-lo, caso aplicável e onde aumenta minha produtividade, então sim, eu certamente plano para interruptor . No entanto, se isso significa que eu vou limite -me a única que trabalham com as novas funcionalidades da norma 0x, então não, já que grande parte do meu trabalho envolve código escrito antes o padrão e seria uma tarefa colossal para redesenhar tudo para usar os novos recursos. Não só isso, mas pode introduzir novos bugs e problemas de desempenho que eu não estou ciente de sem experiência.

Aprender C ++ sempre foi uma das viagens mais desafiador um programador pode realizar. Adicionando novos recursos para o idioma não vai mudar a dificuldade de aprender a sua sintaxe e como usá-lo de forma eficaz, mas a abordagem vai mudar. As pessoas ainda vão aprender sobre ponteiros e como eles funcionam, mas eles também vão aprender sobre ponteiros inteligentes e como eles são gerenciados. Em alguns casos, as pessoas vão aprender coisas de forma diferente do que antes. Por exemplo, as pessoas ainda precisam aprender como inicializar coisas, mas agora eles vão aprender sobre uniformes listas de inicialização e Initializer como principais formas de fazer as coisas. Em alguns casos, talvez as coisas compreensão será mais fácil com a adição do novo para a sintaxe para as faixas ou o tipo de retorno automático em uma declaração de função. Eu acho que, em geral, C ++ se tornará mais fácil de aprender e usar, ao mesmo tempo tornando-se mais fácil de ensinar.

Dominar uma língua é uma meta de longo prazo, não pode ser feito durante a noite. É bobagem pensar que se pode ter domínio sobre algo tão complexo como C ++ rapidamente. É preciso prática, experiência e código de depuração para realmente martelo algo. Learning Academicamente é uma coisa, mas colocar para usar esse conhecimento é todo um monstro diferente. Eu acho que se alguém já tem o domínio da linguagem C ++, os novos conceitos não representam muito de um fardo, mas um recém-chegado pode ter uma vantagem na medida em que não vai incomodar a aprender algumas das maneiras mais obsoletas de fazer as coisas .

Outras dicas

1) A linguagem em si

Tanto quanto eu estou ciente, há mudanças realmente nenhuma ruptura entre C ++ '03 e C ++' 0x. O único que posso pensar aqui se refere ao uso de auto como um especificador de classe de armazenamento, mas uma vez que não tinha semântica ou seja, eu não vejo isso sendo um problema.

Há um monte de outras correções acadêmicos para o padrão que são muito necssary, por exemplo melhores descrições para o layout do membro dados. Finalmente, com arquiteturas multi-core / cpu se tornando a norma, fixação do modelo de memória foi uma obrigação.

2) O conhecimento da língua

Pessoalmente, sinto que para 99,9% dos desenvolvedores de C ++ a linguagem mais recente vai ser mais fácil de usar. Estou pensando especificamente de recursos como auto, de lambda e constexpr. Esses recursos realmente deve fazer usando a linguagem mais agradável.

Em um nível mais avançado, você tem outras características tais como variádica modelos etc que ajudam os usuários mais avançados.

Mas não há nada de novo aqui, eu ainda estou surpreso com a quantidade de desenvolvedores cotidiana C ++ que não usaram (ou sequer ouvido falar) o STL.

Do ponto de vista pessoal, a única característica que eu estou um pouco preocupado com o novo padrão é o de conceitos. Como se trata de uma grande mudança tal, os mesmos problemas que ocorreram com modelos (ie. Implementações completamente quebrado) é um perigo real.

Atualização pós FDIS sair para a votação:

Quando isso acontece, 'conceitos' foi lançada para C ++ 0x e será retomado para C ++ 1x. No final, há alguns muda diferente auto que poderia quebrar seu código, mas na prática, eles provavelmente vai ser muito raro. As principais diferenças podem ser encontradas no Apêndice C.2 do FDIS (pdf) .

Para mim, um dos mais importantes, será:

unique_ptr + std :: move ()!

Imagine que:

  1. ponteiro inteligente sem qualquer sobrecarga:

    • nenhuma operação de contagem de referência
    • nenhum armazenamento adicional para contador de referência variável
  2. ponteiro inteligente que pode ser movido , isto é. sem chamadas destrutor / construtor quando movido

O que isso lhe dá? seguras Exceção, baratos (ponteiros ..) recipientes sem quaisquer custos . O recipiente será capaz de apenas memcpy () unique_ptrs, então não haverá nenhuma perda de desempenho causada por envolvimento ponteiro regular, ponteiro inteligente! Então, mais uma vez:

  1. Você pode usar ponteiros
  2. Será seguro (sem vazamentos de memória)
  3. Vai custar-lhe nada
  4. Você será capaz de armazená-los em recipientes, e eles serão capazes de fazer movimentos "maciças" (memcpy like-) com eles de forma barata.
  5. Será seguro exceção

:)

Um outro ponto de vista:

  1. Na verdade, quando você mover grupo de objetos usando copy (), não é construtor e chamada destruidor para cada instância do objeto. Quando você copia 1000 objetos de tamanho 1kb, haverá pelo menos um memcpy () e 2000 chamadas de função.
  2. Se você gostaria de evitar os milhares de chamadas, você teria que usar ponteiros.
  3. Mas ponteiros são: perigoso, etc. ponteiros inteligentes real não irá ajudá-lo, eles resolver outros problemas
  4. .
  5. Não há uma solução para agora. Você deve pagar para C ++ RAII / ponteiro / valuevars projeto ao longo do tempo. Mas com C ++ 0x, usando unique_ptr permitirá fazer movimentos "maciças" de objetos (sim, praticamente objetos, porque ponteiro será inteligente) sem "enormes" chamadas construtor / destruidor, e sem risco de usar ponteiros! Para mim, isso é muito importante.

É como flexibilização do conceito RAII (por causa de usar ponteiros) sem perder os benefícios RAII. Outro aspecto: ponteiro envolto em unique_ptr () irá comportar-se em muitos aspectos semelhantes à variável objecto de referência java. A diferença é que unique_ptr () vai ser capaz de existir em apenas um escopo de cada vez.

Seu amigo está parcialmente certo, mas principalmente errado:. É a mesma linguagem com recursos extras

A coisa boa é, você não tem que dominar todos os novos recursos. Um dos mandatos principais para um organismo de normalização é para não quebrar o código existente, então você vai ser capaz de seguir em frente, felizes para codificação em seu estilo antigo (eu ainda sou mais um C codificador mesmo que eu faço "C ++" aplicações: -).

Apenas quando você quer ter um olhar para os novos recursos que você vai precisar de osso-se sobre as alterações. Este é um processo que você pode esticar ao longo dos anos se for necessário.

O meu conselho é para aprender o que todos os novos recursos estão a um nível elevado (se apenas ao som conhecimento em entrevistas de emprego), mas aprender os detalhes lentamente.

Em alguns aspectos, C ++ 0x deve ser fácil para ensinar / aprender do que atual C ++:

  • looping através de um recipiente - a nova sintaxe for é muito mais fácil do que for_each + functor ou looping manualmente usando iteradores
  • Inicialização recipientes: nós vamos ser capazes de inicializar as sequências com a mesma sintaxe como arrays
  • Gerenciamento de memória: sai desonesto auto_ptr idade, em vem unique_ptr bem definida e shared_ptr

Lambdas, embora necessariamente mais complexo do que seus equivalentes de outros idiomas, será mais fácil de aprender do que o C ++ 98 processo de definição de objetos de função em um escopo diferente.

Você planeja mudar para o novo padrão ou manter-se com os "velhos" padrão (s)?

Um ano atrás, eu estava escrevendo C89 estrito, porque o produto em questão era agressivamente portátil para plataformas embarcadas, alguns dos quais tinham compiladores com radicalmente diferentes ideias dos quais pedaços de C99 Vale a pena de apoio. Então, um padrão 20-year-old ainda não foi totalmente substituído pelo seu 10-year-old sucessor.

Por isso, não espere ser capaz de ficar longe de C ++ 03 em breve.

Eu esperar para usar C ++ 0x apresenta quando apropriado. Assim como eu uso C99 apresenta em código C, e extensões gcc em C e C ++ (e iria usar extensões MSVC, embora eu nunca tenha trabalhado código MSVC somente por mais de quantias triviais de tempo). Mas eu esperava que fosse bom "ter" ao invés de linha de base, praticamente indefinidamente.

Você tem um ponto, mas tem sido sempre o caso. Há um monte de código C ++ lá fora, que ainda não faz nada integrar, desde o padrão apenas por causa do conservadorismo inato de alguns codificadores '98. Alguns de nós se lembrar de um tempo de escuridão antes do namespace std:: (antes namespaces, na verdade), quando todos escreveu sua própria classe string, e ponteiros andava nua o tempo todo. Há uma razão pela qual falamos sobre "estilo C ++ moderno." - de distinguir do estilo anterior, porque algumas pessoas ainda têm de manter ou código de atualização nesse estilo

Qualquer linguagem tem que evoluir para sobreviver, e qualquer linguagem que evolui terá uma base de usuários divididos, mesmo porque as pessoas variam em sua atitude em relação à estimativa de custos de oportunidade na aplicação nova linguagem apresenta ao seu próprio trabalho.

Com o advento da C ++ 0x no envio de compiladores, essa conversa vai ser jogado fora e outra em equipes de desenvolvimento em todo o mundo:

JOVEM: Eu acabei de descobrir essas coisas chamadas lambdas! E eu estou encontrando muitas maneiras de usá-los para fazer o nosso código mais expressivo! Olha, eu reescreveu sua classe Foo de idade, não é que muito mais puro?

Oldster: Não havia nada de errado com a minha classe Foo idade. Você está apenas procurando desculpas para usar um novo recurso "arrefecer" desnecessariamente. Por que você continua tentando fazer minha vida tão complicado? Por que eu continuo tendo que aprender coisas novas? Precisamos de outra guerra, que é o que precisamos.

JOVEM: Você é muito preso nos teus caminhos, velho homem, que não deve mesmo estar usando C ++ estes dias ... se fosse por mim -

Oldster: Se dependesse de mim teríamos preso com PL / 1, mas não ... minha esposa teve que voto para Carter e agora está preso com toda essa porcaria orientada a objetos. Não há nada que você pode fazer com std::transform e lambdas que eu não posso fazer com um goto e um par de etiquetas.

etc.

A sua carreira de programação envolverá sempre aprendendo e re-aprendizagem. Você não pode esperar c ++ para permanecer o mesmo até que você se aposentar e estar usando os mesmos métodos e práticas que você estava usando há 40 anos. Tecnologia rola e rola rapidamente. É o seu trabalho para manter-se com ele. Claro que você pode ignorar isso e continuar a trabalhar da mesma forma que você faz atualmente, mas em 5/10 anos o tempo você vai se tornar tão desatualizado que você será forçado a aprender tudo, então quando você está tentando trabalho mudança . E terá sido muito mais fácil de aprender sobre o trabalho de todos aqueles anos antes:)

Há alguns meses atrás eu ouvi Bjarne Stroustrup dar uma palestra intitulada 50 anos de C ++ . Evidentemente, eu não sou um programador C ++, mas pareceu-me que ele certamente não pensa 0x é uma nova língua!

Se vamos ou não pode considerá-lo uma "nova linguagem", eu acho que é semântica. Não faz a diferença. É compatível com o nosso código atual C ++, e é uma linguagem melhor. Se vamos ou não considerá-lo "a mesma língua" não importa.

Sobre a aprendizagem da língua, lembre-se que muitas das novas funcionalidades estão lá para tornar a linguagem mais fácil de aprender e usar. A maioria dos recursos que acrescentam complexidade são destinados apenas para desenvolvedores de bibliotecas. Eles podem usar esses novos recursos para tornar melhor, mais eficiente e mais fácil de bibliotecas de uso, que você pode usar sem saber sobre os recursos. Várias das mudanças realmente simplificar e generalizar os recursos existentes, tornando-os mais fácil para os iniciantes para aprender.

É uma grande atualização, sim, mas é guiado por uma década de experiência com o atual C ++ padrão. Toda mudança está lá porque a experiência tem demonstrado que ela é necessária. Na verdade, o comitê está sendo extremamente cautelosa e conservadora, e se recusaram um grande número de outras melhorias de linguagem. O que é adicionado aqui é apenas os fundamentos que 1) todos poderiam concordar, e 2) podem ser especificados no tempo, sem atrasar o novo padrão.

Não é simplesmente alguns projetistas da linguagem sentar e brainstorming de novas funcionalidades que gostaria de tentar.

Conceitos e Mapas Conceituais vão aumentar consideravelmente a grokability de estruturas de modelo. Se você já derramou sobre a fonte de impulso que você vai saber o que quero dizer. Você está indo constantemente da origem para o docs porque a linguagem simplesmente não têm os meios para expressar conceitos de modelo. Esperemos Conceitos Typing + Duck nos dará o melhor dos dois mundos em que pontos de entrada para bibliotecas de modelo pode declarar explicitamente os requisitos, mas ainda tem a liberdade que Typing Duck fornece ao escrever código genérico.

Existem muitas coisas boas em C ++ 0x, mas são mudanças principalmente evolutivos que refinam ou estendem idéias existentes. Eu não acho que é o suficiente diferente para justificar chamando-o de uma "nova linguagem".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top