Scala (язык программирования)

Материал из Википедии — свободной энциклопедии
Scala
Изображение логотипа
Класс языка
Появился в 20 января 2004
Автор Мартин Одерски
Разработчик Programming Methods Laboratory of
EPFL
Расширение файлов .scala или .sc
Выпуск
Система типов
Испытал влияние
Lisp
Повлиял на Kotlin, Swift
Лицензия
Apache License 2.0[2]
Сайт scala-lang.org (англ.)
Платформа Java Virtual Machine, JavaScript[3] и Native[d][4]
Логотип Викисклада Медиафайлы на Викискладе

Scala —

мультипарадигмальный язык программирования, спроектированный кратким и типобезопасным для простого и быстрого создания компонентного программного обеспечения, сочетающий возможности функционального и объектно-ориентированного программирования
.

Первые версии языка созданы в 2003 году коллективом лаборатории методов программирования Федеральной политехнической школы Лозанны под руководством Мартина Одерски, язык реализован для платформ Java и JavaScript. По мнению Джеймса Стрэчена[англ.], создателя языка программирования Groovy, Scala может стать преемником языка Java[5].

История

Язык был создан в

EPFL
. Он стал результатом исследований, направленных на разработку улучшенной языковой поддержки компонентного программного обеспечения. За основу при разработке языка были взяты две идеи:

  1. композиции и декомпозиции вместо введения большого количества примитивов
    , которые могут быть полезными только на каком-то одном уровне масштабирования.
  2. Масштабируемая поддержка компонентов может быть предоставлена языком программирования, унифицирующим и обобщающим объектно-ориентированное и функциональное программирование. Некоторые из основных технических новшеств Scala — это концепции, представляющие собой сплав этих парадигм программирования. В статически типизированных языках, к которым относится Scala, эти парадигмы до сих пор были почти полностью разделены.

Язык был выпущен для общего пользования на платформе

JVM в январе 2004 года и на платформе .NET в июне 2004 года, в 2016 году создан LLVM-компилятор (Scala Native)[6]
.

Истоки дизайна

На дизайн языка оказали влияние многие языки и исследовательские работы.

Прежде всего, язык впитал значительное число концепций и синтаксических соглашений

, обобщённые в контексте полноценных компонентов.

В некотором смысле Scala — это продолжение работы Pizza[англ.]. Как и Pizza, Scala компилируется под Java VM, добавляя функции высшего порядка, сопоставление с образцом, конструкции, которые исходно были созданы в сообществе функционального программирования. В то время как Pizza обратно совместима с Java, цель Scala — всего лишь возможность взаимодействия, так что у неё больше степеней свободы в дизайне. Ещё одна цель Scala — предоставить расширенные конструкции для абстракции и композиции компонентов — общая с несколькими недавними исследовательскими разработками.

Ключевые аспекты языка

Scala-программы во многом похожи на

метода. При этом является также функциональным языком
в том смысле, что функции — это полноправные значения.

В Scala включены мощные и единообразные концепции абстракций как для типов, так и для значений. В частности, язык содержит гибкие симметричные конструкции примесей для композиции классов и типажей. Возможно позволяет производить декомпозицию объектов путём сравнения с образцом; образцы и выражения при этом были обобщены для поддержки естественной обработки XML-документов. В целом, эти конструкции позволяют легко выражать самостоятельные компоненты, использующие библиотеки Scala, не пользуясь специальными языковыми конструкциями.

Язык допускает внешние расширения компонентов с использованием представлений (views). Возможности

экзистенциальных типов
.

Объектно-ориентированный язык

В языке используется чистая объектно-ориентированная модель, похожая на применяемую в Smalltalk: каждое значение — это объект, и каждая операция — это отправка сообщения. Например, сложение x+y интерпретируется как x.+(y), то есть как вызов метода + с аргументом y и x в качестве объекта-приёмника.

Рассмотрим другой пример: 1+2. Это выражение интерпретируется как (1).+(2). Обратите внимание, что скобки вокруг чисел обязательны, потому что лексический анализатор Scala разбивает выражение на лексемы по принципу самого длинного возможного сопоставления. Таким образом, выражение 1.+(2) разобьется на лексемы 1.,+ и 2, потому что лексема 1. длиннее лексемы 1 и первый аргумент сложения будет интерпретирован, как тип Double вместо Int[7].

Функциональный язык

Каждая функция — это значение. Язык предоставляет легковесный

регулярных выражений
.

Повторное использование и адаптация

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

Scala представляет новую концепцию решения проблемы внешней расширяемости — представления (views). Они позволяют расширять класс новыми членами и

классам типов, используемым в Haskell
, но в отличие от классов типов, область видимости представлений можно контролировать, причём в разных частях программы могут сосуществовать параллельные представления.

Примеры программ

Программа, как и в Java, представляет собой класс. Это пример консольной программы, которая выводит строчку текста на экран.

 object HelloWorld {
  def main(args: Array[String]) =
    println("Привет, МИР!")
 }
// Более короткая версия
 object HelloWorld extends App {
   println("Привет, МИР!")
 }

Следующий простой пример программы написан на

массивам
). В этом примере описывается консольная программа, которая выводит все опции, переданные через командную строку. Опции начинаются с символа «-» (минус).

 // Java:
 class PrintOptions {
 public static void main(String[] args) {
    System.out.println("Выбраны опции:");
    Stream.of(args)
        .filter(arg -> arg.startsWith("-"))
        .map(arg -> arg.substring(1))
        .forEach(System.out::println);
  }
 }
 // Scala:
object PrintOptions {
   def main(args: Array[String]) {
     println("Выбраны опции:")
     for (arg <- args if arg startsWith "-") {
        println(" " + (arg substring 1))
     }
   }
 }
 // В функциональном стиле Scala:
 object PrintOptions {
   def main(args: Array[String]) =
     println("Выбраны опции:" +: (args filter (_ startsWith "-") map (" " + _.drop(1))) mkString "\n")
 }
 // В функциональном стиле C#:
 class PrintOptions {
   static void Main(String[] args) {
     Console.WriteLine("Выбраны опции:" + args.Where(x => x.StartsWith("-")).Aggregate((r, x) => r + " " + x.Substring(1)));
   }
 }
 // В функциональном стиле Java:
class PrintOptions {
    public static void main(String[] args) {
        System.out.println("Выбраны опции:\n" +
          Arrays.stream(args)
                .filter(o -> o.startsWith("-"))
                .map(o -> " " + o.substring(1))
                .collect(Collectors.joining("\n")));
    }
}

В Scala "object" - это класс, имеющий ровно один экземпляр, который создается автоматически при обращении к object[8]. Так естественным способом реализуется шаблон проектирования, где в программе должен быть только один экземпляр класса («Одиночка» — «Singleton»).

Пример программы, которая суммирует все элементы списка, который передаётся через аргументы:

 object Main {
   def main(args: Array[String]) {
     try {
       println("Сумма аргументов: " + args.map(_.toInt).sum)
     } catch {
       case e: NumberFormatException =>
         println("Ошибка в аргументах. Использовать следует так: scala Main <число1> <число2> ... ")
     }
   }
 }

На Java:

public class Main {

    public static void main(String[] args) {
        try {
            System.out.println("Сумма аргументов: " + Arrays.stream(args).mapToInt(Integer::parseInt).sum());
        } catch (NumberFormatException e) { 
            System.out.println("Ошибка в аргументах. Использовать следует так: java Main <число1> <число2> ... ");
        }
    }
}

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

Интеграция с Java

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

Использование

Основные веб-фреймворки, написанные на Scala — Play, Lift. Среди их пользователей отмечены ряд крупных сервисов, в частности, Play используют Gilt и Coursera[9], а Foursquare — Lift[10].

Социальная сеть LinkedIn использует микрофреймворк Scalatra для поддержки своего Signal API[11].

В апреле 2009 года

Twitter объявил, что перевёл значительную часть своего серверного кода с Ruby на Scala и собирается перевести оставшийся[12]. В апреле 2011 онлайн-версия газеты The Guardian была переведена с Java на Scala[13]
.

Проекты фонда Apache: Apache Spark, Apache Kafka написаны в основном на Scala.

Одним из активных пользователей языка также является банк UBS[14].

Важная составляющая инфраструктуры разработки на Scala — средство автоматической сборки Sbt — также написана на Scala.

Примечания

  1. Scala 3.4.0
  2. https://www.scala-lang.org/news/2.12.8
  3. http://www.scala-js.org/
  4. http://www.scala-native.org/
  5. Strachan, James Scala as the long term replacement for java/javac? (6 июля 2009). Дата обращения: 7 января 2012. Архивировано 10 февраля 2012 года.
  6. Paul Krill. Scala language moves closer to bare metal. Infoworld (11 мая 2016). Дата обращения: 4 декабря 2016. Архивировано 27 ноября 2016 года.
  7. Архивированная копия. Дата обращения: 7 ноября 2010. Архивировано из оригинала 5 июля 2010 года.
  8. Singleton Objects | Tour of Scala | Scala Documentation. Дата обращения: 10 декабря 2023. Архивировано 10 декабря 2023 года.
  9. Why we love Scala at Coursera. Дата обращения: 26 октября 2014. Архивировано 1 апреля 2014 года.
  10. Scala, Lift, and the Future. Дата обращения: 26 октября 2014. Архивировано 13 января 2016 года.
  11. Synodinos, Dionysios G. LinkedIn Signal: A Case Study for Scala, JRuby and Voldemort. InfoQ (11 октября 2010). Дата обращения: 26 октября 2014. Архивировано 26 октября 2014 года.
  12. Greene, Kate The Secret Behind Twitter's Growth, How a new Web programming language is helping the company handle its increasing popularity. Technology Review. MIT (1 апреля 2009). Дата обращения: 6 апреля 2009. Архивировано 17 апреля 2012 года.
  13. Guardian switching from Java to Scala. Heise Online (5 апреля 2011). Дата обращения: 5 апреля 2011. Архивировано 9 апреля 2011 года.
  14. Dr. Dobb's Journal (14 июля 2011). Дата обращения: 10 февраля 2012. Архивировано
    20 февраля 2012 года.

Литература

Англоязычная

Русскоязычная

Ссылки