סקאלה (שפת תכנות)

מתוך ויקיפדיה, האנציקלופדיה החופשית
(הופנה מהדף Scala)
סקאלה
Scala
פרדיגמות תכנות פונקציונלי, תכנות מונחה-עצמים, תכנות אימפרטיבי
תאריך השקה 20 בינואר 2004 עריכת הנתון בוויקינתונים
מתכנן מרטין אודרסקי
מפתח מרטין אודרסקי, אקול פוליטכניק פדרל בלוזאן עריכת הנתון בוויקינתונים
טיפוסיות סטטית, חזקה, הסקת טיפוסים, מבנית
מימושים JVM, LLVM
הושפעה על ידי Eiffel, Erlang, Haskell, Java, Lisp, Pizza, Standard ML, OCaml, Scheme, Smalltalk
רישיון BSD-3
סיומת scala.
http://www.scala-lang.org
לעריכה בוויקינתונים שמשמש מקור לחלק מהמידע בתבנית

סקאלה (Scala) היא שפת תכנות מרובת פרדיגמות, אשר תוכננה כ-"better Java", כלומר "גרסה טובה יותר" של שפת Java. סקאלה פועלת על גבי המכונה הווירטואלית של ג'אווה (JVM) ושומרת על תאימות גבוהה עם ג'אווה המאפשרת לה לעבוד עם קוד ג'אווה.

סקאלה משלבת מאפיינים של תכנות פונקציונלי יחד עם מודל התכנות מונחה-עצמים של ג'אווה, תוך שהיא "מנקה" את מה שלעיתים קרובות נחשב כחסרונות הקיימים בשפת ג'אווה (דברים כגון type erasure, אופן הטיפול בחריגות ומערכת טיפוסים לא אחידה), ומוסיפה מספר מאפיינים חדשים המאפשרים כתיבת קוד נקי, תמציתי ואקספרסיבי יותר.

השם Scala הוא הלחם בסיסים של המילים האנגליות "scalable" (סילומי) ו-"language" (שפה), ומטרתו לרמז על כך שהשפה תוכננה לגדול ביחד עם הדרישות של המשתמשים בה. ג'יימס סטראצ'ן, המפתח של שפת התכנות Groovy, הגדיר את סקאלה כיורשת אפשרית לשפת Java.

הפצת התוכנה של סקאלה, כולל המהדר וספריות התוכנה נעשית תחת רישיון BSD.

היסטוריה[עריכת קוד מקור | עריכה]

הפיתוח של סקאלה החל ב-2001 במכון הטכנולוגי של לוזאן (EPFL) על ידי מרטין אודרסקי. אודרסקי עבד קודם לכן על ג'אווה גנרית ו-javac, מהדר הג'אווה של חברת סאן. סקאלה שוחררה לשוק בסוף 2003 / תחילת 2004 על פלטפורמת ג'אווה, וביוני 2004 גם לפלטפורמת NET. גרסה שנייה של השפה, 2.0, שוחררה במארס 2006. התמיכה ב-NET. הופסקה רשמית ב-2012. ב-17 בינואר 2011 זכה הצוות של סקאלה במענק מחקר לחמש שנים בסך של 2.3 מיליון יורו ממועצת המחקר האירופית (ERC). ב-12 במאי 2011 הקימו אודרסקי ושותפיו את חברת Typesafe, שמספקת תמיכה מסחרית בסקאלה, כמו גם הדרכה עולמית בשפה ושירותים שונים. Typesafe, ששינתה מאז את שמה ל Lightbend, גייסה עד כה כ-52 מיליון דולר, בין היתר מ-IBM ואינטל קפיטל.

פלטפורמות[עריכת קוד מקור | עריכה]

סקאלה פועלת על גבי הפלטפורמה של ג'אווה (המכונה הווירטואלית של ג'אווה) וקיימת תאימות בינה לבין תוכניות ג'אווה קיימות. תוכניות סקאלה יכולות לרוץ גם על טלפונים חכמים שמריצים את מערכת ההפעלה אנדרואיד. קיים מימוש אלטרנטיבי גם עבור פלטפורמת דוט-נט.

לסקאלה יש את אותו מודל הידור כמו בג'אווה ו-סי שארפ (separate compilation, dynamic class loading), כך שקוד סקאלה יכול לקרוא לספריות ג'אווה (או לספריות דוט-נט במימוש המתאים).

הביצועים של סקאלה שווי ערך לאלה של ג'אווה. המהדר של סקאלה יוצר bytecode זהה כמעט לגמרי לזה שנוצר על ידי המהדר של ג'אווה. למעשה, קוד בשפת סקאלה יכול לעבור "הידור-לאחור" (decompiled) לקוד ג'אווה קריא, למעט כמה פעולות constructor ייחודיות. מבחינת ה-JVM, קוד סקאלה וקוד ג'אווה הם זהים. ההבדל היחיד הוא בספריית runtime אחת בשם scala-library.jar.

השוואה עם Java ו-#C[עריכת קוד מקור | עריכה]

כמו ג'אווה, סקאלה היא שפת תכנות מונחית-עצמים בה נהוגה טיפוסיות חזקה, המשתמשת במערכת טיפוסים סטטית. בשפה נעשה שימוש בתחביר של סוגריים מסולסלים המזכיר את שפת C, והיא עוברת הידור ל-Java bytecode, מה שמאפשר לקוד סקאלה לרוץ על גבי ה-JVM, ומאפשר קריאה חופשית לספריות ג'אווה מתוך קוד של סקאלה ולהפך, מבלי הצורך ב"שכבת דבק" כלשהי בין השתיים.

שלא כמו בג'אווה, סקאלה מוסיפה מאפיינים רבים הקיימים בשפות תכנות פונקציונליות כמו Standard ML ,Scheme ו-Haskell. ביניהם:

  • פונקציות אנונימיות (anonymous functions)
  • הסקת טיפוסים (type inference)
  • list comprehensions (ידוע בסקאלה כ-for-comprehensions)
  • אתחול עצל (lazy initialization)
  • תמיכה נרחבת בקוד ללא side effects
  • pattern matching
  • case classes
  • delimited continuations
  • higher-order types
  • תמיכה טובה יותר ב-covariance and contravariance

כמו ב-#C, אבל שלא כמו ב-Java, סקאלה מספקת מערכת טיפוסים אחידה, שבה כל הטיפוסים, כולל טיפוסים פרימיטיביים כמו integer ו-boolean הם אובייקטים היורשים מהמחלקה Any. כמו כן, סקאלה כוללת עוד כמה מאפיינים הקיימים ב-#C אבל לא קיימים ב-Java. ביניהם:

  • העמסת אופרטורים
  • פרמטרים אופציונליים
  • named parameters
  • מחרוזות גלם (raw strings)
  • אין checked exceptions

בנוסף לכך סקאלה כוללת כמה מאפיינים מתקדמים במערכת הטיפוסים שלה, שקיימים בשפות תכנות מעטות אחרות, אם בכלל.

השוואה עם שפות JVM אחרות[עריכת קוד מקור | עריכה]

לעיתים קרובות סקאלה מושווית עם Groovy ו-Clojure, שתי שפות תכנות הבנויות גם הן מעל ה-JVM. ההבדלים העיקריים הם:

  1. סקאלה מתאפיינת במערכת טיפוסים סטטית, בעוד שב-Groovy ו-Clojure נעשה שימוש במערכות טיפוסים דינמיות. אלמנט זה מוסיף רמה של מורכבות למערכת הטיפוסים של סקאלה, אך מאפשר את גילוין המוקדם של שגיאות רבות בזמן הידור, וביכולתו לספק רמה גבוהה יותר של ביצועים בזמן ריצה. גרסה 7 של ג'אווה הוסיפה תמיכה בהוראת הקוד "invoke dynamic", אשר מאפשרת את האצתן של שפות בעלות מערכות טיפוסים דינמיות.
  2. בעוד ש-Groovy תוכננה במטרה להיות גרסה תמציתית וקלה יותר של ג'אווה, סקאלה תוכננה לתמוך בתכנות פונקציונלי ותכנות מונחה-עצמים, וכן ביכולות מתקדמות נוספות משפות כגון Haskell, אשר אינן נתמכות על ידי הזרם המרכזי של שפות תכנות.
  3. בהשוואה ל-Clojure, סקאלה דורשת תהליך לימוד ומעבר קצר יותר. הדבר נובע מכך ש-Clojure היא נגזרת של שפת Lisp, ולפיכך היא בעלת תחביר שונה משמעותית מג'אווה, ושמה דגש חזק על אלמנטים של תכנות פונקציונלי. לעומת זאת, סקאלה משמרת את מרבית התחביר של ג'אווה ומאפשרת הן תכנות פונקציונלי והן תכנות מונחה עצמים, בהתאם להעדפותיו של המפתח.

תוכנית Hello world לדוגמה[עריכת קוד מקור | עריכה]

זוהי דוגמה לתוכנית Hello world שנכתבה בשפת סקאלה:

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

שלא כמו בתוכנית stand-alone דומה בשפת ג'אווה, בסקאלה אין צורך להצהיר על מחלקה (class), ואין צורך להגדיר שום דבר כסטטי (static); במקום זאת משתמשים באובייקט סינגלטון שנוצר באמצעות המילה השמורה object. כאשר התוכנית נשמרת בקובץ בשם HelloWorld.scala, ניתן להדר אותה משורת הפקודה:

$ scalac HelloWorld.scala

וכדי להריץ אותה:

$ scala -classpath . HelloWorld

תהליך זה דומה לתהליך ההידור והרצה של קוד ג'אווה. ואכן, מודל ההידור וההרצה של סקאלה זהה לזה של ג'אווה, ובכך מאפשר תאימות שלה עם כלי בנייה של ג'אווה כדוגמת Ant.

גרסה קצרה יותר של תוכנית Hello world בסקאלה:

println("Hello, world!")

אם התוכנית נשמרת בקובץ בשם HelloWorld2.scala, ניתן להריץ אותה כסקריפט מבלי להדר אותה מראש, באמצעות הפקודה:

$ scala HelloWorld2.scala

כמו כן, ניתן להזין פקודות ישירות למפרש של סקאלה באמצעות השימוש בדגל e-:

$ scala -e 'println("Hello, World!")'

קישורים חיצוניים[עריכת קוד מקור | עריכה]