• Nenhum resultado encontrado

REPL de µjava. António Menezes Leitão 15 de Abril de 2009

N/A
N/A
Protected

Academic year: 2021

Share "REPL de µjava. António Menezes Leitão 15 de Abril de 2009"

Copied!
8
0
0

Texto

(1)

REPL de µJava

Ant´

onio Menezes Leit˜

ao

15 de Abril de 2009

1

Introdu¸

ao

´

E usual pensar-se que as linguagens estaticamente tipificadas, como o Java, n˜ao s˜ao adequadas para os processos de desenvolvimento incrementais e interactivos t´ıpicos das linguagens dinamicamente tipificadas, como o Lisp. Felizmente, isso n˜ao ´e necessariamente verdade e ´e geralmente poss´ıvel providenciar um pro-cesso interactivo do tipo read-eval-print-loop (REPL) adaptado `as linguagens estaticamente tipificadas.

Neste projecto pretende-se precisamente que crie um REPL para um sub-conjunto da linguagem Java denominado µJava.

Nas pr´oximas sec¸c˜oes definimos a sintaxe e semˆantica da linguagem µJava e explicamos o funcionamento do REPL.

2

µJava

A linguagem µJava ´e uma vers˜ao procedimental da linguagem Java. Do ponto de vista l´exico, as linguagens s˜ao indistinguiveis. Do ponto de vista sint´atico, a linguagem µJava pode ser vista como uma vers˜ao reduzida de Java que apenas permite:

• Defini¸c˜ao de vari´aveis. • Defini¸c˜ao de fun¸c˜oes. • Instru¸c˜oes.

• Express˜oes.

• Importa¸c˜oes de packages e de membros est´aticos.

Nas sec¸c˜oes seguintes iremos detalhar alguns aspectos da linguagem µJava.

2.1

Tipos

A linguagem µJava tem exactamente os mesmos tipos que a linguagem Java, incluindo tipos primitivos (int, long, void, etc.) e tipos referˆencia. Os tipos referˆencia que n˜ao perten¸cam ao package java.lang necessitam de ser qualifica-dos com o package respectivo, excepto se previamente se importar esse package (ver sec¸c˜ao 3).

Os tipos s˜ao usados em v´arios contextos e, em particular, na declara¸c˜ao de vari´aveis e de fun¸c˜oes.

(2)

2.2

Literais

A linguagem µJava emprega os mesmos literais que a linguagem Java. No entanto, n˜ao s˜ao feitas coer¸c˜oes autom´aticas, o que implica que os literais tˆem de corresponder rigorosamente ao tipo esperado. Assim, para atribuirmos o n´umero 1 a uma vari´avel ou parˆametro de tipo long temos de empregar o literal 1l ou 1L. Do mesmo modo, para atribuirmos o n´umero 1 a uma vari´avel ou parˆametro de tipo float temos de empregar o literal 1.0f ou 1.0F.

2.3

Defini¸

ao de Vari´

avel

A sintaxe da defini¸c˜ao de vari´avel em µJava ´e: tipo nome = express~ao;

Note que a defini¸c˜ao de uma vari´avel implica a imediata especifica¸c˜ao do seu valor inicial. A t´ıtulo de exemplo, considere a seguinte interac¸c˜ao:

> int foo = 1; > foo 1 > foo = foo + 1 2 > foo++ 2 > ++foo 4

O ˆambito da defini¸c˜ao de vari´avel inclui todas as defini¸c˜oes, instru¸c˜oes e express˜oes seguintes at´e a vari´avel ser redefinida. Note-se que fun¸c˜oes definidas no seu ˆambito “capturam” as vari´aveis que estiverem vis´ıveis no momento da defini¸c˜ao da fun¸c˜ao, mesmo que essa vari´avel seja redefinida de seguida. A seguinte interac¸c˜ao demonstra este comportamento:

> int bar = 0;

> int getBar() { return bar; }

> void setBar(int value) { bar = value; } > getBar() 0 > double bar = 3.14159; > getBar() 0 > setBar(5); > bar 3.14159 > getBar() 5

Note, na interac¸c˜ao anterior, que apesar da redefini¸c˜ao da vari´avel bar, as fun¸c˜oes getBar e setBar continuam a aceder `a defini¸c˜ao anterior pois era essa que estava vis´ıvel no momento da sua defini¸c˜ao.

(3)

2.4

Defini¸

ao de Fun¸

ao

A sintaxe da defini¸c˜ao de fun¸c˜ao em µJava ´e idˆentica `a da defini¸c˜ao de m´etodos em Java (mas omitindo os qualificadores):

tipo nome(par^ametros) { instru¸c~oes }

Os par^ametros e as instru¸c~oes seguem exactamente a mesma sintaxe que em Java. Eis um exemplo da defini¸c˜ao e utiliza¸c˜ao de fun¸c˜oes:

> int fact (int n) { return (n == 0) ? 1 : n * fact(n - 1); } > fact(3)

6

Naturalmente, as instru¸c~oes podem ser outras, por exemplo:

> int fact (int n) { if (n == 0) return 1; else return n * fact(n - 1); } > fact(4)

24

> int fact (int n) { int r = 1; for(; n > 0; n--) r *= n; return r; } > fact(5)

120

> int fact (int n) { int r = 1; while(n > 0) r *= n--; return r; } > fact(6)

720

Tal como acontece com as vari´aveis, o ˆambito de uma fun¸c˜ao inclui todas as defini¸c˜oes, instru¸c˜oes e express˜oes seguintes at´e a fun¸c˜ao ser redefinida. Note-se que a defini¸c˜ao de uma fun¸c˜ao “captura” as fun¸c˜oes e vari´aveis que estejam vis´ıveis no momento da defini¸c˜ao da fun¸c˜ao, independentemente dessas fun¸c˜oes e vari´aveis serem redefinidas de seguida. A seguinte interac¸c˜ao demonstra este comportamento: note que todas as referˆencias livres de uma fun¸c˜ao s˜ao resolvi-das no momento da defini¸c˜ao.

> int foo() { return 1; } > int bar() { return foo(); } > bar()

1

> int foo() { return 2; } > foo()

2 > bar() 1

Este comportamento, como ´e natural, impede a defini¸c˜ao de fun¸c˜oes mutu-amente recursivas. A excep¸c˜ao, como demonstrado com a fun¸c˜ao fact, s˜ao as fun¸c˜oes (simplesmente) recursivas que podem ser definidas sem problemas.

2.5

Express˜

ao

O aspecto mais relevante de uma express˜ao ´e o facto de ter um valor que ´e escrito pelo REPL. Em tudo o resto, uma express˜ao em µJava ´e idˆentica a

(4)

uma express˜ao Java. Isto implica que uma express˜ao em µJava inclui acesso e atribui¸c˜ao de vari´aveis, incrementos, invoca¸c˜oes de fun¸c˜oes, invoca¸c˜oes de m´etodos das APIs do Java, etc.

A seguinte interac¸c˜ao mostra alguns exemplos de express˜oes: > 1 1 > 1 + 2 3 > 123 * 456 56088 > "Foo" "Foo" > "Foo" + "Bar" "FooBar" > Math.sin(Math.PI/2) 1.0

2.6

Instru¸

ao

Uma instru¸c˜ao em µJava ´e simplesmente a invoca¸c˜ao de uma fun¸c˜ao previamente definida ou a invoca¸c˜ao de um m´etodo das APIs de Java ou, no caso mais simples, uma express˜ao cujo valor ´e descartado. Do ponto de vista sint´atico, uma instru¸c˜ao tem a mesma sintaxe de uma express˜ao mas termina sempre com um ponto-e-v´ırgula. Semanticamente, uma instru¸c˜ao implica a realiza¸c˜ao dos efeitos secund´arios associados e, no caso de existir, o descartar do valor resultante.

A seguinte interac¸c˜ao mostra, ap´os a defini¸c˜ao da vari´avel str, trˆes ins-tru¸c˜oes: > String str = ""; > str += "Hello"; > str += ",World!"; > System.out.println(str); Hello,World!

Note que o REPL nunca escreve o resultado de uma instru¸c˜ao pois uma instru¸c˜ao n˜ao tem resultado, s´o tem efeitos secund´arios. Note tamb´em que todas as express˜oes podem ser tratadas como instru¸c˜oes:

> 1+2;

> str += " I’m back!" "Hello,World! I’m back!"

Note que nem todas as instru¸c˜oes s˜ao exemplos de express˜oes sufixadas de ponto-e-v´ırgula: no caso de fun¸c˜oes (ou m´etodos das APIs do Java) cujo tipo de retorno ´e void, as suas invoca¸c˜oes apenas pode ser realizada por instru¸c˜oes, nunca por express˜oes.

(5)

3

Importa¸

ao de Package

´

E usual que as APIs Java estejam organizadas num sistema de packages. Cada classe tem, consequentemente, de ser qualificada com o package a que pertence.1

Eis um exemplo:

> javax.swing.JFrame frame = new javax.swing.JFrame("My Frame"); > java.awt.Container content = frame.getContentPane();

> content.add(new javax.swing.JButton("Hello, World!")); > frame.setSize(300,100);

> frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); > frame.setVisible(true);

Para simplificar a utiliza¸c˜ao de APIs do Java, a linguagem µJava prevˆe a importa¸c˜ao de packages. Isso ´e feito pela instru¸c˜ao especial import cuja sintaxe ´

e:

import package;

Usando esta instru¸c˜ao, o exemplo anterior pode ser simplificado para > import java.awt;

> import javax.swing;

> JFrame frame = new JFrame("My Frame"); > Container content = frame.getContentPane(); > content.add(new JButton("Hello, World!")); > frame.setSize(400,150);

> frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); > frame.setVisible(true);

4

Importa¸

ao de Membros Est´

aticos

A utiliza¸c˜ao de m´etodos e fields est´aticos das APIs do Java ´e, por agora, ligei-ramente inconveniente. O seguinte exemplo demonstra-o:

> Math.max(Math.cos(Math.PI),Math.sin(Math.E)) 0.41078129050290885

Para simplificar esta utiliza¸c˜ao, a linguagem µJava prevˆe a importa¸c˜ao dos membros est´aticos de uma classe. Isso ´e feito pela instru¸c˜ao static import cuja sintaxe ´e:

static import class;

Usando esta instru¸c˜ao, o exemplo anterior pode ser simplificado para > static import java.lang.Math;

> max(cos(PI),sin(E)) 0.41078129050290885

1Como j´a poder´a ter reparado nos exemplos apresentados, µJava considera as classes do package java.lang como excep¸c˜oes pois essas n˜ao precisam de qualifica¸c˜ao.

(6)

4.1

REPL

A linguagem µJava destina a uso interactivo, pelo que ´e fundamental o dispo-nibilizar de um read-eval-print-loop. No entanto, dado que a linguagem suporta v´arias opera¸c˜oes que n˜ao produzem output, a fase de print apenas ´e realizada ap´os a avalia¸c˜ao das express˜oes. Este comportamento est´a bem vis´ıvel nos exemplos anteriores.

Relativamente ao output da fase de print, dever´a ter em conta que para os valores de tipos primitivos e do tipo String dever´a ser empregue a mesma sintaxe que ´e usada para descrever os seus literais. Para todos os outros valores ser´a escrita a sua representa¸c˜ao tal como produzida pelo m´etodo toString. A t´ıtulo de exemplo, considere:

> 123 123 > 123l 123L > 1.0 1.0 > 1e1 10.0 > 1e2f 100.0F > 1e10f 1.0E10F > 1e20 1.0E20 > "Foo" "Foo" > ’F’ ’F’ > new Object() java.lang.Object@15a8767 > new java.math.BigDecimal("123456789012345678901234567890.1234567890") 123456789012345678901234567890.1234567890

5

Objectivos

Pretende-se que implemente uma aplica¸c˜ao Java que, com a ajuda do Javassist, constitua um REPL de µJava. O REPL dever´a ser iniciado pelo m´etodo est´atico main da classe ist.leic.pa.MJava.

Para simplificar o processo de an´alise l´exica e sint´atica, considere que todas as defini¸c˜oes, express˜oes, instru¸c˜oes e importa¸c˜oes ocupam uma linha cada, tal como se pode verificar em todos os exemplos apresentados.

5.1

Extens˜

oes

Se pretender, pode fazer as extens˜oes que achar apropriadas que possam valo-rizar ainda mais o seu trabalho. Tenha em conta que essa valoriza¸c˜ao ser´a, no

(7)

m´aximo, de dois valores a somar `a nota que obtiver pela implementa¸c˜ao do que foi pedido nas outras sec¸c˜oes.

Algumas das extens˜oes que poder˜ao ser interessantes s˜ao: • Rastreio de fun¸c˜oes.

• Permitir que o input para o REPL possa ser dado em v´arias linhas e n˜ao em apenas uma.

• Suporte para fun¸c˜oes com recurs˜ao m´utua. • Defini¸c˜ao de classes e m´etodos.

6

odigo

O c´odigo desenvolvido dever´a estar escrito no melhor estilo que for poss´ıvel, permitindo a sua f´acil leitura e dispensando excessivos coment´arios. ´E sem-pre sem-prefer´ıvel ter c´odigo mais claro com poucos coment´arios do que ter c´odigo obscuro com muitos coment´arios.

O c´odigo dever´a ser modular, divido em funcionalidades com responsabili-dades espec´ıficas e reduzidas. Cada m´odulo dever´a ter um curto coment´ario a descrever o seu objectivo.

7

Apresenta¸

ao

N˜ao se pretende que fa¸ca um relat´orio do seu trabalho mas sim uma apresenta¸c˜ao p´ublica. Esta dever´a ser preparada para ter 10 minutos de dura¸c˜ao (aproxima-damente 5 slides), dever´a centrar-se nas op¸c˜oes arquitecturais tomadas e poder´a incluir os detalhes que considere relevantes. Pretende-se que consiga “vender” a sua solu¸c˜ao ao seus colegas e ao corpo docente.

8

Formato da entrega

O projecto ´e entregue por via electr´onica atrav´es do Portal F´enix. Cada grupo dever´a entregar um ´unico ficheiro comprimido em formato ZIP, com o nome mjava.zip. Este ficheiro dever´a conter:

• o c´odigo fonte desenvolvido,

• o ficheiro com os slides da apresenta¸c˜ao do trabalho,

• um ficheiro build.xml para compilar o c´odigo Java e gerar o mjava.jar. O formato aceite para os slides de apresenta¸c˜ao do trabalho ´e o PDF. O ficheiro com a apresenta¸c˜ao tem de estar na ra´ız do ficheiro ZIP e tem de ter o nome p2.pdf.

O ficheiro build.xml ´e um ficheiro de Ant (http://ant.apache.org) e deve produzir na mesma localiza¸c˜ao o ficheiro mjava.jar com todo o c´odigo Java necess´ario para executar o inspector desenvolvido, como descrito anteriormente. O alvo de omiss˜ao do build.xml deve efectuar o trabalho descrito, ou seja, simplesmente executar numa shell

(8)

$ ant

deve produzir o resultado esperado (mjava.jar).

9

Avalia¸

ao

Os crit´erios de avalia¸c˜ao incluem:

• A qualidade das solu¸c˜oes desenvolvidas. • A clareza dos programas desenvolvidos. • A qualidade da apresenta¸c˜ao p´ublica.

Em caso de d´uvidas, o corpo docente poder´a pedir explica¸c˜oes sobre o fun-cionamento do projecto desenvolvido, inclu´ındo eventuais demonstra¸c˜oes.

10

Pl´

agio

Considera-se pl´agio o uso de quaisquer fragmentos de programas que n˜ao tenham sido fornecidos pelos docentes da disciplina. N˜ao se considera pl´agio o uso de ideias cedidas por terceiros desde que seja feita a devida atribui¸c˜ao.

Esta disciplina segue normas muito r´ıgidas relativamente ao pl´agio. Quais-quer projectos que sejam considerados plagiados ser˜ao anulados, independente-mente de quem plagiou e de quem tiver sido plagiado, independenteindependente-mente de o pl´agio ter sido autorizado, ou n˜ao, pela parte plagiada.

Isto n˜ao dever´a ser impedimento para a troca salutar de ideias e para a normal camaradagem e entreajuda que deve existir entre colegas. Contudo, sugese que nunca cedam fragmentos de programas sob pena de quem os re-cebe n˜ao os entender e se limitar a plagi´a-los com maior ou menos esfor¸co de “camuflagem.”

11

Notas Finais

N˜ao se esque¸ca da Lei de Murphy.

12

Prazos

O c´odigo e os slides da apresenta¸c˜ao dever˜ao ser entregues via f´enix, at´e `as 19:00 do dia 11 de Maio.

As apresenta¸c˜oes ir˜ao decorrer nas aulas pr´aticas seguintes `a entrega. Ape-nas um elemento do grupo ir´a fazer a apresenta¸c˜ao que n˜ao poder´a exceder os 10 minutos. Esse elemento ser´a escolhido pelo docente no momento da apre-senta¸c˜ao.

Referências

Documentos relacionados

O CES é constituído por 54 itens, destinados a avaliar: (a) cinco tipos de crenças, a saber: (a1) Estatuto de Emprego - avalia até que ponto são favoráveis, as

Os resultados são apresentados de acordo com as categorias que compõem cada um dos questionários utilizados para o estudo. Constatou-se que dos oito estudantes, seis

O objetivo do curso foi oportunizar aos participantes, um contato direto com as plantas nativas do Cerrado para identificação de espécies com potencial

Os principais objectivos definidos foram a observação e realização dos procedimentos nas diferentes vertentes de atividade do cirurgião, aplicação correta da terminologia cirúrgica,

psicológicos, sociais e ambientais. Assim podemos observar que é de extrema importância a QV e a PS andarem juntas, pois não adianta ter uma meta de promoção de saúde se

Dessa forma, a partir da perspectiva teórica do sociólogo francês Pierre Bourdieu, o presente trabalho busca compreender como a lógica produtivista introduzida no campo

São considerados custos e despesas ambientais, o valor dos insumos, mão- de-obra, amortização de equipamentos e instalações necessários ao processo de preservação, proteção

Ficou com a impressão de estar na presença de um compositor ( Clique aqui para introduzir texto. ), de um guitarrista ( Clique aqui para introduzir texto. ), de um director