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 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 Compilers - Tools - Plugins Executables Inputs •C++ •Native •MSIL •Mixed mode Phoenix IR Code Analysis and Transformation Profiles, Patterns, Obfuscation, etc.. •x86 •x64 •ARM •IA64 •MDIL •… 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 void main(int argc, char** argv) { char * message; if (argc > 1) message = "Hello, World\n"; else message = "Goodbye, World\n"; printf(message); } 9 Phoenix IR $L1: (references=0) {*StaticTag}, {*NotAliasedTag} = START _main(T) _main: (references=1) _argc, _argv = ENTERFUNCTION t273 = COMPARE(GT) _argc, 1 CONDITIONALBRANCH(True) t273, $L7, $L6 $L7: (references=1) _message = ASSIGN &$SG3745 GOTO $L8 $L6: (references=1) _message = ASSIGN &$SG3747 GOTO $L8 $L8: (references=2) {*CallTag} = CALL* &_printf, _message, {*CallTag}, $L5(EH) RETURN 0, $L3(T) $L5: (references=1) UNWIND $L3: (references=1) EXITFUNCTION $L2: (references=0) END {*StaticTag} 10 #4 #4 #4 #4 #7 #7 #7 #8 #9 #9 #10 #10 #10 #12 #13 #13 #13 #13 #13 #13 #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) le2c.exe ilasm.exe JIT compiler • Compilador Phoenix le1c.exe 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. 14 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 Edgar José César de Figueiredo Neto - [email protected] Construção de Compiladores para MSIL usando Microsoft Phoenix