1 / 20

Construção de Compiladores para MSIL usando Microsoft Phoenix

Edgar José César de Figueiredo Neto - ejcfn@cin.ufpe.br. Construção de Compiladores para MSIL usando Microsoft Phoenix. O projeto. Proposta Analisar a utilização do Phoenix para construção de compiladores para MSIL integrando as linguagens LE1, LE2 e LF1 para .NET. O projeto. Objetivos

oya
Télécharger la présentation

Construção de Compiladores para MSIL usando Microsoft Phoenix

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Edgar José César de Figueiredo Neto - ejcfn@cin.ufpe.br Construção de Compiladores para MSIL usando Microsoft Phoenix

  2. O projeto • Proposta • Analisar a utilização do Phoenix para construção de compiladores para MSIL integrando as linguagens LE1, LE2 e LF1 para .NET

  3. O projeto • Objetivos • Analisar a viabilidade de se construir compiladores para MSIL usando o Microsoft Phoenix • Contribuir com a comunidade do Microsoft Phoenix, disponibilizando o resultado do projeto como exemplo prático. • Viabilizar a integração com a plataforma .NET de modo que haja interoperabilidade entre as linguagens dessa disciplina com linguagens como C#, VB.NET, etc. • Comparar os resultados do uso Phoenix com os obtidos por projetos anteriores que já construíram compiladores destas linguagens para MSIL, porém construídos em Haskell.

  4. Apresentação parcial • Hoje: • Breve apresentação do Microsoft Phoenix • Comparação com o projeto de 2004.1 • Compilador Linguagem de Expressões 1 • Dificuldades encontradas • Próxima apresentação • Compilador Linguagem de Expressões 2 • Compilador Linguagem Funcional 1 • Considerações finais

  5. Apresentação do Phoenix • Phoenix é o codinome para a futura tecnologia da Microsoft para construção de compiladores • Atualmente está em fase de pesquisa e desenvolvimento pela Microsoft Research • Uma nova versão é lançada a cada 6 meses

  6. Como Funciona o Phoenix Compilers - Tools - Plugins • Executables • x86 • x64 • ARM • IA64 • MDIL • … • Inputs • C++ • Native • MSIL • Mixed mode PhoenixIR Code Analysis and TransformationProfiles, Patterns, Obfuscation, etc..

  7. Phoenix IR • Representação fortemente tipada • Vários níveis de abstração • HIR (High-level IR) – totalmente independente • MIR (Mid-level IR) – dependente do ambiente de execução • LIR (Low-lever IR) – totalmente dependente • EIR (Encoded IR) – código binário • Representa todo o fluxo de dados e instruções do código

  8. Phoenix IR • Entidades Representadas: • Tipos • Funções • Símbolos • Instruções • Operandos • ...

  9. Phoenix IR void main(int argc, char** argv) { char * message; if (argc > 1) message = "Hello, World\n"; else message = "Goodbye, World\n"; printf(message); }

  10. Phoenix IR $L1: (references=0) #4 {*StaticTag}, {*NotAliasedTag} = START _main(T) #4 _main: (references=1) #4 _argc, _argv = ENTERFUNCTION #4 t273 = COMPARE(GT) _argc, 1 #7 CONDITIONALBRANCH(True) t273, $L7, $L6 #7 $L7: (references=1) #7 _message = ASSIGN &$SG3745 #8 GOTO $L8 #9 $L6: (references=1) #9 _message = ASSIGN &$SG3747 #10 GOTO $L8 #10 $L8: (references=2) #10 {*CallTag} = CALL* &_printf, _message, {*CallTag}, $L5(EH) #12 RETURN 0, $L3(T) #13 $L5: (references=1) #13 UNWIND #13 $L3: (references=1) #13 EXITFUNCTION #13 $L2: (references=0) #13 END {*StaticTag} #13

  11. Phoenix IR • Uma vez que é gerada a IR o Phoenix • Gerencia tabelas de tipos e nomes • Gerencia alocação de memória “stack” e “heap” • Gerencia ambiente de compilação • Pode criar o output para qualquer das plataformas suportadas • Ou pelo menos era isso que deveria fazer 

  12. LE1 e Phoenix • A BNF permaneceu a mesma • A estrutura das classes permaneceu a mesma • Foram adotados alguns padrões de nomenclatura da plataforma .NET • O método avaliar() das classes resulta em um Operador do Phoenix (Phx.IR.Operand)

  13. Comparação • Em 2004.1 a equipe de Furtado, Danzi e Monteiro implementou 3 compiladores em Haskell para LE2, LF1 e LF2 • A abordagem utilizada por eles consistia em gerar um arquivo de texto (“.il”) que depois seria compilado para uma DLL ou um executável

  14. ilasm.exe Comparação • Compiladores Haskell (2004.1) le2c.exe JIT compiler • Compilador Phoenix A maioria dos compiladores MSIL construídos com o Phoenix encontrados usa a abordagem acima, apesar de ser possível construir um assembly diretamente, como fica provado com este projeto. le1c.exe

  15. Demonstração • Demonstração do compilador de LE1 • Construção da gramática com ANTLR • Representação da Linguagem em .NET • Geração de Phoenix IR • Fluxo de instruções do Phoenix

  16. Dificuldades encontradas • Phoenix é uma tecnologia em desenvolvimento, portanto muitos aspectos ainda não foram implementados • Para algumas funcionalidades, é preciso “injetar” LIR (referências a registradores do Framework .NET) no meio do seu código • A comunidade de usuários do Phoenix é muito limitada o que dificulta o acesso a suporte e resolução de dúvidas • Apenas uma pessoa responde as perguntas do fórum oficial (o arquiteto chefe do projeto )

  17. Dificuldades encontradas • Dos poucos compiladores para .NET já construídos com o Phoenix, não foi encontrado nenhum que utilizasse a abordagem desse projeto. • Fluxo completo desde a gramática até a geração de um assembly .NET

  18. Dúvidas?

  19. Agradecimentos • Guilherme Amaral Avelino (gaa@cin.ufpe.br) • Andy Ayers (Arquiteto chefe do Phoenix)

  20. Edgar José César de Figueiredo Neto - ejcfn@cin.ufpe.br Construção de Compiladores para MSIL usando Microsoft Phoenix

More Related