Conhecendo a JSR 223: Scripting for the Java Platform

Post on 18-Nov-2014

6,107 views 2 download

description

Palestra ministrada no evento "Café com Tapioca" realizado no dia 23 de janeiro de 2008 pelo CEJUG (Ceará Java User Group)

transcript

Conhecendo a JSR 223:

Scripting for the Java Platform

Christiano M ilfonthttp://w w w.m ilfont.org

Roadmap 1 – Porque outras linguagens? 2 – JVM vs CLR3 – Outras linguagens na JVM

4 – Padronizando com a JSR 2235 – Desvantagens com scripting

Porque outras linguagens?

Declarativo Vs Imperativo

Funcional vs Orientado a objetos

Tipos dinâmicos Vs EstáticosTipos fracos vs Tipos Fortes

Prototype-based Vs Class-based

Porque outras linguagens?

CurryingTail Call

High-order functions

QuineClosureContinuation

Pattern Matching

backtracingThunk

List comprehension

Lambda calculus

Porque outras linguagens?

var consulta = reduce(+, map(*,array,k));

Rotinas funcionais não explicitam a ordem de execução e tem liberdade de executar todas ao mesmo tempo

em paralelo

Porque outras linguagens? DSL – Domain Specific Language

SELECT * FROM TABLE

SGBD controla armazenamento, transação, concorrência, busca... o programador simplesmente escreve

... Todo desenvolvedor que trabalha com web conhece mais de uma linguagem: XML, HTML,CSS

LINQ - C# 3Macro - ExcelABAP - SAP

Porque outras linguagens? Linguagem correta para problema

using System; using System.IO; public class RemoveArquivosVelhos { public static void Main(string[] args) { foreach (FileInfo fi in (new DirectoryInfo (@“\temp\backup”)).GetFiles()) { if (((TimeSpan) (DateTime.Now - fi.LastWriteTime)).Days > 7) { fi.Delete(); } } } }

Usando C#

find /usr -atime +6 -exec rm -f "{}" ";"Usando Bash

Porque outras linguagens? Sem reinventar a roda

Trapaceando com Ruby

def thumbnail(temp, target) system("/usr/local/bin/convert #{escape(temp)} -resize 48x48! #{escape(target)}")end

Porque outras linguagens? DEPLOY

[cmilfont]: Nada, aguarda aí que é rapi10, so o tempo do deploy

[Cliente no gtalk: Gostaria de inserir uma regrinha, demora muito?

[Cliente no gtalk]: O.o

Porque outras linguagens? Tendência

Google uses Python for backends of web apps such as Gmail and GMaps

SimpleDB, Amazon.com's document-based database written in Erlang

Youtube uses Python "to produce maintainable features in record times,

with a minimum of developers"

Fonte: http://en.wikipedia.org

Porque outras linguagens? Dois caminhos

Usar uma linguagem apropriada

Transformar Java em multiparadigmaou

Porque outras linguagens? Java com Closure

...ou melhorar o suporte da JVM às outras linguagens?

Voce quer isso?

<R, T extends java.io.Closeable, throws E>R with(T t, {T=>R throws E} block) throws E { try { return block.invoke(t); } finally { try { t.close(); } catch (IOException ex) {} }}

JVM vs CLR Microsoft tinha a melhor IDE e a melhor JVM...

... Criou sua própria marca aproveitando o “Know how”...

... Suporte a várias linguagens desde o início...

... Forçou o Java correr atrás, varargs, generics, anotações...

... ainda está alguns passos na frente!

A JVM aproveita o maior marketshare...... Já tem mais linguagens do que a CLR ...

... Hoje tem performance superior e considerada a melhor VM...

... JSR 292 - Supporting Dynamically Typed Languages ...

... JSR 223: Scripting for the Java Platform!

JVM vs CLR

Outras linguagens na JVM

JRuby, Jython, Groovy, BeanShell, Pnuts, Jacl (TCL), JudoScript, Rhino, Jaskell, Sleep (Perl), Jelly, AWK, JEP, Jexl, JST, SISC (Scheme), Athena (Smaltalk), Jepp (Python native), Quercus (PHP), BexScript, Jasconn (AppleScript), JavaFX...

List comprehensions

getEvenNumbers aList = [ x | x >- aList, x `mod` 2 = 0]

def getEvenNumbers(l : List[int]) = for { val i <- l i % 2 == 0 } yield i

Jaskell

Scala

Jythondef getEvenNumbers(l): return [x for x in l if x % 2 == 0]

Outras linguagens na JVM

http://jasp.ism.ac.jp/overview-e.html

Java - Network, IO, JNI...

Outras linguagens na JVM

Jasp (Java Based Statistical Processor)

Pnuts - Scripting

Linguagem construída sobre uma outra linguagem de Scripting

Padronizando com a JSR 223

Projeto de pesquisa de Sanjiva Weerawarana no T.J. Watson Research Center da IBM em 1999

Bean Scripting Framework

Em 1999 a IBM doou ou Apache

Cada linguagem tinha sua própria forma de interagir com a JVM criando dependência

Padronizando com a JSR 223

Bean Scripting Framework

BSF criou uma camada única de interação entre o Java e as

outras linguagens

Proliferação de abordagens semelhantes?

Hora de padronizar!

Padronizando com a JSR 223JSR 223

Scripting for the java PlataformAPI padronizada que fornece

uma interface comum a todas as linguagens de scripting

API incluída no Mustang (Java 6)

Implementação no Mustang com Rhino (javascript)

Padronizando com a JSR 223API simples

javax.script.AbstractScriptingEnginejavax.script.Bindingsjavax.script.Compilablejavax.script.CompiledScriptjavax.script.Invocablejavax.script.ScriptContextjavax.script.ScriptEngine;javax.script.ScriptEngineFactoryjavax.script.ScriptEngineManager;javax.script.ScriptException;javax.script.SimpleBindingsjavax.script.SimpleScriptContext

Padronizando com a JSR 223

Descobrindo e instanciando um mecanismo de engine

ScriptEngineManager factory = new ScriptEngineManager();

ScriptEngine engine = factory.getEngineByName("JavaScript");

Padronizando com a JSR 223

Construindo e executando o scriptString [] script = {

"var a = 2;","var b = 3;","var c = a + b;","print(\"a + b = \" + c);"

};engine.eval(script));

Padronizando com a JSR 223

Executando um script em arquivo

String path = NotaFiscal.class.getResource("script.js")

.getPath();

engine.eval(new FileReader(path));

Padronizando com a JSR 223

Trocando variáveis entre o java e o script no mesmo contexto

engine.put("total", this.total);String path = getArquivo();engine.eval(new FileReader(path));this.total = (Double) engine.get("total");

Padronizando com a JSR 223

Compilando o script

ScriptEngine e = ...CompiledScript cs = ((Compilable) e)

.compile(statement);cs.eval();

Desvantagens com scripting

PerformanceSintaxes extranhas

DebugMais pontos de manutençãoPouco pessoal qualificadoAprender muitos paradigmas *

* Deveria ser vantagem mas é o terror dos Code Monkeys

Fim!Mais em:

http://www.milfont.org