أبريل 09، 2009

لغة البرمجة Scala

مؤخرا دارت نقاشات مطولة بين مطوري خدمة التويتر (Twitter) بخصوص الإنتقال إلى لغة البرمجة Scala أو البقاء على Ruby. و الصراحة أكره السماع عن أية لغة برمجة جديدة أو عن إصدار جديد للغة غير متوافق مع السابق. يكفي وجود أكثر من 140 لغة برمجة متداولة حاليا. لكن ما باليد حيلة، فقاعدة الحياة بسيطة "التطور/التأقلم أو الإنقراض".

Scala لغة برمجة حديثة (ظهرت في 2004) مفتوحة المصدر، متعددت النمادج/المستويات (multi-paradigm) صُممت خصيصا لتمزج بين البرمجة المعتمدة على الكائنات (Object-oriented programming) و البرمجة المعتمدة على الوظائف (Functional programming) و هي حاليا في إصدارها 2.7.3. كما أنها تعمل على الألة الإفتراضية للغة جافا (JVM) و متوافقة مع برامجها (من السهل إستيراد وحدات الجافا)



 و هذا الصباح قضيت بعض الوقت أكتشف Scala و أقارن بينها و بين بايثون. إليكم بعض الأمثلة:

1. رسالة الترحيب بـ Scala

object HelloWorld {
  def main(args: Array[String]) {
    println("Hello, world!")
  }
}

HelloWorld.main(null)


و مقابله بـ Python

class HelloWorld():
  def main(self):
    print "Hello, World!\n"

x = HelloWorld()
x.main()



2. حساب مجموع الأعداد التي تم إذخالها عند سطر الأوامر بـ سكالة:
object Main {
  def main(args: Array[String]) {
    try {
      val elems = args map Integer.parseInt
      println("The sum of my arguments is: " + elems.foldRight(0) (_ + _))
    } catch {
      case e: NumberFormatException =>
        println("Usage: scala Main <n1> <n2> ... ")
    }
  }
}

Main.main(Array[String]("1", "2", "3"))
 


و مقابله في بايثون:
import sys

class Main():
  def main(self, args = sys.argv[1:]):        
    try:
      elems = 0
      for x in args: elems += int(x)
      print "The sum of my arguments is:", elems, "\n"
    except ValueError:
      print "Usage: python 08.py <n1> <n2> ..\n"
    
x = Main()
x.main(["2", "3"])
 



3. معالجة بسيطة لمعطيات سطر الأوامر

/** Basic command line parsing. */
object Main {
  var verbose = false

  def main(args: Array[String]) {
    for (a <- args) a match {
      case "-h" | "-help"    =>
        println("Usage: scala Main [-help|-verbose]")
      case "-v" | "-verbose" =>
        verbose = true
      case x =>
        println("Unknown option: '" + x + "'")
    }
    if (verbose)
      println("How are you today?")
  }
}

Main.main(Array[String]("-v"))


و مقابله في بايثون:
# Basic command line parsing.
import sys

class Main():
  verbose = False
  def main(self, args = sys.argv):
    for a in args:
      if a in  ["-h", "-help"]:
        print "Usage: python 06.py [-help|-verbose]\n"
      elif a in ["-v", "-verbose"]:
        self.verbose = True
      else:
        print "Unknown option: '" + a + "'\n"                
      if self.verbose:
        print "How are you today?\n"

M = Main()
M.main(["-v"])


و أثناء بحثي عن أمثلة في موقع لغة سكالة وجدت أمثلة جد متقدمة تظهر إمكانتيات هذه اللغة خصوصا تلك التي تتعلق بتطبيقات الويب. كما إتضح لي أنه من الممكن الإستفادة من الواجهة الرسومية Qt من خلال  Qt-Jambi و سوف أجرب ذلك لاحقا.

عموما، أجد لغة سكالة مثيرة للإهتمام و ربما هي جافا معصرنة :). هل سأنتقل إليها يوما؟ ربما سأجربها لحقا في برامج صغيرة لأرى هل تسرع من وقت البرمجة أم لا.

هناك 4 تعليقات:

  1. جافا راحت عليها مش فى احسن من انك تستخدم لغات بتسمحلك بالوصول على الوحدات زى JRuby و Groovy او Scala اوحتى Clojure ومن المريح جدا وجود plugin ل netbeans

    twitter on Scala
    http://www.artima.com/scalazine/articles/twitter_on_scala.html


    اشجعك تطلع على http://clojure.org/

    ردحذف
  2. لأول مرة أسمع فيها عن Clojure. و بعد أن اطلعت عليه ثلاثة مرات اليوم و قراتي لخصائصه و أمثلته و حتى مشاهدتي لبعض الدروس المرئية (http://clojure.blip.tv/#1319826)، أعتقد أنه لا يناسبني في الوقت الراهن.

    بالمناسبة، أتتبع منتداك الخاص بالبرمجة (http://programming-fr34ks.net/smf) بإستمرار و يعجبني ما تنجزه من برامج :)

    ردحذف
  3. كما سأبقي عيني على Clojure و أتتبع أخباره ;)

    ردحذف
  4. ههههههههه على فكرة اول مرة جيت اجرب lisp قلت كدا وكل مرة كنت بحاول فيهابردو كان نفس ردى ..بس يمكن لحد ماتكتبها بنفسك :D

    وربنا يخليك ياجميل سعيد جدا ان الموقع بيأدى هدفه

    ردحذف