HXL: HX Language
HXL: HX Language
HXL: HX Language
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