Upload
internet
View
107
Download
2
Embed Size (px)
Citation preview
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]