Construção de Compiladores para MSIL usando Microsoft Phoenix

20
Construção de Compiladores para MSIL usando Microsoft Phoenix Edgar José César de Figueiredo Neto - [email protected]

description

Edgar José César de Figueiredo Neto - [email protected]. 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 - PowerPoint PPT Presentation

Transcript of Construção de Compiladores para MSIL usando Microsoft Phoenix

Page 1: Construção de Compiladores para MSIL usando Microsoft Phoenix

Construção de Compiladores para MSIL usando Microsoft Phoenix

Edgar José César de Figueiredo Neto - [email protected]

Page 2: 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

2

Page 3: Construção de Compiladores para MSIL usando Microsoft Phoenix

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.

3

Page 4: Construção de Compiladores para MSIL usando Microsoft Phoenix

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

4

Page 5: Construção de Compiladores para MSIL usando Microsoft Phoenix

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

5

Page 6: Construção de Compiladores para MSIL usando Microsoft Phoenix

Como Funciona o Phoenix

Executables•x86•x64•ARM•IA64•MDIL•…

Inputs•C++•Native•MSIL•Mixed mode

Compilers - Tools - Plugins

Code Analysis and Transformation Profiles, Patterns, Obfuscation, etc..

PhoenixIR

Page 7: Construção de Compiladores para MSIL usando Microsoft Phoenix

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

7

Page 8: Construção de Compiladores para MSIL usando Microsoft Phoenix

Phoenix IR

• Entidades Representadas:– Tipos– Funções– Símbolos– Instruções– Operandos– ...

8

Page 9: Construção de Compiladores para MSIL usando Microsoft Phoenix

Phoenix IR

9

void main(int argc, char** argv){ char * message;

if (argc > 1) message = "Hello, World\n"; else message = "Goodbye, World\n";

printf(message);}

Page 10: Construção de Compiladores para MSIL usando Microsoft Phoenix

Phoenix IR

10

$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

Page 11: Construção de Compiladores para MSIL usando Microsoft Phoenix

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

11

Page 12: Construção de Compiladores para MSIL usando Microsoft Phoenix

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)

12

Page 13: Construção de Compiladores para MSIL usando Microsoft Phoenix

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

13

Page 14: Construção de Compiladores para MSIL usando Microsoft Phoenix

Comparação

• Compiladores Haskell (2004.1)

14

ilasm.exele2c.exe

le1c.exe

JIT compiler

• Compilador PhoenixA 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.

Page 15: Construção de Compiladores para MSIL usando Microsoft Phoenix

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

15

Page 16: Construção de Compiladores para MSIL usando Microsoft Phoenix

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 )

16

Page 17: Construção de Compiladores para MSIL usando Microsoft Phoenix

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

17

Page 18: Construção de Compiladores para MSIL usando Microsoft Phoenix

Dúvidas?

18

Page 19: Construção de Compiladores para MSIL usando Microsoft Phoenix

Agradecimentos

• Guilherme Amaral Avelino ([email protected])• Andy Ayers (Arquiteto chefe do Phoenix)

19

Page 20: Construção de Compiladores para MSIL usando Microsoft Phoenix

Construção de Compiladores para MSIL usando Microsoft Phoenix

Edgar José César de Figueiredo Neto - [email protected]