پیش از هر چیز، بایستی گفت که اسکالا جزو زبانهای برنامه نویسی دشوار برای یادگیری است اما اگر کسی بتواند سختی یادگیری این زبان را بر خود هموار کند، مسلماً ارزشش را خواهد داشت. در این مقاله قصد داریم به صورت عملی دست مقایسه ی زبانهای برنامه نویسی Scala و Java بزنیم و این نکته را اثبات کنیم که با اسکالا با تعداد خطوط کد کمتری میتوان به همان نتیجهای که برنامه نویسان جاوا در چندین خط کد میرسند برسیم. با سکان آکادمی همراه باشید.
اسکالا برای اولین بار در سال 2003 به دنیا عرضه شد که جزو زبانهای شیء گرا و تابع-محور بسیار دقیق و منطقی دنیا محسوب می شود. به هر حال، از زمان ابداع تاکنون، میتوان گفت که سالهای اخیر بوده که کمک به رشد و محبوبیت بیشتر این زبان کرده است اما می بایست ببینیم که دلیل این محبوبیت چه بوده است؟
به طور خلاصه، میتوان گفت که هدف از ایجاد اسکالا «طراحی یک جاوای بهینه تر» بوده است. جالب است بدانیم که این زبان در JVM یا ماشین مجازی جاوا اجرا می شود. به غیر از اسکالا، زبانهای دیگری همچون Kotlin و Ceylon نیز بودهاند که سعی کردهاند یک جاوای بهتر باشند اما این در حالی است که در این زبانها سعی شده سینتکس تا حد ممکن نزدیک به زبان جاوا باقی بماند و صرفاً منحنی یادگیری این زبانها نسبت به زبان جاوا کمی بهتر شود اما این در حالی است که اسکالا با این ذهنیت طراحی شد که محدودیتهای زبان جاوا رفع گردیده و توسعه دهندگان بتوانند با شکستن ساختارها و پارادایم های به کار گرفته شده در زبان جاوا، کدهای کمتر اما در عین حال بهینه تری بنویسند و شاید یکی از دلایل سختی یادگیری این زبان همین مسأله ی ساختار شکنی بوده باشد!
با زبان جاوا میتوان هر گونه اپلیکیشنی نوشت اما در عین حال تعداد خطوط کدی که در زبان جاوا برای یک برنامه ی خاص استفاده میشود قابل مقایسه با تعداد خطوط کد در زبان اسکالا نیست. کامپایلر اسکالا کامپایلری بسیار هوشمند است از این رو، توسعهدهنده نیازی ندارد تا خیلی از بدیهیات را برای کامپایلر شرح دهد و این وظیفه ی خود کامپایلر است که می بایست حدس بزند مد نظر توسعهدهنده چه چیزی بوده است. برای مثال، برنامه ی Hello World را در زبان جاوا مد نظر قرار می دهیم:
public class HelloJava {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
حال همین برنامه را در زبان اسکالا می بینیم:
object HelloScala {
def main(args: Array[String]): Unit = {
println("Hello World!")
}
}
میبینیم تفاوت چندانی مابین دو زبان وجود ندارد اما ساختار اسکالا تا حدودی سادهتر به نظر می رسد. به عنوان مثالی دیگر، میتوان طرز ساخت یک آرایه ای از استرینگ ها را در دو زبان مقایسه کرد. در جاوا داریم:
List list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
همین آرایه را در اسکالا به صورت زیر خواهیم نوشت:
val list = List("1", "2", "3")
آنچه مسلم است این که در زبان جاوا ترفندهایی به منظور کوتاه کردن سورس کد وجود دارد اما این ترفندها جزو کاربردهای استاندارد این زبان نیستند. حال فرض کنیم لیستی از استرینگ هایی داریم که قصد داریم آن ها را در زبان جاوا به اعداد صحیح تبدیل کنیم:
List ints = new ArrayList();
for (String s : list) {
ints.add(Integer.parseInt(s));
}
اما در اسکالا خواهیم داشت:
val ints = list.map(s => s.toInt)
اکنون زمان آن فرا رسیده که پا را کمی فراتر گذاشته و مقایسه ای مابین ساخت کلاس و آبجکت در زبان های برنامه نویسی Java و Scala داشته باشیم. در زبان جاوا نحوه ی ساخت کلاس به صورت زیر است:
public class User {
private String name;
private List orders;
public User() {
orders = new ArrayList();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List getOrders() {
return orders;
}
public void setOrders(List orders) {
this.orders = orders;
}
}
public class Order {
private int id;
private List products;
public Order() {
products = new ArrayList();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public List getProducts() {
return products;
}
public void setProducts(List products) {
this.products = products;
}
}
public class Product {
private int id;
private String category;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
}
می بینیم که تعداد خطوط کد نسبتا قابل توجهی وجود دارد اما نسخه ی اسکالای این قطعه کد به صورت زیر خواهد بود:
class User {
var name: String = _
var orders: List[Order] = Nil
}
class Order {
var id: Int = _
var products: List[Product] = Nil
}
class Product {
var id: Int = _
var category: String = _
}
جالب است بدانیم که در اسکالا می توان از چیزی تحت عنوان Case Class استفاده کرده و کد فوق را به مراتب بهینه تر به صورت زیر نوشت:
case class User(name: String, orders: List[Order])
case class Order(id: Int, products: List[Product])
case class Product(id: Int, category: String)
هدف از این مقاله به هیچ وجه زیر سوال بردن خوبی های زبانی همچون جاوا نبوده بلکه صرفا خواستیم به معرفی زبان Scala بپردازیم. این زبان در حال حاضر توسط شرکت های بزرگی همچون لینکدین، توییتر، فوراسکور و انتشارات گاردین استفاده می شود.
اسکالا برای اولین بار در سال 2003 به دنیا عرضه شد که جزو زبانهای شیء گرا و تابع-محور بسیار دقیق و منطقی دنیا محسوب می شود. به هر حال، از زمان ابداع تاکنون، میتوان گفت که سالهای اخیر بوده که کمک به رشد و محبوبیت بیشتر این زبان کرده است اما می بایست ببینیم که دلیل این محبوبیت چه بوده است؟
به طور خلاصه، میتوان گفت که هدف از ایجاد اسکالا «طراحی یک جاوای بهینه تر» بوده است. جالب است بدانیم که این زبان در JVM یا ماشین مجازی جاوا اجرا می شود. به غیر از اسکالا، زبانهای دیگری همچون Kotlin و Ceylon نیز بودهاند که سعی کردهاند یک جاوای بهتر باشند اما این در حالی است که در این زبانها سعی شده سینتکس تا حد ممکن نزدیک به زبان جاوا باقی بماند و صرفاً منحنی یادگیری این زبانها نسبت به زبان جاوا کمی بهتر شود اما این در حالی است که اسکالا با این ذهنیت طراحی شد که محدودیتهای زبان جاوا رفع گردیده و توسعه دهندگان بتوانند با شکستن ساختارها و پارادایم های به کار گرفته شده در زبان جاوا، کدهای کمتر اما در عین حال بهینه تری بنویسند و شاید یکی از دلایل سختی یادگیری این زبان همین مسأله ی ساختار شکنی بوده باشد!
با زبان جاوا میتوان هر گونه اپلیکیشنی نوشت اما در عین حال تعداد خطوط کدی که در زبان جاوا برای یک برنامه ی خاص استفاده میشود قابل مقایسه با تعداد خطوط کد در زبان اسکالا نیست. کامپایلر اسکالا کامپایلری بسیار هوشمند است از این رو، توسعهدهنده نیازی ندارد تا خیلی از بدیهیات را برای کامپایلر شرح دهد و این وظیفه ی خود کامپایلر است که می بایست حدس بزند مد نظر توسعهدهنده چه چیزی بوده است. برای مثال، برنامه ی Hello World را در زبان جاوا مد نظر قرار می دهیم:
public class HelloJava {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
حال همین برنامه را در زبان اسکالا می بینیم:
object HelloScala {
def main(args: Array[String]): Unit = {
println("Hello World!")
}
}
میبینیم تفاوت چندانی مابین دو زبان وجود ندارد اما ساختار اسکالا تا حدودی سادهتر به نظر می رسد. به عنوان مثالی دیگر، میتوان طرز ساخت یک آرایه ای از استرینگ ها را در دو زبان مقایسه کرد. در جاوا داریم:
List list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
همین آرایه را در اسکالا به صورت زیر خواهیم نوشت:
val list = List("1", "2", "3")
آنچه مسلم است این که در زبان جاوا ترفندهایی به منظور کوتاه کردن سورس کد وجود دارد اما این ترفندها جزو کاربردهای استاندارد این زبان نیستند. حال فرض کنیم لیستی از استرینگ هایی داریم که قصد داریم آن ها را در زبان جاوا به اعداد صحیح تبدیل کنیم:
List ints = new ArrayList();
for (String s : list) {
ints.add(Integer.parseInt(s));
}
اما در اسکالا خواهیم داشت:
val ints = list.map(s => s.toInt)
اکنون زمان آن فرا رسیده که پا را کمی فراتر گذاشته و مقایسه ای مابین ساخت کلاس و آبجکت در زبان های برنامه نویسی Java و Scala داشته باشیم. در زبان جاوا نحوه ی ساخت کلاس به صورت زیر است:
public class User {
private String name;
private List orders;
public User() {
orders = new ArrayList();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List getOrders() {
return orders;
}
public void setOrders(List orders) {
this.orders = orders;
}
}
public class Order {
private int id;
private List products;
public Order() {
products = new ArrayList();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public List getProducts() {
return products;
}
public void setProducts(List products) {
this.products = products;
}
}
public class Product {
private int id;
private String category;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
}
می بینیم که تعداد خطوط کد نسبتا قابل توجهی وجود دارد اما نسخه ی اسکالای این قطعه کد به صورت زیر خواهد بود:
class User {
var name: String = _
var orders: List[Order] = Nil
}
class Order {
var id: Int = _
var products: List[Product] = Nil
}
class Product {
var id: Int = _
var category: String = _
}
جالب است بدانیم که در اسکالا می توان از چیزی تحت عنوان Case Class استفاده کرده و کد فوق را به مراتب بهینه تر به صورت زیر نوشت:
case class User(name: String, orders: List[Order])
case class Order(id: Int, products: List[Product])
case class Product(id: Int, category: String)
هدف از این مقاله به هیچ وجه زیر سوال بردن خوبی های زبانی همچون جاوا نبوده بلکه صرفا خواستیم به معرفی زبان Scala بپردازیم. این زبان در حال حاضر توسط شرکت های بزرگی همچون لینکدین، توییتر، فوراسکور و انتشارات گاردین استفاده می شود.