Construção de Compiladores para MSIL usando Microsoft Phoenix
description
Transcript of 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]
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
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
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
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
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
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
Phoenix IR
• Entidades Representadas:– Tipos– Funções– Símbolos– Instruções– Operandos– ...
8
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);}
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
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
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
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
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.
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
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
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
Dúvidas?
18
Agradecimentos
• Guilherme Amaral Avelino ([email protected])• Andy Ayers (Arquiteto chefe do Phoenix)
19
Construção de Compiladores para MSIL usando Microsoft Phoenix
Edgar José César de Figueiredo Neto - [email protected]