Mobilidade para Linguagem Orientada a Objetos 1 Dimitri Malheiros Évisson Lucena Paulo Moura Tópicos Abordados Introdução Linguagem JCSP Implementação de Mobilidade de Canais em LOO1 Dificuldades BNF Classes Introdução Extensão da Linguagem Orientada a Objetos 1 (LOO1) Extensão de projeto desenvolvido anteriormente Mobilidade, concorrência e canais de comunicação Conceitos presentes nas linguagens pi-calculus e CSP Sintaxe e modo de operação semelhante a JCSP JCSP Biblioteca Java que implementa o modelo de comunicação e concorrência de CSP/occam (com restrições) Um canal é um objeto de uma classe que implementa uma das interfaces: ChannelInput ChannelOutput ChannelInputInt ChannelOutputInt JCSP Um canal carrega algum tipo de informação Canais podem levar informação a um processo (output channels), ou trazer informação de um processo (input channels) class P implements CSProcess{ ChannelOutput a; public void run() { a.write(...); } } class Q implements CSProcess{ ChannelInput a; public void run() { x = a.read(); } } JCSP (Send) public class Send { private final ChannelOutputInt chan; private int i; public Send(ChannelOutputInt chan, int i) { this.chan = chan; this.i = i; } public void run() { while (true) { chan.write(i); i = i + 1; } } } JCSP (Read) public class Read { private final ChannelInputInt chan; public Read(ChannelInputInt chan) { this.chan = chan; } public void run() { while (true) { int i = chan.read(); System.out.println(i); } } } JCSP (Main) public class ExampleMain { public static void main (String[] args) { One2OneChannelInt chan = new One2OneChannelInt(); Send send = new Send(chan); Read read = new Read (chan); . . . } } Implementação de Mobilidade de Canais em LOO1 Canais assíncronos Existem três tipos de canais: Canal (canal “principal” passado como parâmetro – pode dar tanto send quanto receive); Input (canal que só pode dar receive); Output (canal que só pode dar send) Os canais são tipados: pode ser qualquer tipo, inclusive o tipo canal Canais são tratados como valores (permite mobilidade) Dificuldades BNF original com problemas Tratamento de canais como valor O código não refletia a BNF do projeto anterior Estudo da LOO1 Mudança de escopo Checa tipos de canais BNF Programa ::= "{" DecClasse ";" Comando "}" Comando ::= Atribuicao | ComDeclaracao | While | IfThenElse | IO | Comando ";" Comando | Skip | New | ChamadaMetodo | ComandoSend | ComandoReceive | ComandoConcorrente | DecCanal BNF Skip ::= ComDeclaracao :: = "{" DecVariavel ";" Comando"}" ComandoConcorrente :: = “concurrent” "(" Comando "," Comando")" ComandoSend :: = “send” LeftExpression "(" Expressao ")" ComandoReceive :: = “receive” LeftExpression "(" LeftExpression ")" While ::= "while" Expressao do" "{" Comando"}" IfThenElse ::= "if" Expressao "then" "{" Comando"}" | "if" Expressao "then" "{" Comando"}" "else" "{" Comando"}" ChamadaMetodo ::= Expressao "." Id "(" ListaExpressao ")" | Expressao "." Id "("")" ListaExpressao ::= Expressao | Expressao "," ListaExpressao New ::= LeftExpression ":=" "new" TipoClasse Atribuicao ::= LeftExpression ":=" Expressao BNF IO ::= "write" "(" Expressao ")" | "read" "(" Id ")" Expressao ::= Valor | ExpUnaria | ExpBinaria | LeftExpression | this Valor ::= ValorConcreto ValorConcreto ::= ValorInteiro | ValorBooleano | ValorString | ValorNull | ValorCanal ExpUnaria ::= "-" Expressao | "not" Expressao | "length" Expressao ExpBinaria ::= Expressao "+" Expressao | Expressao "-" Expressao | Expressao "and" Expressao | Expressao "or" Expressao | Expressao "==" Expressao | Expressao "++" Expressao LeftExpression ::= Id | AcessoAtributo AcessoAtributo ::= LeftExpression.Id | this.Id BNF DecClasse ::= "classe" Id "{" DecVariavel ";" DecProcedimento "}" | DecClasse "," DecClasse DecVariavel ::= Tipo Id "=" Expressao | DecVariavel "," DecVariavel | TipoClasse Id ":=" "new" TipoClasse | DecCanal DecProcedimento ::= "proc" Id "(" ListaDeclaracaoParametro ")" "{" Comando "}" | DecProcedimento "," DecProcedimento DecCanal ::= TipoCanal Id ListaDeclaracaoParametro ::= Tipo Id | Tipo Id "," ListaDeclaracaoParametro Tipo ::= TipoClasse | TipoPrimitivo | TipoCanal BNF TipoClasse ::= Id TipoCanal ::= “channel” “(“ Tipo “)” | “input” “(“ Tipo “)” | “output” “(“ Tipo “)” TipoPrimitivo ::= "string" | "int" | "boolean" Classes alteradas Classes OO1.jj Send.java Receive.java New.java DecVariavelObjeto.java Concorrente.java ContextoExecucao.java DecCanal.java Classes novas ValorCanal.java TipoCanal.java (classe nova) TipoInput.java (classe nova) TipoOutput.java (classe nova) FIM Dúvidas??