زبان برنامه نویسی اسکالا(Scala)

اسکالا یک زبان برنامه‌نویسی شیءگرا و تابعی است. نام اسکالا آمیزه‌ای است از "scalable" و "language" به معنی زبان مقایس‌پذیر، از اهداف اصلی ایجاد زبان اسکالا، ارائه زبانی است برای تولید نرم‌افزار مقیاس‌پذیر به روشی چابک و سریع، و به دور از مشکلات مرسوم. اسکالا تلفیق زبان‌های شی‌گرا همچون روبی و جاوا با زبان‌های تابعی همچون Haskell و Erlang است. از دیدگاه چابکی و کارایی، عده‌ای اسکالا را جمع دو دنیای زبان‌های پویا (Dynamic-Type) و ایستا (Static-Type) می‌دانند. یکی از دلایل دیگری که باعث مقبولیت و همچنین کارایی بالای این زبان می‌شود، دستور زبان (Syntax) منعطف آن است.

اسکالا توسط پروفسور مارتین اودرسکی که خالق Genericهای جاوا و از برترین توسعه دهندگان کامپایلر Javac می‌باشد، در سال ۲۰۰۳ طراحی و به مرور توسط ایشان و جامعه اسکالا بهبود و توسعه داده شده‌است.

جیمز استراچن (James Strachan) سازندهٔ زبان برنامه‌نویسی Groovy در توصیفی اسکالا را ادامه‌دهندهٔ احتمالی جاوا دانسته است.

تاریخچه:

طراحی این زبان در سال ۲۰۰۱ در سوئیس توسط موسسه تحقیقاتی و دانشگاهی در سوئیس در شهر لوزان به نام (École polytechnique fédérale de Lausanne (EPFL)) توسط مارتین ادسکی شروع شد. انتشار داخلی اسکالا در ۲۰۰۳ بود اما انتشار عمومی آن بر روی پلتفرم جاوا در سال ۲۰۰۴ است.

ویژگی ها و دلیل استفاده گسترده از اسکالا:

ورود و پیشرفت زبان اسکالا در صنعت نرم‌افزار فقط به دلیل کم بودن تعداد خط های کد و راحتی برنامه‌نویس و انعطاف در آن نیست. طبق قانون مور تعداد ترانزیستورهای یک پردازنده، هر دو سال، دو برابر می‌شوند. به عبارت دیگر ابعاد ترانزیستورها در حال نصف شدن است و این روند در سال ۲۰۲۰ متوقف خواهد شد. هم اکنون نیز کند شدن این روند قابل مشاهده است و به جای اینکه سرعت پردازنده‌ها زیاد شود، تعداد هسته‌های آن‌ها بیشتر می‌شود. شاهد این امر تلفن‌های هوشمند و تبلت‌ها هستند؛ آن‌ها از پردازنده‌های چند هسته‌ای بهره می‌برند ولی بازه سرعت پردازنده‌ها چند سالی است که تغییر شگرفی نکرده است. به همین دلیل برنامه‌هایی با قابلیت اجرای همروند (Concurrent) و توزیع شده (Distributed) بیش از پیش مورد توجه قرار گرفتند. با افزایش کاربران و تقاضا و نزدیک شدن به اتمام قانون مور، روز به روز تقاضا برای تولید چنین نرم‌افزارهایی افزایش می‌یابد. زبان اسکالا دارای ویژگی‌هایی است که مختص چنین تقاضاهایی طراحی شده‌است. از آن جمله می‌توان به Functional Programming، Pattern Matching، Immutables اشاره کرد. علاوه بر این، اسکالا حاصل جمع ویژگی‌های بسیاری از زبان‌های موجود در بازار است. در حال حاضر زبان اسکالا دارای خصایص زیر می‌باشد:

هیچ‌یک از زبان‌های Ruby، Java، Go، C, JavaScript و اکو سیستم‌های آن‌ها، دارای همه ویژگی‌های بالا نیستند.

اسکالا پدری به نام Haskell دارد. همچنین تشابهات زیادی با Erlang و #F دارا می‌باشد. سی شارپ و پایتون نیز دارای قابلیت‌هایی کم و بیش نزدیک به اسکالا می‌باشند ولی شرایط اجرای متفاوتی دارند.

طی سال‌های اخیر توجه شرکت‌ها و مؤسسات بیشتری به سمت اسکالا جذب شده‌است. بلوغ اسکالا باعث شده تا نه تنها شرکت‌های پیشرو در صنعت IT (همچون Twitter، LinkedIn و ...) بلکه شرکت‌های ریز و درشت بسیاری که تنها مصرف کنندگان محصولات فناوری هستند نیز به استفاده از این زبان و بستر منحصر به فرد آن رو بیاورند. ابزارهای Build و Test، کتابخانه و چارچوب‌های منحصر به فردی همچون Scalaz، Play، Akka و ... در کنار دسترسی به طیف گستردهٔ کتابخانه‌های جاوا، اسکالا را به یکی از بهترین گزینه‌ها برای تولید انواع محصولات نرم‌افزاری تبدیل کرده. هم اینک اسکالا در بسیاری از شرکت‌ها/مؤسسات به‌طور گسترده‌ای استفاده می‌شود؛ WalMart (شعبهٔ کانادایی)، خبرگزاری Guardian، سایت خبری سرگرمی HuffingPost، سایت Coursera ،WhitePages و ... از نام آشناترین مؤسساتی هستند که می‌توان نام برد. برخی از شرکت‌ها/مؤسسات نام برده تمام یا بخشی از نرم‌افزارهای موجود خود را که با PHP، Ruby ، ... و حتی Java بود، با نمونهٔ بازنویسی شده با اسکلا جایگزین کردند.

سرعت و کارایی

به لطف JVM، برنامه‌های نوشته شده با اسکالا از کارایی بسیار بالایی برخودارند، بالاخص هنگامی که JVM به واسطهٔ قابلیت JIT به حداکثر توان محاسباتی سیستم دست پیدا می‌کند . شرکت WhitePages با بازنویسی بخشی از سرویس‌های Backend خود با اسکالا (که پیشتر، با Ruby و Perl نوشته شده بودند) توانست بیش از ۹۰٪ در هزینه‌های سخت افزای خود صرفه جویی کند. سرعت اجرای یک زبان برنامه‌نویسی هرچند مهم است، اما مهم‌تر از آن قابلیت‌های زبان در همروندی (Concurrency) و توزیع شدگی (Distribution) است. اسکالا به لطف ابزارها و چارچوب‌هایی همچون Akka، این کار را نه تنها راحت بلکه بسیار جذاب‌تر نیز کرده‌است.

جامعه باز و آزاد اسکالا

شرکت Typesafe به علت اهداف بلند مدتی که دارد مقداری از ارائه نوآوری و تغییرات در اسکالا کاسته و در عوض بر روی استحکام و پایداری آن تمرکز کرده، مطمئناً برخی از اعضای جامعه اسکالا با این استراتژی موافق نبوده و علاقه‌مند به ادامه روند نوآوری در اکو سیستم و زبان اسکالا هستند. از آنجایی که این زبان متن باز است این افراد دست به ایجاد یک انشعاب به نام Typelevel زدن تا نسخه‌ای از اسکالا با قابلیت‌های جدید و مدرن به همراه اکو سیستمی که با این نو آوری‌ها همسان باشد را تولید و نگهداری کنند.

نکته مهم اینکه مارتین اودرسکی (رئیس هیأت مدیره Typesafe) از این حرکت به شدت استقبال و حمایت کرد و اعلام کرد نوآوری‌هایی که در Typelevel پیاده‌سازی شود و قابل قبول جامعه باشد در نسخه اصلی Typesafe نیز ادغام خواهد شد و این باعث بهبود کل اکو سیستم خواهد بود.


جایگاه زبان :

در حال حاضر این زبان در جایگاه هشتم از دیدگاه سایت IEEE قرار دارد.

نمونه کد:

object HelloWorld extends App {
   println("Hello, World!")
 }

مقایسه تعداد خط کد :

جاوا:

// Java:
public class Point {
  private final double x, y;

  public Point(final double x, final double y) {
    this.x = x;
    this.y = y;
  }

  public Point(final double x, final double y,final boolean addToGrid ) {
    this(x, y);
    if (addToGrid)
      grid.add(this);
  }

  public Point() {
    this(0.0, 0.0);
  }

  public double getX() {
    return x;
  }

  public double getY() {
    return y;
  }

  double distanceToPoint(final Point other) {
    return distanceBetweenPoints(x, y,
      other.x, other.y);
  }

  private static Grid grid = new Grid();

  static double distanceBetweenPoints(
      final double x1, final double y1,
      final double x2, final double y2
  ) {
    return Math.hypot(x1 - x2, y1 - y2);
  }
}

اسکالا:

// Scala
class Point(
    val x: Double, val y: Double,
    addToGrid: Boolean = false
) {
  import Point._

  if (addToGrid)
    grid.add(this)

  def this() = this(0.0, 0.0)

  def distanceToPoint(other: Point) =
    distanceBetweenPoints(x, y, other.x, other.y)
}

object Point {
  privateval grid = new Grid()

  def distanceBetweenPoints(x1: Double, y1: Double,
      x2: Double, y2: Double) = {
    math.hypot(x1 - x2, y1 - y2)
  }
}

منابع:

ویکی پدیا

سایت IEEE