200 likes | 323 Views
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
E N D
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 • 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.
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
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
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..
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
Phoenix IR • Entidades Representadas: • Tipos • Funções • Símbolos • Instruções • Operandos • ...
Phoenix IR void main(int argc, char** argv) { char * message; if (argc > 1) message = "Hello, World\n"; else message = "Goodbye, World\n"; printf(message); }
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
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
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)
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
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
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
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 )
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
Agradecimentos • Guilherme Amaral Avelino (gaa@cin.ufpe.br) • Andy Ayers (Arquiteto chefe do Phoenix)
Edgar José César de Figueiredo Neto - ejcfn@cin.ufpe.br Construção de Compiladores para MSIL usando Microsoft Phoenix