Módulos C ++ - por que foram removidos do C ++ 0x? Eles vão voltar mais tarde?


110

Acabei de descobrir este antigo rascunho C ++ 0x sobre módulos em C ++ 0x.

A ideia era sair do sistema .h / .cpp atual escrevendo apenas arquivos .cpp que gerariam arquivos de módulo durante a compilação, que por sua vez seriam usados ​​pelos outros arquivos .cpp.

Este parece ser um recurso realmente ótimo.

Mas minha pergunta é: por que eles o removeram do C ++ 0x? Foi por causa de muitas dificuldades técnicas? Falta de tempo? E você acha que eles considerarão trabalhar nisso para uma versão posterior do C ++?

Respostas:


70

Do Estado de C ++ Evolution (Post San Francisco 2008) , a proposta de Módulos foi categorizada como "Rumo a um TR separado:"

Esses tópicos são considerados muito importantes para esperar por outro padrão após C ++ 0x antes de serem publicados, mas muito experimentais para serem finalizados a tempo para o próximo padrão. Portanto, esses recursos serão fornecidos por um relatório técnico na primeira oportunidade.

A proposta de módulos simplesmente não estava pronta e esperar por ela teria atrasado o término do padrão C ++ 0x. Não foi realmente removido, apenas nunca foi incorporado ao papel de trabalho.


89

Rascunho dos Módulos C ++ (Especificação Técnica após C ++ 17)

Um rascunho e várias revisões atualizadas para a especificação do módulo C / C ++ foram publicados por WG21 em open-std.org. Vou criar um link apenas para os documentos mais recentes aqui:

  • Rascunho de trabalho, extensões para C ++ para módulos N4610 (outubro de 2016).
  • Quarta revisão publicada como P0142R0 (março de 2016).
  • Texto para Módulos publicado como P0143R2 (março de 2016).
  • A equipe do clang publicou uma segunda revisão de suas alterações: P0273R1 (outubro de 2016).

As seguintes postagens de blog contêm um resumo das reuniões de padrões e, em particular, um resumo do status atual do esboço dos módulos:

Atualização: conforme explicado no relatório de viagem de Kona que vinculei acima, há atualmente duas propostas concorrentes, uma da Microsoft e uma do Clang. A solução proposta da Microsoft não permite exportar Macros, enquanto a solução da equipe do Clang suportaria a exportação de Macros. Até agora, apenas a Microsoft apresentou formalmente um rascunho para a especificação de um módulo.

Especificação do módulo conforme proposta pela Microsoft

Aqui está uma visão geral rápida dos conceitos mais importantes que esta proposta contém. Como é um rascunho, isso ainda pode mudar. O novo padrão de módulos consistirá, entre outras coisas, no seguinte:

Uma modulepalavra-chave para declarar um módulo, vários arquivos podem declarar isso para construir um módulo (mas para cada módulo, apenas uma unidade de compilação pode conter uma export {}seção):

module M;

Uma importpalavra-chave para importar módulos, em vez importdela, também pode ser decidida em using modulevez disso, então uma nova palavra-chave de importação pode ser evitada.

import std.io;
import module.submodule;

Uma exportsintaxe, que define as declarações públicas que fazem parte deste módulo, declarações de não interface que não devem ser exportadas como parte do módulo, serão definidas fora do bloco de exportação. As declarações podem ser qualquer tipo de declaração em C / C ++, ou seja, não apenas funções, mas também variáveis, estruturas, modelos, namespaces e classes:

export {
    int f(int);
    double g(double, int);

    int foo;

    namespace Calc {
         int add(int a, int b);
    }        
}

void not_exported_function(char* foo);

Uma mudança importante nos módulos será que as macros e as definições do pré-processador serão locais para os módulos e não serão exportadas. Assim, as macros não têm nenhum impacto nos módulos importados:

#define FILE "my/file"
import std.io;   //will not be impacted by the above definition

É importante notar que o sistema de pré-processador atual e os módulos serão capazes de coexistir e os cabeçalhos ainda podem ser usados, por exemplo, para incluir macros.

Para informações mais detalhadas, sugiro ler o rascunho.

Módulos Clang

O Clang está trabalhando na implementação de módulos que podem ser encontrados na página de módulos do clang . No entanto, o clang atualmente não implementa uma sintaxe concreta para os módulos, ou seja, nenhuma das sintaxes mencionadas acima foi implementada pelo Clang. Para explicar isso, a página contém a seguinte declaração:

No momento, não há sintaxe C ou C ++ para declarações de importação. O Clang acompanhará a proposta de módulos no comitê C ++. Consulte a seção Inclui como importações para ver como os módulos são importados hoje.

A parte principal que é implementada atualmente pelo Clang é a "Linguagem de mapa de módulo", que permite escrever mapas de módulo para código existente que ainda usa arquivos de cabeçalho.

Exportações de macro de módulos

Conforme mencionado acima, ainda não está claro se as macroexportações farão parte dos Módulos TS finais . Em P0273R1 a seguinte sintaxe foi proposta para a exportação de macros:

#export define MAX(A,B) ((A) > (B)) ? (A) : (B);

2
Atualização do Rapperswil 2018, existe a proposta mesclada de Gabriel dos Reis e Richard Smith, p1103r0. botondballo.wordpress.com/2018/06/20/…
Dwayne Robinson

32

Clang é o primeiro compilador a começar a trabalhar nos módulos antes mesmo de a padronização ser concluída. Ainda não há muita documentação, mas o código de exemplo pode ser encontrado aqui:
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/

Alguns comentários de Douglas Gregor (o desenvolvedor que os implementa):
http://clang-developers.42468.n3.nabble.com/C-modules-td3619936.html

Em teoria, você pode definir um monte de macros auxiliares como begin_module, end_module, import_module para se proteger de quaisquer mudanças prováveis ​​na sintaxe que ocorrerão no futuro.

EDIT 1:
Douglas Gregor lançou uma apresentação sobre sua implementação:
http://llvm.org/devmtg/2012-11/Gregor-Modules.pdf?=submit

EDIT 2:
O suporte do módulo no clang foi documentado aqui:
http://clang.llvm.org/docs/Modules.html

EDIT 3:
Módulos agora são suportados no compilador C ++ da Microsoft também: http://blogs.msdn.com/b/vcblog/archive/2015/12/03/c-modules-in-vs-2015-update-1. aspx


-39
  1. Porque é uma mudança conceitual muito grande.
  2. Não há necessidade real disso, pois a separação das fontes para h / cpp faz o trabalho
  3. Porque C ++ não define como as bibliotecas de "módulos" reais são construídas. Ele deixa isso para o desenvolvedor do compilador e o vinculador.
  4. "Módulos" às vezes são bastante dependentes da plataforma, por exemplo, DLLs bastante diferentes de objetos compartilhados. Portanto, não é tão trivial mesclar esses conceitos.

78
Certamente há uma necessidade. .h / .cpp é uma solução alternativa ridiculamente ruim e obsoleta. Um sistema de módulos seria uma grande mudança, mas é algo que o comitê padrão aparentemente considera importante.
jalf

13
O modelo de construção do cabeçalho é o que os módulos de problema devem resolver, não a solução. Além disso, os módulos não são uma substituição para DLLs / SOs.
bames53

5
Isso está errado: 1. A proposta do módulo toma muito cuidado para garantir a compatibilidade com versões anteriores do sistema de cabeçalho existente, para que nada seja quebrado quando os módulos forem introduzidos no futuro. 2. A necessidade de reduzir a complexidade do tempo de compilação do módulo de cabeçalho de uma complexidade O (M * N) para O (M + N) está muito bem documentada. 3. O padrão do módulo não ditará como os módulos estão sendo compilados e vinculados, mas adiciona uma semântica clara para separar entre a API privada e pública de um módulo. 4. O formato binário de DLLs ou objetos compartilhados não é afetado pelo padrão.
lanoxx

3
"Não há necessidade real disso, pois a separação das fontes para h / cpp faz o trabalho", assim como a serra elétrica de um dedo injetado, mas isso não significa que não seja um problema! Basta olhar para o .NET ou qualquer outra linguagem mais recente, ter que ordenar as coisas de uma determinada maneira apenas para que possam realmente ser visíveis ou construídas corretamente é um grande fardo que precisa acabar.
paulm
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.