Saturday, November 18, 2006

پشتیبانی جاوا از زبان های اسکریپتی (1)

مقدمه

قبلا از ویژگیهای جدید JDK 6 گفتم. یکی از آن ویژگی ها ارتباط جاوا با زبان های اسکریپتی بود. البته پیش از این نیز BSF(Bean Scripting Framework) بصورت غیر رسمی استانداردی را برای تعامل جاوا با زبان های اسکریپتی فراهم می کرد ولی در JDK 6 این اتفاق بطور رسمی در کتابخانه جاوا افتاده است(البته این کتابخانه خیلی شبیه همان BSF هست). در حال حاظر زبان های اسکریپتی بسیار بسیار زیادی به زبان جاوا نوشته شده. از این میان می توان به پیاده سازی های مختلف جاوا اسکریپت، BeanShell (که یک مفسر برای زبان جاوا محسوب می شود)، groovy (دومین زبان استاندارد پلتفرم جاوا)، JRuby (پیاده سازی Ruby به زبان جاوا)، Jyton ( پیاده سازی Pyton به زبان جاوا) و ... (این لیست تا فردا صبح ادامه دارد) اشاره کرد. وجود این همه زبان اسکریپتی به زبان جاوا البته دلایل خاص خود را دارد، اول اینکه این زبان ها از انعطاف و قدرت بسیار بالایی برخوردارند(از لحاظ زبانی) و پیاده سازی آنها به زبان جاوا امکان دسترسی آنها به تمام کتابخانه های موجود در زبان جاوا را فراهم می آورد. دوم اینکه پیاده سازی یک زبان اسکریپتی در زبان جاوا با استفاده از Parser Generator های قدرتمندی مثل Javacc و ANTLR و به مدد استفاده از Java Reflection خیلی کار مشکلی نیست. در هر حال گرچه این زبان ها می توانند به تنهایی مورد استفاده قرار بگیرند ولی تعامل این زبان ها با جاوا امکان بسیار قدرتمند تری است. به این ترتیب می توان قسمت عمده پروژه ها را به زبان جاوا نوشت و تنها آنجاهایی که لازم است دست به دامان زبان های اسکریپتی شد.

یک مثال ساده:

استفاده از یک زبان اسکریپتی در JDK 6 بسیار ساده هست. ابتدا یک نمونه از کلاس javax.script.ScriptEngineManager درست می کنیم، سپس با استفاده از متد getEngineByName یک engine درست می کنیم. خوشبختانه JDK 6 همراه خود یک پیاده سازی از جاوا اسکریپت دارد ولی اگر زبان دیگری نیاز داشتید باید jar file های آن را به classpath اضافه کرده و تنظیمات لازم را انجام دهید. مثال زیر را ببینید:

import javax.script.ScriptEngine;

import javax.script.ScriptEngineManager;

public class TestScript {

public static void main(String[] args) throws Exception {

ScriptEngineManager factory = new ScriptEngineManager();

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

engine.eval("println('Hello!')");

engine.put("x", 1);

engine.put("y", 2);

double result = (Double)engine.eval("x * x + y");

System.out.println(result);

}

}

با استفاده از متد ScriptEngine.put(varName, varValue) می توانیم یک متغیر را به engine پاس کنیم. متد eval می تواند اسکریپت های نوشته شده به آن زبان اسکریپتی را اجرا کند. و متد get مقدار متغیر های موجود در engine را بر می گرداند.

No comments: