→ Пошук по сайту       Увійти / Зареєструватися
Знання

Scala — мова програмування

Scala — мультипарадигмальна мова програмування, спроектована короткою і типобезпечною для простого і швидкого створення компонентного програмного забезпечення, що поєднує можливості функціонального та об'єктно-орієнтованого програмування.

Перші версії мови створені в 2003 році колективом лабораторії методів програмування Федеральної політехнічної школи Лозанни під керівництвом Мартіна Одерськи, мова реалізована для платформ Java і .Net. На думку Джеймса Стречена (англ. James Strachan (programmer)), творця мови програмування Groovy, Scala може стати наступником мови Java [1].

Історія

Мова була створена в 2001-2004 роках в Лабораторії методів програмування EPFL. Вона стала результатом досліджень, спрямованих на розробку поліпшеної мовної підтримки компонентного ПЗ. За основу при розробці мови були взяті 2 ідеї:

  1. Мова програмування компонентного ПЗ повинна бути масштабованою в тому сенсі, що повинна бути можливість за допомогою одних і тих же концепцій описати як маленькі, так і великі частини. Тому увага була сконцентрована на механізмах абстракції, композиції і декомпозиції замість введення великої кількості примітивів, які можуть бути корисними тільки на якомусь одному рівні масштабування.
  2. Масштабована підтримка компонентів може бути надана мовою програмування, що уніфікує і узагальнює об'єктно-орієнтоване і функціональне програмування. Деякі з основних технічних нововведень Scala — це концепції, що представляють собою сплав цих парадигм програмування. У статично типізованих мовах, до яких відноситься Scala, ці парадигми досі були майже повністю розділені.

Scala була випущена для загального користування на платформі JVM в січні 2004 року і на платформі .NET у червні 2004 року. Планується продовжити роботу над формалізацією ключових аспектів мови і над розробкою оптимізацій, виконуваних компілятором.

Витоки дизайну

На дизайн Scala вплинули багато мов і дослідницькі роботи. Наступне перерахування включає частину робіт.

  • Scala ввібрала численні концепції і синтаксичних угод Java і C #.
  • Спосіб вираження властивостей багато в чому запозичений з Sather (англ.).
  • Із Smalltalk взята концепція уніфікованої об'єктної моделі.
  • Із BETA прийшла ідея, що все, включаючи класи, має приймати вкладеність.
  • Абстрактні типи в Scala дуже схожі на абстрактні типи сигнатур в SML і OCaml, узагальнені в контексті повноцінних компонентів.
  • У певному сенсі Scala — це продовження роботи Pizza (англ.). Як і Pizza, Scala компілюється під Java VM, додаючи функції вищого порядку, зіставлення із зразком, конструкції, які початково були створені в співтоваристві функціонального програмування. У той час як Pizza зворотньо сумісна з Java, мета Scala — всього лише можливість взаємодії, так що у неї більше ступенів свободи в дизайні.

Ще одна мета Scala — надати розширені конструкції для абстракції і композиції компонентів — загальна з декількома недавніми дослідними розробками.

Ключові аспекти мови

  • Scala-програми багато в чому схожі на Java-програми, і можуть вільно взаємодіяти з Java-кодом.
  • Scala включає одноманітну об'єктну модель — в тому сенсі, що будь-яке значення є об'єктом, а будь-яка операція — викликом методу.
  • Scala — це також функціональна мова в тому сенсі, що функції — це повноправні значення.
  • У Scala включені потужні і одноманітні концепції абстракцій як для типів, так і для значень.
  • Вона містить гнучкі симетричні конструкції домішок для композиції класів і trait-ів.
  • Вона дозволяє виробляти декомпозицію об'єктів шляхом порівняння із зразком.
  • Зразки і вирази були узагальнені для підтримки природної обробки XML-документів.
  • В цілому, ці конструкції дозволяють легко висловлювати самостійні компоненти, які використовують бібліотеки Scala, не користуючись спеціальними мовними конструкціями.
  • Scala допускає зовнішні розширення компонентів з використанням видів (views)
  • Наявність шаблонів (generics) і шаблонів вищих порядків (generics of a higher kind).
  • Є підтримка структурних та екзистенціальних типів.
  • На поточний момент Scala реалізована на платформах Java і.NET.

Об'єктно-орієнтована мова

У Scala використовується чиста об'єктно-орієнтована модель, схожа на застосовувану в Smalltalk: кожне значення — це об'єкт, і кожна операція — це відправка повідомлення. Наприклад, додавання x+y інтерпретується як x.+(y), тобто як виклик методу з аргументом x в якості об'єкта-приймача і y в якості аргументу методу. Розглянемо інший приклад 1+2. Це вираз інтерпретується як (1).+(2). Зверніть увагу, що дужки навколо чисел обов'язкові, тому що лексичний аналізатор Scala розбиває вираз на лексеми за принципом найдовшого можливого зіставлення. Таким чином, вираз 1.+(2) розіб'ється на лексеми 1.,+ і 2, тому що лексема 1. довший лексеми 1 і перший аргумент складання буде інтерпретований, як тип Double замість Int. [2]

Функціональна  мова

Кожна функція — це значення. Мова надає легковаговий синтаксис для визначення анонімних і каррінгових функцій. Кожна конструкція повертає значення. Зіставлення із зразком природно розширюється до обробки XML c допомогою регулярних виразів.

Повторне використання та адаптація

Кожна компонентна система з потужними конструкціями абстракції і композиції стикається з проблемою, коли справа доходить до інтеграції підсистем, розроблених різними командами в різний час. Проблема полягає в тому, що інтерфейс компонентів, розроблених тією чи іншою групою, часто не підходить клієнтам, що мають намір використовувати цей компонент.

Scala представляє нову концепцію вирішення проблеми зовнішньої розширюваності — види (views). Вони дозволяють розширювати клас новими членами і trait-ами. Види в Scala переводять в об'єктно-орієнтоване уявлення використовувані в Haskell класи типів. На відміну від класів типів, область видимості видів можна контролювати, причому в різних частинах програми можуть співіснувати паралельні види.

Приклади програм

Програма, як і в Java, являє собою об'єкт. Це приклад консольної програми, яка виводить рядок тексту на екран.

object HelloWorld {
  def main(args: Array[String]) =
    Console.println("Привіт, СВІТ!")
 }

Наступний простий приклад програми написаний на Java і Scala, що демонструє деякі відмінності в синтаксисі (постфіксний запис типів змінних, відсутність спеціального синтаксису для доступу до масивів). У цьому прикладі описується консольна програма, яка виводить всі опції, передані через командний рядок. Опції починаються з символу «-» (мінус).

class PrintOptions
 {
    public static void main(String[] args)
    {
      System.out.println("Вибрані опції:");
      for (String arg: args) if (arg.startsWith("-")) System.out.println(" " + arg.substring(1));
    }
 }
object PrintOptions
 {
   def main(args: Array[String]) : Unit =
   {
     println("Выбрані опції:")
     for (arg <- args if arg startsWith "-") println(" " + (arg substring 1))
   }
 }
// Або в функціональному стилі:
 object PrintOptions
 {
   def main(args: Array[String]) : Unit =
     println("Вибрані опції:" +: (args withFilter (_ startsWith "-") map (" " + _.drop(1))) mkString "\n")
 }

Зверніть увагу, що в Scala оголошується не клас об'єкта, а відразу екземпляр об'єкта. Так природним способом реалізується шаблон проектування, де в програмі повинен бути тільки один екземпляр класу («Одинак??» - «Singleton»).

Приклад програми, яка підсумовує всі елементи списку, який передається через аргументи.

 object Main {
   def main(args: Array[String]) {
     try {
       val elems = args map Integer.parseInt
       println("Сума аргументів: " + elems.foldRight(0) (_ + _))
     } catch {
       case e: NumberFormatException =>
         println("Помилка в аргументах. Використовувати слід так: scala Main <число1> <число2> ... ")
     }
   }
 }

За допомогою методу map перебираються всі аргументи. Всі вони перетворюються в ціле число методом Integer.parseInt і додаються в список (масив) elems. Потім за допомогою методу згортки списку foldRight обчислюється сума елементів.

Інтеграція з Java

Scala може взаємодіяти з кодом, написаним на Java. Всі класи з пакета java.lang вже підключені за замовчуванням, в той же час інші повинні бути підключені явно.

Приклад

Завдання: отримати і відформатувати поточну дату в локалізації певної країни, наприклад — Франції.

У бібліотеці класів Java вже є потрібна нам функціональність у класах Date і DateFormat. Для того, щоб скористатися цим, досить просто імпортувати ці класи з відповідних Java-пакетів:

 import java.util.{Date, Locale}
import java.text.DateFormat
import java.text.DateFormat._
 
 object FrenchDate {
   def main(args: Array[String]) {
     val now = new Date
     val df = getDateInstance(LONG, Locale.FRANCE)
     println(df format now)
   }
 }
загрузка...
Сторінки, близькі за змістом