Isso começou como uma pergunta SO, mas percebi que não é convencional e, com base na descrição real nos sites, pode ser mais adequado para programadores.se, já que a pergunta tem muito peso conceitual.
Eu tenho aprendido o LibTooling e é uma ferramenta muito poderosa capaz de expor todo o "detalhe" do código de uma maneira amigável, ou seja, de uma maneira semântica , e também sem adivinhar. Se o clang puder compilar seu código, o clang estará certo sobre a semântica de cada caractere único dentro desse código.
Agora permita-me recuar por um momento.
Existem muitos problemas práticos que surgem quando alguém se engaja na metaprogramação de modelos C ++ (e especialmente quando se aventura além dos modelos no território de macros inteligentes, embora aterradoras). Para ser honesto, para muitos programadores, inclusive eu, muitos dos usos comuns de modelos também são um pouco assustadores.
Eu acho que um bom exemplo seria strings em tempo de compilação . Essa é uma pergunta que já tem mais de um ano, mas está claro que o C ++ a partir de agora não facilita isso para meros mortais. Embora analisar essas opções não seja suficiente para causar náusea para mim, ainda assim, não me sinto confiante sobre a capacidade de produzir código de máquina mágico e maximamente eficiente para se adequar a qualquer aplicativo sofisticado que eu tenha para o meu software.
Quero dizer, vamos ser sinceros, pessoal, as cordas são bem simples e básicas. Alguns de nós querem apenas uma maneira conveniente de emitir código de máquina que tenha certas seqüências "incorporadas" significativamente mais do que conseguimos ao codificá-lo da maneira direta. No nosso código C ++.
Digite clang e LibTooling, que expõe a árvore de sintaxe abstrata (AST) do código-fonte e permite que um aplicativo C ++ simples e simples manipule correta e confiavelmente o código-fonte bruto (usando Rewriter
) ao lado de um rico modelo semântico orientado a objetos de tudo no AST. Ele lida com muitas coisas. Ele conhece as expansões de macro e permite seguir essas cadeias. Sim, estou falando sobre transformação ou tradução de código fonte a fonte.
Minha tese fundamental aqui é que o clang agora nos permite criar executáveis que podem funcionar como os estágios de pré-processador personalizados ideais para o nosso software C ++, e podemos implementar esses estágios de metaprogramação com C ++. Estamos simplesmente constrangidos pelo fato de que esse estágio deve receber uma entrada que seja um código C ++ válido e produzir como saída um código C ++ mais válido. Além disso, quaisquer outras restrições aplicadas pelo seu sistema de compilação.
A entrada deve ser pelo menos muito próxima do código C ++ válido, porque, afinal, clang é o front-end do compilador e estamos apenas bisbilhotando e sendo criativos com sua API. Não sei se existe alguma disposição para poder definir nova sintaxe a ser usada, mas claramente precisamos desenvolver maneiras de analisá-la adequadamente e adicioná-la ao projeto clang para fazer isso. Esperar mais é ter algo no projeto clang que está fora do escopo.
Não é um problema. Eu imagino que algumas funções macro não operacionais possam lidar com essa tarefa.
Outra maneira de analisar o que estou descrevendo é implementar construções de metaprogramação usando o C ++ em tempo de execução, manipulando o AST do nosso código-fonte (graças ao clang e sua API) em vez de implementá-los usando as ferramentas mais limitadas disponíveis na própria linguagem. Isso também traz benefícios claros no desempenho da compilação (cabeçalhos pesados de modelo diminuem a compilação proporcionalmente à frequência com que você os utiliza. Muitas coisas compiladas são cuidadosamente correspondidas e jogadas fora pelo vinculador).
Isso, no entanto, tem o custo de introduzir uma ou duas etapas adicionais no processo de compilação e também no requisito de escrever algum software (reconhecidamente) um pouco mais detalhado (mas pelo menos é o C ++ em tempo de execução simples) como parte de nossa ferramenta .
Essa não é a imagem toda. Estou bastante certo de que existe um espaço muito maior de funcionalidade na geração de código extremamente difícil ou impossível com os principais recursos da linguagem. No C ++, você pode escrever um modelo ou macro ou uma combinação maluca de ambos, mas em uma ferramenta clang, é possível modificar classes e funções de QUALQUER maneira que você possa obter com o C ++, em tempo de execução , enquanto tem acesso total ao conteúdo semântico, além de modelo e macros e tudo mais.
Então, eu estou me perguntando por que todo mundo já não está fazendo isso. Será que essa funcionalidade do clang é tão nova e ninguém está familiarizado com a enorme hierarquia de classes do AST do clang? Não pode ser isso.
Talvez eu esteja subestimando um pouco a dificuldade disso, mas fazer "manipulação de string em tempo de compilação" com uma ferramenta clang é quase criminalmente simples. É detalhado, mas é incrivelmente simples. Tudo o que é necessário é um monte de funções macro não operacionais que são mapeadas para std::string
operações reais reais . O plug-in clang implementa isso buscando todas as chamadas de macro não operacionais relevantes e executa as operações com seqüências de caracteres. Essa ferramenta é inserida como parte do processo de compilação. Durante a compilação, essas chamadas de função de macro não operacional são avaliadas automaticamente em seus resultados e, em seguida, inseridas novamente como strings simples em tempo de compilação no programa. O programa pode ser compilado como de costume. De fato, este programa resultante também é muito mais portátil como resultado, não exigindo um novo compilador sofisticado que suporte C ++ 11.