Atenção: esse artigo tem uma palestra complementar. Clique e assista!

De que se trata o artigo:

Uma cobertura do JVM Language Summit 2009, conferência técnica realizada pela Sun que agrega desenvolvedores de VMs, compiladores e linguagens de programação para a plataforma Java.


Para que serve:

Alguns motoristas não se contentam em tirar a carteira de habilitação – precisam saber como tudo funciona por baixo do capô. Afinal, mesmo para quem não pretende “turbinar” seu motor por conta própria, uma boa familiaridade com a tecnologia pode ajudá-lo a usar melhor o veículo. (Sem contar que... é simplesmente muito interessante saber como tudo funciona!)


Em que situação o tema é útil:

No ramo de programação, “saber como o motor funciona” é ainda mais importante, pois a linha que separa as camadas da arquitetura – VM, compiladores, linguagens, framework, aplicação; e ainda mais: CPU, periféricos, sistema operacional, middlewares – é tênue, afinal quase tudo é software, e o conhecimento das camadas “inferiores” é com freqüência indispensável.

Para o leitor adepto de linguagens “alternativas” – qualquer uma que não seja a linguagem Java, afinal estamos na Java Magazine! – o artigo também oferece uma visão importante do suporte da JVM a um leque cada vez maior de linguagens.

No momento em que inicio este artigo, acaba de terminar o JVM Language Summit 2009, realizado pela Sun entre 16 e 18 de Setembro. Este evento ainda não é tão conhecido – está na segunda edição, sendo freqüentado apenas pela elite técnica da comunidade Java: implementadores de JVMs, linguagens e ferramentas para a JVM (e também de outras VMs, inclusive o CLR da plataforma .NET, com uma “participação especial” da Microsoft que deixa as rivalidades de lado e permite a troca de idéias entre competidores).

Neste artigo, uso as apresentações do JVMLS como pretexto para uma exploração das atuais tendências da plataforma Java (e um pouco além). Se você se interessa por tecnologia de VMs, compiladores, linguagens de programação e afins – ou mesmo se não se interessa muito, mas usa estas ferramentas e depende delas para o seu trabalho – me acompanhe.

Sumário da JVMLS

Conferências como a JavaOne possuem centenas de apresentações técnicas, sendo impossível falar de todas elas mesmo que todas tivessem o mesmo grau de interesse. Na JVMLS são pouco mais de 20; posso fazer, então, um resumo de quase todas. Procurei explicar os assuntos cobertos de forma mais acessível do que na linguagem às vezes “somente para PhDs” destes materiais, alguns dos quais tive dificuldade para digerir mesmo após vários anos acompanhando estas tecnologias.

Ao leitor mais avançado, recomenda-se acessar as apresentações originais para maiores informações sobre temas que despertem seu interesse. Alerto, também, que minha cobertura é um tanto desigual, dando mais atenção aos temas que conheço ou me interessam mais, ou que considerei mais importantes. Algumas apresentações com tema muito distante de Java, e não muito interessantes, foram omitidas. Para entrar mais a fundo em qualquer tema, acesse: openjdk.java.net/projects/mlvm/jvmlangsummit.

JDK 7, DaVinci Machine

A conferência começou por uma visão geral das novidades do JDK 7, apresentada por Mark Reinhold, líder dos projetos JDK 7 e Jigsaw.

Começando pelas melhorias da linguagem Java, já falamos do tema em mais de um artigo, mas só recentemente foi consolidada uma lista de novas sintaxes que serão de fato incluídas neste release. Esta lista – do “Project Coin” – inclui:

A sintaxe de “multi-catch” (JavaOne 2008, Edição 59), não entrou na lista. Nem as closures (Closures em Java, Edição 62).

Strings em switch: pode-se fazer switch(var) onde var é do tipo String, e os valores dos case são constantes String;

Automatic Resource Management (ARM): É o que sobreviveu de todo o debate sobre closures: parte de uma das propostas (CICE+ARM). Permite escrever blocos try parametrizados por uma ou mais declarações de inicialização de recurso. Na Listagem 1, estes recursos são os dois arquivos in e out. O ARM garante que o método close() de ambos recursos seja invocado ao final do try, em quaisquer circunstâncias. É equivalente a fazer o close() num finally, com várias vantagens:

o Pode-se usar um único try para qualquer número de recursos;

o Não é preciso escrever o finally com a invocação do close() (com o cuidado de testar se cada recurso é não-null e com o tratamento da exceção do close());

o Não é preciso declarar os recursos antes do try, para que sejam visíveis no finally.

Inferência de tipos genéricos em construtores. Se você tem um Map<String, Map<Integer, List<String>>> map, pode inicializá-lo com map = new HashMap<>(). O operador “diamante” (<>) significa usar os mesmos parâmetros genéricos do tipo estático da variável;

Novas sintaxes para literais integrais. Uma constante byte, short, int ou long pode ser escrita em base binária, como: byte x = 0b11001010; sob medida para escovadores de bits como eu. Pode-se também usar caracteres ‘_’ (sublinhado) em qualquer constante numérica, útil especialmente para separar os milhares em valores grandes; ex.: long c = 299_792_458;

Novas sintaxes para collections. O Java finalmente sai da idade da pedra nesta área, permitindo escrever código como:


  List<String> fimDeSemana = [ "Sábado", "Domingo" ];
  String domingo = fimDeSemana[1];
  Map<Integer, String> bits = { 0: "Zero", 1: "Um" };
  bits[0] = "ZERO"; 

Sintaxes para a JSR-292 (invokedynamic):

o Qualquer string Unicode poderá ser usada como identificador. Basta usar um escape, como: obj.#"~@!"() para executar um método chamado ~@!, escrito numa linguagem que permita tal identificador. (Você também poderá criar tal método em Java, mas devido à sintaxe “feia” com #"...", espero que pouca gente sinta tal tentação!);

o Sintaxe para invocações dinâmicas, ex.: mh.<int>invoke(3) onde mh é um MethodHandle: referência para um método dinamicamente tipado. Ao fazer a invocação só precisamos informar os tipos dos parâmetros passados, no caso apenas um int. Útil para invocar métodos em objetos desenvolvidos em linguagens como Groovy, Ruby, Python, etc.

Listagem 1. Exemplo de Automatic Resource Management (ARM)


  void copy (File src, File dst) throws IOException
  {
    try (InputStream in = new FileInputStream(src);
         OutputStream out = new FileOutputStream(dst))
    {
      byte[] buf = new byte[8192];
      int n;
      while ((n = in.read(buf)) >= 0)
        out.write(buf, 0, n);
    }
  }  ... 

Quer ler esse conteúdo completo? Tenha acesso completo