13.12.2012 Views

HXL: HX Language

HXL: HX Language

HXL: HX Language

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong><strong>HX</strong>L</strong>: <strong>HX</strong> <strong>Language</strong><br />

Vinicius Tavares Petrucci<br />

setembro/2005


Introdução<br />

● Empresa Engecomp<br />

● Controlador <strong>HX</strong>-600<br />

– Gerenciamento energia<br />

– Entradas e saídas p/ uso geral<br />

– 22.1 Mhz e 512K flash (atende bem)<br />

● Máquina Virtual <strong>HX</strong>-600<br />

– Forma de estender o controlador


Motivação<br />

● Exemplos de extensões<br />

– Controlar a demanda de energia e desligar<br />

as cargas para que não haja estouro<br />

– Monitorar a temperatura do prédio. Se<br />

estiver alta não desligar o ar condicionado<br />

independente da demanda<br />

● Como atender aos requisitos acima?<br />

● Assembler => Máquina Virtual <strong>HX</strong>-600<br />

– Ambiente não muito confortável


Objetivos<br />

● Necessidade de LP mais natural<br />

– Facilidade, legibilidade<br />

● Escolher LP com sintaxe simples<br />

– BASIC-like<br />

● Implementar compilador para LP<br />

– <strong>HX</strong>C (<strong>HX</strong> Compiler) => código p/ <strong>HX</strong>VM


Linguagem <strong><strong>HX</strong>L</strong><br />

● Imperativa, bastante simples<br />

– If, while, for (case-sensitive)<br />

– ±80% da memória do <strong>HX</strong>-600 já usada<br />

– Usuários pouco/nada experientes<br />

● Sintaxe baseada em Pascal<br />

● Características de BASIC<br />

– Sub-rotinas, labels


● Identificadores<br />

Linguagem <strong><strong>HX</strong>L</strong><br />

– [A-Za-z][A-Za-z0-9_]*<br />

● Números inteiros (2 bytes)<br />

– 123, -45<br />

● Strings (usadas como constantes)<br />

tel = “2288884526”; msg = “oi”<br />

sms(tel, msg)


Linguagem <strong><strong>HX</strong>L</strong><br />

● Estrutura de bloco monolítica<br />

– Toda variável num mesmo escopo global<br />

● Case-sensitive<br />

● Comentários estilo C/C++<br />

● Pré-processamento (CPP)<br />

● Funções pré-definidas<br />

wsr(2, 1) // liga saida 2


Linguagem <strong><strong>HX</strong>L</strong><br />

● Declaração de variável na primeira<br />

atribuição<br />

● Cria variável do tipo número de valor 2<br />

(1a atribuição)<br />

>> a = 2<br />

● Altera o tipo para string e valor agora é<br />

"oi"<br />

>> a = "oi"


Linguagem <strong><strong>HX</strong>L</strong><br />

● Prioridade operadores (baixo p/ cima)<br />

or<br />

and<br />

< > = ==<br />

+ -<br />

* / %<br />

not - (unário)


while 1 do<br />

end<br />

Exemplo <strong><strong>HX</strong>L</strong><br />

// se entrada 1 ligada e<br />

// tensão fase 1 do medidor 1 > 220 volts<br />

if er(1) and (rrf(0) > 220) then<br />

end<br />

if not er(2) then // se alarme está liberado<br />

end<br />

wsr(1, 1)


while (1) do<br />

end<br />

a:<br />

call a<br />

b = 3<br />

a = 2<br />

sleep 1000<br />

return<br />

Exemplo <strong><strong>HX</strong>L</strong><br />

b = 2<br />

for i = 0 to 4 do<br />

end<br />

b = b + i<br />

c = b


Abordagem: tradução prévia


<strong>HX</strong>C: <strong>HX</strong> Compiler


Pré-processamento<br />

● Chamado internamente<br />

– Usa o CPP (The C preprocessor)<br />

● Retira comentários estilo C/C++<br />

● Resolve diretivas<br />

– Include, define etc<br />

● Sua saída é a entrada do (F)lex<br />

● Integração CPP com (F)lex<br />

– Marcações: curr_file e yylineno


● (F)lex<br />

Análise<br />

– Gera analisador léxico<br />

● YACC (Bison)<br />

– Gera analisador sintático<br />

– Constrói AST<br />

● AST<br />

– Representação intermediária (IR)


AST: alguns modelos


AST: implementação<br />

a = 1 + 2


Máquina Virtual <strong>HX</strong>-600<br />

● Máquina baseada em pilha<br />

● Vetor de código<br />

● Vetor de variáveis<br />

● Pilha como memória<br />

– Expressões, passagem parâmetro<br />

● Opcodes c/ funções pré-definidas<br />

– OP_SMS, OP_DIAL, OP_CHI etc


Geração de Código<br />

● Percurso na AST<br />

● Templates para comandos<br />

● Backpatching<br />

– Estruturas de controle, call e label<br />

● Sequência de código para <strong>HX</strong>VM<br />

● Formato ASCII (com ref. ao PC)<br />

– Preparado para Montador


Code Template: while


Code Template: for (step)


c = 10<br />

Geração de Código<br />

while c > 0 do<br />

end<br />

c = c - 1<br />

0000: LDC 10<br />

0003: STV 0<br />

0005: LDV 0<br />

0007: LDC 0<br />

0010: GT<br />

0011: JF 25<br />

0014: LDV 0<br />

0016: LDC 1<br />

0019: SUB<br />

0020: STV 0<br />

0022: JP 5<br />

0025: HALT


a = "oi"<br />

sms(123, a)<br />

Geração de Código<br />

sms(321, "ola")<br />

0000: LDC 123<br />

0003: LDS 15<br />

0006: XSMS<br />

0007: LDC 321<br />

0010: LDS 21<br />

0013: XSMS<br />

0014: HALT<br />

0015: STRING "oi"<br />

0018: STRING "ola"


Checagem de Erro<br />

● Erro de sintaxe<br />

>> if a = 2 then end<br />

Error: syntax error, line 1, file ,<br />

near '=' token<br />

● Nomes não definidos<br />

>> a = b + 1 // quem eh b?<br />

Context error: undefined name, line 1, file<br />

, at 'b' token


● Checagem de tipos<br />

>> a = “oi” + 2<br />

<strong>HX</strong>C não faz<br />

– Esse comando não tem sentido, pois strings<br />

são usadas como constantes<br />

● Verificação em funções (número de<br />

argumentos)<br />

– Definição: sms(tel, msg)<br />

>> sms(a, b, c, d) // erro!


Executando <strong>HX</strong>C<br />

vini@buda:~$ hxc -h<br />

hxc: <strong><strong>HX</strong>L</strong> Compiler 1.3.8<br />

usage: hxc [infile] [outfile] [errfile]<br />

vini@buda:~$


Ambiente Programação


Considerações finais<br />

● <strong>HX</strong>C é protótipo: continuar/descartar?<br />

● Otimizador Peephole<br />

● Novo controlador com mais memória<br />

● <strong><strong>HX</strong>L</strong> com mais recursos<br />

– Funções, recursividade, arrays, strings<br />

● Usar Lua/Python como LP<br />

– Open-source<br />

– Extensíveis!


● Engecomp<br />

Referências<br />

http://www.engecomp.com.br<br />

● <strong>HX</strong> Compiler (fonte + executáveis)<br />

http://net.ucam-campos.br/~vinicius/hxc-1.3.8-win.zip

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!