Skip to content

Latest commit

 

History

History
115 lines (84 loc) · 5.18 KB

chapter-10.asc

File metadata and controls

115 lines (84 loc) · 5.18 KB

Java 8 ve JVM Dilleri

Java Sanal Makinesi (JVM), Java 7 ile başlayan Da Vinci Machine projesiyle, özellikle dinamik tipli dilleri JVM üzerinde çalışabilir kılmaktadır.

Sun Microsystem’in ilk adımlarını attığı bu proje, Oracle firmasıyla beraber de önem verilen bir konu olmaya devam etmektedir. JVM içerisinde statik tipli dilleri çalıştırabilmenin birden fazla amacı bulunmaktadır. Bunlar;

  • JIT (Just in Time) Compiler ile yüksek performans sunmak

  • Birçok dilin çalıştırılmasıyla JVM’i Polyglot bir ortam haline getirmek

  • Farklı dil ve ekosistemleri Java ekosistemine yakınlaştırmak

  • Farklı dil ekosistemlerinin gücünü JVM’de birleştirmek

JVM Dilleri

Halihazırda Java Sanal Makinesi üzerinde birçok programlama dili çalıştırılabilmektedir. Bu diller JVM Dilleri Tablosunda olduğu gibidir;

Table 1. JVM Dilleri Tablosu
Dil Uygulayıcı kütüphane

Ada

JGNAT

BBx

BBj is a superset of BBx, PRO/5, and Visual PRO/5.

C

C to Java Virtual Machine compilers

CFML

Adobe ColdFusion

Railo

Open BlueDragon

Common Lisp

Armed Bear Common Lisp

CLforJava

JavaScript

Rhino

Nashorn

Pascal

Free Pascal

MIDletPascal

Perl 6

Rakudo Perl 6

Prolog

JIProlog

TuProlog

Python

Jython

REXX

NetRexx

Ruby

JRuby

Scheme

Bigloo

Kawa

SISC

JScheme

Tcl

Jacl

JVM Dilleri Tablosunda listelenen programlama dilleri JVM bünyesinde koşturulabilmektedir. Bazı diller yorumlama usülüyle koşturulurken, bazıları ise bayt koda dönüştürüldükten sonra koşturulmaktadır. Fakat, JavaScript haricindeki dillere karşılık bir uygulayıcı kütüphaneyi projenize eklemeniz gerekmektedir.

Örneğin JVM üzerinde Ruby dili ile uygulama geliştirmek istiyoranız, JRuby bağımlılığını Java projenize eklemelisiniz.

JRuby Maven Dependency
<dependency>
    <groupId>org.jruby</groupId>
    <artifactId>jruby</artifactId>
    <version>1.7.16</version>
</dependency>

Diğer listeli diller için de benzer biçimde gereken bağımlılık Java projenize eklenmelidir.

Fakat, JavaScript programlama dili için olay biraz farklı bir durumda. Çünkü, Java 7 Rhino, Java 8 ise Nashorn isimli JavaScript motorlarını gömülü olarak JVM içerisinde bulundurmaktadır. Bu Java ekosisteminin JavaScript diline ne kadar önem verdiğini ayrıca göstermektedir.

Java Scripting API

Java programlama dili, tüm bu listeli dilleri koşturabilmek için ortak arayüzlerin bulunduğu bir API sunmaktadır. Java Scripting API bileşenleri javax.script paketi içerisinde bulunmaktadır.

javax.script paketi oldukça basit arayüz ve sınıflar içermektedir.Bunlardan en önemlisi ScriptEngine arayüzüdür.

ScriptEngine

ScriptEngine türünden nesneler, ScriptEngineManager#getEngineByName metodu üzerinden eşsiz bir takma isim ile elde edilmektedir. Bu nesneler ile, String türünden kod blokları koşturulabilmekte, ayrıca Java ile iletişim kurulabilmektedir. Örneğin, Nashorn JavaScript motoru için "nashorn" veya "rhino" takma adları, Ruby için ise "jruby" takma adı kullanılmaktadır.

Örneğin;

...
ScriptEngineManager engineManager = new ScriptEngineManager();

ScriptEngine engine = engineManager.getEngineByName("nashorn"); (1)
ScriptEngine engine = engineManager.getEngineByName("rhino"); (2)
ScriptEngine engine = engineManager.getEngineByName("jruby"); (3)
ScriptEngine engine = engineManager.getEngineByName("jython"); (4)
...
  1. Java 8 için JavaScript motoru

  2. Java 7 için JavaScript motoru

  3. Ruby için JRuby motoru

  4. Python için Jython motoru

Nashorn JavaScript Motoru

Nashorn, Java 8 için özel olarak sıfırdan geliştirilen bir JavaScript motorudur. Nashorn, Rhino JavaScript motoruna göre 5 kat daha fazla performans sunmaktadır.

Nashorn JavaScript motoru EcmaScript 5 standardını desteklemekte ve tüm testlerini başarıyla geçmiş bulunmaktadır.

JVM dillerinden Java Scripting API destekleyenler, ScriptEngine#eval metodu ile kod bloklarını koşturma imkanı elde etmektedir. Bu sayede ortak arayüz bileşenleri üzerinden Java harici diller JVM üzerinde koşturulabilmektedir.

Nashorn Engine Örneği
ScriptEngineManager engineManager = new ScriptEngineManager();

ScriptEngine engine = engineManager.getEngineByName("nashorn"); (1)

engine.eval("function topla(a,b){ return a + b; }"); (2)
String sonuc=(String)engine.eval("topla(3,5);"); (3)
System.out.println(sonuc); // 8
  1. Nashorn Engine elde ediliyor.

  2. topla isimli JavaScript fonksiyonu tanımlanıyor.

  3. topla fonksiyonu Nashorn ile koşturuluyor, ve sonucu elde ediliyor.

Siz de Java Scripting API destekleyen diğer dilleri JVM ekosisteminde koşturabilirsiniz.

Note

Nashorn JS engine JDK 11’de devre dışı bırakıldı. Detaylar: https://openjdk.java.net/jeps/335