Este é um plug -in para o GCC, que vincula o Libpython e (espero) permite que você invoca scripts arbitrários de Python de dentro do compilador. O objetivo é permitir que você escreva plugins GCC no Python.
O plug -in é um software livre, licenciado no GPLV3 (ou posterior).
Ainda está no "estágio experimental de prova de conceito"; Espere acidentes e tracebacks (sou novo no interior do GCC, e posso ter entendido coisas mal).
Já é possível usar isso para adicionar erros/avisos adicionais do compilador, por exemplo, verificações específicas do domínio ou análise estática. Um dos meus objetivos para isso é "ensinar" o GCC sobre os erros comuns que as pessoas cometem ao escrever extensões para o CPython, mas pode ser usado, por exemplo, para ensinar a semântica da contagem de referência do GCC sobre o bloqueio do kernel Linux, ou sobre a segurança do sinal nas APIs.
Outras idéias incluem visualizações da estrutura de código. Dada uma instância gcc.CFG , gccutils.render_to_dot(cfg) e gccutils.invoke_dot(cfg) usarão GraphViz e EOG para plotar uma visualização útil de um gráfico de fluxo de controle, mostrando o código -fonte interligado com a representação interna do GIMPLE .
A documentação pode ser vista em:
http://gcc-python-plugin.readthedocs.io/en/latest/index.html
gcc-N-plugin-dev ou gcc-plugin-devel .Eu uso:
fazer
Para construir o plug -in e executar os testes
Você também pode usar:
Faça uma demonstração
para demonstrar os novos erros do compilador.
O desenvolvimento está no x86_64 e não sei até que ponto será compatível com outras arquiteturas.
Ainda não existe um instalador. Em teoria, você deve ser capaz de adicionar esses argumentos à invocação do GCC:
gcc -fplugin = python.so -fplugin-arg-python-script = path_to_script.py outros_args
E faça com que ele execute seu script à medida que o plug -in inicia.
O plug -in adiciona automaticamente o caminho absoluto ao seu próprio diretório ao final de seu sys.path, para que possa encontrar módulos de suporte, como gccutils.py e libcpychecker.
A API exata ainda está em fluxo; Atualmente, você pode se conectar a eventos registrando retornos de chamada, por exemplo, para ser chamado para cada função na fonte em diferentes passes.
Ele expõe vários tipos do GCC como objetos Python, dentro de um módulo "GCC". Você pode ver a API executando:
importar gcc Ajuda (GCC)
De dentro de um script.
Atualmente, são três projetos em um:
gcc-python-* : O plugin para GCC. O ponto de entrada ( init_plugin ) está em gcc-python.c .
libcpychecker e cpychecker.py : uma biblioteca Python (e um script de driver), escrito para o plug -in, no qual estou construindo novos avisos do compilador para ajudar as pessoas a encontrar bugs no código de extensão do CPYTHON.
cpybuilder : um módulo útil para gerar programaticamente o código -fonte C para extensões cpython. Eu uso isso tanto para gerar partes do plug -in do GCC quanto também nos auto -testes para o script cpycHecker. (Inicialmente, tentei usar o Cython para o primeiro, mas embrulhar a hierarquia do tipo "árvore" exigia mais controle programático)
Estilo de codificação: o Python e o GCC têm seu próprio guia de estilo de codificação para C. Eu escolhi seguir o Python's (PEP-7), como prefiro (embora meu código seja reconhecidamente uma bagunça em alguns lugares).
Você encontrará a documentação da API no diretório "docs", escrito no formato reestruturado Text (como esse arquivo, de fato). Se você tiver Sphinx instalado, pode regenerar esses documentos usando:
faça html
dentro do diretório docs . Esfinge é o pacote python-sphinx em uma caixa de fedora/rhel.
A documentação mais detalhada pode ser vista no docs/getting-involved.rst .
Aproveitar! David Malcolm <[email protected]>