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
Download

Construção de Compiladores para MSIL usando Microsoft Phoenix