BT

Disseminando conhecimento e inovação em desenvolvimento de software corporativo.

Contribuir

Tópicos

Escolha a região

Início Notícias C++17 está presente: Entrevista com Herb Sutter

C++17 está presente: Entrevista com Herb Sutter

Favoritos

Em setembro de 2017 o comitê ISO C++ aprovou formalmente o novo padrão C++17, depois que o trabalho foi finalizado em abril de 2017. O InfoQ já cobriu o novo padrão C++ em várias ocasiões no passado, detalhando os principais novos recursos, desde como eram aprovado e o progresso com a implementação do compilador. Agora, aproveitamos a oportunidade para falar com Herb Sutter, que esteve envolvido por muitos anos com atividades do comitê ISO C++ e é, na verdade, seu convocador.

InfoQ: O C++17 inclui um grande número de novos recursos, o que pode parecer assustador no início. Quais sao os principais destaques neste novo padrão? Qual dos recurso do C++17 os desenvolvedores devem ter mais entusiasmo?

Herb Sutter: Para mim, os principais destaques do C++17 são aqueles recursos que ajudam a simplificar o uso diário da linguagem.

Quando o C++11 saiu, havia muitos novos recursos incluindo alguns grandes e brilhantes, mas eram as "pequenas coisas cotidianas" que mais impactaram - a base de alcance do loop for, auto, ponteiros inteligentes, lambdas, inicializadores de membros de classe. Essas sao as coisas que vemos e usamos todos os dias e que tornam nosso código mais limpo e seguro.

Agora que temos o C++ 17, algumas pessoas estão entusiasmadas com os recursos "grandes" como o Parallel STL, mas acho que o que será visto e apreciado são coisas do dia a dia, como ligações estruturadas (como escrever for(auto [chave, valor]: my_map) {...}) e dedução de argumento do modelo de classe (como escrever pair p{1, 2.0}, ao invés de pair <int, double>{1, 2.0};) e ser capaz de inicializar variáveis e o alcance de mudar exatamente como fazemos com loops - estes reduzem a cerimônia que a linguagem requer ao escrever nosso código, tornando o código mais simples de se escrever e manter. Na biblioteca padrão, std::string_view e na std::optional são os novos "tipos de vocabulários" chave que provavelmente serão amplamente utilizados como parâmetro de função e tipos de retorno, o que permite escrever estruturas mais simples, incluindo a std::string_view que pode substituir o tema no tipo string; e a std::variant e a std::any são os dois tipos mais comuns que muitas vezes veremos sendo usados como membros da classe e internamente dentros da função.

As pequenas coisas, especialmente as que se concentram na simplificação, realmente persistem por um longo tempo.

InfoQ: Um dos recursos mais aguardados do C++ são os conceitos, que não chegaram ao C++ 17. Você poderia comentar a razão por trás desse atraso?

Sutter: Era apenas uma questão de tempo; para dar um tempo de "cozimento" adequado.

Todos adoram o recurso de conceitos que vem progredindo de forma constante. Nós o publicamos como uma Especificação Técnica (TS), ou "ramificação beta", menos de um ano antes do congelamento de recursos para o C++ 17 e, portanto, a maioria do comitê queria ganhar experiência com a TS antes de correr para um padrão abaixo do fio. Quando publicamos um recurso em um TS/beta, podemos (e devemos) ter tempo para obter feedback sobre ele e assumir grandes mudanças antes de marcá-lo como padrão na pedra. Quando publicamos um recurso no C++ International Standard (IS), ele é gravado em pedra para o resto de nossas carreiras e é quase impossível corrigir algo que exigiria uma ruptura.

Os conceitos já estão no rascunho do C++ 20. Na primeira reunião para o ciclo do C++20, foi a primeira coisa importante que adicionamos ao C++ após o C++17. Curiosamente, ele já contém algumas melhorias com base na experiência com o TS - mudanças que teriam sido difíceis ou impossíveis se o tivéssemos encravado no C++17.

InfoQ: Quais serão as principais áreas de foco para o C++20?

Sutter: Você pode ter uma boa noção dos principais recursos em um próximo padrão C++ observando os TSs que publicamos, e uma lista atualizada desses é mantida em isocpp.org/std/status. De um modo geral, um TS que foi publicado um ano ou mais antes do corte do recurso para o próximo padrão, que para o C++ 20 seriam os TSs publicado no início de 2018 ou algo assim, contém material candidato provável para o próximo padrão. Observe que nunca adotamos um TS sem mudanças - o que confirma a utilidade de fazer primeiro um TS para as características maiores ou experimentais.

Aqui estão os principais TSs que não faziam parte do C++ 17, mas foram publicados até agora:

Conceitos TS: Nós já adotamos tudo isso, com mudanças, exceto para a "sintaxe concisa" (como escrita void f(MyConcept param){...}). O comitê votou fortemente a favor de prosseguir com essa sintaxe, uma vez que as melhorias que podem ser feitas abordam algumas preocupações técnicas, e eu acho que há uma boa chance de que possamos definir uma forma final no projeto do C++20 nas próximas reuniões.

Concorrência TS: Este é realmente um grupo de recursos que provavelmente será a cereja do bolo. Ponteiros inteligentes atômicos e fechos parecem ser candidatos prováveis a serem incluídos. As futuras extensões <> dependem da proposta de executores simultâneos, que ainda não foi concluída, e provavelmente será aguardado que isso se assente.

Bibliotecas Fundamentais 2: Este também é um grupo de bibliotecas de recursos, e está sendo considerado recurso por recurso a ser mesclado no C++20.

Intervalos TS, Coroutines TS e TS de rede: estes acabaram de receber sua aprovação final e estão sendo publicados, então eles provavelmente serão considerados para a fusão no C++20 no próximo ano ou mais para frente.

Observe que não estou fazendo uma previsão de que esses recursos estarão em C++20. Estou apenas listando os principais candidatos. Há uma pequena chance de que uma ou duas outras grandes características, que não estão tão longe ainda, como a reflexão estática, podem estar presente no C++20, mas isso depende muito da rapidez com que essas propostas possam amadurecer nos próximos 6 a 12 meses. E, claro, o que foi citado acima não é uma lista exclusiva de potenciais recursos do C++20; cada padrão sempre contém muitas outras melhorias menores que não necessitam passar por um TS primeiro.

InfoQ: Você encontra algo interessante e/ou inspirador em linguagens mais recentes como, Rust, Go, Swift?

Sutter: Claro. Estou sempre interessado em ver o que outras linguagem exploram e experimentam, e acho que é um ótimo sinal de uma indústria saudável, já que vemos novas linguagens surgir e florescer. Isso melhora o ecossistema para todos, porque as linguagens emprestam-se regularmente umas das outras.

O Swift, em particular, é uma ótima experiência do ponto de vista da tentativa explícita de substituir uma grande linguagem atual (Objectivo-C). É quase uma situação ótima para a nova linguagem, onde a empresa que a está desenvolvendo e promovendo também é a principal empresa que usa a linguagem em exercício e também é a empresa proprietária das duas plataformas de sistema operacional em que essa linguagem atual é popular. Essa é provavelmente a maior alavancagem que qualquer empresa que promova uma nova linguagem já teve tentando uma aquisição de atacado (ou, digamos, a substituição) de uma outra linguagem do mercado e da base de desenvolvedores, e será interessante e instrutivo ver como isso se desenrolará.

InfoQ: Você escreveu uma série de livros influentes sobre C++, existe algum novo livro em que esteja trabalhando? De forma geral, qual é o seu foco principal hoje?

Sutter: Escrevi artigos e livros porque gostei de escrever sobre as coisas que estava aprendendo sozinho. Não só foi divertido compartilhar essas coisas novas, mas ensiná-las aos outros me forçou a compreendê-las profundamente; não há nada como ter que explicar uma coisa a outra pessoa para ter certeza de que você realmente teve o melhor entendimento.

Atualmente estou definindo novos recursos do C++ ao invés de aprendê-los. Então não estou escrevendo livros ou artigos no momento, embora eu possa escrever alguns artigos para blogs no estilo Perguntas e Respostas num futuro próximo. Atualmente, quase toda a minha escrita está entrando em propostas de padrões e nas diretrizes básicas do C++.

Há dois anos decidi me concentrar em um projeto de longo prazo para encontrar maneiras de tornar o C++ mais poderoso e mais simples - ou seja, tornando a linguagem mais poderosa de maneiras que tornem o código e os programas C++ mais simples de escrever e manter. Eu pretendo fazer isso indefinidamente. Eu acho que há muito a ser feito, então estou tentando vários experimentos e vendo quais funcionam e, em seguida, trazendo um de cada vez para a padronização. Até agora, trouxe uma funcionalidade menor desse trabalho em andamento, o operador de comparação de spaceship, descrito no meu documento P0515; que foi aprovado nos grupos de evolução e está entrando na revisão padrão da redação em nossa próxima reunião em novembro, e se tudo correr bem, poderia ser parte do rascunho C++20 em breve. O segundo, que é maior e muito mais experimental a longo prazo, é o trabalho de metaclasses descrito no meu documento P0707 e na minha sessão CppCon 2017 que você pode encontrar no YouTube.

Tenho a esperança de que muitos dos meus colegas membros do comitê também possam se juntar a mim para se concentrar na simplicidade. É divertido adicionar pequenos recursos aqui e ali de forma isolada, mas isso também cria o perigo de tornar a linguagem um acúmulo de soluções parciais com inconsistências potenciais. Eu acho que há tanto valor que ainda podemos oferecer na simplificação de código que desenvolvedores C++ escrevem atualmente e encontrar maneiras importantes de fazer isso é parte integrante da visão ampla e baseada em princípios da linguagem. Como mencionei no início, os recursos mais importantes no C++11, C++14 e acho que provavelmente no C++17 também não eram necessariamente as "coisas grandes", mas sim as pequenas coisas que faziam todos os dias os códigos mais simples de se escrever. Agora, temos uma oportunidade muito grande à nossa frente para direcionar especificamente a simplicidade não apenas com pequenas limpezas, mas com uma maior simplificação, e estou cautelosamente otimista de que isso possa oferecer melhorias grandes e bem-vindas no C++. lembre-se de que Bjarne Stroustrup sempre disse que dentro do C++ havia uma linguagem menor e mais simples que lutava para sair, literalmente 1/10 da complexidade de C++, se pudéssemos começar de novo. Claro, não podemos simplesmente fazer isso (seria um exercício Objective-C-to-Swift), mas acredito que pode haver um caminho para obter uma grande parte dessa simplificação para o código C++ e possivelmente ao longo do tempo para a linguagem em si, mas de forma incremental e com uma visão de longo prazo. Veremos, mas, mesmo que possamos chegar a meio caminho, será uma enorme e dramática melhoria.

Às vezes as pessoas perguntam: "por que a padronização não é mais rápida?". O comitê C++ sabe que é preciso tempo e cuidado para evoluir uma linguagem usada por cerca de 4,5 milhões de programadores, e isso é baseado essencialmente em todas as principais empresas e em vários bilhões de linhas de código em todos os tipos de software desde infra-estrutura crítica à aplicações finais (incluindo compiladores de outros idiomas). "Mover rápido e quebrar as coisas" definitivamente não se aplica aqui; nosso trabalho no ISO C++ é levar este enorme ecossistema para a frente, não deixá-lo para trás - por mais brilhante que seja o objeto que gostaríamos de perseguir, mas está fora do nosso caminho. "Avançar com a melhoria sistemática de princípios" está mais próximo de um mantra apropriado em nosso caso. Lembre-se da máxima de que as pessoas geralmente superestimam e o que podemos fazer em dois anos e subestimamos o que podemos conseguir em 10 anos. Estou cautelosamente otimista de que a maxima se possa aplicar aqui também, enquanto continuamos a evoluir o C++ e torná-lo melhor na próxima década.

Herb Sutter é uma autoridade em desenvolvimento de software e autor de vários livros, incluindo padrões de codificação C++ e C++ excepcionais. Sutter serviu por 15 anos como presidente do comitê de padrões ISO C++ e é um arquiteto de software na Microsoft, onde liderou o projeto de extensão de linguagem de C++/CLI, C++/CX. C++ AMP e outras tecnologias.

Avalie esse artigo

Relevância
Estilo/Redação

Conteúdo educacional

BT